nes-fix a little bug in MMC2 and support MMC4 while i am at it

This commit is contained in:
zeromus 2011-09-21 05:47:41 +00:00
parent d6d8a15084
commit 6a570c89fc
8 changed files with 60 additions and 23 deletions

View File

@ -117,7 +117,7 @@
<Compile Include="Consoles\Nintendo\NES\Boards\NROM.cs"> <Compile Include="Consoles\Nintendo\NES\Boards\NROM.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Consoles\Nintendo\NES\Boards\PxROM.cs" /> <Compile Include="Consoles\Nintendo\NES\Boards\PxROM_FxROM.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Sunsoft1.cs" /> <Compile Include="Consoles\Nintendo\NES\Boards\Sunsoft1.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\Sunsoft4.cs" /> <Compile Include="Consoles\Nintendo\NES\Boards\Sunsoft4.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\SxROM.cs"> <Compile Include="Consoles\Nintendo\NES\Boards\SxROM.cs">
@ -312,6 +312,7 @@
<Install>true</Install> <Install>true</Install>
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -22,7 +22,7 @@ Open bus and bus conflict emulation is not considered complete or thorough in an
005 ExRom=MMC5 Minimal 005 ExRom=MMC5 Minimal
007 AxROM Good 007 AxROM Good
009 PxROM=MMC2 Complete 009 PxROM=MMC2 Complete
010 MMC4 Needed (easy once 009 is done) 010 MMC4 Complete
011 Misc Complete 011 Misc Complete
013 CPROM Complete 013 CPROM Complete
015 Multicart Junk 015 Multicart Junk

View File

@ -4,13 +4,16 @@ using System.Diagnostics;
namespace BizHawk.Emulation.Consoles.Nintendo namespace BizHawk.Emulation.Consoles.Nintendo
{ {
//AKA MMC2 AKA Mike Tyson's Punch-Out!! //AKA MMC2 Mike Tyson's Punch-Out!!
class PxROM : NES.NESBoardBase //AKA MMC4 (similar enough to combine in one fle)
class PxROM_FxROM : NES.NESBoardBase
{ {
//configuration //configuration
int prg_bank_mask_8k, chr_bank_mask_4k; int prg_bank_mask_8k, chr_bank_mask_4k;
bool mmc4;
//state //state
byte prg_reg;
IntBuffer prg_banks_8k = new IntBuffer(4); IntBuffer prg_banks_8k = new IntBuffer(4);
IntBuffer chr_banks_4k = new IntBuffer(4); IntBuffer chr_banks_4k = new IntBuffer(4);
IntBuffer chr_latches = new IntBuffer(2); IntBuffer chr_latches = new IntBuffer(2);
@ -18,9 +21,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(ser); base.SyncState(ser);
ser.Sync("prg_banks_8k", ref prg_banks_8k); ser.Sync("prg_reg", ref prg_reg);
ser.Sync("chr_banks_4k", ref chr_banks_4k); ser.Sync("chr_banks_4k", ref chr_banks_4k);
ser.Sync("chr_latches", ref chr_latches); ser.Sync("chr_latches", ref chr_latches);
if (ser.IsReader)
SyncPRG();
} }
public override void Dispose() public override void Dispose()
@ -39,29 +45,54 @@ namespace BizHawk.Emulation.Consoles.Nintendo
case "HVC-PEEOROM": case "HVC-PEEOROM":
AssertPrg(128); AssertChr(128); AssertWram(0); AssertVram(0); AssertPrg(128); AssertChr(128); AssertWram(0); AssertVram(0);
break; break;
case "HVC-FKROM": //fire emblem
mmc4 = true;
AssertPrg(256); AssertChr(128); AssertWram(8); AssertVram(0);
break;
case "HVC-FJROM": //famicom wars
mmc4 = true;
AssertPrg(128); AssertChr(64); AssertWram(8); AssertVram(0);
break;
default: default:
return false; return false;
} }
prg_bank_mask_8k = Cart.prg_size / 8 - 1; prg_bank_mask_8k = Cart.prg_size / 8 - 1;
chr_bank_mask_4k = Cart.chr_size / 4 - 1; chr_bank_mask_4k = Cart.chr_size / 4 - 1;
prg_banks_8k[0] = 0; SyncPRG();
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; return true;
} }
void SyncPRG()
{
if (mmc4)
{
prg_banks_8k[0] = (prg_reg * 2) & prg_bank_mask_8k;
prg_banks_8k[1] = (prg_reg * 2 + 1) & prg_bank_mask_8k;
prg_banks_8k[2] = 0xFE & prg_bank_mask_8k;
prg_banks_8k[3] = 0xFF & prg_bank_mask_8k;
}
else
{
prg_banks_8k[0] = prg_reg & prg_bank_mask_8k;
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;
}
}
public override void WritePRG(int addr, byte value) public override void WritePRG(int addr, byte value)
{ {
switch (addr & 0xF000) switch (addr & 0xF000)
{ {
case 0x2000: //$A000: PRG Reg case 0x2000: //$A000: PRG Reg
prg_banks_8k[0] = value & prg_bank_mask_8k; prg_reg = value;
SyncPRG();
break; break;
case 0x3000: //$B000: CHR Reg 0A case 0x3000: //$B000: CHR Reg 0A
chr_banks_4k[0] = value & chr_bank_mask_4k; chr_banks_4k[0] = value & chr_bank_mask_4k;
@ -87,15 +118,19 @@ namespace BizHawk.Emulation.Consoles.Nintendo
int tile = (addr>>4)&0xFF; int tile = (addr>>4)&0xFF;
if (addr < 0x2000) 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 reg = side * 2 + chr_latches[side];
int ofs = addr & ((1 << 12) - 1); int ofs = addr & ((1 << 12) - 1);
int bank_4k = chr_banks_4k[reg]; int bank_4k = chr_banks_4k[reg];
addr = (bank_4k << 12) | ofs; addr = (bank_4k << 12) | ofs;
//if we're grabbing the second byte of the tile, then apply the tile switching logic
//(the next tile will be rendered with the fiddled register settings)
if ((addr & 0xF) >= 0x8)
switch (tile)
{
case 0xFD: chr_latches[side] = 0; break;
case 0xFE: chr_latches[side] = 1; break;
}
return VROM[addr]; return VROM[addr];
} }
else return base.ReadPPU(addr); else return base.ReadPPU(addr);

View File

@ -29,8 +29,8 @@ namespace BizHawk
public static GameInfo CheckDatabase(string hash) public static GameInfo CheckDatabase(string hash)
{ {
CompactGameInfo cgi; CompactGameInfo cgi;
hash = RemoveHashType(hash); string hash_notype = RemoveHashType(hash);
db.TryGetValue(hash, out cgi); db.TryGetValue(hash_notype, out cgi);
if (cgi == null) if (cgi == null)
{ {
Console.WriteLine("Game with hash " + hash + " was not in game database."); Console.WriteLine("Game with hash " + hash + " was not in game database.");

View File

@ -82,11 +82,11 @@
// //
this.label3.AutoSize = true; this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.Location = new System.Drawing.Point(216, 449); this.label3.Location = new System.Drawing.Point(225, 449);
this.label3.Name = "label3"; this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(291, 39); this.label3.Size = new System.Drawing.Size(311, 39);
this.label3.TabIndex = 3; this.label3.TabIndex = 3;
this.label3.Text = "COPYRITE 2001"; this.label3.Text = "COPYRITE 20011";
// //
// label4 // label4
// //

View File

@ -2100,8 +2100,8 @@
<data name="pictureBox3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="pictureBox3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALAgAA YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA
CwIBm8luNgAABQ5JREFUeF7tnbFyFDEMhpcur0FBR5FXgBI6OmjzDjSU3AvwEClT5jVSpqRNR8tRmWOY CvsBy58dkAAABQ5JREFUeF7tnbFyFDEMhpcur0FBR5FXgBI6OmjzDjSU3AvwEClT5jVSpqRNR8tRmWOY
YWw5WOes7Ei7X2ZcZPZWln99t5K93r1l4Q8FUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAF YWw5WOes7Ei7X2ZcZPZWln99t5K93r1l4Q8FUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAF
UAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAF5iiQTt1Ytjle04uZApbB/2OLv2AKAECwgFm7CwDWijq3Vwb8 UAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAF5iiQTt1Ytjle04uZApbB/2OLv2AKAECwgFm7CwDWijq3Vwb8
9j4trXa4TkujvXlIKW/G9cRjcDqX1797AOA/RkM9BICh8vo3DgD+YzTUw2bRd7xfUqs93Cwpb7I+kDXB 9j4trXa4TkujvXlIKW/G9cRjcDqX1797AOA/RkM9BICh8vo3DgD+YzTUw2bRd7xfUqs93Cwpb7I+kDXB

View File

@ -965,7 +965,7 @@ namespace BizHawk.MultiClient
} }
else if (file.Extension.ToLower() == ".cue") else if (file.Extension.ToLower() == ".cue")
{ {
Disc disc = Disc.FromCuePath(path); Disc disc = Disc.FromCuePath(path, Progression.Progress.BeginTaskNull());
var hash = disc.GetHash(); var hash = disc.GetHash();
game = Database.CheckDatabase(hash); game = Database.CheckDatabase(hash);
if (game == null) if (game == null)

View File

@ -58,6 +58,7 @@ sha1:91CECCFCAC90E417E9AEE80E8F7B560A20EB33CC Ai Sensei No Oshiete - Watashi No
sha1:B6F6BD9D78CDD264A117D4B647AEE3309993E9A9 Mike Tyson's Punch-Out!! (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0 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 sha1:A0C4D4172A0037B7D9BA729A93E809978D0F10D2 Punch-Out!! (U) NES board=NES-PNROM;PRG=128;CHR=128;WRAM=0
sha1:D7E199373162966F3971D4C02EF2A03A13FE82D3 Tetris (U) NES board=SxROM-JUNK;PRG=32;CHR=128;WRAM=0;VRAM=0 sha1:D7E199373162966F3971D4C02EF2A03A13FE82D3 Tetris (U) NES board=SxROM-JUNK;PRG=32;CHR=128;WRAM=0;VRAM=0
sha1:3F406EA2E41B5E725BB8DF31481D23F3CF6F1DBE Famicom Wars (J) NES board=HVC-FJROM;PRG=128;CHR=64;WRAM=8;VRAM=0
;and these are even labeled as bad in goodNES ;and these are even labeled as bad in goodNES
sha1:984ADAEB85403EEF1BA85CDCF310FAAECEB409A0 B Adventures of Captain Comic, The (Bad Dump) (U) NES board=COLORDREAMS-74*377;PRG=64;CHR=64;WRAM=0;VRAM=0 sha1:984ADAEB85403EEF1BA85CDCF310FAAECEB409A0 B Adventures of Captain Comic, The (Bad Dump) (U) NES board=COLORDREAMS-74*377;PRG=64;CHR=64;WRAM=0;VRAM=0