diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index 3fd1541b69..ddfc35e6df 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -315,6 +315,7 @@ + diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper249.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper249.cs new file mode 100644 index 0000000000..410e95b181 --- /dev/null +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper249.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Consoles.Nintendo +{ + public class Mapper249 : MMC3Board_Base + { + bool piratecrap = false; + + // mmc3 with pirate crap bolt on + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER249": + break; + default: + return false; + } + AssertPrg(256, 512); + AssertChr(256); + Cart.wram_size = 8; + BaseSetup(); + return true; + } + + public override void SyncState(Serializer ser) + { + base.SyncState(ser); + ser.Sync("piratecrap", ref piratecrap); + } + + public override void WriteEXP(int addr, byte value) + { + piratecrap = value.Bit(1); + } + + protected override int Get_CHRBank_1K(int addr) + { + int v = base.Get_CHRBank_1K(addr); + if (piratecrap) + v = v & 3 | v >> 1 & 4 | v >> 4 & 8 | v >> 2 & 0x10 | v << 3 & 0x20 | v << 2 & 0xC0; + return v; + } + + protected override int Get_PRGBank_8K(int addr) + { + int v = base.Get_PRGBank_8K(addr); + if (piratecrap) + { + if (v < 0x20) + v = v & 1 | v >> 3 & 2 | v >> 1 & 4 | v << 2 & 8 | v << 2 & 0x10; + else + { + v -= 0x20; + v = v & 3 | v >> 1 & 4 | v >> 4 & 8 | v >> 2 & 0x10 | v << 3 & 0x20 | v << 2 & 0xC0; + } + } + return v; + } + } +}