diff --git a/file_io.h b/file_io.h index b1d05fa..3872ed3 100644 --- a/file_io.h +++ b/file_io.h @@ -47,7 +47,7 @@ direntext_t* flist_SelectedItem(); #define SCANO_DIR 1 // include subdirectories #define SCANO_UMOUNT 2 // allow backspace key #define SCANO_CORES 4 // only include subdirectories with prefix '_' -#define SCANO_COEFF 8 +#define SCANO_TXT 8 #define SCANO_NEOGEO 16 #define SCANO_NOENTER 32 @@ -98,5 +98,6 @@ const char *getFullPath(const char *name); uint32_t getFileType(const char *name); #define COEFF_DIR "filters" +#define GAMMA_DIR "gamma" #endif diff --git a/menu.cpp b/menu.cpp index 1834f51..bf90c97 100644 --- a/menu.cpp +++ b/menu.cpp @@ -156,6 +156,7 @@ enum MENU MENU_8BIT_SYSTEM1, MENU_8BIT_SYSTEM2, MENU_COEFF_FILE_SELECTED, + MENU_GAMMA_FILE_SELECTED, MENU_8BIT_INFO, MENU_8BIT_INFO2, MENU_8BIT_ABOUT1, @@ -195,6 +196,7 @@ const char *joy_ana_map[] = { " DPAD test: Press RIGHT", " DPAD test: Pres const char *config_stereo_msg[] = { "0%", "25%", "50%", "100%" }; const char *config_uart_msg[] = { " None", " PPP", " Console", " MIDI" }; const char *config_scaler_msg[] = { "Internal","Custom" }; +const char *config_gamma_msg[] = { "Off","On" }; char joy_bnames[32][32]; int joy_bcount = 0; @@ -321,7 +323,7 @@ static void SelectFile(const char* pFileExt, unsigned char Options, unsigned cha } pFileExt = "RBF"; } - else if (Options & SCANO_COEFF) + else if (Options & SCANO_TXT) { pFileExt = "TXT"; } @@ -479,7 +481,7 @@ static uint32_t menu_key_get(void) else if (CheckTimer(repeat)) { repeat = GetTimer(REPEATRATE); - if (GetASCIIKey(c1) || ((menustate == MENU_8BIT_SYSTEM2) && (menusub == 9))) + if (GetASCIIKey(c1) || ((menustate == MENU_8BIT_SYSTEM2) && (menusub == 11))) { c = c1; hold_cnt++; @@ -696,7 +698,7 @@ static int firstmenu = 0; static int adjvisible; static char lastrow[256]; -static void MenuWrite(unsigned char n, const char *s, unsigned char invert, unsigned char stipple = 0, int arrow = 0) +static void MenuWrite(unsigned char n, const char *s = "", unsigned char invert = 0, unsigned char stipple = 0, int arrow = 0) { int row = n - firstmenu; @@ -1649,71 +1651,100 @@ void HandleUI(void) { OsdSetSize(16); helptext = 0; - menumask = 0xf87; reboot_req = 0; - OsdSetTitle("System", OSD_ARROW_LEFT); + OsdSetTitle("System", 0); menustate = MENU_8BIT_SYSTEM2; parentstate = MENU_8BIT_SYSTEM1; + int n; - int n = 0; - OsdWrite(n++); - - OsdWrite(n++, " Core \x16", menusub == 0, 0); - sprintf(s, " Define %s buttons ", is_menu_core() ? "System" : user_io_get_core_name_ex()); - s[27] = '\x16'; - s[28] = 0; - OsdWrite(n++, s, menusub == 1, 0); - OsdWrite(n++, " Button/Key remap for game \x16", menusub == 2, 0); - - if (user_io_get_uart_mode()) + while(1) { - menumask |= 0x8; - OsdWrite(n++); - const char *p = config_uart_msg[GetUARTMode()]; - while (*p == ' ') p++; - sprintf(s, " UART mode (%s) ",p); + n = 0; + menumask = 0x3e07; + + if (!menusub) firstmenu = 0; + adjvisible = 0; + + MenuWrite(n++); + MenuWrite(n++, " Core \x16", menusub == 0, 0); + sprintf(s, " Define %s buttons ", is_menu_core() ? "System" : user_io_get_core_name_ex()); s[27] = '\x16'; s[28] = 0; - OsdWrite(n++, s, menusub == 3); + MenuWrite(n++, s, menusub == 1, 0); + MenuWrite(n++, " Button/Key remap for game \x16", menusub == 2, 0); + + if (user_io_get_uart_mode()) + { + menumask |= 0x8; + MenuWrite(n++); + const char *p = config_uart_msg[GetUARTMode()]; + while (*p == ' ') p++; + sprintf(s, " UART mode (%s) ",p); + s[27] = '\x16'; + s[28] = 0; + MenuWrite(n++, s, menusub == 3); + } + + if (video_get_scaler_flt() >= 0 && !cfg.direct_video) + { + MenuWrite(n++); + menumask |= 0x60; + sprintf(s, " Scale Filter - %s", config_scaler_msg[video_get_scaler_flt() ? 1 : 0]); + MenuWrite(n++, s, menusub == 5); + + memset(s, 0, sizeof(s)); + s[0] = ' '; + if (strlen(video_get_scaler_coeff())) strncpy(s+1, video_get_scaler_coeff(),25); + else strcpy(s, " < none >"); + + while(strlen(s) < 26) strcat(s, " "); + strcat(s, " \x16 "); + + MenuWrite(n++, s, menusub == 6, !video_get_scaler_flt() || !S_ISDIR(getFileType(COEFF_DIR))); + } + + if (video_get_gamma_en() >=0 && !cfg.direct_video) + { + MenuWrite(n++); + menumask |= 0x180; + sprintf(s, " Gamma Correction - %s", config_gamma_msg[video_get_gamma_en() ? 1 : 0]); + MenuWrite(n++, s, menusub == 7); + + memset(s, 0, sizeof(s)); + s[0] = ' '; + if (strlen(video_get_gamma_curve())) strncpy(s+1, video_get_gamma_curve(),25); + else strcpy(s, " < none >"); + + while(strlen(s) < 26) strcat(s, " "); + strcat(s, " \x16 "); + + MenuWrite(n++, s, menusub == 8, !video_get_gamma_en() || !S_ISDIR(getFileType(GAMMA_DIR))); + } + + m = 0; + if (is_minimig()) + { + m = 1; + menumask &= ~0x400; + } + MenuWrite(n++); + MenuWrite(n++, m ? " Reset the core" : " Reset settings", menusub == 9, user_io_core_type() == CORE_TYPE_ARCHIE); + MenuWrite(n++, m ? "" : " Save settings", menusub == 10, 0); + + MenuWrite(n++); + cr = n; + MenuWrite(n++, " Reboot (hold \x16 cold reboot)", menusub == 11); + MenuWrite(n++, " About", menusub == 12); + + while(n < OsdGetSize() - 1) MenuWrite(n++); + MenuWrite(n++, STD_EXIT, menusub == 13, 0, OSD_ARROW_LEFT); + sysinfo_timer = 0; + + if (!adjvisible) break; + firstmenu += adjvisible; } - if (video_get_scaler_flt() >= 0 && !cfg.direct_video) - { - OsdWrite(n++); - menumask |= 0x60; - sprintf(s, " Scale Filter - %s", config_scaler_msg[video_get_scaler_flt() ? 1 : 0]); - OsdWrite(n++, s, menusub == 5); - - memset(s, 0, sizeof(s)); - s[0] = ' '; - if (strlen(video_get_scaler_coeff())) strncpy(s+1, video_get_scaler_coeff(),25); - else strcpy(s, " < none >"); - - while(strlen(s) < 26) strcat(s, " "); - strcat(s, " \x16 "); - - OsdWrite(n++, s, menusub == 6, !video_get_scaler_flt() || !S_ISDIR(getFileType(COEFF_DIR))); - } - - m = 0; - if (is_minimig()) - { - m = 1; - menumask &= ~0x100; - } - OsdWrite(n++); - OsdWrite(n++, m ? " Reset the core" : " Reset settings", menusub == 7, user_io_core_type() == CORE_TYPE_ARCHIE); - OsdWrite(n++, m ? "" : " Save settings", menusub == 8, 0); - - OsdWrite(n++); - cr = n; - OsdWrite(n++, " Reboot (hold \x16 cold reboot)", menusub == 9); - OsdWrite(n++, " About", menusub == 10); - - while(n < 15) OsdWrite(n++); - OsdWrite(15, STD_EXIT, menusub == 11); - sysinfo_timer = 0; } break; @@ -1786,11 +1817,22 @@ void HandleUI(void) if (video_get_scaler_flt()) { sprintf(SelectedPath, COEFF_DIR"/%s", video_get_scaler_coeff()); - SelectFile(0, SCANO_COEFF, MENU_COEFF_FILE_SELECTED, MENU_8BIT_SYSTEM1); + SelectFile(0, SCANO_TXT, MENU_COEFF_FILE_SELECTED, MENU_8BIT_SYSTEM1); } break; - case 7: + video_set_gamma_en(video_get_gamma_en() ? 0 : 1); + menustate = MENU_8BIT_SYSTEM1; + break; + + case 8: + if (video_get_gamma_en()) + { + sprintf(SelectedPath, GAMMA_DIR"/%s", video_get_gamma_curve()); + SelectFile(0, SCANO_TXT, MENU_GAMMA_FILE_SELECTED, MENU_8BIT_SYSTEM1); + } + break; + case 9: if (user_io_core_type() != CORE_TYPE_ARCHIE) { menustate = MENU_RESET1; @@ -1803,7 +1845,7 @@ void HandleUI(void) } break; - case 8: + case 10: // Save settings menustate = MENU_8BIT_MAIN1; menusub = 0; @@ -1827,7 +1869,7 @@ void HandleUI(void) } break; - case 9: + case 11: { reboot_req = 1; @@ -1836,11 +1878,11 @@ void HandleUI(void) sprintf(s, " Cold Reboot"); p = s + 5 - off; - OsdWrite(cr, p, menusub == 8, 0); + MenuWrite(cr, p, menusub == 11, 0); } break; - case 10: + case 12: menustate = MENU_8BIT_ABOUT1; menusub = 0; break; @@ -1993,7 +2035,14 @@ void HandleUI(void) menustate = MENU_8BIT_SYSTEM1; } break; - + case MENU_GAMMA_FILE_SELECTED: + { + char *p = strrchr(SelectedPath, '/'); + if (!p) video_set_gamma_curve(SelectedPath); + else video_set_gamma_curve(p+1); + menustate = MENU_8BIT_SYSTEM1; + } + break; case MENU_8BIT_INFO: OsdSetSize(16); helptext = 0; diff --git a/user_io.h b/user_io.h index fb96a00..d1f2fdf 100644 --- a/user_io.h +++ b/user_io.h @@ -70,6 +70,8 @@ #define UIO_SET_FBUF 0x2F // Set frame buffer for HPS output #define UIO_WAIT_VSYNC 0x30 // Wait for VSync #define UIO_SET_MEMSZ 0x31 // Send memory size to the core +#define UIO_SET_GAMMA 0x32 // Enable/disable Gamma correction +#define UIO_SET_GAMCURV 0x33 // Set Gamma curve // codes as used by 8bit for file loading from OSD #define UIO_FILE_TX 0x53 diff --git a/video.cpp b/video.cpp index 696e670..3d88f1b 100644 --- a/video.cpp +++ b/video.cpp @@ -288,9 +288,119 @@ static void loadScalerCfg() } } +static char gamma_cfg[1024] = { 0 }; +static char has_gamma = 0; + +static void setGamma() +{ + fileTYPE f = {}; + static char filename[1024]; + + if (!spi_uio_cmd_cont(UIO_SET_GAMMA)) + { + DisableIO(); + return; + } + + has_gamma = 1; + spi8(0); + DisableIO(); + sprintf(filename, GAMMA_DIR"/%s", gamma_cfg + 1); + + if (FileOpen(&f, filename)) + { + char *buf = (char*)malloc(f.size+1); + if (buf) + { + memset(buf, 0, f.size + 1); + int size; + if ((size = FileReadAdv(&f, buf, f.size))) + { + spi_uio_cmd_cont(UIO_SET_GAMCURV); + + char *end = buf + size; + char *pos = buf; + int index = 0; + while (pos < end) + { + char *st = pos; + while ((pos < end) && *pos && (*pos != 10)) pos++; + *pos = 0; + while (*st == ' ' || *st == '\t' || *st == 13) st++; + if (*st == '#' || *st == ';' || !*st) pos++; + else + { + int c0, c1, c2; + int n = sscanf(st, "%d,%d,%d", &c0, &c1, &c2); + if (n == 1) + { + c1 = c0; + c2 = c0; + n = 3; + } + + if (n == 3) + { + spi_w((index << 8) | (c0 & 0xFF)); + spi_w((index << 8) | (c1 & 0xFF)); + spi_w((index << 8) | (c2 & 0xFF)); + + index++; + if (index >= 256) break; + } + } + } + DisableIO(); + spi_uio_cmd8(UIO_SET_GAMMA, gamma_cfg[0]); + } + + free(buf); + } + } +} +int video_get_gamma_en() +{ + return has_gamma ? gamma_cfg[0] : -1; +} + +char* video_get_gamma_curve() +{ + return gamma_cfg + 1; +} + +static char gamma_cfg_path[128] = { 0 }; + +void video_set_gamma_en(int n) +{ + gamma_cfg[0] = (char)n; + FileSaveConfig(gamma_cfg_path, &gamma_cfg, sizeof(gamma_cfg)); + setGamma(); +} + +void video_set_gamma_curve(char *name) +{ + strcpy(gamma_cfg + 1, name); + FileSaveConfig(gamma_cfg_path, &gamma_cfg, sizeof(gamma_cfg)); + setGamma(); + user_io_send_buttons(1); +} + +static void loadGammaCfg() +{ + sprintf(gamma_cfg_path, "%s_gamma.cfg", user_io_get_core_name_ex()); + if (!FileLoadConfig(gamma_cfg_path, &gamma_cfg, sizeof(gamma_cfg) - 1) || gamma_cfg[0]>1) + { + memset(gamma_cfg, 0, sizeof(gamma_cfg)); + } +} + + static char fb_reset_cmd[128] = {}; static void set_video(vmode_custom_t *v, double Fpix) { + loadGammaCfg(); + setGamma(); + loadScalerCfg(); setScaler(); diff --git a/video.h b/video.h index 3d05c90..636b2e1 100644 --- a/video.h +++ b/video.h @@ -6,6 +6,11 @@ void video_set_scaler_flt(int n); char* video_get_scaler_coeff(); void video_set_scaler_coeff(char *name); +int video_get_gamma_en(); +void video_set_gamma_en(int n); +char* video_get_gamma_curve(); +void video_set_gamma_curve(char *name); + void video_mode_load(); void video_mode_adjust();