X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fpsxcounters.c;h=fba2f5c9eb2cf2e6b85e68dc52f800723ce2fe7b;hb=ff2c28226e4ca1eea4cdbc9e9e7efa119c623196;hp=ff0efbcedba55811d1fe58f1ead17f9a92e3fff4;hpb=7d7672a58c82341268c6f5d856c558e768aa3974;p=pcsx_rearmed.git diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c index ff0efbce..fba2f5c9 100644 --- a/libpcsxcore/psxcounters.c +++ b/libpcsxcore/psxcounters.c @@ -73,7 +73,6 @@ Rcnt rcnts[ CounterQuantity ]; u32 hSyncCount = 0; u32 frame_counter = 0; static u32 hsync_steps = 0; -static u32 base_cycle = 0; u32 psxNextCounter = 0, psxNextsCounter = 0; @@ -293,6 +292,27 @@ void psxRcntReset( u32 index ) } } +static void scheduleRcntBase(void) +{ + // Schedule next call, in hsyncs + if (hSyncCount < VBlankStart) + hsync_steps = VBlankStart - hSyncCount; + else + hsync_steps = HSyncTotal[Config.PsxType] - hSyncCount; + + if (hSyncCount + hsync_steps == HSyncTotal[Config.PsxType]) + { + rcnts[3].cycle = Config.PsxType ? PSXCLK / 50 : PSXCLK / 60; + } + else + { + // clk / 50 / 314 ~= 2157.25 + // clk / 60 / 263 ~= 2146.31 + u32 mult = Config.PsxType ? 8836089 : 8791293; + rcnts[3].cycle = hsync_steps * mult >> 12; + } +} + void psxRcntUpdate() { u32 cycle; @@ -300,19 +320,19 @@ void psxRcntUpdate() cycle = psxRegs.cycle; // rcnt 0. - if( cycle - rcnts[0].cycleStart >= rcnts[0].cycle ) + while( cycle - rcnts[0].cycleStart >= rcnts[0].cycle ) { psxRcntReset( 0 ); } // rcnt 1. - if( cycle - rcnts[1].cycleStart >= rcnts[1].cycle ) + while( cycle - rcnts[1].cycleStart >= rcnts[1].cycle ) { psxRcntReset( 1 ); } // rcnt 2. - if( cycle - rcnts[2].cycleStart >= rcnts[2].cycle ) + while( cycle - rcnts[2].cycleStart >= rcnts[2].cycle ) { psxRcntReset( 2 ); } @@ -320,15 +340,12 @@ void psxRcntUpdate() // rcnt base. if( cycle - rcnts[3].cycleStart >= rcnts[3].cycle ) { - u32 leftover_cycles = cycle - rcnts[3].cycleStart - rcnts[3].cycle; - u32 next_vsync; - hSyncCount += hsync_steps; // VSync irq. if( hSyncCount == VBlankStart ) { - HW_GPU_STATUS &= ~PSXGPU_LCF; + HW_GPU_STATUS &= SWAP32(~PSXGPU_LCF); GPU_vBlank( 1, 0 ); setIrq( 0x01 ); @@ -344,30 +361,17 @@ void psxRcntUpdate() // Update lace. (with InuYasha fix) if( hSyncCount >= (Config.VSyncWA ? HSyncTotal[Config.PsxType] / BIAS : HSyncTotal[Config.PsxType]) ) { + rcnts[3].cycleStart += Config.PsxType ? PSXCLK / 50 : PSXCLK / 60; hSyncCount = 0; frame_counter++; gpuSyncPluginSR(); - if( (HW_GPU_STATUS & PSXGPU_ILACE_BITS) == PSXGPU_ILACE_BITS ) - HW_GPU_STATUS |= frame_counter << 31; - GPU_vBlank( 0, HW_GPU_STATUS >> 31 ); + if ((HW_GPU_STATUS & SWAP32(PSXGPU_ILACE_BITS)) == SWAP32(PSXGPU_ILACE_BITS)) + HW_GPU_STATUS |= SWAP32(frame_counter << 31); + GPU_vBlank(0, SWAP32(HW_GPU_STATUS) >> 31); } - // Schedule next call, in hsyncs - hsync_steps = HSyncTotal[Config.PsxType] - hSyncCount; - next_vsync = VBlankStart - hSyncCount; // ok to overflow - if( next_vsync && next_vsync < hsync_steps ) - hsync_steps = next_vsync; - - rcnts[3].cycleStart = cycle - leftover_cycles; - if (Config.PsxType) - // 20.12 precision, clk / 50 / 313 ~= 2164.14 - base_cycle += hsync_steps * 8864320; - else - // clk / 60 / 263 ~= 2146.31 - base_cycle += hsync_steps * 8791293; - rcnts[3].cycle = base_cycle >> 12; - base_cycle &= 0xfff; + scheduleRcntBase(); } psxRcntSet(); @@ -510,15 +514,12 @@ s32 psxRcntFreeze( void *f, s32 Mode ) count = (psxRegs.cycle - rcnts[i].cycleStart) / rcnts[i].rate; _psxRcntWcount( i, count ); } - hsync_steps = 0; - if (rcnts[3].target) - hsync_steps = (psxRegs.cycle - rcnts[3].cycleStart) / rcnts[3].target; + scheduleRcntBase(); psxRcntSet(); - - base_cycle = 0; } return 0; } /******************************************************************************/ +// vim:ts=4:shiftwidth=4:expandtab