summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gen_player.c3
-rw-r--r--genesis.c3
-rw-r--r--serialize.c8
-rw-r--r--serialize.h4
-rw-r--r--sms.c3
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);
diff --git a/genesis.c b/genesis.c
index 27c3a67..d1e4f77 100644
--- a/genesis.c
+++ b/genesis.c
@@ -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(&section, buf->data + buf->cur_pos, size);
buf->handlers[section_id].fun(&section, 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
diff --git a/sms.c b/sms.c
index a2e3d3b..94fd5aa 100644
--- a/sms.c
+++ b/sms.c
@@ -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) {