From f0eb5764c8edfe49fb09609bfa1b35b5caeb1cd5 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:37:55 +0100 Subject: [PATCH] emulate summercart64 ROM_WRITE_ENABLE flag (#218) * emulate summercart64 ROM_WRITE_ENABLE flag * clean up names --- src/device/cart/rom.rs | 49 ++++++++++++++++++++++++++++----------- src/device/cart/sc64.rs | 1 + src/ui/gui/gui_netplay.rs | 4 +++- src/ui/storage.rs | 4 +++- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/device/cart/rom.rs b/src/device/cart/rom.rs index 600461f..49a0364 100644 --- a/src/device/cart/rom.rs +++ b/src/device/cart/rom.rs @@ -56,7 +56,25 @@ pub fn read_mem( } } -pub fn write_mem(device: &mut device::Device, _address: u64, value: u32, mask: u32) { +pub fn write_mem(device: &mut device::Device, address: u64, value: u32, mask: u32) { + if device.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(), + ); + 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], + ); + } + device.ui.saves.romsave.1 = true; + } + device.cart.latch = value & mask; device.pi.regs[device::pi::PI_STATUS_REG as usize] |= device::pi::PI_STATUS_IO_BUSY; @@ -76,22 +94,26 @@ pub fn dma_read( mut dram_addr: u32, length: u32, ) -> u64 { - dram_addr &= device::rdram::RDRAM_MASK as u32; - cart_addr &= CART_MASK as u32; + if device.sc64.cfg[device::cart::sc64::SC64_ROM_WRITE_ENABLE as usize] != 0 { + dram_addr &= device::rdram::RDRAM_MASK as u32; + cart_addr &= CART_MASK as u32; - 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]; + 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.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.1 = true; + device.ui.saves.romsave.1 = true; + } device::pi::calculate_cycles(device, 1, length) } @@ -183,6 +205,7 @@ fn set_cic(device: &mut device::Device) { device.cart.cic_type = CicType::CicNus5167; device.cart.cic_seed = 0xdd; device.cart.rdram_size_offset = 0x318; + device.sc64.cfg[device::cart::sc64::SC64_ROM_WRITE_ENABLE as usize] = 1; } _ => { device.cart.cic_type = CicType::CicNus6102; diff --git a/src/device/cart/sc64.rs b/src/device/cart/sc64.rs index bd37c38..f55c247 100644 --- a/src/device/cart/sc64.rs +++ b/src/device/cart/sc64.rs @@ -11,6 +11,7 @@ const SC64_KEY_REG: u32 = 4; //const SC64_AUX_REG: u32 = 6; pub const SC64_REGS_COUNT: u32 = 7; +pub const SC64_ROM_WRITE_ENABLE: u32 = 1; pub const SC64_CFG_COUNT: u32 = 15; const SC64_BUFFER_MASK: usize = 0x1FFF; diff --git a/src/ui/gui/gui_netplay.rs b/src/ui/gui/gui_netplay.rs index 5cb816d..4435738 100644 --- a/src/ui/gui/gui_netplay.rs +++ b/src/ui/gui/gui_netplay.rs @@ -398,7 +398,9 @@ fn parse_rom_file(file: std::path::PathBuf, tx: std::sync::mpsc::Sender