public void WriteMemory8(ushort addr, byte val)
{
// Depends on where!
if (addr < 0x2000)
{
// Ram w/ mirroring
RAM[addr % 2048] = val;
} else if ((addr >= 0x2000) && (addr < 0x4020))
{
// Registers
if (addr < 0x4000)
addr = (ushort)(((addr - 0x2000) % 0x8) + 0x2000);
IORegisters.WriteMemory8(addr, val);
} else if (addr < 0x8000)
{
throw new NotImplementedException();
} else if (addr <= 0xFFFF)
{
int desiredBank = (addr < 0xC000) ? 1 : 0;
addr = (ushort)((addr < 0xC000) ? addr - 0x8000 : addr - 0xC000);
desiredBank = (Cartridge.PRGROMBanks.Length == 1) ? 0 : desiredBank;
Cartridge.PRGROMBanks[desiredBank][addr] = val;
} else
throw new ArgumentException();
}