# HG changeset patch # User Michael Pavone # Date 1503548297 25200 # Node ID e2bd03ed3190d057036e0f311554e96d6f2cdef8 # Parent da72344af3ffbc088a5b6075300c38e630e68f62 Allow reloading current ROM with a hotkey (default F5) and allow locking on a cartridge via menu diff -r da72344af3ff -r e2bd03ed3190 blastem.c --- a/blastem.c Mon Aug 21 23:49:56 2017 -0700 +++ b/blastem.c Wed Aug 23 21:18:17 2017 -0700 @@ -207,6 +207,37 @@ } } +static system_media cart, lock_on; +void reload_media(void) +{ + if (current_system->next_rom) { + free(current_system->next_rom); + } + char const *parts[] = { + cart.dir, PATH_SEP, cart.name, ".", cart.extension + }; + char const **start = parts[0] ? parts : parts + 2; + int num_parts = parts[0] ? 5 : 3; + if (!parts[4]) { + num_parts--; + } + current_system->next_rom = alloc_concat_m(num_parts, start); + current_system->request_exit(current_system); +} + +void lockon_media(char *lock_on_path) +{ + reload_media(); + cart.chain = &lock_on; + free(lock_on.dir); + free(lock_on.name); + free(lock_on.extension); + lock_on.dir = path_dirname(lock_on_path); + lock_on.name = basename_no_extension(lock_on_path); + lock_on.extension = path_extension(lock_on_path); + lock_on.size = load_rom(lock_on_path, &lock_on.buffer, NULL); +} + int main(int argc, char ** argv) { set_exe_str(argv[0]); @@ -220,7 +251,6 @@ uint8_t force_region = 0; char * romfname = NULL; char * statefile = NULL; - system_media cart = {.chain = NULL}, lock_on; debugger_type dtype = DEBUGGER_NATIVE; uint8_t start_in_debugger = 0; uint8_t fullscreen = FULLSCREEN_DEFAULT, use_gl = 1; @@ -344,6 +374,7 @@ if (!(cart.size = load_rom(argv[i], &cart.buffer, stype == SYSTEM_UNKNOWN ? &stype : NULL))) { fatal_error("Failed to open %s for reading\n", argv[i]); } + cart.dir = path_dirname(argv[i]); cart.name = basename_no_extension(argv[i]); cart.extension = path_extension(argv[i]); romfname = argv[i]; @@ -378,6 +409,7 @@ } //force system detection, value on command line is only for games not the menu stype = detect_system_type(&cart); + cart.dir = path_dirname(romfname); cart.name = basename_no_extension(romfname); cart.extension = path_extension(romfname); loaded = 1; @@ -461,6 +493,10 @@ if (!(cart.size = load_rom(next_rom, &cart.buffer, &stype))) { fatal_error("Failed to open %s for reading\n", next_rom); } + free(cart.dir); + free(cart.name); + free(cart.extension); + cart.dir = path_dirname(next_rom); cart.name = basename_no_extension(next_rom); cart.extension = path_extension(next_rom); stype = force_stype; @@ -475,7 +511,9 @@ if (!game_system) { fatal_error("Failed to configure emulated machine for %s\n", next_rom); } - menu_system->next_context = game_system; + if (menu_system) { + menu_system->next_context = game_system; + } game_system->next_context = menu_system; setup_saves(&cart, &info, game_system); update_title(info.name); diff -r da72344af3ff -r e2bd03ed3190 blastem.h --- a/blastem.h Mon Aug 21 23:49:56 2017 -0700 +++ b/blastem.h Wed Aug 23 21:18:17 2017 -0700 @@ -16,5 +16,7 @@ extern char *save_filename; extern uint8_t use_native_states; #define QUICK_SAVE_SLOT 10 +void reload_media(void); +void lockon_media(char *lock_on_path); #endif //BLASTEM_H_ diff -r da72344af3ff -r e2bd03ed3190 default.cfg --- a/default.cfg Mon Aug 21 23:49:56 2017 -0700 +++ b/default.cfg Wed Aug 23 21:18:17 2017 -0700 @@ -33,6 +33,7 @@ - ui.prev_speed f11 ui.toggle_fullscreen tab ui.soft_reset + f5 ui.reload z ui.sms_pause rctrl ui.toggle_keyboard_captured } diff -r da72344af3ff -r e2bd03ed3190 io.c --- a/io.c Mon Aug 21 23:49:56 2017 -0700 +++ b/io.c Wed Aug 23 21:18:17 2017 -0700 @@ -77,6 +77,7 @@ UI_TOGGLE_KEYBOARD_CAPTURE, UI_TOGGLE_FULLSCREEN, UI_SOFT_RESET, + UI_RELOAD, UI_SMS_PAUSE, UI_SCREENSHOT, UI_EXIT @@ -498,6 +499,9 @@ case UI_SOFT_RESET: current_system->soft_reset(current_system); break; + case UI_RELOAD: + reload_media(); + break; case UI_SMS_PAUSE: if (current_system->type == SYSTEM_SMS) { sms_context *sms = (sms_context *)current_system; @@ -714,6 +718,8 @@ *ui_out = UI_TOGGLE_FULLSCREEN; } else if (!strcmp(target + 3, "soft_reset")) { *ui_out = UI_SOFT_RESET; + } else if (!strcmp(target + 3, "reload")) { + *ui_out = UI_RELOAD; } else if (!strcmp(target + 3, "sms_pause")) { *ui_out = UI_SMS_PAUSE; } else if (!strcmp(target + 3, "screenshot")) { diff -r da72344af3ff -r e2bd03ed3190 menu.c --- a/menu.c Mon Aug 21 23:49:56 2017 -0700 +++ b/menu.c Wed Aug 23 21:18:17 2017 -0700 @@ -365,12 +365,19 @@ } break; } - case 2: { + case 2: + case 8: { char buf[4096]; copy_string_from_guest(m68k, dst, buf, sizeof(buf)); char const *pieces[] = {menu->curpath, PATH_SEP, buf}; - gen->header.next_rom = alloc_concat_m(3, pieces); - m68k->should_return = 1; + char *selected = alloc_concat_m(3, pieces); + if ((address >> 2) == 2) { + gen->header.next_rom = selected; + m68k->should_return = 1; + } else { + lockon_media(selected); + free(selected); + } break; } case 3: { diff -r da72344af3ff -r e2bd03ed3190 menu.s68 --- a/menu.s68 Mon Aug 21 23:49:56 2017 -0700 +++ b/menu.s68 Wed Aug 23 21:18:17 2017 -0700 @@ -169,6 +169,8 @@ dir_buffer equ $100000 menu_port equ $180000 +load_rom_port equ (menu_port+2*4) +lock_on_port equ (menu_port+8*4) MAX_DISPLAY equ 24 @@ -183,6 +185,7 @@ menu_functions rs.l 1 cursor_show_fun rs.l 1 special_click rs.l 1 +rom_load_addr rs.l 1 mouse_x rs.w 1 selection_top rs.w 1 selection_bot rs.w 1 @@ -370,7 +373,7 @@ tst.b (-1, a2) bne enter_dir ;regular file - lea menu_port+8, a3 + move.l rom_load_addr.w, a3 move.l a2, (a3) addq #6, a7 @@ -905,7 +908,12 @@ bsr draw_menu bra gamepad_setup +lock_on: + move.l #lock_on_port, rom_load_addr.w + bra menu_common menu_start: + move.l #load_rom_port, rom_load_addr.w +menu_common: moveq #0, d0 ;init vertical scroll RAM vdpaccess $0, VDP_VSRAM_WRITE @@ -1412,6 +1420,7 @@ pause_menu: dc.b "Resume", 0 dc.b "Load ROM", 0 + dc.b "Lock On", 0 dc.b "Save State", 0 dc.b "Load State", 0 dc.b "Exit", 0 @@ -1421,6 +1430,7 @@ pause_menu_func dc.l resume dc.l menu_start + dc.l lock_on dc.l save_state dc.l load_state dc.l exit diff -r da72344af3ff -r e2bd03ed3190 system.h --- a/system.h Mon Aug 21 23:49:56 2017 -0700 +++ b/system.h Wed Aug 23 21:18:17 2017 -0700 @@ -53,6 +53,7 @@ struct system_media { void *buffer; + char *dir; char *name; char *extension; system_media *chain; diff -r da72344af3ff -r e2bd03ed3190 util.c --- a/util.c Mon Aug 21 23:49:56 2017 -0700 +++ b/util.c Wed Aug 23 21:18:17 2017 -0700 @@ -270,6 +270,26 @@ return strdup(lastdot+1); } +char * path_dirname(char *path) +{ + char *lastslash = NULL; + char *cur; + for (cur = path; *cur; cur++) + { + if (is_path_sep(*cur)) { + lastslash = cur; + } + } + if (!lastslash) { + return NULL; + } + char *dir = malloc(lastslash-path+1); + memcpy(dir, path, lastslash-path); + dir[lastslash-path] = 0; + + return dir; +} + uint32_t nearest_pow2(uint32_t val) { uint32_t ret = 1; diff -r da72344af3ff -r e2bd03ed3190 util.h --- a/util.h Mon Aug 21 23:49:56 2017 -0700 +++ b/util.h Wed Aug 23 21:18:17 2017 -0700 @@ -42,6 +42,8 @@ char * basename_no_extension(char *path); //Returns the extension from a path or NULL if there is no extension char *path_extension(char *path); +//Returns the directory portion of a path or NULL if there is no directory part +char *path_dirname(char *path); //Gets the smallest power of two that is >= a certain value, won't work for values > 0x80000000 uint32_t nearest_pow2(uint32_t val); //Should be called by main with the value of argv[0] for use by get_exe_dir