summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blastem.c42
-rw-r--r--blastem.h2
-rw-r--r--default.cfg1
-rw-r--r--io.c6
-rw-r--r--menu.c13
-rw-r--r--menu.s6812
-rw-r--r--system.h1
-rw-r--r--util.c20
-rw-r--r--util.h2
9 files changed, 93 insertions, 6 deletions
diff --git a/blastem.c b/blastem.c
index 1ab6e8b..bfb8f29 100644
--- a/blastem.c
+++ b/blastem.c
@@ -207,6 +207,37 @@ static void on_drag_drop(const char *filename)
}
}
+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 @@ int main(int argc, char ** argv)
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 @@ int main(int argc, char ** argv)
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 @@ int main(int argc, char ** argv)
}
//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 @@ int main(int argc, char ** argv)
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 @@ int main(int argc, char ** argv)
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 --git a/blastem.h b/blastem.h
index c06e002..96fd879 100644
--- a/blastem.h
+++ b/blastem.h
@@ -16,5 +16,7 @@ extern char *save_state_path;
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 --git a/default.cfg b/default.cfg
index 63087da..b55a1eb 100644
--- a/default.cfg
+++ b/default.cfg
@@ -33,6 +33,7 @@ bindings {
- ui.prev_speed
f11 ui.toggle_fullscreen
tab ui.soft_reset
+ f5 ui.reload
z ui.sms_pause
rctrl ui.toggle_keyboard_captured
}
diff --git a/io.c b/io.c
index 75d2a98..45a8218 100644
--- a/io.c
+++ b/io.c
@@ -77,6 +77,7 @@ typedef enum {
UI_TOGGLE_KEYBOARD_CAPTURE,
UI_TOGGLE_FULLSCREEN,
UI_SOFT_RESET,
+ UI_RELOAD,
UI_SMS_PAUSE,
UI_SCREENSHOT,
UI_EXIT
@@ -498,6 +499,9 @@ void handle_binding_up(keybinding * binding)
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 @@ int parse_binding_target(char * target, tern_node * padbuttons, tern_node *mouse
*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 --git a/menu.c b/menu.c
index e37cd21..864edd4 100644
--- a/menu.c
+++ b/menu.c
@@ -365,12 +365,19 @@ void * menu_write_w(uint32_t address, void * context, uint16_t value)
}
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 --git a/menu.s68 b/menu.s68
index 68c1442..54a725b 100644
--- a/menu.s68
+++ b/menu.s68
@@ -169,6 +169,8 @@ dmasrc macro
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 @@ mouse_sprite rs.l 1
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 @@ select_entry:
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 @@ show_pause_menu:
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 @@ about_menu_func:
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:
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 --git a/system.h b/system.h
index b71097b..712d643 100644
--- a/system.h
+++ b/system.h
@@ -53,6 +53,7 @@ struct system_header {
struct system_media {
void *buffer;
+ char *dir;
char *name;
char *extension;
system_media *chain;
diff --git a/util.c b/util.c
index 8bb1184..8601fca 100644
--- a/util.c
+++ b/util.c
@@ -270,6 +270,26 @@ char *path_extension(char *path)
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 --git a/util.h b/util.h
index 92b643a..a426edb 100644
--- a/util.h
+++ b/util.h
@@ -42,6 +42,8 @@ char is_absolute_path(char *path);
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