From 63b2ed69e4b7b216698ac6faebc89bc160b58ad5 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Wed, 12 Feb 2025 16:09:42 +0100 Subject: [PATCH] don't modify cart.rom (#243) * don't modify cart.rom * don't modify cart.rom * don't modify cart.rom * more * more --- src/device.rs | 1 - src/device/cart/rom.rs | 75 ++++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/device.rs b/src/device.rs index 9f95b35..46aaef6 100644 --- a/src/device.rs +++ b/src/device.rs @@ -66,7 +66,6 @@ pub fn run_game(rom_contents: Vec, device: &mut Device) { ui::storage::init(&mut device.ui, &device.cart.rom); ui::storage::load_saves(&mut device.ui, &mut device.netplay); - cart::rom::load_rom_save(device); cpu::run(device); diff --git a/src/device/cart/rom.rs b/src/device/cart/rom.rs index be5ef93..888427b 100644 --- a/src/device/cart/rom.rs +++ b/src/device/cart/rom.rs @@ -3,17 +3,29 @@ use sha2::{Digest, Sha256}; const CART_MASK: usize = 0xFFFFFFF; +fn read_cart_word(device: &mut device::Device, address: usize) -> u32 { + let mut data: [u8; 4] = device.cart.rom[address..address + 4].try_into().unwrap(); + for i in 0..4 { + if device + .ui + .saves + .romsave + .0 + .contains_key(&(address as u32 + i)) + { + data[i as usize] = device.ui.saves.romsave.0[&(address as u32 + i)]; + } + } + u32::from_be_bytes(data) +} + pub fn read_mem_fast( device: &mut device::Device, address: u64, _access_size: device::memory::AccessSize, ) -> u32 { let masked_address = address as usize & CART_MASK; - u32::from_be_bytes( - device.cart.rom[masked_address..masked_address + 4] - .try_into() - .unwrap(), - ) + read_cart_word(device, masked_address) } pub fn read_mem( @@ -29,29 +41,22 @@ pub fn read_mem( device.cart.latch } else { let masked_address = address as usize & CART_MASK; - u32::from_be_bytes( - device.cart.rom[masked_address..masked_address + 4] - .try_into() - .unwrap(), - ) + read_cart_word(device, masked_address) } } pub fn write_mem(device: &mut device::Device, address: u64, value: u32, mask: u32) { if device.cart.sc64.cfg[device::cart::sc64::SC64_ROM_WRITE_ENABLE as usize] != 0 { let masked_address = address as usize & CART_MASK; - let mut data = u32::from_be_bytes( - device.cart.rom[masked_address..masked_address + 4] - .try_into() - .unwrap(), - ); + let mut data = read_cart_word(device, masked_address); device::memory::masked_write_32(&mut data, value, mask); - device.cart.rom[masked_address..masked_address + 4].copy_from_slice(&data.to_be_bytes()); - for i in 0..4 { - device.ui.saves.romsave.0.insert( - (masked_address + i) as u32, - device.cart.rom[masked_address + i], - ); + for (i, item) in data.to_be_bytes().iter().enumerate() { + device + .ui + .saves + .romsave + .0 + .insert((masked_address + i) as u32, *item); } device.ui.saves.romsave.1 = true; } @@ -80,15 +85,10 @@ pub fn dma_read( for i in 0..length { if cart_addr + i < device.cart.rom.len() as u32 { - device.cart.rom[(cart_addr + i) as usize] = - device.rdram.mem[(dram_addr + i) as usize ^ device.byte_swap]; - - device - .ui - .saves - .romsave - .0 - .insert(cart_addr + i, device.cart.rom[(cart_addr + i) as usize]); + device.ui.saves.romsave.0.insert( + cart_addr + i, + device.rdram.mem[(dram_addr + i) as usize ^ device.byte_swap], + ); device.ui.saves.romsave.1 = true; } @@ -110,7 +110,11 @@ pub fn dma_write( let mut i = dram_addr; let mut j = cart_addr; while i < dram_addr + length && j < device.cart.rom.len() as u32 { - device.rdram.mem[i as usize ^ device.byte_swap] = device.cart.rom[j as usize]; + if device.ui.saves.romsave.0.contains_key(&j) { + device.rdram.mem[i as usize ^ device.byte_swap] = device.ui.saves.romsave.0[&j]; + } else { + device.rdram.mem[i as usize ^ device.byte_swap] = device.cart.rom[j as usize]; + } i += 1; j += 1; } @@ -135,15 +139,6 @@ pub fn init(device: &mut device::Device, rom_file: Vec) { } } -pub fn load_rom_save(device: &mut device::Device) { - if device.ui.saves.romsave.0.is_empty() { - return; - } - for (key, value) in device.ui.saves.romsave.0.iter() { - device.cart.rom[*key as usize] = *value - } -} - fn set_system_region(device: &mut device::Device, country: u8) { let pal_codes: [u8; 8] = [b'D', b'F', b'I', b'P', b'S', b'U', b'X', b'Y']; for i in pal_codes {