From f3354c5c27c1a17f9d4614f20c916184a81e9e5d Mon Sep 17 00:00:00 2001 From: Leo Broukhis Date: Thu, 9 Feb 2017 21:30:36 -0800 Subject: [PATCH] BESM6: Implemented raw terminal I/O, added WRU announcement. --- BESM6/besm6_tty.c | 53 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/BESM6/besm6_tty.c b/BESM6/besm6_tty.c index 32eaf7b5..e4a313fd 100644 --- a/BESM6/besm6_tty.c +++ b/BESM6/besm6_tty.c @@ -155,6 +155,7 @@ TMXR tty_desc = { LINES_MAX+1, 0, 0, tty_line }; /* mux descriptor */ #define TTY_UNICODE_CHARSET 0 #define TTY_KOI7_JCUKEN_CHARSET (1< prompt character - is ^%c\r\n", + sim_int_char ^ 0100); + } else { + sprintf (buf, "WRU – Break to sim> prompt character - is %c\r\n", + sim_int_char); + } + tmxr_linemsg (t, buf); tty_idle_count[num] = 0; tty_last_time[num] = time (0); sprintf (buf, "%.24s from %s\r\n", @@ -406,9 +418,9 @@ t_stat tty_setrate (UNIT *up, int32 v, CONST char *cp, void *dp) { t_stat tty_setturbo (UNIT *up, int32 v, CONST char *cp, void *dp) { if (!cp) return SCPE_MISVAL; - if (!sim_strcasecmp(cp, "ON")) + if (!MATCH_CMD("ON", cp)) tty_turbo = 1; - else if (!sim_strcasecmp(cp, "OFF")) + else if (!MATCH_CMD("OFF", cp)) tty_turbo = 0; else return SCPE_ARG; @@ -420,6 +432,7 @@ t_stat tty_setturbo (UNIT *up, int32 v, CONST char *cp, void *dp) { * set ttyN unicode - selecting UTF-8 encoding * set ttyN jcuken - selecting KOI-7 encoding, JCUKEN layout * set ttyN qwerty - selecting KOI-7 encoding, QWERTY layout + * set ttyN raw - selecting transmission of raw chars * set ttyN off - disconnecting a line * set ttyN tt - a Baudot TTY * set ttyN vt - a Videoton-340 terminal @@ -440,6 +453,8 @@ MTAB tty_mod[] = { "JCUKEN" }, { TTY_CHARSET_MASK, TTY_KOI7_QWERTY_CHARSET, "KOI7 (qwerty) input", "QWERTY" }, + { TTY_CHARSET_MASK, TTY_RAW_CHARSET, "RAW input/output", + "RAW" }, { TTY_STATE_MASK, TTY_OFFLINE_STATE, "offline", "OFF", &tty_setmode }, { TTY_STATE_MASK, TTY_TELETYPE_STATE, "Teletype", @@ -529,9 +544,11 @@ const char * koi7_rus_to_unicode [32] = { }; /* Videoton-340 employed single byte control codes rather than ESC sequences. */ -void vt_send(int num, uint32 sym, int destructive_bs) +void vt_send(int num, uint32 sym) { - if (sym < 0x60) { + if ((tty_unit[num].flags & TTY_CHARSET_MASK) == TTY_RAW_CHARSET) { + vt_putc(num, sym); + } else if (sym < 0x60) { switch (sym) { case '\031': /* Up */ @@ -551,7 +568,7 @@ void vt_send(int num, uint32 sym, int destructive_bs) case '\b': /* Left */ vt_puts (num, "\033["); - if (destructive_bs) { + if ((tty_unit[num].flags & TTY_BSPACE_MASK) == TTY_DESTRUCTIVE_BSPACE) { /* Erasing the previous char. */ vt_puts (num, "D \033["); } @@ -624,8 +641,7 @@ void vt_print() break; case 18: /* stop bit */ tty_sym[num] = ~tty_sym[num] & 0x7f; - vt_send (num, tty_sym[num], - (tty_unit[num].flags & TTY_BSPACE_MASK) == TTY_DESTRUCTIVE_BSPACE); + vt_send (num, tty_sym[num]); tty_active[num] = 0; tty_sym[num] = 0; vt_sending &= ~mask; @@ -762,6 +778,9 @@ static t_stat cmd_set (int32 num, CONST char *cptr) } else if (strncmp ("QWERTY", gbuf, len) == 0) { tty_unit[num].flags &= ~TTY_CHARSET_MASK; tty_unit[num].flags |= TTY_KOI7_QWERTY_CHARSET; + } else if (strncmp ("RAW", gbuf, len) == 0) { + tty_unit[num].flags &= ~TTY_CHARSET_MASK; + tty_unit[num].flags |= TTY_RAW_CHARSET; } else if (strncmp ("TT", gbuf, len) == 0) { tty_unit[num].flags &= ~TTY_STATE_MASK; tty_unit[num].flags |= TTY_TELETYPE_STATE; @@ -843,6 +862,7 @@ static CTAB cmd_table[] = { "set unicode select UTF-8 encoding\r\n" "set jcuken select KOI7 encoding, 'jcuken' keymap\r\n" "set qwerty select KOI7 encoding, 'qwerty' keymap\r\n" + "set raw select no I/O conversions\r\n" "set tt use Teletype mode\r\n" "set vt use Videoton-340 mode\r\n" "set consul use Consul-254 mode\r\n" @@ -1199,6 +1219,7 @@ void vt_receive() case TTY_KOI7_JCUKEN_CHARSET: tty_typed[num] = vt_kbd_input_koi7 (num); break; + case TTY_RAW_CHARSET: case TTY_KOI7_QWERTY_CHARSET: tty_typed[num] = vt_getc (num); break; @@ -1213,10 +1234,12 @@ void vt_receive() break; } if (tty_typed[num] <= 0177) { - if (tty_typed[num] == '\r' || tty_typed[num] == '\n') - tty_typed[num] = 3; /* ETX is used as Enter */ - if (tty_typed[num] == '\177') - tty_typed[num] = '\b'; /* ASCII DEL -> BS */ + if ((tty_unit[num].flags & TTY_CHARSET_MASK) != TTY_RAW_CHARSET) { + if (tty_typed[num] == '\r' || tty_typed[num] == '\n') + tty_typed[num] = 3; /* ETX is used as Enter */ + if (tty_typed[num] == '\177') + tty_typed[num] = '\b'; /* ASCII DEL -> BS */ + } tty_instate[num] = 1; TTY_IN |= mask; /* start bit */ GRP |= GRP_TTY_START; /* not used ? */ @@ -1274,8 +1297,7 @@ void consul_print (int dev_num, uint32 cmd) cmd &= 0177; switch (tty_unit[line_num].flags & TTY_STATE_MASK) { case TTY_VT340_STATE: - vt_send (line_num, cmd, - (tty_unit[line_num].flags & TTY_BSPACE_MASK) == TTY_DESTRUCTIVE_BSPACE); + vt_send (line_num, cmd); break; case TTY_CONSUL_STATE: besm6_debug(">>> CONSUL%o: Native charset not implemented", line_num); @@ -1297,6 +1319,7 @@ void consul_receive () case TTY_KOI7_JCUKEN_CHARSET: c = vt_kbd_input_koi7 (line_num); break; + case TTY_RAW_CHARSET: case TTY_KOI7_QWERTY_CHARSET: c = vt_getc (line_num); break; @@ -1309,8 +1332,10 @@ void consul_receive () } if (c >= 0 && c <= 0177) { CONSUL_IN[dev_num] = odd_parity(c) ? c | 0200 : c; - if (c == '\r' || c == '\n') + if ((tty_unit[line_num].flags & TTY_CHARSET_MASK) != TTY_RAW_CHARSET && + (c == '\r' || c == '\n')) { CONSUL_IN[dev_num] = 3; + } PRP |= CONS_HAS_INPUT[dev_num]; vt_idle = 0; }