diff --git a/Core/HLE/sceKernelTime.cpp b/Core/HLE/sceKernelTime.cpp index ba1fc75ea2..072d7ede7e 100644 --- a/Core/HLE/sceKernelTime.cpp +++ b/Core/HLE/sceKernelTime.cpp @@ -62,7 +62,8 @@ struct SceKernelSysClock int sceKernelGetSystemTime(u32 sysclockPtr) { u64 t = CoreTiming::GetTicks() / CoreTiming::GetClockFrequencyMHz(); - Memory::Write_U64(t, sysclockPtr); + if (Memory::IsValidAddress(sysclockPtr)) + Memory::Write_U64(t, sysclockPtr); DEBUG_LOG(HLE, "sceKernelGetSystemTime(out:%16llx)", t); hleEatCycles(2 * 222); return 0; @@ -72,7 +73,7 @@ u32 sceKernelGetSystemTimeLow() { // This clock should tick at 1 Mhz. u64 t = CoreTiming::GetTicks() / CoreTiming::GetClockFrequencyMHz(); - // DEBUG_LOG(HLE,"%08x=sceKernelGetSystemTimeLow()",(u32)t); + VERBOSE_LOG(HLE,"%08x=sceKernelGetSystemTimeLow()",(u32)t); return (u32)t; } @@ -83,19 +84,19 @@ u64 sceKernelGetSystemTimeWide() return t; } -int sceKernelUSec2SysClock(u32 microsec, u32 clockPtr) +int sceKernelUSec2SysClock(u32 usec, u32 clockPtr) { - u32 microseconds = microsec; - SceKernelSysClock *clock = (SceKernelSysClock*)Memory::GetPointer(clockPtr); - clock->lo = microseconds; //TODO: fix - DEBUG_LOG(HLE,"sceKernelUSec2SysClock(%i, %08x )",microsec,clockPtr); + DEBUG_LOG(HLE,"sceKernelUSec2SysClock(%i, %08x )", usec, clockPtr); + if (Memory::IsValidAddress(clockPtr)) + Memory::Write_U32((usec & 0xFFFFFFFFL), clockPtr); + hleEatCycles(2 * 222); return 0; } u64 sceKernelUSec2SysClockWide(u32 usec) { DEBUG_LOG(HLE, "sceKernelUSec2SysClockWide(%i)", usec); - return usec; // ? + return usec; } int sceKernelSysClock2USec(u32 sysclockPtr, u32 highPtr, u32 lowPtr) @@ -114,12 +115,15 @@ int sceKernelSysClock2USec(u32 sysclockPtr, u32 highPtr, u32 lowPtr) int sceKernelSysClock2USecWide(u32 lowClock, u32 highClock, u32 lowPtr, u32 highPtr) { - u64 clock = lowClock | ((u64)highClock << 32); + u64 sysClock = lowClock | ((u64)highClock << 32); DEBUG_LOG(HLE, "sceKernelSysClock2USecWide(clock = %llu, lo = %08x, hi = %08x)", clock, lowPtr, highPtr); - if (Memory::IsValidAddress(lowPtr)) - Memory::Write_U32((u32)(clock / 1000000), lowPtr); - if (Memory::IsValidAddress(highPtr)) - Memory::Write_U32((u32)(clock % 1000000), highPtr); + if (Memory::IsValidAddress(lowPtr)) { + Memory::Write_U32((u32)(sysClock / 1000000), lowPtr); + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32((u32)(sysClock % 1000000), highPtr); + } else + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32((int) sysClock, highPtr); return 0; }