From ffbb1f3399d647dec0e979baad6447b148c65616 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 24 Nov 2017 12:24:22 -0500 Subject: [PATCH] GBHawk: Bug Fixes --- .../Consoles/Nintendo/GBHawk/MemoryMap.cs | 60 +++++++++++-------- .../Consoles/Nintendo/GBHawk/PPU.cs | 12 +++- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs index 3564245b4c..b1b241d39b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs @@ -33,22 +33,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk if (ppu.DMA_start) { - if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access) + if (addr < 0x4000) { - return OAM[addr - 0xFE00]; - } - else if ((addr >= 0xFF80)) - { - return ZP_RAM[addr - 0xFF80]; + return mapper.ReadMemory(addr); // some of gekkio's tests require this to be accessible during DMA } else if ((addr >= 0xE000) && (addr < 0xFE00)) { return RAM[addr - 0xE000]; // some of gekkio's tests require this to be accessible during DMA } - else if (addr < 0x4000) + else if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access) { - return mapper.ReadMemory(addr); // some of gekkio's tests require this to be accessible during DMA + return OAM[addr - 0xFE00]; } + else if ((addr >= 0xFF00) && (addr < 0xFF80)) // The game GOAL! Requires Hardware Regs to be accessible + { + return Read_Registers(addr); + } + else if ((addr >= 0xFF80)) + { + return ZP_RAM[addr - 0xFF80]; + } + return 0xFF; } @@ -126,22 +131,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk if (ppu.DMA_start) { - if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access) + if ((addr >= 0xE000) && (addr < 0xFE00)) + { + RAM[addr - 0xE000] = value; // some of gekkio's tests require this to be accessible during DMA + } + else if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access) { OAM[addr - 0xFE00] = value; } + else if ((addr >= 0xFF00) && (addr < 0xFF80)) // The game GOAL! Requires Hardware Regs to be accessible + { + Write_Registers(addr, value); + } else if ((addr >= 0xFF80)) { ZP_RAM[addr - 0xFF80] = value; } - else if (addr == 0xFF46) - { - Write_Registers(addr, value); // a second DMA can start, but what about other registers? - } - else if ((addr >= 0xE000) && (addr < 0xFE00)) - { - RAM[addr - 0xE000] = value; // some of gekkio's tests require this to be accessible during DMA - } return; } @@ -211,22 +216,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk { if (ppu.DMA_start) { - if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access) + if (addr < 0x4000) { - return OAM[addr - 0xFE00]; - } - else if ((addr >= 0xFF80)) - { - return ZP_RAM[addr - 0xFF80]; + return mapper.ReadMemory(addr); // some of gekkio's tests require this to be accessible during DMA } else if ((addr >= 0xE000) && (addr < 0xFE00)) { return RAM[addr - 0xE000]; // some of gekkio's tests require this to be accessible during DMA } - else if (addr < 0x4000) + else if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access) { - return mapper.PeekMemory(addr); // some of gekkio's tests require this to be accessible during DMA + return OAM[addr - 0xFE00]; } + else if ((addr >= 0xFF00) && (addr < 0xFF80)) // The game GOAL! Requires Hardware Regs to be accessible + { + return Read_Registers(addr); + } + else if ((addr >= 0xFF80)) + { + return ZP_RAM[addr - 0xFF80]; + } + return 0xFF; } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs index 5b94e3b3b5..1bcb384241 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/PPU.cs @@ -117,6 +117,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk switch (addr) { case 0xFF40: // LCDC + if (LCDC.Bit(7) && !value.Bit(7)) + { + VRAM_access_read = true; + VRAM_access_write = true; + OAM_access_read = true; + OAM_access_write = true; + } + LCDC = value; break; case 0xFF41: // STAT @@ -1047,8 +1055,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk BGP = 0xFF; obj_pal_0 = 0xFF; obj_pal_1 = 0xFF; - window_y = 0; - window_x = 0; + window_y = 0x0; + window_x = 0x0; LY_inc = 1; no_scan = false; OAM_access_read = true;