diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index 9cebb1ae70..29d90e51e9 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -171,6 +171,7 @@ + diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs index 991d6541b3..c0a69b4417 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs @@ -306,6 +306,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo public byte pad_h, pad_v, mapper; public bool wram_battery; public bool bad; + /// in [0,3]; combination of bits 0 and 3 of flags6. try not to use; will be null for bootgod-identified roms always + public int? inesmirroring; public string board_type; public string pcb; diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper218.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper218.cs new file mode 100644 index 0000000000..7036192f78 --- /dev/null +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper218.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Consoles.Nintendo +{ + // rewires pins to use internal CIRAM as both nametable and pattern data, so + // the entire cart is just a single PRGROM chip (plus CIC) + public class Mapper218 : NES.NESBoardBase + { + //configuration + int prg_byte_mask; + int chr_addr_mask; + + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER218": + // the cart actually has 0k vram, but due to massive abuse of the ines format, is labeled as 8k + // supposed vram is (correctly) not used in our implementation + AssertPrg(8, 16, 32); AssertChr(0); /*AssertVram(0);*/ AssertWram(0); + break; + default: + return false; + } + + // due to massive abuse of the ines format, the mirroring and 4 screen bits have slightly different meanings + switch (Cart.inesmirroring) + { + case 1: // VA10 to PA10 + chr_addr_mask = 1 << 10; + break; + case 0: // VA10 to PA11 + chr_addr_mask = 1 << 11; + break; + case 2: // VA10 to PA12 + chr_addr_mask = 1 << 12; + break; + case 3: // VA10 to PA13 + chr_addr_mask = 1 << 13; + break; + default: + // we need an ines identification for correct mirroring + return false; + } + prg_byte_mask = (Cart.prg_size*1024) - 1; + return true; + } + + int TransformPPU(int addr) + { + if ((addr & chr_addr_mask) != 0) + addr = addr & 0x3ff | 0x400; + else + addr = addr & 0x3ff; + return addr; + } + + public override byte ReadPPU(int addr) + { + if (addr < 0x3f00) + return NES.CIRAM[TransformPPU(addr)]; + else + // palettes only + return base.ReadPPU(addr); + } + + public override void WritePPU(int addr, byte value) + { + if (addr < 0x3f00) + NES.CIRAM[TransformPPU(addr)] = value; + else + // palettes only + base.WritePPU(addr, value); + } + + public override byte ReadPRG(int addr) + { + addr &= prg_byte_mask; + return ROM[addr]; + } + } +} diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/iNES.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/iNES.cs index 6e2a46b261..02592eb86a 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/iNES.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/iNES.cs @@ -79,9 +79,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo mapper |= (ROM_type2 & 0xF0); ret.mapper = (byte)mapper; int mirroring = (ROM_type & 1); - if ((ROM_type & 8) != 0) mirroring = 2; + if ((ROM_type & 8) != 0) mirroring += 2; if (mirroring == 0) ret.pad_v = 1; else if (mirroring == 1) ret.pad_h = 1; + ret.inesmirroring = mirroring; ret.prg_size = (short)(ROM_size * 16); if (ret.prg_size == 0) ret.prg_size = 256 * 16;