Fix address masking in sc64 read/write (#222)

* fix address masking for sc64

* more

* more
This commit is contained in:
Logan McNaughton 2025-02-05 10:29:07 +01:00 committed by GitHub
parent 778a0a4015
commit 55ab1cb60b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -102,7 +102,15 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u
's' => {
format_sdcard(device);
// read sd card
let address = device.sc64.regs[SC64_DATA0_REG as usize] as u64;
let (phys_address, cached, err) = device::memory::translate_address(
device,
device.sc64.regs[SC64_DATA0_REG as usize] as u64,
device::memory::AccessType::Write,
);
if err {
panic!("TLB exception in SC64");
}
let offset = (device.sc64.sector * 512) as usize;
let length = (device.sc64.regs[SC64_DATA1_REG as usize] * 512) as usize;
let mut i = 0;
@ -115,11 +123,12 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u
.unwrap(),
);
device.memory.memory_map_write[(address >> 16) as usize](
device::memory::data_write(
device,
address + i as u64,
phys_address + i as u64,
data,
0xFFFFFFFF,
cached,
);
} else {
panic!("sd card read out of bounds")
@ -130,17 +139,26 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u
'S' => {
format_sdcard(device);
// write sd card
let address = device.sc64.regs[SC64_DATA0_REG as usize] as u64;
let (phys_address, cached, err) = device::memory::translate_address(
device,
device.sc64.regs[SC64_DATA0_REG as usize] as u64,
device::memory::AccessType::Read,
);
if err {
panic!("TLB exception in SC64");
}
let offset = (device.sc64.sector * 512) as usize;
let length = (device.sc64.regs[SC64_DATA1_REG as usize] * 512) as usize;
let mut i = 0;
while i < length {
if offset + i < device.ui.saves.sdcard.0.len() {
let data = device.memory.memory_map_read[(address >> 16) as usize](
let data = device::memory::data_read(
device,
address + i as u64,
phys_address + i as u64,
device::memory::AccessSize::Word,
cached,
)
.to_be_bytes();
device.ui.saves.sdcard.0[(offset + i)..(offset + i + 4)]