summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-11-24 20:52:40 -0800
committerMichael Pavone <pavone@retrodev.com>2017-11-24 20:52:40 -0800
commit1b9df473d94f6548e8d43001ce70b90192230fd6 (patch)
tree8c295ed772988cf1cd9e8379e7e27f32834ca278
parent27b829ffc447758832cbd7ab2f9b7e427928d687 (diff)
Fix genesis save state loading via Nuklear UI, sms probably still needs work
--HG-- branch : nuklear_ui
-rw-r--r--genesis.c57
-rw-r--r--saves.c2
-rw-r--r--system.h1
3 files changed, 35 insertions, 25 deletions
diff --git a/genesis.c b/genesis.c
index 16b3b6b..1fa897f 100644
--- a/genesis.c
+++ b/genesis.c
@@ -996,37 +996,24 @@ void set_region(genesis_context *gen, rom_info *info, uint8_t region)
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 @@ static uint8_t load_state(system_header *system, uint8_t slot)
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 --git a/saves.c b/saves.c
index 955c959..18d7d9b 100644
--- a/saves.c
+++ b/saves.c
@@ -58,7 +58,7 @@ save_slot_info *get_slot_info(system_header *system, uint32_t *num_out)
} else {
strcpy(cur, "EMPTY");
}
- dst[i].modification_time;
+ dst[i].modification_time = modtime;
}
*num_out = QUICK_SAVE_SLOT + 1;
return dst;
diff --git a/system.h b/system.h
index 712d643..927a2f2 100644
--- a/system.h
+++ b/system.h
@@ -47,6 +47,7 @@ struct system_header {
uint8_t enter_debugger;
uint8_t should_exit;
uint8_t save_state;
+ uint8_t delayed_load_slot;
debugger_type debugger_type;
system_type type;
};