GBHawk:more ppu work

This commit is contained in:
alyosha-tas 2018-12-16 09:50:35 -06:00
parent 6fb626386b
commit f2bcabb10f
3 changed files with 44 additions and 62 deletions

View File

@ -1,5 +1,4 @@
using System; using System;
using BizHawk.Emulation.Common;
using BizHawk.Common.NumberExtensions; using BizHawk.Common.NumberExtensions;
using BizHawk.Common; using BizHawk.Common;
@ -138,8 +137,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
LYC = value; LYC = value;
if (LCDC.Bit(7)) if (LCDC.Bit(7))
{ {
if (LY != LYC) { STAT &= 0xFB; } if (LY != LYC) { STAT &= 0xFB; LYC_INT = false; }
else { STAT |= 0x4; } else { STAT |= 0x4; LYC_INT = true; }
// special case: at cycle 454, some strange things are happening, and it appears as though LY becomes LY + 1
// two cycles ahead of where it's supposed to. this is probably related to strange behaviour around cycle 452
if ((LY_inc == 0) && cycle == 6)
{
//if (0 == LYC) { STAT |= 0x4; LYC_INT = true; }
//else { STAT &= 0xFB; LYC_INT = false; }
}
} }
break; break;
case 0xFF46: // DMA case 0xFF46: // DMA
@ -362,7 +369,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
LY_inc = 1; LY_inc = 1;
Core.in_vblank = false; Core.in_vblank = false;
STAT &= 0xFC; //STAT &= 0xFC;
// special note here, the y coordiate of the window is kept if the window is deactivated // special note here, the y coordiate of the window is kept if the window is deactivated
// meaning it will pick up where it left off if re-enabled later // meaning it will pick up where it left off if re-enabled later
@ -396,14 +403,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
STAT &= 0xFC; STAT &= 0xFC;
// also the LCD doesn't turn on right away // also the LCD doesn't turn on right away
// also, the LCD does not enter mode 2 on scanline 0 when first turned on // also, the LCD does not enter mode 2 on scanline 0 when first turned on
no_scan = true; no_scan = true;
cycle = 8; cycle = 6;
} }
// the VBL stat is continuously asserted // the VBL stat is continuously asserted
if ((LY >= 144)) if (LY >= 144)
{ {
if (STAT.Bit(4)) if (STAT.Bit(4))
{ {
@ -440,7 +446,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (STAT.Bit(5)) { VBL_INT = false; } if (STAT.Bit(5)) { VBL_INT = false; }
} }
if ((cycle == 6) && (LY == 153)) if ((cycle == 8) && (LY == 153))
{ {
LY = 0; LY = 0;
LY_inc = 0; LY_inc = 0;
@ -506,6 +512,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (LY != 0) if (LY != 0)
{ {
HBL_INT = false; HBL_INT = false;
if (STAT.Bit(5)) { OAM_INT = true; } if (STAT.Bit(5)) { OAM_INT = true; }
} }
} }
@ -513,7 +520,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{ {
// apparently, writes can make it to OAM one cycle longer then reads // apparently, writes can make it to OAM one cycle longer then reads
OAM_access_write = false; OAM_access_write = false;
// here mode 2 will be set to true and interrupts fired if enabled // here mode 2 will be set to true and interrupts fired if enabled
STAT &= 0xFC; STAT &= 0xFC;
STAT |= 0x2; STAT |= 0x2;
@ -539,6 +546,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
OAM_INT = false; OAM_INT = false;
OAM_access_write = false; OAM_access_write = false;
VRAM_access_write = false; VRAM_access_write = false;
// x-scroll is expected to be latched one cycle later
// this is fine since nothing has started in the rendering until the second cycle
// calculate the column number of the tile to start with
x_tile = (int)Math.Floor((float)(scroll_x) / 8);
render_offset = scroll_x % 8;
} }
// render the screen and handle hblank // render the screen and handle hblank
@ -646,10 +659,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// window X is latched for the scanline, mid-line changes have no effect // window X is latched for the scanline, mid-line changes have no effect
window_x_latch = window_x; window_x_latch = window_x;
// calculate the column number of the tile to start with
x_tile = (int)Math.Floor((float)(scroll_x) / 8);
render_offset = scroll_x % 8;
OAM_scan_index = 0; OAM_scan_index = 0;
read_case = 0; read_case = 0;
internal_cycle = 0; internal_cycle = 0;
@ -683,7 +692,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (SL_sprites_index == 0) { no_sprites = true; } if (SL_sprites_index == 0) { no_sprites = true; }
// it is much easier to process sprites if we order them according to the rules of sprite priority first // it is much easier to process sprites if we order them according to the rules of sprite priority first
if (!no_sprites) { reorder_and_assemble_sprites(); } if (!no_sprites) { reorder_and_assemble_sprites(); }
} }
// before anything else, we have to check if windowing is in effect // before anything else, we have to check if windowing is in effect
@ -847,7 +855,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (pixel_counter == 160) if (pixel_counter == 160)
{ {
read_case = 8; read_case = 8;
hbl_countdown = 1;
} }
} }
else if (pixel_counter < 0) else if (pixel_counter < 0)
@ -1094,23 +1101,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
case 8: // done reading, we are now in phase 0 case 8: // done reading, we are now in phase 0
pre_render = true; pre_render = true;
// the other interrupts appear to be delayed by 1 CPU cycle, so do the same here STAT &= 0xFC;
if (hbl_countdown > 0) STAT |= 0x00;
{
hbl_countdown--;
STAT &= 0xFC;
STAT |= 0x00;
if (hbl_countdown == 0) if (STAT.Bit(3)) { HBL_INT = true; }
{
if (STAT.Bit(3)) { HBL_INT = true; }
OAM_access_read = true; OAM_access_read = true;
OAM_access_write = true; OAM_access_write = true;
VRAM_access_read = true; VRAM_access_read = true;
VRAM_access_write = true; VRAM_access_write = true;
}
}
break; break;
case 9: case 9:

View File

@ -1,7 +1,5 @@
using System; using System;
using BizHawk.Emulation.Common;
using BizHawk.Common.NumberExtensions; using BizHawk.Common.NumberExtensions;
using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Nintendo.GBHawk namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{ {
@ -197,7 +195,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
} }
// the VBL stat is continuously asserted // the VBL stat is continuously asserted
if ((LY >= 144)) if (LY >= 144)
{ {
if (STAT.Bit(4)) if (STAT.Bit(4))
{ {
@ -333,6 +331,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
OAM_INT = false; OAM_INT = false;
OAM_access_write = false; OAM_access_write = false;
VRAM_access_write = false; VRAM_access_write = false;
// x-scroll is expected to be latched one cycle later
// this is fine since nothing has started in the rendering until the second cycle
// calculate the column number of the tile to start with
x_tile = (int)Math.Floor((float)(scroll_x) / 8);
render_offset = scroll_x % 8;
} }
// render the screen and handle hblank // render the screen and handle hblank
@ -422,7 +426,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// might be needed, not sure yet // might be needed, not sure yet
public override void latch_delay() public override void latch_delay()
{ {
//BGP_l = BGP;
} }
public override void render(int render_cycle) public override void render(int render_cycle)
@ -440,10 +444,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// window X is latched for the scanline, mid-line changes have no effect // window X is latched for the scanline, mid-line changes have no effect
window_x_latch = window_x; window_x_latch = window_x;
// calculate the column number of the tile to start with
x_tile = (int)Math.Floor((float)(scroll_x) / 8);
render_offset = scroll_x % 8;
OAM_scan_index = 0; OAM_scan_index = 0;
read_case = 0; read_case = 0;
internal_cycle = 0; internal_cycle = 0;
@ -479,7 +479,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (SL_sprites_index == 0) { no_sprites = true; } if (SL_sprites_index == 0) { no_sprites = true; }
// it is much easier to process sprites if we order them according to the rules of sprite priority first // it is much easier to process sprites if we order them according to the rules of sprite priority first
if (!no_sprites) { reorder_and_assemble_sprites(); } if (!no_sprites) { reorder_and_assemble_sprites(); }
} }
// before anything else, we have to check if windowing is in effect // before anything else, we have to check if windowing is in effect
@ -592,7 +591,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (pixel_counter == 160) if (pixel_counter == 160)
{ {
read_case = 8; read_case = 8;
hbl_countdown = 1;
} }
} }
else if (pixel_counter < 0) else if (pixel_counter < 0)
@ -818,23 +816,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
case 8: // done reading, we are now in phase 0 case 8: // done reading, we are now in phase 0
pre_render = true; pre_render = true;
// the other interrupts appear to be delayed by 1 CPU cycle, so do the same here STAT &= 0xFC;
if (hbl_countdown > 0) STAT |= 0x00;
{
hbl_countdown--;
STAT &= 0xFC;
STAT |= 0x00;
if (hbl_countdown == 0) if (STAT.Bit(3)) { HBL_INT = true; }
{
if (STAT.Bit(3)) { HBL_INT = true; }
OAM_access_read = true; OAM_access_read = true;
OAM_access_write = true; OAM_access_write = true;
VRAM_access_read = true; VRAM_access_read = true;
VRAM_access_write = true; VRAM_access_write = true;
}
}
break; break;
case 9: case 9:

View File

@ -1,6 +1,4 @@
using System; using System;
using BizHawk.Emulation.Common;
using BizHawk.Common.NumberExtensions;
using BizHawk.Common; using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Nintendo.GBHawk namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
@ -12,7 +10,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public uint[] BG_palette = new uint[32]; public uint[] BG_palette = new uint[32];
public uint[] OBJ_palette = new uint[32]; public uint[] OBJ_palette = new uint[32];
public bool HDMA_active; public bool HDMA_active;
// register variables // register variables
@ -44,7 +41,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public bool LCD_was_off; public bool LCD_was_off;
public bool stat_line; public bool stat_line;
public bool stat_line_old; public bool stat_line_old;
public int hbl_countdown;
// OAM scan // OAM scan
public bool DMA_OAM_access; public bool DMA_OAM_access;
public bool OAM_access_read; public bool OAM_access_read;
@ -151,7 +147,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
} }
public virtual void Reset() public virtual void Reset()
{ {
@ -166,7 +161,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public virtual void SyncState(Serializer ser) public virtual void SyncState(Serializer ser)
{ {
ser.Sync("BG_palette", ref BG_palette, false); ser.Sync("BG_palette", ref BG_palette, false);
ser.Sync("OBJ_palette", ref OBJ_palette, false); ser.Sync("OBJ_palette", ref OBJ_palette, false);
ser.Sync("HDMA_active", ref HDMA_active); ser.Sync("HDMA_active", ref HDMA_active);
@ -197,7 +191,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ser.Sync("OAM_INT", ref OAM_INT); ser.Sync("OAM_INT", ref OAM_INT);
ser.Sync("stat_line", ref stat_line); ser.Sync("stat_line", ref stat_line);
ser.Sync("stat_line_old", ref stat_line_old); ser.Sync("stat_line_old", ref stat_line_old);
ser.Sync("hbl_countdown", ref hbl_countdown);
ser.Sync("LCD_was_off", ref LCD_was_off); ser.Sync("LCD_was_off", ref LCD_was_off);
ser.Sync("OAM_scan_index", ref OAM_scan_index); ser.Sync("OAM_scan_index", ref OAM_scan_index);
ser.Sync("SL_sprites_index", ref SL_sprites_index); ser.Sync("SL_sprites_index", ref SL_sprites_index);