# HG changeset patch # User Michael Pavone # Date 1511585560 28800 # Node ID a568dca999b2fe08b57dcbaef543a2d6b5fe396e # Parent da1dce39e8462386eb24f0ee9d071bef08711fbe Fix genesis save state loading via Nuklear UI, sms probably still needs work diff -r da1dce39e846 -r a568dca999b2 genesis.c --- a/genesis.c Fri Nov 24 12:04:02 2017 -0800 +++ b/genesis.c Fri Nov 24 20:52:40 2017 -0800 @@ -996,37 +996,24 @@ gen->master_clock = gen->normal_clock; } -static void handle_reset_requests(genesis_context *gen) -{ - while (gen->reset_requested) - { - gen->reset_requested = 0; - z80_assert_reset(gen->z80, gen->m68k->current_cycle); - z80_clear_busreq(gen->z80, gen->m68k->current_cycle); - ym_reset(gen->ym); - //Is there any sort of VDP reset? - m68k_reset(gen->m68k); - } - vdp_release_framebuffer(gen->vdp); -} - #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up static uint8_t load_state(system_header *system, uint8_t slot) { genesis_context *gen = (genesis_context *)system; - char numslotname[] = "slot_0.state"; - char *slotname; - if (slot == QUICK_SAVE_SLOT) { - slotname = "quicksave.state"; - } else { - numslotname[5] = '0' + slot; - slotname = numslotname; - } - char const *parts[] = {gen->header.save_dir, PATH_SEP, slotname}; - char *statepath = alloc_concat_m(3, parts); + char *statepath = get_slot_name(system, slot, "state"); deserialize_buffer state; uint32_t pc = 0; uint8_t ret; + if (!gen->m68k->resume_pc) { + system->delayed_load_slot = slot + 1; + gen->m68k->should_return = 1; + ret = get_modification_time(statepath) != 0; + if (!ret) { + strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); + ret = get_modification_time(statepath) != 0; + } + goto done; + } if (load_from_file(&state, statepath)) { genesis_deserialize(&state, gen); free(state.data); @@ -1041,10 +1028,32 @@ if (ret) { gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc); } +done: free(statepath); return ret; } +static void handle_reset_requests(genesis_context *gen) +{ + while (gen->reset_requested || gen->header.delayed_load_slot) + { + if (gen->reset_requested) { + gen->reset_requested = 0; + z80_assert_reset(gen->z80, gen->m68k->current_cycle); + z80_clear_busreq(gen->z80, gen->m68k->current_cycle); + ym_reset(gen->ym); + //Is there any sort of VDP reset? + m68k_reset(gen->m68k); + } + if (gen->header.delayed_load_slot) { + load_state(&gen->header, gen->header.delayed_load_slot - 1); + gen->header.delayed_load_slot = 0; + resume_68k(gen->m68k); + } + } + vdp_release_framebuffer(gen->vdp); +} + static void start_genesis(system_header *system, char *statefile) { genesis_context *gen = (genesis_context *)system; diff -r da1dce39e846 -r a568dca999b2 saves.c --- a/saves.c Fri Nov 24 12:04:02 2017 -0800 +++ b/saves.c Fri Nov 24 20:52:40 2017 -0800 @@ -58,7 +58,7 @@ } else { strcpy(cur, "EMPTY"); } - dst[i].modification_time; + dst[i].modification_time = modtime; } *num_out = QUICK_SAVE_SLOT + 1; return dst; diff -r da1dce39e846 -r a568dca999b2 system.h --- a/system.h Fri Nov 24 12:04:02 2017 -0800 +++ b/system.h Fri Nov 24 20:52:40 2017 -0800 @@ -47,6 +47,7 @@ uint8_t enter_debugger; uint8_t should_exit; uint8_t save_state; + uint8_t delayed_load_slot; debugger_type debugger_type; system_type type; };