64 lines
1.4 KiB
Rust
64 lines
1.4 KiB
Rust
mod mbc1;
|
|
mod mbc2;
|
|
mod mbc3;
|
|
mod mbc5;
|
|
|
|
pub use mbc1::MBC1;
|
|
pub use mbc2::MBC2;
|
|
pub use mbc3::MBC3;
|
|
pub use mbc5::MBC5;
|
|
|
|
pub trait MBC {
|
|
fn read_byte(&self, addr: u16) -> u8;
|
|
fn write_byte(&mut self, addr: u16, val: u8);
|
|
|
|
fn dump_ram(&self, file: &str);
|
|
}
|
|
|
|
pub struct NoMBC {
|
|
rom: Box<[u8]>,
|
|
ram: Box<[u8]>,
|
|
}
|
|
|
|
impl NoMBC {
|
|
pub fn new(rom: Box<[u8]>, ram: Box<[u8]>) -> NoMBC {
|
|
NoMBC { rom, ram }
|
|
}
|
|
}
|
|
|
|
impl MBC for NoMBC {
|
|
fn dump_ram(&self, file: &str) {
|
|
super::write_file(&file, &self.ram).expect("Saving failed");
|
|
}
|
|
|
|
fn write_byte(&mut self, addr: u16, val: u8) {
|
|
println!(
|
|
"Writing not supported for cartridges without MBC. (Tried to set {:04X} to {:02X})",
|
|
addr, val
|
|
);
|
|
}
|
|
|
|
fn read_byte(&self, addr: u16) -> u8 {
|
|
match addr {
|
|
0x0000..=0x7FFF => self.rom[addr as usize],
|
|
0xA000..=0xBFFF => {
|
|
// TODO: Check for ram
|
|
let addr = (addr as usize) - 0xA000;
|
|
|
|
if addr >= self.ram.len() {
|
|
println!(
|
|
"Tried to access {:04X}, however the memory is not present.",
|
|
addr + 0xA000
|
|
);
|
|
0
|
|
} else {
|
|
self.ram[addr]
|
|
}
|
|
}
|
|
_ => {
|
|
panic!("Cartride: Unable to read from {:04X}", addr);
|
|
}
|
|
}
|
|
}
|
|
}
|