From defdfa6e2ed41e34a04cc94e6005a421badfe019 Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 25 Aug 2015 20:11:32 -0400 Subject: [PATCH] NESHawk - fix mapper 164 --- .../Consoles/Nintendo/NES/Boards/Mapper164.cs | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper164.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper164.cs index 5d0dbc9647..ed6f380762 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper164.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper164.cs @@ -6,8 +6,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { // http://wiki.nesdev.com/w/index.php/INES_Mapper_164 - int prg_bank; - int prg_bank_mask_32k; + private int _prgHigh; + private int _prgLow; + + private int prg_bank_mask_32k; public override bool Configure(NES.EDetectionOrigin origin) { @@ -18,7 +20,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES default: return false; } - prg_bank = 0xFF; + + _prgLow = 0xFF; prg_bank_mask_32k = Cart.prg_size / 32 - 1; SetMirrorType(Cart.pad_h, Cart.pad_v); return true; @@ -26,32 +29,35 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public override void WriteEXP(int addr, byte value) { - addr = (addr + 0x4000) & 0xF300; - if (addr == 0x5000 || addr == 0xD000) - prg_bank = value; - } - - public override void WritePRG(int addr, byte value) - { - addr = (addr + 0x8000) & 0xF300; - if (addr == 0x5000 || addr == 0xD000) - prg_bank = value; + addr = (addr + 0x4000) & 0x7300; + switch (addr) + { + case 0x5000: + _prgLow = value; + break; + case 0x5100: + _prgHigh = value; + break; + } } public override byte ReadPRG(int addr) { - return ROM[addr + ((prg_bank & prg_bank_mask_32k) * 0x8000)]; + int bank = (_prgHigh << 4) | (_prgLow & 0xF); + bank &= prg_bank_mask_32k; + return ROM[(bank * 0x8000) + (addr & 0x7FFF)]; } public override void SyncState(Serializer ser) { base.SyncState(ser); - ser.Sync("prg", ref prg_bank); + ser.Sync("prgHigh", ref _prgHigh); + ser.Sync("prgLow", ref _prgLow); } public override void NESSoftReset() { - prg_bank = 0xFF; + _prgHigh = 0xFF; base.NESSoftReset(); } }