event fixes (#12)

* fix vi stuff

* more

* more fix

* rename
This commit is contained in:
Logan McNaughton
2023-10-10 19:43:25 -06:00
committed by GitHub
parent a6bafe9618
commit e2995d5b59
4 changed files with 12 additions and 22 deletions
+1 -1
View File
@@ -104,7 +104,7 @@ pub fn init(device: &mut device::Device, rom_file: Vec<u8>) {
let data =
std::str::from_utf8(&device.cart.rom[0x20 as usize..(0x20 + 0x14) as usize]).unwrap();
let hash = calculate_hash(&device.cart.rom);
device.ui.game_name = format!("{}-{}", data.trim(), hash);
device.ui.game_name = format!("{}-{}", data.trim().trim_matches(char::from(0)), hash);
device.ui.game_id = String::from_utf8(device.cart.rom[0x3B..0x3E].to_vec()).unwrap();
}
+6 -9
View File
@@ -185,6 +185,7 @@ pub fn get_control_registers(device: &mut device::Device, index: u32) -> u64 {
pub fn set_control_registers(device: &mut device::Device, index: u32, mut data: u64) {
device.cpu.cop0.reg_latch = data;
data &= device.cpu.cop0.reg_write_masks[index as usize];
match index {
COP0_COUNT_REG => {
data <<= 1;
@@ -197,14 +198,14 @@ pub fn set_control_registers(device: &mut device::Device, index: u32, mut data:
COP0_WIRED_REG => device.cpu.cop0.regs[COP0_RANDOM_REG as usize] = 31,
COP0_COMPARE_REG => {
let current_count = (device.cpu.cop0.regs[COP0_COUNT_REG as usize] >> 1) & 0xFFFFFFFF;
let mut event_time =
(device.cpu.cop0.regs[COP0_COUNT_REG as usize] & 0xFFFFFFFF00000000) | (data << 1);
let mut compare_event_time =
(device.cpu.cop0.regs[COP0_COUNT_REG as usize] & 0xFFFFFFFF00000000) + (data << 1);
if current_count >= data {
event_time += !0 as u32 as u64
compare_event_time += !0 as u32 as u64
}
let compare_event: &mut device::events::Event =
device::events::get_event(device, device::events::EventType::Compare).unwrap();
compare_event.count = event_time; // reschedule the next compare interrupt event
compare_event.count = compare_event_time; // reschedule the next compare interrupt event
device::events::set_next_event(device);
device.cpu.cop0.regs[COP0_CAUSE_REG as usize] &= !COP0_CAUSE_IP7;
}
@@ -215,11 +216,7 @@ pub fn set_control_registers(device: &mut device::Device, index: u32, mut data:
}
_ => {}
}
device::memory::masked_write_64(
&mut device.cpu.cop0.regs[index as usize],
data,
device.cpu.cop0.reg_write_masks[index as usize],
);
device::memory::masked_write_64(&mut device.cpu.cop0.regs[index as usize], data, !0 as u64);
device::exceptions::check_pending_interrupts(device);
}
+3 -1
View File
@@ -66,7 +66,9 @@ pub fn set_next_event(device: &mut device::Device) {
pub fn translate_events(device: &mut device::Device, old_count: u64, new_count: u64) {
for i in device.cpu.events.iter_mut() {
i.count = i.count - old_count + new_count
if i.enabled {
i.count = i.count - old_count + new_count;
}
}
set_next_event(device);
}
+2 -11
View File
@@ -5,7 +5,7 @@ use governor::clock::Clock;
pub const VI_STATUS_REG: u32 = 0;
//pub const VI_ORIGIN_REG: u32 = 1;
//pub const VI_WIDTH_REG: u32 = 2;
pub const VI_V_INTR_REG: u32 = 3;
//pub const VI_V_INTR_REG: u32 = 3;
pub const VI_CURRENT_REG: u32 = 4;
//pub const VI_BURST_REG: u32 = 5;
pub const VI_V_SYNC_REG: u32 = 6;
@@ -46,9 +46,7 @@ pub fn set_expected_refresh_rate(device: &mut device::Device) {
}
pub fn set_vertical_interrupt(device: &mut device::Device) {
if device::events::get_event(device, device::events::EventType::VI) == None
&& device.vi.regs[VI_V_INTR_REG as usize] < device.vi.regs[VI_V_SYNC_REG as usize]
{
if device::events::get_event(device, device::events::EventType::VI) == None {
device::events::create_event(
device,
device::events::EventType::VI,
@@ -94,13 +92,6 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u
let reg = (address & 0xFFFF) >> 2;
match reg as u32 {
VI_CURRENT_REG => device::mi::clear_rcp_interrupt(device, device::mi::MI_INTR_VI),
VI_V_INTR_REG => {
if device.vi.regs[reg as usize] != value & mask {
device::memory::masked_write_32(&mut device.vi.regs[reg as usize], value, mask);
set_vertical_interrupt(device);
ui::video::set_register(reg as u32, device.vi.regs[reg as usize])
}
}
VI_V_SYNC_REG => {
if device.vi.regs[reg as usize] != value & mask {
device::memory::masked_write_32(&mut device.vi.regs[reg as usize], value, mask);