Mercurial > repos > blastem
comparison blastem.c @ 884:252dfd29831d
Selecting a second game from the menu now works
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 13 Nov 2015 22:56:59 -0800 |
parents | 9f149f0e98b7 |
children | e3f5ec336432 |
comparison
equal
deleted
inserted
replaced
883:9f149f0e98b7 | 884:252dfd29831d |
---|---|
885 } | 885 } |
886 | 886 |
887 return gen; | 887 return gen; |
888 } | 888 } |
889 | 889 |
890 void free_genesis(genesis_context *gen) | |
891 { | |
892 vdp_free(gen->vdp); | |
893 m68k_options_free(gen->m68k->options); | |
894 free(gen->m68k); | |
895 z80_options_free(gen->z80->options); | |
896 free(gen->z80); | |
897 ym_free(gen->ym); | |
898 psg_free(gen->psg); | |
899 free(gen->save_storage); | |
900 } | |
901 | |
890 void start_genesis(genesis_context *gen, char *statefile, uint8_t *debugger) | 902 void start_genesis(genesis_context *gen, char *statefile, uint8_t *debugger) |
891 { | 903 { |
892 set_keybindings(gen->ports); | |
893 | 904 |
894 if (statefile) { | 905 if (statefile) { |
895 uint32_t pc = load_gst(gen, statefile); | 906 uint32_t pc = load_gst(gen, statefile); |
896 if (!pc) { | 907 if (!pc) { |
897 fatal_error("Failed to load save state %s\n", statefile); | 908 fatal_error("Failed to load save state %s\n", statefile); |
1127 } else { | 1138 } else { |
1128 genesis->m68k->options->address_log = address_log; | 1139 genesis->m68k->options->address_log = address_log; |
1129 game_context = genesis; | 1140 game_context = genesis; |
1130 } | 1141 } |
1131 | 1142 |
1143 set_keybindings(genesis->ports); | |
1132 start_genesis(genesis, menu ? NULL : statefile, menu ? NULL : debuggerfun); | 1144 start_genesis(genesis, menu ? NULL : statefile, menu ? NULL : debuggerfun); |
1133 for(;;) | 1145 for(;;) |
1134 { | 1146 { |
1135 if (menu && menu_context->next_rom) { | 1147 if (menu && menu_context->next_rom) { |
1148 if (game_context) { | |
1149 if (game_context->save_type != SAVE_NONE) { | |
1150 persist_save(); | |
1151 } | |
1152 free(game_context->cart); | |
1153 free(save_filename); | |
1154 base_map[0].buffer = ram = game_context->work_ram; | |
1155 } else { | |
1156 base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t)); | |
1157 } | |
1158 memset(ram, 0, RAM_WORDS * sizeof(uint16_t)); | |
1136 if (!(rom_size = load_rom(menu_context->next_rom))) { | 1159 if (!(rom_size = load_rom(menu_context->next_rom))) { |
1137 fatal_error("Failed to open %s for reading\n", menu_context->next_rom); | 1160 fatal_error("Failed to open %s for reading\n", menu_context->next_rom); |
1138 } | 1161 } |
1139 base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t)); | |
1140 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); | 1162 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); |
1141 byteswap_rom(rom_size); | 1163 byteswap_rom(rom_size); |
1142 set_region(&info, force_version); | 1164 set_region(&info, force_version); |
1143 update_title(info.name); | 1165 update_title(info.name); |
1144 fname_size = strlen(romfname); | 1166 fname_size = strlen(romfname); |
1156 strcpy(save_filename + fname_size + 1, ext); | 1178 strcpy(save_filename + fname_size + 1, ext); |
1157 } | 1179 } |
1158 if (!game_context) { | 1180 if (!game_context) { |
1159 //start a new arena and save old one in suspended genesis context | 1181 //start a new arena and save old one in suspended genesis context |
1160 genesis->arena = start_new_arena(); | 1182 genesis->arena = start_new_arena(); |
1161 //allocate new genesis context | |
1162 game_context = alloc_init_genesis(&info, fps, ym_log ? YM_OPT_WAVE_LOG : 0); | |
1163 } else { | 1183 } else { |
1164 //TODO: hard reset of context with new ROM | 1184 genesis->arena = set_current_arena(game_context->arena); |
1165 } | 1185 mark_all_free(); |
1186 free_genesis(game_context); | |
1187 } | |
1188 //allocate new genesis context | |
1189 game_context = alloc_init_genesis(&info, fps, ym_log ? YM_OPT_WAVE_LOG : 0); | |
1166 free(menu_context->next_rom); | 1190 free(menu_context->next_rom); |
1167 menu_context->next_rom = NULL; | 1191 menu_context->next_rom = NULL; |
1168 menu = 0; | 1192 menu = 0; |
1169 genesis = game_context; | 1193 genesis = game_context; |
1170 genesis->m68k->options->address_log = address_log; | 1194 genesis->m68k->options->address_log = address_log; |
1195 map_all_bindings(genesis->ports); | |
1171 start_genesis(genesis, statefile, debuggerfun); | 1196 start_genesis(genesis, statefile, debuggerfun); |
1172 } | 1197 } |
1173 else if (menu && game_context) { | 1198 else if (menu && game_context) { |
1174 puts("Switching back to game context"); | |
1175 genesis->arena = set_current_arena(game_context->arena); | 1199 genesis->arena = set_current_arena(game_context->arena); |
1176 genesis = game_context; | 1200 genesis = game_context; |
1177 cart = genesis->cart; | 1201 cart = genesis->cart; |
1178 ram = genesis->work_ram; | 1202 ram = genesis->work_ram; |
1179 menu = 0; | 1203 menu = 0; |
1180 set_keybindings(genesis->ports); | 1204 map_all_bindings(genesis->ports); |
1181 resume_68k(genesis->m68k); | 1205 resume_68k(genesis->m68k); |
1182 } else if (!menu && menu_context) { | 1206 } else if (!menu && menu_context) { |
1183 puts("Switching back to menu context"); | |
1184 genesis->arena = set_current_arena(menu_context->arena); | 1207 genesis->arena = set_current_arena(menu_context->arena); |
1185 genesis = menu_context; | 1208 genesis = menu_context; |
1186 cart = genesis->cart; | 1209 cart = genesis->cart; |
1187 ram = genesis->work_ram; | 1210 ram = genesis->work_ram; |
1188 menu = 1; | 1211 menu = 1; |
1189 set_keybindings(genesis->ports); | 1212 map_all_bindings(genesis->ports); |
1190 resume_68k(genesis->m68k); | 1213 resume_68k(genesis->m68k); |
1191 } else { | 1214 } else { |
1192 break; | 1215 break; |
1193 } | 1216 } |
1194 } | 1217 } |