From c829534170d140f5784f997115b5c99f5352ddaf Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 29 Mar 2018 09:26:55 -0400 Subject: [PATCH] GBHawk: Bug Fixes, fix to Beast fighter --- .../Consoles/Nintendo/GBHawk/GBC_PPU.cs | 6 +++++- .../Consoles/Nintendo/GBHawk/GBHawk.ISettable.cs | 2 +- BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GB_PPU.cs | 7 ++++++- BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs | 2 ++ BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Timer.cs | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBC_PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBC_PPU.cs index 933dfd8154..304d1aa276 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBC_PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBC_PPU.cs @@ -372,6 +372,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk window_y_tile = 0; window_y_tile_inc = 0; window_started = false; + window_is_reset = true; } Core.cpu.LY = LY; @@ -632,7 +633,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk evaled_sprites = 0; window_pre_render = false; - if (window_started && LCDC.Bit(5)) + + // TODO: If Window is turned on midscanline what happens? When is this check done exactly? + if ((window_started && LCDC.Bit(5)) || (window_is_reset && !LCDC.Bit(5) && (LY > window_y))) { window_y_tile_inc++; if (window_y_tile_inc==8) @@ -682,6 +685,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk window_tile_inc = 0; window_started = true; + window_is_reset = false; } if (!pre_render && !fetch_sprite && !window_pre_render) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.ISettable.cs index 58d1261388..f1d1cf846c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.ISettable.cs @@ -119,7 +119,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk [JsonIgnore] private int _RTCInitialTime; [JsonIgnore] - private ushort _DivInitialTime; + public ushort _DivInitialTime; public GBSyncSettings Clone() diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GB_PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GB_PPU.cs index e34e75480c..209af304ed 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GB_PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GB_PPU.cs @@ -146,6 +146,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk window_y_tile = 0; window_y_tile_inc = 0; window_started = false; + window_is_reset = true; } Core.cpu.LY = LY; @@ -406,7 +407,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk evaled_sprites = 0; window_pre_render = false; - if (window_started && LCDC.Bit(5)) + + // TODO: If Window is turned on midscanline what happens? When is this check done exactly? + if ((window_started && LCDC.Bit(5)) || (window_is_reset && !LCDC.Bit(5) && (LY > window_y))) { window_y_tile_inc++; if (window_y_tile_inc==8) @@ -456,6 +459,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk window_tile_inc = 0; window_started = true; + window_is_reset = false; } if (!pre_render && !fetch_sprite && !window_pre_render) @@ -1146,6 +1150,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk window_counter = 0; window_pre_render = false; window_started = false; + window_is_reset = true; window_tile_inc = 0; window_y_tile = 0; window_x_tile = 0; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs index 9a4f94c409..1dc152fd00 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs @@ -96,6 +96,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk public int window_counter; public bool window_pre_render; public bool window_started; + public bool window_is_reset; public int window_tile_inc; public int window_y_tile; public int window_x_tile; @@ -243,6 +244,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk ser.Sync("window_counter", ref window_counter); ser.Sync("window_pre_render", ref window_pre_render); ser.Sync("window_started", ref window_started); + ser.Sync("window_is_reset", ref window_is_reset); ser.Sync("window_tile_inc", ref window_tile_inc); ser.Sync("window_y_tile", ref window_y_tile); ser.Sync("window_x_tile", ref window_x_tile); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Timer.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Timer.cs index 817c28201e..1a6aa88e0a 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Timer.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Timer.cs @@ -144,7 +144,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk public void Reset() { - divider_reg = 0; + divider_reg = Core._syncSettings._DivInitialTime; timer_reload = 0; timer = 0; timer_old = 0;