From 203c8a92c45e8f73f768347ab870999b4875d72f Mon Sep 17 00:00:00 2001 From: Sorgelig Date: Sun, 10 Sep 2023 00:55:40 +0800 Subject: [PATCH] user_io: improved persistent file loading. Don't load boot.rom if user choose specific persistent file. --- user_io.cpp | 77 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/user_io.cpp b/user_io.cpp index c6feea7..c37ac43 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -588,9 +588,14 @@ static char midi_speed_labels[13][32] = {}; static const uint32_t mlink_speeds[13] = { 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 31250, 38400, 57600, 115200 }; static const char mlink_speed_labels[13][32] = { "110", "300", "600", "1200", "2400", "4800", "9600", "14400", "19200", "31250/MIDI", "38400", "57600", "115200" }; static char defmra[1024] = {}; +static int boot0_loaded = 0; +static int boot0_mounted = 0; static void parse_config() { + static char str[1024]; + static char ext[256]; + char mask[sizeof(cur_status) * 8] = {}; char overlap[sizeof(cur_status) * 8] = {}; int start, end, sz; @@ -832,7 +837,6 @@ static void parse_config() if (p[idx] == 'C') { idx++; - static char str[1024]; uint32_t load_addr = 0; if (substrcpy(str, p, 3)) { @@ -845,22 +849,29 @@ static void parse_config() } sprintf(str, "%s.f%c", user_io_get_core_name(), p[idx]); + substrcpy(ext, p, 1); + while (strlen(ext) % 3) strcat(ext, " "); + if (FileLoadConfig(str, str, sizeof(str)) && str[0]) { - idx = p[idx] - '0'; StoreIdx_F(idx, str); - user_io_file_tx(str, idx, opensave, 0, 0, load_addr); + user_io_file_tx(str, (user_io_ext_idx(str, ext) << 6) | idx, opensave, 0, 0, load_addr); + if (!idx) boot0_loaded = 1; + + if (is_cpc()) + { + char *p = strrchr(str, '.'); + if (p && (!strcasecmp(p, ".eZZ") || !strcasecmp(p, ".eZ0"))) boot0_loaded = 1; + } } } } if (p[0] == 'S' && p[1] == 'C') { - static char str[1024]; sprintf(str, "%s.s%c", user_io_get_core_name(), p[2]); - static char ext[256]; substrcpy(ext, p, 1); while (strlen(ext) % 3) strcat(ext, " "); @@ -883,10 +894,11 @@ static void parse_config() } else { - if (!is_c128()) - user_io_set_index(user_io_ext_idx(str, ext) << 6 | idx); + if (!is_c128()) user_io_set_index((user_io_ext_idx(str, ext) << 6) | idx); user_io_file_mount(str, idx); } + + if (!idx) boot0_mounted = 1; } } } @@ -899,7 +911,6 @@ static void parse_config() printf("// 0 1 2 3 4 5 6 \n"); printf("// 01234567890123456789012345678901 23456789012345678901234567890123\n"); printf("// 0123456789ABCDEFGHIJKLMNOPQRSTUV 0123456789ABCDEFGHIJKLMNOPQRSTUV\n"); - char str[128]; strcpy(str, "// "); for (int i = 0; i < 32; i++) strcat(str, mask[i] ? "X" : " "); strcat(str, " "); @@ -1455,7 +1466,7 @@ void user_io_init(const char *path, const char *xml) if (!is_cpc()) { // check for multipart rom - for (char i = 0; i < 4; i++) + for (char i = (boot0_loaded ? 1 : 0); i < 4; i++) { sprintf(mainpath, "%s/boot%d.rom", home, i); user_io_file_tx(mainpath, i << 6); @@ -1463,17 +1474,20 @@ void user_io_init(const char *path, const char *xml) } // legacy style of rom - sprintf(mainpath, "%s/boot.rom", home); - if (!user_io_file_tx(mainpath)) + if (!boot0_loaded) { - strcpy(name + strlen(name) - 3, "ROM"); - sprintf(mainpath, "%s/%s", get_rbf_dir(), name); - if (!get_rbf_dir()[0] || !user_io_file_tx(mainpath)) + sprintf(mainpath, "%s/boot.rom", home); + if (!user_io_file_tx(mainpath)) { - if (!user_io_file_tx(name)) + strcpy(name + strlen(name) - 3, "ROM"); + sprintf(mainpath, "%s/%s", get_rbf_dir(), name); + if (!get_rbf_dir()[0] || !user_io_file_tx(mainpath)) { - sprintf(mainpath, "bootrom/%s", name); - user_io_file_tx(mainpath); + if (!user_io_file_tx(name)) + { + sprintf(mainpath, "bootrom/%s", name); + user_io_file_tx(mainpath); + } } } } @@ -1500,7 +1514,7 @@ void user_io_init(const char *path, const char *xml) } // check if vhd present - for (char i = 0; i < 4; i++) + for (char i = (boot0_mounted ? 1 : 0); i < 4; i++) { sprintf(mainpath, "%s/boot%d.vhd", home, i); if (FileExists(mainpath)) @@ -1510,25 +1524,28 @@ void user_io_init(const char *path, const char *xml) } } - sprintf(mainpath, "%s/boot.vhd", home); - if (FileExists(mainpath)) + if (!boot0_mounted) { - user_io_set_index(0); - user_io_file_mount(mainpath, 0); - } - else - { - strcpy(name + strlen(name) - 3, "VHD"); - sprintf(mainpath, "%s/%s", get_rbf_dir(), name); + sprintf(mainpath, "%s/boot.vhd", home); if (FileExists(mainpath)) { user_io_set_index(0); user_io_file_mount(mainpath, 0); } - else if (FileExists(name)) + else { - user_io_set_index(0); - user_io_file_mount(name, 0); + strcpy(name + strlen(name) - 3, "VHD"); + sprintf(mainpath, "%s/%s", get_rbf_dir(), name); + if (FileExists(mainpath)) + { + user_io_set_index(0); + user_io_file_mount(mainpath, 0); + } + else if (FileExists(name)) + { + user_io_set_index(0); + user_io_file_mount(name, 0); + } } } }