using System.IO;

namespace MyNes.Core;

[BoardInfo("Mario Baby", 42)]
internal class Mapper042 : Board
{
	private int SRAM_PRG_Page;

	private bool irqEnable;

	private int irqCounter;

	internal override void HardReset()
	{
		base.HardReset();
		Switch32KPRG(PRG_ROM_32KB_Mask, PRGArea.Area8000);
	}

	internal override void WritePRG(ref ushort address, ref byte data)
	{
		if (address == 32768)
		{
			Switch08KCHR(data);
			return;
		}
		if (address == 61440)
		{
			SRAM_PRG_Page = data << 13;
			return;
		}
		switch (address & 0xE003)
		{
		case 57344:
			Switch08KPRG(data, PRGArea.Area6000);
			break;
		case 57345:
			if ((data & 8) == 8)
			{
				Switch01KNMTFromMirroring(Mirroring.Horz);
			}
			else
			{
				Switch01KNMTFromMirroring(Mirroring.Vert);
			}
			break;
		case 57346:
			irqEnable = (data & 2) == 2;
			if (!irqEnable)
			{
				irqCounter = 0;
			}
			NesEmu.IRQFlags &= -9;
			break;
		}
	}

	internal override void OnCPUClock()
	{
		if (!irqEnable)
		{
			return;
		}
		int num = irqCounter++;
		if ((irqCounter & 0x6000) != (num & 0x6000))
		{
			if ((irqCounter & 0x6000) == 24576)
			{
				NesEmu.IRQFlags |= 8;
			}
			else
			{
				NesEmu.IRQFlags &= -9;
			}
		}
	}

	internal override void WriteStateData(ref BinaryWriter stream)
	{
		base.WriteStateData(ref stream);
		stream.Write(SRAM_PRG_Page);
		stream.Write(irqEnable);
		stream.Write(irqCounter);
	}

	internal override void ReadStateData(ref BinaryReader stream)
	{
		base.ReadStateData(ref stream);
		SRAM_PRG_Page = stream.ReadInt32();
		irqEnable = stream.ReadBoolean();
		irqCounter = stream.ReadInt32();
	}
}