diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
index aee470818c..907c6e71bc 100644
--- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
+++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
@@ -346,6 +346,7 @@
+
diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs
index fb86da411e..d036902d01 100644
--- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs
@@ -77,6 +77,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
audio = new Namco163Audio(NES.apu.ExternalQueue);
break;
+ /*
//mapper 210:
case "NAMCOT-175":
//wagyan land 2
@@ -89,6 +90,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
//famista '92
AssertPrg(128,256,512); AssertChr(128,256); AssertVram(0); AssertWram(0,8);
break;
+ */
default:
return false;
}
diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Namcot175_340.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Namcot175_340.cs
new file mode 100644
index 0000000000..8e747602c7
--- /dev/null
+++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Namcot175_340.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using BizHawk.Common;
+
+namespace BizHawk.Emulation.Cores.Nintendo.NES
+{
+ public class Namcot175_340 : NES.NESBoardBase
+ {
+ /*
+ * Namcot 175 and 340. Simpler versions of the 129/163. Differences:
+ * No IRQs.
+ * No extended ciram control:
+ * PPU $0000:$1FFF is always CHRROM.
+ * PPU $2000:$2FFF is always CIRAM.
+ * No sound.
+ * Mirroring varies by type:
+ * 175: Hardwired mirroring (H/V)
+ * 340: Simple mirroring control through $E000.
+ *
+ * Nesdev mentions that the 340 has no WRAM, but that's because no games
+ * on the 340 ever used it. (In fact, only 1 (?) 175 game has wram).
+ * In any event, WRAM write protect is different than on 129/163.
+ *
+ * This should be mapper 210, with mapper 19 being 129/163, but you know how
+ * mapper numbers are. To complicate things, some 175/340 games run correctly
+ * on a 163 because they make compatibility writes to both sets of mirroring regs.
+ */
+
+ // config
+ int prg_bank_mask_8k;
+ int chr_bank_mask_1k;
+ bool enablemirror;
+
+ // state
+ int[] prg = new int[4];
+ int[] chr = new int[8];
+ bool wramenable;
+
+ public override bool Configure(NES.EDetectionOrigin origin)
+ {
+ switch (Cart.board_type)
+ {
+ case "NAMCOT-175":
+ //wagyan land 2
+ //splatter house
+ SetMirrorType(Cart.pad_h, Cart.pad_v);
+ break;
+ case "NAMCOT-340":
+ //family circuit '91
+ //dream master
+ //famista '92
+ enablemirror = true;
+ break;
+ case "MAPPER210":
+ // not sure what to do here because the popular public collection
+ // has nothing in mapper 210 except some mortal kombat pirate cart
+ enablemirror = true;
+ SetMirrorType(Cart.pad_h, Cart.pad_v);
+ break;
+ default:
+ return false;
+ }
+ AssertPrg(64, 128, 256, 512);
+ AssertChr(64, 128, 256);
+ AssertVram(0);
+
+ prg_bank_mask_8k = Cart.prg_size / 8 - 1;
+ chr_bank_mask_1k = Cart.chr_size / 1 - 1;
+ prg[3] = prg_bank_mask_8k;
+ return true;
+ }
+
+ public override void SyncState(Serializer ser)
+ {
+ base.SyncState(ser);
+ ser.Sync("prg", ref prg, false);
+ ser.Sync("chr", ref chr, false);
+ ser.Sync("wramenable", ref wramenable);
+ }
+
+ public override void WritePRG(int addr, byte value)
+ {
+ switch (addr & 0x7800)
+ {
+ case 0x0000: chr[0] = value & chr_bank_mask_1k; break;
+ case 0x0800: chr[1] = value & chr_bank_mask_1k; break;
+ case 0x1000: chr[2] = value & chr_bank_mask_1k; break;
+ case 0x1800: chr[3] = value & chr_bank_mask_1k; break;
+ case 0x2000: chr[4] = value & chr_bank_mask_1k; break;
+ case 0x2800: chr[5] = value & chr_bank_mask_1k; break;
+ case 0x3000: chr[6] = value & chr_bank_mask_1k; break;
+ case 0x3800: chr[7] = value & chr_bank_mask_1k; break;
+ case 0x4000: wramenable = value.Bit(0); break;
+ case 0x4800: break;
+ case 0x5000: break;
+ case 0x5800: break;
+ case 0x6000: prg[0] = value & 63 & prg_bank_mask_8k; SyncMirror(value); break;
+ case 0x6800: prg[1] = value & 63 & prg_bank_mask_8k; break;
+ case 0x7000: prg[2] = value & 63 & prg_bank_mask_8k; break;
+ case 0x7800: break;
+ }
+ }
+
+ void SyncMirror(byte value)
+ {
+ if (enablemirror)
+ {
+ switch (value & 0xc0)
+ {
+ case 0x00: SetMirrorType(EMirrorType.OneScreenA); break;
+ case 0x40: SetMirrorType(EMirrorType.Vertical); break;
+ case 0x80: SetMirrorType(EMirrorType.Horizontal); break;
+ case 0xc0: SetMirrorType(EMirrorType.OneScreenB); break;
+ }
+ }
+ }
+
+ public override byte ReadPPU(int addr)
+ {
+ if (addr < 0x2000)
+ {
+ return VROM[addr & 0x3ff | chr[addr >> 10] << 10];
+ }
+ else
+ {
+ return base.ReadPPU(addr);
+ }
+ }
+
+ public override byte ReadPRG(int addr)
+ {
+ return ROM[addr & 0x1fff | prg[addr >> 13] << 13];
+ }
+ }
+}