From edf8e13da1c8875d42de536a9773529aa1cd92cd Mon Sep 17 00:00:00 2001 From: Mateusz Faderewski Date: Sun, 16 Jul 2023 13:13:02 +0200 Subject: [PATCH] Settings cleanup + SC64 config default state + libdragon update --- Makefile | 2 +- README.md | 24 +------------ libdragon | 2 +- src/flashcart/sc64/sc64.c | 29 ++++++++++++++++ src/flashcart/sc64/sc64_internal.h | 46 ++++++++++++++++++++++++- src/menu/menu.c | 9 ++--- src/menu/settings.c | 55 +++++++++++++----------------- src/menu/settings.h | 10 ++++-- 8 files changed, 111 insertions(+), 66 deletions(-) diff --git a/Makefile b/Makefile index 27e65148..f69a2e6b 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ SRCS = \ ASSETS = \ FiraMono-Bold.ttf -$(BUILD_DIR)/FiraMono-Bold.o: MKFONT_FLAGS+=--size 16 -r 20-7F -r 2000-206F -r 2190-21FF +$(BUILD_DIR)/FiraMono-Bold.o: MKFONT_FLAGS+=-c 0 --size 16 -r 20-7F -r 2000-206F -r 2190-21FF $(BUILD_DIR)/%.o: $(ASSETS_DIR)/%.ttf @echo " [FONT] $@" diff --git a/README.md b/README.md index acd695fd..f059b883 100644 --- a/README.md +++ b/README.md @@ -15,28 +15,6 @@ Download the `sc64menu.n64` ROM from the latest action run assets. Add it to the root folder on your SD card. -(Optional): -Create a file called `config.sc64.toml.txt` -Add the following content, replacing the comments. -``` -[last_rom] - rom_path = "" - save_path = "" - save_type = - auto_load = - save_writeback = false - -[last_state] - auto_load_last_rom = false - current_directory = "sd://" - -[boot_params] - device_type = 0; - reset_type = 1; - detect_tv_type = true; - detect_cic_seed = true; -``` -Save it to the root folder on your SD card. #### Save types `0` = NONE @@ -50,7 +28,7 @@ Save it to the root folder on your SD card. ### ED64 -Not currently not supported, but there is an aim to do so. +Currently not supported, but there is an aim to do so. The aim is to replace [Altra64](https://github.com/networkfusion/altra64) and [ED64-UnofficialOS](https://github.com/n64-tools/ED64-UnofficialOS-binaries). diff --git a/libdragon b/libdragon index afa6c25f..520419b7 160000 --- a/libdragon +++ b/libdragon @@ -1 +1 @@ -Subproject commit afa6c25f9e8186432d9480b5fe1aff4f29ab05a1 +Subproject commit 520419b7a952eb519c89539fb2cb2f097bf3c2cf diff --git a/src/flashcart/sc64/sc64.c b/src/flashcart/sc64/sc64.c index bfe28467..77ed5ad6 100644 --- a/src/flashcart/sc64/sc64.c +++ b/src/flashcart/sc64/sc64.c @@ -89,12 +89,41 @@ static flashcart_error_t sc64_init (void) { } } while (writeback_pending); + const struct { + sc64_cfg_t id; + uint32_t value; + } default_config[] = { + { CFG_BOOTLOADER_SWITCH, false }, + { CFG_ROM_WRITE_ENABLE, false }, + { CFG_ROM_SHADOW_ENABLE, false }, + { CFG_DD_MODE, DD_MODE_DISABLED }, + { CFG_ISV_ADDRESS, 0x00000000 }, + { CFG_BOOT_MODE, BOOT_MODE_MENU }, + { CFG_SAVE_TYPE, SAVE_TYPE_NONE }, + { CFG_CIC_SEED, CIC_SEED_AUTO }, + { CFG_TV_TYPE, TV_TYPE_PASSTHROUGH }, + { CFG_DD_SD_ENABLE, false }, + { CFG_DD_DRIVE_TYPE, DRIVE_TYPE_RETAIL }, + { CFG_DD_DISK_STATE, DISK_STATE_EJECTED }, + { CFG_BUTTON_MODE, BUTTON_MODE_NONE }, + { CFG_ROM_EXTENDED_ENABLE, false }, + }; + + for (int i = 0; i < sizeof(default_config) / sizeof(default_config[0]); i++) { + if (sc64_set_config(default_config[i].id, default_config[i].value) != SC64_OK) { + return FLASHCART_ERROR_INT; + } + } + return FLASHCART_OK; } static flashcart_error_t sc64_deinit (void) { + // NOTE: Necessary because libcart enables ROM write by default sc64_set_config(CFG_ROM_WRITE_ENABLE, false); + sc64_lock(); + return FLASHCART_OK; } diff --git a/src/flashcart/sc64/sc64_internal.h b/src/flashcart/sc64/sc64_internal.h index eb09eeb8..f48767c6 100644 --- a/src/flashcart/sc64/sc64_internal.h +++ b/src/flashcart/sc64/sc64_internal.h @@ -42,7 +42,7 @@ typedef enum { CFG_ROM_WRITE_ENABLE, CFG_ROM_SHADOW_ENABLE, CFG_DD_MODE, - CFG_ISV_ENABLE, + CFG_ISV_ADDRESS, CFG_BOOT_MODE, CFG_SAVE_TYPE, CFG_CIC_SEED, @@ -55,6 +55,21 @@ typedef enum { CFG_ROM_EXTENDED_ENABLE, } sc64_cfg_t; +typedef enum { + DD_MODE_DISABLED = 0, + DD_MODE_REGS = 1, + DD_MODE_IPL = 2, + DD_MODE_FULL = 3 +} sc64_dd_mode_t; + +typedef enum { + BOOT_MODE_MENU = 0, + BOOT_MODE_ROM = 1, + BOOT_MODE_DDIPL = 2, + BOOT_MODE_DIRECT_ROM = 3, + BOOT_MODE_DIRECT_DDIPL = 4, +} sc64_boot_mode_t; + typedef enum { SAVE_TYPE_NONE, SAVE_TYPE_EEPROM_4K, @@ -65,6 +80,35 @@ typedef enum { SAVE_TYPE_SRAM_128K, } sc64_save_type_t; +typedef enum { + CIC_SEED_AUTO = 0xFFFF +} sc64_cic_seed_t; + +typedef enum { + TV_TYPE_PAL = 0, + TV_TYPE_NTSC = 1, + TV_TYPE_MPAL = 2, + TV_TYPE_PASSTHROUGH = 3 +} sc64_tv_type_t; + +typedef enum { + DRIVE_TYPE_RETAIL, + DRIVE_TYPE_DEVELOPMENT, +} sc64_drive_type_t; + +typedef enum { + DISK_STATE_EJECTED, + DISK_STATE_INSERTED, + DISK_STATE_CHANGED, +} sc64_disk_state_t; + +typedef enum { + BUTTON_MODE_NONE, + BUTTON_MODE_N64_IRQ, + BUTTON_MODE_USB_PACKET, + BUTTON_MODE_DD_DISK_SWAP, +} sc64_button_mode_t; + void sc64_unlock (void); void sc64_lock (void); diff --git a/src/menu/menu.c b/src/menu/menu.c index af17e71b..9742818c 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -14,8 +14,7 @@ #include "views/views.h" -#define SETTINGS_FILE_PATH "config.txt" -#define TV_TYPE_RAM *((uint32_t *) (0x80000300)) +#define TV_TYPE_RAM *((uint32_t *) (0x80000300)) static menu_t *menu; @@ -43,15 +42,13 @@ static void menu_init (boot_params_t *boot_params) { menu->mode = MENU_MODE_NONE; menu->next_mode = MENU_MODE_STARTUP; - settings_set_default_state(&menu->settings); - menu->flashcart_error = flashcart_init(); if (menu->flashcart_error != FLASHCART_OK) { menu->next_mode = MENU_MODE_FAULT; - } else { - settings_load_from_file(SETTINGS_FILE_PATH, &menu->settings); } + settings_load(&menu->settings); + menu->boot_params = boot_params; bool default_directory_exists = directory_exists(menu->settings.default_directory); diff --git a/src/menu/settings.c b/src/menu/settings.c index dbc8a047..70729eb5 100644 --- a/src/menu/settings.c +++ b/src/menu/settings.c @@ -1,22 +1,36 @@ #include #include "libs/mini.c/src/mini.h" -#include "path.h" #include "settings.h" #include "utils/fs.h" -void settings_set_default_state (settings_t *settings) { - settings->pal60 = false; - settings->show_hidden_files = false; - settings->default_directory = "/"; +#define SETTINGS_FILE_PATH "/config.ini" + + +static settings_t init = { + .pal60 = false, + .show_hidden_files = false, + .default_directory = "/", +}; + + +void settings_load (settings_t *settings) { + if (!file_exists(SETTINGS_FILE_PATH)) { + settings_save(&init); + } + + mini_t *ini = mini_try_load("sd:/"SETTINGS_FILE_PATH); + + settings->pal60 = mini_get_bool(ini, "menu", "pal60", init.pal60); + settings->show_hidden_files = mini_get_bool(ini, "menu", "show_hidden_files", init.show_hidden_files); + settings->default_directory = strdup(mini_get_string(ini, "menu", "default_directory", init.default_directory)); + + mini_free(ini); } -void settings_save_to_file (char *path, settings_t *settings) { - path_t *config_file_path = path_init("sd:/"); - path_append(config_file_path, path); - - mini_t *ini = mini_create(path_get(config_file_path)); +void settings_save (settings_t *settings) { + mini_t *ini = mini_create("sd:/"SETTINGS_FILE_PATH); mini_set_bool(ini, "menu", "pal60", settings->pal60); mini_set_bool(ini, "menu", "show_hidden_files", settings->show_hidden_files); @@ -25,25 +39,4 @@ void settings_save_to_file (char *path, settings_t *settings) { mini_save(ini); mini_free(ini); - - path_free(config_file_path); -} - -void settings_load_from_file (char *path, settings_t *settings) { - if (!file_exists(path)) { - settings_save_to_file(path, settings); - } - - path_t *config_file_path = path_init("sd:/"); - path_append(config_file_path, path); - - mini_t *ini = mini_try_load(path_get(config_file_path)); - - settings->pal60 = mini_get_bool(ini, "menu", "pal60", false); - settings->show_hidden_files = mini_get_bool(ini, "menu", "show_hidden_files", false); - settings->default_directory = strdup(mini_get_string(ini, "menu", "default_directory", "/")); - - mini_free(ini); - - path_free(config_file_path); } diff --git a/src/menu/settings.h b/src/menu/settings.h index 90833dba..575059ef 100644 --- a/src/menu/settings.h +++ b/src/menu/settings.h @@ -10,15 +10,19 @@ /** @brief Settings Structure */ typedef struct { + /** @brief Select 60 Hz refresh rate if running on PAL console */ bool pal60; + + /** @brief Show files marked as hidden in the browser */ bool show_hidden_files; + + /** @brief Default directory to navigate to when menu loads */ char *default_directory; } settings_t; -void settings_set_default_state (settings_t *settings); -void settings_save_to_file (char *path, settings_t *settings); -void settings_load_from_file (char *path, settings_t *settings); +void settings_load (settings_t *settings); +void settings_save (settings_t *settings); #endif