mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-20 20:01:59 +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];
|
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))
|
||||||
|
@@ -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();
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
@@ -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,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))
|
bool L = *(volatile int*)&ROM_MAGIC[i] == (MEM_CHECK_MAGIC + i);
|
||||||
{
|
bool R = *(volatile int*)&ROM_MAGIC[j] == (MEM_CHECK_MAGIC + j);
|
||||||
REG_WSCNT = WS_ROM0_N4 | WS_ROM0_S2 | WS_PREFETCH;
|
|
||||||
return false;
|
if (L && R) continue;
|
||||||
}
|
|
||||||
|
REG_WSCNT = WS_ROM0_N4 | WS_ROM0_S2 | WS_PREFETCH;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user