all repos — mgba @ f5a1ceb0252ca4c92f19c000b0039bb82f4e62d3

mGBA Game Boy Advance Emulator

Core: Add savedataUpdated callback
Vicki Pfau vi@endrift.com
Fri, 28 Aug 2020 00:53:40 -0700
commit

f5a1ceb0252ca4c92f19c000b0039bb82f4e62d3

parent

65fb61d7e2f5848aac38a12d4042419bb4e537c9

4 files changed, 15 insertions(+), 4 deletions(-)

jump to
M include/mgba/core/interface.hinclude/mgba/core/interface.h

@@ -91,6 +91,7 @@ void (*videoFrameEnded)(void* context);

void (*coreCrashed)(void* context); void (*sleep)(void* context); void (*keysRead)(void* context); + void (*savedataUpdated)(void* context); }; DECLARE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks);
M src/gb/gb.csrc/gb/gb.c

@@ -247,6 +247,14 @@ mLOG(GB_MEM, INFO, "Savedata synced");

} else { mLOG(GB_MEM, INFO, "Savedata failed to sync!"); } + + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gb->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gb->coreCallbacks, c); + if (callbacks->savedataUpdated) { + callbacks->savedataUpdated(callbacks->context); + } + } } }
M src/gba/gba.csrc/gba/gba.c

@@ -816,6 +816,7 @@ }

} void GBAFrameEnded(struct GBA* gba) { + int wasDirty = gba->memory.savedata.dirty; GBASavedataClean(&gba->memory.savedata, gba->video.frameCounter); if (gba->cpu->components && gba->cpu->components[CPU_COMPONENT_CHEAT_DEVICE]) {

@@ -845,6 +846,9 @@ for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) {

struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c); if (callbacks->videoFrameEnded) { callbacks->videoFrameEnded(callbacks->context); + } + if (callbacks->savedataUpdated && wasDirty && !gba->memory.savedata.dirty) { + callbacks->savedataUpdated(callbacks->context); } } }
M src/gba/savedata.csrc/gba/savedata.c

@@ -534,16 +534,14 @@ }

if (savedata->dirty & SAVEDATA_DIRT_NEW) { savedata->dirtAge = frameCount; savedata->dirty &= ~SAVEDATA_DIRT_NEW; - if (!(savedata->dirty & SAVEDATA_DIRT_SEEN)) { - savedata->dirty |= SAVEDATA_DIRT_SEEN; - } + savedata->dirty |= SAVEDATA_DIRT_SEEN; } else if ((savedata->dirty & SAVEDATA_DIRT_SEEN) && frameCount - savedata->dirtAge > CLEANUP_THRESHOLD) { if (savedata->maskWriteback) { GBASavedataUnmask(savedata); } + savedata->dirty = 0; if (savedata->mapMode & MAP_WRITE) { size_t size = GBASavedataSize(savedata); - savedata->dirty = 0; if (savedata->data && savedata->vf->sync(savedata->vf, savedata->data, size)) { mLOG(GBA_SAVE, INFO, "Savedata synced"); } else {