GB: Add support for sleep and shutdown callbacks
Vicki Pfau vi@endrift.com
Wed, 09 Sep 2020 22:57:34 -0700
2 files changed,
12 insertions(+),
17 deletions(-)
M
CHANGES
→
CHANGES
@@ -74,6 +74,7 @@ - 3DS: Use "wide mode" where applicable for slightly better filtering
- Core: Add savedataUpdated callback - Core: Add shutdown callback - GB: Allow pausing event loop while CPU is blocked + - GB: Add support for sleep and shutdown callbacks - GBA: Allow pausing event loop while CPU is blocked - Debugger: Keep track of global cycle count - FFmpeg: Add looping option for GIF/APNG
M
src/gb/gb.c
→
src/gb/gb.c
@@ -783,29 +783,23 @@ }
void GBStop(struct SM83Core* cpu) { struct GB* gb = (struct GB*) cpu->master; - if (cpu->bus) { - mLOG(GB, GAME_ERROR, "Hit illegal stop at address %04X:%02X", cpu->pc, cpu->bus); - } - if (gb->memory.io[REG_KEY1] & 1) { + if (gb->model >= GB_MODEL_CGB && gb->memory.io[REG_KEY1] & 1) { gb->doubleSpeed ^= 1; gb->audio.timingFactor = gb->doubleSpeed + 1; gb->memory.io[REG_KEY1] = 0; gb->memory.io[REG_KEY1] |= gb->doubleSpeed << 7; - } else if (cpu->bus) { -#ifdef USE_DEBUGGERS - if (cpu->components && cpu->components[CPU_COMPONENT_DEBUGGER]) { - struct mDebuggerEntryInfo info = { - .address = cpu->pc - 1, - .type.bp.opcode = 0x1000 | cpu->bus, - }; - mDebuggerEnter((struct mDebugger*) cpu->components[CPU_COMPONENT_DEBUGGER], DEBUGGER_ENTER_ILLEGAL_OP, &info); + } else { + int sleep = ~(gb->memory.io[REG_JOYP] & 0x30); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gb->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gb->coreCallbacks, c); + if (sleep && callbacks->sleep) { + callbacks->sleep(callbacks->context); + } else if (callbacks->shutdown) { + callbacks->shutdown(callbacks->context); + } } -#endif - // Hang forever - gb->memory.ime = 0; - cpu->pc -= 2; } - // TODO: Actually stop } void GBIllegal(struct SM83Core* cpu) {