Support for AScaler settings.
This commit is contained in:
10
file_io.cpp
10
file_io.cpp
@@ -330,6 +330,16 @@ int FileCanWrite(const char *name)
|
||||
return ((st.st_mode & S_IWUSR) != 0);
|
||||
}
|
||||
|
||||
uint32_t getFileType(const char *name)
|
||||
{
|
||||
sprintf(full_path, "%s/%s", getRootDir(), name);
|
||||
|
||||
struct stat64 st;
|
||||
if (stat64(full_path, &st)) return 0;
|
||||
|
||||
return st.st_mode;
|
||||
}
|
||||
|
||||
static int device = 0;
|
||||
static int usbnum = 0;
|
||||
const char *getStorageDir(int dev)
|
||||
|
||||
@@ -34,6 +34,7 @@ dirent* 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
|
||||
|
||||
void FindStorage();
|
||||
int getStorage(int from_setting);
|
||||
@@ -76,4 +77,6 @@ const char *getStorageDir(int dev);
|
||||
const char *getRootDir();
|
||||
const char *getFullPath(const char *name);
|
||||
|
||||
uint32_t getFileType(const char *name);
|
||||
|
||||
#endif
|
||||
|
||||
218
menu.cpp
218
menu.cpp
@@ -127,6 +127,9 @@ enum MENU
|
||||
MENU_8BIT_MAIN_IMAGE_SELECTED,
|
||||
MENU_8BIT_SYSTEM1,
|
||||
MENU_8BIT_SYSTEM2,
|
||||
MENU_COEFF_FILE_SELECTED,
|
||||
MENU_8BIT_INFO,
|
||||
MENU_8BIT_INFO2,
|
||||
MENU_8BIT_ABOUT1,
|
||||
MENU_8BIT_ABOUT2
|
||||
};
|
||||
@@ -162,6 +165,7 @@ const char *config_button_turbo_choice_msg[] = { "A only", "B only", "A & B" };
|
||||
const char *joy_button_map[] = { "RIGHT", "LEFT", "DOWN", "UP", "BUTTON 1", "BUTTON 2", "BUTTON 3", "BUTTON 4", "KBD TOGGLE", "BUTTON OSD" };
|
||||
const char *config_stereo_msg[] = { "0%", "25%", "50%", "100%" };
|
||||
const char *config_uart_msg[] = { " None", " PPP", " Console", " USBMIDI", "USBMIDI-38K" };
|
||||
const char *config_scaler_msg[] = { "Nearest Neighbor","Bilinear","Sharp Bilinear","Bicubic","Custom" };
|
||||
|
||||
char joy_bnames[12][32];
|
||||
int joy_bcount = 0;
|
||||
@@ -280,6 +284,10 @@ static void SelectFile(const char* pFileExt, unsigned char Options, unsigned cha
|
||||
}
|
||||
pFileExt = "RBF";
|
||||
}
|
||||
else if (Options & SCANO_COEFF)
|
||||
{
|
||||
pFileExt = "TXT";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strncasecmp(HomeDir, SelectedPath, strlen(HomeDir))) strcpy(SelectedPath, HomeDir);
|
||||
@@ -539,7 +547,7 @@ void printSysInfo()
|
||||
sysinfo_timer = GetTimer(2000);
|
||||
struct battery_data_t bat;
|
||||
int hasbat = getBattery(0, &bat);
|
||||
int n = 10;
|
||||
int n = is_menu_core() ? 10 : 5;
|
||||
|
||||
char str[40];
|
||||
OsdWrite(n++, info_top, 0, 0);
|
||||
@@ -614,7 +622,7 @@ int firstmenu = 0;
|
||||
int adjvisible;
|
||||
char lastrow[256];
|
||||
|
||||
void MenuWrite(unsigned char n, const char *s, unsigned char invert, unsigned char stipple, int arrow = 0)
|
||||
void MenuWrite(unsigned char n, const char *s, unsigned char invert, unsigned char stipple = 0, int arrow = 0)
|
||||
{
|
||||
int row = n - firstmenu;
|
||||
|
||||
@@ -867,7 +875,7 @@ void HandleUI(void)
|
||||
/******************************************************************/
|
||||
|
||||
case MENU_ARCHIE_MAIN1:
|
||||
OsdSetTitle(user_io_get_core_name(), OSD_ARROW_RIGHT);
|
||||
OsdSetTitle(user_io_get_core_name(), OSD_ARROW_RIGHT | OSD_ARROW_LEFT);
|
||||
|
||||
menumask = 0x3f;
|
||||
OsdWrite(0, "", 0, 0);
|
||||
@@ -959,6 +967,11 @@ void HandleUI(void)
|
||||
menustate = MENU_8BIT_SYSTEM1;
|
||||
menusub = 0;
|
||||
}
|
||||
else if (left)
|
||||
{
|
||||
menustate = MENU_8BIT_INFO;
|
||||
menusub = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_ARCHIE_MAIN_FILE_SELECTED: // file successfully selected
|
||||
@@ -1116,7 +1129,7 @@ void HandleUI(void)
|
||||
for (; entry < OsdGetSize() - 1; entry++) MenuWrite(entry, "", 0, 0);
|
||||
|
||||
// exit row
|
||||
MenuWrite(entry, STD_EXIT, menusub == selentry, 0, OSD_ARROW_RIGHT);
|
||||
MenuWrite(entry, STD_EXIT, menusub == selentry, 0, OSD_ARROW_RIGHT | OSD_ARROW_LEFT);
|
||||
menusub_last = selentry;
|
||||
menumask = (menumask << 1) | 1;
|
||||
|
||||
@@ -1237,6 +1250,11 @@ void HandleUI(void)
|
||||
menustate = MENU_8BIT_SYSTEM1;
|
||||
menusub = 0;
|
||||
}
|
||||
else if (left)
|
||||
{
|
||||
menustate = MENU_8BIT_INFO;
|
||||
menusub = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_8BIT_MAIN_FILE_SELECTED:
|
||||
@@ -1260,52 +1278,76 @@ void HandleUI(void)
|
||||
break;
|
||||
|
||||
case MENU_8BIT_SYSTEM1:
|
||||
OsdSetSize(16);
|
||||
helptext = 0;
|
||||
menumask = 0xf7;
|
||||
reboot_req = 0;
|
||||
|
||||
OsdSetTitle("System", OSD_ARROW_LEFT);
|
||||
menustate = MENU_8BIT_SYSTEM2;
|
||||
parentstate = MENU_8BIT_SYSTEM1;
|
||||
|
||||
s[0] = 0;
|
||||
m = 0;
|
||||
if(user_io_get_uart_mode())
|
||||
{
|
||||
int mode = 0;
|
||||
struct stat filestat;
|
||||
if (!stat("/tmp/uartmode1", &filestat)) mode = 1;
|
||||
if (!stat("/tmp/uartmode2", &filestat)) mode = 2;
|
||||
if (!stat("/tmp/uartmode3", &filestat)) mode = 3;
|
||||
if (!stat("/tmp/uartmode4", &filestat)) mode = 4;
|
||||
|
||||
menumask |= 8;
|
||||
sprintf(s, " UART connection %s", config_uart_msg[mode]);
|
||||
OsdWrite(3, s, menusub == 3, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
OsdWrite(m++, "", 0, 0);
|
||||
}
|
||||
OsdSetSize(16);
|
||||
helptext = 0;
|
||||
menumask = 0x7C7;
|
||||
reboot_req = 0;
|
||||
|
||||
OsdWrite(m++, " Core \x16", menusub == 0, 0);
|
||||
OsdWrite(m++, " Define joystick buttons \x16", menusub == 1, 0);
|
||||
OsdWrite(m++, " Button/Key remap for game \x16", menusub == 2, 0);
|
||||
OsdWrite(4, "", 0, 0);
|
||||
OsdSetTitle("System", OSD_ARROW_LEFT);
|
||||
menustate = MENU_8BIT_SYSTEM2;
|
||||
parentstate = MENU_8BIT_SYSTEM1;
|
||||
|
||||
m = 0;
|
||||
if (user_io_core_type() == CORE_TYPE_MINIMIG2)
|
||||
{
|
||||
m = 1;
|
||||
menumask &= ~0x20;
|
||||
s[0] = 0;
|
||||
m = 0;
|
||||
if (user_io_get_uart_mode())
|
||||
{
|
||||
int mode = 0;
|
||||
struct stat filestat;
|
||||
if (!stat("/tmp/uartmode1", &filestat)) mode = 1;
|
||||
if (!stat("/tmp/uartmode2", &filestat)) mode = 2;
|
||||
if (!stat("/tmp/uartmode3", &filestat)) mode = 3;
|
||||
if (!stat("/tmp/uartmode4", &filestat)) mode = 4;
|
||||
|
||||
menumask |= 8;
|
||||
sprintf(s, " UART connection %s", config_uart_msg[mode]);
|
||||
OsdWrite(3, s, menusub == 3, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
OsdWrite(m++, "", 0, 0);
|
||||
}
|
||||
|
||||
OsdWrite(m++, " Core \x16", menusub == 0, 0);
|
||||
OsdWrite(m++, " Define joystick buttons \x16", menusub == 1, 0);
|
||||
OsdWrite(m++, " Button/Key remap for game \x16", menusub == 2, 0);
|
||||
OsdWrite(4, "", 0, 0);
|
||||
|
||||
m = 0;
|
||||
if (user_io_core_type() == CORE_TYPE_MINIMIG2)
|
||||
{
|
||||
m = 1;
|
||||
menumask &= ~0x80;
|
||||
}
|
||||
|
||||
OsdWrite(5);
|
||||
int n = 6;
|
||||
if (user_io_get_scaler_flt() >= 0)
|
||||
{
|
||||
menumask |= 0x30;
|
||||
OsdWrite(n++, " HDMI Scaler:");
|
||||
sprintf(s, " \x16 Filter - %s", config_scaler_msg[user_io_get_scaler_flt()]);
|
||||
OsdWrite(n++, s, menusub == 4);
|
||||
|
||||
memset(s, 0, sizeof(s));
|
||||
strcpy(s, " \x16 ");
|
||||
if (strlen(user_io_get_scaler_coeff())) strncat(s, user_io_get_scaler_coeff(), 22);
|
||||
else strcat(s, "<none>");
|
||||
|
||||
OsdWrite(n++, s, menusub == 5, user_io_get_scaler_flt() != 4 || !S_ISDIR(getFileType("coeff")));
|
||||
OsdWrite(n++);
|
||||
}
|
||||
|
||||
OsdWrite(n++, m ? " Reset the core" : " Reset settings", menusub == 6, user_io_core_type() == CORE_TYPE_ARCHIE);
|
||||
OsdWrite(n++, m ? "" : " Save settings", menusub == 7, 0);
|
||||
OsdWrite(n++);
|
||||
OsdWrite(n++, " Reboot (hold \x16 cold reboot)", menusub == 8);
|
||||
OsdWrite(n++, " About", menusub == 9);
|
||||
|
||||
while(n < 15) OsdWrite(n++);
|
||||
OsdWrite(15, STD_EXIT, menusub == 10);
|
||||
sysinfo_timer = 0;
|
||||
}
|
||||
OsdWrite(5, m ? " Reset the core" : " Reset settings", menusub == 4, user_io_core_type() == CORE_TYPE_ARCHIE);
|
||||
OsdWrite(6, m ? "" : " Save settings", menusub == 5, 0);
|
||||
OsdWrite(7, "", 0, 0);
|
||||
OsdWrite(8, " Reboot (hold \x16 cold reboot)", menusub == 6, 0);
|
||||
OsdWrite(9, " About", menusub == 7, 0);
|
||||
sysinfo_timer = 0;
|
||||
break;
|
||||
|
||||
case MENU_8BIT_SYSTEM2:
|
||||
@@ -1374,6 +1416,19 @@ void HandleUI(void)
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
user_io_set_scaler_flt((user_io_get_scaler_flt() < 4) ? user_io_get_scaler_flt() + 1 : 0);
|
||||
menustate = MENU_8BIT_SYSTEM1;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if (user_io_get_scaler_flt() == 4)
|
||||
{
|
||||
sprintf(SelectedPath, "coeff/%s", user_io_get_scaler_coeff());
|
||||
SelectFile(0, SCANO_COEFF, MENU_COEFF_FILE_SELECTED, MENU_8BIT_SYSTEM1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 6:
|
||||
if (user_io_core_type() != CORE_TYPE_ARCHIE)
|
||||
{
|
||||
menustate = MENU_RESET1;
|
||||
@@ -1385,7 +1440,7 @@ void HandleUI(void)
|
||||
menusub = 0;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
case 7:
|
||||
// Save settings
|
||||
menustate = MENU_8BIT_MAIN1;
|
||||
menusub = 0;
|
||||
@@ -1408,7 +1463,7 @@ void HandleUI(void)
|
||||
if (is_x86_core()) x86_config_save();
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
case 8:
|
||||
{
|
||||
reboot_req = 1;
|
||||
|
||||
@@ -1420,10 +1475,13 @@ void HandleUI(void)
|
||||
OsdWrite(8, p, menusub == 6, 0);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
case 9:
|
||||
menustate = MENU_8BIT_ABOUT1;
|
||||
menusub = 0;
|
||||
break;
|
||||
default:
|
||||
menustate = MENU_NONE1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (left)
|
||||
@@ -1454,8 +1512,63 @@ void HandleUI(void)
|
||||
}
|
||||
|
||||
if(!hold_cnt && reboot_req) fpga_load_rbf("menu.rbf");
|
||||
break;
|
||||
|
||||
case MENU_COEFF_FILE_SELECTED:
|
||||
{
|
||||
char *p = strrchr(SelectedPath, '/');
|
||||
if (!p) user_io_set_scaler_coeff(SelectedPath);
|
||||
else user_io_set_scaler_coeff(p+1);
|
||||
menustate = MENU_8BIT_SYSTEM1;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_8BIT_INFO:
|
||||
OsdSetSize(16);
|
||||
helptext = 0;
|
||||
menumask = 1;
|
||||
menustate = MENU_8BIT_INFO2;
|
||||
parentstate = MENU_8BIT_INFO;
|
||||
OsdSetTitle("System", OSD_ARROW_RIGHT);
|
||||
|
||||
for (int i = 0; i < OsdGetSize() - 1; i++) OsdWrite(i, "", 0, 0);
|
||||
OsdWrite(3, " Information");
|
||||
OsdWrite(15, STD_EXIT, menusub == 0, 0, OSD_ARROW_RIGHT);
|
||||
break;
|
||||
|
||||
case MENU_8BIT_INFO2:
|
||||
printSysInfo();
|
||||
if (select || menu)
|
||||
{
|
||||
menustate = MENU_NONE1;
|
||||
break;
|
||||
}
|
||||
else if (right)
|
||||
{
|
||||
// go back to core requesting this menu
|
||||
switch (user_io_core_type()) {
|
||||
case CORE_TYPE_MINIMIG2:
|
||||
menusub = 0;
|
||||
menustate = MENU_MAIN1;
|
||||
break;
|
||||
case CORE_TYPE_MIST:
|
||||
menusub = 5;
|
||||
menustate = MENU_MIST_MAIN1;
|
||||
break;
|
||||
case CORE_TYPE_ARCHIE:
|
||||
menusub = 0;
|
||||
menustate = MENU_ARCHIE_MAIN1;
|
||||
break;
|
||||
case CORE_TYPE_8BIT:
|
||||
menusub = 0;
|
||||
menustate = MENU_8BIT_MAIN1;
|
||||
break;
|
||||
case CORE_TYPE_SHARPMZ:
|
||||
menusub = menusub_last;
|
||||
menustate = sharpmz_default_ui_state();
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_JOYDIGMAP:
|
||||
@@ -2088,7 +2201,7 @@ void HandleUI(void)
|
||||
/******************************************************************/
|
||||
case MENU_MAIN1:
|
||||
menumask = 0xFF0; // b01110000 Floppy turbo, Harddisk options & Exit.
|
||||
OsdSetTitle("Minimig", OSD_ARROW_RIGHT);
|
||||
OsdSetTitle("Minimig", OSD_ARROW_RIGHT | OSD_ARROW_LEFT);
|
||||
helptext = helptexts[HELPTEXT_MAIN];
|
||||
|
||||
OsdWrite(0, "", 0, 0);
|
||||
@@ -2243,6 +2356,11 @@ void HandleUI(void)
|
||||
menustate = MENU_8BIT_SYSTEM1;
|
||||
menusub = 0;
|
||||
}
|
||||
else if (left)
|
||||
{
|
||||
menustate = MENU_8BIT_INFO;
|
||||
menusub = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_FILE_SELECTED: // file successfully selected
|
||||
|
||||
4
osd.h
4
osd.h
@@ -66,9 +66,9 @@
|
||||
#include <inttypes.h>
|
||||
|
||||
/*functions*/
|
||||
void OsdSetTitle(const char *s, int arrow); // arrow > 0 = display right arrow in bottom right, < 0 = display left arrow
|
||||
void OsdSetTitle(const char *s, int arrow = 0); // arrow > 0 = display right arrow in bottom right, < 0 = display left arrow
|
||||
void OsdSetArrow(int arrow);
|
||||
void OsdWrite(unsigned char n, const char *s, unsigned char inver, unsigned char stipple, char usebg = 0);
|
||||
void OsdWrite(unsigned char n, const char *s="", unsigned char inver=0, unsigned char stipple=0, char usebg = 0);
|
||||
void OsdWriteOffset(unsigned char n, const char *s, unsigned char inver, unsigned char stipple, char offset, char leftchar, char usebg = 0); // Used for scrolling "Exit" text downwards...
|
||||
void OsdClear(void);
|
||||
void OsdEnable(unsigned char mode);
|
||||
|
||||
57
user_io.cpp
57
user_io.cpp
@@ -2579,11 +2579,27 @@ static void setPLL(double Fout)
|
||||
vitems[20] = k;
|
||||
}
|
||||
|
||||
static void setScalerCoeff()
|
||||
static char scaler_flt_cfg[1024] = { 0 };
|
||||
static char new_scaler = 0;
|
||||
|
||||
static void setScaler()
|
||||
{
|
||||
fileTYPE f = { 0 };
|
||||
static char filename[1024];
|
||||
sprintf(filename, "%s/coeff.txt", HomeDir);
|
||||
|
||||
if (!spi_uio_cmd_cont(UIO_SET_FLTNUM))
|
||||
{
|
||||
DisableIO();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_scaler = 1;
|
||||
spi8(scaler_flt_cfg[0]);
|
||||
DisableIO();
|
||||
}
|
||||
|
||||
sprintf(filename, "coeff/%s", scaler_flt_cfg+1);
|
||||
if (FileOpen(&f, filename))
|
||||
{
|
||||
printf("Read scaler coefficients\n");
|
||||
@@ -2594,7 +2610,7 @@ static void setScalerCoeff()
|
||||
int size;
|
||||
if (size = FileReadAdv(&f, buf, f.size))
|
||||
{
|
||||
spi_uio_cmd_cont(UIO_SET_VIPCOEF);
|
||||
spi_uio_cmd_cont(UIO_SET_FLTCOEF);
|
||||
|
||||
char *end = buf + size;
|
||||
char *pos = buf;
|
||||
@@ -2633,9 +2649,42 @@ static void setScalerCoeff()
|
||||
}
|
||||
}
|
||||
|
||||
int user_io_get_scaler_flt()
|
||||
{
|
||||
return new_scaler ? scaler_flt_cfg[0] : -1;
|
||||
}
|
||||
|
||||
char* user_io_get_scaler_coeff()
|
||||
{
|
||||
return scaler_flt_cfg + 1;
|
||||
}
|
||||
|
||||
void user_io_set_scaler_flt(int n)
|
||||
{
|
||||
scaler_flt_cfg[0] = (char)n;
|
||||
FileSaveConfig("scaler.cfg", &scaler_flt_cfg, sizeof(scaler_flt_cfg));
|
||||
spi_uio_cmd8(UIO_SET_FLTNUM, scaler_flt_cfg[0]);
|
||||
}
|
||||
|
||||
void user_io_set_scaler_coeff(char *name)
|
||||
{
|
||||
strcpy(scaler_flt_cfg + 1, name);
|
||||
FileSaveConfig("scaler.cfg", &scaler_flt_cfg, sizeof(scaler_flt_cfg));
|
||||
setScaler();
|
||||
}
|
||||
|
||||
static void loadScalerCfg()
|
||||
{
|
||||
if (!FileLoadConfig("scaler.cfg", &scaler_flt_cfg, sizeof(scaler_flt_cfg) - 1) || scaler_flt_cfg[0]>4)
|
||||
{
|
||||
memset(scaler_flt_cfg, 0, sizeof(scaler_flt_cfg));
|
||||
}
|
||||
}
|
||||
|
||||
static void setVideo()
|
||||
{
|
||||
setScalerCoeff();
|
||||
loadScalerCfg();
|
||||
setScaler();
|
||||
|
||||
printf("Send HDMI parameters:\n");
|
||||
spi_uio_cmd_cont(UIO_SET_VIDEO);
|
||||
|
||||
@@ -62,7 +62,8 @@
|
||||
#define UIO_SETHEIGHT 0x27 // Set scaled vertical resolution (to reduce scaling artefacts)
|
||||
#define UIO_GETUARTFLG 0x28 // Get UART_FLG_*
|
||||
#define UIO_GET_STATUS 0x29 // Update status from the core
|
||||
#define UIO_SET_VIPCOEF 0x2A // Set Scaler coefficients
|
||||
#define UIO_SET_FLTCOEF 0x2A // Set Scaler polyphase coefficients
|
||||
#define UIO_SET_FLTNUM 0x2B // Set Scaler predefined filter
|
||||
|
||||
// codes as used by 8bit for file loading from OSD
|
||||
#define UIO_FILE_TX 0x53
|
||||
@@ -234,6 +235,11 @@ int hasAPI1_5();
|
||||
const char* get_rbf_dir();
|
||||
const char* get_rbf_name();
|
||||
|
||||
int user_io_get_scaler_flt();
|
||||
char* user_io_get_scaler_coeff();
|
||||
void user_io_set_scaler_flt(int n);
|
||||
void user_io_set_scaler_coeff(char *name);
|
||||
|
||||
#define HomeDir (is_minimig() ? "Amiga" : is_archie() ? "Archie" : user_io_get_core_name())
|
||||
|
||||
#endif // USER_IO_H
|
||||
|
||||
Reference in New Issue
Block a user