auto CPU::io() -> void { cycleEdge(); step(4); } auto CPU::read(uint16 addr) -> uint8 { cycleEdge(); step(4); return bus.read(addr); } auto CPU::write(uint16 addr, uint8 data) -> void { cycleEdge(); step(4); bus.write(addr, data); } auto CPU::cycleEdge() -> void { if(r.ei) { r.ei = false; r.ime = 1; } } //VRAM DMA source can only be ROM or RAM auto CPU::readDMA(uint16 addr) -> uint8 { if(addr < 0x8000) return bus.read(addr); //0000-7fff if(addr < 0xa000) return 0xff; //8000-9fff if(addr < 0xe000) return bus.read(addr); //a000-dfff return 0xff; //e000-ffff } //VRAM DMA target is always VRAM auto CPU::writeDMA(uint16 addr, uint8 data) -> void { addr = 0x8000 | (addr & 0x1fff); //8000-9fff return bus.write(addr, data); } auto CPU::readDebugger(uint16 addr) -> uint8 { return bus.read(addr); }