diff --git a/menu.cpp b/menu.cpp index 3f47025..20b0ff5 100644 --- a/menu.cpp +++ b/menu.cpp @@ -174,6 +174,10 @@ enum MENU MENU_ARCHIE_MAIN1, MENU_ARCHIE_MAIN2, MENU_ARCHIE_MAIN_FILE_SELECTED, + + // MT32-pi + MENU_MT32PI_MAIN1, + MENU_MT32PI_MAIN2, }; static uint32_t menustate = MENU_NONE1; @@ -3441,7 +3445,7 @@ void HandleUI(void) case MENU_ST_MAIN1: OsdSetSize(16); - menumask = 0x3ff; + menumask = 0x77f; OsdSetTitle("AtariST", 0); m = 0; @@ -3465,11 +3469,18 @@ void HandleUI(void) OsdWrite(m++, " Save config \x16", menusub == 6); OsdWrite(m++); - OsdWrite(m++, " Reset", menusub == 7); - OsdWrite(m++, " Cold Boot", menusub == 8); + if (spi_uio_cmd16(UIO_GET_OSDMASK, 0) & 1) + { + menumask |= 0x80; + OsdWrite(m++, " MT32-pi \x16", menusub == 7); + OsdWrite(m++); + } + + OsdWrite(m++, " Reset", menusub == 8); + OsdWrite(m++, " Cold Boot", menusub == 9); for (; m < OsdGetSize()-1; m++) OsdWrite(m); - MenuWrite(15, STD_EXIT, menusub == 9, 0, OSD_ARROW_RIGHT | OSD_ARROW_LEFT); + MenuWrite(15, STD_EXIT, menusub == 10, 0, OSD_ARROW_RIGHT | OSD_ARROW_LEFT); menustate = MENU_ST_MAIN2; parentstate = MENU_ST_MAIN1; @@ -3552,7 +3563,15 @@ void HandleUI(void) } break; - case 7: // Reset + case 7: + if (select) + { + menustate = MENU_MT32PI_MAIN1; + menusub = 0; + } + break; + + case 8: // Reset if (select) { tos_reset(0); @@ -3560,7 +3579,7 @@ void HandleUI(void) } break; - case 8: // Cold Boot + case 9: // Cold Boot if (select) { tos_insert_disk(0, ""); @@ -3570,7 +3589,7 @@ void HandleUI(void) } break; - case 9: // Exit + case 10: // Exit if (select) { menustate = MENU_NONE1; @@ -3935,11 +3954,207 @@ void HandleUI(void) } break; + + case MENU_MT32PI_MAIN1: + { + parentstate = menustate; + OsdSetTitle("MT32-pi"); + menumask = 0x7F; + uint32_t mt32_cfg = is_minimig() ? minimig_get_extcfg() : tos_get_extctrl(); + + m = 0; + OsdWrite(m++); + strcpy(s, " Use MT32-pi: "); + strcat(s, (mt32_cfg & 0x2) ? " No" : "Yes"); + OsdWrite(m++, s, menusub == 0); + + strcpy(s, " Show Info: "); + switch ((mt32_cfg >> 8) & 3) + { + case 0: + strcat(s, " No"); + break; + + case 1: + strcat(s, " Yes"); + break; + + case 2: + strcat(s, " LCD-On(non-FB)"); + break; + + case 3: + strcat(s, "LCD-Auto(non-FB)"); + break; + } + OsdWrite(m++, s, menusub == 1); + + OsdWrite(m++); + OsdWrite(m++, " Default Config:"); + + strcpy(s, " Synth: "); + strcat(s, (mt32_cfg & 0x4) ? "FluidSynth" : " Munt"); + OsdWrite(m++, s, menusub == 2); + + strcpy(s, " Munt ROM: "); + switch ((mt32_cfg >> 3) & 3) + { + case 0: + strcat(s, "MT-32 v1"); + break; + + case 1: + strcat(s, "MT-32 v2"); + break; + + case 2: + strcat(s, " CM-32L"); + break; + + case 3: + strcat(s, " Unknown"); + break; + } + OsdWrite(m++, s, menusub == 3); + + sprintf(s, " SoundFont: %d", (mt32_cfg >> 5) & 7); + OsdWrite(m++, s, menusub == 4); + + OsdWrite(m++); + strcpy(s, " Current Config: "); + hdmask = spi_uio_cmd16(UIO_GET_OSDMASK, 0); + if (((hdmask >> 1) & 3) == 1) + { + switch ((hdmask >> 3) & 3) + { + case 0: + strcat(s, " MT-32 v1"); + break; + + case 1: + strcat(s, " MT-32 v2"); + break; + + case 2: + strcat(s, " CM-32L"); + break; + + default: + strcat(s, " Unknown"); + break; + } + } + else if (((hdmask >> 1) & 3) == 2) + { + sprintf(s + strlen(s), "SoundFont %d", (hdmask >> 3) & 7); + } + else + { + strcat(s, " Unknown"); + } + OsdWrite(m++, s); + + OsdWrite(m++); + OsdWrite(m++, " Reset Hanging Notes", menusub == 5); + + while (m < 15) OsdWrite(m++); + OsdWrite(15, STD_EXIT, menusub == 6, 0); + + menustate = MENU_MT32PI_MAIN2; + } + break; + + + case MENU_MT32PI_MAIN2: + if (menu || back || left) + { + if (is_minimig()) + { + menustate = MENU_MINIMIG_MAIN1; + menusub = 9; + } + else + { + menustate = MENU_ST_MAIN1; + menusub = 7; + } + } + else if (select || plus || minus) + { + uint16_t mt32_cfg = is_minimig() ? minimig_get_extcfg() : tos_get_extctrl(); + + switch (menusub) + { + case 0: + mt32_cfg ^= 0x2; + menustate = MENU_MT32PI_MAIN1; + break; + + case 1: + m = (mt32_cfg >> 8) & 3; + m = (m + (minus ? -1 : 1)) & 3; + mt32_cfg = (mt32_cfg & ~0x300) | (m<<8); + menustate = MENU_MT32PI_MAIN1; + break; + + case 2: + mt32_cfg ^= 0x4; + menustate = MENU_MT32PI_MAIN1; + break; + + case 3: + m = (mt32_cfg >> 3) & 3; + if (minus) + { + m = (m - 1) & 3; + if (m == 3) m = 2; + } + else + { + m = (m + 1) & 3; + if (m == 3) m = 0; + } + mt32_cfg = (mt32_cfg & ~0x18) | (m << 3); + menustate = MENU_MT32PI_MAIN1; + break; + + case 4: + m = (mt32_cfg >> 5) & 7; + m = (m + (minus ? -1 : 1)) & 7; + mt32_cfg = (mt32_cfg & ~0xE0) | (m << 5); + menustate = MENU_MT32PI_MAIN1; + break; + + case 5: + if (select) + { + if (is_minimig()) minimig_set_extcfg(mt32_cfg | 1); + else tos_set_extctrl(mt32_cfg | 1); + mt32_cfg &= ~1; + menustate = MENU_MT32PI_MAIN1; + } + break; + + case 6: + if (select) menustate = MENU_NONE1; + break; + } + + if (is_minimig()) minimig_set_extcfg(mt32_cfg); + else tos_set_extctrl(mt32_cfg); + } + else if (spi_uio_cmd16(UIO_GET_OSDMASK, 0) != hdmask) + { + menustate = MENU_MT32PI_MAIN1; + } + break; + + /******************************************************************/ /* minimig main menu */ /******************************************************************/ case MENU_MINIMIG_MAIN1: - menumask = 0x1FF0; // b01110000 Floppy turbo, Harddisk options & Exit. + menumask = 0x3DF0; // b01110000 Floppy turbo, Harddisk options & Exit. OsdSetTitle("Minimig", OSD_ARROW_RIGHT | OSD_ARROW_LEFT); helptext_idx = HELPTEXT_MAIN; @@ -4001,15 +4216,19 @@ void HandleUI(void) OsdWrite(m++, " CPU & Chipset \x16", menusub == 6, 0); OsdWrite(m++, " Memory \x16", menusub == 7, 0); OsdWrite(m++, " Audio & Video \x16", menusub == 8, 0); - OsdWrite(m++); - - OsdWrite(m++, " Save configuration \x16", menusub == 9, 0); - OsdWrite(m++, " Load configuration \x16", menusub == 10, 0); + //if (spi_uio_cmd16(UIO_GET_OSDMASK, 0) & 1) + { + menumask |= 0x200; + OsdWrite(m++, " MT32-pi \x16", menusub == 9); + } OsdWrite(m++); - OsdWrite(m++, " Reset", menusub == 11, 0); + OsdWrite(m++, " Save configuration \x16", menusub == 10, 0); + OsdWrite(m++, " Load configuration \x16", menusub == 11, 0); - OsdWrite(15, STD_EXIT, menusub == 12, 0); + while (m < 14) OsdWrite(m++); + OsdWrite(m++, " Reset", menusub == 12, 0); + OsdWrite(15, STD_EXIT, menusub == 13, 0); menustate = MENU_MINIMIG_MAIN2; parentstate = MENU_MINIMIG_MAIN1; @@ -4082,19 +4301,24 @@ void HandleUI(void) else if (menusub == 9) { menusub = 0; - menustate = MENU_MINIMIG_SAVECONFIG1; + menustate = MENU_MT32PI_MAIN1; } else if (menusub == 10) { menusub = 0; - menustate = MENU_MINIMIG_LOADCONFIG1; + menustate = MENU_MINIMIG_SAVECONFIG1; } else if (menusub == 11) + { + menusub = 0; + menustate = MENU_MINIMIG_LOADCONFIG1; + } + else if (menusub == 12) { menustate = MENU_NONE1; minimig_reset(); } - else if (menusub == 12) + else if (menusub == 13) { menustate = MENU_NONE1; } @@ -4186,13 +4410,13 @@ void HandleUI(void) else { menustate = MENU_MINIMIG_MAIN1; - menusub = 10; + menusub = 11; } } if (menu || left) // exit menu { menustate = MENU_MINIMIG_MAIN1; - menusub = 10; + menusub = 11; } break; @@ -4669,13 +4893,13 @@ void HandleUI(void) if (menusub<10) minimig_cfg_save(menusub); menustate = MENU_MINIMIG_MAIN1; - menusub = 9; + menusub = 10; } else if (menu || left) // exit menu { menustate = MENU_MINIMIG_MAIN1; - menusub = 9; + menusub = 10; } break; diff --git a/support/minimig/minimig_config.cpp b/support/minimig/minimig_config.cpp index 7b32e72..5a356ff 100644 --- a/support/minimig/minimig_config.cpp +++ b/support/minimig/minimig_config.cpp @@ -378,6 +378,7 @@ static void ApplyConfiguration(char reloadkickstart) minimig_ConfigVideo(minimig_config.scanlines); minimig_ConfigAudio(minimig_config.audio); minimig_ConfigAutofire(minimig_config.autofire, 0xC); + minimig_set_extcfg(minimig_config.ext_cfg & ~1); } int minimig_cfg_load(int num) @@ -704,3 +705,18 @@ void minimig_ConfigAutofire(unsigned char autofire, unsigned char mask) param = (param << 8) | autofire; spi_uio_cmd16(UIO_MM2_JOY, param); } + +void minimig_set_extcfg(unsigned short ext_cfg) +{ + minimig_config.ext_cfg = ext_cfg; + + spi_uio_cmd_cont(UIO_SET_STATUS2); + spi32_w(0); + spi32_w(ext_cfg); + DisableIO(); +} + +unsigned short minimig_get_extcfg() +{ + return minimig_config.ext_cfg; +} diff --git a/support/minimig/minimig_config.h b/support/minimig/minimig_config.h index e22621f..4ed83b6 100644 --- a/support/minimig/minimig_config.h +++ b/support/minimig/minimig_config.h @@ -44,7 +44,7 @@ typedef struct unsigned long version; char kickstart[992]; char label[32]; - mm_filterTYPE filter; + unsigned short ext_cfg; unsigned char memory; unsigned char chipset; mm_floppyTYPE floppy; @@ -78,4 +78,7 @@ void minimig_ConfigChipset(unsigned char chipset); void minimig_ConfigFloppy(unsigned char drives, unsigned char speed); void minimig_ConfigAutofire(unsigned char autofire, unsigned char mask); +void minimig_set_extcfg(unsigned short ext_cfg); +unsigned short minimig_get_extcfg(); + #endif diff --git a/support/st/st_tos.cpp b/support/st/st_tos.cpp index 027421f..68d6a3a 100644 --- a/support/st/st_tos.cpp +++ b/support/st/st_tos.cpp @@ -31,6 +31,8 @@ typedef struct { char acsi_img[2][1024]; char video_adjust[2]; char cdc_control_redirect; + char reserved; + uint32_t ext_ctrl; } tos_config_t; static tos_config_t config; @@ -68,6 +70,7 @@ static void set_control(uint32_t ctrl) spi_uio_cmd_cont(UIO_SET_STATUS2); spi32_w(ctrl); + spi32_w(config.ext_ctrl); DisableIO(); } @@ -77,6 +80,17 @@ void tos_update_sysctrl(uint32_t ctrl) set_control(config.system_ctrl); } +uint32_t tos_get_extctrl() +{ + return config.ext_ctrl; +} + +void tos_set_extctrl(uint32_t ext_ctrl) +{ + config.ext_ctrl = ext_ctrl; + set_control(config.system_ctrl); +} + unsigned long tos_system_ctrl() { return config.system_ctrl; @@ -603,7 +617,7 @@ void tos_config_load(int slot) name[7] = '0' + new_slot; int len = FileLoadConfig(name, 0, 0); tos_debugf("Configuration file size: %d (should be %d)", len, sizeof(tos_config_t)); - if (len == sizeof(tos_config_t)) FileLoadConfig(name, &config, sizeof(tos_config_t)); + FileLoadConfig(name, &config, sizeof(tos_config_t)); // ethernet is auto detected later config.system_ctrl &= ~TOS_CONTROL_ETHERNET; @@ -636,7 +650,7 @@ const char* tos_get_cfg_string(int num) memset(&tmp, 0, sizeof(tmp)); int len = FileLoadConfig(name, 0, 0); - if (len == sizeof(tos_config_t)) + if (len) { FileLoadConfig(name, &tmp, sizeof(tos_config_t)); diff --git a/support/st/st_tos.h b/support/st/st_tos.h index f09ddcf..4cf3b8c 100644 --- a/support/st/st_tos.h +++ b/support/st/st_tos.h @@ -60,8 +60,8 @@ // USB redirection modes // (NONE=0, RS232=1, PARALLEL=2, MIDI=3) -#define TOS_CONTROL_REDIR0 0x04000000 -#define TOS_CONTROL_REDIR1 0x08000000 +#define TOS_CONTROL_REDIR0 0x04000000 // unused +#define TOS_CONTROL_REDIR1 0x08000000 // unused #define TOS_CONTROL_VIKING 0x10000000 // Viking graphics card @@ -100,4 +100,7 @@ void tos_uart_mode(int enable); int tos_get_ar(); void tos_set_ar(int ar); +uint32_t tos_get_extctrl(); +void tos_set_extctrl(uint32_t ext_ctrl); + #endif diff --git a/user_io.cpp b/user_io.cpp index 4946e67..e4f7f34 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -992,16 +992,22 @@ void user_io_init(const char *path, const char *xml) OsdCoreNameSet(user_io_get_core_name()); uint32_t status[2] = { 0, 0 }; - if (!is_st()) + if (!is_st() && !is_minimig()) { printf("Loading config %s\n", name); if (FileLoadConfig(name, status, 8)) { printf("Found config: %08X-%08X\n", status[0], status[1]); - status[0] &= ~UIO_STATUS_RESET; - user_io_8bit_set_status(status[0], ~UIO_STATUS_RESET, 0); - user_io_8bit_set_status(status[1], 0xffffffff, 1); } + else + { + status[0] = 0; + status[1] = 0; + } + + status[0] &= ~UIO_STATUS_RESET; + user_io_8bit_set_status(status[0], ~UIO_STATUS_RESET, 0); + user_io_8bit_set_status(status[1], 0xffffffff, 1); parse_config(); } @@ -1025,6 +1031,7 @@ void user_io_init(const char *path, const char *xml) } else if (is_minimig()) { + parse_config(); puts("Identified Minimig V2 core"); BootInit(); }