mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #90 from tmaul/master
Update sceRtcSetTick based on test cases
This commit is contained in:
commit
ec25bfc9a4
2 changed files with 729 additions and 645 deletions
|
@ -68,6 +68,86 @@ void __RtcTmToPspTime(ScePspDateTime &t, tm *val)
|
|||
t.second = val->tm_sec;
|
||||
}
|
||||
|
||||
//based on http://stackoverflow.com/a/11197532
|
||||
void __RtcTicksToPspTime(ScePspDateTime &t, u64 ticks)
|
||||
{
|
||||
u64 sec;
|
||||
u16 quadricentennials, centennials, quadrennials, annuals/*1-ennial?*/;
|
||||
u16 year, leap;
|
||||
u16 yday, hour, min;
|
||||
u16 month, mday, wday;
|
||||
static const u16 daysSinceJan1st[2][13]=
|
||||
{
|
||||
{0,31,59,90,120,151,181,212,243,273,304,334,365}, // 365 days, non-leap
|
||||
{0,31,60,91,121,152,182,213,244,274,305,335,366} // 366 days, leap
|
||||
};
|
||||
sec = ticks / 1000000UL;
|
||||
wday = (u16)((sec / 86400 + 1) % 7); // day of week
|
||||
|
||||
// Remove multiples of 400 years (incl. 97 leap days)
|
||||
quadricentennials = (u16)(sec / 12622780800ULL); // 400*365.2425*24*3600
|
||||
sec %= 12622780800ULL;
|
||||
|
||||
// Remove multiples of 100 years (incl. 24 leap days), can't be more than 3
|
||||
// (because multiples of 4*100=400 years (incl. leap days) have been removed)
|
||||
centennials = (u16)(sec / 3155673600ULL); // 100*(365+24/100)*24*3600
|
||||
if (centennials > 3)
|
||||
{
|
||||
centennials = 3;
|
||||
}
|
||||
sec -= centennials * 3155673600ULL;
|
||||
|
||||
// Remove multiples of 4 years (incl. 1 leap day), can't be more than 24
|
||||
// (because multiples of 25*4=100 years (incl. leap days) have been removed)
|
||||
quadrennials = (u16)(sec / 126230400); // 4*(365+1/4)*24*3600
|
||||
if (quadrennials > 24)
|
||||
{
|
||||
quadrennials = 24;
|
||||
}
|
||||
sec -= quadrennials * 126230400ULL;
|
||||
|
||||
// Remove multiples of years (incl. 0 leap days), can't be more than 3
|
||||
// (because multiples of 4 years (incl. leap days) have been removed)
|
||||
annuals = (u16)(sec / 31536000); // 365*24*3600
|
||||
if (annuals > 3)
|
||||
{
|
||||
annuals = 3;
|
||||
}
|
||||
sec -= annuals * 31536000ULL;
|
||||
|
||||
// Calculate the year and find out if it's leap
|
||||
year = 1 + quadricentennials * 400 + centennials * 100 + quadrennials * 4 + annuals;
|
||||
leap = !(year % 4) && (year % 100 || !(year % 400));
|
||||
|
||||
// Calculate the day of the year and the time
|
||||
yday = sec / 86400;
|
||||
sec %= 86400;
|
||||
hour = sec / 3600;
|
||||
sec %= 3600;
|
||||
min = sec / 60;
|
||||
sec %= 60;
|
||||
|
||||
// Calculate the month
|
||||
for (mday = month = 1; month < 13; month++)
|
||||
{
|
||||
if (yday < daysSinceJan1st[leap][month])
|
||||
{
|
||||
mday += yday - daysSinceJan1st[leap][month - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
t.year = year;
|
||||
t.month = month;
|
||||
t.day = mday;
|
||||
t.hour = hour;
|
||||
t.minute = min;
|
||||
t.second = sec;
|
||||
t.microsecond = ticks % 1000000;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool __RtcValidatePspTime(ScePspDateTime &t)
|
||||
{
|
||||
return t.year > 0;
|
||||
|
@ -140,13 +220,13 @@ u32 sceRtcGetCurrentClockLocalTime(u32 pspTimePtr)
|
|||
|
||||
u32 sceRtcSetTick(u32 pspTimePtr, u32 tickPtr)
|
||||
{
|
||||
DEBUG_LOG(HLE, "HACK sceRtcSetTick(%08x, %08x)", pspTimePtr, tickPtr);
|
||||
DEBUG_LOG(HLE, "sceRtcSetTick(%08x, %08x)", pspTimePtr, tickPtr);
|
||||
if (Memory::IsValidAddress(pspTimePtr) && Memory::IsValidAddress(tickPtr))
|
||||
{
|
||||
time_t sec = (time_t)Memory::Read_U64(tickPtr);
|
||||
tm *local = localtime(&sec);
|
||||
u64 ticks = Memory::Read_U64(tickPtr);
|
||||
|
||||
ScePspDateTime ret;
|
||||
__RtcTmToPspTime(ret, local);
|
||||
__RtcTicksToPspTime(ret, ticks);
|
||||
Memory::WriteStruct(pspTimePtr, &ret);
|
||||
}
|
||||
return 0;
|
||||
|
@ -273,4 +353,3 @@ void Register_sceRtc()
|
|||
{
|
||||
RegisterModule("sceRtc", ARRAY_SIZE(sceRtc), sceRtc);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,10 +35,11 @@
|
|||
/* ------------------------- KEY VAULT ------------------------- */
|
||||
|
||||
u8 kirk1_key[] = {0x98, 0xC9, 0x40, 0x97, 0x5C, 0x1D, 0x10, 0xE8, 0x7F, 0xE6, 0x0E, 0xA3, 0xFD, 0x03, 0xA8, 0xBA};
|
||||
|
||||
u8 kirk7_key02[] = {0xB8, 0x13, 0xC3, 0x5E, 0xC6, 0x44, 0x41, 0xE3, 0xDC, 0x3C, 0x16, 0xF5, 0xB4, 0x5E, 0x64, 0x84}; // New from PS3
|
||||
u8 kirk7_key03[] = {0x98, 0x02, 0xC4, 0xE6, 0xEC, 0x9E, 0x9E, 0x2F, 0xFC, 0x63, 0x4C, 0xE4, 0x2F, 0xBB, 0x46, 0x68};
|
||||
u8 kirk7_key04[] = {0x99, 0x24, 0x4C, 0xD2, 0x58, 0xF5, 0x1B, 0xCB, 0xB0, 0x61, 0x9C, 0xA7, 0x38, 0x30, 0x07, 0x5F};
|
||||
u8 kirk7_key05[] = {0x02, 0x25, 0xD7, 0xBA, 0x63, 0xEC, 0xB9, 0x4A, 0x9D, 0x23, 0x76, 0x01, 0xB3, 0xF6, 0xAC, 0x17};
|
||||
u8 kirk7_key07[] = {0x76, 0x36, 0x8B, 0x43, 0x8F, 0x77, 0xD8, 0x7E, 0xFE, 0x5F, 0xB6, 0x11, 0x59, 0x39, 0x88, 0x5C}; // New from PS3
|
||||
u8 kirk7_key0C[] = {0x84, 0x85, 0xC8, 0x48, 0x75, 0x08, 0x43, 0xBC, 0x9B, 0x9A, 0xEC, 0xA7, 0x9C, 0x7F, 0x60, 0x18};
|
||||
u8 kirk7_key0D[] = {0xB5, 0xB1, 0x6E, 0xDE, 0x23, 0xA9, 0x7B, 0x0E, 0xA1, 0x7C, 0xDB, 0xA2, 0xDC, 0xDE, 0xC4, 0x6E};
|
||||
u8 kirk7_key0E[] = {0xC8, 0x71, 0xFD, 0xB3, 0xBC, 0xC5, 0xD2, 0xF2, 0xE2, 0xD7, 0x72, 0x9D, 0xDF, 0x82, 0x68, 0x82};
|
||||
|
@ -49,6 +50,7 @@ u8 kirk7_key12[] = {0x5D, 0xC7, 0x11, 0x39, 0xD0, 0x19, 0x38, 0xBC, 0x02, 0x7F,
|
|||
u8 kirk7_key38[] = {0x12, 0x46, 0x8D, 0x7E, 0x1C, 0x42, 0x20, 0x9B, 0xBA, 0x54, 0x26, 0x83, 0x5E, 0xB0, 0x33, 0x03};
|
||||
u8 kirk7_key39[] = {0xC4, 0x3B, 0xB6, 0xD6, 0x53, 0xEE, 0x67, 0x49, 0x3E, 0xA9, 0x5F, 0xBC, 0x0C, 0xED, 0x6F, 0x8A};
|
||||
u8 kirk7_key3A[] = {0x2C, 0xC3, 0xCF, 0x8C, 0x28, 0x78, 0xA5, 0xA6, 0x63, 0xE2, 0xAF, 0x2D, 0x71, 0x5E, 0x86, 0xBA};
|
||||
u8 kirk7_key44[] = {0x7D, 0xF4, 0x92, 0x65, 0xE3, 0xFA, 0xD6, 0x78, 0xD6, 0xFE, 0x78, 0xAD, 0xBB, 0x3D, 0xFB, 0x63}; // New from PS3
|
||||
u8 kirk7_key4B[] = {0x0C, 0xFD, 0x67, 0x9A, 0xF9, 0xB4, 0x72, 0x4F, 0xD7, 0x8D, 0xD6, 0xE9, 0x96, 0x42, 0x28, 0x8B}; //1.xx game eboot.bin
|
||||
u8 kirk7_key53[] = {0xAF, 0xFE, 0x8E, 0xB1, 0x3D, 0xD1, 0x7E, 0xD8, 0x0A, 0x61, 0x24, 0x1C, 0x95, 0x92, 0x56, 0xB6};
|
||||
u8 kirk7_key57[] = {0x1C, 0x9B, 0xC4, 0x90, 0xE3, 0x06, 0x64, 0x81, 0xFA, 0x59, 0xFD, 0xB6, 0x00, 0xBB, 0x28, 0x70};
|
||||
|
@ -328,7 +330,7 @@ int kirk_CMD14(u8 * outbuff, int outsize) {
|
|||
|
||||
memcpy(temp+4, PRNG_DATA,0x14);
|
||||
// This uses the standard C time function for portability.
|
||||
curtime=time(0);
|
||||
curtime=(u32)time(0);
|
||||
temp[0x18] = curtime &0xFF;
|
||||
temp[0x19] = (curtime>>8) &0xFF;
|
||||
temp[0x1A] = (curtime>>16) &0xFF;
|
||||
|
@ -558,7 +560,7 @@ int kirk_init2(u8 * rnd_seed, u32 seed_size, u32 fuseid_90, u32 fuseid_94) {
|
|||
}
|
||||
memcpy(temp+4, PRNG_DATA,0x14);
|
||||
// This uses the standard C time function for portability.
|
||||
curtime=time(0);
|
||||
curtime=(u32)time(0);
|
||||
temp[0x18] = curtime &0xFF;
|
||||
temp[0x19] = (curtime>>8) &0xFF;
|
||||
temp[0x1A] = (curtime>>16) &0xFF;
|
||||
|
@ -584,9 +586,11 @@ u8* kirk_4_7_get_key(int key_type)
|
|||
{
|
||||
switch(key_type)
|
||||
{
|
||||
case(0x02): return kirk7_key02; break;
|
||||
case(0x03): return kirk7_key03; break;
|
||||
case(0x04): return kirk7_key04; break;
|
||||
case(0x05): return kirk7_key05; break;
|
||||
case(0x07): return kirk7_key07; break;
|
||||
case(0x0C): return kirk7_key0C; break;
|
||||
case(0x0D): return kirk7_key0D; break;
|
||||
case(0x0E): return kirk7_key0E; break;
|
||||
|
@ -597,6 +601,7 @@ u8* kirk_4_7_get_key(int key_type)
|
|||
case(0x38): return kirk7_key38; break;
|
||||
case(0x39): return kirk7_key39; break;
|
||||
case(0x3A): return kirk7_key3A; break;
|
||||
case(0x44): return kirk7_key44; break;
|
||||
case(0x4B): return kirk7_key4B; break;
|
||||
case(0x53): return kirk7_key53; break;
|
||||
case(0x57): return kirk7_key57; break;
|
||||
|
|
Loading…
Add table
Reference in a new issue