using System.IO;

namespace MyNes.Core
{
    [BoardInfo("Sachen Poker", 243)]
    [HassIssues]
    internal class Mapper243 : Board
    {
    	private int addr;

    	private int chr_reg;

    	internal override string Issues => MNInterfaceLanguage.IssueMapper243;

    	internal override void HardReset()
    	{
    		base.HardReset();
    		addr = (chr_reg = 0);
    	}

    	internal override void WriteEX(ref ushort address, ref byte data)
    	{
    		if (address >= 20480 || address < 16416)
    		{
    			return;
    		}
    		switch (address & 0x4101)
    		{
    		case 16640:
    			addr = data & 7;
    			break;
    		case 16641:
    			switch (addr)
    			{
    			case 2:
    				chr_reg = ((data << 3) & 8) | (chr_reg & 7);
    				Switch08KCHR(chr_reg);
    				break;
    			case 4:
    				chr_reg = (data & 1) | (chr_reg & 0xE);
    				Switch08KCHR(chr_reg);
    				break;
    			case 5:
    				Switch32KPRG(data & 7, PRGArea.Area8000);
    				break;
    			case 6:
    				chr_reg = ((data & 3) << 1) | (chr_reg & 9);
    				Switch08KCHR(chr_reg);
    				break;
    			case 7:
    				switch ((data >> 1) & 3)
    				{
    				case 0:
    					Switch01KNMTFromMirroring(Mirroring.Horz);
    					break;
    				case 1:
    					Switch01KNMTFromMirroring(Mirroring.Vert);
    					break;
    				case 2:
    					Switch01KNMT(14);
    					break;
    				case 3:
    					Switch01KNMTFromMirroring(Mirroring.OneScB);
    					break;
    				}
    				break;
    			case 3:
    				break;
    			}
    			break;
    		}
    	}

    	internal override void WriteStateData(ref BinaryWriter stream)
    	{
    		base.WriteStateData(ref stream);
    		stream.Write(addr);
    		stream.Write(chr_reg);
    	}

    	internal override void ReadStateData(ref BinaryReader stream)
    	{
    		base.ReadStateData(ref stream);
    		addr = stream.ReadInt32();
    		chr_reg = stream.ReadInt32();
    	}
    }
}