emulate summercart64 ROM_WRITE_ENABLE flag (#218)

* emulate summercart64 ROM_WRITE_ENABLE flag

* clean up names
This commit is contained in:
Logan McNaughton 2025-02-04 15:37:55 +01:00 committed by GitHub
parent 480af8d36e
commit f0eb5764c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 43 additions and 15 deletions

View File

@ -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;

View File

@ -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;

View File

@ -398,7 +398,9 @@ fn parse_rom_file(file: std::path::PathBuf, tx: std::sync::mpsc::Sender<GameInfo
let mut game_name = "Unknown".to_owned();
let header_value = std::str::from_utf8(&rom_contents[0x20..0x34]);
if header_value.is_ok() {
game_name = header_value.unwrap().trim().replace('\0', "");
let re = regex::Regex::new(r"[^a-zA-Z0-9_ -]").unwrap();
let cleaned_up = re.replace_all(header_value.unwrap(), "");
game_name = cleaned_up.trim().replace('\0', "");
}
tx.send((

View File

@ -112,7 +112,9 @@ pub fn init(ui: &mut ui::Ui, rom: &[u8]) {
let mut game_name = "".to_owned();
let header_value = std::str::from_utf8(&rom[0x20..0x34]);
if header_value.is_ok() {
game_name = header_value.unwrap().trim().replace('\0', "");
let re = regex::Regex::new(r"[^a-zA-Z0-9_ -]").unwrap();
let cleaned_up = re.replace_all(header_value.unwrap(), "");
game_name = cleaned_up.trim().replace('\0', "");
}
let prefix = if game_name.is_empty() {