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 }