Mercurial > repos > blastem
diff 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 |
line wrap: on
line diff
--- a/genesis.c Sun Aug 13 22:59:01 2017 -0700 +++ b/genesis.c Wed Aug 16 20:06:28 2017 -0700 @@ -1003,6 +1003,41 @@ 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.next_context->save_dir, PATH_SEP, slotname}; + char *statepath = alloc_concat_m(3, parts); + deserialize_buffer state; + uint32_t pc = 0; + uint8_t ret; + if (load_from_file(&state, statepath)) { + genesis_deserialize(&state, gen); + free(state.data); + //HACK + pc = gen->m68k->last_prefetch_address; + ret = 1; + } else { + strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); + pc = load_gst(gen, statepath); + ret = pc != 0; + } + if (ret) { + gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc); + } + free(statepath); + return ret; +} + static void start_genesis(system_header *system, char *statefile) { genesis_context *gen = (genesis_context *)system; @@ -1146,6 +1181,7 @@ gen->header.resume_context = resume_genesis; gen->header.load_save = load_save; gen->header.persist_save = persist_save; + gen->header.load_state = load_state; gen->header.soft_reset = soft_reset; gen->header.free_context = free_genesis; gen->header.get_open_bus_value = get_open_bus_value;