diff --git a/menu.cpp b/menu.cpp index 4f47257..3e221b5 100644 --- a/menu.cpp +++ b/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; diff --git a/support/x86/x86.cpp b/support/x86/x86.cpp index 356da26..768af3a 100644 --- a/support/x86/x86.cpp +++ b/support/x86/x86.cpp @@ -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]; diff --git a/support/x86/x86.h b/support/x86/x86.h index 0c06b14..ef1d0f5 100644 --- a/support/x86/x86.h +++ b/support/x86/x86.h @@ -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); diff --git a/user_io.cpp b/user_io.cpp index 0ca2f37..9c9d2c1 100644 --- a/user_io.cpp +++ b/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 = {}; diff --git a/user_io.h b/user_io.h index 822b595..de6dcc8 100644 --- a/user_io.h +++ b/user_io.h @@ -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();