diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj
index 752c786d32..ec52725159 100644
--- a/BizHawk.Emulation/BizHawk.Emulation.csproj
+++ b/BizHawk.Emulation/BizHawk.Emulation.csproj
@@ -58,6 +58,7 @@
+
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/BoardDetector.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/BoardDetector.cs
index 955fd754f6..b5f94f4cf7 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/BoardDetector.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/BoardDetector.cs
@@ -49,6 +49,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo
11 4 2 Discrete_74x377
11 2 4 Discrete_74x377
13 2 0 CPROM
+66 4 2 GxROM
+66 8 4 GxROM
";
}
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/AxROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/AxROM.cs
index ba47cfd0fe..4786ae45ef 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/AxROM.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/AxROM.cs
@@ -55,12 +55,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.Boards
public override void WritePRG(int addr, byte value)
{
- if (bus_conflict)
- {
- byte old_value = value;
- value &= ReadPRG(addr);
- Debug.Assert(old_value == value, "Found a test case of CxROM bus conflict. please report.");
- }
+ if (bus_conflict) value = HandleNormalPRGConflict(addr,value);
prg = value & prg_mask;
if ((value & 0x10) == 0)
SetMirrorType(NES.EMirrorType.OneScreenA);
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CxROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CxROM.cs
index a65bf1094d..bac6e6c335 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CxROM.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CxROM.cs
@@ -22,12 +22,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.Boards
public override void WritePRG(int addr, byte value)
{
- if (bus_conflict)
- {
- byte old_value = value;
- value &= ReadPRG(addr);
- Debug.Assert(old_value == value,"Found a test case of CxROM bus conflict. please report.");
- }
+ if (bus_conflict) value = HandleNormalPRGConflict(addr,value);
chr = value&chr_mask;
//Console.WriteLine("at {0}, set chr={1}", NES.ppu.ppur.status.sl, chr);
}
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/GxROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/GxROM.cs
new file mode 100644
index 0000000000..7cc2b31bff
--- /dev/null
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/GxROM.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Diagnostics;
+
+namespace BizHawk.Emulation.Consoles.Nintendo.Boards
+{
+ public class GxROM : NES.NESBoardBase
+ {
+ int prg_mask, chr_mask;
+ int prg, chr;
+
+ public override void Initialize(NES.RomInfo romInfo, NES nes)
+ {
+ base.Initialize(romInfo, nes);
+ Debug.Assert(romInfo.PRG_Size == 2 || romInfo.PRG_Size == 4 || romInfo.PRG_Size == 8);
+ //romInfo.CHR_Size == 8 || romInfo.CHR_Size == 16
+ Debug.Assert(romInfo.CHR_Size == 2 || romInfo.CHR_Size == 4, "This is unverified behaviour. Please check it (maybe you are playing thunder&lightning; do you have to play far into that game to see missing CHR?");
+
+ prg_mask = (romInfo.PRG_Size/2) - 1;
+ chr_mask = romInfo.CHR_Size - 1;
+ }
+ public override byte ReadPRG(int addr)
+ {
+ return RomInfo.ROM[addr + (prg<<15)];
+ }
+
+ public override byte ReadPPU(int addr)
+ {
+ if (addr < 0x2000)
+ {
+ return RomInfo.VROM[addr + (chr << 13)];
+ }
+ else return base.ReadPPU(addr);
+ }
+
+ public override void WritePRG(int addr, byte value)
+ {
+ chr = ((value & 3) & chr_mask);
+ prg = (((value>>4) & 3) & prg_mask);
+ }
+
+ int mask;
+ }
+}
\ No newline at end of file
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/NES.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/NES.cs
index d125da34b1..c1d1061aa2 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/NES.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/NES.cs
@@ -645,6 +645,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
case "AOROM": board = new Boards.AxROM("AOROM"); break;
case "Discrete_74x377": board = new Boards.Discrete_74x377(); break;
case "CPROM": board = new Boards.CPROM(); break;
+ case "GxROM": board = new Boards.GxROM(); break;
}
if (board == null) throw new InvalidOperationException("Couldn't classify NES rom");