diff --git a/cfg.cpp b/cfg.cpp index c97e502..62ee6e7 100644 --- a/cfg.cpp +++ b/cfg.cpp @@ -19,7 +19,7 @@ cfg_t cfg; typedef enum { - UINT8 = 0, INT8, UINT16, INT16, UINT32, INT32, FLOAT, STRING, UINT32ARR + UINT8 = 0, INT8, UINT16, INT16, UINT32, INT32, HEX8, HEX16, HEX32, FLOAT, STRING, UINT32ARR, HEX32ARR } ini_vartypes_t; typedef struct @@ -38,7 +38,7 @@ static const ini_var_t ini_vars[] = { "FORCED_SCANDOUBLER", (void*)(&(cfg.forced_scandoubler)), UINT8, 0, 1 }, { "VGA_SCALER", (void*)(&(cfg.vga_scaler)), UINT8, 0, 1 }, { "VGA_SOG", (void*)(&(cfg.vga_sog)), UINT8, 0, 1 }, - { "KEYRAH_MODE", (void*)(&(cfg.keyrah_mode)), UINT32, 0, 0xFFFFFFFF }, + { "KEYRAH_MODE", (void*)(&(cfg.keyrah_mode)), HEX32, 0, 0xFFFFFFFF }, { "RESET_COMBO", (void*)(&(cfg.reset_combo)), UINT8, 0, 3 }, { "KEY_MENU_AS_RGUI", (void*)(&(cfg.key_menu_as_rgui)), UINT8, 0, 1 }, { "VIDEO_MODE", (void*)(cfg.video_conf), STRING, 0, sizeof(cfg.video_conf) - 1 }, @@ -69,19 +69,19 @@ static const ini_var_t ini_vars[] = { "CONTROLLER_INFO", (void*)(&(cfg.controller_info)), UINT8, 0, 10 }, { "REFRESH_MIN", (void*)(&(cfg.refresh_min)), FLOAT, 0, 150 }, { "REFRESH_MAX", (void*)(&(cfg.refresh_max)), FLOAT, 0, 150 }, - { "JAMMA_VID", (void*)(&(cfg.jamma_vid)), UINT16, 0, 0xFFFF }, - { "JAMMA_PID", (void*)(&(cfg.jamma_pid)), UINT16, 0, 0xFFFF }, + { "JAMMA_VID", (void*)(&(cfg.jamma_vid)), HEX16, 0, 0xFFFF }, + { "JAMMA_PID", (void*)(&(cfg.jamma_pid)), HEX16, 0, 0xFFFF }, { "SNIPER_MODE", (void*)(&(cfg.sniper_mode)), UINT8, 0, 1 }, { "BROWSE_EXPAND", (void*)(&(cfg.browse_expand)), UINT8, 0, 1 }, { "LOGO", (void*)(&(cfg.logo)), UINT8, 0, 1 }, { "SHARED_FOLDER", (void*)(&(cfg.shared_folder)), STRING, 0, sizeof(cfg.shared_folder) - 1 }, - { "NO_MERGE_VID", (void*)(&(cfg.no_merge_vid)), UINT16, 0, 0xFFFF }, - { "NO_MERGE_PID", (void*)(&(cfg.no_merge_pid)), UINT16, 0, 0xFFFF }, - { "NO_MERGE_VIDPID", (void*)(cfg.no_merge_vidpid), UINT32ARR, 0, 0xFFFFFFFF }, + { "NO_MERGE_VID", (void*)(&(cfg.no_merge_vid)), HEX16, 0, 0xFFFF }, + { "NO_MERGE_PID", (void*)(&(cfg.no_merge_pid)), HEX16, 0, 0xFFFF }, + { "NO_MERGE_VIDPID", (void*)(cfg.no_merge_vidpid), HEX32ARR, 0, 0xFFFFFFFF }, { "CUSTOM_ASPECT_RATIO_1", (void*)(&(cfg.custom_aspect_ratio[0])), STRING, 0, sizeof(cfg.custom_aspect_ratio[0]) - 1 }, { "CUSTOM_ASPECT_RATIO_2", (void*)(&(cfg.custom_aspect_ratio[1])), STRING, 0, sizeof(cfg.custom_aspect_ratio[1]) - 1 }, - { "SPINNER_VID", (void*)(&(cfg.spinner_vid)), UINT16, 0, 0xFFFF }, - { "SPINNER_PID", (void*)(&(cfg.spinner_pid)), UINT16, 0, 0xFFFF }, + { "SPINNER_VID", (void*)(&(cfg.spinner_vid)), HEX16, 0, 0xFFFF }, + { "SPINNER_PID", (void*)(&(cfg.spinner_pid)), HEX16, 0, 0xFFFF }, { "SPINNER_AXIS", (void*)(&(cfg.spinner_axis)), UINT8, 0, 1 }, { "SPINNER_THROTTLE", (void*)(&(cfg.spinner_throttle)), INT32, -10000, 10000 }, { "AFILTER_DEFAULT", (void*)(&(cfg.afilter_default)), STRING, 0, sizeof(cfg.afilter_default) - 1 }, @@ -239,9 +239,17 @@ static void ini_parse_numeric(const ini_var_t *var, const char *text, void *out) char *endptr = nullptr; bool out_of_range = true; + bool invalid_format = false; switch(var->type) { + case HEX8: + case HEX16: + case HEX32: + case HEX32ARR: + invalid_format = strncasecmp(text, "0x", 2); + // fall through + case UINT8: case UINT16: case UINT32: @@ -275,14 +283,19 @@ static void ini_parse_numeric(const ini_var_t *var, const char *text, void *out) if (*endptr) cfg_error("%s: \'%s\' not a number", var->name, text); else if (out_of_range) cfg_error("%s: \'%s\' out of range", var->name, text); + else if (invalid_format) cfg_error("%s: \'%s\' invalid format", var->name, text); switch (var->type) { + case HEX8: case UINT8: *(uint8_t*)out = u32; break; case INT8: *(int8_t*)out = i32; break; + case HEX16: case UINT16: *(uint16_t*)out = u32; break; + case HEX32ARR: case UINT32ARR: *(uint32_t*)out = u32; break; case INT16: *(int16_t*)out = i32; break; + case HEX32: case UINT32: *(uint32_t*)out = u32; break; case INT32: *(int32_t*)out = i32; break; case FLOAT: *(float*)out = f32; break; @@ -434,6 +447,8 @@ void cfg_parse() // second pass to look for section without vrefresh ini_parse(altcfg(), video_get_core_mode_name(0)); } + + } bool cfg_has_video_sections() @@ -470,4 +485,75 @@ bool cfg_check_errors(char *msg, size_t max_len) } return true; -} \ No newline at end of file +} + +void cfg_print() +{ + printf("Loaded config:\n--------------\n"); + for (uint i = 0; i < (sizeof(ini_vars) / sizeof(ini_vars[0])); i++) + { + switch (ini_vars[i].type) + { + case UINT8: + printf(" %s=%u\n", ini_vars[i].name, *(uint8_t*)ini_vars[i].var); + break; + + case UINT16: + printf(" %s=%u\n", ini_vars[i].name, *(uint16_t*)ini_vars[i].var); + break; + + case UINT32: + printf(" %s=%u\n", ini_vars[i].name, *(uint32_t*)ini_vars[i].var); + break; + + case UINT32ARR: + if (*(uint32_t*)ini_vars[i].var) + { + uint32_t* arr = (uint32_t*)ini_vars[i].var; + for (uint32_t n = 0; n < arr[0]; n++) printf("%s=%u\n", ini_vars[i].name, arr[n + 1]); + } + break; + + case HEX8: + printf(" %s=0x%02X\n", ini_vars[i].name, *(uint8_t*)ini_vars[i].var); + break; + + case HEX16: + printf(" %s=0x%04X\n", ini_vars[i].name, *(uint16_t*)ini_vars[i].var); + break; + + case HEX32: + printf(" %s=0x%08X\n", ini_vars[i].name, *(uint32_t*)ini_vars[i].var); + break; + + case HEX32ARR: + if (*(uint32_t*)ini_vars[i].var) + { + uint32_t* arr = (uint32_t*)ini_vars[i].var; + for (uint32_t n = 0; n < arr[0]; n++) printf("%s=0x%08X\n", ini_vars[i].name, arr[n + 1]); + } + break; + + case INT8: + printf(" %s=%d\n", ini_vars[i].name, *(int8_t*)ini_vars[i].var); + break; + + case INT16: + printf(" %s=%d\n", ini_vars[i].name, *(int16_t*)ini_vars[i].var); + break; + + case INT32: + printf(" %s=%d\n", ini_vars[i].name, *(int32_t*)ini_vars[i].var); + break; + + case FLOAT: + printf(" %s=%f\n", ini_vars[i].name, *(float*)ini_vars[i].var); + break; + + case STRING: + if (*(uint32_t*)ini_vars[i].var) printf(" %s=%s\n", ini_vars[i].name, (char*)ini_vars[i].var); + break; + } + } + printf("--------------\n"); +} diff --git a/cfg.h b/cfg.h index f16049b..b0b9652 100644 --- a/cfg.h +++ b/cfg.h @@ -85,6 +85,7 @@ extern cfg_t cfg; //// functions //// void cfg_parse(); +void cfg_print(); const char* cfg_get_name(uint8_t alt); bool cfg_has_video_sections(); diff --git a/user_io.cpp b/user_io.cpp index 047cdd3..0a67451 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -1301,6 +1301,7 @@ void user_io_init(const char *path, const char *xml) user_io_read_core_name(); cfg_parse(); + cfg_print(); while (cfg.waitmount[0] && !is_menu()) { printf("> > > wait for %s mount < < <\n", cfg.waitmount); @@ -3401,7 +3402,7 @@ static void send_keycode(unsigned short key, int press) //WIN+... we override this hotkey in the core. if (key == 125 || key == 126) { - winkey_pressed = press; + winkey_pressed = press; return; } if (winkey_pressed)