comparison genesis.c @ 1479:a568dca999b2 nuklear_ui

Fix genesis save state loading via Nuklear UI, sms probably still needs work
author Michael Pavone <pavone@retrodev.com>
date Fri, 24 Nov 2017 20:52:40 -0800
parents da1dce39e846
children c59adc305e46
comparison
equal deleted inserted replaced
1478:da1dce39e846 1479:a568dca999b2
994 gen->normal_clock = MCLKS_NTSC; 994 gen->normal_clock = MCLKS_NTSC;
995 } 995 }
996 gen->master_clock = gen->normal_clock; 996 gen->master_clock = gen->normal_clock;
997 } 997 }
998 998
999 static void handle_reset_requests(genesis_context *gen)
1000 {
1001 while (gen->reset_requested)
1002 {
1003 gen->reset_requested = 0;
1004 z80_assert_reset(gen->z80, gen->m68k->current_cycle);
1005 z80_clear_busreq(gen->z80, gen->m68k->current_cycle);
1006 ym_reset(gen->ym);
1007 //Is there any sort of VDP reset?
1008 m68k_reset(gen->m68k);
1009 }
1010 vdp_release_framebuffer(gen->vdp);
1011 }
1012
1013 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up 999 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up
1014 static uint8_t load_state(system_header *system, uint8_t slot) 1000 static uint8_t load_state(system_header *system, uint8_t slot)
1015 { 1001 {
1016 genesis_context *gen = (genesis_context *)system; 1002 genesis_context *gen = (genesis_context *)system;
1017 char numslotname[] = "slot_0.state"; 1003 char *statepath = get_slot_name(system, slot, "state");
1018 char *slotname;
1019 if (slot == QUICK_SAVE_SLOT) {
1020 slotname = "quicksave.state";
1021 } else {
1022 numslotname[5] = '0' + slot;
1023 slotname = numslotname;
1024 }
1025 char const *parts[] = {gen->header.save_dir, PATH_SEP, slotname};
1026 char *statepath = alloc_concat_m(3, parts);
1027 deserialize_buffer state; 1004 deserialize_buffer state;
1028 uint32_t pc = 0; 1005 uint32_t pc = 0;
1029 uint8_t ret; 1006 uint8_t ret;
1007 if (!gen->m68k->resume_pc) {
1008 system->delayed_load_slot = slot + 1;
1009 gen->m68k->should_return = 1;
1010 ret = get_modification_time(statepath) != 0;
1011 if (!ret) {
1012 strcpy(statepath + strlen(statepath)-strlen("state"), "gst");
1013 ret = get_modification_time(statepath) != 0;
1014 }
1015 goto done;
1016 }
1030 if (load_from_file(&state, statepath)) { 1017 if (load_from_file(&state, statepath)) {
1031 genesis_deserialize(&state, gen); 1018 genesis_deserialize(&state, gen);
1032 free(state.data); 1019 free(state.data);
1033 //HACK 1020 //HACK
1034 pc = gen->m68k->last_prefetch_address; 1021 pc = gen->m68k->last_prefetch_address;
1039 ret = pc != 0; 1026 ret = pc != 0;
1040 } 1027 }
1041 if (ret) { 1028 if (ret) {
1042 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc); 1029 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc);
1043 } 1030 }
1031 done:
1044 free(statepath); 1032 free(statepath);
1045 return ret; 1033 return ret;
1034 }
1035
1036 static void handle_reset_requests(genesis_context *gen)
1037 {
1038 while (gen->reset_requested || gen->header.delayed_load_slot)
1039 {
1040 if (gen->reset_requested) {
1041 gen->reset_requested = 0;
1042 z80_assert_reset(gen->z80, gen->m68k->current_cycle);
1043 z80_clear_busreq(gen->z80, gen->m68k->current_cycle);
1044 ym_reset(gen->ym);
1045 //Is there any sort of VDP reset?
1046 m68k_reset(gen->m68k);
1047 }
1048 if (gen->header.delayed_load_slot) {
1049 load_state(&gen->header, gen->header.delayed_load_slot - 1);
1050 gen->header.delayed_load_slot = 0;
1051 resume_68k(gen->m68k);
1052 }
1053 }
1054 vdp_release_framebuffer(gen->vdp);
1046 } 1055 }
1047 1056
1048 static void start_genesis(system_header *system, char *statefile) 1057 static void start_genesis(system_header *system, char *statefile)
1049 { 1058 {
1050 genesis_context *gen = (genesis_context *)system; 1059 genesis_context *gen = (genesis_context *)system;