changeset 1438:e2bd03ed3190

Allow reloading current ROM with a hotkey (default F5) and allow locking on a cartridge via menu
author Michael Pavone <pavone@retrodev.com>
date Wed, 23 Aug 2017 21:18:17 -0700
parents da72344af3ff
children 7da675d0c512
files blastem.c blastem.h default.cfg io.c menu.c menu.s68 system.h util.c util.h
diffstat 9 files changed, 93 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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_
--- 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
 	}
--- 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")) {
--- 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: {
--- 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
--- 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;
--- 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;
--- 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