Mercurial > repos > blastem
comparison genesis.c @ 1428:2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 09 Aug 2017 23:26:51 -0700 |
parents | 4e5797b3935a |
children | c886c54d8cf1 |
comparison
equal
deleted
inserted
replaced
1427:4e5797b3935a | 1428:2540c05520f2 |
---|---|
337 } | 337 } |
338 char *save_path; | 338 char *save_path; |
339 if (slot == QUICK_SAVE_SLOT) { | 339 if (slot == QUICK_SAVE_SLOT) { |
340 save_path = save_state_path; | 340 save_path = save_state_path; |
341 } else { | 341 } else { |
342 char slotname[] = "slot_0.gst"; | 342 char slotname[] = "slot_0.state"; |
343 slotname[5] = '0' + slot; | 343 slotname[5] = '0' + slot; |
344 if (!use_native_states) { | |
345 strcpy(slotname + 7, "gst"); | |
346 } | |
344 char const *parts[] = {gen->header.save_dir, PATH_SEP, slotname}; | 347 char const *parts[] = {gen->header.save_dir, PATH_SEP, slotname}; |
345 save_path = alloc_concat_m(3, parts); | 348 save_path = alloc_concat_m(3, parts); |
346 } | 349 } |
347 serialize_buffer state; | 350 if (use_native_states) { |
348 init_serialize(&state); | 351 serialize_buffer state; |
349 genesis_serialize(gen, &state, address);; | 352 init_serialize(&state); |
350 FILE *statefile = fopen(save_path, "wb"); | 353 genesis_serialize(gen, &state, address); |
351 fwrite(state.data, 1, state.size, statefile); | 354 save_to_file(&state, save_path); |
352 fclose(statefile); | 355 free(state.data); |
353 free(state.data); | 356 } else { |
354 //save_gst(gen, save_path, address); | 357 save_gst(gen, save_path, address); |
358 } | |
355 printf("Saved state to %s\n", save_path); | 359 printf("Saved state to %s\n", save_path); |
356 if (slot != QUICK_SAVE_SLOT) { | 360 if (slot != QUICK_SAVE_SLOT) { |
357 free(save_path); | 361 free(save_path); |
358 } | 362 } |
359 } else if(gen->header.save_state) { | 363 } else if(gen->header.save_state) { |
1003 { | 1007 { |
1004 genesis_context *gen = (genesis_context *)system; | 1008 genesis_context *gen = (genesis_context *)system; |
1005 set_keybindings(&gen->io); | 1009 set_keybindings(&gen->io); |
1006 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); | 1010 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); |
1007 if (statefile) { | 1011 if (statefile) { |
1008 //first try loading as a GST format savestate | 1012 //first try loading as a native format savestate |
1009 uint32_t pc = load_gst(gen, statefile); | 1013 deserialize_buffer state; |
1010 if (!pc) { | 1014 uint32_t pc; |
1011 //switch to native format if that fails | 1015 if (load_from_file(&state, statefile)) { |
1012 FILE *f = fopen(statefile, "rb"); | |
1013 if (!f) { | |
1014 goto state_error; | |
1015 } | |
1016 long statesize = file_size(f); | |
1017 deserialize_buffer state; | |
1018 void *statedata = malloc(statesize); | |
1019 if (statesize != fread(statedata, 1, statesize, f)) { | |
1020 goto state_error; | |
1021 } | |
1022 fclose(f); | |
1023 init_deserialize(&state, statedata, statesize); | |
1024 genesis_deserialize(&state, gen); | 1016 genesis_deserialize(&state, gen); |
1025 free(statedata); | 1017 free(state.data); |
1026 //HACK | 1018 //HACK |
1027 pc = gen->m68k->last_prefetch_address; | 1019 pc = gen->m68k->last_prefetch_address; |
1020 } else { | |
1021 pc = load_gst(gen, statefile); | |
1022 if (!pc) { | |
1023 fatal_error("Failed to load save state %s\n", statefile); | |
1024 } | |
1028 } | 1025 } |
1029 printf("Loaded %s\n", statefile); | 1026 printf("Loaded %s\n", statefile); |
1030 if (gen->header.enter_debugger) { | 1027 if (gen->header.enter_debugger) { |
1031 gen->header.enter_debugger = 0; | 1028 gen->header.enter_debugger = 0; |
1032 insert_breakpoint(gen->m68k, pc, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); | 1029 insert_breakpoint(gen->m68k, pc, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); |
1041 } | 1038 } |
1042 m68k_reset(gen->m68k); | 1039 m68k_reset(gen->m68k); |
1043 } | 1040 } |
1044 handle_reset_requests(gen); | 1041 handle_reset_requests(gen); |
1045 return; | 1042 return; |
1046 state_error: | |
1047 fatal_error("Failed to load save state %s\n", statefile); | |
1048 } | 1043 } |
1049 | 1044 |
1050 static void resume_genesis(system_header *system) | 1045 static void resume_genesis(system_header *system) |
1051 { | 1046 { |
1052 genesis_context *gen = (genesis_context *)system; | 1047 genesis_context *gen = (genesis_context *)system; |
1216 { | 1211 { |
1217 gen->vdp->sat_cache[i] = rand(); | 1212 gen->vdp->sat_cache[i] = rand(); |
1218 } | 1213 } |
1219 for (int i = 0; i < CRAM_SIZE; i++) | 1214 for (int i = 0; i < CRAM_SIZE; i++) |
1220 { | 1215 { |
1221 write_cram(gen->vdp, i, rand()); | 1216 write_cram_internal(gen->vdp, i, rand()); |
1222 } | 1217 } |
1223 for (int i = 0; i < VSRAM_SIZE; i++) | 1218 for (int i = 0; i < VSRAM_SIZE; i++) |
1224 { | 1219 { |
1225 gen->vdp->vsram[i] = rand(); | 1220 gen->vdp->vsram[i] = rand(); |
1226 } | 1221 } |