//////////////////////////////////////////////////////////////////////////
// Mapper032  Irem G101                                                 //
//////////////////////////////////////////////////////////////////////////
using static VirtualNes.MMU;
using static VirtualNes.Core.CPU;
using INT = System.Int32;
using BYTE = System.Byte;
//using Codice.CM.Client.Differences;

namespace VirtualNes.Core
{
	public class Mapper032 : Mapper
	{
		BYTE patch;

		BYTE reg;
		public Mapper032(NES parent) : base(parent)
		{
		}


		public override void Reset()
		{
			patch = 0;
			reg = 0;

			SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);

			if (VROM_8K_SIZE != 0)
			{
				SetVROM_8K_Bank(0);
			}

			uint crc = nes.rom.GetPROM_CRC();

			// For Major League(J)
			if (crc == 0xc0fed437)
			{
				patch = 1;
			}
			// For Ai Sensei no Oshiete - Watashi no Hoshi(J)
			if (crc == 0xfd3fc292)
			{
				SetPROM_32K_Bank(30, 31, 30, 31);
			}
		}

		//void Mapper032::Write(WORD addr, BYTE data)
		public override void Write(ushort addr, byte data)
		{
			switch (addr & 0xF000)
			{
				case 0x8000:
					if ((reg & 0x02) != 0)
					{
						SetPROM_8K_Bank(6, data);
					}
					else
					{
						SetPROM_8K_Bank(4, data);
					}
					break;

				case 0x9000:
					reg = data;
					if ((data & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
					else SetVRAM_Mirror(VRAM_VMIRROR);
					break;

				case 0xA000:
					SetPROM_8K_Bank(5, data);
					break;
			}

			switch (addr & 0xF007)
			{
				case 0xB000:
				case 0xB001:
				case 0xB002:
				case 0xB003:
				case 0xB004:
				case 0xB005:
					SetVROM_1K_Bank((byte)(addr & 0x0007), data);
					break;
				case 0xB006:
					SetVROM_1K_Bank(6, data);

					if (patch != 0 && ((data & 0x40) != 0))
					{
						SetVRAM_Mirror(0, 0, 0, 1);
					}
					break;
				case 0xB007:
					SetVROM_1K_Bank(7, data);

					if (patch != 0 && ((data & 0x40) != 0))
					{
						SetVRAM_Mirror(0, 0, 0, 0);
					}
					break;
			}
		}

		//void Mapper032::SaveState(LPBYTE p)
		public override void SaveState(byte[] p)
		{
			p[0] = reg;
		}

		//void Mapper032::LoadState(LPBYTE p)
		public override void LoadState(byte[] p)
		{
			reg = p[0];
		}


		public override bool IsStateSave()
		{
			return true;
		}

	}
}