From a4c505c72d807e52d62829bd9e0e1a9647a48d01 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Tue, 4 Mar 2025 10:12:56 +0100 Subject: [PATCH] remove some code duplication (#298) --- src/device/ai.rs | 2 +- src/device/cart/rom.rs | 6 +----- src/device/cart/sram.rs | 6 +----- src/device/controller.rs | 3 +-- src/device/controller/vru.rs | 3 +-- src/device/cop0.rs | 4 ++-- src/device/events.rs | 8 ++++++++ src/device/exceptions.rs | 6 +----- src/device/pi.rs | 12 ++---------- src/device/pif.rs | 6 +----- src/device/rdp.rs | 6 +----- src/device/rsp_interface.rs | 10 ++-------- src/device/si.rs | 8 ++------ src/device/vi.rs | 8 ++------ 14 files changed, 26 insertions(+), 62 deletions(-) diff --git a/src/device/ai.rs b/src/device/ai.rs index 58c44f3..919fa4e 100644 --- a/src/device/ai.rs +++ b/src/device/ai.rs @@ -66,7 +66,7 @@ fn do_dma(device: &mut device::Device) { device::events::create_event( device, device::events::EVENT_TYPE_AI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + device.ai.fifo[0].duration, + device.ai.fifo[0].duration, ); device::mi::set_rcp_interrupt(device, device::mi::MI_INTR_AI); } diff --git a/src/device/cart/rom.rs b/src/device/cart/rom.rs index 87a9b38..34c8359 100644 --- a/src/device/cart/rom.rs +++ b/src/device/cart/rom.rs @@ -65,11 +65,7 @@ pub fn write_mem(device: &mut device::Device, address: u64, value: u32, mask: u3 device.pi.regs[device::pi::PI_STATUS_REG as usize] |= device::pi::PI_STATUS_IO_BUSY; let cycles = device::pi::calculate_cycles(device, 1, 4); - device::events::create_event( - device, - device::events::EVENT_TYPE_PI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + cycles, - ); + device::events::create_event(device, device::events::EVENT_TYPE_PI, cycles); } pub fn dma_read( diff --git a/src/device/cart/sram.rs b/src/device/cart/sram.rs index 8fae390..8b9dae5 100644 --- a/src/device/cart/sram.rs +++ b/src/device/cart/sram.rs @@ -123,11 +123,7 @@ pub fn write_mem(device: &mut device::Device, address: u64, value: u32, mask: u3 device.pi.regs[device::pi::PI_STATUS_REG as usize] |= device::pi::PI_STATUS_IO_BUSY; let cycles = device::pi::calculate_cycles(device, 2, 4); - device::events::create_event( - device, - device::events::EVENT_TYPE_PI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + cycles, - ); + device::events::create_event(device, device::events::EVENT_TYPE_PI, cycles); } fn dma_read_sram(device: &mut device::Device, mut cart_addr: u32, mut dram_addr: u32, length: u32) { diff --git a/src/device/controller.rs b/src/device/controller.rs index 1d500cd..a8f4b5e 100644 --- a/src/device/controller.rs +++ b/src/device/controller.rs @@ -77,8 +77,7 @@ pub fn process(device: &mut device::Device, channel: usize) { device::events::create_event( device, device::events::EVENT_TYPE_PAK, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] - + (device.cpu.clock_rate), // 1 second + device.cpu.clock_rate, // 1 second ) } } diff --git a/src/device/controller/vru.rs b/src/device/controller/vru.rs index b82d434..ed5be09 100644 --- a/src/device/controller/vru.rs +++ b/src/device/controller/vru.rs @@ -170,8 +170,7 @@ pub fn process(device: &mut device::Device, channel: usize) { device::events::create_event( device, device::events::EVENT_TYPE_VRU, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] - + (device.cpu.clock_rate * 2), // 2 seconds + device.cpu.clock_rate * 2, // 2 seconds ) } else if device.pif.ram[device.pif.channels[channel].rx_buf.unwrap()] == 0xEF { device.vru.talking = false; diff --git a/src/device/cop0.rs b/src/device/cop0.rs index 280b590..dcc2caa 100644 --- a/src/device/cop0.rs +++ b/src/device/cop0.rs @@ -215,7 +215,7 @@ fn set_control_registers(device: &mut device::Device, index: u32, mut data: u64) device::events::create_event( device, device::events::EVENT_TYPE_COMPARE, - device.cpu.cop0.regs[COP0_COUNT_REG as usize] + ((compare_event_diff as u64) << 1), + (compare_event_diff as u64) << 1, ); device.cpu.cop0.regs[COP0_CAUSE_REG as usize] &= !COP0_CAUSE_IP7; device.cpu.cop0.pending_compare_interrupt = false; @@ -237,7 +237,7 @@ fn set_control_registers(device: &mut device::Device, index: u32, mut data: u64) pub fn compare_event(device: &mut device::Device) { device.cpu.cop0.pending_compare_interrupt = true; - device::events::create_event( + device::events::create_event_at( device, device::events::EVENT_TYPE_COMPARE, device.cpu.next_event_count + (u32::MAX as u64), diff --git a/src/device/events.rs b/src/device/events.rs index 10a3e83..49f1874 100644 --- a/src/device/events.rs +++ b/src/device/events.rs @@ -21,6 +21,14 @@ pub struct Event { } pub fn create_event(device: &mut device::Device, name: usize, when: u64) { + device.cpu.events[name] = Event { + enabled: true, + count: device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + when, + }; + set_next_event(device); +} + +pub fn create_event_at(device: &mut device::Device, name: usize, when: u64) { device.cpu.events[name] = Event { enabled: true, count: when, diff --git a/src/device/exceptions.rs b/src/device/exceptions.rs index 40353b0..19662e6 100644 --- a/src/device/exceptions.rs +++ b/src/device/exceptions.rs @@ -33,11 +33,7 @@ pub fn check_pending_interrupts(device: &mut device::Device) { if device.cpu.cop0.is_event { interrupt_exception(device); } else { - device::events::create_event( - device, - device::events::EVENT_TYPE_INT, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize], - ); + device::events::create_event(device, device::events::EVENT_TYPE_INT, 0); } } diff --git a/src/device/pi.rs b/src/device/pi.rs index d05e6d6..ee9647a 100644 --- a/src/device/pi.rs +++ b/src/device/pi.rs @@ -66,11 +66,7 @@ fn dma_read(device: &mut device::Device) { let cycles = (handler.read)(device, cart_addr, dram_addr, length); - device::events::create_event( - device, - device::events::EVENT_TYPE_PI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + cycles, - ); + device::events::create_event(device, device::events::EVENT_TYPE_PI, cycles); /* Update PI_DRAM_ADDR_REG and PI_CART_ADDR_REG */ device.pi.regs[PI_DRAM_ADDR_REG as usize] = @@ -99,11 +95,7 @@ fn dma_write(device: &mut device::Device) { let cycles = (handler.write)(device, cart_addr, dram_addr, length); - device::events::create_event( - device, - device::events::EVENT_TYPE_PI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + cycles, - ); + device::events::create_event(device, device::events::EVENT_TYPE_PI, cycles); /* Update PI_DRAM_ADDR_REG and PI_CART_ADDR_REG */ device.pi.regs[PI_DRAM_ADDR_REG as usize] = diff --git a/src/device/pif.rs b/src/device/pif.rs index e109d76..f595b6f 100644 --- a/src/device/pif.rs +++ b/src/device/pif.rs @@ -67,11 +67,7 @@ pub fn write_mem(device: &mut device::Device, address: u64, value: u32, mask: u3 device.pif.ram[masked_address..masked_address + 4].copy_from_slice(&data.to_be_bytes()); device.si.dma_dir = device::si::DmaDir::Write; - device::events::create_event( - device, - device::events::EVENT_TYPE_SI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + 3200, - ); //based on https://github.com/rasky/n64-systembench + device::events::create_event(device, device::events::EVENT_TYPE_SI, 3200); //based on https://github.com/rasky/n64-systembench device.si.regs[device::si::SI_STATUS_REG as usize] |= device::si::SI_STATUS_DMA_BUSY | device::si::SI_STATUS_IO_BUSY } diff --git a/src/device/rdp.rs b/src/device/rdp.rs index 20172ff..7b8164e 100644 --- a/src/device/rdp.rs +++ b/src/device/rdp.rs @@ -130,11 +130,7 @@ fn run_rdp(device: &mut device::Device) { device.load_state = false; savestates::load_savestate(device); } - device::events::create_event( - device, - device::events::EVENT_TYPE_DP, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + timer, - ) + device::events::create_event(device, device::events::EVENT_TYPE_DP, timer) } } diff --git a/src/device/rsp_interface.rs b/src/device/rsp_interface.rs index 56bc045..bcf8376 100644 --- a/src/device/rsp_interface.rs +++ b/src/device/rsp_interface.rs @@ -206,9 +206,7 @@ fn do_dma(device: &mut device::Device, dma: RspDma) { device::events::create_event( device, device::events::EVENT_TYPE_SPDMA, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] - + device::rdram::rdram_calculate_cycles((count * length) as u64) - + 9, + device::rdram::rdram_calculate_cycles((count * length) as u64) + 9, ); } @@ -467,11 +465,7 @@ fn do_task(device: &mut device::Device) { } else { let timer = device::rsp_cpu::run(device); - device::events::create_event( - device, - device::events::EVENT_TYPE_SP, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + timer, - ) + device::events::create_event(device, device::events::EVENT_TYPE_SP, timer) } } diff --git a/src/device/si.rs b/src/device/si.rs index aee1cab..41ae353 100644 --- a/src/device/si.rs +++ b/src/device/si.rs @@ -49,9 +49,7 @@ fn dma_read(device: &mut device::Device) { device.si.regs[SI_STATUS_REG as usize] |= SI_STATUS_DMA_BUSY; - let length = device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] - + duration - + randomize_interrupt_time(&mut device.rng); + let length = duration + randomize_interrupt_time(&mut device.rng); device::events::create_event(device, device::events::EVENT_TYPE_SI, length) } @@ -63,9 +61,7 @@ fn dma_write(device: &mut device::Device) { device.si.regs[SI_STATUS_REG as usize] |= SI_STATUS_DMA_BUSY; - let length = device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] - + 6000 - + randomize_interrupt_time(&mut device.rng); //based on https://github.com/rasky/n64-systembench + let length = 6000 + randomize_interrupt_time(&mut device.rng); //based on https://github.com/rasky/n64-systembench device::events::create_event(device, device::events::EVENT_TYPE_SI, length) } diff --git a/src/device/vi.rs b/src/device/vi.rs index 28b50e9..7b1c6c1 100644 --- a/src/device/vi.rs +++ b/src/device/vi.rs @@ -65,11 +65,7 @@ fn create_limiter(device: &mut device::Device) { fn set_vertical_interrupt(device: &mut device::Device) { if device::events::get_event(device, device::events::EVENT_TYPE_VI).is_none() { - device::events::create_event( - device, - device::events::EVENT_TYPE_VI, - device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + device.vi.delay, - ) + device::events::create_event(device, device::events::EVENT_TYPE_VI, device.vi.delay) } } @@ -164,7 +160,7 @@ pub fn vertical_interrupt_event(device: &mut device::Device) { device::mi::set_rcp_interrupt(device, device::mi::MI_INTR_VI); - device::events::create_event( + device::events::create_event_at( device, device::events::EVENT_TYPE_VI, device.cpu.next_event_count + device.vi.delay,