comparison genesis.c @ 1433:c886c54d8cf1

Added save states to SMS emulation
author Michael Pavone <pavone@retrodev.com>
date Wed, 16 Aug 2017 20:06:28 -0700
parents 2540c05520f2
children 7d4483944d4d
comparison
equal deleted inserted replaced
1432:5e7e6d9b79ff 1433:c886c54d8cf1
1001 m68k_reset(gen->m68k); 1001 m68k_reset(gen->m68k);
1002 } 1002 }
1003 vdp_release_framebuffer(gen->vdp); 1003 vdp_release_framebuffer(gen->vdp);
1004 } 1004 }
1005 1005
1006 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up
1007 static uint8_t load_state(system_header *system, uint8_t slot)
1008 {
1009 genesis_context *gen = (genesis_context *)system;
1010 char numslotname[] = "slot_0.state";
1011 char *slotname;
1012 if (slot == QUICK_SAVE_SLOT) {
1013 slotname = "quicksave.state";
1014 } else {
1015 numslotname[5] = '0' + slot;
1016 slotname = numslotname;
1017 }
1018 char const *parts[] = {gen->header.next_context->save_dir, PATH_SEP, slotname};
1019 char *statepath = alloc_concat_m(3, parts);
1020 deserialize_buffer state;
1021 uint32_t pc = 0;
1022 uint8_t ret;
1023 if (load_from_file(&state, statepath)) {
1024 genesis_deserialize(&state, gen);
1025 free(state.data);
1026 //HACK
1027 pc = gen->m68k->last_prefetch_address;
1028 ret = 1;
1029 } else {
1030 strcpy(statepath + strlen(statepath)-strlen("state"), "gst");
1031 pc = load_gst(gen, statepath);
1032 ret = pc != 0;
1033 }
1034 if (ret) {
1035 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc);
1036 }
1037 free(statepath);
1038 return ret;
1039 }
1040
1006 static void start_genesis(system_header *system, char *statefile) 1041 static void start_genesis(system_header *system, char *statefile)
1007 { 1042 {
1008 genesis_context *gen = (genesis_context *)system; 1043 genesis_context *gen = (genesis_context *)system;
1009 set_keybindings(&gen->io); 1044 set_keybindings(&gen->io);
1010 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); 1045 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC);
1144 gen->header.set_speed_percent = set_speed_percent; 1179 gen->header.set_speed_percent = set_speed_percent;
1145 gen->header.start_context = start_genesis; 1180 gen->header.start_context = start_genesis;
1146 gen->header.resume_context = resume_genesis; 1181 gen->header.resume_context = resume_genesis;
1147 gen->header.load_save = load_save; 1182 gen->header.load_save = load_save;
1148 gen->header.persist_save = persist_save; 1183 gen->header.persist_save = persist_save;
1184 gen->header.load_state = load_state;
1149 gen->header.soft_reset = soft_reset; 1185 gen->header.soft_reset = soft_reset;
1150 gen->header.free_context = free_genesis; 1186 gen->header.free_context = free_genesis;
1151 gen->header.get_open_bus_value = get_open_bus_value; 1187 gen->header.get_open_bus_value = get_open_bus_value;
1152 gen->header.request_exit = request_exit; 1188 gen->header.request_exit = request_exit;
1153 gen->header.inc_debug_mode = inc_debug_mode; 1189 gen->header.inc_debug_mode = inc_debug_mode;