From 8e467d4a464d503995515ece8a644c8f7089a510 Mon Sep 17 00:00:00 2001 From: adelikat Date: Mon, 17 Oct 2016 17:34:54 -0500 Subject: [PATCH] NESHawk - support Reset Based 4-in-1 --- .../Consoles/Nintendo/NES/Boards/Mapper60.cs | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper60.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper60.cs index 9ef990ac4c..d9ff278ff9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper60.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper60.cs @@ -1,4 +1,5 @@ -using BizHawk.Common; +using System; +using BizHawk.Common; using BizHawk.Common.NumberExtensions; namespace BizHawk.Emulation.Cores.Nintendo.NES @@ -20,7 +21,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES switch (Cart.board_type) { case "MAPPER060": - break; + // Hack, Reset 4-in-1 is a different board but still assign to mapper 60 + if (Cart.prg_size != 64 || Cart.chr_size != 32) + { + break; + } + + return false; default: return false; } @@ -75,4 +82,54 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES return base.ReadPPU(addr); } } + + public class Reset4in1 : NES.NESBoardBase + { + private int resetSwitch = 0; + + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER060": + // Hack, Reset 4-in-1 is a different board but still assign to mapper 60 + if (Cart.prg_size == 64 && Cart.chr_size == 32) + { + break; + } + return false; + default: + return false; + } + + return true; + } + + public override void SyncState(Serializer ser) + { + ser.Sync("resetSwitch", ref resetSwitch); + base.SyncState(ser); + } + + public override void NESSoftReset() + { + resetSwitch = (resetSwitch + 1) & 3; + base.NESSoftReset(); + } + + public override byte ReadPRG(int addr) + { + return ROM[(resetSwitch << 14) + (addr & 0x3FFF)]; + } + + public override byte ReadPPU(int addr) + { + if (addr < 0x2000) + { + return VROM[(resetSwitch << 13) + addr]; + } + + return base.ReadPPU(addr); + } + } }