u32 sceRtcGetCurrentClock(u32 pspTimePtr, int tz) { DEBUG_LOG(HLE, "sceRtcGetCurrentClock(%08x, %d)", pspTimePtr, tz); PSPTimeval tv; __RtcTimeOfDay(&tv); time_t sec = (time_t) tv.tv_sec; tm *utc = gmtime(&sec); if (!utc) { ERROR_LOG(HLE, "Date is too high/low to handle, pretending to work."); return 0; } utc->tm_isdst = -1; utc->tm_min += tz; rtc_timegm(utc); // Return gmt time with timezone offset. ScePspDateTime ret; __RtcTmToPspTime(ret, utc); ret.microsecond = tv.tv_usec; if (Memory::IsValidAddress(pspTimePtr)) Memory::WriteStruct(pspTimePtr, &ret); hleEatCycles(1900); return 0; }
u64 __RtcPspTimeToTicks(ScePspDateTime &pt) { tm local; local.tm_year = pt.year - 1900; local.tm_mon = pt.month - 1; local.tm_mday = pt.day; local.tm_wday = -1; local.tm_yday = -1; local.tm_hour = pt.hour; local.tm_min = pt.minute; local.tm_sec = pt.second; local.tm_isdst = 0; time_t seconds = rtc_timegm(&local); u64 result = rtcMagicOffset + (u64) seconds * 1000000ULL; result += pt.microsecond; return result; }
static u64 __RtcPspTimeToTicks(const ScePspDateTime &pt) { tm local; __RtcPspTimeToTm(local, pt); s64 tickOffset = 0; while (local.tm_year < 70) { tickOffset -= rtc400YearTicks; local.tm_year += 400; } while (local.tm_year >= 470) { tickOffset += rtc400YearTicks; local.tm_year -= 400; } time_t seconds = rtc_timegm(&local); u64 result = rtcMagicOffset + (u64) seconds * 1000000ULL; result += pt.microsecond; return result + tickOffset; }