diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs index 6e51071513fc53e243cea2930d2bb01bde721cc7..d0b54912ad7ac87596644530d3cec9970f6d770f 100644 --- a/frontends/sdl/src/main.rs +++ b/frontends/sdl/src/main.rs @@ -203,7 +203,10 @@ impl Emulator { pub fn load_rom(&mut self, path: Option<&str>) { let path_res = path.unwrap_or(&self.rom_path); - let rom = self.system.load_rom_file(path_res); + let rom = self.system.load_rom_file( + path_res, + Some("C:/repo.other/boytacean/res/roms.prop/super_mario_2.sav"), + ); println!( "========= Cartridge =========\n{}\n=============================", rom diff --git a/src/gb.rs b/src/gb.rs index 87b2379fa0412c2186a5e3b463fc3c05904f5778..6fc26c29b703350c6e19d091def5b403f1bfd118 100644 --- a/src/gb.rs +++ b/src/gb.rs @@ -642,7 +642,7 @@ impl GameBoy { } pub fn set_ram_data(&mut self, ram_data: Vec<u8>) { - self.mmu().rom().set_ram_data(ram_data) + self.mmu().rom().set_ram_data(&ram_data) } pub fn registers(&mut self) -> Registers { @@ -974,15 +974,25 @@ impl GameBoy { self.load_boot_file(BootRom::Cgb); } - pub fn load_rom(&mut self, data: &[u8]) -> &mut Cartridge { - let rom = Cartridge::from_data(data); + pub fn load_rom(&mut self, data: &[u8], ram_data: Option<&[u8]>) -> &mut Cartridge { + let mut rom = Cartridge::from_data(data); + match ram_data { + Some(ram_data) => rom.set_ram_data(ram_data), + None => (), + } self.mmu().set_rom(rom); self.mmu().rom() } - pub fn load_rom_file(&mut self, path: &str) -> &mut Cartridge { + pub fn load_rom_file(&mut self, path: &str, ram_path: Option<&str>) -> &mut Cartridge { let data = read_file(path); - self.load_rom(&data) + match ram_path { + Some(ram_path) => { + let ram_data = read_file(ram_path); + self.load_rom(&data, Some(&ram_data)) + } + None => self.load_rom(&data, None), + } } pub fn attach_serial(&mut self, device: Box<dyn SerialDevice>) { diff --git a/src/rom.rs b/src/rom.rs index 90d0545d79e229ef11f8b7771710a8d63082443b..f793667fa3d84c9f5c63627effbd6ae50f3a08e6 100644 --- a/src/rom.rs +++ b/src/rom.rs @@ -587,12 +587,16 @@ impl Cartridge { ) } + pub fn rom_data_eager(&self) -> Vec<u8> { + self.rom_data.clone() + } + pub fn ram_data_eager(&self) -> Vec<u8> { self.ram_data.clone() } - pub fn set_ram_data(&mut self, ram_data: Vec<u8>) { - self.ram_data = ram_data; + pub fn set_ram_data(&mut self, data: &[u8]) { + self.ram_data = data.to_vec(); } pub fn description(&self, column_length: usize) -> String { diff --git a/src/test.rs b/src/test.rs index 43f4ab89ff59b349ed930df205036c2ff9dfe67e..ff38d784b70cb9379c89a7adf2e09d2b0b844ab0 100644 --- a/src/test.rs +++ b/src/test.rs @@ -30,7 +30,7 @@ pub fn run_test(rom_path: &str, max_cycles: Option<u64>, options: TestOptions) - let max_cycles = max_cycles.unwrap_or(u64::MAX); let mut game_boy = build_test(options); - game_boy.load_rom_file(rom_path); + game_boy.load_rom_file(rom_path, None); loop { cycles += game_boy.clock() as u64;