Start mapper 199, everything seems to be working except chr mapping

This commit is contained in:
adelikat 2016-09-18 13:32:58 -04:00
parent 2b1cd0bbe3
commit 7263041f3a
4 changed files with 110 additions and 3 deletions

View File

@ -149,6 +149,9 @@ sha1:F99E8B7C7A2174BF0B2330F5457AEE478A938C93 G Captain Tsubasa Vol. II - Super
sha1:9958BED493E8C5727F96937BF254AC33FA3BCF81 G Captain Tsubasa Vol. II - Super Striker (Ch) [a2] NES board=MAPPER195
sha1:B4AA3F10908DC3D6B8152F5DEB1B8543B8B46BF6 G Captain Tsubasa Vol. II - Super Striker (Ch) [a3] NES board=MAPPER195
sha1:60FC5FA5B5ACCAF3AEFEBA73FC8BFFD3C4DAE558 G Pegasus 5-in-1 (Golden Five) NES board=MAPPER104
sha1:6282051DA49C286863463AF105F851AACF896563 G San Guo Zhi 2 (Ch) NES board=MAPPER199
sha1:71234F9DCA4C31B4E9F0719425963878F3F045C9 G Dragon Ball Z II - Gekishin Freeza!! (Ch) NES board=MAPPER199
sha1:A907E600CEDA175ECD115B406B28155397A4C1FA G Dragon Ball Z Gaiden - Saiya Jin Zetsumetsu Keikaku (Ch) NES board=MAPPER199
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------

View File

@ -688,6 +688,7 @@
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper195.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper196.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper197.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper199.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper205.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper208.cs" />
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper219.cs" />

View File

@ -59,11 +59,25 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
prg_regs_8k.Dispose();
}
public NES.NESBoardBase.EMirrorType MirrorType { get { return mirror == 0 ? NES.NESBoardBase.EMirrorType.Vertical : NES.NESBoardBase.EMirrorType.Horizontal; } }
public NES.NESBoardBase.EMirrorType MirrorType
{
get
{
switch (mirror)
{
default:
case 0: return NES.NESBoardBase.EMirrorType.Vertical;
case 1: return NES.NESBoardBase.EMirrorType.Horizontal;
case 2: return NES.NESBoardBase.EMirrorType.OneScreenA;
case 3: return NES.NESBoardBase.EMirrorType.OneScreenB;
}
}
}
protected NES.NESBoardBase board;
public MMC3(NES.NESBoardBase board, int num_prg_banks)
{
MirrorMask = 1;
this.board = board;
if (board.Cart.chips.Contains("MMC3A")) MMC3Type = EMMC3Type.MMC3A;
else if (board.Cart.chips.Contains("MMC3B")) MMC3Type = EMMC3Type.MMC3BSharp;
@ -158,11 +172,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
board.SyncIRQ(irq_pending);
}
public byte cmd;
public int MirrorMask { get; set; }
public void WritePRG(int addr, byte value)
{
switch (addr & 0x6001)
{
case 0x0000: //$8000
cmd = value;
chr_mode = value.Bit(7);
prg_mode = value.Bit(6);
reg_addr = (value & 7);
@ -173,8 +192,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
Sync();
break;
case 0x2000: //$A000
//mirroring
mirror = (byte)(value & 1);
//mirroring
mirror = (byte)(value & MirrorMask);
board.SetMirrorType(MirrorType);
break;
case 0x2001: //$A001

View File

@ -0,0 +1,84 @@
using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Nintendo.NES
{
public sealed class Mapper199 : MMC3Board_Base
{
private ByteBuffer exRegs = new ByteBuffer(4);
public override bool Configure(NES.EDetectionOrigin origin)
{
switch (Cart.board_type)
{
case "MAPPER199":
break;
default:
return false;
}
exRegs[0] = (byte)(Cart.prg_size / 8 - 2);
exRegs[1] = (byte)(Cart.prg_size / 8 - 1);
exRegs[2] = 1;
exRegs[3] = 3;
BaseSetup();
mmc3.MirrorMask = 3;
return true;
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("exRegs", ref exRegs);
}
protected override int Get_CHRBank_1K(int addr)
{
if (addr < 0x400)
{
return mmc3.regs[0];
}
else if (addr < 0x800)
{
return exRegs[2];
}
else if (addr < 0xC00)
{
return mmc3.regs[1];
}
else if (addr < 0x1000)
{
return exRegs[3];
}
return base.Get_CHRBank_1K(addr);
}
protected override int Get_PRGBank_8K(int addr)
{
if (addr >= 0x4000 && addr < 0x6000)
{
return exRegs[0];
}
else if (addr >= 0x6000)
{
return exRegs[1];
}
return base.Get_PRGBank_8K(addr);
}
public override void WritePRG(int addr, byte value)
{
if (addr == 1)
{
if ((mmc3.cmd & 0x8) > 0)
{
exRegs[mmc3.cmd & 3] = value;
}
}
base.WritePRG(addr, value);
}
}
}