nes-fix a little bug in MMC2 and support MMC4 while i am at it
This commit is contained in:
parent
d6d8a15084
commit
6a570c89fc
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
|
@ -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.");
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue