void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type) { if (savedata->type == type) { return; } if (savedata->type != SAVEDATA_AUTODETECT) { struct VFile* vf = savedata->vf; int mapMode = savedata->mapMode; bool maskWriteback = savedata->maskWriteback; GBASavedataDeinit(savedata); GBASavedataInit(savedata, vf); savedata->mapMode = mapMode; savedata->maskWriteback = maskWriteback; } switch (type) { case SAVEDATA_FLASH512: case SAVEDATA_FLASH1M: savedata->type = type; GBASavedataInitFlash(savedata); break; case SAVEDATA_EEPROM: case SAVEDATA_EEPROM512: GBASavedataInitEEPROM(savedata); break; case SAVEDATA_SRAM: GBASavedataInitSRAM(savedata); break; case SAVEDATA_FORCE_NONE: savedata->type = SAVEDATA_FORCE_NONE; break; case SAVEDATA_AUTODETECT: break; } }
void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type, bool realisticTiming) { if (savedata->type != SAVEDATA_AUTODETECT) { struct VFile* vf = savedata->vf; GBASavedataDeinit(savedata); GBASavedataInit(savedata, vf); } switch (type) { case SAVEDATA_FLASH512: case SAVEDATA_FLASH1M: savedata->type = type; GBASavedataInitFlash(savedata, realisticTiming); break; case SAVEDATA_EEPROM: GBASavedataInitEEPROM(savedata, realisticTiming); break; case SAVEDATA_SRAM: GBASavedataInitSRAM(savedata); break; case SAVEDATA_FORCE_NONE: savedata->type = SAVEDATA_FORCE_NONE; break; case SAVEDATA_AUTODETECT: break; } }
void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf, bool writeback) { enum SavedataType type = savedata->type; GBASavedataDeinit(savedata); savedata->vf = vf; savedata->mapMode = MAP_READ; savedata->maskWriteback = writeback; GBASavedataForceType(savedata, type, savedata->realisticTiming); }
void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf, bool writeback) { enum SavedataType type = savedata->type; struct VFile* oldVf = savedata->vf; GBASavedataDeinit(savedata); if (oldVf && oldVf != savedata->realVf) { oldVf->close(oldVf); } savedata->vf = vf; savedata->mapMode = MAP_READ; savedata->maskWriteback = writeback; GBASavedataForceType(savedata, type); }
void GBASavedataUnmask(struct GBASavedata* savedata) { if (!savedata->realVf || savedata->vf == savedata->realVf) { return; } enum SavedataType type = savedata->type; struct VFile* vf = savedata->vf; GBASavedataDeinit(savedata); savedata->vf = savedata->realVf; savedata->mapMode = MAP_WRITE; GBASavedataForceType(savedata, type); if (savedata->maskWriteback) { GBASavedataLoad(savedata, vf); savedata->maskWriteback = false; } vf->close(vf); }