mapper0 and cartrige support ppu
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user