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">
<SubType>Code</SubType>
</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\Sunsoft4.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\SxROM.cs">
@ -312,6 +312,7 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- 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.

View File

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

View File

@ -4,13 +4,16 @@ using System.Diagnostics;
namespace BizHawk.Emulation.Consoles.Nintendo
{
//AKA MMC2 AKA Mike Tyson's Punch-Out!!
class PxROM : NES.NESBoardBase
//AKA MMC2 Mike Tyson's Punch-Out!!
//AKA MMC4 (similar enough to combine in one fle)
class PxROM_FxROM : NES.NESBoardBase
{
//configuration
int prg_bank_mask_8k, chr_bank_mask_4k;
bool mmc4;
//state
byte prg_reg;
IntBuffer prg_banks_8k = new IntBuffer(4);
IntBuffer chr_banks_4k = new IntBuffer(4);
IntBuffer chr_latches = new IntBuffer(2);
@ -18,9 +21,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public override void SyncState(Serializer 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_latches", ref chr_latches);
if (ser.IsReader)
SyncPRG();
}
public override void Dispose()
@ -39,29 +45,54 @@ namespace BizHawk.Emulation.Consoles.Nintendo
case "HVC-PEEOROM":
AssertPrg(128); AssertChr(128); AssertWram(0); AssertVram(0);
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:
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; ;
SyncPRG();
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)
{
switch (addr & 0xF000)
{
case 0x2000: //$A000: PRG Reg
prg_banks_8k[0] = value & prg_bank_mask_8k;
prg_reg = value;
SyncPRG();
break;
case 0x3000: //$B000: CHR Reg 0A
chr_banks_4k[0] = value & chr_bank_mask_4k;
@ -87,15 +118,19 @@ namespace BizHawk.Emulation.Consoles.Nintendo
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;
//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];
}
else return base.ReadPPU(addr);

View File

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

View File

@ -82,11 +82,11 @@
//
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.Location = new System.Drawing.Point(216, 449);
this.label3.Location = new System.Drawing.Point(225, 449);
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.Text = "COPYRITE 2001";
this.label3.Text = "COPYRITE 20011";
//
// 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">
<value>
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALAgAA
CwIBm8luNgAABQ5JREFUeF7tnbFyFDEMhpcur0FBR5FXgBI6OmjzDjSU3AvwEClT5jVSpqRNR8tRmWOY
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA
CvsBy58dkAAABQ5JREFUeF7tnbFyFDEMhpcur0FBR5FXgBI6OmjzDjSU3AvwEClT5jVSpqRNR8tRmWOY
YWw5WOes7Ei7X2ZcZPZWln99t5K93r1l4Q8FUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAF
UAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAF5iiQTt1Ytjle04uZApbB/2OLv2AKAECwgFm7CwDWijq3Vwb8
9j4trXa4TkujvXlIKW/G9cRjcDqX1797AOA/RkM9BICh8vo3DgD+YzTUw2bRd7xfUqs93Cwpb7I+kDXB

View File

@ -965,7 +965,7 @@ namespace BizHawk.MultiClient
}
else if (file.Extension.ToLower() == ".cue")
{
Disc disc = Disc.FromCuePath(path);
Disc disc = Disc.FromCuePath(path, Progression.Progress.BeginTaskNull());
var hash = disc.GetHash();
game = Database.CheckDatabase(hash);
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: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: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
sha1:984ADAEB85403EEF1BA85CDCF310FAAECEB409A0 B Adventures of Captain Comic, The (Bad Dump) (U) NES board=COLORDREAMS-74*377;PRG=64;CHR=64;WRAM=0;VRAM=0