diff options
-rw-r--r-- | gen_player.c | 3 | ||||
-rw-r--r-- | genesis.c | 3 | ||||
-rw-r--r-- | serialize.c | 8 | ||||
-rw-r--r-- | serialize.h | 4 | ||||
-rw-r--r-- | sms.c | 3 |
5 files changed, 14 insertions, 7 deletions
diff --git a/gen_player.c b/gen_player.c index 860108b..e3d856b 100644 --- a/gen_player.c +++ b/gen_player.c @@ -81,7 +81,8 @@ static void run(gen_player *player) register_section_handler(&buffer, (section_handler){.fun = psg_deserialize, .data = player->psg}, SECTION_PSG); while (buffer.cur_pos < buffer.size) { - load_section(&buffer); + if (!load_section(&buffer)) + break; } player->reader.buffer.cur_pos += size; free(buffer.handlers); @@ -211,7 +211,8 @@ void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) gen->tmss = 0xFF; while (buf->cur_pos < buf->size) { - load_section(buf); + if (!load_section(buf)) + break; } if (gen->version_reg & 0xF) { if (gen->tmss == 0xFF) { diff --git a/serialize.c b/serialize.c index a59151f..8c547ba 100644 --- a/serialize.c +++ b/serialize.c @@ -205,12 +205,15 @@ void load_buffer32(deserialize_buffer *buf, uint32_t *dst, size_t len) } } -void load_section(deserialize_buffer *buf) +int load_section(deserialize_buffer *buf) { if (!buf->handlers) { fatal_error("load_section called on a deserialize_buffer with no handlers registered\n"); } uint16_t section_id = load_int16(buf); + if (section_id == SECTION_END_OF_SERIALIZATION) { + return 0; + } uint32_t size = load_int32(buf); if (size > (buf->size - buf->cur_pos)) { fatal_error("Section is bigger than remaining space in file"); @@ -218,12 +221,13 @@ void load_section(deserialize_buffer *buf) if (section_id > buf->max_handler || !buf->handlers[section_id].fun) { warning("No handler for section ID %d, save state may be from a newer version\n", section_id); buf->cur_pos += size; - return; + return 1; } deserialize_buffer section; init_deserialize(§ion, buf->data + buf->cur_pos, size); buf->handlers[section_id].fun(§ion, buf->handlers[section_id].data); buf->cur_pos += size; + return 1; } static const char sz_ident[] = "BLSTSZ\x01\x07"; diff --git a/serialize.h b/serialize.h index 44ea661..f4a7402 100644 --- a/serialize.h +++ b/serialize.h @@ -28,7 +28,7 @@ struct deserialize_buffer { }; enum { - SECTION_HEADER, + SECTION_END_OF_SERIALIZATION, SECTION_68000, SECTION_Z80, SECTION_VDP, @@ -64,7 +64,7 @@ uint8_t load_int8(deserialize_buffer *buf); void load_buffer8(deserialize_buffer *buf, void *dst, size_t len); void load_buffer16(deserialize_buffer *buf, uint16_t *dst, size_t len); void load_buffer32(deserialize_buffer *buf, uint32_t *dst, size_t len); -void load_section(deserialize_buffer *buf); +int load_section(deserialize_buffer *buf); uint8_t save_to_file(serialize_buffer *buf, char *path); uint8_t load_from_file(deserialize_buffer *buf, char *path); #endif //SERIALIZE_H @@ -309,7 +309,8 @@ void sms_deserialize(deserialize_buffer *buf, sms_context *sms) //TODO: cart RAM while (buf->cur_pos < buf->size) { - load_section(buf); + if (!load_section(buf)) + break; } z80_invalidate_code_range(sms->z80, 0xC000, 0x10000); if (sms->bank_regs[0] & 8) { |