From 55ab1cb60b7ee5eebb49bc35a7096f4e0bc5c271 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:29:07 +0100 Subject: [PATCH] Fix address masking in sc64 read/write (#222) * fix address masking for sc64 * more * more --- src/device/cart/sc64.rs | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/device/cart/sc64.rs b/src/device/cart/sc64.rs index f55c247..674d4bf 100644 --- a/src/device/cart/sc64.rs +++ b/src/device/cart/sc64.rs @@ -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)]