X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fpsxcounters.c;h=cd99842b6bf36357f659d72ee76c0128754f8c70;hp=e8d2796b5a9b0a3546a4865e707ae70a0e3d1c56;hb=cec398c037bc9c9ec9010dcbed04f2c3ae7d2c61;hpb=ddbaf678c49d33cf60f1eac5069e3275baa2c685 diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c index e8d2796b..cd99842b 100644 --- a/libpcsxcore/psxcounters.c +++ b/libpcsxcore/psxcounters.c @@ -71,12 +71,11 @@ static const s32 VerboseLevel = VERBOSE_LEVEL; Rcnt rcnts[ CounterQuantity ]; -static u32 hSyncCount = 0; +u32 hSyncCount = 0; +u32 frame_counter = 0; static u32 spuSyncCount = 0; static u32 hsync_steps = 0; -static u32 gpu_wants_hcnt = 0; static u32 base_cycle = 0; -static u32 frame_counter = 0; u32 psxNextCounter = 0, psxNextsCounter = 0; @@ -191,20 +190,16 @@ void psxRcntReset( u32 index ) { u32 count; + rcnts[index].mode |= RcUnknown10; + if( rcnts[index].counterState == CountToTarget ) { + count = psxRegs.cycle; + count -= rcnts[index].cycleStart; + if( rcnts[index].rate > 1 ) + count /= rcnts[index].rate; if( rcnts[index].mode & RcCountToTarget ) - { - count = psxRegs.cycle; - count -= rcnts[index].cycleStart; - if (rcnts[index].rate > 1) - count /= rcnts[index].rate; count -= rcnts[index].target; - } - else - { - count = _psxRcntRcount( index ); - } _psxRcntWcount( index, count ); @@ -219,8 +214,12 @@ void psxRcntReset( u32 index ) } rcnts[index].mode |= RcCountEqTarget; + + if( count < 0xffff ) // special case, overflow too? + return; } - else if( rcnts[index].counterState == CountToOverflow ) + + if( rcnts[index].counterState == CountToOverflow ) { count = psxRegs.cycle; count -= rcnts[index].cycleStart; @@ -242,10 +241,6 @@ void psxRcntReset( u32 index ) rcnts[index].mode |= RcOverflow; } - - rcnts[index].mode |= RcUnknown10; - - psxRcntSet(); } void psxRcntUpdate() @@ -295,12 +290,13 @@ void psxRcntUpdate() // VSync irq. if( hSyncCount == VBlankStart[Config.PsxType] ) { - GPU_vBlank( 1, &hSyncCount, &gpu_wants_hcnt ); - //if( !(HW_GPU_STATUS & PSXGPU_ILACE) ) // hmh + if( !(HW_GPU_STATUS & PSXGPU_ILACE) ) HW_GPU_STATUS |= PSXGPU_LCF; - // For the best times. :D - //setIrq( 0x01 ); + setIrq( 0x01 ); + + EmuUpdate(); + GPU_updateLace(); } // Update lace. (with InuYasha fix) @@ -309,12 +305,6 @@ void psxRcntUpdate() hSyncCount = 0; frame_counter++; - GPU_vBlank( 0, &hSyncCount, &gpu_wants_hcnt ); - setIrq( 0x01 ); - - EmuUpdate(); - GPU_updateLace(); - HW_GPU_STATUS &= ~PSXGPU_LCF; if( HW_GPU_STATUS & PSXGPU_ILACE ) HW_GPU_STATUS |= frame_counter << 31; @@ -328,8 +318,6 @@ void psxRcntUpdate() hsync_steps = next_vsync; if( next_lace && next_lace < hsync_steps ) hsync_steps = next_lace; - if( gpu_wants_hcnt ) - hsync_steps = 1; rcnts[3].cycleStart = cycle - leftover_cycles; if (Config.PsxType) @@ -340,9 +328,10 @@ void psxRcntUpdate() base_cycle += hsync_steps * 8791293; rcnts[3].cycle = base_cycle >> 12; base_cycle &= 0xfff; - psxRcntSet(); } + psxRcntSet(); + #ifndef NDEBUG DebugVSync(); #endif