PDP11, PDP8: Allow console input to configure parity and KSR mode

This commit is contained in:
Mark Pizzolato 2020-07-24 19:05:04 -07:00
parent da602f5f77
commit 0045601823
4 changed files with 108 additions and 25 deletions

View file

@ -95,6 +95,7 @@ t_stat tto_wr (int32 data, int32 PA, int32 access);
t_stat tto_svc (UNIT *uptr); t_stat tto_svc (UNIT *uptr);
t_stat tto_reset (DEVICE *dptr); t_stat tto_reset (DEVICE *dptr);
t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat tty_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat clk_rd (int32 *data, int32 PA, int32 access); t_stat clk_rd (int32 *data, int32 PA, int32 access);
t_stat clk_wr (int32 data, int32 PA, int32 access); t_stat clk_wr (int32 data, int32 PA, int32 access);
t_stat clk_svc (UNIT *uptr); t_stat clk_svc (UNIT *uptr);
@ -115,7 +116,7 @@ DIB tti_dib = {
1, IVCL (TTI), VEC_TTI, { NULL } 1, IVCL (TTI), VEC_TTI, { NULL }
}; };
UNIT tti_unit = { UDATA (&tti_svc, UNIT_IDLE, 0), TMLN_SPD_9600_BPS }; UNIT tti_unit = { UDATA (&tti_svc, UNIT_IDLE|TT_MODE_7P, 0), TMLN_SPD_9600_BPS };
REG tti_reg[] = { REG tti_reg[] = {
{ HRDATAD (BUF, tti_unit.buf, 8, "last data item processed") }, { HRDATAD (BUF, tti_unit.buf, 8, "last data item processed") },
@ -130,10 +131,16 @@ REG tti_reg[] = {
}; };
MTAB tti_mod[] = { MTAB tti_mod[] = {
{ TT_MODE, TT_MODE_UC, "UC", "UC", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" },
{ TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "Upper Case mode" },
{ TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit mode" },
{ TT_MODE, TT_MODE_7P, "7b", NULL, NULL }, { MTAB_XTD|MTAB_VDV, TT_MODE_8B, NULL, "8B", &tty_set_mode, NULL, NULL, "8 bit mode" },
{ MTAB_XTD|MTAB_VDV, TT_MODE_7P, NULL, "7P", &tty_set_mode, NULL, NULL, "7 bit mode - non printing suppressed" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_SPACE, NULL, "SPACE", &tty_set_parity, NULL, NULL, "Space Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_MARK, NULL, "MARK", &tty_set_parity, NULL, NULL, "Mark Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_EVEN, NULL, "EVEN", &tty_set_parity, NULL, NULL, "Even Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_ODD, NULL, "ODD", &tty_set_parity, NULL, NULL, "Odd Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "MODE", NULL, NULL, &sim_tt_show_modepar, NULL, "Mode and Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL, { MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL,
NULL, &show_addr, NULL }, NULL, &show_addr, NULL },
{ MTAB_XTD|MTAB_VDV, 0, "VECTOR", NULL, { MTAB_XTD|MTAB_VDV, 0, "VECTOR", NULL,
@ -190,10 +197,16 @@ REG tto_reg[] = {
}; };
MTAB tto_mod[] = { MTAB tto_mod[] = {
{ TT_MODE, TT_MODE_UC, "UC", "UC", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" },
{ TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_UC, NULL, "UC", &tty_set_mode, NULL, NULL, "Upper Case mode" },
{ TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit mode" },
{ TT_MODE, TT_MODE_7P, "7p", "7P", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_8B, NULL, "8B", &tty_set_mode, NULL, NULL, "8 bit mode" },
{ MTAB_XTD|MTAB_VDV, TT_MODE_7P, NULL, "7P", &tty_set_mode, NULL, NULL, "7 bit mode - non printing suppressed" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_SPACE, NULL, "SPACE", &tty_set_parity, NULL, NULL, "Space Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_MARK, NULL, "MARK", &tty_set_parity, NULL, NULL, "Mark Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_EVEN, NULL, "EVEN", &tty_set_parity, NULL, NULL, "Even Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_ODD, NULL, "ODD", &tty_set_parity, NULL, NULL, "Odd Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "MODE", NULL, NULL, &sim_tt_show_modepar, NULL, "Mode and Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL, { MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL,
NULL, &show_addr, NULL }, NULL, &show_addr, NULL },
{ MTAB_XTD|MTAB_VDV, 0, "VECTOR", NULL, { MTAB_XTD|MTAB_VDV, 0, "VECTOR", NULL,
@ -456,8 +469,17 @@ return SCPE_OK;
t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{ {
tti_unit.flags = (tti_unit.flags & ~TT_MODE) | val; sim_tt_set_mode (&tti_unit, val, cptr, desc);
tto_unit.flags = (tto_unit.flags & ~TT_MODE) | val; sim_tt_set_mode (&tto_unit, val, cptr, desc);
return SCPE_OK;
}
t_stat tty_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
sim_tt_set_parity (&tti_unit, val, cptr, desc);
sim_tt_set_parity (&tto_unit, val, cptr, desc);
tti_unit.flags = (tti_unit.flags & ~TT_PAR) | val;
tto_unit.flags = (tto_unit.flags & ~TT_PAR) | val;
return SCPE_OK; return SCPE_OK;
} }

View file

@ -55,6 +55,7 @@ t_stat tto_svc (UNIT *uptr);
t_stat tti_reset (DEVICE *dptr); t_stat tti_reset (DEVICE *dptr);
t_stat tto_reset (DEVICE *dptr); t_stat tto_reset (DEVICE *dptr);
t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat tty_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
const char *tti_description (DEVICE *dptr); const char *tti_description (DEVICE *dptr);
const char *tto_description (DEVICE *dptr); const char *tto_description (DEVICE *dptr);
@ -81,10 +82,15 @@ REG tti_reg[] = {
}; };
MTAB tti_mod[] = { MTAB tti_mod[] = {
{ TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" },
{ TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit mode" },
{ TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_8B, NULL, "8B", &tty_set_mode, NULL, NULL, "8 bit mode" },
{ TT_MODE, TT_MODE_7P, "7b", NULL, NULL }, { MTAB_XTD|MTAB_VDV, TT_MODE_7P, NULL, "7P", &tty_set_mode, NULL, NULL, "7 bit mode - non printing suppressed" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_SPACE, NULL, "SPACE", &tty_set_parity, NULL, NULL, "Space Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_MARK, NULL, "MARK", &tty_set_parity, NULL, NULL, "Mark Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_EVEN, NULL, "EVEN", &tty_set_parity, NULL, NULL, "Even Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_ODD, NULL, "ODD", &tty_set_parity, NULL, NULL, "Odd Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "MODE", NULL, NULL, &sim_tt_show_modepar, NULL, "Mode and Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_dev, NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_dev, NULL },
{ 0 } { 0 }
}; };
@ -123,10 +129,15 @@ REG tto_reg[] = {
}; };
MTAB tto_mod[] = { MTAB tto_mod[] = {
{ TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" },
{ TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit mode" },
{ TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_8B, NULL, "8B", &tty_set_mode, NULL, NULL, "8 bit mode" },
{ TT_MODE, TT_MODE_7P, "7p", "7P", &tty_set_mode }, { MTAB_XTD|MTAB_VDV, TT_MODE_7P, NULL, "7P", &tty_set_mode, NULL, NULL, "7 bit mode - non printing suppressed" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_SPACE, NULL, "SPACE", &tty_set_parity, NULL, NULL, "Space Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_MARK, NULL, "MARK", &tty_set_parity, NULL, NULL, "Mark Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_EVEN, NULL, "EVEN", &tty_set_parity, NULL, NULL, "Even Parity" },
{ MTAB_XTD|MTAB_VDV, TT_PAR_ODD, NULL, "ODD", &tty_set_parity, NULL, NULL, "Odd Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "MODE", NULL, NULL, &sim_tt_show_modepar, NULL, "Mode and Parity" },
{ MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_dev }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_dev },
{ 0 } { 0 }
}; };
@ -285,8 +296,17 @@ return SCPE_OK;
t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{ {
tti_unit.flags = (tti_unit.flags & ~TT_MODE) | val; sim_tt_set_mode (&tti_unit, val, cptr, desc);
tto_unit.flags = (tto_unit.flags & ~TT_MODE) | val; sim_tt_set_mode (&tto_unit, val, cptr, desc);
return SCPE_OK;
}
t_stat tty_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
sim_tt_set_parity (&tti_unit, val, cptr, desc);
sim_tt_set_parity (&tto_unit, val, cptr, desc);
tti_unit.flags = (tti_unit.flags & ~TT_PAR) | val;
tto_unit.flags = (tto_unit.flags & ~TT_PAR) | val;
return SCPE_OK; return SCPE_OK;
} }

View file

@ -2950,14 +2950,14 @@ uint32 md = mode & TTUF_M_MODE;
if (md != TTUF_MODE_8B) { if (md != TTUF_MODE_8B) {
uint32 par_mode = (mode >> TTUF_W_MODE) & TTUF_M_PAR; uint32 par_mode = (mode >> TTUF_W_MODE) & TTUF_M_PAR;
static int32 nibble_even_parity = 0x699600; /* bit array indicating the even parity for each index (offset by 8) */ static int32 nibble_even_parity = 0x699600; /* bit array indicating the even parity for each index (offset by 8) */
c = c & 0177; c = c & 0177;
if (md == TTUF_MODE_UC) { if (md == TTUF_MODE_UC) {
if (islower (c)) if (islower (c))
c = toupper (c); c = toupper (c);
if (mode & TTUF_KSR) if (mode & TTUF_KSR)
c = c | 0200; c = c | 0200; /* Force MARK parity */
} }
switch (par_mode) { switch (par_mode) {
case TTUF_PAR_EVEN: case TTUF_PAR_EVEN:
@ -2971,7 +2971,8 @@ if (md != TTUF_MODE_8B) {
break; break;
} }
} }
else c = c & 0377; else
c = c & 0377;
return c; return c;
} }
@ -3051,6 +3052,43 @@ fprintf (st, (any? "\n": "no tabs set\n"));
return SCPE_OK; return SCPE_OK;
} }
t_stat sim_tt_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
uint32 par_mode = (TT_GET_MODE (uptr->flags) >> TTUF_W_MODE) & TTUF_M_PAR;
uptr->flags = uptr->flags & ~((TTUF_M_MODE << TTUF_V_MODE) | (TTUF_M_PAR << TTUF_V_PAR) | TTUF_KSR);
uptr->flags |= val;
if (val != TT_MODE_8B)
uptr->flags |= (par_mode << TTUF_V_PAR);
return SCPE_OK;
}
t_stat sim_tt_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
uptr->flags = uptr->flags & ~(TTUF_M_MODE | TTUF_M_PAR);
uptr->flags |= TT_MODE_7B | val;
return SCPE_OK;
}
t_stat sim_tt_show_modepar (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
{
uint32 md = (TT_GET_MODE (uptr->flags) & TTUF_M_MODE);
static const char *modes[] = {"7b", "8b", "UC", "7p"};
uint32 par_mode = (TT_GET_MODE (uptr->flags) >> TTUF_W_MODE) & TTUF_M_PAR;
static const char *parity[] = {"SPACE", "MARK", "EVEN", "ODD"};
if ((md == TTUF_MODE_UC) && (par_mode == TTUF_PAR_MARK))
fprintf (st, "KSR (UC, MARK parity)");
else
fprintf (st, "%s", modes[md]);
if ((md != TTUF_MODE_8B) &&
((md != TTUF_MODE_UC) || (par_mode != TTUF_PAR_MARK))) {
if (par_mode != 0)
fprintf (st, ", %s parity", parity[par_mode]);
}
return SCPE_OK;
}
#if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_MUX) #if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_MUX)
extern pthread_mutex_t sim_tmxr_poll_lock; extern pthread_mutex_t sim_tmxr_poll_lock;

View file

@ -60,7 +60,7 @@ extern "C" {
#define TT_MODE_8B (TTUF_MODE_8B << TTUF_V_MODE) #define TT_MODE_8B (TTUF_MODE_8B << TTUF_V_MODE)
#define TT_MODE_UC (TTUF_MODE_UC << TTUF_V_MODE) #define TT_MODE_UC (TTUF_MODE_UC << TTUF_V_MODE)
#define TT_MODE_7P (TTUF_MODE_7P << TTUF_V_MODE) #define TT_MODE_7P (TTUF_MODE_7P << TTUF_V_MODE)
#define TT_MODE_KSR (TT_MODE_UC) #define TT_MODE_KSR (TT_MODE_UC|TT_PAR_MARK)
/* 7 bit modes allow for an 8th bit parity mode */ /* 7 bit modes allow for an 8th bit parity mode */
#define TT_PAR (TTUF_M_PAR << TTUF_V_PAR) #define TT_PAR (TTUF_M_PAR << TTUF_V_PAR)
#define TT_PAR_SPACE (TTUF_PAR_SPACE << TTUF_V_PAR) #define TT_PAR_SPACE (TTUF_PAR_SPACE << TTUF_V_PAR)
@ -124,6 +124,9 @@ t_stat sim_ttclose (void);
t_bool sim_ttisatty (void); t_bool sim_ttisatty (void);
int32 sim_tt_inpcvt (int32 c, uint32 mode); int32 sim_tt_inpcvt (int32 c, uint32 mode);
int32 sim_tt_outcvt (int32 c, uint32 mode); int32 sim_tt_outcvt (int32 c, uint32 mode);
t_stat sim_tt_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat sim_tt_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat sim_tt_show_modepar (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat sim_tt_settabs (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_tt_settabs (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat sim_tt_showtabs (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat sim_tt_showtabs (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_bool sim_is_remote_console_master_line (void *lp); t_bool sim_is_remote_console_master_line (void *lp);