diff 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
line wrap: on
line diff
--- a/blastem.c	Fri Nov 13 19:15:37 2015 -0800
+++ b/blastem.c	Fri Nov 13 22:56:59 2015 -0800
@@ -887,9 +887,20 @@
 	return gen;
 }
 
+void free_genesis(genesis_context *gen)
+{
+	vdp_free(gen->vdp);
+	m68k_options_free(gen->m68k->options);
+	free(gen->m68k);
+	z80_options_free(gen->z80->options);
+	free(gen->z80);
+	ym_free(gen->ym);
+	psg_free(gen->psg);
+	free(gen->save_storage);
+}
+
 void start_genesis(genesis_context *gen, char *statefile, uint8_t *debugger)
 {
-	set_keybindings(gen->ports);
 
 	if (statefile) {
 		uint32_t pc = load_gst(gen, statefile);
@@ -1129,14 +1140,25 @@
 		game_context = genesis;
 	}
 
+	set_keybindings(genesis->ports);
 	start_genesis(genesis, menu ? NULL : statefile, menu ? NULL : debuggerfun);
 	for(;;)
 	{
 		if (menu && menu_context->next_rom) {
+			if (game_context) {
+				if (game_context->save_type != SAVE_NONE) {
+					persist_save();
+				}
+				free(game_context->cart);
+				free(save_filename);
+				base_map[0].buffer = ram = game_context->work_ram;
+			} else {
+				base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t));
+			}
+			memset(ram, 0, RAM_WORDS * sizeof(uint16_t));
 			if (!(rom_size = load_rom(menu_context->next_rom))) {
 				fatal_error("Failed to open %s for reading\n", menu_context->next_rom);
 			}
-			base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t));
 			info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
 			byteswap_rom(rom_size);
 			set_region(&info, force_version);
@@ -1158,35 +1180,36 @@
 			if (!game_context) {
 				//start a new arena and save old one in suspended genesis context
 				genesis->arena = start_new_arena();
-				//allocate new genesis context
-				game_context = alloc_init_genesis(&info, fps, ym_log ? YM_OPT_WAVE_LOG : 0);
 			} else {
-				//TODO: hard reset of context with new ROM
+				genesis->arena = set_current_arena(game_context->arena);
+				mark_all_free();
+				free_genesis(game_context);
 			}
+			//allocate new genesis context
+			game_context = alloc_init_genesis(&info, fps, ym_log ? YM_OPT_WAVE_LOG : 0);
 			free(menu_context->next_rom);
 			menu_context->next_rom = NULL;
 			menu = 0;
 			genesis = game_context;
 			genesis->m68k->options->address_log = address_log;
+			map_all_bindings(genesis->ports);
 			start_genesis(genesis, statefile, debuggerfun);
 		}
 		else if (menu && game_context) {
-			puts("Switching back to game context");
 			genesis->arena = set_current_arena(game_context->arena);
 			genesis = game_context;
 			cart = genesis->cart;
 			ram = genesis->work_ram;
 			menu = 0;
-			set_keybindings(genesis->ports);
+			map_all_bindings(genesis->ports);
 			resume_68k(genesis->m68k);
 		} else if (!menu && menu_context) {
-			puts("Switching back to menu context");
 			genesis->arena = set_current_arena(menu_context->arena);
 			genesis = menu_context;
 			cart = genesis->cart;
 			ram = genesis->work_ram;
 			menu = 1;
-			set_keybindings(genesis->ports);
+			map_all_bindings(genesis->ports);
 			resume_68k(genesis->m68k);
 		} else {
 			break;