using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BizHawk.Emulation.Cores.Nintendo.NES
{
	public sealed class Farid_UNROM_8_in_1 : NES.NESBoardBase
	{
		// http://forums.nesdev.com/viewtopic.php?f=9&t=11099

		// state
		int c; // clock bit for the second 74'161
		int e; // /load for second 74'161. guaranteed to be 0 on powerup
		int prginner;
		int prgouter; // guaranteed to be 0 on powerup

		public override bool Configure(NES.EDetectionOrigin origin)
		{
			switch (Cart.board_type)
			{
				case "UNIF_FARID_UNROM_8-IN-1":
					AssertPrg(1024);
					AssertChr(0);
					break;
				default:
					return false;
			}

			Cart.vram_size = 8;
			SetMirrorType(Cart.pad_h, Cart.pad_v);
			return true;
		}

		public override void WritePRG(int addr, byte value)
		{
			prginner = value & 7;
			int newc = value >> 7;
			int newe = value >> 3 & 1;

			if (newc > c && e == 0) // latch e and outer
			{
				e = newe;
				prgouter = value >> 4 & 7;
			}
			c = newc;
		}

		public override byte ReadPRG(int addr)
		{
			int bnk = addr >= 0x4000 ? 7 : prginner;
			bnk |= prgouter << 3;
			return ROM[bnk << 14 | addr & 0x3fff];
		}

		public override void SyncState(BizHawk.Common.Serializer ser)
		{
			base.SyncState(ser);
			ser.Sync("c", ref c);
			ser.Sync("e", ref e);
			ser.Sync("prginner", ref prginner);
			ser.Sync("prgouter", ref prgouter);
		}

		public override void NESSoftReset()
		{
			e = 0;
			prgouter = 0;
		}
	}
}
