diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj
index 3e8c968468..514c7c5c64 100644
--- a/BizHawk.Emulation/BizHawk.Emulation.csproj
+++ b/BizHawk.Emulation/BizHawk.Emulation.csproj
@@ -148,6 +148,7 @@
+
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper057.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper057.cs
new file mode 100644
index 0000000000..8281d9e792
--- /dev/null
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper057.cs
@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BizHawk.Emulation.Consoles.Nintendo
+{
+ class Mapper057 : NES.NESBoardBase
+ {
+ /*
+ Here are Disch's original notes:
+ ========================
+ = Mapper 057 =
+ ========================
+
+ Example Games:
+ --------------------------
+ GK 47-in-1
+ 6-in-1 (SuperGK)
+
+
+ Registers:
+ ---------------------------
+
+ Range,Mask: $8000-FFFF, $8800
+
+ $8000: [.H.. .AAA]
+ H = High bit of CHR reg (bit 4)
+ A = Low 3 bits of CHR Reg (OR with 'B' bits)
+
+ $8800: [PPPO MBBB]
+ P = PRG Reg
+ O = PRG Mode
+ M = Mirroring (0=Vert, 1=Horz)
+ B = Low 3 bits of CHR Reg (OR with 'A' bits)
+
+
+ CHR Setup:
+ ---------------------------
+ 'A' and 'B' bits combine with an OR to get the low 3 bits of the desired page, and the 'H' bit is the high
+ bit. This 4-bit value selects an 8k page @ $0000
+
+
+ PRG Setup:
+ ---------------------------
+
+ $8000 $A000 $C000 $E000
+ +---------------+---------------+
+ PRG Mode 0: | $8800 | $8800 |
+ +-------------------------------+
+ PRG Mode 1: | <$8800> |
+ +-------------------------------+
+ */
+
+ bool prg_mode = false;
+ int chr_reg;
+ int prg_reg;
+
+ public override bool Configure(NES.EDetectionOrigin origin)
+ {
+ switch (Cart.board_type)
+ {
+ case "MAPPER057":
+ break;
+ default:
+ return false;
+ }
+
+ SetMirrorType(EMirrorType.Horizontal);
+
+ return true;
+ }
+
+ public override void SyncState(Serializer ser)
+ {
+ ser.Sync("prg_reg", ref prg_reg);
+ ser.Sync("chr_reg", ref chr_reg);
+ ser.Sync("prg_mode", ref prg_mode);
+ base.SyncState(ser);
+ }
+
+ public override void WritePRG(int addr, byte value)
+ {
+ if (addr == 0)
+ {
+ chr_reg = (value & 0x07) | ((value & 0x40) >> 3);
+ }
+ else if ((addr & 0x800) > 0)
+ {
+ prg_reg = (value >> 5) & 0x07;
+ prg_mode = value.Bit(4);
+ chr_reg |= (value & 0x07);
+ if (addr.Bit(3))
+ {
+ SetMirrorType(EMirrorType.Horizontal);
+ }
+ else
+ {
+ SetMirrorType(EMirrorType.Vertical);
+ }
+ }
+
+ //Console.WriteLine("chr page = {0}", chr_reg);
+ }
+
+ public override byte ReadPRG(int addr)
+ {
+ if (prg_mode)
+ {
+ return ROM[((prg_reg >> 1) * 0x8000) + addr];
+ }
+ else
+ {
+ return ROM[(prg_reg * 0x4000) + (addr & 0x3FFF)];
+ }
+ }
+
+ public override byte ReadPPU(int addr)
+ {
+ if (addr < 0x2000)
+ {
+ return VROM[(chr_reg * 0x2000) + addr];
+ }
+ return base.ReadPPU(addr);
+ }
+ }
+}