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