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];
};
#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))

View File

@@ -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();

View File

@@ -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:

View File

@@ -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

View File

@@ -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;

View File

@@ -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;