diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 7445014..d3122e6 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -58,7 +58,6 @@ - @@ -113,7 +112,6 @@ - diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters index 053d5d9..34b6710 100644 --- a/MiSTer.vcxproj.filters +++ b/MiSTer.vcxproj.filters @@ -70,9 +70,6 @@ Source Files - - Source Files - Source Files @@ -234,9 +231,6 @@ Header Files - - Header Files - Header Files diff --git a/cfg.cpp b/cfg.cpp index 0dcd47c..595ee85 100644 --- a/cfg.cpp +++ b/cfg.cpp @@ -2,30 +2,34 @@ // 2015, rok.krajnc@gmail.com // 2017+, Sorgelig +#include +#include #include -#include "ini_parser.h" +#include +#include #include "cfg.h" +#include "debug.h" +#include "file_io.h" #include "user_io.h" cfg_t cfg; -void MiSTer_ini_parse() +typedef enum { - memset(&cfg, 0, sizeof(cfg)); - cfg.bootscreen = 1; - cfg.fb_terminal = 1; - cfg.controller_info = 6; - ini_parse(&ini_cfg, altcfg()); -} + UINT8 = 0, INT8, UINT16, INT16, UINT32, INT32, FLOAT, STRING +} ini_vartypes_t; -// mist ini sections -const ini_section_t ini_sections[] = +typedef struct { - { 1, "MiSTer" } -}; + const char* name; + void* var; + ini_vartypes_t type; + int min; + int max; +} ini_var_t; -// mist ini vars -const ini_var_t ini_vars[] = { +static const ini_var_t ini_vars[] = +{ { "YPBPR", (void*)(&(cfg.ypbpr)), UINT8, 0, 1 }, { "COMPOSITE_SYNC", (void*)(&(cfg.csync)), UINT8, 0, 1 }, { "FORCED_SCANDOUBLER", (void*)(&(cfg.forced_scandoubler)), UINT8, 0, 1 }, @@ -34,7 +38,7 @@ const ini_var_t ini_vars[] = { { "KEYRAH_MODE", (void*)(&(cfg.keyrah_mode)), UINT32, 0, (int)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 }, + { "VIDEO_MODE", (void*)(cfg.video_conf), STRING, 0, sizeof(cfg.video_conf) - 1 }, { "VIDEO_MODE_PAL", (void*)(cfg.video_conf_pal), STRING, 0, sizeof(cfg.video_conf_pal) - 1 }, { "VIDEO_MODE_NTSC", (void*)(cfg.video_conf_ntsc), STRING, 0, sizeof(cfg.video_conf_ntsc) - 1 }, { "VIDEO_INFO", (void*)(&(cfg.video_info)), UINT8, 0, 10 }, @@ -65,12 +69,247 @@ const ini_var_t ini_vars[] = { { "REFRESH_MAX", (void*)(&(cfg.refresh_max)), UINT8, 0, 150 }, }; -// mist ini config -const ini_cfg_t ini_cfg = { - "MiSTer.ini", - "MiSTer_alt.ini", - ini_sections, - ini_vars, - (int)(sizeof(ini_sections) / sizeof(ini_section_t)), - (int)(sizeof(ini_vars) / sizeof(ini_var_t)) -}; +static const int nvars = (int)(sizeof(ini_vars) / sizeof(ini_var_t)); + +#define INI_EOT 4 // End-Of-Transmission + +#define INI_LINE_SIZE 256 + +#define INI_SECTION_START '[' +#define INI_SECTION_END ']' +#define INI_SECTION_INVALID_ID 0 + +#define CHAR_IS_NUM(c) (((c) >= '0') && ((c) <= '9')) +#define CHAR_IS_ALPHA_LOWER(c) (((c) >= 'a') && ((c) <= 'z')) +#define CHAR_IS_ALPHA_UPPER(c) (((c) >= 'A') && ((c) <= 'Z')) +#define CHAR_IS_ALPHANUM(c) (CHAR_IS_ALPHA_LOWER(c) || CHAR_IS_ALPHA_UPPER(c) || CHAR_IS_NUM(c)) +#define CHAR_IS_SPECIAL(c) (((c) == '[') || ((c) == ']') || ((c) == '(') || ((c) == ')') || \ + ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == '=') || \ + ((c) == '#') || ((c) == '$') || ((c) == '@') || ((c) == '_') || \ + ((c) == ',') || ((c) == '.') || ((c) == '!') || ((c) == '*')) + +#define CHAR_IS_VALID(c) (CHAR_IS_ALPHANUM(c) || CHAR_IS_SPECIAL(c)) +#define CHAR_IS_SPACE(c) (((c) == ' ') || ((c) == '\t')) +#define CHAR_IS_LINEEND(c) (((c) == '\n')) +#define CHAR_IS_COMMENT(c) (((c) == ';')) +#define CHAR_IS_QUOTE(c) (((c) == '"')) + + +fileTYPE ini_file; + +int ini_pt = 0; +static char ini_getch() +{ + static uint8_t buf[512]; + if (!(ini_pt & 0x1ff)) FileReadSec(&ini_file, buf); + if (ini_pt >= ini_file.size) return 0; + return buf[(ini_pt++) & 0x1ff]; +} + +static int ini_getline(char* line) +{ + char c, ignore = 0, skip = 1; + int i = 0; + + while ((c = ini_getch())) + { + if (!CHAR_IS_SPACE(c)) skip = 0; + if (i >= (INI_LINE_SIZE - 1) || CHAR_IS_COMMENT(c)) ignore = 1; + + if (CHAR_IS_LINEEND(c)) break; + if (CHAR_IS_VALID(c) && !ignore && !skip) line[i++] = c; + } + line[i] = '\0'; + return c == 0 ? INI_EOT : 0; +} + +static int ini_get_section(char* buf) +{ + int i = 0; + + // get section start marker + if (buf[0] != INI_SECTION_START) + { + return INI_SECTION_INVALID_ID; + } + else buf++; + + int wc_pos = -1; + + // get section stop marker + while (1) + { + if (buf[i] == INI_SECTION_END) + { + buf[i] = '\0'; + break; + } + + if (buf[i] == '*') wc_pos = i; + + i++; + if (i >= INI_LINE_SIZE) return INI_SECTION_INVALID_ID; + } + + // convert to uppercase + for (i = 0; i < INI_LINE_SIZE; i++) + { + if (!buf[i]) break; + else buf[i] = toupper(buf[i]); + } + + if (!strcasecmp(buf, "MiSTer") || ((wc_pos >= 0) ? !strncasecmp(buf, user_io_get_core_name_ex(), wc_pos) : !strcasecmp(buf, user_io_get_core_name_ex()))) + { + ini_parser_debugf("Got SECTION '%s'", buf); + return 1; + } + + return INI_SECTION_INVALID_ID; +} + +static void ini_parse_var(char* buf) +{ + int i = 0, j = 0; + int var_id = -1; + + // find var + while (1) + { + if (buf[i] == '=') + { + buf[i] = '\0'; + break; + } + else if (buf[i] == '\0') return; + i++; + } + + // convert to uppercase + for (j = 0; j <= i; j++) + { + if (!buf[j]) break; + else buf[j] = toupper(buf[j]); + } + + // parse var + for (j = 0; j < (int)(sizeof(ini_vars) / sizeof(ini_var_t)); j++) + { + if (!strcasecmp(buf, ini_vars[j].name)) var_id = j; + } + + // get data + if (var_id != -1) + { + ini_parser_debugf("Got VAR '%s' with VALUE %s", buf, &(buf[i + 1])); + i++; + switch (ini_vars[var_id].type) + { + case UINT8: + *(uint8_t*)(ini_vars[var_id].var) = strtoul(&(buf[i]), NULL, 0); + if (*(uint8_t*)(ini_vars[var_id].var) > ini_vars[var_id].max) *(uint8_t*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(uint8_t*)(ini_vars[var_id].var) < ini_vars[var_id].min) *(uint8_t*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case INT8: + *(int8_t*)(ini_vars[var_id].var) = strtol(&(buf[i]), NULL, 0); + if (*(int8_t*)(ini_vars[var_id].var) > ini_vars[var_id].max) *(int8_t*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(int8_t*)(ini_vars[var_id].var) < ini_vars[var_id].min) *(int8_t*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case UINT16: + *(uint16_t*)(ini_vars[var_id].var) = strtoul(&(buf[i]), NULL, 0); + if (*(uint16_t*)(ini_vars[var_id].var) > ini_vars[var_id].max) *(uint16_t*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(uint16_t*)(ini_vars[var_id].var) < ini_vars[var_id].min) *(uint16_t*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case INT16: + *(int16_t*)(ini_vars[var_id].var) = strtol(&(buf[i]), NULL, 0); + if (*(int16_t*)(ini_vars[var_id].var) > ini_vars[var_id].max) *(int16_t*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(int16_t*)(ini_vars[var_id].var) < ini_vars[var_id].min) *(int16_t*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case UINT32: + *(uint32_t*)(ini_vars[var_id].var) = strtoul(&(buf[i]), NULL, 0); + if (*(uint32_t*)(ini_vars[var_id].var) > (uint32_t)ini_vars[var_id].max) *(uint32_t*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(uint32_t*)(ini_vars[var_id].var) < (uint32_t)ini_vars[var_id].min) *(uint32_t*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case INT32: + *(int32_t*)(ini_vars[var_id].var) = strtol(&(buf[i]), NULL, 0); + if (*(int32_t*)(ini_vars[var_id].var) > ini_vars[var_id].max) *(int32_t*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(int32_t*)(ini_vars[var_id].var) < ini_vars[var_id].min) *(int32_t*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case FLOAT: + *(float*)(ini_vars[var_id].var) = strtof(&(buf[i]), NULL); + if (*(float*)(ini_vars[var_id].var) > ini_vars[var_id].max) *(float*)(ini_vars[var_id].var) = ini_vars[var_id].max; + if (*(float*)(ini_vars[var_id].var) < ini_vars[var_id].min) *(float*)(ini_vars[var_id].var) = ini_vars[var_id].min; + break; + case STRING: + memset(ini_vars[var_id].var, 0, ini_vars[var_id].max); + strncpy((char*)(ini_vars[var_id].var), &(buf[i]), ini_vars[var_id].max); + break; + } + } +} + +static void ini_parse(int alt) +{ + char line[INI_LINE_SIZE] = { 0 }; + int section = INI_SECTION_INVALID_ID; + int line_status; + + ini_parser_debugf("Start INI parser for core \"%s\".", user_io_get_core_name_ex()); + + memset(&ini_file, 0, sizeof(ini_file)); + + const char *name = cfg_get_name(alt); + if (!FileOpen(&ini_file, name)) return; + + ini_parser_debugf("Opened file %s with size %llu bytes.", name, ini_file.size); + + ini_pt = 0; + + // parse ini + while (1) + { + // get line + line_status = ini_getline(line); + ini_parser_debugf("line(%d): \"%s\".", line_status, line); + + if (line[0] == INI_SECTION_START) + { + // if first char in line is INI_SECTION_START, get section + section = ini_get_section(line); + } + else if(section) + { + // otherwise this is a variable, get it + ini_parse_var(line); + } + + // if end of file, stop + if (line_status == INI_EOT) break; + } + + FileClose(&ini_file); +} + +const char* cfg_get_name(uint8_t alt) +{ + static char name[64]; + strcpy(name, "MiSTer.ini"); + + if (alt == 1) + { + strcpy(name, "MiSTer_alt_1.ini"); + if (FileExists(name)) return name; + return "MiSTer_alt.ini"; + } + + if (alt && alt < 4) sprintf(name, "MiSTer_alt_%d.ini", alt); + return name; +} + +void cfg_parse() +{ + memset(&cfg, 0, sizeof(cfg)); + cfg.bootscreen = 1; + cfg.fb_terminal = 1; + cfg.controller_info = 6; + ini_parse(altcfg()); +} diff --git a/cfg.h b/cfg.h index e4dd249..e14b652 100644 --- a/cfg.h +++ b/cfg.h @@ -5,11 +5,7 @@ #ifndef __CFG_H__ #define __CFG_H__ - -//// includes //// #include -#include "ini_parser.h" - //// type definitions //// typedef struct { @@ -52,12 +48,10 @@ typedef struct { char font[1024]; } cfg_t; -//// functions //// -void MiSTer_ini_parse(); - -//// global variables //// -extern const ini_cfg_t ini_cfg; extern cfg_t cfg; +//// functions //// +void cfg_parse(); +const char* cfg_get_name(uint8_t alt); #endif // __CFG_H__ diff --git a/file_io.cpp b/file_io.cpp index b8cf99b..043b078 100644 --- a/file_io.cpp +++ b/file_io.cpp @@ -1002,7 +1002,7 @@ void FindStorage(void) { int saveddev = device; device = 0; - MiSTer_ini_parse(); + cfg_parse(); device = saveddev; video_mode_load(); user_io_send_buttons(1); diff --git a/ini_parser.cpp b/ini_parser.cpp deleted file mode 100644 index 8113793..0000000 --- a/ini_parser.cpp +++ /dev/null @@ -1,235 +0,0 @@ -// ini_parser.c -// 2015, rok.krajnc@gmail.com - - -//// includes //// -#include -#include -#include -#include -#include -#include "ini_parser.h" -#include "debug.h" -#include "file_io.h" -#include "user_io.h" - -//// defines //// -#define INI_EOT 4 // End-Of-Transmission - -#define INI_LINE_SIZE 256 - -#define INI_SECTION_START '[' -#define INI_SECTION_END ']' -#define INI_SECTION_INVALID_ID 0 - - -//// macros //// -#define CHAR_IS_NUM(c) (((c) >= '0') && ((c) <= '9')) -#define CHAR_IS_ALPHA_LOWER(c) (((c) >= 'a') && ((c) <= 'z')) -#define CHAR_IS_ALPHA_UPPER(c) (((c) >= 'A') && ((c) <= 'Z')) -#define CHAR_IS_ALPHANUM(c) (CHAR_IS_ALPHA_LOWER(c) || CHAR_IS_ALPHA_UPPER(c) || CHAR_IS_NUM(c)) -#define CHAR_IS_SPECIAL(c) (((c) == '[') || ((c) == ']') || ((c) == '(') || ((c) == ')') || \ - ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == '=') || \ - ((c) == '#') || ((c) == '$') || ((c) == '@') || ((c) == '_') || \ - ((c) == ',') || ((c) == '.') || ((c) == '!') || ((c) == '*')) - -#define CHAR_IS_VALID(c) (CHAR_IS_ALPHANUM(c) || CHAR_IS_SPECIAL(c)) -#define CHAR_IS_SPACE(c) (((c) == ' ') || ((c) == '\t')) -#define CHAR_IS_LINEEND(c) (((c) == '\n')) -#define CHAR_IS_COMMENT(c) (((c) == ';')) -#define CHAR_IS_QUOTE(c) (((c) == '"')) - -fileTYPE ini_file; - -int ini_pt = 0; -char ini_getch() -{ - static uint8_t buf[512]; - if (!(ini_pt & 0x1ff)) FileReadSec(&ini_file, buf); - if (ini_pt >= ini_file.size) return 0; - return buf[(ini_pt++) & 0x1ff]; -} - -int ini_getline(char* line) -{ - char c, ignore = 0, skip = 1; - int i = 0; - - while((c = ini_getch())) - { - if (!CHAR_IS_SPACE(c)) skip = 0; - if (i >= (INI_LINE_SIZE - 1) || CHAR_IS_COMMENT(c)) ignore = 1; - - if (CHAR_IS_LINEEND(c)) break; - if (CHAR_IS_VALID(c) && !ignore && !skip) line[i++] = c; - } - line[i] = '\0'; - return c == 0 ? INI_EOT : 0; -} - -int ini_get_section(const ini_cfg_t* cfg, char* buf) -{ - int i = 0; - - // get section start marker - if (buf[0] != INI_SECTION_START) { - return INI_SECTION_INVALID_ID; - } - else buf++; - - int wc_pos = -1; - // get section stop marker - while (1) { - if (buf[i] == INI_SECTION_END) { - buf[i] = '\0'; - break; - } - - if (buf[i] == '*') wc_pos = i; - - i++; - if (i >= INI_LINE_SIZE) { - return INI_SECTION_INVALID_ID; - } - } - - // convert to uppercase - for (i = 0; insections; i++) { - if (!strcasecmp(buf, cfg->sections[i].name)) { - ini_parser_debugf("Got SECTION '%s' with ID %d", buf, cfg->sections[i].id); - return cfg->sections[i].id; - } - } - - if ((wc_pos>=0) ? !strncasecmp(buf, user_io_get_core_name_ex(), wc_pos) : !strcasecmp(buf, user_io_get_core_name_ex())) return cfg->sections[0].id; - - return INI_SECTION_INVALID_ID; -} - -void* ini_get_var(const ini_cfg_t* cfg, int cur_section, char* buf) -{ - int i = 0, j = 0; - int var_id = -1; - - // find var - while (1) { - if (buf[i] == '=') { - buf[i] = '\0'; - break; - } - else if (buf[i] == '\0') return (void*)0; - i++; - } - - // convert to uppercase - for (j = 0; j <= i; j++) { - if (!buf[j]) break; - else buf[j] = toupper(buf[j]); - } - - // parse var - for (j = 0; jnvars; j++) { - if (!strcasecmp(buf, cfg->vars[j].name) && cur_section) var_id = j; - } - - // get data - if (var_id != -1) { - ini_parser_debugf("Got VAR '%s' with VALUE %s", buf, &(buf[i + 1])); - i++; - switch (cfg->vars[var_id].type) { - case UINT8: - *(uint8_t*)(cfg->vars[var_id].var) = strtoul(&(buf[i]), NULL, 0); - if (*(uint8_t*)(cfg->vars[var_id].var) > cfg->vars[var_id].max) *(uint8_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(uint8_t*)(cfg->vars[var_id].var) < cfg->vars[var_id].min) *(uint8_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case INT8: - *(int8_t*)(cfg->vars[var_id].var) = strtol(&(buf[i]), NULL, 0); - if (*(int8_t*)(cfg->vars[var_id].var) > cfg->vars[var_id].max) *(int8_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(int8_t*)(cfg->vars[var_id].var) < cfg->vars[var_id].min) *(int8_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case UINT16: - *(uint16_t*)(cfg->vars[var_id].var) = strtoul(&(buf[i]), NULL, 0); - if (*(uint16_t*)(cfg->vars[var_id].var) > cfg->vars[var_id].max) *(uint16_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(uint16_t*)(cfg->vars[var_id].var) < cfg->vars[var_id].min) *(uint16_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case INT16: - *(int16_t*)(cfg->vars[var_id].var) = strtol(&(buf[i]), NULL, 0); - if (*(int16_t*)(cfg->vars[var_id].var) > cfg->vars[var_id].max) *(int16_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(int16_t*)(cfg->vars[var_id].var) < cfg->vars[var_id].min) *(int16_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case UINT32: - *(uint32_t*)(cfg->vars[var_id].var) = strtoul(&(buf[i]), NULL, 0); - if (*(uint32_t*)(cfg->vars[var_id].var) > (uint32_t)cfg->vars[var_id].max) *(uint32_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(uint32_t*)(cfg->vars[var_id].var) < (uint32_t)cfg->vars[var_id].min) *(uint32_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case INT32: - *(int32_t*)(cfg->vars[var_id].var) = strtol(&(buf[i]), NULL, 0); - if (*(int32_t*)(cfg->vars[var_id].var) > cfg->vars[var_id].max) *(int32_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(int32_t*)(cfg->vars[var_id].var) < cfg->vars[var_id].min) *(int32_t*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case FLOAT: - *(float*)(cfg->vars[var_id].var) = strtof(&(buf[i]), NULL); - if (*(float*)(cfg->vars[var_id].var) > cfg->vars[var_id].max) *(float*)(cfg->vars[var_id].var) = cfg->vars[var_id].max; - if (*(float*)(cfg->vars[var_id].var) < cfg->vars[var_id].min) *(float*)(cfg->vars[var_id].var) = cfg->vars[var_id].min; - break; - case STRING: - memset(cfg->vars[var_id].var, 0, cfg->vars[var_id].max); - strncpy((char*)(cfg->vars[var_id].var), &(buf[i]), cfg->vars[var_id].max); - break; - case CUSTOM_HANDLER: - ((custom_handler_t*)(cfg->vars[var_id].var))(&(buf[i])); - break; - } - return (void*)(&(cfg->vars[var_id].var)); - } - - return (void*)0; -} - -void ini_parse(const ini_cfg_t* cfg, int alt) -{ - char line[INI_LINE_SIZE] = { 0 }; - int section = INI_SECTION_INVALID_ID; - int line_status; - - ini_parser_debugf("Start INI parser for core \"%s\".", user_io_get_core_name_ex()); - - memset(&ini_file, 0, sizeof(ini_file)); - if (!FileOpen(&ini_file, alt ? cfg->filename_alt : cfg->filename)) - { - return; - } - else ini_parser_debugf("Opened file %s with size %llu bytes.", cfg->filename, ini_file.size); - - ini_pt = 0; - - // parse ini - while (1) - { - // get line - line_status = ini_getline(line); - ini_parser_debugf("line(%d): \"%s\".", line_status, line); - - if (line[0] == INI_SECTION_START) - { - // if first char in line is INI_SECTION_START, get section - section = ini_get_section(cfg, line); - } - else - { - // otherwise this is a variable, get it - ini_get_var(cfg, section, line); - } - - // if end of file, stop - if (line_status == INI_EOT) break; - } - - FileClose(&ini_file); -} diff --git a/ini_parser.h b/ini_parser.h deleted file mode 100644 index a85aaa5..0000000 --- a/ini_parser.h +++ /dev/null @@ -1,46 +0,0 @@ -// ini_parser.h -// 2015, rok.krajnc@gmail.com - -#ifndef __INI_PARSER_H__ -#define __INI_PARSER_H__ - -//// includes //// -#include - - -//// type definitions //// -typedef struct { - int id; - const char* name; -} ini_section_t; - -typedef enum { - UINT8 = 0, INT8, UINT16, INT16, UINT32, INT32, FLOAT, - STRING, CUSTOM_HANDLER -} ini_vartypes_t; - -typedef void custom_handler_t(char*); - -typedef struct { - const char* name; - void* var; - ini_vartypes_t type; - int min; - int max; -} ini_var_t; - -typedef struct { - const char* filename; - const char* filename_alt; - const ini_section_t* sections; - const ini_var_t* vars; - int nsections; - int nvars; -} ini_cfg_t; - - -//// functions //// -void ini_parse(const ini_cfg_t* cfg, int alt); - -#endif // __INI_PARSER_H__ - diff --git a/input.cpp b/input.cpp index 58038b7..00f6680 100644 --- a/input.cpp +++ b/input.cpp @@ -1664,6 +1664,8 @@ static void joy_digital(int jnum, uint32_t mask, uint32_t code, char press, int mask = 0; } } + + if((mask & JOY_BTN2) && !(old_osdbtn & JOY_BTN2)) mask = 0; } memset(joy, 0, sizeof(joy)); @@ -1673,18 +1675,42 @@ static void joy_digital(int jnum, uint32_t mask, uint32_t code, char press, int switch (mask) { case JOY_RIGHT: + if (press && (osdbtn & JOY_BTN2)) + { + user_io_set_ini(0); + osdbtn = 0; + return; + } ev.code = KEY_RIGHT; break; case JOY_LEFT: + if (press && (osdbtn & JOY_BTN2)) + { + user_io_set_ini(1); + osdbtn = 0; + return; + } ev.code = KEY_LEFT; break; case JOY_UP: + if (press && (osdbtn & JOY_BTN2)) + { + user_io_set_ini(2); + osdbtn = 0; + return; + } ev.code = KEY_UP; break; case JOY_DOWN: + if (press && (osdbtn & JOY_BTN2)) + { + user_io_set_ini(3); + osdbtn = 0; + return; + } ev.code = KEY_DOWN; break; diff --git a/user_io.cpp b/user_io.cpp index ccc7ae4..5f74fca 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -35,7 +35,8 @@ #include "support.h" -static char core_path[1024]; +static char core_path[1024] = {}; +static char rbf_path[1024] = {}; static uint8_t vol_att = 0; unsigned long vol_set_timeout = 0; @@ -526,10 +527,10 @@ const char* get_rbf_path() void MakeFile(const char * filename, const char * data) { - FILE * file; - file = fopen(filename, "w"); - fwrite(data, strlen(data), 1, file); - fclose(file); + FILE * file; + file = fopen(filename, "w"); + fwrite(data, strlen(data), 1, file); + fclose(file); } int GetUARTMode() @@ -553,18 +554,18 @@ int GetMidiLinkMode() void SetMidiLinkMode(int mode) { - MakeFile("/tmp/CORENAME", user_io_get_core_name_ex()); - remove("/tmp/ML_FSYNTH"); - remove("/tmp/ML_MUNT"); - remove("/tmp/ML_UDP"); - remove("/tmp/ML_TCP"); - switch (mode) - { - case 0: MakeFile("/tmp/ML_FSYNTH", ""); break; - case 1: MakeFile("/tmp/ML_MUNT", ""); break; - case 2: MakeFile("/tmp/ML_TCP", ""); break; - case 3: MakeFile("/tmp/ML_UDP", ""); break; - } + MakeFile("/tmp/CORENAME", user_io_get_core_name_ex()); + remove("/tmp/ML_FSYNTH"); + remove("/tmp/ML_MUNT"); + remove("/tmp/ML_UDP"); + remove("/tmp/ML_TCP"); + switch (mode) + { + case 0: MakeFile("/tmp/ML_FSYNTH", ""); break; + case 1: MakeFile("/tmp/ML_MUNT", ""); break; + case 2: MakeFile("/tmp/ML_TCP", ""); break; + case 3: MakeFile("/tmp/ML_UDP", ""); break; + } } uint16_t sdram_sz(int sz) @@ -674,6 +675,8 @@ void user_io_init(const char *path, const char *xml) // not the RBF. The RBF will be in arcade, which the user shouldn't // browse strcpy(core_path, xml ? xml : path); + strcpy(rbf_path, path); + if (xml) arcade_override_name(xml); memset(sd_image, 0, sizeof(sd_image)); @@ -715,7 +718,7 @@ void user_io_init(const char *path, const char *xml) user_io_8bit_set_status(UIO_STATUS_RESET, UIO_STATUS_RESET); } - MiSTer_ini_parse(); + cfg_parse(); if (cfg.bootcore[0] != '\0') { bootcore_init(xml ? xml : path); @@ -2037,15 +2040,6 @@ void user_io_send_buttons(char force) if ((map != key_map) || force) { - if ((key_map & (BUTTON1 | BUTTON2)) == BUTTON2 && (map & (BUTTON1 | BUTTON2)) == (BUTTON1 | BUTTON2) && is_menu_core()) - { - if (FileExists(ini_cfg.filename_alt)) - { - altcfg(altcfg() ? 0 : 1); - fpga_load_rbf("menu.rbf"); - } - } - const char *name = get_rbf_path(); if (name[0] && (get_key_mod() & (LGUI | LSHIFT)) == (LGUI | LSHIFT) && (key_map & BUTTON2) && !(map & BUTTON2)) { @@ -2072,6 +2066,25 @@ void user_io_send_buttons(char force) } } +void user_io_set_ini(int ini_num) +{ + const char *name = rbf_path; + const char *xml = strcasecmp(rbf_path, core_path) ? core_path : NULL; + + if (!name[0]) + { + name = "menu.rbf"; + xml = NULL; + } + + if (FileExists(cfg_get_name(ini_num))) + { + altcfg(ini_num); + fpga_load_rbf(name, NULL, xml); + } +} + + static uint32_t diskled_timer = 0; static uint32_t diskled_is_on = 0; void diskled_on() diff --git a/user_io.h b/user_io.h index 5aa9e54..329e06f 100644 --- a/user_io.h +++ b/user_io.h @@ -248,6 +248,7 @@ int user_io_get_joyswap(); char user_io_osd_is_visible(); void set_vga_fb(int enable); int get_vga_fb(); +void user_io_set_ini(int ini_num); void user_io_send_buttons(char); uint16_t user_io_get_sdram_cfg();