X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fpsxcounters.c;h=2ea7c63bc7aaccd6b5a8a32202427e1cd352cd15;hp=177ccb75214ab42a44622069fa8e4e17a01b17ac;hb=53c361f0abe1fca37806bec2c20afc661c998df6;hpb=4f55097de04a34ddcc83647f3b1f69570d7f1e36 diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c index 177ccb75..2ea7c63b 100644 --- a/libpcsxcore/psxcounters.c +++ b/libpcsxcore/psxcounters.c @@ -22,6 +22,7 @@ */ #include "psxcounters.h" +#include "gpu.h" #include "debug.h" /******************************************************************************/ @@ -70,10 +71,10 @@ 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; u32 psxNextCounter = 0, psxNextsCounter = 0; @@ -189,6 +190,8 @@ void psxRcntReset( u32 index ) { u32 count; + rcnts[index].mode |= RcUnknown10; + if( rcnts[index].counterState == CountToTarget ) { if( rcnts[index].mode & RcCountToTarget ) @@ -217,8 +220,14 @@ void psxRcntReset( u32 index ) } rcnts[index].mode |= RcCountEqTarget; + + psxRcntSet(); + + 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; @@ -241,8 +250,6 @@ void psxRcntReset( u32 index ) rcnts[index].mode |= RcOverflow; } - rcnts[index].mode |= RcUnknown10; - psxRcntSet(); } @@ -293,22 +300,24 @@ void psxRcntUpdate() // VSync irq. if( hSyncCount == VBlankStart[Config.PsxType] ) { - GPU_vBlank( 1, &hSyncCount, &gpu_wants_hcnt ); - - // For the best times. :D - //setIrq( 0x01 ); + if( !(HW_GPU_STATUS & PSXGPU_ILACE) ) + HW_GPU_STATUS |= PSXGPU_LCF; + + setIrq( 0x01 ); + + EmuUpdate(); + GPU_updateLace(); } // Update lace. (with InuYasha fix) if( hSyncCount >= (Config.VSyncWA ? HSyncTotal[Config.PsxType] / BIAS : HSyncTotal[Config.PsxType]) ) { 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; } // Schedule next call, in hsyncs @@ -319,8 +328,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)