SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
commit 4c8f364ad7f9ac5fdd6b34a86024e44ed799d5c5 parent c36c7126f8e66ed1d2dd549d261b400bc5b8a616 Author: Lior Halphon <LIJI32@gmail.com> Date: Thu, 2 Feb 2023 00:06:22 +0200 Force the rewind buffer to reset after the save state size changes Diffstat:
| M | Core/gb.h | 1 | + |
| M | Core/rewind.c | 8 | +++++++- |
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/Core/gb.h b/Core/gb.h @@ -759,6 +759,7 @@ struct GB_gameboy_internal_s { /* Rewind */ size_t rewind_buffer_length; + size_t rewind_state_size; struct { uint8_t *key_state; uint8_t *compressed_states[GB_REWIND_FRAMES_PER_KEY]; diff --git a/Core/rewind.c b/Core/rewind.c @@ -3,6 +3,7 @@ #include <stddef.h> #include <stdlib.h> #include <math.h> +#include <assert.h> static uint8_t *state_compress(const uint8_t *prev, const uint8_t *data, size_t uncompressed_size) { @@ -109,6 +110,10 @@ static void state_decompress(const uint8_t *prev, uint8_t *data, uint8_t *dest, void GB_rewind_push(GB_gameboy_t *gb) { const size_t save_size = GB_get_save_state_size_no_bess(gb); + if (gb->rewind_state_size != save_size) { + GB_rewind_free(gb); + gb->rewind_state_size = save_size; + } if (!gb->rewind_sequences) { if (gb->rewind_buffer_length) { gb->rewind_sequences = malloc(sizeof(*gb->rewind_sequences) * gb->rewind_buffer_length); @@ -132,7 +137,7 @@ void GB_rewind_push(GB_gameboy_t *gb) for (unsigned i = 0; i < GB_REWIND_FRAMES_PER_KEY; i++) { if (gb->rewind_sequences[gb->rewind_pos].compressed_states[i]) { free(gb->rewind_sequences[gb->rewind_pos].compressed_states[i]); - gb->rewind_sequences[gb->rewind_pos].compressed_states[i] = 0; + gb->rewind_sequences[gb->rewind_pos].compressed_states[i] = NULL; } } gb->rewind_sequences[gb->rewind_pos].pos = 0; @@ -144,6 +149,7 @@ void GB_rewind_push(GB_gameboy_t *gb) } else { uint8_t *save_state = malloc(save_size); + assert(gb->rewind_sequences[gb->rewind_pos].key_state); GB_save_state_to_buffer_no_bess(gb, save_state); gb->rewind_sequences[gb->rewind_pos].compressed_states[gb->rewind_sequences[gb->rewind_pos].pos++] = state_compress(gb->rewind_sequences[gb->rewind_pos].key_state, save_state, save_size);
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.