diff --git a/PDP11/pdp11_stddev.c b/PDP11/pdp11_stddev.c index 2f92121d..cff7a51e 100644 --- a/PDP11/pdp11_stddev.c +++ b/PDP11/pdp11_stddev.c @@ -95,6 +95,7 @@ t_stat tto_wr (int32 data, int32 PA, int32 access); t_stat tto_svc (UNIT *uptr); t_stat tto_reset (DEVICE *dptr); 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_wr (int32 data, int32 PA, int32 access); t_stat clk_svc (UNIT *uptr); @@ -115,7 +116,7 @@ DIB tti_dib = { 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[] = { { HRDATAD (BUF, tti_unit.buf, 8, "last data item processed") }, @@ -130,10 +131,16 @@ REG tti_reg[] = { }; MTAB tti_mod[] = { - { TT_MODE, TT_MODE_UC, "UC", "UC", &tty_set_mode }, - { TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, - { TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, - { TT_MODE, TT_MODE_7P, "7b", NULL, NULL }, + { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" }, + { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "Upper Case mode" }, + { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit 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, NULL, &show_addr, NULL }, { MTAB_XTD|MTAB_VDV, 0, "VECTOR", NULL, @@ -190,10 +197,16 @@ REG tto_reg[] = { }; MTAB tto_mod[] = { - { TT_MODE, TT_MODE_UC, "UC", "UC", &tty_set_mode }, - { TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, - { TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, - { TT_MODE, TT_MODE_7P, "7p", "7P", &tty_set_mode }, + { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" }, + { MTAB_XTD|MTAB_VDV, TT_MODE_UC, NULL, "UC", &tty_set_mode, NULL, NULL, "Upper Case mode" }, + { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit 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, NULL, &show_addr, 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) { -tti_unit.flags = (tti_unit.flags & ~TT_MODE) | val; -tto_unit.flags = (tto_unit.flags & ~TT_MODE) | val; +sim_tt_set_mode (&tti_unit, val, cptr, desc); +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; } diff --git a/PDP8/pdp8_tt.c b/PDP8/pdp8_tt.c index 2a13dc8e..0b3a03ae 100644 --- a/PDP8/pdp8_tt.c +++ b/PDP8/pdp8_tt.c @@ -55,6 +55,7 @@ t_stat tto_svc (UNIT *uptr); t_stat tti_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_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc); const char *tti_description (DEVICE *dptr); const char *tto_description (DEVICE *dptr); @@ -81,10 +82,15 @@ REG tti_reg[] = { }; MTAB tti_mod[] = { - { TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, - { TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, - { TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, - { TT_MODE, TT_MODE_7P, "7b", NULL, NULL }, + { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" }, + { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit 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, "DEVNO", NULL, NULL, &show_dev, NULL }, { 0 } }; @@ -123,10 +129,15 @@ REG tto_reg[] = { }; MTAB tto_mod[] = { - { TT_MODE, TT_MODE_KSR, "KSR", "KSR", &tty_set_mode }, - { TT_MODE, TT_MODE_7B, "7b", "7B", &tty_set_mode }, - { TT_MODE, TT_MODE_8B, "8b", "8B", &tty_set_mode }, - { TT_MODE, TT_MODE_7P, "7p", "7P", &tty_set_mode }, + { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" }, + { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit 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, "DEVNO", NULL, NULL, &show_dev }, { 0 } }; @@ -285,8 +296,17 @@ return SCPE_OK; t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { -tti_unit.flags = (tti_unit.flags & ~TT_MODE) | val; -tto_unit.flags = (tto_unit.flags & ~TT_MODE) | val; +sim_tt_set_mode (&tti_unit, val, cptr, desc); +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; } diff --git a/sim_console.c b/sim_console.c index 8e256a8b..069eac0e 100644 --- a/sim_console.c +++ b/sim_console.c @@ -2950,14 +2950,14 @@ uint32 md = mode & TTUF_M_MODE; if (md != TTUF_MODE_8B) { 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; if (md == TTUF_MODE_UC) { if (islower (c)) c = toupper (c); if (mode & TTUF_KSR) - c = c | 0200; + c = c | 0200; /* Force MARK parity */ } switch (par_mode) { case TTUF_PAR_EVEN: @@ -2971,7 +2971,8 @@ if (md != TTUF_MODE_8B) { break; } } -else c = c & 0377; +else + c = c & 0377; return c; } @@ -3051,6 +3052,43 @@ fprintf (st, (any? "\n": "no tabs set\n")); 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) extern pthread_mutex_t sim_tmxr_poll_lock; diff --git a/sim_console.h b/sim_console.h index ae0ab86a..aa0c5949 100644 --- a/sim_console.h +++ b/sim_console.h @@ -60,7 +60,7 @@ extern "C" { #define TT_MODE_8B (TTUF_MODE_8B << 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_KSR (TT_MODE_UC) +#define TT_MODE_KSR (TT_MODE_UC|TT_PAR_MARK) /* 7 bit modes allow for an 8th bit parity mode */ #define TT_PAR (TTUF_M_PAR << 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); int32 sim_tt_inpcvt (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_showtabs (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_bool sim_is_remote_console_master_line (void *lp);