1
0
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:
XProger
2022-01-22 17:33:18 +03:00
parent 317675fd2e
commit 92b984692c
6 changed files with 46 additions and 15 deletions

View File

@@ -1668,7 +1668,7 @@ struct SaveGame
uint8 tracks[64]; uint8 tracks[64];
}; };
#define SETTINGS_VER 1 #define SETTINGS_VER 2
#define SETTINGS_SIZE 128 #define SETTINGS_SIZE 128
struct Settings struct Settings
@@ -1679,6 +1679,7 @@ struct Settings
uint8 audio_music:1; uint8 audio_music:1;
uint8 video_gamma:5; uint8 video_gamma:5;
uint8 video_fps:1; uint8 video_fps:1;
uint8 video_vsync:1;
}; };
#define FD_SET_END(x,end) ((x) |= ((end) << 15)) #define FD_SET_END(x,end) ((x) |= ((end) << 15))

View File

@@ -90,6 +90,7 @@ void gameInit(const char* name)
gSettings.audio_music = 1; gSettings.audio_music = 1;
gSettings.video_gamma = 0; gSettings.video_gamma = 0;
gSettings.video_fps = 1; gSettings.video_fps = 1;
gSettings.video_vsync = 0;
osLoadSettings(); osLoadSettings();
inventory.init(); inventory.init();

View File

@@ -90,6 +90,7 @@ enum OptionID
// video // video
OPT_ID_GAMMA = 0, OPT_ID_GAMMA = 0,
OPT_ID_FPS = 1, OPT_ID_FPS = 1,
OPT_ID_VSYNC = 2,
// passport // passport
OPT_ID_OK = 5 OPT_ID_OK = 5
}; };
@@ -911,6 +912,15 @@ struct Inventory
osSaveSettings(); osSaveSettings();
} }
} }
if (optionIndex == OPT_ID_VSYNC)
{
if (gSettings.video_vsync != opt.value)
{
gSettings.video_vsync = opt.value;
osSaveSettings();
}
}
} }
void onSound() void onSound()
@@ -1231,6 +1241,7 @@ struct Inventory
{ {
OPTION_BAR(STR_OPT_DETAIL_GAMMA, gSettings.video_gamma << 4); OPTION_BAR(STR_OPT_DETAIL_GAMMA, gSettings.video_gamma << 4);
OPTION_SWITCH(STR_OPT_DETAIL_FPS, gSettings.video_fps); OPTION_SWITCH(STR_OPT_DETAIL_FPS, gSettings.video_fps);
OPTION_SWITCH(STR_OPT_DETAIL_VSYNC, gSettings.video_vsync);
break; break;
} }
case SLOT_SOUND: case SLOT_SOUND:

View File

@@ -24,7 +24,7 @@ rasterizeLineH_asm:
strh tmp, [pixel], #2 strh tmp, [pixel], #2
subs width, #1 subs width, #1
beq .scanline_end beq .scanline_end
mov pc, lr
.align_right: .align_right:
tst width, #1 tst width, #1
beq .scanline_block_2px beq .scanline_block_2px

View File

@@ -1,23 +1,33 @@
#include <tonc.h> #include <tonc.h>
#define MEM_CHECK_MAGIC 14021968 #define MEM_CHECK_MAGIC 14021968
#define MEM_CHECK_SIZE 16
const int ROM_MAGIC[] = { const int ROM_MAGIC[MEM_CHECK_SIZE] = {
MEM_CHECK_MAGIC, MEM_CHECK_MAGIC + 0,
MEM_CHECK_MAGIC + 1, MEM_CHECK_MAGIC + 1,
MEM_CHECK_MAGIC + 2, MEM_CHECK_MAGIC + 2,
MEM_CHECK_MAGIC + 3, MEM_CHECK_MAGIC + 3,
MEM_CHECK_MAGIC + 4, MEM_CHECK_MAGIC + 4,
MEM_CHECK_MAGIC + 5, MEM_CHECK_MAGIC + 5,
MEM_CHECK_MAGIC + 6, 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) EWRAM_CODE bool checkROM(unsigned int mask)
{ {
REG_WSCNT = 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)) if (*(volatile int*)&ROM_MAGIC[i] != (MEM_CHECK_MAGIC + i))
{ {
@@ -26,14 +36,17 @@ 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))
{ {
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; REG_WSCNT = WS_ROM0_N4 | WS_ROM0_S2 | WS_PREFETCH;
return false; return false;
} }
}
return true; return true;
} }

View File

@@ -596,7 +596,12 @@ int main(void)
#ifdef PROFILING #ifdef PROFILING
VBlankIntrWait(); VBlankIntrWait();
#else
if (gSettings.video_vsync) {
VBlankIntrWait();
}
#endif #endif
REG_DISPCNT = (mode ^= DCNT_PAGE); REG_DISPCNT = (mode ^= DCNT_PAGE);
fb ^= VRAM_PAGE_SIZE; fb ^= VRAM_PAGE_SIZE;