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();
	}
}