Fix out-of-bounds ROM dma (#223)
* Fix out-of-bounds ROM dma * Fix out-of-bounds ROM dma * more
This commit is contained in:
parent
55ab1cb60b
commit
5b3e2a25de
@ -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)
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -43,10 +43,10 @@ fn get_save_type(rom: &[u8], game_id: &str) -> Vec<SaveTypes> {
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user