From 62375504aac95d110defdcedab12c608c979d1f1 Mon Sep 17 00:00:00 2001 From: Sorgelig Date: Fri, 7 Oct 2022 23:54:43 +0800 Subject: [PATCH] atarist: update cartridge support. --- menu.cpp | 104 +++++++++++++++++++++--------------------- support/st/st_tos.cpp | 48 +++++++++++-------- user_io.cpp | 1 + 3 files changed, 82 insertions(+), 71 deletions(-) diff --git a/menu.cpp b/menu.cpp index 3534b2e..0e03204 100644 --- a/menu.cpp +++ b/menu.cpp @@ -3943,12 +3943,11 @@ void HandleUI(void) case MENU_ST_MAIN1: OsdSetSize(16); - menumask = 0x77f; + menumask = 0xeff; OsdSetTitle("AtariST", 0); firstmenu = 0; m = 0; - OsdWrite(m++); for (uint32_t i = 0; i < 2; i++) { snprintf(s, 29, " %c: %s%s", 'A' + i, (tos_system_ctrl() & (TOS_CONTROL_FDC_WR_PROT_A << i)) ? "\x17" : "", tos_get_disk_name(i)); @@ -3959,27 +3958,30 @@ void HandleUI(void) OsdWrite(m++, s, menusub == 2, 0); OsdWrite(m++); + snprintf(s, 29, " Cart: %s", tos_get_cartridge_name()); + MenuWrite(m++, s, menusub == 3, !!(tos_system_ctrl() & TOS_CONTROL_DONGLE)); + MenuWrite(m++); + snprintf(s, 29, " Joysticks swap: %s", user_io_get_joyswap() ? "Yes" : "No"); - OsdWrite(m++, s, menusub == 3); + OsdWrite(m++, s, menusub == 4); OsdWrite(m++); - OsdWrite(m++, " Modify config \x16", menusub == 4); - OsdWrite(m++, " Load config \x16", menusub == 5); - OsdWrite(m++, " Save config \x16", menusub == 6); - OsdWrite(m++); + OsdWrite(m++, " Modify config \x16", menusub == 5); + OsdWrite(m++, " Load config \x16", menusub == 6); + OsdWrite(m++, " Save config \x16", menusub == 7); if (spi_uio_cmd16(UIO_GET_OSDMASK, 0) & 1) { - menumask |= 0x80; - OsdWrite(m++, " MT32-pi \x16", menusub == 7); - OsdWrite(m++); + menumask |= 0x100; + OsdWrite(m++, " MT32-pi \x16", menusub == 8); } - OsdWrite(m++, " Reset", menusub == 8); - OsdWrite(m++, " Cold Boot", menusub == 9); + OsdWrite(m++); + OsdWrite(m++, " Reset", menusub == 9); + OsdWrite(m++, " Cold Boot", menusub == 10); for (; m < OsdGetSize()-1; m++) OsdWrite(m); - OsdWrite(15, STD_EXIT, menusub == 10, 0, OSD_ARROW_RIGHT | OSD_ARROW_LEFT); + OsdWrite(15, STD_EXIT, menusub == 11, 0, OSD_ARROW_RIGHT | OSD_ARROW_LEFT); menustate = MENU_ST_MAIN2; parentstate = MENU_ST_MAIN1; @@ -4030,6 +4032,26 @@ void HandleUI(void) break; case 3: + if (!(tos_system_ctrl() & TOS_CONTROL_DONGLE)) + { + if (tos_cartridge_is_inserted()) + { + tos_load_cartridge(""); + menustate = MENU_ST_MAIN1; + } + else + { + fs_Options = SCANO_DIR; + fs_MenuSelect = MENU_ST_SYSTEM_FILE_SELECTED; + fs_MenuCancel = MENU_ST_MAIN1; + strcpy(fs_pFileExt, "STC"); + if (select) SelectFile(Selected_F[menusub], fs_pFileExt, fs_Options, fs_MenuSelect, fs_MenuCancel); + else if (recent_init(menusub)) menustate = MENU_RECENT1; + } + } + break; + + case 4: if (select) { user_io_set_joyswap(!user_io_get_joyswap()); @@ -4037,7 +4059,7 @@ void HandleUI(void) } break; - case 4: // System submenu + case 5: // System submenu if (select) { menustate = MENU_ST_SYSTEM1; @@ -4046,7 +4068,7 @@ void HandleUI(void) } break; - case 5: // Load config + case 6: // Load config if (select) { menustate = MENU_ST_LOAD_CONFIG1; @@ -4054,7 +4076,7 @@ void HandleUI(void) } break; - case 6: // Save config + case 7: // Save config if (select) { menustate = MENU_ST_SAVE_CONFIG1; @@ -4062,7 +4084,7 @@ void HandleUI(void) } break; - case 7: + case 8: if (select) { menustate = MENU_MT32PI_MAIN1; @@ -4070,7 +4092,7 @@ void HandleUI(void) } break; - case 8: // Reset + case 9: // Reset if (select) { tos_reset(0); @@ -4078,7 +4100,7 @@ void HandleUI(void) } break; - case 9: // Cold Boot + case 10: // Cold Boot if (select) { tos_insert_disk(0, ""); @@ -4088,7 +4110,7 @@ void HandleUI(void) } break; - case 10: // Exit + case 11: // Exit if (select) { menustate = MENU_NONE1; @@ -4106,7 +4128,7 @@ void HandleUI(void) break; case MENU_ST_SYSTEM1: - menumask = 0x1ffff; + menumask = 0x1fffb; OsdSetTitle("Config", 0); helptext_idx = 0; @@ -4123,10 +4145,6 @@ void HandleUI(void) } MenuWrite(m++); - snprintf(s, 29, " Cart: %s", tos_get_cartridge_name()); - MenuWrite(m++, s, menusub == 2); - MenuWrite(m++); - strcpy(s, " Memory: "); strcat(s, tos_mem[(tos_system_ctrl() >> 1) & 7]); MenuWrite(m++, s, menusub == 3); @@ -4211,7 +4229,7 @@ void HandleUI(void) else if (back || left) { menustate = MENU_ST_MAIN1; - menusub = 4; + menusub = 5; if (need_reset) { tos_reset(1); @@ -4229,24 +4247,6 @@ void HandleUI(void) if (select) SelectFile(Selected_S[menusub], "VHD", fs_Options, fs_MenuSelect, fs_MenuCancel); else if (recent_init(menusub + 500)) menustate = MENU_RECENT1; } - else - { - if (tos_cartridge_is_inserted()) - { - tos_load_cartridge(""); - menustate = MENU_ST_SYSTEM1; - } - else - { - fs_Options = SCANO_DIR; - fs_MenuSelect = MENU_ST_SYSTEM_FILE_SELECTED; - fs_MenuCancel = MENU_ST_SYSTEM1; - strcpy(fs_pFileExt, "IMG"); - if (select) SelectFile(Selected_F[menusub], "IMG", fs_Options, fs_MenuSelect, fs_MenuCancel); - else if (recent_init(menusub)) menustate = MENU_RECENT1; - } - } - } else if (select || plus || minus) { @@ -4362,7 +4362,7 @@ void HandleUI(void) case 16: menustate = MENU_ST_MAIN1; - menusub = 4; + menusub = 5; if (need_reset) { tos_reset(1); @@ -4389,12 +4389,12 @@ void HandleUI(void) menustate = MENU_ST_SYSTEM1; } - if (menusub == 2) + if (menusub == 3) { memcpy(Selected_F[menusub], selPath, sizeof(Selected_F[menusub])); recent_update(SelectedDir, selPath, SelectedLabel, menusub); tos_load_cartridge(selPath); - menustate = MENU_ST_SYSTEM1; + menustate = MENU_ST_MAIN1; } break; @@ -4433,7 +4433,7 @@ void HandleUI(void) if (menu || left) { menustate = MENU_ST_MAIN1; - menusub = 5; + menusub = 6; } if (select) @@ -4447,7 +4447,7 @@ void HandleUI(void) else { menustate = MENU_ST_MAIN1; - menusub = 5; + menusub = 6; } } break; @@ -4483,7 +4483,7 @@ void HandleUI(void) if (menu || left) { menustate = MENU_ST_MAIN1; - menusub = 6; + menusub = 7; } if (select) @@ -4496,7 +4496,7 @@ void HandleUI(void) else { menustate = MENU_ST_MAIN1; - menusub = 6; + menusub = 7; } } break; @@ -4623,7 +4623,7 @@ void HandleUI(void) else { menustate = MENU_ST_MAIN1; - menusub = 7; + menusub = 8; } } else if (select || plus || minus) diff --git a/support/st/st_tos.cpp b/support/st/st_tos.cpp index d4fe352..e53722e 100644 --- a/support/st/st_tos.cpp +++ b/support/st/st_tos.cpp @@ -404,27 +404,38 @@ static void fill_tx(uint16_t fill, uint32_t len, int index) user_io_set_download(0); } +static char tos_cart_img[1024] = {}; void tos_load_cartridge(const char *name) { - if (name) strncpy(config.cart_img, name, 11); - - // erase that ram area to remove any previously uploaded - // image - tos_debugf("Erasing cart memory"); - fill_tx(0xff, 128 * 1024, 2); - - // upload cartridge - if (config.cart_img[0] && FileExists(config.cart_img)) + if (name) { - user_io_file_tx(config.cart_img, 2); - tos_debugf("%s uploaded", config.cart_img); - return; + strncpy(tos_cart_img, name, 1023); + } + else + { + tos_debugf("Set cartridge: %s\n", tos_cart_img); + + const int sz = (128 * 1024) + 4; + uint8_t *buf = new uint8_t[sz]; + if (buf) + { + memset(buf, -1, sz); + if (!(config.system_ctrl & TOS_CONTROL_DONGLE)) FileLoad(tos_cart_img, buf, sz); + + user_io_set_index(2); + user_io_set_download(1); + user_io_file_tx_data(buf + 4, sz - 4); + DisableFpga(); + + user_io_set_download(0); + delete buf; + } } } char tos_cartridge_is_inserted() { - return config.cart_img[0]; + return tos_cart_img[0]; } void tos_poll() @@ -479,9 +490,9 @@ const char *tos_get_image_name() const char *tos_get_cartridge_name() { - if (!config.cart_img[0]) return "* no cartridge *"; - char *p = strrchr(config.cart_img, '/'); - return p ? p + 1 : config.cart_img; + if (!tos_cart_img[0]) return "* no cartridge *"; + char *p = strrchr(tos_cart_img, '/'); + return p ? p + 1 : tos_cart_img; } char tos_disk_is_inserted(int index) @@ -567,8 +578,6 @@ void tos_reset(char cold) return; } - tos_load_cartridge(NULL); - for (int i = 0; i < 2; i++) { if (FileExists(config.acsi_img[i])) @@ -577,6 +586,7 @@ void tos_reset(char cold) } } } + tos_load_cartridge(NULL); tos_update_sysctrl(config.system_ctrl & ~TOS_CONTROL_CPU_RESET); // release reset } @@ -647,7 +657,7 @@ const char* tos_get_cfg_string(int num) strcat(str, " "); if (tmp.acsi_img[0][0]) strcat(str, "H0 "); if (tmp.acsi_img[1][0]) strcat(str, "H1 "); - if (tmp.cart_img[0]) strcat(str, "CR "); + //if (tmp.cart_img[0]) strcat(str, "CR "); strcat(str, tos_chipset_short[(tmp.system_ctrl >> 23) & 3]); strcat(str, " "); if (!((tmp.system_ctrl >> 23) & 3) && (tmp.system_ctrl & TOS_CONTROL_BLITTER)) strcat(str, "B "); diff --git a/user_io.cpp b/user_io.cpp index 836efb0..a5343c9 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -2735,6 +2735,7 @@ void user_io_send_buttons(char force) if (is_saturn()) saturn_reset(); if (is_x86()) x86_init(); if (is_pcxt()) pcxt_init(); + if (is_st()) tos_reset(0); ResetUART(); }