/* Copyright (C) Magna Carta Software, Inc. 1990. All Rights Reserved. C COMMUNICATIONS TOOLKIT VT100.C -- VT100 terminal emulation routines. Note to those who find this file: VT220 emulation is not finished yet and is not a feature that we are advertising. This program does provide a subset implementation of the VT220, but make sure that you tell the VAX: -- set term seven bits */ #define CCT_DEVELOPMENT #if (defined(CCTW) || defined(_WINDOWS)) #include #endif #include #include #include /* VT220_INIT -- Memory initialization of DEC VT220 (assumes ANSI mode). */ void vt220_init(TERMINAL *t) { vt100_init(t); /* initialize the VT100 subset */ t->type = DEC_VT220; if (get_databits(t->port) == 7) vt220_init_7bit_(t); else vt220_init_8bit_(t); } void vt220_init_8bit_(TERMINAL *t) { t->csi = 0X9B; /* KEYSTROKES */ /* VT100 Cursor keys */ if (enhanced_kbd) { /* IF THE ENHANCED KEYBOARD IS PRESENT AND HAS BIOS SUPPORT, USE IT */ term_assign_key(t, GREY_END, 0, "1~"); term_assign_key(t, GREY_INSERT, 0, "2~"); term_assign_key(t, GREY_DELETE, 0, "3~"); term_assign_key(t, GREY_HOME, 0, "4~"); term_assign_key(t, GREY_PAGE_UP, 0, "5~"); term_assign_key(t, GREY_PAGE_DOWN, 0, "6~"); term_assign_key(t, GREY_UP_ARROW, 0, "A"); term_assign_key(t, GREY_DOWN_ARROW, 0, "B"); term_assign_key(t, GREY_RIGHT_ARROW, 0, "C"); term_assign_key(t, GREY_LEFT_ARROW, 0, "D"); } else { term_assign_key(t, S_END, 0, "1~"); term_assign_key(t, S_INSERT, 0, "2~"); term_assign_key(t, S_DELETE, 0, "3~"); term_assign_key(t, S_HOME, 0, "4~"); term_assign_key(t, S_PAGE_UP, 0, "5~"); term_assign_key(t, S_PAGE_DOWN, 0, "6~"); term_assign_key(t, S_UP_ARROW, 0, "A"); term_assign_key(t, S_DOWN_ARROW, 0, "B"); term_assign_key(t, S_RIGHT_ARROW, 0, "C"); term_assign_key(t, S_LEFT_ARROW, 0, "D"); } term_assign_key(t, F6, 0, "17~"); term_assign_key(t, F7, 0, "18~"); term_assign_key(t, F8, 0, "19~"); term_assign_key(t, F9, 0, "20~"); term_assign_key(t, F10, 0, "21~"); term_assign_key(t, F11, 0, "23~"); term_assign_key(t, F12, 0, "24~"); term_assign_key(t, S_F3, 0, "25~"); /* F13 (LF) */ term_assign_key(t, S_F4, 0, "26~"); /* F14 */ term_assign_key(t, S_F5, 0, "28~"); /* F15 */ term_assign_key(t, S_F6, 0, "29~"); /* F16 */ term_assign_key(t, S_F7, 0, "31~"); /* F17 */ term_assign_key(t, S_F8, 0, "32~"); /* F18 */ term_assign_key(t, S_F9, 0, "33~"); /* F19 */ term_assign_key(t, S_F10, 0, "34~"); /* F20 */ /* RECEIVED COMMANDS */ /* ANSI COMMANDS */ term_assign_cmd(t, IL, "%L", ansi_insert_, NULL); /* DEC Private */ term_assign_cmd(t, MODE_DECSCL, "%;%\"p", vt220_private_, NULL); term_assign_cmd(t, MEDIA_COPY, "%;%i", (void (*)(TERMINAL *, short)) ansi_media_copy_, NULL); term_assign_cmd(t, MEDIA_COPY, "?%i", (void (*)(TERMINAL *, short)) vt_media_copy_, NULL); /* STATUS REPORTS */ term_assign_cmd(t, TDSR, "5n", (void (*)(TERMINAL *, short)) NULL, "0n"); term_assign_cmd(t, CPR, "6n", (void (*)(TERMINAL *, short)) ansi_cpr_, NULL); term_assign_cmd(t, DA, "%c", (void (*)(TERMINAL *, short)) NULL, "?1;0c"); term_assign_cmd(t, TERMID, "Z", (void (*)(TERMINAL *, short)) NULL, "?1;0c"); } /* VT220_INIT_7BIT -- Initialize for VT220 terminal emulation using 7-bit escape sequences. */ void vt220_init_7bit_(TERMINAL *t) { t->csi = 0X7B; /* KEYSTROKES */ /* VT100 Cursor keys */ if (enhanced_kbd) { /* IF THE ENHANCED KEYBOARD IS PRESENT AND HAS BIOS SUPPORT, USE IT */ term_assign_key(t, GREY_END, 0, "1~"); term_assign_key(t, GREY_INSERT, 0, "2~"); term_assign_key(t, GREY_DELETE, 0, "3~"); term_assign_key(t, GREY_HOME, 0, "4~"); term_assign_key(t, GREY_PAGE_UP, 0, "5~"); term_assign_key(t, GREY_PAGE_DOWN, 0, "6~"); } else { term_assign_key(t, S_END, 0, "1~"); term_assign_key(t, S_INSERT, 0, "2~"); term_assign_key(t, S_DELETE, 0, "3~"); term_assign_key(t, S_HOME, 0, "4~"); term_assign_key(t, S_PAGE_UP, 0, "5~"); term_assign_key(t, S_PAGE_DOWN, 0, "6~"); } term_assign_key(t, F6, 0, "17~"); term_assign_key(t, F7, 0, "18~"); term_assign_key(t, F8, 0, "19~"); term_assign_key(t, F9, 0, "20~"); term_assign_key(t, F10, 0, "21~"); term_assign_key(t, F11, 0, "23~"); term_assign_key(t, F12, 0, "24~"); term_assign_key(t, S_F3, 0, "25~"); /* F13 (LF) */ term_assign_key(t, S_F4, 0, "26~"); /* F14 */ term_assign_key(t, S_F5, 0, "28~"); /* F15 */ term_assign_key(t, S_F6, 0, "29~"); /* F16 */ term_assign_key(t, S_F7, 0, "31~"); /* F17 */ term_assign_key(t, S_F8, 0, "32~"); /* F18 */ term_assign_key(t, S_F9, 0, "33~"); /* F19 */ term_assign_key(t, S_F10, 0, "34~"); /* F20 */ /* RECEIVED COMMANDS */ /* ANSI COMMANDS */ strcpy(t->tr[IL].sh2t, "%L"); t->tr[IL].tcmd = ansi_insert_; /* DEC Private */ strcpy(t->tr[MODE_DECSCL].sh2t, "%;%\"p"); t->tr[MODE_DECSCL].tcmd = vt220_private_; strcpy(t->tr[MEDIA_COPY].sh2t, "%;%i"); t->tr[MEDIA_COPY].tcmd = (void (*)(TERMINAL *, short)) ansi_media_copy_; strcpy(t->tr[MEDIA_COPY].sh2t, "?%i"); t->tr[MEDIA_COPY].tcmd = (void (*)(TERMINAL *, short)) vt_media_copy_; /* STATUS REPORTS */ strcpy(t->tr[TDSR].sh2t, "5n"); strcpy(t->tr[TDSR].st2h, "0n"); strcpy(t->tr[CPR].sh2t, "6n"); t->tr[CPR].tcmd = (void (*)(TERMINAL *, short)) ansi_cpr_; strcpy(t->tr[DA].sh2t, "%c"); strcpy(t->tr[DA].st2h, "?1;0c"); strcpy(t->tr[TERMID].sh2t, "Z"); strcpy(t->tr[TERMID].st2h, "\x1B[?1;0c"); } /* VT220_PRIVATE_ -- Function to handle DEC private sequences for the VTxxx line of terminals. */ void vt220_private_(TERMINAL *t, short cmd) { switch (cmd) { case MODE_DECKPAM: /* keypad application mode */ if (isansi_(t)) { term_assign_key(t, PLUS, 0, "Ol"); /* VT100 comma */ term_assign_key(t, MINUS, 0, "Om"); term_assign_key(t, KP_ENTER, 0, "OM"); term_assign_key(t, DELETE, 0, "On"); term_assign_key(t, INSERT, 0, "Op"); term_assign_key(t, END, 0, "Oq"); term_assign_key(t, DOWN_ARROW, 0, "Or"); term_assign_key(t, PAGE_DOWN, 0, "Os"); term_assign_key(t, LEFT_ARROW, 0, "Ot"); term_assign_key(t, KP_5, 0, "Ou"); term_assign_key(t, RIGHT_ARROW, 0, "Ov"); term_assign_key(t, HOME, 0, "Ow"); term_assign_key(t, UP_ARROW, 0, "Ox"); term_assign_key(t, PAGE_UP, 0, "Oy"); } else { term_assign_key(t, PLUS, 0, "?l"); /* VT52 comma */ term_assign_key(t, MINUS, 0, "?m"); term_assign_key(t, KP_ENTER, 0, "?M"); term_assign_key(t, DELETE, 0, "?n"); term_assign_key(t, INSERT, 0, "?p"); term_assign_key(t, END, 0, "?q"); term_assign_key(t, DOWN_ARROW, 0, "?r"); term_assign_key(t, PAGE_DOWN, 0, "?s"); term_assign_key(t, LEFT_ARROW, 0, "?t"); term_assign_key(t, KP_5, 0, "?u"); term_assign_key(t, RIGHT_ARROW, 0, "?v"); term_assign_key(t, HOME, 0, "?w"); term_assign_key(t, UP_ARROW, 0, "?x"); term_assign_key(t, PAGE_UP, 0, "?y"); } break; case MODE_DECKPNM: /* keypad numeric mode */ term_assign_key(t, PLUS, 0, ","); /* VT100 comma */ term_assign_key(t, MINUS, 0, "-"); if (isaddlf_(t)) term_assign_key(t, KP_ENTER, 0, "\r\n"); else term_assign_key(t, KP_ENTER, 0, "\r"); term_assign_key(t, DELETE, 0, "."); term_assign_key(t, INSERT, 0, "0"); term_assign_key(t, END, 0, "1"); term_assign_key(t, DOWN_ARROW, 0, "2"); term_assign_key(t, PAGE_DOWN, 0, "3"); term_assign_key(t, LEFT_ARROW, 0, "4"); term_assign_key(t, KP_5, 0, "5"); term_assign_key(t, RIGHT_ARROW, 0, "6"); term_assign_key(t, HOME, 0, "7"); term_assign_key(t, UP_ARROW, 0, "8"); term_assign_key(t, PAGE_UP, 0, "9"); break; case MODE_DECRC: /* restore cursor */ t->crow = t->crowold; t->ccol = t->ccolold; (*t->cur_pos_)(t, t->ccol, t->crow); break; case MODE_DECSC: /* save cursor */ t->crowold = t->crow; t->ccolold = t->ccol; break; case MODE_DECSCL: /* compatibility level */ switch (t->num[0]) { case 61: if (t->type != DEC_VT100) init_term(t->port, t, (void (*)()) vt100_init, t->vid_init); break; case 62: if (t->num[1] == 0 || t->num[1] == 2) { if (t->databits != 8) { #if XDEBUG printf("HOST: Requested 8-bit controls on < 8-bit line"); #endif } else { /* set to 8-bit mode */ } } else if (t->num[1] == 1) { if (t->type != DEC_VT220) init_term(t->port, t, (void (*)()) vt220_init, t->vid_init); if (t->databits != 7) (*t->set_databits)(t, 8); } break; default: #if XDEBUG printf("HOST: Tried to set unknown compatibility level"); #endif break; } break; case MODE_DECSTBM: /* set top and bottom margins */ if (t->num[0] < t->num[1]) { t->tmargin = (t->num[0] == 0) ? 0 : t->num[0]-1; t->bmargin = (t->num[1] == 0) ? t->d_rows - 1 : t->num[1]-1; t->ccol = t->crow = 0; } else { t->tmargin = t->ctmargin = 0; t->bmargin = t->cbmargin = t->d_rows - 1; } if (isdecom_(t)) { t->cbmargin = t->bmargin; t->ccol = t->clmargin = t->lmargin; t->crow = t->ctmargin = t->tmargin; } (*t->cur_pos_)(t, t->ccol, t->crow); break; case MODE_DECSWL: /* single width line */ break; default: #if XDEBUG printf("Unknown DEC Private command %s", t->cmdbuf); #endif break; } }