diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj
index 82bd88885d..cc3b616974 100644
--- a/BizHawk.Emulation/BizHawk.Emulation.csproj
+++ b/BizHawk.Emulation/BizHawk.Emulation.csproj
@@ -156,6 +156,7 @@
+
diff --git a/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt b/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt
index dd0194c761..a7737e7eb0 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt
+++ b/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt
@@ -112,7 +112,7 @@ Open bus and bus conflict emulation is not considered complete or thorough in an
203 Multicart Junk
205 Multicart Junk
*206 Namcot109 Complete (missing from disch docs)
-207 Misc (J) Nothing
+207 Misc (J) Started but bugs
209 Garbage {{See 090}}
210 Namcot Decent {{See 019}}
225 Multicart Junk
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper207.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper207.cs
new file mode 100644
index 0000000000..609376bdd8
--- /dev/null
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper207.cs
@@ -0,0 +1,206 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BizHawk.Emulation.Consoles.Nintendo
+{
+ /*
+ * Here are Disch's original notes:
+ ========================
+ = Mapper 207 =
+ ========================
+
+ Example Game:
+ --------------------------
+ Fudou Myouou Den
+
+ Notes:
+ ---------------------------
+ Regs appear at $7EFx, I'm unsure whether or not PRG-RAM can exist at $6000-7FFF
+
+ Registers:
+ ---------------------------
+
+ $7EF0: [MCCC CCCC]
+ M = Mirroring 0
+ C = CHR Reg 0
+
+ $7EF1: [MCCC CCCC]
+ M = Mirroring 1
+ C = CHR Reg 1
+
+ $7EF2-7EF5: CHR Regs 2-5
+
+
+ $7EFA,7EFB: PRG Reg 0 (8k @ $8000)
+ $7EFC,7EFD: PRG Reg 1 (8k @ $A000)
+ $7EFE,7EFF: PRG Reg 2 (8k @ $C000)
+
+
+ CHR Setup:
+ ---------------------------
+
+ $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00
+ +---------------+---------------+-------+-------+-------+-------+
+ | <$7EF0> | <$7EF1> | $7EF2 | $7EF3 | $7EF4 | $7EF5 |
+ +---------------+---------------+-------+-------+-------+-------+
+
+ PRG Setup:
+ ---------------------------
+
+ $8000 $A000 $C000 $E000
+ +-------+-------+-------+-------+
+ | $7EFA | $7EFC | $7EFE | { -1} |
+ +-------+-------+-------+-------+
+
+ Mirroring:
+ ---------------------------
+
+ [ $7EF0 ][ $7EF0 ]
+ [ $7EF1 ][ $7EF1 ]
+
+ Mirroring bit of appropriate reg selects NTA or NTB
+ */
+ class Mapper207 : NES.NESBoardBase
+ {
+ int prg_bank_mask, chr_bank_mask;
+ ByteBuffer chr_regs_1k = new ByteBuffer(8);
+ ByteBuffer prg_regs_8k = new ByteBuffer(4);
+ bool mirror0 = false;
+ bool mirror1 = false;
+
+ public override void SyncState(Serializer ser)
+ {
+ base.SyncState(ser);
+ ser.Sync("chr_regs_1k", ref chr_regs_1k);
+ ser.Sync("prg_regs_8k", ref prg_regs_8k);
+ ser.Sync("mirror0", ref mirror0);
+ ser.Sync("mirror1", ref mirror1);
+ DoMirroring();
+ }
+
+ public override void Dispose()
+ {
+ base.Dispose();
+ chr_regs_1k.Dispose();
+ prg_regs_8k.Dispose();
+ }
+
+ public override bool Configure(NES.EDetectionOrigin origin)
+ {
+ //configure
+ switch (Cart.board_type)
+ {
+ case "MAPPER207":
+ break;
+ case "TAITO-X1-005":
+ if (Cart.mapper == 207)
+ {
+ break;
+ }
+ return false;
+ default:
+ return false;
+ }
+
+ SetMirrorType(EMirrorType.Horizontal);
+ chr_bank_mask = Cart.chr_size / 1 - 1;
+ prg_bank_mask = Cart.prg_size / 8 - 1;
+ prg_regs_8k[3] = 0xFF;
+ return true;
+ }
+
+ public override void WriteWRAM(int addr, byte value)
+ {
+ switch (addr)
+ {
+ case 0x1EF0:
+ mirror0 = value.Bit(7);
+ int val1 = value & 0x7F;
+ chr_regs_1k[0] = (byte)(val1/2*2);
+ chr_regs_1k[1] = (byte)(val1/2*2+1);
+ break;
+ case 0x1EF1:
+ mirror1 = value.Bit(7);
+ int val2 = value & 0x7F;
+ chr_regs_1k[2] = (byte)(val2/2*2);
+ chr_regs_1k[3] = (byte)(val2/2*2+1);
+ break;
+
+ case 0x1EF2:
+ chr_regs_1k[4] = value;
+ break;
+ case 0x1EF3:
+ chr_regs_1k[5] = value;
+ break;
+ case 0x1EF4:
+ chr_regs_1k[6] = value;
+ break;
+ case 0X1EF5:
+ chr_regs_1k[7] = value;
+ break;
+
+ case 0x1EFA: //PRG Reg 0
+ case 0x1EFB:
+ prg_regs_8k[0] = value;
+ break;
+ case 0x1EFC: //PRG Reg 1
+ case 0x1EFD:
+ prg_regs_8k[1] = value;
+ break;
+ case 0x1EFE: //PRG Reg 2
+ case 0x1EFF:
+ prg_regs_8k[2] = value;
+ break;
+ }
+ DoMirroring();
+ }
+
+ private void DoMirroring()
+ {
+ if (mirror0 == false && mirror1 == false)
+ {
+ SetMirrorType(EMirrorType.Horizontal);
+ }
+ else if (mirror0 == true && mirror1 == false)
+ {
+ SetMirrorType(EMirrorType.Vertical);
+ }
+ else if (mirror0 == false && mirror1 == true)
+ {
+ SetMirrorType(EMirrorType.OneScreenA);
+ }
+ else
+ {
+ SetMirrorType(EMirrorType.OneScreenB);
+ }
+
+ }
+
+ public override byte ReadPRG(int addr)
+ {
+ int bank_8k = addr >> 13;
+ int ofs = addr & ((1 << 13) - 1);
+ bank_8k = prg_regs_8k[bank_8k];
+ bank_8k &= prg_bank_mask;
+ addr = (bank_8k << 13) | ofs;
+ return ROM[addr];
+ }
+
+ public override byte ReadPPU(int addr)
+ {
+ if (addr < 0x2000)
+ {
+
+ int bank_1k = addr >> 10;
+ int ofs = addr & ((1 << 10) - 1);
+ bank_1k = chr_regs_1k[bank_1k];
+ bank_1k &= chr_bank_mask;
+ addr = (bank_1k << 10) | ofs;
+ return VROM[addr];
+ }
+ else return base.ReadPPU(addr);
+ }
+ }
+}
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs
index a98c89700a..6fc9078f67 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs
@@ -70,6 +70,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo
case "MAPPER080":
break;
case "TAITO-X1-005":
+ if (Cart.mapper == 207)
+ {
+ return false;
+ }
break;
default:
return false;