Mercurial > repos > blastem
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; |