From 90edf4d1a085f8611822a8eaa98f063704ab00fb Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 28 Aug 2016 20:36:12 -0700 Subject: [PATCH] GBA Serialize: Savestates now store if CPU was halted --- CHANGES | 1 + src/gba/serialize.c | 8 ++++++++ src/gba/serialize.h | 10 ++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index fc7321d9b..16935fbff 100644 --- a/CHANGES +++ b/CHANGES @@ -80,6 +80,7 @@ Misc: - VFS: Improve zip file detection - Util: Add endswith - GUI: Only reload config if manually saved + - GBA Serialize: Savestates now store if CPU was halted 0.4.1: (2016-07-11) Bugfixes: diff --git a/src/gba/serialize.c b/src/gba/serialize.c index 1a0100c8d..a2dd3e0de 100644 --- a/src/gba/serialize.c +++ b/src/gba/serialize.c @@ -66,12 +66,17 @@ void GBASerialize(struct GBA* gba, struct GBASerializedState* state) { STORE_32(gba->cpu->prefetch[1], 4, state->cpuPrefetch); STORE_32(gba->memory.lastPrefetchedPc, 0, &state->lastPrefetchedPc); + GBASerializedMiscFlags miscFlags = 0; + miscFlags = GBASerializedMiscFlagsSetHalted(miscFlags, gba->cpu->halted); + STORE_32(miscFlags, 0, &state->miscFlags); + GBAMemorySerialize(&gba->memory, state); GBAIOSerialize(gba, state); GBAVideoSerialize(&gba->video, state); GBAAudioSerialize(&gba->audio, state); GBASavedataSerialize(&gba->memory.savedata, state); + #ifndef _MSC_VER struct timeval tv; if (!gettimeofday(&tv, 0)) { @@ -197,6 +202,9 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) { LOAD_32(gba->cpu->prefetch[1], (gba->cpu->gprs[ARM_PC]) & gba->cpu->memory.activeMask, gba->cpu->memory.activeRegion); } } + GBASerializedMiscFlags miscFlags = 0; + LOAD_32(miscFlags, 0, &state->miscFlags); + gba->cpu->halted = GBASerializedMiscFlagsGetHalted(miscFlags); GBAVideoDeserialize(&gba->video, state); GBAMemoryDeserialize(&gba->memory, state); diff --git a/src/gba/serialize.h b/src/gba/serialize.h index 2e324744b..1ba5c3814 100644 --- a/src/gba/serialize.h +++ b/src/gba/serialize.h @@ -196,7 +196,9 @@ mLOG_DECLARE_CATEGORY(GBA_STATE); * 0x00304 - 0x0030F: Reserved (leave zero) * 0x00310 - 0x00317: Savestate creation time (usec since 1970) * 0x00318 - 0x0031B: Last prefetched program counter - * 0x0031C - 0x003FF: Reserved (leave zero) + * 0x0031C - 0x0031F: Miscellaneous flags + * | bit 0: Is CPU halted? + * 0x00320 - 0x003FF: Reserved (leave zero) * 0x00400 - 0x007FF: I/O memory * 0x00800 - 0x00BFF: Palette * 0x00C00 - 0x00FFF: OAM @@ -223,6 +225,9 @@ DECL_BITFIELD(GBASerializedSavedataFlags, uint8_t); DECL_BITS(GBASerializedSavedataFlags, FlashState, 0, 2); DECL_BIT(GBASerializedSavedataFlags, FlashBank, 4); +DECL_BITFIELD(GBASerializedMiscFlags, uint32_t); +DECL_BIT(GBASerializedMiscFlags, Halted, 0); + struct GBASerializedState { uint32_t versionMagic; uint32_t biosChecksum; @@ -313,8 +318,9 @@ struct GBASerializedState { uint64_t creationUsec; uint32_t lastPrefetchedPc; + GBASerializedMiscFlags miscFlags; - uint32_t reserved[57]; + uint32_t reserved[56]; uint16_t io[SIZE_IO >> 1]; uint16_t pram[SIZE_PALETTE_RAM >> 1];