From 209fd4444247d5b6cb76f93daaec18420a6222a7 Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 28 Feb 2011 10:48:18 +0000 Subject: [PATCH] [NES] add GxROM --- BizHawk.Emulation/BizHawk.Emulation.csproj | 1 + .../Consoles/Nintendo/NES/BoardDetector.cs | 2 + .../Consoles/Nintendo/NES/Boards/AxROM.cs | 7 +-- .../Consoles/Nintendo/NES/Boards/CxROM.cs | 7 +-- .../Consoles/Nintendo/NES/Boards/GxROM.cs | 43 +++++++++++++++++++ .../Consoles/Nintendo/NES/NES.cs | 1 + 6 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 BizHawk.Emulation/Consoles/Nintendo/NES/Boards/GxROM.cs 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");