AxibugEmuOnline/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs
2024-07-03 18:22:22 +08:00

110 lines
2.8 KiB
C#

using System.IO;
namespace MyNes.Core
{
[BoardInfo("Irem G-101", 32)]
internal class Mapper032 : Board
{
private bool prg_mode;
private byte prg_reg0;
private bool enable_mirroring_switch;
internal override void HardReset()
{
base.HardReset();
enable_mirroring_switch = true;
if (SHA1 == "7E4180432726A433C46BA2206D9E13B32761C11E")
{
enable_mirroring_switch = false;
Switch01KNMTFromMirroring(Mirroring.OneScA);
}
Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000);
}
internal override void WritePRG(ref ushort address, ref byte data)
{
switch (address & 0xF007)
{
case 32768:
case 32769:
case 32770:
case 32771:
case 32772:
case 32773:
case 32774:
case 32775:
prg_reg0 = data;
Switch08KPRG((!prg_mode) ? prg_reg0 : 0, PRGArea.Area8000);
Switch08KPRG(prg_mode ? prg_reg0 : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000);
break;
case 36864:
case 36865:
case 36866:
case 36867:
case 36868:
case 36869:
case 36870:
case 36871:
prg_mode = (data & 2) == 2;
Switch08KPRG((!prg_mode) ? prg_reg0 : 0, PRGArea.Area8000);
Switch08KPRG(prg_mode ? prg_reg0 : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000);
if (enable_mirroring_switch)
{
Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert);
}
break;
case 40960:
case 40961:
case 40962:
case 40963:
case 40964:
case 40965:
case 40966:
case 40967:
Switch08KPRG(data, PRGArea.AreaA000);
break;
case 45056:
Switch01KCHR(data, CHRArea.Area0000);
break;
case 45057:
Switch01KCHR(data, CHRArea.Area0400);
break;
case 45058:
Switch01KCHR(data, CHRArea.Area0800);
break;
case 45059:
Switch01KCHR(data, CHRArea.Area0C00);
break;
case 45060:
Switch01KCHR(data, CHRArea.Area1000);
break;
case 45061:
Switch01KCHR(data, CHRArea.Area1400);
break;
case 45062:
Switch01KCHR(data, CHRArea.Area1800);
break;
case 45063:
Switch01KCHR(data, CHRArea.Area1C00);
break;
}
}
internal override void WriteStateData(ref BinaryWriter stream)
{
base.WriteStateData(ref stream);
stream.Write(prg_mode);
stream.Write(prg_reg0);
}
internal override void ReadStateData(ref BinaryReader stream)
{
base.ReadStateData(ref stream);
prg_mode = stream.ReadBoolean();
prg_reg0 = stream.ReadByte();
}
}
}