From 1c156784b65d0a4bc6cfee33767b9fc851b2ba69 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 2 Jan 2013 01:09:44 -0800 Subject: [PATCH] Be more deterministic about the time. This way, if a state is loaded, the game doesn't know. Also, if the host is slow/sped up, it won't get out of sync. --- Core/HLE/sceKernel.cpp | 2 ++ Core/HLE/sceKernelTime.cpp | 27 ++++++++++++++++++++++----- Core/HLE/sceKernelTime.h | 3 +++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index ad62a01ae..5ec631327 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -79,6 +79,7 @@ void __KernelInit() } SaveState::Init(); + __KernelTimeInit(); __InterruptsInit(); __KernelMemoryInit(); __KernelThreadingInit(); @@ -154,6 +155,7 @@ void __KernelDoState(PointerWrap &p) __KernelModuleDoState(p); __KernelMutexDoState(p); __KernelSemaDoState(p); + __KernelTimeDoState(p); __AudioDoState(p); __CtrlDoState(p); diff --git a/Core/HLE/sceKernelTime.cpp b/Core/HLE/sceKernelTime.cpp index 54b8873f9..e5cb09a9f 100644 --- a/Core/HLE/sceKernelTime.cpp +++ b/Core/HLE/sceKernelTime.cpp @@ -30,10 +30,28 @@ #include "../CoreTiming.h" +////////////////////////////////////////////////////////////////////////// +// State +////////////////////////////////////////////////////////////////////////// + +// The time when the game started. +time_t start_time; + ////////////////////////////////////////////////////////////////////////// // Other clock stuff ////////////////////////////////////////////////////////////////////////// +void __KernelTimeInit() +{ + time(&start_time); +} + +void __KernelTimeDoState(PointerWrap &p) +{ + p.Do(start_time); + p.DoMarker("sceKernelTime"); +} + struct SceKernelSysClock { u32 lo; @@ -114,17 +132,16 @@ u32 sceKernelLibcClock() u32 sceKernelLibcTime(u32 outPtr) { - time_t t; - time(&t); + u32 t = (u32) start_time + (u32) (CoreTiming::GetTicks() / CPU_HZ); - DEBUG_LOG(HLE, "%i = sceKernelLibcTime(%08X)", (u32) t, outPtr); + DEBUG_LOG(HLE, "%i = sceKernelLibcTime(%08X)", t, outPtr); if (Memory::IsValidAddress(outPtr)) - Memory::Write_U32((u32) t, outPtr); + Memory::Write_U32(t, outPtr); else if (outPtr != 0) return 0; - return (u32) t; + return t; } void sceKernelLibcGettimeofday() diff --git a/Core/HLE/sceKernelTime.h b/Core/HLE/sceKernelTime.h index f615782c2..4ab8e59ec 100644 --- a/Core/HLE/sceKernelTime.h +++ b/Core/HLE/sceKernelTime.h @@ -27,3 +27,6 @@ void sceKernelSysClock2USec(); void sceKernelSysClock2USecWide(); u32 sceKernelUSec2SysClockWide(u32 usec); u32 sceKernelLibcClock(); + +void __KernelTimeInit(); +void __KernelTimeDoState(PointerWrap &p);