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