New config options for UART and Save States.
This commit is contained in:
119
menu.cpp
119
menu.cpp
@@ -199,7 +199,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", " Midilink" };
|
||||
const char *config_midilink_msg[] = { " MIDI Local", "MIDI Remote", " MFP UART", "" };
|
||||
const char *config_uart_baud[] = { "110", "300", "600", "1200", "2400", "9600", "14400", "19200", "31250/MIDI", "38400", "57600", "115200"};
|
||||
//const char *config_uart_baud[] = { "110", "300", "600", "1200", "2400", "9600", "14400", "19200", "31250/MIDI", "38400", "57600", "115200"};
|
||||
const char *config_scaler_msg[] = { "Internal","Custom" };
|
||||
const char *config_afilter_msg[] = { "Internal","Custom" };
|
||||
const char *config_gamma_msg[] = { "Off","On" };
|
||||
@@ -1870,12 +1870,11 @@ void HandleUI(void)
|
||||
else
|
||||
{
|
||||
static char ext[256];
|
||||
p = user_io_get_confstr(1);
|
||||
|
||||
int h = 0, d = 0, inpage = !page;
|
||||
uint32_t entry = 0;
|
||||
int i = 1;
|
||||
int i = 2;
|
||||
|
||||
p = 0;
|
||||
addon[0] = 0;
|
||||
|
||||
while (1)
|
||||
@@ -1931,7 +1930,7 @@ void HandleUI(void)
|
||||
if (p[0] == 'F' || p[0] == 'S') addon[0] = 0;
|
||||
}
|
||||
|
||||
if (!d)
|
||||
if (p && !d)
|
||||
{
|
||||
if (p[0] == 'F' && (select || recent))
|
||||
{
|
||||
@@ -2651,7 +2650,7 @@ void HandleUI(void)
|
||||
helptext_idx = 0;
|
||||
menumask = 0xFF;
|
||||
|
||||
OsdSetTitle("UART mode");
|
||||
OsdSetTitle("UART Mode");
|
||||
menustate = MENU_UART2;
|
||||
parentstate = MENU_UART1;
|
||||
|
||||
@@ -2659,12 +2658,13 @@ void HandleUI(void)
|
||||
int hasmidi = !stat("/dev/midi1", &filestat);
|
||||
int mode = GetUARTMode();
|
||||
int midilink = GetMidiLinkMode();
|
||||
int m = (mode != 3 && mode != 4) || hasmidi;
|
||||
int dis = (mode != 3 && mode != 4) || hasmidi;
|
||||
|
||||
OsdWrite(0);
|
||||
m = 0;
|
||||
OsdWrite(m++);
|
||||
sprintf(s, " Connection: %s", config_uart_msg[(is_st() && mode ==3) ? 4 : mode]);
|
||||
OsdWrite(1, s, menusub == 0, 0);
|
||||
OsdWrite(2);
|
||||
OsdWrite(m++, s, menusub == 0, 0);
|
||||
OsdWrite(m++);
|
||||
|
||||
if (is_st())
|
||||
{
|
||||
@@ -2674,18 +2674,24 @@ void HandleUI(void)
|
||||
{
|
||||
sprintf(s, " MidiLink: %s", (midilink & 2) ? "Remote" : " Local");
|
||||
}
|
||||
OsdWrite(3, s, menusub == 1, m);
|
||||
OsdWrite(m++, s, menusub == 1, dis);
|
||||
sprintf(s, " Type: %s", (midilink & 6) ? ((midilink & 1) ? " UDP" : " TCP") : ((midilink & 1) ? " MUNT" : "FluidSynth"));
|
||||
OsdWrite(4, s, menusub == 2, m);
|
||||
OsdWrite(m++, s, menusub == 2, dis);
|
||||
|
||||
OsdWrite(5);
|
||||
OsdWrite(6, " Change Soundfont \x16", menusub == 3, mode==3&&midilink==0?0:1);
|
||||
OsdWrite(7, " Change UART BAUD \x16", menusub == 4, mode==3?0:1);
|
||||
OsdWrite(8, " Reset UART connection", menusub == 5, mode?0:1);
|
||||
OsdWrite(9);
|
||||
OsdWrite(10, " Save", menusub == 6);
|
||||
OsdWrite(m++);
|
||||
OsdWrite(m++, " Change Soundfont \x16", menusub == 3, mode != 3 || midilink);
|
||||
OsdWrite(m++);
|
||||
|
||||
for (int i = 11; i < 15; i++) OsdWrite(i);
|
||||
strcpy(s, " Baud \x16");
|
||||
sprintf(s + 6, "(%s)", GetUARTbaud_label(GetUARTMode()));
|
||||
s[strlen(s)] = ' ';
|
||||
OsdWrite(m++, s, menusub == 4, !mode);
|
||||
|
||||
OsdWrite(m++, " Reset UART connection", menusub == 5, mode?0:1);
|
||||
OsdWrite(m++);
|
||||
OsdWrite(m++, " Save", menusub == 6);
|
||||
|
||||
for (; m < 15; m++) OsdWrite(m);
|
||||
OsdWrite(15, STD_EXIT, menusub == 7);
|
||||
}
|
||||
break;
|
||||
@@ -2752,10 +2758,11 @@ void HandleUI(void)
|
||||
case 4:
|
||||
if (select)
|
||||
{
|
||||
if(GetUARTMode() == 3)
|
||||
if(GetUARTMode())
|
||||
{
|
||||
menusub = 0;
|
||||
menustate = MENU_BAUD1;
|
||||
menusub = GetUARTbaud_idx(GetUARTMode());
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2773,6 +2780,10 @@ void HandleUI(void)
|
||||
int mode = GetUARTMode() | (GetMidiLinkMode() << 8);
|
||||
sprintf(s, "uartmode.%s", user_io_get_core_name_ex());
|
||||
FileSaveConfig(s, &mode, 4);
|
||||
uint64_t speeds = GetUARTbaud(3);
|
||||
speeds = (speeds << 32) | GetUARTbaud(1);
|
||||
sprintf(s, "uartspeed.%s", user_io_get_core_name_ex());
|
||||
FileSaveConfig(s, &speeds, 8);
|
||||
menustate = MENU_COMMON1;
|
||||
menusub = 4;
|
||||
}
|
||||
@@ -2799,22 +2810,37 @@ void HandleUI(void)
|
||||
case MENU_BAUD1:
|
||||
{
|
||||
helptext_idx = 0;
|
||||
menumask = 0x1FFF;
|
||||
OsdSetTitle("UART BAUD");
|
||||
OsdSetTitle("UART Baud Rate");
|
||||
menustate = MENU_BAUD2;
|
||||
parentstate = MENU_BAUD1;
|
||||
unsigned int max = sizeof(config_uart_baud) / 4 -1;
|
||||
for (unsigned int i = 0; i < 15; i++)
|
||||
|
||||
m = 0;
|
||||
menumask = 0;
|
||||
int mode = GetUARTMode();
|
||||
uint32_t *bauds = GetUARTbauds(mode);
|
||||
for (uint32_t i = 0; i < 10; i++)
|
||||
{
|
||||
if (i <= max)
|
||||
{
|
||||
sprintf(s, " %s", config_uart_baud[i]);
|
||||
OsdWrite(i, s, menusub == i, 0);
|
||||
}
|
||||
else
|
||||
OsdWrite(i);
|
||||
if (!bauds[i]) break;
|
||||
menumask |= 1 << i;
|
||||
m = i;
|
||||
}
|
||||
OsdWrite(15, STD_EXIT, menusub == max + 1);
|
||||
|
||||
uint32_t start = (16 - m)/2;
|
||||
uint32_t k = 0;
|
||||
while (k < start) OsdWrite(k++);
|
||||
|
||||
for (uint32_t i = 0; i < 10; i++)
|
||||
{
|
||||
if (!bauds[i]) break;
|
||||
|
||||
sprintf(s, " %s", GetUARTbaud_label(mode, i));
|
||||
OsdWrite(k++, s, menusub == i, 0);
|
||||
}
|
||||
|
||||
while (k < 15) OsdWrite(k++);
|
||||
m++;
|
||||
menumask |= 1 << m;
|
||||
OsdWrite(15, STD_EXIT, menusub == m);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2826,18 +2852,27 @@ void HandleUI(void)
|
||||
menusub = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (select)
|
||||
else if (select)
|
||||
{
|
||||
unsigned int max = sizeof(config_uart_baud) / 4 - 1;
|
||||
if(menusub <= max)
|
||||
uint32_t *bauds = GetUARTbauds(GetUARTMode());
|
||||
for (uint32_t i = 0; i < 10; i++)
|
||||
{
|
||||
char baudStr[20];
|
||||
strcpy(baudStr, config_uart_baud[menusub]);
|
||||
char * tmp = strchr(baudStr, '/');
|
||||
if(tmp) *tmp = 0x00; //Remove "/MIDI"
|
||||
sprintf(s, "/sbin/mlinkutil BAUD %s", baudStr);
|
||||
system(s);
|
||||
if (!bauds[i]) break;
|
||||
if (menusub == i)
|
||||
{
|
||||
ValidateUARTbaud(GetUARTMode(), bauds[i]);
|
||||
if (GetUARTMode() >= 3)
|
||||
{
|
||||
sprintf(s, "/sbin/mlinkutil BAUD %d", GetUARTbaud(GetUARTMode()));
|
||||
system(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
int mode = GetUARTMode();
|
||||
SetUARTMode(0);
|
||||
SetUARTMode(mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
menusub = 4;
|
||||
menustate = MENU_UART1;
|
||||
|
||||
@@ -816,11 +816,6 @@ void x86_set_fdd_boot(uint32_t boot)
|
||||
boot_from_floppy = (boot != 0);
|
||||
}
|
||||
|
||||
void x86_set_uart_mode(int mode)
|
||||
{
|
||||
dma_sdio(mode ? 0x40 : 0x80);
|
||||
}
|
||||
|
||||
const char* x86_get_image_name(int num)
|
||||
{
|
||||
static char res[32];
|
||||
|
||||
@@ -11,7 +11,6 @@ const char* x86_get_image_path(int num);
|
||||
void x86_config_load();
|
||||
void x86_config_save();
|
||||
void x86_set_fdd_boot(uint32_t boot);
|
||||
void x86_set_uart_mode(int mode);
|
||||
|
||||
void x86_dma_set(uint32_t address, uint32_t data);
|
||||
void x86_dma_sendbuf(uint32_t address, uint32_t length, uint32_t *data);
|
||||
|
||||
212
user_io.cpp
212
user_io.cpp
@@ -398,6 +398,12 @@ int user_io_get_joy_transl()
|
||||
}
|
||||
|
||||
static int use_cheats = 0;
|
||||
static uint32_t ss_base = 0;
|
||||
static uint32_t ss_size = 0;
|
||||
static uint32_t uart_speeds[10] = {};
|
||||
static char uart_speed_labels[10][32] = {};
|
||||
static uint32_t midi_speeds[10] = {};
|
||||
static char midi_speed_labels[10][32] = {};
|
||||
|
||||
static void parse_config()
|
||||
{
|
||||
@@ -415,6 +421,112 @@ static void parse_config()
|
||||
OsdCoreNameSet(p);
|
||||
}
|
||||
|
||||
if (i == 1 && p)
|
||||
{
|
||||
while (p && *p)
|
||||
{
|
||||
if (!strncasecmp(p, "SS", 2))
|
||||
{
|
||||
char *end = 0;
|
||||
ss_base = strtoul(p+2, &end, 16);
|
||||
p = end;
|
||||
if (p && *p == ':')
|
||||
{
|
||||
p++;
|
||||
ss_size = strtoul(p, &end, 16);
|
||||
}
|
||||
|
||||
printf("Got save state parameters: base=0x%X, size=0x%X\n", ss_base, ss_size);
|
||||
|
||||
if (!ss_size || ss_size > (128 * 1024 * 1024))
|
||||
{
|
||||
ss_size = 0;
|
||||
ss_base = 0;
|
||||
printf("Invalid size!\n");
|
||||
}
|
||||
else if (ss_base < 0x20000000 || ss_base >= 0x40000000 || (ss_base + ss_size) >= 0x40000000)
|
||||
{
|
||||
ss_size = 0;
|
||||
ss_base = 0;
|
||||
printf("Invalid base!\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (!strncasecmp(p, "UART", 4))
|
||||
{
|
||||
p += 4;
|
||||
for (int i = 0; i < 10 && p && *p; i++)
|
||||
{
|
||||
char *end = 0;
|
||||
uart_speeds[i] = strtoul(p, &end, 10);
|
||||
p = end;
|
||||
if (p && *p == '(')
|
||||
{
|
||||
p++;
|
||||
int n = 0;
|
||||
while (*p != ';' && *p != ':' && *p != ')' && *p != ',')
|
||||
{
|
||||
if (n < 16) uart_speed_labels[i][n] = *p;
|
||||
p++;
|
||||
n++;
|
||||
}
|
||||
if (*p == ')') p++;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(uart_speed_labels[i], "%d", uart_speeds[i]);
|
||||
}
|
||||
if (p && *p == ':') p++;
|
||||
}
|
||||
|
||||
printf("Got UART speeds:");
|
||||
for(int i=0; i<10; i++) printf(" %d", uart_speeds[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (!strncasecmp(p, "MIDI", 4))
|
||||
{
|
||||
p += 4;
|
||||
for (int i = 0; i < 10 && p && *p; i++)
|
||||
{
|
||||
char *end = 0;
|
||||
midi_speeds[i] = strtoul(p, &end, 10);
|
||||
p = end;
|
||||
if (p && *p == '(')
|
||||
{
|
||||
p++;
|
||||
int n = 0;
|
||||
while (*p != ';' && *p != ':' && *p != ')' && *p != ',')
|
||||
{
|
||||
if (n < 16) midi_speed_labels[i][n] = *p;
|
||||
p++;
|
||||
n++;
|
||||
}
|
||||
if (*p == ')') p++;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(midi_speed_labels[i], "%d", midi_speeds[i]);
|
||||
}
|
||||
if (p && *p == ':') p++;
|
||||
}
|
||||
|
||||
if (!midi_speeds[0])
|
||||
{
|
||||
midi_speeds[0] = 31250;
|
||||
strcpy(midi_speed_labels[0], "31250");
|
||||
}
|
||||
|
||||
printf("Got MIDI speeds:");
|
||||
for (int i = 0; i < 10; i++) printf(" %d", midi_speeds[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
p = strchr(p, ',');
|
||||
if (p) p++;
|
||||
}
|
||||
}
|
||||
|
||||
if (i>=2 && p && p[0])
|
||||
{
|
||||
//skip Disable/Hide masks
|
||||
@@ -470,6 +582,13 @@ static void parse_config()
|
||||
}
|
||||
i++;
|
||||
} while (p || i<3);
|
||||
|
||||
// legacy GBA versions
|
||||
if (is_gba() && !ss_base)
|
||||
{
|
||||
ss_base = 0x3E000000;
|
||||
ss_size = 0x100000;
|
||||
}
|
||||
}
|
||||
|
||||
//MSM6242B layout
|
||||
@@ -569,12 +688,19 @@ int GetUARTMode()
|
||||
void SetUARTMode(int mode)
|
||||
{
|
||||
mode &= 0xFF;
|
||||
spi_uio_cmd8(UIO_SET_UART, mode);
|
||||
uint32_t baud = GetUARTbaud(mode);
|
||||
|
||||
if (is_x86()) x86_set_uart_mode(mode != 3 || GetMidiLinkMode() >= 2);
|
||||
spi_uio_cmd_cont(UIO_SET_UART);
|
||||
spi_w(mode);
|
||||
spi_w(baud);
|
||||
spi_w(baud>>16);
|
||||
DisableIO();
|
||||
|
||||
MakeFile("/tmp/CORENAME", user_io_get_core_name_ex());
|
||||
MakeFile("/tmp/UART_SPEED", is_st() ? "19200" : (is_x86() && (user_io_8bit_set_status(0, 0, 0) & (1 << 10))) ? "4000000" : "115200");
|
||||
|
||||
char data[20];
|
||||
sprintf(data, "%d", baud);
|
||||
MakeFile("/tmp/UART_SPEED", data);
|
||||
|
||||
char cmd[32];
|
||||
sprintf(cmd, "uartmode %d", mode);
|
||||
@@ -582,6 +708,54 @@ void SetUARTMode(int mode)
|
||||
set_uart_alt();
|
||||
}
|
||||
|
||||
static int uart_speed_idx = 0;
|
||||
static int midi_speed_idx = 0;
|
||||
|
||||
uint32_t* GetUARTbauds(int mode)
|
||||
{
|
||||
return (mode >= 3) ? midi_speeds : uart_speeds;
|
||||
}
|
||||
|
||||
uint32_t GetUARTbaud(int mode)
|
||||
{
|
||||
return (mode >= 3) ? midi_speeds[midi_speed_idx] : uart_speeds[uart_speed_idx];
|
||||
}
|
||||
|
||||
char* GetUARTbaud_label(int mode)
|
||||
{
|
||||
return (mode >= 3) ? midi_speed_labels[midi_speed_idx] : uart_speed_labels[uart_speed_idx];
|
||||
}
|
||||
|
||||
char* GetUARTbaud_label(int mode, int idx)
|
||||
{
|
||||
return (mode >= 3) ? midi_speed_labels[idx] : uart_speed_labels[idx];
|
||||
}
|
||||
|
||||
int GetUARTbaud_idx(int mode)
|
||||
{
|
||||
return (mode >= 3) ? midi_speed_idx : uart_speed_idx;
|
||||
}
|
||||
|
||||
uint32_t ValidateUARTbaud(int mode, uint32_t baud)
|
||||
{
|
||||
uint32_t *bauds = GetUARTbauds(mode);
|
||||
int idx = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if (!bauds[i]) break;
|
||||
if (bauds[i] == baud)
|
||||
{
|
||||
idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mode >= 3) midi_speed_idx = idx;
|
||||
else uart_speed_idx = idx;
|
||||
|
||||
return bauds[idx];
|
||||
}
|
||||
|
||||
int GetMidiLinkMode()
|
||||
{
|
||||
struct stat filestat;
|
||||
@@ -964,12 +1138,33 @@ void user_io_init(const char *path, const char *xml)
|
||||
|
||||
OsdRotation((cfg.osd_rotate == 1) ? 3 : (cfg.osd_rotate == 2) ? 1 : 0);
|
||||
|
||||
uart_mode = spi_uio_cmd16(UIO_GETUARTFLG, 0);
|
||||
uart_mode = spi_uio_cmd16(UIO_GETUARTFLG, 0) || uart_speeds[0];
|
||||
uint32_t mode = 0;
|
||||
if (uart_mode)
|
||||
{
|
||||
if (!uart_speeds[0])
|
||||
{
|
||||
uart_speeds[0] = is_st() ? 19200 : 115200;
|
||||
sprintf(uart_speed_labels[0], "%d", uart_speeds[0]);
|
||||
|
||||
if (!midi_speeds[0])
|
||||
{
|
||||
midi_speeds[0] = 31250;
|
||||
sprintf(midi_speed_labels[0], "%d", midi_speeds[0]);
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(mainpath, "uartmode.%s", user_io_get_core_name_ex());
|
||||
FileLoadConfig(mainpath, &mode, 4);
|
||||
|
||||
uint64_t speeds = 0;
|
||||
sprintf(mainpath, "uartspeed.%s", user_io_get_core_name_ex());
|
||||
FileLoadConfig(mainpath, &speeds, 8);
|
||||
|
||||
ValidateUARTbaud(1, speeds & 0xFFFFFFFF);
|
||||
ValidateUARTbaud(3, speeds >> 32);
|
||||
|
||||
printf("UART bauds: %d/%d\n", GetUARTbaud(1), GetUARTbaud(3));
|
||||
}
|
||||
|
||||
SetUARTMode(0);
|
||||
@@ -1668,7 +1863,9 @@ static int process_ss(const char *rom_name)
|
||||
static uint32_t ss_cnt = 0;
|
||||
static int memfd = -1;
|
||||
|
||||
uint32_t map_addr = 0x3E000000;
|
||||
if (!ss_base) return 0;
|
||||
|
||||
uint32_t map_addr = ss_base;
|
||||
|
||||
if (rom_name)
|
||||
{
|
||||
@@ -1685,7 +1882,7 @@ static int process_ss(const char *rom_name)
|
||||
}
|
||||
|
||||
ss_cnt = 0;
|
||||
uint32_t len = 1024 * 1024;
|
||||
uint32_t len = ss_size;
|
||||
uint32_t clr_addr = map_addr;
|
||||
|
||||
for (int i = 0; i < 16; i++)
|
||||
@@ -1964,11 +2161,10 @@ int user_io_file_tx(const char* name, unsigned char index, char opensave, char m
|
||||
int progress = -1;
|
||||
if (use_progress) MenuHide();
|
||||
|
||||
if(ss_base) process_ss(name);
|
||||
|
||||
if (is_gba())
|
||||
{
|
||||
process_ss(name);
|
||||
|
||||
if ((index >> 6) == 1 || (index >> 6) == 2)
|
||||
{
|
||||
fileTYPE fg = {};
|
||||
|
||||
@@ -252,6 +252,12 @@ void SetUARTMode(int mode);
|
||||
int GetMidiLinkMode();
|
||||
void SetMidiLinkMode(int mode);
|
||||
void ResetUART();
|
||||
uint32_t* GetUARTbauds(int mode);
|
||||
uint32_t GetUARTbaud(int mode);
|
||||
char* GetUARTbaud_label(int mode);
|
||||
char* GetUARTbaud_label(int mode, int idx);
|
||||
int GetUARTbaud_idx(int mode);
|
||||
uint32_t ValidateUARTbaud(int mode, uint32_t baud);
|
||||
|
||||
void user_io_store_filename(char *filename);
|
||||
int user_io_use_cheats();
|
||||
|
||||
Reference in New Issue
Block a user