mapper0 and cartrige support ppu

This commit is contained in:
Daniel Bauer
2020-01-18 22:14:05 +01:00
parent 0a16eefab1
commit 15e00db88e
3 changed files with 41 additions and 14 deletions

View File

@@ -112,21 +112,26 @@ impl Cartridge {
pub fn writeb(&mut self, addr: Addr, data: Byte) -> bool { pub fn writeb(&mut self, addr: Addr, data: Byte) -> bool {
if let Some(mapped_addr) = self.mapper.map_write_addr(addr) { if let Some(mapped_addr) = self.mapper.map_write_addr(addr) {
self.prg_rom[mapped_addr as usize] = data; self.prg_rom[mapped_addr as usize] = data;
return true return true;
} }
false false
} }
// Read from cartridge if the cartridge has readable VRAM/VROM // Read from cartridge if the cartridge has readable VRAM/VROM
pub fn readb_ppu(&self, addr: Addr) -> Option<Byte> { pub fn readb_ppu(&self, addr: Addr) -> Option<Byte> {
// TODO if let Some(mapped_addr) = self.mapper.map_read_addr_ppu(addr) {
return Some(self.chr_rom[mapped_addr as usize])
}
None None
} }
// Let the cartridge handle the ppu write. Returns true if cartridge // Let the cartridge handle the ppu write. Returns true if cartridge
// handled the write, false otherwise // handled the write, false otherwise
pub fn writeb_ppu(&mut self, addr: Addr, data: Byte) -> bool { 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 false
} }
} }

View File

@@ -3,6 +3,8 @@ use crate::nes::types::*;
pub trait Mapper { pub trait Mapper {
fn map_read_addr(&self, addr: Addr) -> Option<Addr>; fn map_read_addr(&self, addr: Addr) -> Option<Addr>;
fn map_write_addr(&self, addr: Addr) -> Option<Addr>; fn map_write_addr(&self, addr: Addr) -> Option<Addr>;
fn map_read_addr_ppu(&self, addr: Addr) -> Option<Addr>;
fn map_write_addr_ppu(&self, addr: Addr) -> Option<Addr>;
} }
// Mapper 0 // Mapper 0
@@ -49,4 +51,20 @@ impl Mapper for Mapper0 {
} }
None None
} }
fn map_read_addr_ppu(&self, addr: Addr) -> Option<Addr> {
if 0x0000 <= addr && addr <= 0x1FFF {
return Some(addr)
}
None
}
fn map_write_addr_ppu(&self, addr: Addr) -> Option<Addr> {
if 0x0000 <= addr && addr <= 0x1FFF {
if self.chr_banks == 0 { // no banks => RAM
return Some(addr)
}
}
None
}
} }

View File

@@ -35,7 +35,13 @@ impl PPUBus {
impl PPUMemory for PPUBus { impl PPUMemory for PPUBus {
fn readb_ppu(&self, addr: Addr) -> Byte { 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(cartridge) = &self.cartridge {
if let Some(data) = cartridge.borrow().readb_ppu(addr) { if let Some(data) = cartridge.borrow().readb_ppu(addr) {
return data return data
@@ -59,15 +65,17 @@ impl PPUMemory for PPUBus {
let rel_addr = addr - 0x2000; let rel_addr = addr - 0x2000;
return self.nametable_memory[table][(rel_addr % 0x400) as usize] 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 0x00
} }
fn writeb_ppu(&mut self, addr: Addr, data: Byte) { 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 let Some(cartridge) = &self.cartridge {
if cartridge.borrow_mut().writeb_ppu(addr, data) { if cartridge.borrow_mut().writeb_ppu(addr, data) {
return return
@@ -91,10 +99,6 @@ impl PPUMemory for PPUBus {
let rel_addr = addr - 0x2000; let rel_addr = addr - 0x2000;
self.nametable_memory[table][(rel_addr % 0x400) as usize] = data; 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;
}
} }
} }