You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.1 KiB
79 lines
2.1 KiB
use crate::{cartridge::Rom, cpu::Mem}; |
|
const RAM: u16 = 0x0000; |
|
const RAM_MIRRORS_END: u16 = 0x1FFF; |
|
const PPU_REGISTERS: u16 = 0x2000; |
|
const PPU_REGISTERS_MIRRORS_END: u16 = 0x3FFF; |
|
|
|
pub struct Bus { |
|
cpu_vram: [u8; 2048], |
|
rom: Rom, |
|
} |
|
|
|
impl Bus { |
|
pub fn new(rom: Rom) -> Self { |
|
Bus { |
|
cpu_vram: [0; 2048], |
|
rom, |
|
} |
|
} |
|
fn read_prg_rom(&self, mut addr: u16) -> u8 { |
|
addr -= 0x8000; |
|
if self.rom.prg_rom.len() == 0x4000 && addr >= 0x4000 { |
|
addr = addr % 0x4000; |
|
} |
|
self.rom.prg_rom[addr as usize] |
|
} |
|
} |
|
|
|
impl Mem for Bus { |
|
fn mem_read(&self, addr: u16) -> u8 { |
|
match addr { |
|
RAM..=RAM_MIRRORS_END => { |
|
let mirror_down_addr = addr & 0b00000111_11111111; |
|
self.cpu_vram[mirror_down_addr as usize] |
|
} |
|
PPU_REGISTERS..=PPU_REGISTERS_MIRRORS_END => { |
|
let _mirror_down_addr = addr & 0b00100000_00000111; |
|
// todo!("PPU is not supported yet") |
|
0 |
|
} |
|
0x8000..=0xFFFF => self.read_prg_rom(addr), |
|
|
|
_ => { |
|
println!("Ignoring mem access at {}", addr); |
|
0 |
|
} |
|
} |
|
} |
|
|
|
fn mem_write(&mut self, addr: u16, data: u8) { |
|
match addr { |
|
RAM..=RAM_MIRRORS_END => { |
|
let mirror_down_addr = addr & 0b11111111111; |
|
self.cpu_vram[mirror_down_addr as usize] = data; |
|
} |
|
PPU_REGISTERS..=PPU_REGISTERS_MIRRORS_END => { |
|
let _mirror_down_addr = addr & 0b00100000_00000111; |
|
} |
|
0x8000..=0xFFFF => { |
|
panic!("Attempt to write to ROM space") |
|
} |
|
_ => { |
|
println!("Ignoring mem write-access at {}", addr); |
|
} |
|
} |
|
} |
|
} |
|
|
|
#[cfg(test)] |
|
mod test { |
|
use super::*; |
|
use crate::cartridge::test; |
|
|
|
#[test] |
|
fn test_mem_read_write_to_ram() { |
|
let mut bus = Bus::new(test::test_rom(vec![])); |
|
bus.mem_write(0x01, 0x55); |
|
assert_eq!(bus.mem_read(0x01), 0x55); |
|
} |
|
}
|
|
|