diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj
index e7f0f806d3..fdba9bf1c8 100644
--- a/BizHawk.Emulation/BizHawk.Emulation.csproj
+++ b/BizHawk.Emulation/BizHawk.Emulation.csproj
@@ -94,6 +94,7 @@
Code
+
diff --git a/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt b/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt
index b2b0bc6a95..ec55fe2d87 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt
+++ b/BizHawk.Emulation/Consoles/Nintendo/Docs/compatibility.txt
@@ -21,7 +21,7 @@ Open bus and bus conflict emulation is not considered complete or thorough in an
004 MMC3 Decent
005 ExRom=MMC5 Minimal
007 AxROM Good
-009 PxROM=MMC2 ~NEEDED~
+009 PxROM=MMC2 Complete
010 MMC4 Needed (easy once 009 is done)
011 Misc Complete
013 CPROM Complete
@@ -98,7 +98,7 @@ Open bus and bus conflict emulation is not considered complete or thorough in an
180 Misc (J) Nothing
182 MMC3Variant Nothing
184 Sunsoft-1 Complete
-185 Misc (J) Nothing
+185 Misc (J) {{See 003}} This one will be an organizational pain as the games need additional data in gamedb
189 MMC3Variant Nothing
191 Pirate Junk
192 Pirate Junk
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CNROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CNROM.cs
index 7cf5bf2dfa..d5837ccf8e 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CNROM.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/CNROM.cs
@@ -4,7 +4,7 @@ using System.Diagnostics;
namespace BizHawk.Emulation.Consoles.Nintendo
{
- //generally mapper3
+ //generally mapper 3
//Solomon's Key
//Arkanoid
@@ -46,6 +46,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void WritePRG(int addr, byte value)
{
if (bus_conflict) value = HandleNormalPRGConflict(addr,value);
+ value &= 3;
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/IC_74x377.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/IC_74x377.cs
index e9dd9d8f86..d3acd82f7d 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/IC_74x377.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/IC_74x377.cs
@@ -9,14 +9,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo
//Crystal Mines
//Metal Fighter
- public class Discrete_74x377 : NES.NESBoardBase
+ public class IC_74x377 : NES.NESBoardBase
{
//configuration
- int prg_mask, chr_mask;
+ int prg_bank_mask_32k, chr_bank_mask_8k;
bool bus_conflict = true;
//state
- int prg, chr;
+ int prg_bank_32k, chr_bank_8k;
public override bool Configure(NES.EDetectionOrigin origin)
{
@@ -31,22 +31,22 @@ namespace BizHawk.Emulation.Consoles.Nintendo
default:
return false;
}
-
- prg_mask = (Cart.prg_size/8/2)-1;
- chr_mask = (Cart.chr_size / 8 - 1);
+
+ prg_bank_mask_32k = Cart.prg_size / 32 - 1;
+ chr_bank_mask_8k = Cart.chr_size / 8 - 1;
return true;
}
public override byte ReadPRG(int addr)
{
- return ROM[addr + (prg<<15)];
+ return ROM[addr + (prg_bank_32k << 15)];
}
public override byte ReadPPU(int addr)
{
if (addr < 0x2000)
{
- return VROM[addr + (chr << 13)];
+ return VROM[addr + (chr_bank_8k << 13)];
}
else return base.ReadPPU(addr);
}
@@ -60,15 +60,15 @@ namespace BizHawk.Emulation.Consoles.Nintendo
Debug.Assert(old_value == value, "Found a test case of Discrete_74x377 bus conflict. please report.");
}
- prg = (value & 3) & prg_mask;
- chr = (value >> 4) & chr_mask;
+ prg_bank_32k = (value & 3) & prg_bank_mask_32k;
+ chr_bank_8k = ((value >> 4) & 0xF) & chr_bank_mask_8k;
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
- ser.Sync("chr", ref chr);
- ser.Sync("prg", ref prg);
+ ser.Sync("prg_bank_32k", ref prg_bank_32k);
+ ser.Sync("chr_bank_8k", ref chr_bank_8k);
}
}
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/TxROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/TxROM.cs
index c9476b313a..4e9f3e98e2 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/TxROM.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/MMC3_family/TxROM.cs
@@ -87,6 +87,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo
AssertPrg(128); AssertChr(128); AssertVram(0); AssertWram(0);
AssertBattery(false);
break;
+ case "HVC-TNROM": //Final Fantasy 3 (J)
+ AssertPrg(128, 256, 512); AssertChr(0, 8); AssertVram(0, 8); AssertWram(8);
+ break;
case "NES-TSROM": //super mario bros. 3 (U)
AssertPrg(128, 256, 512); AssertChr(128, 256); AssertVram(0); AssertWram(8);
AssertBattery(false);
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NROM.cs
index 0b232703fb..e068fc9cc4 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NROM.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NROM.cs
@@ -19,16 +19,15 @@ namespace BizHawk.Emulation.Consoles.Nintendo
{
case "HVC-NROM-256": //super mario bros.
case "NES-NROM-256": //10 yard fight
- AssertPrg(32); AssertChr(8); AssertVram(0); AssertWram(0,8);
- break;
-
case "HVC-RROM": //balloon fight
case "HVC-NROM-128":
case "IREM-NROM-128":
case "KONAMI-NROM-128":
case "NES-NROM-128":
case "NAMCOT-3301":
- AssertPrg(16); AssertChr(8); AssertVram(0); AssertWram(0,8);
+ case "HVC-HROM": //Donkey Kong Jr. (J)
+ case "JALECO-JF-01": //Exerion (J)
+ AssertPrg(16, 32); AssertChr(8); AssertVram(0); AssertWram(0, 8);
break;
case "NROM-HOMEBREW":
@@ -38,7 +37,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo
default:
return false;
}
- if (origin != NES.EDetectionOrigin.INES) AssertWram(0);
prg_byte_mask = (Cart.prg_size*1024) - 1;
SetMirrorType(Cart.pad_h, Cart.pad_v);
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/PxROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/PxROM.cs
new file mode 100644
index 0000000000..1eb2867ea5
--- /dev/null
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/PxROM.cs
@@ -0,0 +1,115 @@
+using System;
+using System.IO;
+using System.Diagnostics;
+
+namespace BizHawk.Emulation.Consoles.Nintendo
+{
+ //AKA MMC2 AKA Mike Tyson's Punch-Out!!
+ class PxROM : NES.NESBoardBase
+ {
+ //configuration
+ int prg_bank_mask_8k, chr_bank_mask_4k;
+
+ //state
+ IntBuffer prg_banks_8k = new IntBuffer(4);
+ IntBuffer chr_banks_4k = new IntBuffer(4);
+ IntBuffer chr_latches = new IntBuffer(2);
+
+ public override void SyncState(Serializer ser)
+ {
+ base.SyncState(ser);
+ ser.Sync("prg_banks_8k", ref prg_banks_8k);
+ ser.Sync("chr_banks_4k", ref chr_banks_4k);
+ ser.Sync("chr_latches", ref chr_latches);
+ }
+
+ public override void Dispose()
+ {
+ base.Dispose();
+ prg_banks_8k.Dispose();
+ chr_banks_4k.Dispose();
+ chr_latches.Dispose();
+ }
+
+ public override bool Configure(NES.EDetectionOrigin origin)
+ {
+ switch (Cart.board_type)
+ {
+ case "NES-PNROM": //punch-out!!
+ case "HVC-PEEOROM":
+ AssertPrg(128); AssertChr(128); AssertWram(0); AssertVram(0);
+ break;
+
+ default:
+ return false;
+ }
+
+ prg_bank_mask_8k = Cart.prg_size / 8 - 1;
+ chr_bank_mask_4k = Cart.chr_size / 4 - 1;
+
+ prg_banks_8k[0] = 0;
+ prg_banks_8k[1] = 0xFD & prg_bank_mask_8k;
+ prg_banks_8k[2] = 0xFE & prg_bank_mask_8k; ;
+ prg_banks_8k[3] = 0xFF & prg_bank_mask_8k; ;
+
+ return true;
+ }
+
+
+ public override void WritePRG(int addr, byte value)
+ {
+ switch (addr & 0xF000)
+ {
+ case 0x2000: //$A000: PRG Reg
+ prg_banks_8k[0] = value & prg_bank_mask_8k;
+ break;
+ case 0x3000: //$B000: CHR Reg 0A
+ chr_banks_4k[0] = value & chr_bank_mask_4k;
+ break;
+ case 0x4000: //$C000: CHR Reg 0B
+ chr_banks_4k[1] = value & chr_bank_mask_4k;
+ break;
+ case 0x5000: //$D000: CHR Reg 1A
+ chr_banks_4k[2] = value & chr_bank_mask_4k;
+ break;
+ case 0x6000: //$E000: CHR Reg 1B
+ chr_banks_4k[3] = value & chr_bank_mask_4k;
+ break;
+ case 0x7000: //$F000: [.... ...M] Mirroring:
+ SetMirrorType(value.Bit(0) ? EMirrorType.Horizontal : EMirrorType.Vertical);
+ break;
+ }
+ }
+
+ public override byte ReadPPU(int addr)
+ {
+ int side = addr>>12;
+ int tile = (addr>>4)&0xFF;
+ if (addr < 0x2000)
+ {
+ switch (tile)
+ {
+ case 0xFD: chr_latches[side] = 0; break;
+ case 0xFE: chr_latches[side] = 1; break;
+ }
+ int reg = side * 2 + chr_latches[side];
+ int ofs = addr & ((1 << 12) - 1);
+ int bank_4k = chr_banks_4k[reg];
+ addr = (bank_4k << 12) | ofs;
+ return VROM[addr];
+ }
+ else return base.ReadPPU(addr);
+ }
+
+ public override byte ReadPRG(int addr)
+ {
+ int bank_8k = addr >> 13;
+ int ofs = addr & ((1 << 13) - 1);
+ bank_8k = prg_banks_8k[bank_8k];
+ addr = (bank_8k << 13) | ofs;
+ return ROM[addr];
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/BizHawk.MultiClient/output/gamedb.txt b/BizHawk.MultiClient/output/gamedb.txt
index e1a2a2bd89..234dfa31a9 100644
--- a/BizHawk.MultiClient/output/gamedb.txt
+++ b/BizHawk.MultiClient/output/gamedb.txt
@@ -2270,6 +2270,8 @@ sha1:894F20405286F5F75133CE4648300E2C67972B40 Solomon's Key (U) NES board=NES-
sha1:0C53B06E1D13AE917536BB39010914EA3D111FF5 Thunder & Lightning (U) NES board=NES-GNROM;PRG=128;CHR=32;bad
sha1:9BDFF9A19265D84979F43F0F6E925A735DDEB38B Wai Xing Zhan Shi (Ch) NES board=Mapper242;PRG=512;CHR=0;VRAM=8;WRAM=8
sha1:91CECCFCAC90E417E9AEE80E8F7B560A20EB33CC Ai Sensei No Oshiete - Watashi No Hoshi (J) NES board=IREM-G101;PRG=256;CHR=128;WRAM=8
+sha1:B6F6BD9D78CDD264A117D4B647AEE3309993E9A9 Mike Tyson's Punch-Out!! (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0
+sha1:A0C4D4172A0037B7D9BA729A93E809978D0F10D2 Punch-Out!! (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0
;and these are even labeled as bad in goodNES
sha1:984ADAEB85403EEF1BA85CDCF310FAAECEB409A0 Adventures of Captain Comic, The (Bad Dump) (U) NES board=COLORDREAMS-74*377;PRG=64;CHR=64;WRAM=0;VRAM=0;bad
@@ -2288,6 +2290,8 @@ sha1:0AE47BD83202A5A2235B0BC16278F56D66038AB5 Deathbots (U) NES board=AVE-NINA
;these roms are in goodNES but theyre junk
sha1:4D6117577CE301BB987C5C32FEEF7B132A21B046 Afro Man (Mega Man 3 Hack) (UNL) NES board=TXROM-HOMEBREW;PRG=256;CHR=128;WRAM=8
+sha1:7BD102770FE7766BF8430ACDB3C17EE51E30478C Mike Tyson's Punch-Out!! (Hacked) (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0
+sha1:536D623BA02A622BDE8E2D7D514AE9785B5E0357 Punch Out!! Kirby (Hack) (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0
;other assorted roms
sha1:92D9695FEB774F60965A8303CFE3E6AAEE7B7B62 Magic Dragon (Unl) NES board=Mapper107;PRG=128;CHR=64;WRAM=8;PAD_H=1