Mercurial > repos > blastem
comparison genesis.c @ 1690:319d90025d50
Implement serialization/deserialization in libretro build
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 20 Jan 2019 22:19:58 -0800 |
parents | 395f684c5379 |
children | 956c1cce05e2 d6d4c006a7b3 |
comparison
equal
deleted
inserted
replaced
1689:7f42a93f18a4 | 1690:319d90025d50 |
---|---|
90 end_section(buf); | 90 end_section(buf); |
91 | 91 |
92 cart_serialize(&gen->header, buf); | 92 cart_serialize(&gen->header, buf); |
93 } | 93 } |
94 | 94 |
95 static uint8_t *serialize(system_header *sys, size_t *size_out) | |
96 { | |
97 genesis_context *gen = (genesis_context *)sys; | |
98 uint32_t address; | |
99 if (gen->m68k->resume_pc) { | |
100 gen->m68k->target_cycle = gen->m68k->current_cycle; | |
101 gen->header.save_state = SERIALIZE_SLOT+1; | |
102 resume_68k(gen->m68k); | |
103 if (size_out) { | |
104 *size_out = gen->serialize_size; | |
105 } | |
106 return gen->serialize_tmp; | |
107 } else { | |
108 serialize_buffer state; | |
109 init_serialize(&state); | |
110 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k) << 16; | |
111 address |= read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k); | |
112 genesis_serialize(gen, &state, address); | |
113 if (size_out) { | |
114 *size_out = state.size; | |
115 } | |
116 return state.data; | |
117 } | |
118 } | |
119 | |
95 static void ram_deserialize(deserialize_buffer *buf, void *vgen) | 120 static void ram_deserialize(deserialize_buffer *buf, void *vgen) |
96 { | 121 { |
97 genesis_context *gen = vgen; | 122 genesis_context *gen = vgen; |
98 uint32_t ram_size = load_int8(buf) * 1024 / 2; | 123 uint32_t ram_size = load_int8(buf) * 1024 / 2; |
99 if (ram_size > RAM_WORDS) { | 124 if (ram_size > RAM_WORDS) { |
150 { | 175 { |
151 load_section(buf); | 176 load_section(buf); |
152 } | 177 } |
153 update_z80_bank_pointer(gen); | 178 update_z80_bank_pointer(gen); |
154 adjust_int_cycle(gen->m68k, gen->vdp); | 179 adjust_int_cycle(gen->m68k, gen->vdp); |
180 free(buf->handlers); | |
181 buf->handlers = NULL; | |
182 } | |
183 | |
184 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up | |
185 static void deserialize(system_header *sys, uint8_t *data, size_t size) | |
186 { | |
187 genesis_context *gen = (genesis_context *)sys; | |
188 deserialize_buffer buffer; | |
189 init_deserialize(&buffer, data, size); | |
190 genesis_deserialize(&buffer, gen); | |
191 //HACK: Fix this once PC/IR is represented in a better way in 68K core | |
192 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, gen->m68k->last_prefetch_address); | |
155 } | 193 } |
156 | 194 |
157 uint16_t read_dma_value(uint32_t address) | 195 uint16_t read_dma_value(uint32_t address) |
158 { | 196 { |
159 genesis_context *genesis = (genesis_context *)current_system; | 197 genesis_context *genesis = (genesis_context *)current_system; |
380 while (!z_context->pc) | 418 while (!z_context->pc) |
381 { | 419 { |
382 sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80); | 420 sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80); |
383 } | 421 } |
384 } | 422 } |
385 char *save_path = get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); | 423 char *save_path = slot == SERIALIZE_SLOT ? NULL : get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); |
386 if (use_native_states) { | 424 if (use_native_states || slot == SERIALIZE_SLOT) { |
387 serialize_buffer state; | 425 serialize_buffer state; |
388 init_serialize(&state); | 426 init_serialize(&state); |
389 genesis_serialize(gen, &state, address); | 427 genesis_serialize(gen, &state, address); |
390 save_to_file(&state, save_path); | 428 if (slot == SERIALIZE_SLOT) { |
391 free(state.data); | 429 gen->serialize_tmp = state.data; |
430 gen->serialize_size = state.size; | |
431 context->sync_cycle = context->current_cycle; | |
432 context->should_return = 1; | |
433 } else { | |
434 save_to_file(&state, save_path); | |
435 free(state.data); | |
436 } | |
392 } else { | 437 } else { |
393 save_gst(gen, save_path, address); | 438 save_gst(gen, save_path, address); |
394 } | 439 } |
395 printf("Saved state to %s\n", save_path); | 440 printf("Saved state to %s\n", save_path); |
396 free(save_path); | 441 free(save_path); |
1016 gen->normal_clock = MCLKS_NTSC; | 1061 gen->normal_clock = MCLKS_NTSC; |
1017 } | 1062 } |
1018 gen->master_clock = gen->normal_clock; | 1063 gen->master_clock = gen->normal_clock; |
1019 } | 1064 } |
1020 | 1065 |
1021 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up | |
1022 static uint8_t load_state(system_header *system, uint8_t slot) | 1066 static uint8_t load_state(system_header *system, uint8_t slot) |
1023 { | 1067 { |
1024 genesis_context *gen = (genesis_context *)system; | 1068 genesis_context *gen = (genesis_context *)system; |
1025 char *statepath = get_slot_name(system, slot, "state"); | 1069 char *statepath = get_slot_name(system, slot, "state"); |
1026 deserialize_buffer state; | 1070 deserialize_buffer state; |
1295 gen->header.mouse_motion_absolute = mouse_motion_absolute; | 1339 gen->header.mouse_motion_absolute = mouse_motion_absolute; |
1296 gen->header.mouse_motion_relative = mouse_motion_relative; | 1340 gen->header.mouse_motion_relative = mouse_motion_relative; |
1297 gen->header.keyboard_down = keyboard_down; | 1341 gen->header.keyboard_down = keyboard_down; |
1298 gen->header.keyboard_up = keyboard_up; | 1342 gen->header.keyboard_up = keyboard_up; |
1299 gen->header.config_updated = config_updated; | 1343 gen->header.config_updated = config_updated; |
1344 gen->header.serialize = serialize; | |
1345 gen->header.deserialize = deserialize; | |
1300 gen->header.type = SYSTEM_GENESIS; | 1346 gen->header.type = SYSTEM_GENESIS; |
1301 gen->header.info = *rom; | 1347 gen->header.info = *rom; |
1302 set_region(gen, rom, force_region); | 1348 set_region(gen, rom, force_region); |
1303 | 1349 |
1304 gen->vdp = init_vdp_context(gen->version_reg & 0x40); | 1350 gen->vdp = init_vdp_context(gen->version_reg & 0x40); |