Index: pcsx2/R3000A.h =================================================================== --- pcsx2/R3000A.h (revision 3603) +++ pcsx2/R3000A.h (working copy) @@ -108,6 +108,7 @@ u32 pc; /* Program counter */ u32 code; /* The instruction */ u32 cycle; + u32 cyclefrac; u32 interrupt; u32 sCycle[32]; // start cycle for signaled ints s32 eCycle[32]; // cycle delta for signaled ints (sCycle + eCycle == branch cycle) Index: pcsx2/x86/iR3000A.cpp =================================================================== --- pcsx2/x86/iR3000A.cpp (revision 3603) +++ pcsx2/x86/iR3000A.cpp (working copy) @@ -1043,15 +1043,18 @@ } else { - xMOV(eax, ptr32[&psxRegs.cycle]); - xADD(eax, blockCycles); - xMOV(ptr32[&psxRegs.cycle], eax); // update cycles + xADD(ptr32[&psxRegs.cyclefrac], blockCycles); + xMOV(eax, ptr32[&psxRegs.cyclefrac]); + xSHR(eax, 3); + xADD(ptr32[&psxRegs.cycle], eax); // update cycles + xAND(ptr32[&psxRegs.cyclefrac], 7); // jump if psxCycleEE <= 0 (iop's timeslice timed out, so time to return control to the EE) - xSUB(ptr32[&psxCycleEE], blockCycles*8); + xSUB(ptr32[&psxCycleEE], blockCycles*1); xJLE(iopExitRecompiledCode); // check if an event is pending + xMOV(eax, ptr32[&psxRegs.cycle]); xSUB(eax, ptr32[&g_psxNextBranchCycle]); xForwardJS nointerruptpending;