diff --git a/src/nes/cartridge.rs b/src/nes/cartridge.rs index ff19382..a14eeac 100644 --- a/src/nes/cartridge.rs +++ b/src/nes/cartridge.rs @@ -112,21 +112,26 @@ impl Cartridge { pub fn writeb(&mut self, addr: Addr, data: Byte) -> bool { if let Some(mapped_addr) = self.mapper.map_write_addr(addr) { self.prg_rom[mapped_addr as usize] = data; - return true + return true; } false } // Read from cartridge if the cartridge has readable VRAM/VROM pub fn readb_ppu(&self, addr: Addr) -> Option { - // TODO + if let Some(mapped_addr) = self.mapper.map_read_addr_ppu(addr) { + return Some(self.chr_rom[mapped_addr as usize]) + } None } // Let the cartridge handle the ppu write. Returns true if cartridge // handled the write, false otherwise pub fn writeb_ppu(&mut self, addr: Addr, data: Byte) -> bool { - // TODO + if let Some(mapped_addr) = self.mapper.map_write_addr_ppu(addr) { + self.chr_rom[mapped_addr as usize] = data; + return true; + } false } } diff --git a/src/nes/mappers.rs b/src/nes/mappers.rs index a61b390..956512b 100644 --- a/src/nes/mappers.rs +++ b/src/nes/mappers.rs @@ -3,6 +3,8 @@ use crate::nes::types::*; pub trait Mapper { fn map_read_addr(&self, addr: Addr) -> Option; fn map_write_addr(&self, addr: Addr) -> Option; + fn map_read_addr_ppu(&self, addr: Addr) -> Option; + fn map_write_addr_ppu(&self, addr: Addr) -> Option; } // Mapper 0 @@ -49,4 +51,20 @@ impl Mapper for Mapper0 { } None } + + fn map_read_addr_ppu(&self, addr: Addr) -> Option { + if 0x0000 <= addr && addr <= 0x1FFF { + return Some(addr) + } + None + } + + fn map_write_addr_ppu(&self, addr: Addr) -> Option { + if 0x0000 <= addr && addr <= 0x1FFF { + if self.chr_banks == 0 { // no banks => RAM + return Some(addr) + } + } + None + } } diff --git a/src/nes/ppubus.rs b/src/nes/ppubus.rs index 889d26e..4206e94 100644 --- a/src/nes/ppubus.rs +++ b/src/nes/ppubus.rs @@ -35,7 +35,13 @@ impl PPUBus { impl PPUMemory for PPUBus { fn readb_ppu(&self, addr: Addr) -> Byte { - // give the cartridge a chance to handle it + // Palette is never mapped to cartridge + if PALETTE_ADDR_RANGE[0] <= addr && addr <= PALETTE_ADDR_RANGE[1] { + let rel_addr = addr - 0x3F00; + return self.palette_memory[(rel_addr % 0x0020) as usize] + } + + // give the cartridge a chance to handle the rest if let Some(cartridge) = &self.cartridge { if let Some(data) = cartridge.borrow().readb_ppu(addr) { return data @@ -59,15 +65,17 @@ impl PPUMemory for PPUBus { let rel_addr = addr - 0x2000; return self.nametable_memory[table][(rel_addr % 0x400) as usize] } - if PALETTE_ADDR_RANGE[0] <= addr && addr <= PALETTE_ADDR_RANGE[1] { - let rel_addr = addr - 0x3F00; - return self.palette_memory[(rel_addr % 0x0020) as usize] - } - + 0x00 } fn writeb_ppu(&mut self, addr: Addr, data: Byte) { - // give the cartridge a chance to handle it + // Palette is never mapped to cartridge + if PALETTE_ADDR_RANGE[0] <= addr && addr <= PALETTE_ADDR_RANGE[1] { + let rel_addr = addr - 0x3F00; + self.palette_memory[(rel_addr % 0x0020) as usize] = data; + } + + // give the cartridge a chance to handle the rest if let Some(cartridge) = &self.cartridge { if cartridge.borrow_mut().writeb_ppu(addr, data) { return @@ -91,10 +99,6 @@ impl PPUMemory for PPUBus { let rel_addr = addr - 0x2000; self.nametable_memory[table][(rel_addr % 0x400) as usize] = data; } - if PALETTE_ADDR_RANGE[0] <= addr && addr <= PALETTE_ADDR_RANGE[1] { - let rel_addr = addr - 0x3F00; - self.palette_memory[(rel_addr % 0x0020) as usize] = data; - } } }