/** * Performs a CPU address space write. Maps all of the relevant object into the right parts of * memory. */ public final void addressWrite(int addr, int data) { switch (addr & 0xF000) { case 0x0000: case 0x1000: case 0x2000: case 0x3000: case 0x4000: case 0x5000: case 0x6000: case 0x7000: if (!running) { cartridge.debuggerAddressWrite(addr, data); } else { cartridge.addressWrite(addr, data); } break; case 0x8000: case 0x9000: graphicsChip.addressWrite(addr - 0x8000, (byte) data); break; case 0xA000: case 0xB000: cartridge.addressWrite(addr, data); break; case 0xC000: mainRam[addr - 0xC000] = (byte) data; break; case 0xD000: mainRam[addr - 0xD000 + (gbcRamBank * 0x1000)] = (byte) data; break; case 0xE000: mainRam[addr - 0xE000] = (byte) data; break; case 0xF000: if (addr < 0xFE00) { try { mainRam[addr - 0xE000] = (byte) data; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Address error: " + addr + " pc = " + JavaBoy.hexWord(pc)); } } else if (addr < 0xFF00) { oam[addr - 0xFE00] = (byte) data; } else { ioHandler.ioWrite(addr - 0xFF00, (short) data); } break; } }