BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper103.cs

82 lines
1.7 KiB
C#

using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Nintendo.NES
{
// Doki Doki Panic (FDS port)
// "BTL 2708"
internal sealed class Mapper103 : NesBoardBase
{
int prg;
bool romenable;
public override bool Configure(EDetectionOrigin origin)
{
switch (Cart.BoardType)
{
case "MAPPER103": // ines identification
Cart.WramSize = 16;
Cart.VramSize = 8;
AssertPrg(128);
break;
case "BTL-2708": // ??
break;
default:
return false;
}
SetMirrorType(EMirrorType.Vertical);
return true;
}
public override void WriteWram(int addr, byte value)
{
// writes always go to wram, even if rom is mapped in for read
Wram[addr] = value;
}
public override byte ReadWram(int addr)
{
if (romenable)
return Rom[addr | prg << 13];
else
return Wram[addr];
}
public override byte ReadPrg(int addr)
{
if (!romenable && addr >= 0x3800 && addr < 0x5800)
return Wram[addr - 0x1800];
else
return Rom[addr | 0x18000];
}
public override void WritePrg(int addr, byte value)
{
if (addr >= 0x3800 && addr < 0x5800)
Wram[addr - 0x1800] = value;
else
{
switch (addr & 0x7000)
{
case 0x0000:
prg = value & 15;
break;
case 0x6000:
SetMirrorType((value & 8) != 0 ? EMirrorType.Horizontal : EMirrorType.Vertical);
break;
case 0x7000:
romenable = (value & 16) != 0;
break;
}
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync(nameof(romenable), ref romenable);
ser.Sync(nameof(prg), ref prg);
}
}
}