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

86 lines
1.8 KiB
C#

using System;
using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Nintendo.NES
{
public sealed class Mapper063 : NES.NESBoardBase
{
int prg0, prg1, prg2, prg3;
bool open_bus;
public override bool Configure(NES.EDetectionOrigin origin)
{
switch (Cart.board_type)
{
case "MAPPER063":
break;
default:
return false;
}
Cart.wram_size = 0;
// not sure on initial mirroring
SetMirrorType(EMirrorType.Vertical);
WritePRG(0, 0);
return true;
}
public override void WritePRG(int addr, byte value)
{
open_bus = ((addr & 0x0300) == 0x0300);
prg0 = (addr >> 1 & 0x1FC) | ((addr & 0x2) > 0 ? 0x0 : (addr >> 1 & 0x2) | 0x0);
prg1 = (addr >> 1 & 0x1FC) | ((addr & 0x2) > 0 ? 0x1 : (addr >> 1 & 0x2) | 0x1);
prg2 = (addr >> 1 & 0x1FC) | ((addr & 0x2) > 0 ? 0x2 : (addr >> 1 & 0x2) | 0x0);
prg3 = (addr & 0x800) > 0 ? ((addr & 0x07C) | ((addr & 0x06) > 0 ? 0x03 : 0x01)) : ((addr >> 1 & 0x01FC) | ((addr & 0x02) > 0 ? 0x03 : ((addr >> 1 & 0x02) | 0x01)));
SetMirrorType((addr & 0x01) > 0 ? EMirrorType.Horizontal : EMirrorType.Vertical);
}
public override byte ReadPRG(int addr)
{
if (addr < 0x2000)
{
if (open_bus)
{
return this.NES.DB;
}
else
{
return ROM[addr + prg0 * 0x2000];
}
}
else if (addr < 0x4000)
{
if (open_bus)
{
return this.NES.DB;
}
else
{
return ROM[(addr - 0x2000) + prg1 * 0x2000];
}
}
else if (addr < 0x6000)
{
return ROM[(addr - 0x4000) + prg2 * 0x2000];
}
else
{
return ROM[(addr - 0x6000) + prg3 * 0x2000];
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg0", ref prg0);
ser.Sync("prg1", ref prg1);
ser.Sync("prg2", ref prg2);
ser.Sync("prg3", ref prg3);
ser.Sync("open_bus", ref open_bus);
}
}
}