diff --git a/parallel-rdp/interface.cpp b/parallel-rdp/interface.cpp index 46dd2af..819c4c4 100644 --- a/parallel-rdp/interface.cpp +++ b/parallel-rdp/interface.cpp @@ -62,6 +62,7 @@ static int cmd_cur; static int cmd_ptr; static bool emu_running; static GFX_INFO gfx_info; +static uint32_t region; static const unsigned cmd_len_lut[64] = { 1, @@ -330,34 +331,6 @@ bool rdp_update_screen() return emu_running; } -static uint32_t viCalculateHorizonalWidth(uint32_t hstart, uint32_t xscale) -{ - uint32_t start = (hstart >> 16) & 0x3FF; - uint32_t end = (hstart & 0x3FF); - uint32_t delta; - if (end > start) - delta = end - start; - else - delta = 0; - uint32_t scale = (xscale & 0xFFF); - - return (delta * scale) / 0x400; -} - -static uint32_t viCalculateVerticalHeight(uint32_t vstart, uint32_t yscale) -{ - uint32_t start = (vstart >> 16) & 0x3FF; - uint32_t end = (vstart & 0x3FF); - uint32_t delta; - if (end > start) - delta = end - start; - else - delta = 0; - uint32_t scale = (yscale & 0xFFF); - - return (delta * scale) / 0x800; -} - uint64_t rdp_process_commands() { uint64_t interrupt_timer = 0; @@ -406,6 +379,7 @@ uint64_t rdp_process_commands() while (cmd_cur - cmd_ptr < 0) { uint32_t w1 = cmd_data[2 * cmd_cur]; + uint32_t w2 = cmd_data[2 * cmd_cur + 1]; uint32_t command = (w1 >> 24) & 63; int cmd_length = cmd_len_lut[command]; @@ -418,21 +392,21 @@ uint64_t rdp_process_commands() if (command >= 8) processor->enqueue_command(cmd_length * 2, &cmd_data[2 * cmd_cur]); + if (RDP::Op(command) == RDP::Op::SetScissor) + { + uint32_t upper_left_x = ((w1 >> 12) & 0xFFF) >> 2; + uint32_t upper_left_y = (w1 & 0xFFF) >> 2; + uint32_t lower_right_x = ((w2 >> 12) & 0xFFF) >> 2; + uint32_t lower_right_y = (w2 & 0xFFF) >> 2; + region = (lower_right_x - upper_left_x) * (lower_right_y - upper_left_y); + } if (RDP::Op(command) == RDP::Op::SyncFull) { processor->wait_for_timeline(processor->signal_timeline()); - uint32_t width = viCalculateHorizonalWidth(*gfx_info.VI_H_START_REG, *gfx_info.VI_X_SCALE_REG); - if (width == 0) - { - width = 320; - } - uint32_t height = viCalculateVerticalHeight(*gfx_info.VI_V_START_REG, *gfx_info.VI_Y_SCALE_REG); - if (height == 0) - { - height = 240; - } - interrupt_timer = width * height; + interrupt_timer = region; + if (interrupt_timer == 0) + interrupt_timer = 5000; } cmd_cur += cmd_length; diff --git a/parallel-rdp/interface.hpp b/parallel-rdp/interface.hpp index 306d3c8..ba8832c 100644 --- a/parallel-rdp/interface.hpp +++ b/parallel-rdp/interface.hpp @@ -16,10 +16,6 @@ extern "C" uint32_t *DPC_START_REG; uint32_t *DPC_END_REG; uint32_t *DPC_STATUS_REG; - uint32_t *VI_H_START_REG; - uint32_t *VI_V_START_REG; - uint32_t *VI_X_SCALE_REG; - uint32_t *VI_Y_SCALE_REG; } GFX_INFO; void rdp_init(void *_window, GFX_INFO _gfx_info, bool _upscale, bool _integer_scaling, bool _fullscreen); diff --git a/src/device/ai.rs b/src/device/ai.rs index db98341..8cc0607 100644 --- a/src/device/ai.rs +++ b/src/device/ai.rs @@ -111,7 +111,7 @@ pub fn read_regs( _access_size: device::memory::AccessSize, ) -> u32 { let reg = (address & 0xFFFF) >> 2; - match reg as u32 { + let return_value = match reg as u32 { AI_LEN_REG => { let value = get_remaining_dma_length(device); if value < device.ai.last_read { @@ -128,7 +128,9 @@ pub fn read_regs( value as u32 } _ => device.ai.regs[reg as usize], - } + }; + device::cop0::add_cycles(device, 20); + return_value } pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u32) { diff --git a/src/device/cart/sc64.rs b/src/device/cart/sc64.rs index 4f831ce..8adb1cf 100644 --- a/src/device/cart/sc64.rs +++ b/src/device/cart/sc64.rs @@ -37,6 +37,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); if device.sc64.regs_locked { return 0; } diff --git a/src/device/mi.rs b/src/device/mi.rs index c48b491..81f02d7 100644 --- a/src/device/mi.rs +++ b/src/device/mi.rs @@ -53,6 +53,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); device.mi.regs[((address & 0xFFFF) >> 2) as usize] } diff --git a/src/device/pi.rs b/src/device/pi.rs index c02826c..691411e 100644 --- a/src/device/pi.rs +++ b/src/device/pi.rs @@ -40,6 +40,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); let reg = (address & 0xFFFF) >> 2; match reg as u32 { PI_WR_LEN_REG | PI_RD_LEN_REG => 0x7F, diff --git a/src/device/rdp.rs b/src/device/rdp.rs index 3e826c0..9df454c 100644 --- a/src/device/rdp.rs +++ b/src/device/rdp.rs @@ -53,6 +53,7 @@ pub fn read_regs_dpc( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); let reg = (address & 0xFFFF) >> 2; match reg as u32 { DPC_STATUS_REG => { @@ -131,6 +132,7 @@ pub fn read_regs_dps( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); device.rdp.regs_dps[((address & 0xFFFF) >> 2) as usize] } diff --git a/src/device/rdram.rs b/src/device/rdram.rs index 9132c6f..37d2615 100644 --- a/src/device/rdram.rs +++ b/src/device/rdram.rs @@ -73,6 +73,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); let chip_id = (address >> 13) & 3; let reg = (address & 0x3FF) >> 2; match reg as u32 { diff --git a/src/device/ri.rs b/src/device/ri.rs index 55ae22b..60056b4 100644 --- a/src/device/ri.rs +++ b/src/device/ri.rs @@ -20,6 +20,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); if ((address & 0xFFFF) >> 2) as u32 == RI_SELECT_REG && !device.ri.ram_init { device::cop0::add_cycles(device, device.cpu.clock_rate / 2); // hack, simulate RDRAM initialization device.ri.ram_init = true; diff --git a/src/device/rsp_interface.rs b/src/device/rsp_interface.rs index 60d1ce8..1c643ca 100644 --- a/src/device/rsp_interface.rs +++ b/src/device/rsp_interface.rs @@ -101,8 +101,10 @@ pub fn read_mem_fast( pub fn read_mem( device: &mut device::Device, address: u64, - _access_size: device::memory::AccessSize, + access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, access_size as u64 / 4); + let masked_address = address as usize & RSP_MEM_MASK; u32::from_be_bytes( device.rsp.mem[masked_address..masked_address + 4] @@ -264,6 +266,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); let reg = (address & 0xFFFF) >> 2; match reg as u32 { SP_DMA_BUSY_REG | SP_DMA_FULL_REG => { @@ -321,6 +324,7 @@ pub fn read_regs2( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); device.rsp.regs2[((address & 0xFFFF) >> 2) as usize] } diff --git a/src/device/si.rs b/src/device/si.rs index df1e644..4751ebc 100644 --- a/src/device/si.rs +++ b/src/device/si.rs @@ -31,6 +31,7 @@ pub fn read_regs( address: u64, _access_size: device::memory::AccessSize, ) -> u32 { + device::cop0::add_cycles(device, 20); device.si.regs[((address & 0xFFFF) >> 2) as usize] } diff --git a/src/device/vi.rs b/src/device/vi.rs index 3f3d9d8..9b825e2 100644 --- a/src/device/vi.rs +++ b/src/device/vi.rs @@ -12,11 +12,11 @@ const VI_CURRENT_REG: u32 = 4; const VI_V_SYNC_REG: u32 = 6; const VI_H_SYNC_REG: u32 = 7; //const VI_LEAP_REG: u32 = 8; -pub const VI_H_START_REG: u32 = 9; -pub const VI_V_START_REG: u32 = 10; +//const VI_H_START_REG: u32 = 9; +//const VI_V_START_REG: u32 = 10; //const VI_V_BURST_REG: u32 = 11; -pub const VI_X_SCALE_REG: u32 = 12; -pub const VI_Y_SCALE_REG: u32 = 13; +//const VI_X_SCALE_REG: u32 = 12; +//const VI_Y_SCALE_REG: u32 = 13; pub const VI_REGS_COUNT: u32 = 14; pub struct Vi { @@ -89,6 +89,7 @@ pub fn read_regs( if reg as u32 == VI_CURRENT_REG { set_current_line(device) } + device::cop0::add_cycles(device, 20); device.vi.regs[reg as usize] } diff --git a/src/ui/video.rs b/src/ui/video.rs index ac039ad..ee4000d 100644 --- a/src/ui/video.rs +++ b/src/ui/video.rs @@ -33,10 +33,6 @@ pub fn init(device: &mut device::Device, fullscreen: bool) { DPC_START_REG: &mut device.rdp.regs_dpc[device::rdp::DPC_START_REG as usize], DPC_END_REG: &mut device.rdp.regs_dpc[device::rdp::DPC_END_REG as usize], DPC_STATUS_REG: &mut device.rdp.regs_dpc[device::rdp::DPC_STATUS_REG as usize], - VI_H_START_REG: &mut device.vi.regs[device::vi::VI_H_START_REG as usize], - VI_V_START_REG: &mut device.vi.regs[device::vi::VI_V_START_REG as usize], - VI_X_SCALE_REG: &mut device.vi.regs[device::vi::VI_X_SCALE_REG as usize], - VI_Y_SCALE_REG: &mut device.vi.regs[device::vi::VI_Y_SCALE_REG as usize], }; unsafe {