diff --git a/src/gba/gba-savedata.c b/src/gba/gba-savedata.c index beb42a384..01a49de06 100644 --- a/src/gba/gba-savedata.c +++ b/src/gba/gba-savedata.c @@ -18,6 +18,7 @@ void GBASavedataInit(struct GBASavedata* savedata, struct VFile* vf) { savedata->command = EEPROM_COMMAND_NULL; savedata->flashState = FLASH_STATE_RAW; savedata->vf = vf; + savedata->realVf = vf; } void GBASavedataDeinit(struct GBASavedata* savedata) { @@ -57,12 +58,18 @@ void GBASavedataDeinit(struct GBASavedata* savedata) { break; } } + savedata->data = 0; savedata->type = SAVEDATA_NONE; } void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf) { GBASavedataDeinit(savedata); - GBASavedataInit(savedata, vf); + savedata->vf = vf; +} + +void GBASavedataUnmask(struct GBASavedata* savedata) { + GBASavedataDeinit(savedata); + savedata->vf = savedata->realVf; } void GBASavedataInitFlash(struct GBASavedata* savedata) { diff --git a/src/gba/gba-savedata.h b/src/gba/gba-savedata.h index 0c5f07323..e3acec6da 100644 --- a/src/gba/gba-savedata.h +++ b/src/gba/gba-savedata.h @@ -57,6 +57,7 @@ struct GBASavedata { uint8_t* data; enum SavedataCommand command; struct VFile* vf; + struct VFile* realVf; int readBitsRemaining; int readAddress; @@ -71,7 +72,9 @@ struct GBASavedata { void GBASavedataInit(struct GBASavedata* savedata, struct VFile* vf); void GBASavedataDeinit(struct GBASavedata* savedata); + void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf); +void GBASavedataUnmask(struct GBASavedata* savedata); void GBASavedataInitFlash(struct GBASavedata* savedata); void GBASavedataInitEEPROM(struct GBASavedata* savedata); diff --git a/src/gba/gba.c b/src/gba/gba.c index 04ffe0629..3decc7023 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -187,6 +187,9 @@ void GBAReset(struct ARMCore* cpu) { cpu->gprs[ARM_SP] = SP_BASE_SYSTEM; struct GBA* gba = (struct GBA*) cpu->master; + if (!GBARRIsPlaying(gba->rr) && !GBARRIsRecording(gba->rr)) { + GBASavedataUnmask(&gba->memory.savedata); + } GBAMemoryReset(gba); GBAVideoReset(&gba->video); GBAAudioReset(&gba->audio);