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); } } } }