diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper190.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper190.cs new file mode 100644 index 0000000000..fef5c4916b --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper190.cs @@ -0,0 +1,78 @@ +using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Cores.Nintendo.NES +{ + // Magic Kid GooGoo + public sealed class Mapper190 : NES.NESBoardBase + { + //state + int prg_reg; + int[] chr_reg = new int[4]; + + public override void SyncState(Serializer ser) + { + ser.Sync("prg_reg", ref prg_reg); + ser.Sync("chr_reg", ref chr_reg, false); + base.SyncState(ser); + } + + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER190": + AssertPrg(256); AssertChr(128); AssertVram(0); AssertWram(8); + break; + default: + return false; + } + + prg_reg = 0; + + SetMirrorType(EMirrorType.Vertical); + + return true; + } + + public override byte ReadPRG(int addr) + { + if (addr < 0x4000) + { + return ROM[(prg_reg * 0x4000) + addr]; + } + else + { + return ROM[addr - 0x4000]; + } + } + + public override byte ReadPPU(int addr) + { + if (addr < 0x2000) + { + int bank = addr >> 11; + int ofs = addr & ((1 << 11) - 1); + bank = chr_reg[bank]; + addr = (bank << 11) | ofs; + return VROM[addr]; + } + else + return base.ReadPPU(addr); + } + + public override void WritePRG(int addr, byte value) + { + int addr_temp = addr & 0xF000; + switch (addr_temp) + { + case 0x0000: prg_reg = value & 0x7; break; + case 0x2000: chr_reg[addr & 3] = value & 0x3F; break; + case 0x4000: prg_reg = 8 | (value & 0x7); break; + } + } + + + } +}