From 5f28453c112f3d3b9cb8fca12f3fa271e193da9b Mon Sep 17 00:00:00 2001 From: Peter Weingartner Date: Mon, 26 Aug 2024 19:54:12 -0400 Subject: [PATCH] Boot refinements and correcting machine IDs. --- misc/Memory Map.ods | Bin 0 -> 17996 bytes src/boot.c | 120 ++++++++++++++++++++++++++++++++++++-------- src/sys_general.c | 74 ++++++++++++--------------- src/sys_general.h | 8 ++- 4 files changed, 140 insertions(+), 62 deletions(-) create mode 100644 misc/Memory Map.ods diff --git a/misc/Memory Map.ods b/misc/Memory Map.ods new file mode 100644 index 0000000000000000000000000000000000000000..04aed86fdc95ce0a954115cc77e00db0dcf03e9e GIT binary patch literal 17996 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 0) { - txt_print(0, "Booting: /sd0/fnxboot.pgz\n"); + printf("Booting: /sd0/fnxboot.pgz\n"); boot_reset_screen(); proc_run("/sd0/fnxboot.pgz", 0, boot_args); } else if (fsys_stat("/sd0/fnxboot.pgx", &file_info) >= 0) { - txt_print(0, "Booting: /sd0/fnxboot.pgx\n"); + printf("Booting: /sd0/fnxboot.pgx\n"); boot_reset_screen(); result = proc_run("/sd0/fnxboot.pgx", 0, boot_args); if (result != 0) { @@ -301,9 +307,7 @@ void boot_from(enum boot_src_e device, boot_record_p boot_record) { case BOOT_SRC_CARTRIDGE: case BOOT_SRC_ROM: case BOOT_SRC_RAM: - txt_print(0, "Booting from "); - txt_print(0, boot_source_name(device)); - txt_print(0, "\n"); + printf("Booting from %s\n", boot_source_name(device)); // Double-check that the boot record is valid before we attempt to boot if (boot_record != 0) { @@ -313,35 +317,82 @@ void boot_from(enum boot_src_e device, boot_record_p boot_record) { proc_exec(boot_record->start_address, 0, 0, boot_args); } } else { - txt_print(0, "A valid boot record was not found.\n"); + printf("A valid boot record was not found.\n"); } break; default: - txt_print(0, "No bootable device is present.\n"); + printf("No bootable device is present.\n"); break; } } +/** + * @brief Convert a scan code to a menu selection + * + * Convert: function keys F1 - F8 to 1 - 8 + * SPACE to 0x20 + * + * @param scancode + * @return short + */ +static short sc_to_function(unsigned short scancode) { + switch(scancode) { + case kbd_sc_space: + return 0x20; + + case kbd_sc_f1: + return 1; + + case kbd_sc_f1 | kbd_mod_shift: + case kbd_sc_f2: + return 2; + + case kbd_sc_f3: + return 3; + + case kbd_sc_f3 | kbd_mod_shift: + case kbd_sc_f4: + return 4; + + case kbd_sc_f5: + return 5; + + case kbd_sc_f5 | kbd_mod_shift: + case kbd_sc_f6: + return 6; + + default: + return 0; + } +} + /** * @brief Setup the boot screen * */ void boot_screen() { enum boot_src_e boot_source = BOOT_SRC_NONE; - short i = 0; - long jiffies_target = 0; boot_record_p boot_record[10]; short boot_position = 0; + short bootable_count = 0; + short i = 0; + long jiffies_target = 0; + char message[80]; - // txt_set_mode(0, TXT_MODE_TEXT | TXT_MODE_SPRITE); + // Make sure that ANSI escape codes will be honored + chan_ioctrl(0, CON_IOCTRL_ANSI_ON, 0, 0); + + // TODO: debug this + // txt_set_mode(0, TXT_MODE_TEXT | TXT_MODE_SPRITE | VKY_MCR_TILE); *tvky_mstr_ctrl = (uint16_t)(VKY_MCR_TILE | VKY_MCR_SPRITE | VKY_MCR_GRAPHICS | VKY_MCR_TEXT_OVERLAY | VKY_MCR_TEXT); tvky_bg_color->blue = 0; tvky_bg_color->green = 0; tvky_bg_color->red = 0; + // Set up the highlighted (#0) and dimmed (#1) graphics CLUTs for (i = 0; i < 4 * 256; i++) { VKY_GR_CLUT_0[i] = boot_clut[i]; VKY_GR_CLUT_1[i] = boot_clut[i] >> 2; @@ -372,7 +423,7 @@ void boot_screen() { boot_text_window.size.height = 12; txt_set_region(0, &boot_text_window); - txt_print(0, "Scanning for bootable devices...\n"); + printf("Scanning for bootable devices...\n"); for (short position = 0; position < sizeof(boot_chain) / sizeof(enum boot_src_e); position++) { bootable[position] = false; @@ -380,12 +431,11 @@ void boot_screen() { if (is_bootable(boot_chain[position], &boot_record[position])) { boot_icon_highlight(position); bootable[position] = true; + bootable_count++; // Assign the boot source to this, if it hasn't already been bound if (boot_source == BOOT_SRC_NONE) { - txt_print(0, "Default boot source: "); - txt_print(0, boot_source_name(boot_chain[position])); - txt_put(0, '\n'); + printf("Default boot source: %s\n", boot_source_name(boot_chain[position])); boot_source = boot_chain[position]; boot_position = position; } @@ -408,16 +458,46 @@ void boot_screen() { } } - txt_print(0, "\nPress SPACE to use default.\n"); + // List out all the selectable boot sources + if (bootable_count > 1) { + printf("\nSelect a boot source:\n\n"); - jiffies_target = timers_jiffies() + 60 * 10; - while (jiffies_target > timers_jiffies()) { - unsigned short scancode = kbd_get_scancode(); - if (scancode == kbd_sc_space) { - break; + for (i = 0; i < sizeof(boot_chain) / sizeof(enum boot_src_e); i++) { + if (bootable[i]) { + sprintf(message, "\e[93mF%d\e[37m-%s\n", i+1, boot_source_name(boot_chain[i])); + chan_write(0, (uint8_t *)message, strlen(message)); + } } } + sprintf(message, "\nPress \e[93mSPACE\e[37m for default.\n"); + chan_write(0, (uint8_t *)message, strlen(message)); + + // Give the user time to press a key to select a boot source + // If the time expires, boot the default source (earliest in the boot chain) + + jiffies_target = timers_jiffies() + 60 * 15; + while (jiffies_target > timers_jiffies()) { + unsigned short scancode = kbd_get_scancode(); + if (scancode > 0) { + short selected = sc_to_function(scancode); + + if (selected == 0x20) { + // SPACE was pressed... just boot the default + break; + + } else if (selected > 0) { + if (bootable[selected - 1]) { + boot_position = selected - 1; + boot_source = boot_chain[boot_position]; + break; + } + } + } + + } + // And launch the system + boot_from(boot_source, boot_record[boot_position]); } diff --git a/src/sys_general.c b/src/sys_general.c index 22521ba..36854e7 100644 --- a/src/sys_general.c +++ b/src/sys_general.c @@ -2,6 +2,34 @@ #include "gabe_reg.h" #include "exp_reg.h" +/** + * @brief Names of the various models, indexed by their model IDs + * + */ +const char * sys_model_name[] = { + "C256 FMX", // 0 + "C256 U", + "F256 JR", + "F256 JRe", + "GenX", + "C256 U+", // 5 + "Reserved", + "Reserved", + "A2560 X", + "A2560 U+", + "A2560 M", // 10 + "A2560 K", + "A2560 K40", + "A2560 K60", + "Reserved", + "Reserved", // 15 + "F256 P", + "F256 K2c", + "F256 K2", + "F256 Ke", + "F256 K2e" // 20 +}; + /* * Fill out a s_MODEL_info structure with the information about the current system * @@ -132,10 +160,6 @@ void sys_get_information(p_sys_info info) { #elif MODEL == MODEL_FOENIX_F256 || MODEL == MODEL_FOENIX_F256K || MODEL == MODEL_FOENIX_F256K2 machine_id = GABE_SYS_STAT->machine_id; - // TODO: be able to remove this line - if (machine_id == 0x13) { - machine_id = MODEL_FOENIX_F256K; - } cpu = CPU_WDC65816; clock_speed = SYSCLK_6MHZ; @@ -269,26 +293,6 @@ void sys_get_information(p_sys_info info) { } switch (info->model) { - case MODEL_FOENIX_F256: - info->model_name = "F256jr"; - break; - - case MODEL_FOENIX_F256K: - info->model_name = "F256K"; - break; - - case MODEL_FOENIX_F256K2: - info->model_name = "F256K2"; - break; - - case MODEL_FOENIX_FMX: - info->model_name = "C256 FMX"; - break; - - case MODEL_FOENIX_C256U: - info->model_name = "C256 U"; - break; - case MODEL_FOENIX_GENX: switch (genx_model_id) { case 0: info->model_name = "GenX32 - PB"; break; @@ -298,14 +302,6 @@ void sys_get_information(p_sys_info info) { } break; - case MODEL_FOENIX_C256U_PLUS: - info->model_name = "C256 U+"; - break; - - case MODEL_FOENIX_A2560U_PLUS: - info->model_name = "A2560 U+"; - break; - case MODEL_FOENIX_A2560X: switch (genx_model_id) { case 0: info->model_name = "A2560X - PB"; break; @@ -315,16 +311,12 @@ void sys_get_information(p_sys_info info) { } break; - case MODEL_FOENIX_A2560U: - info->model_name = "A2560 U"; - break; - - case MODEL_FOENIX_A2560K: - info->model_name = "A2560 K"; - break; - default: - info->model_name = "UNKNOWN"; + if (info->model < sizeof(sys_model_name) / sizeof(char *)) { + info->model_name = sys_model_name[info->model]; + } else { + info->model_name = "UNKNOWN"; + } break; } } diff --git a/src/sys_general.h b/src/sys_general.h index b304c1e..53b8e03 100644 --- a/src/sys_general.h +++ b/src/sys_general.h @@ -15,6 +15,7 @@ #define MODEL_FOENIX_FMX 0 #define MODEL_FOENIX_C256U 1 #define MODEL_FOENIX_F256 2 +#define MODEL_FOENIX_F256JRE 3 #define MODEL_FOENIX_GENX 4 #define MODEL_FOENIX_C256U_PLUS 5 #define MODEL_FOENIX_A2560U_PLUS 6 @@ -22,8 +23,13 @@ #define MODEL_FOENIX_A2560U 9 #define MODEL_FOENIX_A2560M 10 #define MODEL_FOENIX_A2560K 11 -#define MODEL_FOENIX_F256K 18 +#define MODEL_FOENIX_A2560K40 12 +#define MODEL_FOENIX_A2560K60 13 +#define MODEL_FOENIX_F256P 16 #define MODEL_FOENIX_F256K2 17 +#define MODEL_FOENIX_F256K 18 +#define MODEL_FOENIX_F256KE 19 +#define MDOEL_FOENIX_F256K2E 20 /* IDs for the CPUs supported */