forked from sin365/AxibugEmuOnline
80 lines
1.7 KiB
C#
80 lines
1.7 KiB
C#
using System.IO;
|
|
|
|
namespace MyNes.Core
|
|
{
|
|
[BoardInfo("11-in-1", 51)]
|
|
internal class Mapper051 : Board
|
|
{
|
|
private int bank;
|
|
|
|
private int mode = 1;
|
|
|
|
private int offset;
|
|
|
|
internal override void HardReset()
|
|
{
|
|
base.HardReset();
|
|
bank = 0;
|
|
mode = 1;
|
|
offset = 0;
|
|
}
|
|
|
|
internal override void WritePRG(ref ushort address, ref byte data)
|
|
{
|
|
switch (address & 0xE000)
|
|
{
|
|
case 32768:
|
|
case 57344:
|
|
bank = data & 0xF;
|
|
UpdateBanks();
|
|
break;
|
|
case 49152:
|
|
bank = data & 0xF;
|
|
mode = ((data >> 3) & 2) | (mode & 1);
|
|
UpdateBanks();
|
|
break;
|
|
}
|
|
}
|
|
|
|
internal override void WriteSRM(ref ushort address, ref byte data)
|
|
{
|
|
mode = ((data >> 3) & 2) | ((data >> 1) & 1);
|
|
UpdateBanks();
|
|
}
|
|
|
|
private void UpdateBanks()
|
|
{
|
|
offset = 0;
|
|
if ((mode & 1) == 1)
|
|
{
|
|
Switch32KPRG(bank, PRGArea.Area8000);
|
|
offset = 35;
|
|
}
|
|
else
|
|
{
|
|
Switch08KPRG((bank << 1) | (mode >> 1), PRGArea.Area8000);
|
|
Switch08KPRG((bank << 1) | 7, PRGArea.Area8000);
|
|
offset = 47;
|
|
}
|
|
Switch08KPRG(offset | (bank << 2), PRGArea.Area6000);
|
|
Switch01KNMTFromMirroring((mode == 3) ? Mirroring.Horz : Mirroring.Vert);
|
|
}
|
|
|
|
internal override void WriteStateData(ref BinaryWriter stream)
|
|
{
|
|
base.WriteStateData(ref stream);
|
|
stream.Write(bank);
|
|
stream.Write(mode);
|
|
stream.Write(offset);
|
|
}
|
|
|
|
internal override void ReadStateData(ref BinaryReader stream)
|
|
{
|
|
base.ReadStateData(ref stream);
|
|
bank = stream.ReadInt32();
|
|
mode = stream.ReadInt32();
|
|
offset = stream.ReadInt32();
|
|
}
|
|
}
|
|
}
|