From c6087ea3db4d2dee4502ab18c0e661432538141d Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 31 Mar 2013 00:51:34 +0800 Subject: [PATCH 1/3] Improve few sceKernel clock functions --- Core/HLE/sceKernelTime.cpp | 45 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Core/HLE/sceKernelTime.cpp b/Core/HLE/sceKernelTime.cpp index ba1fc75ea2..6bc571ca32 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,8 +73,8 @@ u32 sceKernelGetSystemTimeLow() { // This clock should tick at 1 Mhz. u64 t = CoreTiming::GetTicks() / CoreTiming::GetClockFrequencyMHz(); - // DEBUG_LOG(HLE,"%08x=sceKernelGetSystemTimeLow()",(u32)t); - return (u32)t; + DEBUG_LOG(HLE,"%08x=sceKernelGetSystemTimeLow()",(u32)t); + return (u32)(t & 0xFFFFFFFFL); } u64 sceKernelGetSystemTimeWide() @@ -83,43 +84,43 @@ 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 & 0xFFFFFFFFL); } -int sceKernelSysClock2USec(u32 sysclockPtr, u32 highPtr, u32 lowPtr) +int sceKernelSysClock2USec(u32 sysclockPtr, u32 lowPtr, u32 highPtr) { DEBUG_LOG(HLE, "sceKernelSysClock2USec(clock = %08x, lo = %08x, hi = %08x)", sysclockPtr, highPtr, lowPtr); - u64 time = Memory::Read_U64(sysclockPtr); - u32 highResult = (u32)(time / 1000000); - u32 lowResult = (u32)(time % 1000000); - if (Memory::IsValidAddress(highPtr)) - Memory::Write_U32(highResult, highPtr); - if (Memory::IsValidAddress(lowPtr)) - Memory::Write_U32(lowResult, lowPtr); + u64 sysClock = Memory::Read_U64(sysclockPtr); + if (Memory::IsValidAddress(lowPtr)) { + Memory::Write_U32((u32)(sysClock / 1000000), lowPtr); + Memory::Write_U32((u32)(sysClock % 1000000), highPtr); + } else + Memory::Write_U32((int) sysClock, highPtr); hleEatCycles(2 * 222); return 0; } 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); + Memory::Write_U32((u32)(sysClock % 1000000), highPtr); + } else + Memory::Write_U32((int) sysClock, highPtr); return 0; } From 7b01828ef0f1b69470961d3c7e4a8d8c3709e598 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 31 Mar 2013 01:08:23 +0800 Subject: [PATCH 2/3] Quick fix --- Core/HLE/sceKernelTime.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Core/HLE/sceKernelTime.cpp b/Core/HLE/sceKernelTime.cpp index 6bc571ca32..9090adf2ed 100644 --- a/Core/HLE/sceKernelTime.cpp +++ b/Core/HLE/sceKernelTime.cpp @@ -73,8 +73,8 @@ u32 sceKernelGetSystemTimeLow() { // This clock should tick at 1 Mhz. u64 t = CoreTiming::GetTicks() / CoreTiming::GetClockFrequencyMHz(); - DEBUG_LOG(HLE,"%08x=sceKernelGetSystemTimeLow()",(u32)t); - return (u32)(t & 0xFFFFFFFFL); + VERBOSE_LOG(HLE,"%08x=sceKernelGetSystemTimeLow()",(u32)t); + return (u32)t; } u64 sceKernelGetSystemTimeWide() @@ -96,7 +96,7 @@ int sceKernelUSec2SysClock(u32 usec, u32 clockPtr) u64 sceKernelUSec2SysClockWide(u32 usec) { DEBUG_LOG(HLE, "sceKernelUSec2SysClockWide(%i)", usec); - return (usec & 0xFFFFFFFFL); + return usec; } int sceKernelSysClock2USec(u32 sysclockPtr, u32 lowPtr, u32 highPtr) @@ -105,9 +105,11 @@ int sceKernelSysClock2USec(u32 sysclockPtr, u32 lowPtr, u32 highPtr) u64 sysClock = Memory::Read_U64(sysclockPtr); if (Memory::IsValidAddress(lowPtr)) { Memory::Write_U32((u32)(sysClock / 1000000), lowPtr); - Memory::Write_U32((u32)(sysClock % 1000000), highPtr); + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32((u32)(sysClock % 1000000), highPtr); } else - Memory::Write_U32((int) sysClock, highPtr); + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32((int) sysClock, highPtr); hleEatCycles(2 * 222); return 0; } @@ -118,9 +120,11 @@ int sceKernelSysClock2USecWide(u32 lowClock, u32 highClock, u32 lowPtr, u32 high DEBUG_LOG(HLE, "sceKernelSysClock2USecWide(clock = %llu, lo = %08x, hi = %08x)", clock, lowPtr, highPtr); if (Memory::IsValidAddress(lowPtr)) { Memory::Write_U32((u32)(sysClock / 1000000), lowPtr); - Memory::Write_U32((u32)(sysClock % 1000000), highPtr); + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32((u32)(sysClock % 1000000), highPtr); } else - Memory::Write_U32((int) sysClock, highPtr); + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32((int) sysClock, highPtr); return 0; } From bd413d4caf6705f2b5df8f90b7d04d6e9ec032a7 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 31 Mar 2013 18:09:27 +0800 Subject: [PATCH 3/3] Revert sceKernelSysClock2USec() --- Core/HLE/sceKernelTime.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceKernelTime.cpp b/Core/HLE/sceKernelTime.cpp index 9090adf2ed..072d7ede7e 100644 --- a/Core/HLE/sceKernelTime.cpp +++ b/Core/HLE/sceKernelTime.cpp @@ -99,17 +99,16 @@ u64 sceKernelUSec2SysClockWide(u32 usec) return usec; } -int sceKernelSysClock2USec(u32 sysclockPtr, u32 lowPtr, u32 highPtr) +int sceKernelSysClock2USec(u32 sysclockPtr, u32 highPtr, u32 lowPtr) { DEBUG_LOG(HLE, "sceKernelSysClock2USec(clock = %08x, lo = %08x, hi = %08x)", sysclockPtr, highPtr, lowPtr); - u64 sysClock = Memory::Read_U64(sysclockPtr); - 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); + u64 time = Memory::Read_U64(sysclockPtr); + u32 highResult = (u32)(time / 1000000); + u32 lowResult = (u32)(time % 1000000); + if (Memory::IsValidAddress(highPtr)) + Memory::Write_U32(highResult, highPtr); + if (Memory::IsValidAddress(lowPtr)) + Memory::Write_U32(lowResult, lowPtr); hleEatCycles(2 * 222); return 0; }