mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-21 04:11:53 +02:00
#368 improve checkROM, add vsync option, fix LineH rasterization
This commit is contained in:
@@ -1668,7 +1668,7 @@ struct SaveGame
|
||||
uint8 tracks[64];
|
||||
};
|
||||
|
||||
#define SETTINGS_VER 1
|
||||
#define SETTINGS_VER 2
|
||||
#define SETTINGS_SIZE 128
|
||||
|
||||
struct Settings
|
||||
@@ -1679,6 +1679,7 @@ struct Settings
|
||||
uint8 audio_music:1;
|
||||
uint8 video_gamma:5;
|
||||
uint8 video_fps:1;
|
||||
uint8 video_vsync:1;
|
||||
};
|
||||
|
||||
#define FD_SET_END(x,end) ((x) |= ((end) << 15))
|
||||
|
@@ -90,6 +90,7 @@ void gameInit(const char* name)
|
||||
gSettings.audio_music = 1;
|
||||
gSettings.video_gamma = 0;
|
||||
gSettings.video_fps = 1;
|
||||
gSettings.video_vsync = 0;
|
||||
osLoadSettings();
|
||||
|
||||
inventory.init();
|
||||
|
@@ -90,6 +90,7 @@ enum OptionID
|
||||
// video
|
||||
OPT_ID_GAMMA = 0,
|
||||
OPT_ID_FPS = 1,
|
||||
OPT_ID_VSYNC = 2,
|
||||
// passport
|
||||
OPT_ID_OK = 5
|
||||
};
|
||||
@@ -911,6 +912,15 @@ struct Inventory
|
||||
osSaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
if (optionIndex == OPT_ID_VSYNC)
|
||||
{
|
||||
if (gSettings.video_vsync != opt.value)
|
||||
{
|
||||
gSettings.video_vsync = opt.value;
|
||||
osSaveSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void onSound()
|
||||
@@ -1231,6 +1241,7 @@ struct Inventory
|
||||
{
|
||||
OPTION_BAR(STR_OPT_DETAIL_GAMMA, gSettings.video_gamma << 4);
|
||||
OPTION_SWITCH(STR_OPT_DETAIL_FPS, gSettings.video_fps);
|
||||
OPTION_SWITCH(STR_OPT_DETAIL_VSYNC, gSettings.video_vsync);
|
||||
break;
|
||||
}
|
||||
case SLOT_SOUND:
|
||||
|
@@ -24,7 +24,7 @@ rasterizeLineH_asm:
|
||||
strh tmp, [pixel], #2
|
||||
subs width, #1
|
||||
beq .scanline_end
|
||||
mov pc, lr
|
||||
|
||||
.align_right:
|
||||
tst width, #1
|
||||
beq .scanline_block_2px
|
||||
|
@@ -1,23 +1,33 @@
|
||||
#include <tonc.h>
|
||||
|
||||
#define MEM_CHECK_MAGIC 14021968
|
||||
#define MEM_CHECK_SIZE 16
|
||||
|
||||
const int ROM_MAGIC[] = {
|
||||
MEM_CHECK_MAGIC,
|
||||
const int ROM_MAGIC[MEM_CHECK_SIZE] = {
|
||||
MEM_CHECK_MAGIC + 0,
|
||||
MEM_CHECK_MAGIC + 1,
|
||||
MEM_CHECK_MAGIC + 2,
|
||||
MEM_CHECK_MAGIC + 3,
|
||||
MEM_CHECK_MAGIC + 4,
|
||||
MEM_CHECK_MAGIC + 5,
|
||||
MEM_CHECK_MAGIC + 6,
|
||||
MEM_CHECK_MAGIC + 7
|
||||
MEM_CHECK_MAGIC + 7,
|
||||
MEM_CHECK_MAGIC + 8,
|
||||
MEM_CHECK_MAGIC + 9,
|
||||
MEM_CHECK_MAGIC + 10,
|
||||
MEM_CHECK_MAGIC + 11,
|
||||
MEM_CHECK_MAGIC + 12,
|
||||
MEM_CHECK_MAGIC + 13,
|
||||
MEM_CHECK_MAGIC + 14,
|
||||
MEM_CHECK_MAGIC + 15,
|
||||
};
|
||||
|
||||
EWRAM_CODE bool checkROM(unsigned int mask)
|
||||
{
|
||||
REG_WSCNT = mask;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
// check sequential read (S)
|
||||
for (int i = 0; i < MEM_CHECK_SIZE; i++)
|
||||
{
|
||||
if (*(volatile int*)&ROM_MAGIC[i] != (MEM_CHECK_MAGIC + i))
|
||||
{
|
||||
@@ -26,13 +36,16 @@ EWRAM_CODE bool checkROM(unsigned int mask)
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 7; i >= 0; i--)
|
||||
// check non-sequential read (N)
|
||||
for (int i = 0, j = MEM_CHECK_SIZE - 1; i < MEM_CHECK_SIZE; i++, j--)
|
||||
{
|
||||
if (*(volatile int*)&ROM_MAGIC[i] != (MEM_CHECK_MAGIC + i))
|
||||
{
|
||||
REG_WSCNT = WS_ROM0_N4 | WS_ROM0_S2 | WS_PREFETCH;
|
||||
return false;
|
||||
}
|
||||
bool L = *(volatile int*)&ROM_MAGIC[i] == (MEM_CHECK_MAGIC + i);
|
||||
bool R = *(volatile int*)&ROM_MAGIC[j] == (MEM_CHECK_MAGIC + j);
|
||||
|
||||
if (L && R) continue;
|
||||
|
||||
REG_WSCNT = WS_ROM0_N4 | WS_ROM0_S2 | WS_PREFETCH;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@@ -596,7 +596,12 @@ int main(void)
|
||||
|
||||
#ifdef PROFILING
|
||||
VBlankIntrWait();
|
||||
#else
|
||||
if (gSettings.video_vsync) {
|
||||
VBlankIntrWait();
|
||||
}
|
||||
#endif
|
||||
|
||||
REG_DISPCNT = (mode ^= DCNT_PAGE);
|
||||
fb ^= VRAM_PAGE_SIZE;
|
||||
|
||||
|
Reference in New Issue
Block a user