void __startVTimer(VTimer *vt) { vt->nvt.active = 1; vt->nvt.base = cyclesToUs(CoreTiming::GetTicks()); if (vt->nvt.schedule != 0 && vt->nvt.handlerAddr != 0) __KernelScheduleVTimer(vt, vt->nvt.schedule); }
u32 sceKernelSetVTimerHandler(u32 uid, u32 scheduleAddr, u32 handlerFuncAddr, u32 commonAddr) { if (uid == 0) { WARN_LOG(HLE, "sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x): invalid vtimer", uid, scheduleAddr, handlerFuncAddr, commonAddr); return SCE_KERNEL_ERROR_ILLEGAL_VTID; } u32 error; VTimer *vt = kernelObjects.Get<VTimer>(uid, error); if (error) { WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x)", error, uid, scheduleAddr, handlerFuncAddr, commonAddr); return error; } DEBUG_LOG(HLE, "sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x)", uid, scheduleAddr, handlerFuncAddr, commonAddr); u64 schedule = Memory::Read_U64(scheduleAddr); vt->nvt.handlerAddr = handlerFuncAddr; if (handlerFuncAddr) vt->nvt.commonAddr = commonAddr; __KernelScheduleVTimer(vt, schedule); return 0; }
void __rescheduleVTimer(SceUID id, int delay) { u32 error; VTimer *vt = kernelObjects.Get<VTimer>(id, error); if (error) return; if (delay < 0) delay = 100; __KernelScheduleVTimer(vt, delay); }
void __rescheduleVTimer(SceUID id, u32 delay) { u32 error; VTimer *vt = kernelObjects.Get<VTimer>(id, error); if (error) return; if (delay < 0) delay = 100; vt->nvt.schedule += delay; __KernelScheduleVTimer(vt, vt->nvt.schedule); }
u32 sceKernelSetVTimerHandlerWide(u32 uid, u64 schedule, u32 handlerFuncAddr, u32 commonAddr) { DEBUG_LOG(HLE, "sceKernelSetVTimerHandlerWide(%08x, %llu, %08x, %08x)", uid, schedule, handlerFuncAddr, commonAddr); u32 error; VTimer *vt = kernelObjects.Get<VTimer>(uid, error); if (error) { WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandlerWide(%08x, %llu, %08x, %08x)", error, uid, schedule, handlerFuncAddr, commonAddr); return error; } vt->nvt.handlerAddr = handlerFuncAddr; vt->nvt.commonAddr = commonAddr; __KernelScheduleVTimer(vt, schedule); return 0; }