forked from sin365/AxibugEmuOnline
59 lines
1.6 KiB
C#
59 lines
1.6 KiB
C#
using System.IO;
|
|
|
|
namespace MyNes.Core
|
|
{
|
|
[BoardInfo("Unknown", 53)]
|
|
[HassIssues]
|
|
internal class Mapper053 : Board
|
|
{
|
|
private byte[] regs = new byte[2];
|
|
|
|
private bool epromFirst;
|
|
|
|
internal override string Issues => MNInterfaceLanguage.IssueMapper53;
|
|
|
|
internal override void HardReset()
|
|
{
|
|
base.HardReset();
|
|
regs = new byte[2];
|
|
epromFirst = true;
|
|
Switch08KPRG(0, PRGArea.Area6000);
|
|
}
|
|
|
|
internal override void WritePRG(ref ushort address, ref byte data)
|
|
{
|
|
regs[1] = data;
|
|
UpdatePrg();
|
|
}
|
|
|
|
internal override void WriteSRM(ref ushort address, ref byte data)
|
|
{
|
|
regs[0] = data;
|
|
UpdatePrg();
|
|
Switch01KNMTFromMirroring(((data & 0x20) == 32) ? Mirroring.Horz : Mirroring.Vert);
|
|
}
|
|
|
|
private void UpdatePrg()
|
|
{
|
|
int num = (regs[0] << 3) & 0x78;
|
|
Switch08KPRG(((num << 1) | 0xF) + (epromFirst ? 4 : 0), PRGArea.Area6000);
|
|
Switch16KPRG(((regs[0] & 0x10) == 16) ? ((num | (regs[1] & 7)) + (epromFirst ? 2 : 0)) : ((!epromFirst) ? 128 : 0), PRGArea.Area8000);
|
|
Switch16KPRG(((regs[0] & 0x10) == 16) ? ((num | 7) + (epromFirst ? 2 : 0)) : (epromFirst ? 1 : 129), PRGArea.AreaC000);
|
|
}
|
|
|
|
internal override void WriteStateData(ref BinaryWriter stream)
|
|
{
|
|
base.WriteStateData(ref stream);
|
|
stream.Write(regs);
|
|
stream.Write(epromFirst);
|
|
}
|
|
|
|
internal override void ReadStateData(ref BinaryReader stream)
|
|
{
|
|
base.ReadStateData(ref stream);
|
|
stream.Read(regs, 0, 2);
|
|
epromFirst = stream.ReadBoolean();
|
|
}
|
|
}
|
|
}
|