emulate summercart64 ROM_WRITE_ENABLE flag (#218)
* emulate summercart64 ROM_WRITE_ENABLE flag * clean up names
This commit is contained in:
parent
480af8d36e
commit
f0eb5764c8
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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((
|
||||
|
||||
@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user