Mercurial > repos > blastem
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; |