diff --git a/src/device/cart/rom.rs b/src/device/cart/rom.rs index 47025d0..be261c6 100644 --- a/src/device/cart/rom.rs +++ b/src/device/cart/rom.rs @@ -99,18 +99,20 @@ pub fn dma_read( cart_addr &= CART_MASK as u32; for i in 0..length { - device.cart.rom[(cart_addr + i) as usize] = - device.rdram.mem[(dram_addr + i) as usize ^ device.byte_swap]; + 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.cart.rom[(cart_addr + i) as usize]); + 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) diff --git a/src/device/cart/sc64.rs b/src/device/cart/sc64.rs index 674d4bf..9e1f6c6 100644 --- a/src/device/cart/sc64.rs +++ b/src/device/cart/sc64.rs @@ -44,7 +44,7 @@ pub fn read_regs( match reg as u32 { SC64_SCR_REG | SC64_DATA0_REG | SC64_DATA1_REG => device.sc64.regs[reg as usize], SC64_IDENTIFIER_REG => 0x53437632, - _ => panic!("unknown read reg {} address {:x}", reg, address), + _ => panic!("unknown read reg {} address {:#x}", reg, address), } } @@ -182,7 +182,7 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u } } _ => panic!( - "unknown write reg {} address {:x} value {}", + "unknown write reg {} address {:#x} value {}", reg, address, char::from_u32(value & mask).unwrap() diff --git a/src/device/memory.rs b/src/device/memory.rs index 192ada4..a5707d7 100644 --- a/src/device/memory.rs +++ b/src/device/memory.rs @@ -16,7 +16,7 @@ const MM_SI_REGS: usize = 0x04800000; //const MM_DOM2_ADDR1: usize = 0x05000000; pub const MM_DOM2_ADDR2: usize = 0x08000000; pub const MM_CART_ROM: usize = 0x10000000; -const MM_PIF_MEM: usize = 0x1fc00000; +pub const MM_PIF_MEM: usize = 0x1fc00000; //const MM_DOM1_ADDR3: usize = 0x1fd00000; const MM_IS_VIEWER: usize = 0x13ff0000; pub const MM_SC64_BUFFER: usize = 0x1ffe0000; diff --git a/src/device/pi.rs b/src/device/pi.rs index 2e94a50..c02826c 100644 --- a/src/device/pi.rs +++ b/src/device/pi.rs @@ -117,17 +117,24 @@ fn get_handler(address: u32) -> PiHandler { read: device::cart::rom::dma_read, write: device::cart::rom::dma_write, }; - if address >= device::memory::MM_SC64_BUFFER as u32 { + if address >= device::memory::MM_SC64_BUFFER as u32 + && address < (device::memory::MM_SC64_BUFFER + 0x2000) as u32 + { handler.read = device::cart::sc64::dma_read; handler.write = device::cart::sc64::dma_write; - } else if address >= device::memory::MM_CART_ROM as u32 { + } else if address >= device::memory::MM_CART_ROM as u32 + && address < device::memory::MM_PIF_MEM as u32 + { handler.read = device::cart::rom::dma_read; handler.write = device::cart::rom::dma_write; - } else if address >= device::memory::MM_DOM2_ADDR2 as u32 { + } else if address >= device::memory::MM_DOM2_ADDR2 as u32 + && address < device::memory::MM_CART_ROM as u32 + { handler.read = device::cart::sram::dma_read; handler.write = device::cart::sram::dma_write; } else { - panic!("unknown pi handler") + handler.read = unknown_dma_read; + handler.write = unknown_dma_write; } handler } @@ -197,3 +204,26 @@ pub fn dma_event(device: &mut device::Device) { device::mi::set_rcp_interrupt(device, device::mi::MI_INTR_PI) } + +fn unknown_dma_read( + device: &mut device::Device, + mut _cart_addr: u32, + mut _dram_addr: u32, + length: u32, +) -> u64 { + device::pi::calculate_cycles(device, 1, length) +} + +fn unknown_dma_write( + device: &mut device::Device, + mut _cart_addr: u32, + mut dram_addr: u32, + length: u32, +) -> u64 { + dram_addr &= device::rdram::RDRAM_MASK as u32; + + for i in 0..length { + device.rdram.mem[(dram_addr + i) as usize ^ device.byte_swap] = 0; + } + device::pi::calculate_cycles(device, 1, length) +} diff --git a/src/ui/storage.rs b/src/ui/storage.rs index cf739c5..c10a72c 100644 --- a/src/ui/storage.rs +++ b/src/ui/storage.rs @@ -43,10 +43,10 @@ fn get_save_type(rom: &[u8], game_id: &str) -> Vec { 1 => return vec![SaveTypes::Eeprom4k], 2 => return vec![SaveTypes::Eeprom16k], 3 => return vec![SaveTypes::Sram], - 4 => panic!("Unsupported save type: {:X}", save_type), + 4 => panic!("Unsupported save type: {}", save_type), 5 => return vec![SaveTypes::Flash], - 6 => panic!("Unsupported save type: {:X}", save_type), - _ => panic!("Unknown save type: {:X}", save_type), + 6 => panic!("Unsupported save type: {}", save_type), + _ => panic!("Unknown save type: {}", save_type), } } match game_id {