GBHawk: more double speed mode timing work

This commit is contained in:
alyosha-tas 2020-11-22 11:40:56 -05:00
parent bad08162e2
commit 8199e67770
3 changed files with 18 additions and 8 deletions

View File

@ -63,7 +63,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
switch (addr)
{
case 0xFF40: ret = LCDC; break; // LCDC
case 0xFF41: ret = STAT; break; // STAT
case 0xFF41: ret = STAT; break; // STAT
case 0xFF42: ret = scroll_y; break; // SCY
case 0xFF43: ret = scroll_x; break; // SCX
case 0xFF44: ret = LY_read; break; // LY
@ -514,7 +514,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// also the LCD doesn't turn on right away
// also, the LCD does not enter mode 2 on scanline 0 when first turned on
no_scan = true;
cycle = 8;
// turning on the ppu seems to take one cycle longer in double speed mode, maybe because the 8 MHz clock is too fast
cycle = Core.double_speed ? 7 : 8;
//cycle = 8;
}
// the VBL stat is continuously asserted
@ -682,12 +685,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
LY_read = LY;
}
else if (cycle == 12)
else if (cycle == (10 + 1 * LYC_offset))
{
LYC_INT = false;
STAT &= 0xFB;
}
else if (cycle == 14)
else if (cycle == (10 + 2 * LYC_offset))
{
// Special case of LY = LYC
if ((LY == LYC) && !STAT.Bit(2))
@ -704,7 +707,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
LY_read = LY;
}
else if ((cycle == 4) && (LY != 0))
else if ((cycle == (2 + 1 * LYC_offset)) && (LY != 0))
{
if (LY_inc == 1)
{
@ -712,7 +715,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
STAT &= 0xFB;
}
}
else if ((cycle == 6) && (LY != 0))
else if ((cycle == (2 + 2 * LYC_offset)) && (LY != 0))
{
if ((LY == LYC) && !STAT.Bit(2))
{
@ -1285,12 +1288,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
read_case = 8;
// hbl_countdown = 1;
STAT &= 0xFC;
STAT |= 0x00;
if (STAT.Bit(3)) { HBL_INT = true; }
// the CPU has to be able to see the transition from mode 3 to mode 0 to start HDMA
// TODO: If Window is turned on midscanline what happens? When is this check done exactly?
if ((window_started && window_latch) || (window_is_reset && !window_latch && (LY > window_y_latch)))
{
@ -1788,6 +1791,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
for (int i = 0; i < BG_bytes.Length; i++) { BG_bytes[i] = 0xFF; }
for (int i = 0; i < OBJ_bytes.Length; i++) { OBJ_bytes[i] = 0xFF; }
LYC_offset = 1;
}
}
}

View File

@ -316,6 +316,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
timer.divider_reg = 0xFFFF;
double_speed = !double_speed;
ppu.LYC_offset = double_speed ? 1 : 2;
return 0;
}
else

View File

@ -115,6 +115,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public bool was_pre_render;
public int read_case_prev;
public bool pal_change_blocked; // in compatability mode, you can change palette values but not displayed color
public int LYC_offset; // in double speed mode it appears timing changes for LYC int
// variables not in state
public int total_counter;
@ -280,6 +281,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ser.Sync(nameof(was_pre_render), ref was_pre_render);
ser.Sync(nameof(read_case_prev), ref read_case_prev);
ser.Sync(nameof(pal_change_blocked), ref pal_change_blocked);
ser.Sync(nameof(LYC_offset), ref LYC_offset);
}
}
}