using System.IO;

namespace MyNes.Core
{
    [BoardInfo("Unknown", 228)]
    [HassIssues]
    internal class Mapper228 : Board
    {
    	private byte[] RAM;

    	private int bank;

    	internal override string Issues => MNInterfaceLanguage.IssueMapper228;

    	internal override void HardReset()
    	{
    		base.HardReset();
    		RAM = new byte[4];
    	}

    	internal override void WriteEX(ref ushort address, ref byte data)
    	{
    		RAM[address & 3] = (byte)(data & 0xFu);
    	}

    	internal override void ReadEX(ref ushort address, out byte data)
    	{
    		data = RAM[address & 3];
    	}

    	internal override void WritePRG(ref ushort address, ref byte data)
    	{
    		Switch08KCHR(((address & 0xF) << 2) | (data & 3));
    		Switch01KNMTFromMirroring(((address & 0x2000) == 8192) ? Mirroring.Horz : Mirroring.Vert);
    		bank = ((address >> 7) & 0x1F) + ((address >> 7) & (address >> 8) & 0x10);
    		if ((address & 0x20) == 32)
    		{
    			Switch16KPRG((bank << 2) | ((address >> 5) & 2), PRGArea.Area8000);
    			Switch16KPRG((bank << 2) | ((address >> 5) & 2), PRGArea.AreaC000);
    		}
    		else
    		{
    			Switch32KPRG(bank, PRGArea.Area8000);
    		}
    	}

    	internal override void WriteStateData(ref BinaryWriter stream)
    	{
    		base.WriteStateData(ref stream);
    		stream.Write(RAM);
    		stream.Write(bank);
    	}

    	internal override void ReadStateData(ref BinaryReader stream)
    	{
    		base.ReadStateData(ref stream);
    		stream.Read(RAM, 0, RAM.Length);
    		bank = stream.ReadInt32();
    	}
    }
}