AtariST: show config in load/save dialog.

This commit is contained in:
sorgelig
2020-04-22 00:21:24 +08:00
parent 78fc2489d5
commit 21f69d1d3c
3 changed files with 103 additions and 55 deletions

View File

@@ -179,9 +179,7 @@ static uint32_t menu_timer = 0;
extern const char *version;
const char *config_tos_mem[] = { "512 kB", "1 MB", "2 MB", "4 MB", "8 MB", "14 MB", "--", "--" };
const char *config_tos_wrprot[] = { "None", "A:", "B:", "A: and B:" };
const char *config_tos_usb[] = { "none", "control", "debug", "serial", "parallel", "midi" };
const char *config_scanlines_msg[] = { "Off", "HQ2x", "CRT 25%" , "CRT 50%" , "CRT 75%" };
const char *config_ar_msg[] = { "4:3", "16:9" };
@@ -228,10 +226,6 @@ static const char *info_bottom = "\x85\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x
static const char* HELPTEXT_SPACER = " ";
static char helptext_custom[1024];
const char* scanlines[] = { "Off","25%","50%","75%" };
const char* stereo[] = { "Mono","Stereo" };
const char* atari_chipset[] = { "ST","STE","MegaSTE","STEroids" };
// file selection menu variables
static char fs_pFileExt[13] = "xxx";
static uint32_t fs_ExtLen = 0;
@@ -2906,7 +2900,7 @@ void HandleUI(void)
OsdWrite(m++);
strcpy(s, " Memory: ");
strcat(s, config_tos_mem[(tos_system_ctrl() >> 1) & 7]);
strcat(s, tos_mem[(tos_system_ctrl() >> 1) & 7]);
OsdWrite(m++, s, menusub == 3);
snprintf(s, 29, " TOS: %s", tos_get_image_name());
@@ -2914,7 +2908,7 @@ void HandleUI(void)
strcpy(s, " Chipset: ");
// extract TOS_CONTROL_STE and TOS_CONTROL_MSTE bits
strcat(s, atari_chipset[(tos_system_ctrl() >> 23) & 3]);
strcat(s, tos_chipset[(tos_system_ctrl() >> 23) & 3]);
OsdWrite(m++, s, menusub == 5);
// Blitter is always present in >= STE
@@ -2944,11 +2938,11 @@ void HandleUI(void)
OsdWrite(m++, s, menusub == 10);
strcpy(s, " Scanlines: ");
strcat(s, scanlines[(tos_system_ctrl() >> 20) & 3]);
strcat(s, tos_scanlines[(tos_system_ctrl() >> 20) & 3]);
OsdWrite(m++, s, menusub == 11);
strcpy(s, " YM-Audio: ");
strcat(s, stereo[(tos_system_ctrl() & TOS_CONTROL_STEREO) ? 1 : 0]);
strcat(s, tos_stereo[(tos_system_ctrl() & TOS_CONTROL_STEREO) ? 1 : 0]);
OsdWrite(m++, s, menusub == 12);
for (; m < OsdGetSize() - 1; m++) OsdWrite(m);
@@ -2962,7 +2956,7 @@ void HandleUI(void)
if (menu)
{
menustate = MENU_ST_MAIN1;
menusub = 3;
menusub = 4;
if(need_reset) tos_reset(1);
}
else if (select)
@@ -3058,7 +3052,7 @@ void HandleUI(void)
case 13:
menustate = MENU_ST_MAIN1;
menusub = 3;
menusub = 4;
if (need_reset) tos_reset(1);
break;
}
@@ -3087,32 +3081,28 @@ void HandleUI(void)
case MENU_ST_LOAD_CONFIG1:
helptext = helptexts[HELPTEXT_NONE];
m = 0;
if (parentstate != menustate) // First run?
{
menumask = 0x21;
if (tos_config_exists(1)) menumask |= 0x02;
if (tos_config_exists(2)) menumask |= 0x04;
if (tos_config_exists(3)) menumask |= 0x08;
if (tos_config_exists(4)) menumask |= 0x10;
}
parentstate = menustate;
parentstate = menustate;
OsdSetTitle("Load Config", 0);
if (parentstate != menustate) // First run?
{
parentstate = menustate;
menumask = 0x201;
for (uint32_t i = 1; i < 9; i++) if (tos_config_exists(i)) menumask |= 1<<i;
}
m = 0;
OsdWrite(m++);
OsdWrite(m++);
OsdWrite(m++);
OsdWrite(m++);
OsdWrite(m++, " Default", menusub == 0);
OsdWrite(m++);
OsdWrite(m++, " 1", menusub == 1, !(menumask & 0x02));
OsdWrite(m++, " 2", menusub == 2, !(menumask & 0x04));
OsdWrite(m++, " 3", menusub == 3, !(menumask & 0x08));
OsdWrite(m++, " 4", menusub == 4, !(menumask & 0x10));
for (uint32_t i = 0; i < 9; i++)
{
snprintf(s, 29, " %s", tos_get_cfg_string(i));
OsdWrite(m++, s, menusub == i, !(menumask & (1<<i)));
if(!i) OsdWrite(m++);
}
for (; m < OsdGetSize() - 1; m++) OsdWrite(m);
OsdWrite(15, STD_EXIT, menusub == 5, 0);
OsdWrite(15, STD_EXIT, menusub == 9, 0);
menustate = MENU_ST_LOAD_CONFIG2;
break;
@@ -3121,12 +3111,12 @@ void HandleUI(void)
if (menu)
{
menustate = MENU_ST_MAIN1;
menusub = 4;
menusub = 5;
}
if (select)
{
if (menusub < 5)
if (menusub < 9)
{
tos_config_load(menusub);
tos_upload(NULL);
@@ -3135,31 +3125,31 @@ void HandleUI(void)
else
{
menustate = MENU_ST_MAIN1;
menusub = 4;
menusub = 5;
}
}
break;
case MENU_ST_SAVE_CONFIG1:
helptext = helptexts[HELPTEXT_NONE];
menumask = 0x3f;
m = 0;
parentstate = menustate;
OsdSetTitle("Save Config", 0);
parentstate = menustate;
menumask = 0x3FF;
m = 0;
OsdWrite(m++);
OsdWrite(m++);
OsdWrite(m++);
OsdWrite(m++);
OsdWrite(m++, " Default", menusub == 0, 0);
OsdWrite(m++);
OsdWrite(m++, " 1", menusub == 1, 0);
OsdWrite(m++, " 2", menusub == 2, 0);
OsdWrite(m++, " 3", menusub == 3, 0);
OsdWrite(m++, " 4", menusub == 4, 0);
for (uint32_t i = 0; i < 9; i++)
{
snprintf(s, 29, " %s", tos_get_cfg_string(i));
OsdWrite(m++, s, menusub == i, !(menumask & (1 << i)));
if (!i) OsdWrite(m++);
}
for (; m < OsdGetSize() - 1; m++) OsdWrite(m);
OsdWrite(15, STD_EXIT, menusub == 5, 0);
OsdWrite(15, STD_EXIT, menusub == 9, 0);
menustate = MENU_ST_SAVE_CONFIG2;
break;
@@ -3168,12 +3158,12 @@ void HandleUI(void)
if (menu)
{
menustate = MENU_ST_MAIN1;
menusub = 5;
menusub = 6;
}
if (select)
{
if (menusub < 5)
if (menusub < 9)
{
tos_config_save(menusub);
menustate = MENU_NONE1;
@@ -3181,7 +3171,7 @@ void HandleUI(void)
else
{
menustate = MENU_ST_MAIN1;
menusub = 5;
menusub = 6;
}
}
break;

View File

@@ -12,6 +12,12 @@
#define CONFIG_FILENAME "ATARIST0.CFG"
const char* tos_mem[] = { "512kb", "1mb", "2mb", "4mb", "8mb", "14mb", "--", "--" };
const char* tos_scanlines[] = { "Off","25%","50%","75%" };
const char* tos_stereo[] = { "Mono","Stereo" };
const char* tos_chipset[] = { "ST","STE","MegaSTE","STEroids" };
const char* tos_chipset_short[] = { "ST","STe","MST","ST+" };
typedef struct {
unsigned long system_ctrl; // system control word
char tos_img[1024];
@@ -62,6 +68,11 @@ void tos_update_sysctrl(uint32_t ctrl)
set_control(config.system_ctrl);
}
unsigned long tos_system_ctrl()
{
return config.system_ctrl;
}
static void memory_read(uint8_t *data, uint32_t words)
{
EnableIO();
@@ -93,7 +104,7 @@ static void dma_ack(uint8_t status)
DisableIO();
}
static void dma_nak(void)
static void dma_nak()
{
EnableIO();
spi8(ST_NAK_DMA);
@@ -491,11 +502,6 @@ void tos_eject_all()
for (int i = 0; i < 4; i++) tos_insert_disk(i, "");
}
unsigned long tos_system_ctrl(void)
{
return config.system_ctrl;
}
void tos_reset(char cold)
{
tos_update_sysctrl(config.system_ctrl | TOS_CONTROL_CPU_RESET); // set reset
@@ -587,3 +593,49 @@ int tos_config_exists(int slot)
name[7] = '0' + slot;
return FileLoadConfig(name, 0, 0);
}
const char* tos_get_cfg_string(int num)
{
static char str[256];
char name[64] = { CONFIG_FILENAME };
name[7] = '0' + num;
static tos_config_t tmp;
memset(&tmp, 0, sizeof(tmp));
int len = FileLoadConfig(name, 0, 0);
if (len == sizeof(tos_config_t))
{
FileLoadConfig(name, &tmp, sizeof(tos_config_t));
memset(str, 0, sizeof(str));
strcat(str, tos_mem[(tmp.system_ctrl >> 1) & 7]);
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 ");
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 ");
if (tmp.system_ctrl & TOS_CONTROL_VIKING) strcat(str, "V ");
if (tmp.system_ctrl & TOS_CONTROL_VIDEO_AR) strcat(str, "W ");
strcat(str, (tmp.system_ctrl & TOS_CONTROL_VIDEO_COLOR) ? "C " : "M ");
if (!(tmp.system_ctrl & TOS_CONTROL_BORDER)) strcat(str, "F ");
int sl = (tmp.system_ctrl >> 20) & 3;
if (sl) sprintf(str + strlen(str), "S%d ", sl);
strcat(str, (tmp.system_ctrl & TOS_CONTROL_STEREO) ? "AS " : "AM ");
if (tmp.tos_img[0])
{
char *p = strrchr(tmp.tos_img, '/');
if (!p) p = tmp.tos_img; else p++;
int len = strlen(p);
if (len >= 4) len -= 4;
memcpy(str + strlen(str), p, len);
}
return str;
}
return "< empty slot >";
}

View File

@@ -67,8 +67,14 @@
#define TOS_CONTROL_BORDER 0x20000000
unsigned long tos_system_ctrl(void);
extern const char* tos_mem[];
extern const char* tos_scanlines[];
extern const char* tos_stereo[];
extern const char* tos_chipset[];
const char* tos_get_cfg_string(int num);
unsigned long tos_system_ctrl();
void tos_upload(const char *);
void tos_poll();
void tos_update_sysctrl(uint32_t ctrl);