Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/GameGenie.cs
2 views
using BizHawk.Common.NumberExtensions;

namespace BizHawk.Emulation.Cores.Nintendo.NES
{
	// this is an internal testing thing, not really for using

	public class GameGenie : NES.NESBoardBase
	{
		static byte[] PatternTables = new byte[256];

		static GameGenie()
		{
			for (int addr = 0; addr < 256; addr++)
			{
				byte d = 0;
				if (addr.Bit(2))
				{
					if (addr.Bit(4)) d |= 16;
					if (addr.Bit(5)) d |= 1;
				}
				else
				{
					if (addr.Bit(6)) d |= 16;
					if (addr.Bit(7)) d |= 1;
				}
				d |= (byte)(d << 1);
				d |= (byte)(d << 2);
				PatternTables[addr] = d;
			}
		}

		public override bool Configure(NES.EDetectionOrigin origin)
		{
			switch (Cart.board_type)
			{
				case "CAMERICA-GAMEGENIE":
					break;
				case "UNIF_CAMERICA-GAMEGENIE":
					break;
				default:
					return false;
			}
			AssertChr(0); AssertPrg(4);
			Cart.wram_size = 0;
			Cart.vram_size = 0;

			SetMirroring(0, 0, 0, 0);

			return true;
		}

		public override byte ReadPRG(int addr)
		{
			if (addr < 0x4000)
				return NES.DB;
			else
				return ROM[addr & 0xfff];
		}

		public override byte ReadPPU(int addr)
		{
			if (addr >= 0x2000)
				return base.ReadPPU(addr);
			else
				return PatternTables[addr & 0xff];
		}

		public override void WritePRG(int addr, byte value)
		{
			NES.LogLine("{0:x4}<={1:x2}", addr + 0x8000, value);
		}
	}
}