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);