mirror of https://github.com/mgba-emu/mgba.git
Core: Add state manipulation back
This commit is contained in:
parent
33a4c45f3f
commit
7bc15e50c5
|
@ -58,6 +58,9 @@ struct mCore {
|
||||||
void (*runLoop)(struct mCore*);
|
void (*runLoop)(struct mCore*);
|
||||||
void (*step)(struct mCore*);
|
void (*step)(struct mCore*);
|
||||||
|
|
||||||
|
bool (*loadState)(struct mCore*, struct VFile*, int flags);
|
||||||
|
bool (*saveState)(struct mCore*, struct VFile*, int flags);
|
||||||
|
|
||||||
void (*setKeys)(struct mCore*, uint32_t keys);
|
void (*setKeys)(struct mCore*, uint32_t keys);
|
||||||
void (*addKeys)(struct mCore*, uint32_t keys);
|
void (*addKeys)(struct mCore*, uint32_t keys);
|
||||||
void (*clearKeys)(struct mCore*, uint32_t keys);
|
void (*clearKeys)(struct mCore*, uint32_t keys);
|
||||||
|
@ -70,7 +73,15 @@ struct mCore {
|
||||||
};
|
};
|
||||||
|
|
||||||
bool mCoreLoadFile(struct mCore* core, const char* path);
|
bool mCoreLoadFile(struct mCore* core, const char* path);
|
||||||
|
|
||||||
|
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
|
||||||
bool mCoreAutoloadSave(struct mCore* core);
|
bool mCoreAutoloadSave(struct mCore* core);
|
||||||
bool mCoreAutoloadPatch(struct mCore* core);
|
bool mCoreAutoloadPatch(struct mCore* core);
|
||||||
|
|
||||||
|
bool mCoreSaveState(struct mCore* core, int slot, int flags);
|
||||||
|
bool mCoreLoadState(struct mCore* core, int slot, int flags);
|
||||||
|
struct VFile* mCoreGetState(struct mCore* core, int slot, bool write);
|
||||||
|
void mCoreDeleteState(struct mCore* core, int slot);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,3 +34,5 @@ const char* mLogCategoryName(int category) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mLOG_DEFINE_CATEGORY(STATUS, "Status")
|
||||||
|
|
|
@ -53,4 +53,6 @@ static inline void _mLog(int (*category)(void), enum mLogLevel level, const char
|
||||||
return category; \
|
return category; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mLOG_DECLARE_CATEGORY(STATUS)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -124,6 +124,22 @@ static void _GBCoreStep(struct mCore* core) {
|
||||||
LR35902Tick(core->cpu);
|
LR35902Tick(core->cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool _GBCoreLoadState(struct mCore* core, struct VFile* vf, int flags) {
|
||||||
|
UNUSED(core);
|
||||||
|
UNUSED(vf);
|
||||||
|
UNUSED(flags);
|
||||||
|
// TODO
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool _GBCoreSaveState(struct mCore* core, struct VFile* vf, int flags) {
|
||||||
|
UNUSED(core);
|
||||||
|
UNUSED(vf);
|
||||||
|
UNUSED(flags);
|
||||||
|
// TODO
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void _GBCoreSetKeys(struct mCore* core, uint32_t keys) {
|
static void _GBCoreSetKeys(struct mCore* core, uint32_t keys) {
|
||||||
struct GBCore* gbcore = (struct GBCore*) core;
|
struct GBCore* gbcore = (struct GBCore*) core;
|
||||||
gbcore->keys = keys;
|
gbcore->keys = keys;
|
||||||
|
@ -180,6 +196,8 @@ struct mCore* GBCoreCreate(void) {
|
||||||
core->runFrame = _GBCoreRunFrame;
|
core->runFrame = _GBCoreRunFrame;
|
||||||
core->runLoop = _GBCoreRunLoop;
|
core->runLoop = _GBCoreRunLoop;
|
||||||
core->step = _GBCoreStep;
|
core->step = _GBCoreStep;
|
||||||
|
core->loadState = _GBCoreLoadState;
|
||||||
|
core->saveState = _GBCoreSaveState;
|
||||||
core->setKeys = _GBCoreSetKeys;
|
core->setKeys = _GBCoreSetKeys;
|
||||||
core->addKeys = _GBCoreAddKeys;
|
core->addKeys = _GBCoreAddKeys;
|
||||||
core->clearKeys = _GBCoreClearKeys;
|
core->clearKeys = _GBCoreClearKeys;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "core/log.h"
|
#include "core/log.h"
|
||||||
#include "gba/gba.h"
|
#include "gba/gba.h"
|
||||||
#include "gba/renderers/video-software.h"
|
#include "gba/renderers/video-software.h"
|
||||||
|
#include "gba/serialize.h"
|
||||||
#include "util/memory.h"
|
#include "util/memory.h"
|
||||||
|
|
||||||
struct GBACore {
|
struct GBACore {
|
||||||
|
@ -126,6 +127,14 @@ static void _GBACoreStep(struct mCore* core) {
|
||||||
ARMRun(core->cpu);
|
ARMRun(core->cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool _GBACoreLoadState(struct mCore* core, struct VFile* vf, int flags) {
|
||||||
|
return GBALoadStateNamed(core->board, vf, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool _GBACoreSaveState(struct mCore* core, struct VFile* vf, int flags) {
|
||||||
|
return GBASaveStateNamed(core->board, vf, flags);
|
||||||
|
}
|
||||||
|
|
||||||
static void _GBACoreSetKeys(struct mCore* core, uint32_t keys) {
|
static void _GBACoreSetKeys(struct mCore* core, uint32_t keys) {
|
||||||
struct GBACore* gbacore = (struct GBACore*) core;
|
struct GBACore* gbacore = (struct GBACore*) core;
|
||||||
gbacore->keys = keys;
|
gbacore->keys = keys;
|
||||||
|
@ -181,6 +190,8 @@ struct mCore* GBACoreCreate(void) {
|
||||||
core->runFrame = _GBACoreRunFrame;
|
core->runFrame = _GBACoreRunFrame;
|
||||||
core->runLoop = _GBACoreRunLoop;
|
core->runLoop = _GBACoreRunLoop;
|
||||||
core->step = _GBACoreStep;
|
core->step = _GBACoreStep;
|
||||||
|
core->loadState = _GBACoreLoadState;
|
||||||
|
core->saveState = _GBACoreSaveState;
|
||||||
core->setKeys = _GBACoreSetKeys;
|
core->setKeys = _GBACoreSetKeys;
|
||||||
core->addKeys = _GBACoreAddKeys;
|
core->addKeys = _GBACoreAddKeys;
|
||||||
core->clearKeys = _GBACoreClearKeys;
|
core->clearKeys = _GBACoreClearKeys;
|
||||||
|
|
|
@ -564,7 +564,90 @@ static void _mSDLHandleKeypress(struct mCoreThread* context, struct mSDLPlayer*
|
||||||
context->sync.audioWait = event->type != SDL_KEYDOWN;
|
context->sync.audioWait = event->type != SDL_KEYDOWN;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Put back events
|
if (event->type == SDL_KEYDOWN) {
|
||||||
|
switch (event->keysym.sym) {
|
||||||
|
case SDLK_F11:
|
||||||
|
// TODO: Put back debugger
|
||||||
|
return;
|
||||||
|
#ifdef USE_PNG
|
||||||
|
case SDLK_F12:
|
||||||
|
// TODO: Put back screenshots
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
case SDLK_BACKSLASH:
|
||||||
|
// TODO: Put back frame advance
|
||||||
|
return;
|
||||||
|
case SDLK_BACKQUOTE:
|
||||||
|
// TODO: Put back rewind
|
||||||
|
return;
|
||||||
|
#ifdef BUILD_PANDORA
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
mCoreThreadEnd(context);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
if ((event->keysym.mod & GUI_MOD) && (event->keysym.mod & GUI_MOD) == event->keysym.mod) {
|
||||||
|
switch (event->keysym.sym) {
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
case SDLK_f:
|
||||||
|
SDL_SetWindowFullscreen(sdlContext->window, sdlContext->fullscreen ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||||
|
sdlContext->fullscreen = !sdlContext->fullscreen;
|
||||||
|
sdlContext->windowUpdated = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case SDLK_p:
|
||||||
|
mCoreThreadTogglePause(context);
|
||||||
|
break;
|
||||||
|
case SDLK_n:
|
||||||
|
// TODO: Put back frame advance
|
||||||
|
break;
|
||||||
|
case SDLK_r:
|
||||||
|
mCoreThreadReset(context);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (event->keysym.mod & KMOD_SHIFT) {
|
||||||
|
switch (event->keysym.sym) {
|
||||||
|
case SDLK_F1:
|
||||||
|
case SDLK_F2:
|
||||||
|
case SDLK_F3:
|
||||||
|
case SDLK_F4:
|
||||||
|
case SDLK_F5:
|
||||||
|
case SDLK_F6:
|
||||||
|
case SDLK_F7:
|
||||||
|
case SDLK_F8:
|
||||||
|
case SDLK_F9:
|
||||||
|
mCoreThreadInterrupt(context);
|
||||||
|
mCoreSaveState(context->core, event->keysym.sym - SDLK_F1 + 1, SAVESTATE_SCREENSHOT);
|
||||||
|
mCoreThreadContinue(context);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (event->keysym.sym) {
|
||||||
|
case SDLK_F1:
|
||||||
|
case SDLK_F2:
|
||||||
|
case SDLK_F3:
|
||||||
|
case SDLK_F4:
|
||||||
|
case SDLK_F5:
|
||||||
|
case SDLK_F6:
|
||||||
|
case SDLK_F7:
|
||||||
|
case SDLK_F8:
|
||||||
|
case SDLK_F9:
|
||||||
|
mCoreThreadInterrupt(context);
|
||||||
|
mCoreLoadState(context->core, event->keysym.sym - SDLK_F1 + 1, SAVESTATE_SCREENSHOT);
|
||||||
|
mCoreThreadContinue(context);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _mSDLHandleJoyButton(struct mCore* core, struct mSDLPlayer* sdlContext, const struct SDL_JoyButtonEvent* event) {
|
static void _mSDLHandleJoyButton(struct mCore* core, struct mSDLPlayer* sdlContext, const struct SDL_JoyButtonEvent* event) {
|
||||||
|
|
Loading…
Reference in New Issue