diff --git a/src/device/cart/sc64.rs b/src/device/cart/sc64.rs index b50a033..12b7a86 100644 --- a/src/device/cart/sc64.rs +++ b/src/device/cart/sc64.rs @@ -155,24 +155,26 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u let mut i = 0; while i < length { - if offset + i < device.ui.storage.saves.sdcard.data.len() { - let data = u32::from_be_bytes( - device.ui.storage.saves.sdcard.data - [(offset + i)..(offset + i + 4)] - .try_into() - .unwrap(), - ); + let data = u32::from_be_bytes( + device + .ui + .storage + .saves + .sdcard + .data + .get((offset + i)..(offset + i + 4)) + .unwrap_or(&[0; 4]) + .try_into() + .unwrap_or_default(), + ); - device::memory::data_write( - device, - address + i as u64, - data, - 0xFFFFFFFF, - false, - ); - } else { - panic!("sd card read out of bounds") - } + device::memory::data_write( + device, + address + i as u64, + data, + 0xFFFFFFFF, + false, + ); i += 4; } } @@ -187,19 +189,22 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u let mut i = 0; while i < length { - if offset + i < device.ui.storage.saves.sdcard.data.len() { - let data = device::memory::data_read( - device, - address + i as u64, - device::memory::AccessSize::Word, - false, - ) - .to_be_bytes(); - device.ui.storage.saves.sdcard.data[(offset + i)..(offset + i + 4)] - .copy_from_slice(&data); - } else { - panic!("sd card write out of bounds") - } + let data = device::memory::data_read( + device, + address + i as u64, + device::memory::AccessSize::Word, + false, + ) + .to_be_bytes(); + device + .ui + .storage + .saves + .sdcard + .data + .get_mut((offset + i)..(offset + i + 4)) + .unwrap_or(&mut [0; 4]) + .copy_from_slice(&data); i += 4; } device.ui.storage.saves.sdcard.written = true; @@ -309,7 +314,7 @@ pub fn dma_read( let mut j = cart_addr; while i < dram_addr + length { - buffer[j as usize] = *device + *buffer.get_mut(j as usize).unwrap_or(&mut 0) = *device .rdram .mem .get(i as usize ^ device.byte_swap) @@ -344,7 +349,7 @@ pub fn dma_write( .rdram .mem .get_mut(i as usize ^ device.byte_swap) - .unwrap_or(&mut 0) = buffer[j as usize]; + .unwrap_or(&mut 0) = *buffer.get(j as usize).unwrap_or(&0); i += 1; j += 1; } diff --git a/src/device/rdram.rs b/src/device/rdram.rs index b40c31a..956c57e 100644 --- a/src/device/rdram.rs +++ b/src/device/rdram.rs @@ -33,7 +33,7 @@ pub fn read_mem_fast( .rdram .mem .get(masked_address..masked_address + 4) - .unwrap_or_default() + .unwrap_or(&[0; 4]) .try_into() .unwrap_or_default(), ) @@ -55,7 +55,7 @@ pub fn read_mem( .rdram .mem .get(masked_address..masked_address + 4) - .unwrap_or_default() + .unwrap_or(&[0; 4]) .try_into() .unwrap_or_default(), ) @@ -67,7 +67,7 @@ pub fn write_mem(device: &mut device::Device, address: u64, value: u32, mask: u3 .rdram .mem .get(address as usize..(address + 4) as usize) - .unwrap_or_default() + .unwrap_or(&[0; 4]) .try_into() .unwrap_or_default(), ); diff --git a/src/device/rsp_interface.rs b/src/device/rsp_interface.rs index 468db54..083580a 100644 --- a/src/device/rsp_interface.rs +++ b/src/device/rsp_interface.rs @@ -180,7 +180,7 @@ fn do_dma(device: &mut device::Device, dma: RspDma) { .rdram .mem .get(dram_addr as usize..dram_addr as usize + 4) - .unwrap_or_default() + .unwrap_or(&[0; 4]) .try_into() .unwrap_or_default(), ); diff --git a/src/device/si.rs b/src/device/si.rs index 5cef137..017958a 100644 --- a/src/device/si.rs +++ b/src/device/si.rs @@ -90,7 +90,7 @@ fn copy_pif_rdram(device: &mut device::Device) { .rdram .mem .get(dram_addr + i..dram_addr + i + 4) - .unwrap_or_default() + .unwrap_or(&[0; 4]) .try_into() .unwrap_or_default(), );