using System.IO;

namespace MyNes.Core
{
    [BoardInfo("Caltron 6-in-1", 41)]
    internal class Mapper041 : Board
    {
    	private bool enableReg;

    	private int vromReg;

    	internal override void HardReset()
    	{
    		base.HardReset();
    		vromReg = 0;
    		enableReg = true;
    	}

    	internal override void WriteSRM(ref ushort address, ref byte data)
    	{
    		if (address <= 26623)
    		{
    			Switch32KPRG(address & 7, PRGArea.Area8000);
    			enableReg = (address & 4) == 4;
    			vromReg = (vromReg & 3) | ((address >> 1) & 0xC);
    			Switch08KCHR(vromReg);
    			Switch01KNMTFromMirroring(((address & 0x20) == 32) ? Mirroring.Horz : Mirroring.Vert);
    		}
    		else
    		{
    			base.WriteSRM(ref address, ref data);
    		}
    	}

    	internal override void WritePRG(ref ushort address, ref byte data)
    	{
    		if (enableReg)
    		{
    			vromReg = (vromReg & 0xC) | (data & 3);
    			Switch08KCHR(vromReg);
    		}
    	}

    	internal override void WriteStateData(ref BinaryWriter stream)
    	{
    		base.WriteStateData(ref stream);
    		stream.Write(enableReg);
    		stream.Write(vromReg);
    	}

    	internal override void ReadStateData(ref BinaryReader stream)
    	{
    		base.ReadStateData(ref stream);
    		enableReg = stream.ReadBoolean();
    		vromReg = stream.ReadInt32();
    	}
    }
}