Vita: Work around broken mktime implementation in Vita SDK (fixes #2876)

This commit is contained in:
Vicki Pfau 2023-04-12 03:33:39 -07:00
parent 1b85fb3de5
commit e8ef801a3e
3 changed files with 42 additions and 1 deletions

View File

@ -33,6 +33,7 @@ Other fixes:
- Scripting: Fix receiving packets for client sockets - Scripting: Fix receiving packets for client sockets
- Scripting: Fix empty receive calls returning unknown error on Windows - Scripting: Fix empty receive calls returning unknown error on Windows
- Scripting: Return proper callback ID from socket.add - Scripting: Return proper callback ID from socket.add
- Vita: Work around broken mktime implementation in Vita SDK (fixes mgba.io/i/2876)
Misc: Misc:
- Core: Handle relative paths for saves, screenshots, etc consistently (fixes mgba.io/i/2826) - Core: Handle relative paths for saves, screenshots, etc consistently (fixes mgba.io/i/2826)
- GB Serialize: Add missing savestate support for MBC6 and NT (newer) - GB Serialize: Add missing savestate support for MBC6 and NT (newer)

View File

@ -13,6 +13,10 @@
#include <mgba-util/memory.h> #include <mgba-util/memory.h>
#include <mgba-util/vfs.h> #include <mgba-util/vfs.h>
#ifdef PSP2
#include <psp2/rtc.h>
#endif
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
@ -637,6 +641,9 @@ void GBASavedataRTCRead(struct GBASavedata* savedata) {
} }
LOAD_64LE(savedata->gpio->rtc.lastLatch, 0, &buffer.lastLatch); LOAD_64LE(savedata->gpio->rtc.lastLatch, 0, &buffer.lastLatch);
time_t rtcTime;
#ifndef PSP2
struct tm date; struct tm date;
date.tm_year = _unBCD(savedata->gpio->rtc.time[0]) + 100; date.tm_year = _unBCD(savedata->gpio->rtc.time[0]) + 100;
date.tm_mon = _unBCD(savedata->gpio->rtc.time[1]) - 1; date.tm_mon = _unBCD(savedata->gpio->rtc.time[1]) - 1;
@ -645,8 +652,40 @@ void GBASavedataRTCRead(struct GBASavedata* savedata) {
date.tm_min = _unBCD(savedata->gpio->rtc.time[5]); date.tm_min = _unBCD(savedata->gpio->rtc.time[5]);
date.tm_sec = _unBCD(savedata->gpio->rtc.time[6]); date.tm_sec = _unBCD(savedata->gpio->rtc.time[6]);
date.tm_isdst = -1; date.tm_isdst = -1;
rtcTime = mktime(&date);
#else
struct SceDateTime date;
date.year = _unBCD(savedata->gpio->rtc.time[0]) + 2000;
date.month = _unBCD(savedata->gpio->rtc.time[1]);
date.day = _unBCD(savedata->gpio->rtc.time[2]);
date.hour = _unBCD(savedata->gpio->rtc.time[4]);
date.minute = _unBCD(savedata->gpio->rtc.time[5]);
date.second = _unBCD(savedata->gpio->rtc.time[6]);
date.microsecond = 0;
savedata->gpio->rtc.offset = savedata->gpio->rtc.lastLatch - mktime(&date); struct SceRtcTick tick;
int res;
res = sceRtcConvertDateTimeToTick(&date, &tick);
if (res < 0) {
mLOG(GBA_SAVE, ERROR, "sceRtcConvertDateTimeToTick %lx", res);
}
res = sceRtcConvertLocalTimeToUtc(&tick, &tick);
if (res < 0) {
mLOG(GBA_SAVE, ERROR, "sceRtcConvertUtcToLocalTime %lx", res);
}
res = sceRtcConvertTickToDateTime(&tick, &date);
if (res < 0) {
mLOG(GBA_SAVE, ERROR, "sceRtcConvertTickToDateTime %lx", res);
}
res = sceRtcConvertDateTimeToTime_t(&date, &rtcTime);
if (res < 0) {
mLOG(GBA_SAVE, ERROR, "sceRtcConvertDateTimeToTime_t %lx", res);
}
#endif
savedata->gpio->rtc.offset = savedata->gpio->rtc.lastLatch - rtcTime;
mLOG(GBA_SAVE, ERROR, "Savegame time offset set to %li", savedata->gpio->rtc.offset);
} }
void GBASavedataSerialize(const struct GBASavedata* savedata, struct GBASerializedState* state) { void GBASavedataSerialize(const struct GBASavedata* savedata, struct GBASerializedState* state) {

View File

@ -28,6 +28,7 @@ set(OS_LIB -lvita2d -l${M_LIBRARY}
-lScePgf_stub -lScePgf_stub
-lScePhotoExport_stub -lScePhotoExport_stub
-lScePower_stub -lScePower_stub
-lSceRtc_stub
-lSceSysmodule_stub -lSceSysmodule_stub
-lSceTouch_stub) -lSceTouch_stub)
set(OS_LIB ${OS_LIB} PARENT_SCOPE) set(OS_LIB ${OS_LIB} PARENT_SCOPE)