namespace MyNes.Core
{
    [BoardInfo("Unknown", 230)]
    [HassIssues]
    internal class Mapper230 : Board
    {
    	private bool contraMode;

    	internal override string Issues => MNInterfaceLanguage.IssueMapper230;

    	internal override void HardReset()
    	{
    		base.HardReset();
    		contraMode = true;
    		Switch16KPRG(0, PRGArea.Area8000);
    		Switch16KPRG(7, PRGArea.AreaC000);
    	}

    	internal override void SoftReset()
    	{
    		base.SoftReset();
    		contraMode = !contraMode;
    		if (contraMode)
    		{
    			Switch16KPRG(0, PRGArea.Area8000);
    			Switch16KPRG(7, PRGArea.AreaC000);
    			Switch01KNMTFromMirroring(Mirroring.Vert);
    		}
    		else
    		{
    			Switch08KCHR(0);
    			Switch16KPRG(8, PRGArea.Area8000);
    			Switch16KPRG(39, PRGArea.AreaC000);
    		}
    	}

    	internal override void WritePRG(ref ushort address, ref byte data)
    	{
    		if (contraMode)
    		{
    			Switch16KPRG(data & 7, PRGArea.Area8000);
    			Switch16KPRG(7, PRGArea.AreaC000);
    			Switch01KNMTFromMirroring(Mirroring.Vert);
    			return;
    		}
    		Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Vert : Mirroring.Horz);
    		if ((data & 0x20) == 32)
    		{
    			Switch16KPRG((data & 0x1F) + 8, PRGArea.Area8000);
    			Switch16KPRG((data & 0x1F) + 8, PRGArea.AreaC000);
    		}
    		else
    		{
    			Switch32KPRG(((data & 0x1F) >> 1) + 4, PRGArea.Area8000);
    		}
    	}
    }
}