X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fpsxcounters.c;h=8b8fea8bf12ec1b91cf682eeeb212743b2ac6d18;hp=6f82abd5ae3baf3ae7e73ae05a35f9656d394354;hb=7badc9353b9570fd1c67827cfb477cef07974ddb;hpb=24de2dd4dbdd50e44c91c40ebbc7d59ee1c0ac9b diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c index 6f82abd5..8b8fea8b 100644 --- a/libpcsxcore/psxcounters.c +++ b/libpcsxcore/psxcounters.c @@ -60,9 +60,9 @@ static const u32 CountToOverflow = 0; static const u32 CountToTarget = 1; static const u32 FrameRate[] = { 60, 50 }; -static const u32 VBlankStart[] = { 240, 256 }; static const u32 HSyncTotal[] = { 263, 313 }; static const u32 SpuUpdInterval[] = { 32, 32 }; +#define VBlankStart 240 #define VERBOSE_LEVEL 0 static const s32 VerboseLevel = VERBOSE_LEVEL; @@ -190,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 ); @@ -218,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; @@ -241,10 +241,6 @@ void psxRcntReset( u32 index ) rcnts[index].mode |= RcOverflow; } - - rcnts[index].mode |= RcUnknown10; - - psxRcntSet(); } void psxRcntUpdate() @@ -292,13 +288,14 @@ void psxRcntUpdate() } // VSync irq. - if( hSyncCount == VBlankStart[Config.PsxType] ) + if( hSyncCount == VBlankStart ) { - //if( !(HW_GPU_STATUS & PSXGPU_ILACE) ) // hmh - HW_GPU_STATUS |= PSXGPU_LCF; + HW_GPU_STATUS &= ~PSXGPU_LCF; + GPU_vBlank( 1, 0 ); + setIrq( 0x01 ); - // For the best times. :D - //setIrq( 0x01 ); + EmuUpdate(); + GPU_updateLace(); } // Update lace. (with InuYasha fix) @@ -307,19 +304,15 @@ void psxRcntUpdate() hSyncCount = 0; frame_counter++; - setIrq( 0x01 ); - - EmuUpdate(); - GPU_updateLace(); - - HW_GPU_STATUS &= ~PSXGPU_LCF; - if( HW_GPU_STATUS & PSXGPU_ILACE ) + gpuSyncPluginSR(); + if( (HW_GPU_STATUS & PSXGPU_ILACE_BITS) == PSXGPU_ILACE_BITS ) HW_GPU_STATUS |= frame_counter << 31; + GPU_vBlank( 0, HW_GPU_STATUS >> 31 ); } // Schedule next call, in hsyncs hsync_steps = SpuUpdInterval[Config.PsxType] - spuSyncCount; - next_vsync = VBlankStart[Config.PsxType] - hSyncCount; // ok to overflow + next_vsync = VBlankStart - hSyncCount; // ok to overflow next_lace = HSyncTotal[Config.PsxType] - hSyncCount; if( next_vsync && next_vsync < hsync_steps ) hsync_steps = next_vsync; @@ -335,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