NESHawk - a bunch of stubs and incomplete board implementations
This commit is contained in:
parent
c6bcb82f7b
commit
2a64a17cf1
|
@ -153,6 +153,8 @@ sha1:6282051DA49C286863463AF105F851AACF896563 G San Guo Zhi 2 (Ch) NES board=MA
|
|||
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
|
||||
sha1:D565A9C2B117447C310E4F59E4AFC30DF299EA4F G Street Fighter IV (Unl) NES board=MAPPER208
|
||||
sha1:B9F444FF60F60C177EEEC8671BEC3731B0F6FE49 G Tang Mu Li Xian Ji (Ch) NES board=MAPPER223
|
||||
sha1:EBD2B4A4067FD4A8F0D0ABD34C8FF1AF520D1EED G Super Blaster VII Turbo 28 (Unl) NES board=MAPPER083;prg=512;chr=256;wram=0;
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;-----------------------------------------------------------------------
|
||||
|
||||
|
|
|
@ -561,6 +561,7 @@
|
|||
<Compile Include="Consoles\Nintendo\NES\Boards\BxROM.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Camerica.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\CamericaGoldenFive.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Cony.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\CoolBoy.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\DatachBarcode.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\Farid-UNROM-8-in-1.cs" />
|
||||
|
@ -692,7 +693,9 @@
|
|||
<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\Mapper215.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper217.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper219.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper223.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper238.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper245.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\MMC3_family\Mapper249.cs" />
|
||||
|
@ -755,6 +758,7 @@
|
|||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_BMC-GS-2013.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_BMC-T-262.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_BMC-WS.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_BMCFK23C.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_UNL-AX5705.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_UNL-CC-21.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_UNL-EDU2000.cs" />
|
||||
|
@ -762,6 +766,7 @@
|
|||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_UNL-SHERO.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_UNL-TF1201.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_UNL_DripGame.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UNIF\UNIF_BMC_Super24in1SC03.cs" />
|
||||
<Compile Include="Consoles\Nintendo\NES\Boards\UxROM.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
|
|
|
@ -0,0 +1,266 @@
|
|||
using System;
|
||||
using BizHawk.Common;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||
{
|
||||
// Mapper 83 seems to be a hacky mess that represents 3 different Cony cartridges
|
||||
// http://problemkaputt.de/everynes.htm#mapper83cony
|
||||
public class ConyA : NES.NESBoardBase
|
||||
{
|
||||
private ByteBuffer chr_regs = new ByteBuffer(8);
|
||||
private ByteBuffer prg_regs = new ByteBuffer(4);
|
||||
|
||||
private int prg_mask_8k;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER083":
|
||||
if (Cart.prg_size == 128)
|
||||
{
|
||||
prg_mask_8k = Cart.prg_size / 8 - 1;
|
||||
|
||||
prg_regs[0] = 0xC;
|
||||
prg_regs[1] = 0xB;
|
||||
prg_regs[2] = 0xE;
|
||||
prg_regs[3] = 0xF;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("chr_regs", ref chr_regs);
|
||||
ser.Sync("prg_regs", ref prg_regs);
|
||||
}
|
||||
|
||||
public override void WritePRG(int addr, byte value)
|
||||
{
|
||||
if (addr == 0x100)
|
||||
{
|
||||
// TODO: irq
|
||||
}
|
||||
|
||||
if (addr == 0x200)
|
||||
{
|
||||
// TODO: irq
|
||||
}
|
||||
|
||||
if (addr == 0x201)
|
||||
{
|
||||
// TODO: irq
|
||||
}
|
||||
|
||||
if (addr >= 0x300 && addr <= 0x302)
|
||||
{
|
||||
prg_regs[addr & 0x3] = value;
|
||||
}
|
||||
|
||||
if (addr >= 0x310 && addr < 0x318)
|
||||
{
|
||||
chr_regs[addr & 0x7] = value;
|
||||
}
|
||||
|
||||
/* TODO
|
||||
B000h Select 256K ROM/ VROM Windows(upper two address bits)
|
||||
Bit0 - 3 Unknown
|
||||
Bit4,6 Bit0 of 256K Block Number
|
||||
Bit5,7 Bit1 of 256K Block Number
|
||||
Used values are 00h,50h,A0h,F0h.Other values could probably select
|
||||
separate 256K banks for ROM / VROM.The ROM selection also affects
|
||||
|
||||
the "fixed" 16K at C000h - FFFFh(last bank in current 256K block).
|
||||
B0FFh Probably same as B000h
|
||||
B1FFh Probably same as B000h
|
||||
*/
|
||||
}
|
||||
|
||||
public override byte ReadPPU(int addr)
|
||||
{
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
int index = (addr >> 10) & 0x7;
|
||||
int bank = chr_regs[index];
|
||||
return VROM[(bank << 10) + (addr & 0x3FF)];
|
||||
}
|
||||
|
||||
return base.ReadPPU(addr);
|
||||
}
|
||||
|
||||
public override byte ReadPRG(int addr)
|
||||
{
|
||||
int index = (addr >> 13) & 0x3;
|
||||
int bank = prg_regs[index] & prg_mask_8k;
|
||||
return ROM[(bank << 13) + (addr & 0x1FFF)];
|
||||
}
|
||||
}
|
||||
|
||||
public class ConyB : NES.NESBoardBase
|
||||
{
|
||||
private ByteBuffer prg_regs = new ByteBuffer(2);
|
||||
private ByteBuffer chr_regs = new ByteBuffer(4);
|
||||
|
||||
private int prg_bank_mask_16k, chr_bank_mask_2k;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER083":
|
||||
if (Cart.prg_size == 256)
|
||||
{
|
||||
prg_bank_mask_16k = Cart.prg_size / 16 - 1;
|
||||
chr_bank_mask_2k = Cart.prg_size / 2 - 1;
|
||||
|
||||
prg_regs[1] = (byte)prg_bank_mask_16k;
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("prg_regs", ref prg_regs);
|
||||
ser.Sync("chr_regs", ref chr_regs);
|
||||
}
|
||||
|
||||
public override void WritePRG(int addr, byte value)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x0000:
|
||||
prg_regs[0] = (byte)(value & prg_bank_mask_16k);
|
||||
break;
|
||||
case 0x0310:
|
||||
chr_regs[0] = (byte)(value & chr_bank_mask_2k);
|
||||
break;
|
||||
case 0x0311:
|
||||
chr_regs[1] = (byte)(value & chr_bank_mask_2k);
|
||||
break;
|
||||
case 0x0316:
|
||||
chr_regs[2] = (byte)(value & chr_bank_mask_2k);
|
||||
break;
|
||||
case 0x0317:
|
||||
chr_regs[3] = (byte)(value & chr_bank_mask_2k);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override byte ReadPPU(int addr)
|
||||
{
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
int index = (addr >> 11) & 0x3;
|
||||
int bank = chr_regs[index];
|
||||
return VROM[(bank << 11) + (addr & 0x7FF)];
|
||||
}
|
||||
|
||||
return base.ReadPPU(addr);
|
||||
}
|
||||
|
||||
public override byte ReadPRG(int addr)
|
||||
{
|
||||
if (addr < 0x4000)
|
||||
{
|
||||
return ROM[(prg_regs[0] << 14) + (addr & 0x3FFF)];
|
||||
}
|
||||
|
||||
return ROM[(prg_regs[1] << 14) + (addr & 0x3FFF)];
|
||||
}
|
||||
}
|
||||
|
||||
public class ConyC : NES.NESBoardBase
|
||||
{
|
||||
private ByteBuffer prg_regs = new ByteBuffer(2);
|
||||
private ByteBuffer chr_regs = new ByteBuffer(8);
|
||||
|
||||
private int prg_bank_mask_16k;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER083":
|
||||
// We need one of the Cony boards to throw an error on an unexpected cart size, so we picked this one
|
||||
if (Cart.prg_size != 128 && Cart.prg_size != 256 && Cart.prg_size != 1024)
|
||||
{
|
||||
throw new InvalidOperationException("Unexpected prg size of " + Cart.prg_size + " for Mapper 83");
|
||||
}
|
||||
|
||||
if (Cart.prg_size == 1024)
|
||||
{
|
||||
prg_bank_mask_16k = Cart.prg_size / 16 - 1;
|
||||
|
||||
prg_regs[1] = (byte)prg_bank_mask_16k;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("chr_regs", ref chr_regs);
|
||||
ser.Sync("prg_regs", ref prg_regs);
|
||||
}
|
||||
|
||||
public override void WritePRG(int addr, byte value)
|
||||
{
|
||||
if (addr == 0)
|
||||
{
|
||||
prg_regs[0] = (byte)(value & prg_bank_mask_16k);
|
||||
}
|
||||
|
||||
else if (addr >= 0x310 && addr < 0x318)
|
||||
{
|
||||
chr_regs[addr & 0x7] = value;
|
||||
}
|
||||
|
||||
else if (addr == 0x200)
|
||||
{
|
||||
// TODO: irq
|
||||
}
|
||||
|
||||
else if (addr == 0x201)
|
||||
{
|
||||
// TODO: irq
|
||||
}
|
||||
}
|
||||
|
||||
public override byte ReadPPU(int addr)
|
||||
{
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
int index = (addr >> 10) & 0x7;
|
||||
int bank = chr_regs[index];
|
||||
return VROM[(bank << 10) + (addr & 0x3FF)];
|
||||
}
|
||||
|
||||
return base.ReadPPU(addr);
|
||||
}
|
||||
|
||||
public override byte ReadPRG(int addr)
|
||||
{
|
||||
if (addr < 0x4000)
|
||||
{
|
||||
return ROM[(prg_regs[0] << 14) + (addr & 0x3FFF)];
|
||||
}
|
||||
|
||||
return ROM[(prg_regs[1] << 14) + (addr & 0x3FFF)];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
using BizHawk.Common;
|
||||
using BizHawk.Common.NumberExtensions;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||
{
|
||||
// TODO
|
||||
public sealed class Mapper217 : MMC3Board_Base
|
||||
{
|
||||
private ByteBuffer exRegs = new ByteBuffer(4);
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER217":
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
BaseSetup();
|
||||
|
||||
exRegs[0] = 0x00;
|
||||
exRegs[1] = 0xFF;
|
||||
exRegs[2] = 0x03;
|
||||
exRegs[3] = 0x00;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("exRegs", ref exRegs);
|
||||
}
|
||||
|
||||
public override void WriteEXP(int addr, byte value)
|
||||
{
|
||||
if (addr == 0x1000)
|
||||
{
|
||||
exRegs[0] = value;
|
||||
// TODO: if value & 0x80, prg 16k mode
|
||||
}
|
||||
|
||||
else if (addr == 0x1001)
|
||||
{
|
||||
exRegs[1] = value;
|
||||
}
|
||||
|
||||
else if (addr == 0x1007)
|
||||
{
|
||||
exRegs[2] = value;
|
||||
}
|
||||
|
||||
base.WriteEXP(addr, value);
|
||||
}
|
||||
|
||||
protected override int Get_PRGBank_8K(int addr)
|
||||
{
|
||||
if (exRegs[1].Bit(3))
|
||||
{
|
||||
return base.Get_PRGBank_8K(addr) & 0x1F;
|
||||
}
|
||||
else
|
||||
{
|
||||
return base.Get_PRGBank_8K(addr) & 0x1F | (exRegs[1] & 0x10);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using BizHawk.Common;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||
{
|
||||
// TODO
|
||||
public sealed class Mapper223 : MMC3Board_Base
|
||||
{
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER223":
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
BaseSetup();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
using BizHawk.Common;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||
{
|
||||
public sealed class UNIF_BMC_FK23C : MMC3Board_Base
|
||||
{
|
||||
private ByteBuffer exRegs = new ByteBuffer(8);
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "UNIF_BMC-FK23C":
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
exRegs[4] = 0xFF;
|
||||
exRegs[5] = 0xFF;
|
||||
exRegs[6] = 0xFF;
|
||||
exRegs[7] = 0xFF;
|
||||
exRegs[8] = 0xFF;
|
||||
|
||||
BaseSetup();
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("exRegs", ref exRegs);
|
||||
}
|
||||
|
||||
public override void WriteEXP(int addr, byte value)
|
||||
{
|
||||
base.WriteEXP(addr, value);
|
||||
}
|
||||
|
||||
public override void WritePRG(int addr, byte value)
|
||||
{
|
||||
base.WritePRG(addr, value);
|
||||
}
|
||||
|
||||
protected override int Get_PRGBank_8K(int addr)
|
||||
{
|
||||
return base.Get_PRGBank_8K(addr);
|
||||
}
|
||||
|
||||
protected override int Get_CHRBank_1K(int addr)
|
||||
{
|
||||
return base.Get_CHRBank_1K(addr);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
using BizHawk.Common;
|
||||
using BizHawk.Common.NumberExtensions;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||
{
|
||||
public sealed class UNIF_BMC_Super24in1SC03 : MMC3Board_Base
|
||||
{
|
||||
private ByteBuffer exRegs = new ByteBuffer(3);
|
||||
private readonly int[] masko8 = { 63, 31, 15, 1, 3, 0, 0, 0 };
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "UNIF_BMC-Super24in1SC03":
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
BaseSetup();
|
||||
|
||||
exRegs[0] = 0x24;
|
||||
exRegs[1] = 159;
|
||||
exRegs[2] = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("exRegs", ref exRegs);
|
||||
}
|
||||
|
||||
public override void WriteEXP(int addr, byte value)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x1FF0:
|
||||
exRegs[0] = value; break;
|
||||
case 0x1FF1:
|
||||
exRegs[1] = value; break;
|
||||
case 0x1FF2:
|
||||
exRegs[2] = value; break;
|
||||
}
|
||||
|
||||
base.WriteEXP(addr, value);
|
||||
}
|
||||
|
||||
protected override int Get_CHRBank_1K(int addr)
|
||||
{
|
||||
if (!exRegs[0].Bit(5))
|
||||
{
|
||||
return base.Get_CHRBank_1K(addr) | (exRegs[1] << 3);
|
||||
}
|
||||
|
||||
return base.Get_CHRBank_1K(addr);
|
||||
}
|
||||
|
||||
protected override int Get_PRGBank_8K(int addr)
|
||||
{
|
||||
// TODO
|
||||
return base.Get_PRGBank_8K(addr);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue