This repository has been archived on 2026-08-27. You can view files and clone it, but cannot push or open issues or pull requests.
gopher64-netplay/src/device/events.rs
Logan McNaughton 5c98a08fe4
remove schedule_rcp_interrupt (#208)
* remove schedule_rcp_interrupt

* more

* more

* more
2025-02-01 19:16:38 +01:00

82 lines
1.8 KiB
Rust

use crate::device;
#[derive(PartialEq, Copy, Clone)]
pub enum EventType {
AI,
SI,
VI,
PI,
DP,
SP,
Interrupt,
SPDma,
Compare,
Vru,
PakSwitch,
Count,
}
#[derive(PartialEq, Copy, Clone)]
pub struct Event {
pub enabled: bool,
pub count: u64,
pub handler: fn(&mut device::Device),
}
pub fn create_event(
device: &mut device::Device,
name: EventType,
when: u64,
handler: fn(&mut device::Device),
) {
device.cpu.events[name as usize] = Event {
enabled: true,
count: when,
handler,
};
set_next_event(device);
}
pub fn get_event(device: &mut device::Device, name: EventType) -> Option<&mut Event> {
if device.cpu.events[name as usize].enabled {
return Some(&mut device.cpu.events[name as usize]);
}
None
}
pub fn remove_event(device: &mut device::Device, name: EventType) {
device.cpu.events[name as usize].enabled = false;
}
pub fn trigger_event(device: &mut device::Device) {
let next_event_name = device.cpu.next_event;
device.cpu.events[next_event_name].enabled = false;
let handler = device.cpu.events[next_event_name].handler;
handler(device);
set_next_event(device);
}
fn set_next_event(device: &mut device::Device) {
device.cpu.next_event_count = u64::MAX;
for (pos, i) in device.cpu.events.iter().enumerate() {
if i.enabled && i.count < device.cpu.next_event_count {
device.cpu.next_event_count = i.count;
device.cpu.next_event = pos;
}
}
}
pub fn translate_events(device: &mut device::Device, old_count: u64, new_count: u64) {
for i in device.cpu.events.iter_mut() {
if i.enabled {
i.count = i.count - old_count + new_count;
}
}
set_next_event(device);
}
pub fn dummy_event(_device: &mut device::Device) {
panic!("dummy event")
}