/* C K O D G . C -- Data General Emulation */ /* Author: Jeffrey Altman , Secure Endpoints Inc., New York City. Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. */ #include "ckcdeb.h" #ifndef NOTERM #ifdef NT #include #else /* NT */ #include #undef COMMENT #endif /* NT */ #include "ckcker.h" #include "ckcasc.h" #include "ckuusr.h" #include "ckcxla.h" #include "ckuxla.h" #include "ckcuni.h" #include "ckocon.h" #include "ckodg.h" #ifdef NETCONN #ifdef TCPSOCKET #include "ckcnet.h" extern int network, nettype, ttnproto, u_binary; #endif /* TCPSOCKET */ #endif /* NETCONN */ extern bool keyclick ; extern int cursorena[], keylock, duplex, duplex_sav, screenon ; extern int printon, aprint, uprint, cprint, xprint, seslog ; extern int insertmode, tnlm ; extern int escstate, debses, decscnm, tt_cursor; extern int tt_type, tt_type_mode, tt_type_vt52, tt_max, tt_answer, tt_status[VNUM], tt_szchng[] ; extern int tt_cols[], tt_rows[], tt_wrap ; extern int wherex[], wherey[], margintop, marginbot ; extern int marginbell, marginbellcol, parity, cmask ; extern int wy_monitor; extern char answerback[], htab[] ; extern struct tt_info_rec tt_info[] ; extern vtattrib attrib ; extern unsigned char attribute; extern int autoscroll, protect ; extern CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(CHAR); /* Character set xlate */ extern CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(CHAR); /* functions. */ extern struct csinfo fcsinfo[]; /* File character set info */ extern int tcsr, tcsl; /* Terminal character sets, remote & local. */ extern struct _vtG G[4]; extern struct _vtG *GL, *SSGL ; /* GL and single shift GL */ extern struct _vtG *GR; /* GR */ extern struct _vtG *GNOW; int dgunix = FALSE ; /* DG Unix mode */ int dgunix_usr = FALSE; static unsigned char escchar=XRS;/* Remember which was used to enter GOTESC */ unsigned char charset( enum charsetsize size, unsigned short achar, struct _vtG * pG ); extern int ttpush; int dginc(void) { extern int pmask, cmask; extern int tt_utf8; int ch; loop: ch = ttinc(0); if ( ch < 0 ) return ch; if ( seslog ) logchar(ch); /* Handle the UTF8 conversion if we are in that mode */ if ( tt_utf8 ) { USHORT * ucs2 = NULL; int rc = utf8_to_ucs2( (CHAR)(ch & 0xFF), &ucs2 ); if ( rc > 0 ) goto loop; else if ( rc < 0 ) ch = 0xfffd; else ch = *ucs2; } if ( !xprint ) { #ifndef NOXFER autodown(ch); #endif /* NOXFER */ autoexitchk(ch); } if ( !xprint ) ch = ch & pmask & cmask; debugses(ch); if (printon && (is_xprint() || is_uprint())) prtchar(ch); return ch; } static char int2unixhex( int n ) { char c; switch ( n ) { case 0: c = '0'; break; case 1: c = '1'; break; case 2: c = '2'; break; case 3: c = '3'; break; case 4: c = '4'; break; case 5: c = '5'; break; case 6: c = '6'; break; case 7: c = '7'; break; case 8: c = '8'; break; case 9: c = '9'; break; case 10: c = 'A'; break; case 11: c = 'B'; break; case 12: c = 'C'; break; case 13: c = 'D'; break; case 14: c = 'E'; break; case 15: c = 'F'; break; default: c = '0'; } return c; } static int unixhex2int( char c ) { int n=-1; switch ( c ) { case '0': n = 0; break; case '1': n = 1; break; case '2': n = 2; break; case '3': n = 3; break; case '4': n = 4; break; case '5': n = 5; break; case '6': n = 6; break; case '7': n = 7; break; case '8': n = 8; break; case '9': n = 9; break; case 'A': case 'a': n = 10; break; case 'B': case 'b': n = 11; break; case 'C': case 'c': n = 12; break; case 'D': case 'd': n = 13; break; case 'E': case 'e': n = 14; break; case 'F': case 'f': n = 15; break; } return n; } int dgcmd2int( char arg1, char arg2, char arg3 ) { int n = 0; if ( dgunix ) { n += unixhex2int(arg1) * 256; n += unixhex2int(arg2) * 16; n += unixhex2int(arg3); } else { n += (arg1 & 0x0F) * 256; n += (arg2 & 0x0F) * 16; n += (arg3 & 0x0F); } return n; } void dgint2cmd( int n, char * arg1, char * arg2, char * arg3 ) { if ( dgunix ) { n %= 4096; /* max DG-Hex value */ *arg1 = int2unixhex(n/256); n %= 256 ; *arg2 = int2unixhex(n/16); n %= 16 ; *arg3 = int2unixhex(n); } else { n %= 4096; /* max DG-Hex value */ *arg1 = '0' + n / 256; n %= 256 ; *arg2 = '0' + n / 16; n %= 16 ; *arg3 = '0' + n; } } int dgloc2int( char arg1, char arg2, char arg3 ) { int n = 0 ; if ( dgunix ) { n += unixhex2int(arg1) * 256; n += unixhex2int(arg2) * 16; n += unixhex2int(arg3); } else { n += (arg1 - '@')%32 * 1024; n += (arg2 - '@')%32 * 32; n += (arg3 - '@')%32 ; } return n; } void dgint2loc( int n, char * arg1, char * arg2, char * arg3 ) { if ( dgunix ) { n %= 3072; /* max DG-Location value */ *arg1 = int2unixhex(n/256); n %= 256 ; *arg2 = int2unixhex(n/16); n %= 16 ; *arg3 = int2unixhex(n); } else { n %= 3072; /* max DG-Location value */ *arg1 = '@' + n / 1024; n %= 1024 ; *arg2 = '@' + n / 32; n %= 32 ; *arg3 = '@' + n; } } void dgctrl( int ch ) { int i,j; if ( !xprint ) { if (printon && is_uprint()) prtchar(ch); switch ( ch ) { case SOH: /* Print all unprotected characters */ debug(F110,"Data General","SOH",0); prtscreen( VTERM, wherey[VTERM], VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0)); sendchar(ACK); break; case STX: /* Reverse off */ debug(F110,"Data General","STX",0); if ( debses ) break; attrib.reversed = FALSE ; break; case ETX: debug(F110,"Data General","ETX",0); /* Blink Enable */ break; case EOT: debug(F110,"Data General","EOT",0); /* Blink Disable */ break; case ENQ: { /* Report cursor address */ debug(F110,"Data General","ENQ",0); if ( debses || dgunix ) break; sendchar(US); sendchar(wherex[VTERM]-1); sendchar(wherey[VTERM]-1); break; } case ACK: debug(F110,"Data General","ACK",0); break; case BEL: debug(F110,"Data General","BEL",0); if ( debses ) break; bleep(BP_BEL); break; case BS: debug(F110,"Data General","BS",0); if ( !dgunix ) { /* Home Cursor */ if ( debses ) break; lgotoxy( VTERM, 1, 1 ) ; } else { /* Backspace */ if ( debses ) break; if ( wherex[VTERM] > 1 ) cursorleft(0); } break; case HT: debug(F110,"Data General","HT",0); if ( debses ) break; i = wherex[VTERM]; if (i < VscrnGetWidth(VTERM)) { do { i++; cursorright(0); } while ( (dgunix ? (wherex[VTERM]%8) : ((htab[i] != 'T'))) && (i <= VscrnGetWidth(VTERM)-1)); VscrnIsDirty(VTERM); } break; case LF: /* Cursor to start on next line */ debug(F110,"Data General","LF",0); if ( debses ) break; if ( dgunix ) { wrtch((CHAR)LF); } else if ( autoscroll || wherey[VTERM] < VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0) ) { wrtch((CHAR)CR); wrtch((CHAR)LF); } else { /* Home Cursor */ lgotoxy( VTERM, 1, 1 ) ; } break; case VT: /* Erase Field */ debug(F110,"Data General","VT",0); if ( debses || dgunix ) break; clrtoeoln( VTERM, SP ) ; break; case FF: debug(F110,"Data General","FF",0); if ( debses || dgunix ) break; clrscreen(VTERM,SP); lgotoxy(VTERM,1,1); /* and home the cursor */ attrib.blinking = FALSE; attrib.underlined = FALSE; attrib.reversed = FALSE; attrib.dim = FALSE; break; case CR: debug(F110,"Data General","CR",0); if ( debses ) break; wrtch((char) CR); break; case SO: debug(F110,"Data General","SO",0); if ( debses ) break; if ( dgunix ) GL = &G[1]; else attrib.blinking = TRUE ; break; case SI: debug(F110,"Data General","SI",0); if ( debses ) break; if ( dgunix ) GL = &G[0]; else attrib.blinking = FALSE ; break; case DLE: { /* Address cursor in current page */ int col, line ; debug(F110,"Data General","DLE",0); col = dginc(); #ifdef NETCONN #ifdef TCPSOCKET if ( network && IS_TELNET() && !TELOPT_U(TELOPT_BINARY) && col == CR ) { /* Handle TELNET CR-NUL or CR-LF if necessary */ int dummy = ttinc(0); debug(F111,"Data General","Addr cursor in page found CR",dummy); if ( dummy != NUL ) ttpush = dummy; } #endif /* TCPSOCKET */ #endif /* NETCONN */ line = dginc(); #ifdef COMMENT #ifdef NETCONN #ifdef TCPSOCKET if ( network && IS_TELNET() && !TELOPT_U(TELOPT_BINARY) && line == CR ) { /* Handle TELNET CR-NUL or CR-LF if necessary */ int dummy = ttinc(0); debug(F111,"Data General","Addr cursor in page found CR",dummy); if ( dummy != NUL ) ttpush = dummy; } #endif /* TCPSOCKET */ #endif /* NETCONN */ #endif /* COMMENT */ if ( debses ) break; if ( col == 127 ) col = wherex[VTERM] - 1; if ( line == 127 ) line = wherey[VTERM] - 1; lgotoxy(VTERM,col+1,line+1); break; } case DC1: { /* Print - current line to end of screen */ /* Send Ctrl-F ACK when print is complete */ debug(F110,"Data General","DC1",0); if ( debses || dgunix ) break; debug(F110,"Data General","Print current line to end of screen",0); prtscreen( VTERM, wherey[VTERM], VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0)); sendchar(ACK); break; } case DC2: debug(F110,"Data General","DC2",0); if ( debses ) break; autoscroll = TRUE ; break; case DC3: debug(F110,"Data General","DC3",0); if ( debses || dgunix ) break; autoscroll = FALSE ; break; case DC4: debug(F110,"Data General","DC4",0); if ( debses ) break; attrib.underlined = TRUE ; break; case NAK: debug(F110,"Data General","NAK",0); if ( debses ) break; attrib.underlined = FALSE ; break; case SYN: debug(F110,"Data General","SYN",0); if ( debses ) break; attrib.reversed = TRUE ; break; case ETB: debug(F110,"Data General","ETB",0); if ( debses || dgunix ) break; cursorup(0); break; case CAN: debug(F110,"Data General","CAN",0); if ( debses || dgunix ) break; cursorright(0); break; case XEM: debug(F110,"Data General","EM",0); if ( debses || dgunix ) break; cursorleft(0); break; case SUB: debug(F110,"Data General","SUB",0); if ( debses || dgunix ) break; cursordown(0); break; case ESC: /* We will treat RS and ESC to be equivalent for our purposes */ /* initiate escape sequence */ debug(F110,"Data General","ESC",0); escstate = ES_GOTESC ; escchar = ESC; break; case XFS: debug(F110,"Data General","FS",0); if ( debses ) break; attrib.dim = TRUE ; break; case XGS: debug(F110,"Data General","GS",0); if ( debses ) break; attrib.dim = FALSE ; break; case XRS: /* This appears to be the beginning of escape character on the DG series */ /* We will treat RS and ESC to be equivalent for our purposes */ /* initiate escape sequence */ debug(F110,"Data General","RS",0); escstate = ES_GOTESC ; escchar = XRS; break; case US: debug(F110,"Data General","US",0); break; } } else { /* xprint */ switch ( ch ) { case ESC: /* We will treat RS and ESC to be equivalent for our purposes */ /* initiate escape sequence */ escstate = ES_GOTESC ; escchar = ESC; break; case XRS: /* This appears to be the beginning of escape character on the DG series */ /* We will treat RS and ESC to be equivalent for our purposes */ /* initiate escape sequence */ escstate = ES_GOTESC ; escchar = XRS; break; default: if (printon && is_uprint()) prtchar(ch); } } } void dgascii( int ch ) { int i,j,k,n,x,y,z; vtattrib attr ; viocell blankvcell; char arg1, arg2, arg3, arg4, arg5; if ( escstate == ES_GOTESC )/* Process character as part of an escstate sequence */ { if ( ch < SP ) { escstate = ES_NORMAL ; dgctrl(ch) ; } else { escstate = ES_ESCSEQ ; if ( !xprint ) { /* We don't print escape sequences */ switch ( ch ) { case '"': /* Unlock Keyboard */ debug(F110,"Data General","Unlock Keyboard",0); if ( debses ) break; keylock = FALSE ; break; case '#': /* Lock Keyboard */ debug(F110,"Data General","Lock Keyboard",0); if ( debses ) break; keylock = TRUE ; break; case 'A': /* DG411 - Set Foreground Color */ debug(F110,"Data General","Set Foreground Color",0); arg1 = dginc(); if ( debses ) break; break; case 'C': { /* Send Terminal ID */ /* RS o # */ /* = model: d217 '5'; d413/d463 '6' */ /* = bits 01TC PRRR */ /* T - 0:self test passed; 1:errors */ /* C - 0:7bit; 1:8bit */ /* P - 0:no printer; 1:printer */ /* R - 3bit revision number */ /* = bits 01GK LLLL */ /* G - 0:no graphics; 1:graphics */ /* K - 0:no keyboard; 1:keyboard */ /* L - keyboard mode (1001 - US) */ char response[7]; if ( debses ) break; response[0] = XRS; response[1] = 'o'; response[2] = '#'; switch ( tt_type_mode ) { case TT_DG200: response[3] = '!'; break; case TT_DG210: response[3] = '('; break; case TT_DG217: response[3] = '5'; break; #ifdef COMMENT case TT_DG413: case TT_DG463: response[3] = '6'; break; #endif /* COMMENT */ } if ( cmask == 0177 ) response[4] = 0x48 | 0x03; /* 7-bit; printer */ else response[4] = 0x58 | 0x03; /* 8-bit; printer */ response[5] = 0x59; /* keyboard; US */ response[6] = '\0'; debug(F110,"Data General Read Model ID",response,0); sendchars(response,6); break; } case 'D': debug(F110,"Data General","Reverse On",0); if ( debses ) break; attrib.reversed = TRUE ; break; case 'E': debug(F110,"Data General","Reverse Off",0); if ( debses ) break; attrib.reversed = FALSE ; break; case 'F': { ch = dginc() ; switch ( ch ) { case '?': { ch = dginc() ; if ( debses ) break; switch ( ch ) { case ':': /* Print Screen */ debug(F110,"Data General","Print Screen",0); prtscreen( VTERM, 1, VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0)); sendchar(ACK); break; case '0': debug(F110,"Data General 4xx","Simulprint Off",0); break; case '1': debug(F110,"Data General 4xx","Simulprint On",0); break; case '2': debug(F110,"Data General","Xprint Off",0); xprint = FALSE ; if ( !uprint && !xprint && !aprint && printon ) printeroff(); sendchar(ACK); break; case '3': debug(F110,"Data General","Xprint On",0); xprint = TRUE; printeron(); break; case '5': debug(F110,"Data General 4xx","Window Bit Dump",0); break; case '6': debug(F110,"Data General 4xx","Form Bit Dump",0); break; case '7': /* VT220 AutoPrint off */ debug(F110,"Data General","Aprint Off",0); setaprint(FALSE); if ( !uprint && !xprint && !aprint && printon ) printeroff(); sendchar(ACK); case '8': /* VT220 AutoPrint on */ debug(F110,"Data General","Aprint On",0); setaprint(TRUE); printeron(); break; case '9': /* DG UNIX - Print Window */ if ( dgunix ) { /* Print - current line to end of screen */ /* Send Ctrl-F ACK when print is complete */ debug(F110,"Data General", "Print current line to end of screen",0); prtscreen( VTERM, wherey[VTERM], VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0)); sendchar(ACK); } break; } break; } case ';': { /* Data Trap Mode */ int cmd = dginc(); debug(F111,"Data General","Data Trap Mode",cmd); switch ( cmd ) { case 'T': if ( wy_monitor ) break; setdebses(FALSE); break; case 'H': case 'O': case DEL: if ( debses || wy_monitor ) break; setdebses(TRUE); wy_monitor = TRUE ; break; } } case '~': { /* Switch Emulations */ int emulation = 0 ; char response[5] = ""; arg1 = '0'; arg2 = dginc(); arg3 = dginc(); emulation = dgcmd2int( arg1, arg2, arg3 ); debug(F111,"Data General","Switch Emulation",emulation); if ( debses ) break; response[0] = XRS; response[1] = 'o'; response[2] = '~'; switch ( emulation ) { case 0x00: /* DG Native mode */ response[3] = '1'; break; case 0x08: /* VT52 mode */ tt_type_vt52 = tt_type_mode; tt_type_mode = TT_VT52; response[3] = '1'; ipadl25(); break; case 0x09: /* VT100 mode */ tt_type_mode = TT_VT102; response[3] = '1'; ipadl25(); break; case 0x0C: /* VT320 mode */ tt_type_mode = TT_VT320; response[3] = '1'; ipadl25(); break; case 0x10: /* Tektronix 4010 */ response[3] = '0'; ipadl25(); break; } response[4] = '\0'; debug(F110,"Data General Switch Emulation Mode",response,0); sendchars( response, 4 ); break; } case '{': { /* Set Model ID */ int model = 0 ; int graphics = 0; arg1 = '0'; arg2 = dginc(); arg3 = dginc(); model = dgcmd2int( arg1, arg2, arg3 ); arg2 = '0'; arg3 = dginc(); graphics = dgcmd2int( arg1, arg2, arg3 ); debug(F110,"Data General Set Model ID","not supported",0); if ( debses ) break; break; } case '7': { /* Select Printer National Character Set */ int lang; arg1 = '0'; arg2 = dginc(); arg3 = dginc(); lang = dgcmd2int( arg1, arg2, arg3 ); debug(F101,"Data General Select Printer National CS","",lang); if ( debses ) break; break; } case '8': debug(F110,"Data General 4xx","Display Character Generator Contents",0); if ( debses ) break; break; case '9': debug(F110,"Data General 4xx","Fill Screen with Grid",0); if ( debses ) break; break; case '<': debug(F110,"Data General 4xx","DG411 - Perform Uart Loopback Test",0); if ( debses ) break; break; case '>': debug(F110,"Data General 4xx","Fill Screen with Character",0); arg1 = dginc(); if ( debses ) break; break; case '@': debug(F110,"Data General 4xx","Select ANSI mode",0); break; case 'A': debug(F110,"Data General 4xx","Reset",0); if ( debses ) break; doreset(1); break; case 'B': debug(F110,"Data General 4xx","Set Windows",0); /* ... * how do we know when the sequence ends? */ arg1 = dginc(); break; case 'C': { /* Scroll Left - Pan Right */ viocell cell ; debug(F110,"Data General 4xx","Scroll Left",0); arg1 = dginc(); /* Column count */ if ( debses ) break; cell.c = SP ; cell.a = geterasecolor(VTERM) ; if ( arg1 == 0 ) arg1 = 1 ; else if ( arg1 > VscrnGetWidth(VTERM)-1 ) arg1 = VscrnGetWidth(VTERM)-1 ; VscrnScrollLf( VTERM, 0, 0, VscrnGetHeight(VTERM) -(tt_status[VTERM]?2:1), VscrnGetWidth(VTERM)-1, arg1, cell); break; } case 'D': { /* Scroll Right - Pan Left */ viocell cell ; debug(F110,"Data General 4xx","Scroll Right",0); arg1 = dginc(); /* Column count */ if ( debses ) break; cell.c = SP ; cell.a = geterasecolor(VTERM) ; if ( arg1 == 0 ) arg1 = 1 ; else if ( arg1 > VscrnGetWidth(VTERM)-1 ) arg1 = VscrnGetWidth(VTERM)-1 ; VscrnScrollRt( VTERM, 0, 0, VscrnGetHeight(VTERM) -(tt_status[VTERM]?2:1), VscrnGetWidth(VTERM)-1, arg1, cell); break; } case 'E': debug(F110,"Data General 4xx","Erase Screen",0); if ( debses ) break; clrscreen(VTERM, SP); break; case 'F': /* D413 Clear Unprotected (cursor to EOS) */ debug(F110,"Data General 4xx","Erase Unprotected",0); if ( debses ) break; if ( protect ) selclreoscr_escape(VTERM, SP); else clreoscr_escape(VTERM, SP); break; case 'G': debug(F110,"Data General 4xx","Screen Home",0); break; case 'H': debug(F110,"Data General 4xx","Insert Line",0); break; case 'I': debug(F110,"Data General 4xx","Delete Line",0); break; case 'J': debug(F110,"Data General 4xx","Select Normal Spacing",0); break; case 'K': debug(F110,"Data General 4xx","Select Compressed Spacing",0); break; case 'L': debug(F110,"Data General 4xx","Protect On",0); if ( debses ) break; attrib.unerasable = TRUE; break; case 'M': debug(F110,"Data General 4xx","Protect Off",0); if ( debses ) break; attrib.unerasable = FALSE; break; case 'N': { /* D413 Change Attributes */ int chars = 0 ; int toset = 0 ; int toreset = 0; debug(F110,"Data General 4xx","Change Attributes",0); arg1 = dginc(); arg2 = dginc(); arg3 = dginc(); chars = dgcmd2int( arg1, arg2, arg3 ); arg1 = '0'; arg2 = '0'; arg3 = dginc(); toset = dgcmd2int( arg1, arg2, arg3 ); arg3 = dginc(); toreset = dgcmd2int( arg1, arg2, arg3 ); if ( debses ) break; break; } case 'O': debug(F110,"Data General 4xx","Read Horizontal Scroll Offset",0); break; case 'P': { /* Write Screen Address */ int col=0, row=0; arg1 = '0'; arg2 = dginc(); arg3 = dginc(); col = dgcmd2int( arg1, arg2, arg3 ); arg2 = dginc(); arg3 = dginc(); row = dgcmd2int( arg1, arg2, arg3 ); debug(F110,"Data General","Write Screen Address",0); if ( debses ) break; if ( col == 255 ) col = wherex[VTERM] - 1 ; if ( row == 255 ) row = wherey[VTERM] - 1 ; lgotoxy( VTERM, col+1, row+1 ); break; } case 'Q': { /* Set Cursor Type - DG411/461 */ arg1 = dginc(); debug(F111,"Data General","Set Cursor Type",arg1-'0'); if ( debses ) break; switch ( arg1 ) { case '0': cursorena[VTERM] = FALSE; break; case '5': cursorena[VTERM] = TRUE; break; case '1': /* blink */ case '4': /* no blink */ tt_cursor = TTC_ULINE; setcursormode(); cursorena[VTERM] = TRUE; break; case '2': /* no blink */ case '3': /* blink */ tt_cursor = TTC_BLOCK; setcursormode(); cursorena[VTERM] = TRUE; break; } break; } case 'R': debug(F110,"Data General 4xx","Define Character",0); arg1 = dginc(); /* character */ arg2 = dginc(); /* row 0 */ arg3 = dginc(); /* row 9 */ break; case 'S': { /* Select Character Set (p 2-27) */ int cs ; arg1 = '0' ; arg2 = dginc(); arg3 = dginc(); if ( debses ) break; cs = dgcmd2int( arg1, arg2, arg3 ); debug( F111, "Data General Switch to Character Set", (GL==&G[0])?"G0":"G1",cs); switch ( cs ) { case 0: /* Keyboard language */ case 1: /* US ASCII */ charset( cs94, 'B', GL ); break; case 2: /* UK ASCII */ charset( cs94, 'A', GL ); break; case 3: /* French */ charset( cs94, 'R', GL ); break; case 4: /* German */ charset( cs94, 'K', GL ); break; case 5: /* Swedish/Finnish */ charset( cs94, 'C', GL ); break; case 6: /* Spanish */ charset( cs94, 'Y', GL ); break; case 7: /* Danish/Nowegian */ charset( cs94, 'E', GL ); break; case 8: /* Swiss */ charset( cs94, '=', GL ); break; case 9: /* Kata Kana (G0) */ charset( cs94, 'B', GL ); break; case 14: /* DG International */ charset( cs96, 'd', GL ); break; case 15: /* Kata Kana (G1) */ charset( cs94, 'I', GL ); break; case 16: /* DG Word Processing, Greek, Math */ charset( cs96, 'g', GL ); break; case 17: /* DG Line Drawing */ charset( cs96, 'f', GL ); break; case 19: /* DG Special Graphics */ charset( cs96, 'e', GL ); break; case 20: /* DEC Multinational */ charset( cs94, '<', GL ); break; case 21: /* DEC Special Graphics */ charset( cs94, '0', GL ); break; case 29: /* Low PC Term */ charset( cs94, 'B', GL ); break; case 30: /* High PC Term */ charset( cs94, '?', GL ); break; case 31: /* ISO 8859/1.2 */ charset( cs96, 'A', GL ); break; default: if ( cs >= 32 || cs <= 45 ) ; /* Downloadable Character Sets */ } break; } case 'T': debug(F110,"Data General 4xx","Set Scroll Rate",0); break; case 'U': { /* Select 7/8 Bit Operation */ int bits = 0 ; arg1 = '0' ; arg2 = '0' ; arg3 = dginc(); bits = dgcmd2int( arg1, arg2, arg3 ); debug(F110,"Data General","Select 7/8 Bit Operation",0); if ( debses ) break; if ( bits ) { /* 8-bits */ setcmask(8); parity = 0; } else { /* 7-bits */ setcmask(7); } break; } case 'V': debug(F110,"Data General 4xx","Protect Enable",0); if ( debses ) break; protect = TRUE; break; case 'W': debug(F110,"Data General 4xx","Protect Disable",0); if ( debses ) break; protect = FALSE; break; case 'X': debug(F110,"Data General 4xx","Set Margins",0); arg1 = dginc(); /* left */ arg2 = dginc(); /* right */ break; case 'Y': debug(F110,"Data General 4xx","Set Alternate Margins",0); arg1 = dginc(); /* row */ arg2 = dginc(); /* left */ arg3 = dginc(); /* right */ break; case 'Z': debug(F110,"Data General 4xx","Restore Normal Margins",0); break; case '[': debug(F110,"Data General 4xx","Insert Line Between Margins",0); break; case '\\': debug(F110,"Data General 4xx","Delete Line Between Margins",0); break; case ']': debug(F110,"Data General 4xx","Horizontal Scroll Disable",0); break; case '^': debug(F110,"Data General 4xx","Horizontal Scroll Enable",0); break; case '_': debug(F110,"Data General 4xx","Show Columns",0); arg1 = dginc(); /* left */ arg2 = dginc(); /* right */ break; case '`': if ( debses ) break; debug(F110,"Data General","Xprint On",0); xprint = TRUE; printeron(); break; case 'a': if ( debses ) break; debug(F110,"Data General","Xprint Off",0); xprint = FALSE ; if ( !uprint && !xprint && !aprint && printon ) printeroff(); sendchar(ACK); break; case 'b': debug(F110,"Data General 4xx","Read Screen Address",0); break; case 'd': debug(F110,"Data General 4xx","Read Characters Remaining",0); break; case 'e': debug(F110,"Data General 4xx","Initialize Draw",0); arg1 = dginc(); /* set */ arg2 = dginc(); /* number */ break; case 'f': { /* Set Keyboard Language */ int lang=0; arg1='0'; arg2='0'; arg3=dginc(); lang = dgcmd2int( arg1, arg2, arg3 ); debug(F111,"Data General","Set Keyboard Language",lang); if ( debses ) break; for ( i = 0 ; i < 4 ; i++ ) { if ( i == 0 ) { switch ( lang ) { case 0: /* Default (national) */ G[i].designation = G[i].def_designation ; G[i].size = G[i].def_size ; G[i].c1 = G[i].def_c1 ; break; case 1: /* DG International */ case 2: /* Latin 1 */ G[i].designation = TX_ASCII ; G[i].size = cs94 ; G[i].c1 = TRUE ; break; } } else { switch ( lang ) { case 0: /* Default (national) */ G[i].designation = G[i].def_designation ; G[i].size = G[i].def_size ; G[i].c1 = G[i].def_c1 ; break; case 1: /* DG International */ G[i].designation = TX_DGI ; G[i].size = cs96 ; G[i].c1 = TRUE ; break; case 2: /* Latin 1 */ G[i].designation = TX_8859_1 ; G[i].size = cs96 ; G[i].c1 = TRUE ; break; } } G[i].national = CSisNRC(G[i].designation) ; if ( G[i].designation == TX_TRANSP ) { debug(F111,"Data General - ERROR","G(i).designation == TX_TRANSP",i); G[i].rtoi = NULL ; G[i].itol = NULL ; G[i].ltoi = NULL ; G[i].itor = NULL ; } else { G[i].rtoi = xl_u[G[i].designation]; G[i].itol = xl_tx[tcsl] ; G[i].ltoi = xl_u[tcsl] ; G[i].itor = xl_tx[G[i].designation]; } G[i].init = FALSE ; } GNOW = GL = &G[0] ; GR = &G[1] ; SSGL = NULL ; break; } case 'h': debug(F110,"Data General 4xx","Push",0); break; case 'i': debug(F110,"Data General 4xx","Pop",0); break; case 'm': { ch = dginc() ; switch ( ch ) { case '0': debug(F110,"Data General 4xx","Read Cursor Contents",0); break; } break; } case 'r': { /* Set Clock Time */ int status=0, hh = 0, mm = 0; arg1='0'; arg2='0'; arg3=dginc(); status = dgcmd2int( arg1, arg2, arg3 ); if ( status == 2 || status == 3 ) { dginc(); /* unused clock position */ dginc(); dginc(); dginc(); arg2=dginc(); arg3=dginc(); hh = 10 * (arg2-'0') + (arg3-'0'); if ( dginc() != ':' ) debug(F100,"Data General Set Time - Invalid spacing character","",0); arg2=dginc(); arg3=dginc(); mm = 10 * (arg2-'0') + (arg3-'0'); } debug(F110,"Data General","Set Clock Time",0); if ( debses ) break; loadtod( hh, mm ); break; } case 't': { /* Report Screen Size */ /* Responds <036> o < */ char response[13] ; if ( debses ) break; response[0] = XRS; response[1] = 'o'; response[2] = '<'; dgint2loc( VscrnGetHeight(VTERM)-(tt_status[VTERM]?1:0),&arg1,&arg2,&arg3); response[3] = arg2; response[4] = arg3; response[7] = arg2; response[8] = arg3; dgint2loc( VscrnGetWidth(VTERM),&arg1,&arg2,&arg3); response[5] = arg2; response[6] = arg3; response[9] = arg2; response[10] = arg3; response[11] = 'p'; /* one host; screen save not enabled */ response[12] = '\0'; debug(F110,"Data General Report Screen Size",response,0); sendchars( response, 12 ); break; } case 'v': { /* Read Window Contents */ int r1=0, c1=0, r2=0, c2=0; arg1 = '0'; arg2 = dginc(); arg3 = dginc(); r1 = dgcmd2int( arg1, arg2, arg3 ); arg2 = dginc(); arg3 = dginc(); c1 = dgcmd2int( arg1, arg2, arg3 ); arg2 = dginc(); arg3 = dginc(); r2 = dgcmd2int( arg1, arg2, arg3 ); arg2 = dginc(); arg3 = dginc(); c2 = dgcmd2int( arg1, arg2, arg3 ); debug(F110,"Data General","Read Window Contents",0); if ( debses ) break; /* response with text bounded by rectangle , */ /* each line separated with CR-LF. */ /* Terminate with ACK if configured to do so */ /* Characters from screen are to be translated using G0,G1 sets */ break; } case 'w': { /* Read New Model ID */ char response[21] = "" ; if ( debses ) break; response[0] = XRS ; response[1] = 'o'; response[2] = 'w'; switch ( tt_type_mode ) { case TT_DG200: case TT_DG210: case TT_DG217: response[3] = '1'; /* D200 series terminal */ break; #ifdef COMMENT case TT_DG413: response[3] = '3'; break; #endif /* COMMENT */ } response[4] = '0'; response[5] = '1'; response[6] = '0'; response[7] = '0'; response[8] = 'D'; switch ( tt_type_mode ) { case TT_DG200: response[9] = '2'; response[10] = '0'; response[11] = '0'; break; case TT_DG210: response[9] = '2'; response[10] = '1'; response[11] = '0'; break; case TT_DG217: response[9] = '2'; response[10] = '1'; response[11] = '7'; break; #ifdef COMMENT case TT_DG413: response[9] = '4'; response[10] = '1'; response[11] = '3'; break; #endif } response[12] = response[13] = response[14] = response[15] = SP; response[16] = response[17] = response[18] = response[19] = SP; response[20] = '\0'; debug(F110,"Data General Read new Model ID",response,0); sendchars(response,20); break; } case 'x': { /* Printer Pass Back to Host */ int mode; char response[5]; arg1=arg2='0'; arg3=dginc(); mode=dgcmd2int(arg1, arg2, arg3); if ( debses ) break; response[0] = XRS; response[1] = 'R'; response[2] = 'x'; response[3] = '0'; response[4] = '\0'; debug(F110,"Data General Printer Pass Back to Host",response,0); sendchars(response,4); break; } case 'z': { /* Set 25th Line Mode */ /* 0 - Status Line */ /* 1 - Message */ /* 2 - Extra screen row */ /* 3 - disabled */ int mode=0 ; int length=0; char message[128]="" ; arg1 = '0'; arg2 = '0'; arg3 = dginc(); mode = dgcmd2int( arg1, arg2, arg3 ); if ( mode == 1 ) { arg2 = dginc(); arg3 = dginc(); length = dgcmd2int( arg1, arg2, arg3 ); for ( i=0;i': ch = dginc(); switch ( ch ) { case '|': debug(F110,"Data General 4xx","Write Cursor Location",0); arg1 = dginc(); /* x */ arg2 = dginc(); /* y */ break; } break; case '?': ch = dginc(); switch ( ch ) { case '|': debug(F110,"Data General 4xx","Read Cursor Location",0); break; } break; case '@': debug(F110,"Data General 4xx","Read Cursor Attributes",0); break; case 'A': debug(F110,"Data General 4xx","Cursor Reset",0); break; case 'B': debug(F110,"Data General 4xx","Cursor On",0); break; case 'C': debug(F110,"Data General 4xx","Cursor Off",0); break; case 'H': debug(F110,"Data General 4xx","Cursor Track",0); arg1 = dginc(); /* device */ break; case 'p': ch = dginc(); switch ( ch ) { case '1': debug(F110,"Data General 4xx","Set Pattern",0); arg1 = dginc(); /* offset */ do { arg2 = dginc(); /* pattern definition */ } while (arg2 != NUL); break; } break; } break; } /* G */ case 'H': debug(F110,"Data General 4xx","Scroll Up",0); VscrnScroll( VTERM, UPWARD, margintop-1, wherex[VTERM]-1, 1, margintop == 1, SP); break; case 'I': debug(F110,"Data General 4xx","Scroll Down",0); VscrnScroll( VTERM, DOWNWARD, wherex[VTERM]-1, marginbot-1, 1, FALSE, SP); break; case 'J': debug(F110,"Data General 4xx","Insert Character",0); break; case 'K': debug(F110,"Data General 4xx","Delete Character",0); break; case 'L': debug(F110,"Data General 4xx","Line",0); do { arg1 = dginc(); /* loc list */ } while (arg1 != NUL); break; case 'N': /* Shift-Out */ debug(F110,"Data General","Shift-Out",0); if ( debses ) break; GL = &G[1]; break; case 'O': /* Shift-In */ debug(F110,"Data General","Shift-In",0); if ( debses ) break; GL = &G[0]; break; case 'P': { ch = dginc() ; switch ( ch ) { case '@': { /* Unix Mode 0:exit 1:enter */ int mode=0; arg1='0'; arg2='0'; arg3=dginc(); mode = dgcmd2int(arg1, arg2, arg3); debug(F111,"Data General","Unide Mode",mode-'0'); if ( debses ) break; dgunix = mode; break; } case 'A': { /* DG UNIX - Cursor Up */ debug(F110,"Data General","Unix Cursor Up",0); if ( debses || !dgunix ) break; cursorup(0); break; } case 'B': { /* DG UNIX - Cursor Down */ debug(F110,"Data General","Unix Cursor Down",0); if ( debses || !dgunix ) break; cursordown(0); break; } case 'C': { /* DG UNIX - Cursor Right */ debug(F110,"Data General","Unix Cursor Right",0); if ( debses || !dgunix ) break; cursorright(0); break; } case 'D': { /* DG UNIX - Cursor Left */ debug(F110,"Data General","Unix Cursor Left",0); if ( debses || !dgunix ) break; cursorleft(0); break; } case 'E': { /* DG UNIX - Erase Field */ debug(F110,"Data General","Unix Erase Field",0); if ( debses || !dgunix ) break; clrtoeoln( VTERM, SP ) ; break; } case 'F': { /* DG UNIX - Window Home */ debug(F110,"Data General","Unix Window Home",0); if ( debses || !dgunix ) break; lgotoxy( VTERM, 1, 1 ) ; break; } case 'G': { /* DG UNIX - Roll Disable */ debug(F110,"Data General","Unix Roll Disable",0); if ( debses || !dgunix ) break; autoscroll = FALSE ; break; } case 'H': { /* DG UNIX - Erase Window */ debug(F110,"Data General","Unix Erase Window",0); if ( debses || !dgunix ) break; clrscreen(VTERM,SP); lgotoxy(VTERM,1,1); /* and home the cursor */ attrib.blinking = FALSE; attrib.underlined = FALSE; attrib.reversed = FALSE; attrib.dim = FALSE; break; } case 'I': { /* DG UNIX - Blink On */ debug(F110,"Data General","Unix Blink On",0); if ( debses || !dgunix ) break; attrib.blinking = TRUE ; break; } case 'J': { /* DG UNIX - Blink Off */ debug(F110,"Data General","Unix Blink Off",0); if ( debses || !dgunix ) break; attrib.blinking = FALSE ; break; } } } /* P */ } } else { /* xprint */ switch ( ch ) { case 'F': { ch = dginc() ; switch ( ch ) { case '?': { ch = dginc() ; if ( debses ) break; switch ( ch ) { case '2': debug(F110,"Data General","Xprint Off",0); xprint = FALSE ; if ( !uprint && !xprint && !aprint && printon ) printeroff(); sendchar(ACK); break; default: if (printon && (is_xprint() || is_uprint())) { prtchar(escchar); prtchar('F'); prtchar('?'); prtchar(ch); } } break; } case 'a': if ( debses ) break; debug(F110,"Data General","Xprint Off",0); xprint = FALSE ; if ( !uprint && !xprint && !aprint && printon ) printeroff(); sendchar(ACK); break; default: if ( !cprint && printon ) { prtchar(escchar); prtchar('F'); prtchar(ch); } } } default: if (printon && (is_xprint() || is_uprint())) { prtchar(escchar); prtchar(ch); } } } escstate = ES_NORMAL ; /* Done parsing escstate sequence */ } } else /* Handle as a normal character */ { if ( ch < SP ) { dgctrl(ch) ; } else if ( !debses ) { wrtch(ch); if (printon && (is_xprint() || is_uprint())) prtchar(ch); } } VscrnIsDirty(VTERM) ; } #endif /* NOTERM */