diff --git a/CHANGES b/CHANGES index 3e87329ad..c8320c8ad 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,7 @@ Bugfixes: - Shaders: Fix AGS-001 shader with some bad drivers - Qt: Initialize m_useBios - GBA Serialize: Fix memory corruption bug in GBAExtdataSerialize + - GBA Serialize: Fix loading savegames from savestates Misc: - GBA: Slightly optimize GBAProcessEvents - Qt: Add preset for DualShock 4 diff --git a/src/gba/savedata.c b/src/gba/savedata.c index 42709dbf1..d262772ac 100644 --- a/src/gba/savedata.c +++ b/src/gba/savedata.c @@ -124,7 +124,26 @@ bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out) { } bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in) { - if (savedata->data) { + if (savedata->vf) { + off_t read = 0; + uint8_t buffer[2048]; + memset(buffer, 0xFF, sizeof(buffer)); + savedata->vf->seek(savedata->vf, 0, SEEK_SET); + while (savedata->vf->seek(savedata->vf, 0, SEEK_CUR) < savedata->vf->size(savedata->vf)) { + savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); + } + savedata->vf->seek(savedata->vf, 0, SEEK_SET); + if (in) { + do { + read = in->read(in, buffer, sizeof(buffer)); + read = savedata->vf->write(savedata->vf, buffer, read); + } while (read == sizeof(buffer)); + } + return read >= 0; + } else if (savedata->data) { + if (!in && savedata->type != SAVEDATA_FORCE_NONE) { + return false; + } switch (savedata->type) { case SAVEDATA_SRAM: return in->read(in, savedata->data, SIZE_CART_SRAM) == SIZE_CART_SRAM; @@ -138,14 +157,6 @@ bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in) { case SAVEDATA_FORCE_NONE: return true; } - } else if (savedata->vf) { - off_t read = 0; - uint8_t buffer[2048]; - do { - in->read(in, buffer, read); - read = savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); - } while (read == sizeof(buffer)); - return read >= 0; } return true; } diff --git a/src/gba/serialize.c b/src/gba/serialize.c index 26946d9f0..5586fddde 100644 --- a/src/gba/serialize.c +++ b/src/gba/serialize.c @@ -526,8 +526,8 @@ bool GBALoadStateNamed(struct GBA* gba, struct VFile* vf, int flags) { } if (flags & SAVESTATE_SAVEDATA && GBAExtdataGet(&extdata, EXTDATA_SAVEDATA, &item)) { struct VFile* svf = VFileFromMemory(item.data, item.size); + GBASavedataLoad(&gba->memory.savedata, svf); if (svf) { - GBASavedataLoad(&gba->memory.savedata, svf); svf->close(svf); } }