Skip to content

Commit

Permalink
Added CIC selection menu + minor fixes and code cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Polprzewodnikowy committed Jan 17, 2024
1 parent 0996e88 commit 80eb7bb
Show file tree
Hide file tree
Showing 23 changed files with 411 additions and 268 deletions.
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ FILESYSTEM_DIR = filesystem
BUILD_DIR = build
OUTPUT_DIR = output

FLAGS += -DMENU_VERSION=\"0.0.1.$(shell date +%Y-%m-%dT%H:%M:%SZ).ALPHA\"
MENU_VERSION ?= "Rolling release"
BUILD_TIMESTAMP = "$(shell TZ='UTC' date "+%Y-%m-%d %H:%M:%S %:z")"

include $(N64_INST)/include/n64.mk

Expand Down Expand Up @@ -88,6 +89,9 @@ $(FILESYSTEM_DIR)/%.font64: $(ASSETS_DIR)/%.ttf

$(BUILD_DIR)/$(PROJECT_NAME).dfs: $(FILESYSTEM)

$(BUILD_DIR)/menu/views/credits.o: .FORCE
$(BUILD_DIR)/menu/views/credits.o: FLAGS+=-DMENU_VERSION=\"$(MENU_VERSION)\" -DBUILD_TIMESTAMP=\"$(BUILD_TIMESTAMP)\"

$(BUILD_DIR)/$(PROJECT_NAME).elf: $(OBJS)

disassembly: $(BUILD_DIR)/$(PROJECT_NAME).elf
Expand Down Expand Up @@ -144,4 +148,6 @@ endif
# test:
# TODO: run tests

.FORCE:

-include $(DEPS)
2 changes: 1 addition & 1 deletion libdragon
Submodule libdragon updated 168 files
4 changes: 2 additions & 2 deletions src/boot/cic.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ cic_type_t cic_detect (uint8_t *ipl3) {
switch (cic_calculate_ipl3_checksum(ipl3, 0x3F)) {
case 0x45CC73EE317AULL: return CIC_6101; // 6101
case 0x44160EC5D9AFULL: return CIC_7102; // 7102
case 0xA536C0F1D859ULL: return CIC_6102_7101; // 6102 / 7101
case 0xA536C0F1D859ULL: return CIC_x102; // 6102 / 7101
}
switch (cic_calculate_ipl3_checksum(ipl3, 0x78)) {
case 0x586FD4709867ULL: return CIC_x103; // 6103 / 7103
Expand Down Expand Up @@ -133,7 +133,7 @@ uint8_t cic_get_seed (cic_type_t cic_type) {
case CIC_5167: return 0xDD;
case CIC_6101: return 0x3F;
case CIC_7102: return 0x3F;
case CIC_6102_7101: return 0x3F;
case CIC_x102: return 0x3F;
case CIC_x103: return 0x78;
case CIC_x105: return 0x91;
case CIC_x106: return 0x85;
Expand Down
2 changes: 1 addition & 1 deletion src/boot/cic.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ typedef enum {
CIC_5167,
CIC_6101,
CIC_7102,
CIC_6102_7101,
CIC_x102,
CIC_x103,
CIC_x105,
CIC_x106,
Expand Down
2 changes: 1 addition & 1 deletion src/flashcart/64drive/64drive.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ static flashcart_err_t d64_load_rom (char *rom_path, flashcart_progress_callback

size_t sdram_size = MiB(64);

size_t chunk_size = MiB(1);
size_t chunk_size = KiB(128);
for (int offset = 0; offset < sdram_size; offset += chunk_size) {
size_t block_size = MIN(sdram_size - offset, chunk_size);
if (f_read(&fil, (void *) (ROM_ADDRESS + offset), block_size, &br) != FR_OK) {
Expand Down
4 changes: 2 additions & 2 deletions src/flashcart/sc64/sc64.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ static flashcart_err_t sc64_load_rom (char *rom_path, flashcart_progress_callbac
size_t shadow_size = shadow_enabled ? MIN(rom_size - sdram_size, KiB(128)) : 0;
size_t extended_size = extended_enabled ? rom_size - MiB(64) : 0;

size_t chunk_size = MiB(1);
size_t chunk_size = KiB(128);
for (int offset = 0; offset < sdram_size; offset += chunk_size) {
size_t block_size = MIN(sdram_size - offset, chunk_size);
if (f_read(&fil, (void *) (ROM_ADDRESS + offset), block_size, &br) != FR_OK) {
Expand Down Expand Up @@ -450,7 +450,7 @@ static flashcart_err_t sc64_load_64dd_ipl (char *ipl_path, flashcart_progress_ca
return FLASHCART_ERR_LOAD;
}

size_t chunk_size = KiB(256);
size_t chunk_size = KiB(128);
for (int offset = 0; offset < ipl_size; offset += chunk_size) {
size_t block_size = MIN(ipl_size - offset, chunk_size);
if (f_read(&fil, (void *) (IPL_ADDRESS + offset), block_size, &br) != FR_OK) {
Expand Down
3 changes: 2 additions & 1 deletion src/menu/components.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ typedef struct component_context_menu {
struct component_context_menu *submenu;
struct {
const char *text;
void (*action) (menu_t *menu);
void (*action) (menu_t *menu, void *arg);
void *arg;
struct component_context_menu *submenu;
} list[];
} component_context_menu_t;
Expand Down
2 changes: 1 addition & 1 deletion src/menu/components/context_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ bool component_context_menu_process (menu_t *menu, component_context_menu_t *cm)
cm->submenu->selected = 0;
cm->submenu->parent = cm;
} else if (cm->list[cm->selected].action) {
cm->list[cm->selected].action(menu);
cm->list[cm->selected].action(menu, cm->list[cm->selected].arg);
top->hide_pending = true;
}
} else if (menu->actions.go_up) {
Expand Down
62 changes: 38 additions & 24 deletions src/menu/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "views/views.h"


#define MENU_DIRECTORY "sd:/menu"
#define CACHE_DIRECTORY "sd:/menu/cache"
#define BACKGROUND_CACHE "sd:/menu/cache/background.data"

Expand Down Expand Up @@ -77,6 +78,8 @@ static void menu_init (boot_params_t *boot_params) {

menu->error_message = NULL;

directory_create(MENU_DIRECTORY);

settings_load(&menu->settings);

directory_create(CACHE_DIRECTORY);
Expand Down Expand Up @@ -133,30 +136,39 @@ static void menu_deinit (menu_t *menu) {
display_close();
}


// NOTE: Keep this array in sync with menu_mode_t
static struct views_s {
typedef const struct {
menu_mode_t id;
void (*init) (menu_t *menu);
void (*show) (menu_t *menu, surface_t *display);
} views[__MENU_MODE_COUNT] = {
{ NULL, NULL }, // MENU_MODE_NONE
{ view_startup_init, view_startup_display }, // MENU_MODE_STARTUP
{ view_browser_init, view_browser_display }, // MENU_MODE_BROWSER
{ view_file_info_init, view_file_info_display }, // MENU_MODE_FILE_INFO
{ view_system_info_init, view_system_info_display }, // MENU_MODE_SYSTEM_INFO
{ view_image_viewer_init, view_image_viewer_display }, // MENU_MODE_IMAGE_VIEWER
{ view_music_player_init, view_music_player_display }, // MENU_MODE_MUSIC_PLAYER
{ view_credits_init, view_credits_display }, // MENU_MODE_CREDITS
{ view_settings_init, view_settings_display }, // MENU_MODE_SETTINGS_EDITOR
{ view_rtc_init, view_rtc_display }, // MENU_MODE_RTC
{ view_load_rom_init, view_load_rom_display }, // MENU_MODE_LOAD_ROM
{ view_load_disk_init, view_load_disk_display }, // MENU_MODE_LOAD_DISK
{ view_load_emulator_init, view_load_emulator_display }, // MENU_MODE_LOAD_EMULATOR
{ view_error_init, view_error_display }, // MENU_MODE_ERROR
{ view_fault_init, view_fault_display }, // MENU_MODE_FAULT
{ NULL, NULL }, // MENU_MODE_BOOT
} view_t;

static view_t menu_views[] = {
{ MENU_MODE_STARTUP, view_startup_init, view_startup_display },
{ MENU_MODE_BROWSER, view_browser_init, view_browser_display },
{ MENU_MODE_FILE_INFO, view_file_info_init, view_file_info_display },
{ MENU_MODE_SYSTEM_INFO, view_system_info_init, view_system_info_display },
{ MENU_MODE_IMAGE_VIEWER, view_image_viewer_init, view_image_viewer_display },
{ MENU_MODE_MUSIC_PLAYER, view_music_player_init, view_music_player_display },
{ MENU_MODE_CREDITS, view_credits_init, view_credits_display },
{ MENU_MODE_SETTINGS_EDITOR, view_settings_init, view_settings_display },
{ MENU_MODE_RTC, view_rtc_init, view_rtc_display },
{ MENU_MODE_LOAD_ROM, view_load_rom_init, view_load_rom_display },
{ MENU_MODE_LOAD_DISK, view_load_disk_init, view_load_disk_display },
{ MENU_MODE_LOAD_EMULATOR, view_load_emulator_init, view_load_emulator_display },
{ MENU_MODE_ERROR, view_error_init, view_error_display },
{ MENU_MODE_FAULT, view_fault_init, view_fault_display },
};

static view_t *menu_get_view (menu_mode_t id) {
for (int i = 0; i < sizeof(menu_views) / sizeof(view_t); i++) {
if (menu_views[i].id == id) {
return &menu_views[i];
}
}
return NULL;
}


void menu_run (boot_params_t *boot_params) {
menu_init(boot_params);

Expand All @@ -168,8 +180,9 @@ void menu_run (boot_params_t *boot_params) {

actions_update(menu);

if (views[menu->mode].show) {
views[menu->mode].show(menu, display);
view_t *view = menu_get_view(menu->mode);
if (view && view->show) {
view->show(menu, display);
} else {
rdpq_attach_clear(display, NULL);
rdpq_detach_wait();
Expand All @@ -183,8 +196,9 @@ void menu_run (boot_params_t *boot_params) {
while (menu->mode != menu->next_mode) {
menu->mode = menu->next_mode;

if (views[menu->mode].init) {
views[menu->mode].init(menu);
view_t *next_view = menu_get_view(menu->next_mode);
if (next_view && next_view->init) {
next_view->init(menu);
}
}

Expand Down
1 change: 0 additions & 1 deletion src/menu/menu_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ typedef enum {
MENU_MODE_ERROR,
MENU_MODE_FAULT,
MENU_MODE_BOOT,
__MENU_MODE_COUNT,
} menu_mode_t;

/** @brief File entry type enumeration */
Expand Down
6 changes: 5 additions & 1 deletion src/menu/mp3_player.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ typedef struct {
mp3dec_t dec;
mp3dec_frame_info_t info;

uint8_t buffer[MAX_FREE_FORMAT_FRAME_SIZE];
uint8_t buffer[16 * 1024];
uint8_t *buffer_ptr;
size_t buffer_left;

Expand All @@ -54,6 +54,10 @@ static void mp3player_fill_buffer (void) {
return;
}

if (p->buffer_left >= ALIGN(MAX_FREE_FORMAT_FRAME_SIZE, FS_SECTOR_SIZE)) {
return;
}

if ((p->buffer_ptr != p->buffer) && (p->buffer_left > 0)) {
memmove(p->buffer, p->buffer_ptr, p->buffer_left);
p->buffer_ptr = p->buffer;
Expand Down
1 change: 1 addition & 0 deletions src/menu/png_decoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "png_decoder.h"
#include "utils/fs.h"


/** @brief PNG File Information Structure. */
typedef struct {
FIL fil;
Expand Down
Loading

0 comments on commit 80eb7bb

Please sign in to comment.