GBA Savedata: Fix RTC writing invalidating save mapping

This commit is contained in:
Vicki Pfau 2022-10-08 16:04:50 -07:00
parent 7982de2a4c
commit 225369f2b6
1 changed files with 12 additions and 3 deletions

View File

@ -585,7 +585,7 @@ void GBASavedataClean(struct GBASavedata* savedata, uint32_t frameCount) {
} }
void GBASavedataRTCWrite(struct GBASavedata* savedata) { void GBASavedataRTCWrite(struct GBASavedata* savedata) {
if (!(savedata->gpio->devices & HW_RTC) || !savedata->vf) { if (!(savedata->gpio->devices & HW_RTC) || !savedata->vf || savedata->mapMode == MAP_READ) {
return; return;
} }
@ -595,9 +595,18 @@ void GBASavedataRTCWrite(struct GBASavedata* savedata) {
buffer.control = savedata->gpio->rtc.control; buffer.control = savedata->gpio->rtc.control;
STORE_64LE(savedata->gpio->rtc.lastLatch, 0, &buffer.lastLatch); STORE_64LE(savedata->gpio->rtc.lastLatch, 0, &buffer.lastLatch);
size_t size = GBASavedataSize(savedata) & ~0xFF; size_t size = GBASavedataSize(savedata);
savedata->vf->seek(savedata->vf, size, SEEK_SET); savedata->vf->seek(savedata->vf, size & ~0xFF, SEEK_SET);
if ((savedata->vf->size(savedata->vf) & 0xFF) != sizeof(buffer)) {
// Writing past the end of the file can invalidate the file mapping
savedata->vf->unmap(savedata->vf, savedata->data, size);
savedata->data = NULL;
}
savedata->vf->write(savedata->vf, &buffer, sizeof(buffer)); savedata->vf->write(savedata->vf, &buffer, sizeof(buffer));
if (!savedata->data) {
savedata->data = savedata->vf->map(savedata->vf, size, MAP_WRITE);
}
} }
static uint8_t _unBCD(uint8_t byte) { static uint8_t _unBCD(uint8_t byte) {