From 66fc5def652e9dcfce56338aa6230010aa26929a Mon Sep 17 00:00:00 2001 From: Arceveti Date: Mon, 24 Jul 2023 11:38:38 -0700 Subject: [PATCH] Add setting for pseudoinstructions + color fixes --- include/color_presets.h | 4 ++-- src/crash_screen/crash_main.c | 7 ++++--- src/crash_screen/crash_types.h | 15 ++++++++------- src/crash_screen/insn_disasm.c | 9 ++++----- src/crash_screen/insn_disasm.h | 3 --- src/crash_screen/pages/page_settings.c | 2 +- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/include/color_presets.h b/include/color_presets.h index 699af260f..2ee6f287e 100644 --- a/include/color_presets.h +++ b/include/color_presets.h @@ -257,7 +257,7 @@ #define COLOR_RGBA32_CRASH_DISASM_INSN COLOR_RGBA32_VERY_LIGHT_YELLOW #define COLOR_RGBA32_CRASH_DISASM_NOP COLOR_RGBA32_LIGHT_GRAY #define COLOR_RGBA32_CRASH_UNKNOWN COLOR_RGBA32_LIGHT_GRAY -#define COLOR_RGBA32_CRASH_IMMEDIATE COLOR_RGBA32_LIGHT_GREEN +#define COLOR_RGBA32_CRASH_DISASM_IMMEDIATE COLOR_RGBA32_LIGHT_GREEN #define COLOR_RGBA32_CRASH_DISASM_REG COLOR_RGBA32_LIGHT_SKY #define COLOR_RGBA32_CRASH_DISASM_BASE_REG COLOR_RGBA32_VERY_LIGHT_CYAN #define COLOR_RGBA32_CRASH_FUNCTION_NAME COLOR_RGBA32_LIGHT_YELLOW @@ -415,7 +415,7 @@ #define COLOR_RGBA_CRASH_DISASM_INST RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_DISASM_INSN) #define COLOR_RGBA_CRASH_DISASM_NOP RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_DISASM_NOP) #define COLOR_RGBA_CRASH_UNKNOWN RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_UNKNOWN) -#define COLOR_RGBA_CRASH_IMMEDIATE RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_IMMEDIATE) +#define COLOR_RGBA_CRASH_IMMEDIATE RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_DISASM_IMMEDIATE) #define COLOR_RGBA_CRASH_DISASM_REG RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_DISASM_REG) #define COLOR_RGBA_CRASH_DISASM_BASE_REG RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_DISASM_BASE_REG) #define COLOR_RGBA_CRASH_FUNCTION_NAME RGBA32_TO_COLORRGBA(COLOR_RGBA32_CRASH_FUNCTION_NAME) diff --git a/src/crash_screen/crash_main.c b/src/crash_screen/crash_main.c index 571a7e904..74e8e686e 100644 --- a/src/crash_screen/crash_main.c +++ b/src/crash_screen/crash_main.c @@ -52,9 +52,10 @@ struct CSSettingsEntry gCSSettings[NUM_CS_OPTS] = { [CS_OPT_MEMORY_AS_ASCII ] = { .name = "Memory as ascii", .valNames = sValNames_bool, .val = TRUE, .defaultVal = TRUE, .lowerBound = FALSE, .upperBound = TRUE, }, [CS_OPT_DISASM_BINARY ] = { .name = "Unknown disasm as binary", .valNames = sValNames_bool, .val = FALSE, .defaultVal = FALSE, .lowerBound = FALSE, .upperBound = TRUE, }, [CS_OPT_PRINT_SCROLL_SPEED] = { .name = "Print overscan scroll speed", .valNames = NULL, .val = 2, .defaultVal = 2, .lowerBound = 0, .upperBound = 5, }, - [CS_OPT_FLOATS_FMT ] = { .name = "Floats format", .valNames = sValNames_print_num_fmt, .val = PRINT_NUM_FMT_DEC, .defaultVal = PRINT_NUM_FMT_DEC, .lowerBound = PRINT_NUM_FMT_HEX, .upperBound = PRINT_NUM_FMT_SCI, }, - [CS_OPT_DISASM_IMM_FMT ] = { .name = "Disasm immediate format", .valNames = sValNames_print_num_fmt, .val = PRINT_NUM_FMT_HEX, .defaultVal = PRINT_NUM_FMT_HEX, .lowerBound = PRINT_NUM_FMT_HEX, .upperBound = PRINT_NUM_FMT_DEC, }, - [CS_OPT_BRANCH_ARROW_MODE ] = { .name = "Disasm branch arrow mode", .valNames = sValNames_branch_arrow, .val = DISASM_ARROW_MODE_FUNCTION, .defaultVal = DISASM_ARROW_MODE_FUNCTION, .lowerBound = DISASM_ARROW_MODE_OFF, .upperBound = DISASM_ARROW_MODE_OVERSCAN, }, //! TODO: Implement this + [CS_OPT_FLOATS_FMT ] = { .name = "Floats print format", .valNames = sValNames_print_num_fmt, .val = PRINT_NUM_FMT_DEC, .defaultVal = PRINT_NUM_FMT_DEC, .lowerBound = PRINT_NUM_FMT_HEX, .upperBound = PRINT_NUM_FMT_SCI, }, + [CS_OPT_DISASM_PSEUDOINSNS] = { .name = "DISASM: pseudoinstructions", .valNames = sValNames_bool, .val = TRUE, .defaultVal = TRUE, .lowerBound = FALSE, .upperBound = TRUE, }, + [CS_OPT_DISASM_IMM_FMT ] = { .name = "DISASM: immediate format", .valNames = sValNames_print_num_fmt, .val = PRINT_NUM_FMT_HEX, .defaultVal = PRINT_NUM_FMT_HEX, .lowerBound = PRINT_NUM_FMT_HEX, .upperBound = PRINT_NUM_FMT_DEC, }, + [CS_OPT_BRANCH_ARROW_MODE ] = { .name = "DISASM: branch arrow mode", .valNames = sValNames_branch_arrow, .val = DISASM_ARROW_MODE_FUNCTION, .defaultVal = DISASM_ARROW_MODE_FUNCTION, .lowerBound = DISASM_ARROW_MODE_OFF, .upperBound = DISASM_ARROW_MODE_OVERSCAN, }, //! TODO: Implement this }; struct CSPage gCSPages[NUM_PAGES] = { diff --git a/src/crash_screen/crash_types.h b/src/crash_screen/crash_types.h index 9daf9588a..48dde7329 100644 --- a/src/crash_screen/crash_types.h +++ b/src/crash_screen/crash_types.h @@ -94,13 +94,13 @@ enum CSDisasmBranchArrowModes { }; struct CSSettingsEntry { - const char name[32]; - const char** valNames; - SettingsType val; - SettingsType defaultVal; - SettingsType lowerBound; - SettingsType upperBound; -}; + /*0x00*/ const char name[32]; + /*0x20*/ const char** valNames; + /*0x24*/ SettingsType val; + /*0x28*/ SettingsType defaultVal; + /*0x2C*/ SettingsType lowerBound; + /*0x30*/ SettingsType upperBound; +}; /*0x34*/ enum CSSettings { CS_OPT_DRAW_CRASH_SCREEN, @@ -110,6 +110,7 @@ enum CSSettings { CS_OPT_DISASM_BINARY, CS_OPT_PRINT_SCROLL_SPEED, CS_OPT_FLOATS_FMT, + CS_OPT_DISASM_PSEUDOINSNS, CS_OPT_DISASM_IMM_FMT, CS_OPT_BRANCH_ARROW_MODE, //! TODO: Implement this NUM_CS_OPTS, diff --git a/src/crash_screen/insn_disasm.c b/src/crash_screen/insn_disasm.c index c8e7d46ba..da2497532 100644 --- a/src/crash_screen/insn_disasm.c +++ b/src/crash_screen/insn_disasm.c @@ -271,7 +271,6 @@ ALIGNED32 static const InsnTemplate insn_db_pseudo[] = { [PSEUDO_DSUBI] = { .name = "DSUBI", .fmt = "\'tsi", .opcode = OPC_DADDI }, // Doubleword Subtract Immediate (pseudo of DADDI). }; -_Bool gEnablePseudoinstructions = TRUE; static _Bool check_pseudo_insn(const InsnTemplate** type, enum PseudoInsns id, _Bool cond) { if (cond) { @@ -364,7 +363,7 @@ static enum InsnType get_insn_type_and_list(InsnData insn, const InsnTemplate** const InsnTemplate* get_insn(InsnData insn) { //! TODO: Optimize this const InsnTemplate* checkInsn = NULL; - if (gEnablePseudoinstructions && check_pseudo_instructions(&checkInsn, insn)) { + if (gCSSettings[CS_OPT_DISASM_PSEUDOINSNS].val && check_pseudo_instructions(&checkInsn, insn)) { return checkInsn; } @@ -587,15 +586,15 @@ char* insn_disasm(InsnData insn, const char** fname, _Bool showDestNames) { separator = TRUE; break; case CHAR_P_IMM: - ADD_COLOR(COLOR_RGBA32_CRASH_IMMEDIATE); + ADD_COLOR(COLOR_RGBA32_CRASH_DISASM_IMMEDIATE); ADD_STR((decImmediates ? "%d" : STR_IMMEDIATE), insn.immediate); break; case CHAR_P_NIMM: - ADD_COLOR(COLOR_RGBA32_CRASH_IMMEDIATE); + ADD_COLOR(COLOR_RGBA32_CRASH_DISASM_IMMEDIATE); ADD_STR((decImmediates ? "%d" : STR_IMMEDIATE), -(s16)insn.immediate); break; case CHAR_P_SHIFT: - ADD_COLOR(COLOR_RGBA32_CRASH_IMMEDIATE); + ADD_COLOR(COLOR_RGBA32_CRASH_DISASM_IMMEDIATE); ADD_STR(STR_IMMEDIATE, insn.sa); break; case CHAR_P_BASE: diff --git a/src/crash_screen/insn_disasm.h b/src/crash_screen/insn_disasm.h index 26d114ea7..81efe2189 100644 --- a/src/crash_screen/insn_disasm.h +++ b/src/crash_screen/insn_disasm.h @@ -432,9 +432,6 @@ typedef struct PACKED { #define INSN_OFFSET(addr, offset) ((addr) + (sizeof(InsnData) * (s16)(offset))) -extern _Bool gEnablePseudoinstructions; - - s16 check_for_branch_offset(InsnData insn); Address get_branch_target_from_addr(Address addr); char* insn_disasm(InsnData insn, const char** fname, _Bool showDestNames); diff --git a/src/crash_screen/pages/page_settings.c b/src/crash_screen/pages/page_settings.c index 1b93acb5d..8345d5a1e 100644 --- a/src/crash_screen/pages/page_settings.c +++ b/src/crash_screen/pages/page_settings.c @@ -68,7 +68,7 @@ void print_settings_list(u32 line, u32 numLines) { // "[setting value]" crash_screen_print(x, y, (STR_COLOR_PREFIX"%-d"), - COLOR_RGBA32_CRASH_DISASM_REG, setting->val + COLOR_RGBA32_CRASH_DISASM_IMMEDIATE, setting->val ); }