From bf826ed9c13d0d993c1569ba6430fb98b4397bec Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 4 May 2013 23:18:13 -0700 Subject: [PATCH] Correct delay for sceKernelDelayThread(0). It's not 200 for 0, more like 100ish. --- Core/HLE/sceKernelThread.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 76a6ec552f..9cafe8523f 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2197,24 +2197,32 @@ void sceKernelChangeThreadPriority() } } +s64 __KernelDelayThreadUs(u64 usec) +{ + // Seems to very based on clockrate / other things, but 0 delays less than 200us for sure. + if (usec == 0) + return 100; + else if (usec < 200) + return 200; + return usec; +} + int sceKernelDelayThreadCB(u32 usec) { - if (usec < 200) usec = 200; DEBUG_LOG(HLE,"sceKernelDelayThreadCB(%i usec)",usec); SceUID curThread = __KernelGetCurThread(); - __KernelScheduleWakeup(curThread, usec); + __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed"); return 0; } int sceKernelDelayThread(u32 usec) { - if (usec < 200) usec = 200; DEBUG_LOG(HLE,"sceKernelDelayThread(%i usec)",usec); SceUID curThread = __KernelGetCurThread(); - __KernelScheduleWakeup(curThread, usec); + __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed"); return 0; } @@ -2232,11 +2240,10 @@ void sceKernelDelaySysClockThreadCB() // TODO: Which unit? u64 usec = sysclock.lo | ((u64)sysclock.hi << 32); - if (usec < 200) usec = 200; DEBUG_LOG(HLE, "sceKernelDelaySysClockThread(%08x (%llu))", sysclockAddr, usec); SceUID curThread = __KernelGetCurThread(); - __KernelScheduleWakeup(curThread, usec); + __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed"); } @@ -2253,11 +2260,10 @@ void sceKernelDelaySysClockThread() // TODO: Which unit? u64 usec = sysclock.lo | ((u64)sysclock.hi << 32); - if (usec < 200) usec = 200; DEBUG_LOG(HLE, "sceKernelDelaySysClockThread(%08x (%llu))", sysclockAddr, usec); SceUID curThread = __KernelGetCurThread(); - __KernelScheduleWakeup(curThread, usec); + __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed"); }