diff --git a/src/mmu.rs b/src/mmu.rs index 2847a46fb298b9ac1d9c98938ccfd713e9146e41..4ffaef9ba1c2343c240f52b2042b371f990d4d3a 100644 --- a/src/mmu.rs +++ b/src/mmu.rs @@ -118,14 +118,21 @@ impl Mmu { | 0xa00 | 0xb00 | 0xc00 | 0xd00 => self.ram[(addr & 0x1fff) as usize], 0xe00 => self.ppu.oam[(addr & 0x009f) as usize], 0xf00 => match addr & 0x00ff { + // 0xFF0F — IF: Interrupt flag 0x0f => { (if self.ppu.int_vblank() { 0x01 } else { 0x00 } | if self.ppu.int_stat() { 0x02 } else { 0x00 } | if self.timer.int_tima() { 0x04 } else { 0x00 } | if self.pad.int_pad() { 0x10 } else { 0x00 }) } + + // 0xFF80-0xFFFE - High RAM (HRAM) 0x80..=0xfe => self.ppu.hram[(addr & 0x007f) as usize], + + // 0xFFFF — IE: Interrupt enable 0xff => self.ie, + + // Other registers _ => match addr & 0x00f0 { 0x00 => match addr & 0x00ff { 0x00 => self.pad.read(addr), @@ -188,14 +195,21 @@ impl Mmu { self.ppu.update_object(addr, value); } 0xf00 => match addr & 0x00ff { + // 0xFF0F — IF: Interrupt flag 0x0f => { self.ppu.set_int_vblank(value & 0x01 == 0x01); self.ppu.set_int_stat(value & 0x02 == 0x02); self.timer.set_int_tima(value & 0x04 == 0x04); self.pad.set_int_pad(value & 0x10 == 0x10); } + + // 0xFF80-0xFFFE - High RAM (HRAM) 0x80..=0xfe => self.ppu.hram[(addr & 0x007f) as usize] = value, + + // 0xFFFF — IE: Interrupt enable 0xff => self.ie = value, + + // Other registers _ => { match addr & 0x00f0 { 0x00 => match addr & 0x00ff { @@ -205,6 +219,7 @@ impl Mmu { }, 0x40 | 0x60 | 0x70 => { match addr & 0x00ff { + // 0xFF46 — DMA: OAM DMA source address & start 0x0046 => { // @todo must increment the cycle count by 160 // and make this a separated dma.rs file @@ -212,11 +227,18 @@ impl Mmu { let data = self.read_many((value as u16) << 8, 160); self.write_many(0xfe00, &data); } + + // VRAM related write _ => self.ppu.write(addr, value), } } 0x50 => match addr & 0x00ff { + // 0xFF50 - Boot active flag 0x50 => self.boot_active = false, + + // 0xFF51-0xFF52 - VRAM DMA source (CGB only) + 0x51..=0x52 => (), + _ => debugln!("Writing to unknown IO control 0x{:04x}", addr), }, _ => debugln!("Writing to unknown IO control 0x{:04x}", addr),