summaryrefslogtreecommitdiff
path: root/genesis.c
diff options
context:
space:
mode:
Diffstat (limited to 'genesis.c')
-rw-r--r--genesis.c57
1 files changed, 33 insertions, 24 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;