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 }