home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-04-04 | 22.3 KB | 1,268 lines |
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 3 (of 3)."
- # Contents: vt100.c
- # Wrapped by jb@deneb on Sat Mar 24 10:42:20 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'vt100.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'vt100.c'\"
- else
- echo shar: Extracting \"'vt100.c'\" \(20360 characters\)
- sed "s/^X//" >'vt100.c' <<'END_OF_FILE'
- X/*
- X * VT100.C
- X *
- X * Written for the
- X *
- X * Datalight
- X * Microsoft V 5.x
- X * TurboC
- X * &
- X * Zortech
- X *
- X * C Compilers
- X *
- X * Copyright (c) John Birchfield 1987, 1988, 1989
- X */
- X
- X#include <stdio.h>
- X#include <process.h>
- X#include <ctype.h>
- X#include "_kb.h"
- X#include "8250xon.h"
- X#include "screen.h"
- X#include "vt100.h"
- X#if (!defined (TRUE))
- X# define TRUE (1)
- X# define FALSE (0)
- X#endif
- X
- char Duplex [2] = { 'F', 0 },
- X RubOut [2] = { 255, 0 },
- X BackSpace [2] = { 8, 0 },
- X Cmask [2] = {127, 0 },
- X CrLf [2] = { 0, 0 };
- X
- X
- X#if (defined (STANDALONE))
- X#include "options.h"
- void print_screen_header (void);
- X
- main (argc, argv)
- int argc;
- char *argv [];
- X{
- X FILE *fp;
- X void vt100_driver (), VT100_init ();
- X set_options (argc, argv);
- X trap_ctrl_break ();
- X timer_init ();
- X xon8250_init (Port, 4096);
- X fputs ("-- VT100 Terminal Emulator --\n", stdout);
- X if (Cfg_Str [0])
- X {
- X xon8250_port_init (Cfg_Str);
- X fputs (Opt_Msg, stdout);
- X }
- X else
- X {
- X xon8250_port_enable ();
- X fputs ("Default Port Settings Used\n", stdout);
- X }
- X fputs ("Use <Alt>F10 to exit, <Alt>F9 to spawn DOS,"
- X " or <Alt>F8 to Send Break\n", stdout);
- X screen_init();
- X
- X print_screen_header ();
- X rowcol (23, 0);
- X while (xon8250_timed_read (1) != -1)
- X ;
- X VT100_init ();
- X vt100_driver ();
- X xon8250_term ((Cfg_Str [0])?1:0);
- X timer_term ();
- X release_ctrl_break ();
- X}
- X
- X
- X
- void
- print_screen_header ()
- X{
- X char save = Scr_ATTR;
- X Scr_ATTR = INVERSE;
- X rowcol(24,0);
- X cleol();
- X rowcol (24, 0);
- X aputs (INVERSE, "VT100 Emulator");
- X Scr_ATTR = save;
- X}
- X#endif
- X
- X
- X
- X/*--------------------------------------------------------------------*
- X | All of the VT100 Specific Stuff Follows |
- X *--------------------------------------------------------------------*/
- void ANSI_MODE (void), CUB (void), CUD (void), CUF (void),
- X CUP (void), CUU (void), DA (void), DECSTBM (void), DECSC (void),
- X DECALN (void), DECRC (void), DSR (void), ED (void), EL (void),
- X RESET (void), RM (void), SGR (void), SM (void), TBC (void),
- X escA (void), escB (void), escC (void), escD (void), escE (void),
- X escF (void), escG (void), escH (void), escI (void),
- X escJ (void), escK (void), escM (void), escY (void), escZ (void);
- X
- X#define P_MAX 6 /* max no of parameter accumulators */
- X#define E_BUFF_MAX 11 /* max chars in escape interpreter buffer */
- X
- static int save_row, save_col,
- X save_attr, save_crlf,
- X initdone = '\0',
- X tab_stop[80],
- X special_graphics, ansi_mode,
- X appl_mode, DECKPNM,
- X vt_save_attr,
- X vt_save_row, vt_save_col,
- X vt_top, vt_bot,
- X vt_tlim, vt_blim,
- X vt_row, vt_col,
- X vt_crlf, vt_org,
- X vt_wrap, vt_xoff;
- X
- char ansi_cursor_set[] = "\\eO%c",
- X ansi_cursor_reset[] = "\\e[%c",
- X vt52_cursor[] = "\\e%c",
- X vt52_kp[] = "\\e?%c",
- X ansi_kp[] = "\\eO%c",
- X *kp_sptr, *cursor_sptr;
- X
- void vt_putf(char *,...),
- X vtpf_itoa (int),
- X vtput_char (char c),
- X VT_Put_Scr (char),
- X VT100_Cmd (char),
- X VT100_KB (char),
- X VT100_Out (char);
- X
- void
- vt100_driver ()
- X{
- X int chin, chout;
- X do
- X {
- X if (!(vt_xoff) && ((chin = xon8250_read ()) != -1))
- X if (chin &= *Cmask)
- X VT100_Cmd (chin);
- X if ((chout = _kb ()) != -1)
- X {
- X switch (chout)
- X {
- X case PF5:
- X tab_stop[vt_col] = TRUE;
- X break;
- X case PF6:
- X tab_stop[vt_col] = FALSE;
- X break;
- X case APF8:
- X xon8250_write_break ();
- X break;
- X case APF9:
- X spawnlp (0, "COMMAND.COM", "COMMAND.COM", (char *) 0);
- X print_screen_header ();
- X vt_row = 23; vt_col = 0;
- X rowcol (vt_row, vt_col);
- X break;
- X case APF10:
- X break;
- X default:
- X if (chout != APF1)
- X VT100_KB (chout);
- X break;
- X }
- X }
- X } while (chout != APF10);
- X}
- X
- X
- X
- X
- X/*--------------------------- VT100_Cmd () ---------------------------*/
- X/*
- X *
- X */
- static int p_ix = 0, p_acc [P_MAX] = { 0 };
- static char lastchar = '\0';
- void
- VT100_Cmd (char ch)
- X{
- X if (ch==BS)
- X {
- X if (vt_col)
- X {
- X rowcol (vt_row,--vt_col);
- X }
- X return;
- X }
- X if (lastchar && (ch==CAN || ch==SUB))
- X goto reset;
- X if (ch==DEL)
- X return;
- X
- X switch (lastchar)
- X {
- X default:
- X if (ch==ESC)
- X {
- X lastchar = ch;
- X while (p_ix >= 0)
- X p_acc [p_ix--] = 0;
- X p_ix = 0;
- X return;
- X }
- X VT100_Out (ch);
- X return;
- X case ESC:
- X switch (ch)
- X {
- X case ESC: return;
- X case '[':
- X case '(':
- X case ')':
- X case 'Y':
- X case '#': lastchar = ch; return;
- X case '7': DECSC (); goto reset;
- X case '8': DECRC (); goto reset;
- X case '<': ANSI_MODE (); goto reset;
- X case '>': DECKPNM = FALSE; goto reset;
- X case '=': DECKPNM = TRUE; goto reset;
- X case 'A': escA (); goto reset;
- X case 'B': escB (); goto reset;
- X case 'C': escC (); goto reset;
- X case 'D': escD (); goto reset;
- X case 'E': escE (); goto reset;
- X case 'F': escF (); goto reset;
- X case 'G': escG (); goto reset;
- X case 'H': escH (); goto reset;
- X case 'I': escI (); goto reset;
- X case 'J': ED (); goto reset;
- X case 'K': EL (); goto reset;
- X case 'M': escM (); goto reset;
- X case 'Z': escZ (); goto reset;
- X case 'c': RESET (); goto reset;
- X case 'y': goto reset;
- X default : VT100_Out (ch); goto reset;
- X }
- X case '[':
- X switch (ch)
- X {
- X case 'A': CUU (); goto reset;
- X case 'B': CUD (); goto reset;
- X case 'C': CUF (); goto reset;
- X case 'D': CUB (); goto reset;
- X case 'H':
- X case 'f': CUP (); goto reset;
- X case 'J': ED (); goto reset;
- X case 'K': EL (); goto reset;
- X case 'c': DA (); goto reset;
- X case 'g': TBC (); goto reset;
- X case 'h': SM (); goto reset;
- X case 'l': RM (); goto reset;
- X case 'm': SGR (); goto reset;
- X case 'n': DSR (); goto reset;
- X case 'q': goto reset;
- X case 'r': DECSTBM (); goto reset;
- X case ';': p_ix++;
- X case '?': return;
- X default:
- X if isdigit (ch)
- X {
- X p_acc [p_ix] *= 10;
- X p_acc [p_ix] += (ch-'0');
- X return;
- X }
- X VT100_Out (ch);
- X goto reset;
- X }
- X case '(':
- X case ')': goto reset;
- X case '#':
- X if (ch=='8')
- X DECALN ();
- X goto reset;
- X case 'Y':
- X p_acc [p_ix++] = ch - 31;
- X if (p_ix < 2)
- X break;
- X else
- X {
- X CUP ();
- X goto reset;
- X }
- X }
- X return;
- reset:
- X lastchar = '\0';
- X}
- X
- X
- X
- X
- X/*--------------------------- VT100_Out () ---------------------------*/
- X/*
- X *
- X */
- void
- VT100_Out (char ch)
- X{
- X switch (ch)
- X {
- X case BEL:
- X putchar (ch);
- X rowcol (vt_row, vt_col);
- X break;
- X case HT:
- X while (vt_col < 79)
- X if (tab_stop[++vt_col])
- X break;
- X rowcol(vt_row, vt_col);
- X break;
- X case DEL:
- X case ESC:
- X break;
- X default:
- X VT_Put_Scr (ch);
- X break;
- X }
- X}
- X
- X
- X
- X
- X/*------------------------- VT_Put_Scr () -------------------------*/
- X/*
- X *
- X */
- void
- VT_Put_Scr (char ch)
- X{
- X static char vt_wrapped = FALSE;
- X
- X if (vt_wrapped)
- X {
- X if (ch == CR)
- X return;
- X vt_wrapped = FALSE;
- X if (ch == LF)
- X return;
- X }
- X if (vt_row > vt_bot)
- X {
- X rowcol (vt_row=vt_bot, vt_col);
- X scroll_up (1, vt_top, 0, vt_bot, 79);
- X }
- X switch (ch)
- X {
- X case CR:
- X vt_col = 0;
- X rowcol (vt_row, vt_col);
- X if (vt_crlf == FALSE)
- X break;
- X case LF:
- X case VT:
- X case FF:
- X if (++vt_row > vt_bot)
- X scroll_up (1, vt_top, 0, vt_row=vt_bot, 79);
- X rowcol (vt_row, vt_col);
- X break;
- X default:
- X aput (Scr_ATTR, ch);
- X if (++vt_col > 79)
- X {
- X if (!vt_wrap)
- X rowcol (vt_row, --vt_col);
- X else
- X {
- X vt_col = 0;
- X vt_row++;
- X vt_wrapped = TRUE;
- X }
- X }
- X break;
- X }
- X}
- X
- X
- X
- X
- X/*---------------------------- DECALN () ----------------------------*/
- X/*
- X *
- X */
- void
- DECALN (void)
- X{
- X int i=1920;
- X rowcol (0, 0);
- X while (i--)
- X aput (Scr_ATTR, 'E');
- X rowcol (vt_row, vt_col);
- X}
- X/*----------------------------- DECSC () -----------------------------*/
- X/*
- X * ESC 7 - Save Cursor (DEC Private)
- X */
- void
- DECSC (void)
- X{
- X vt_save_row = vt_row;
- X vt_save_col = vt_col;
- X vt_save_attr = Scr_ATTR;
- X}
- X
- X
- X
- X
- X/*----------------------------- DECRC () -----------------------------*/
- X/*
- X * ESC 8 - Restore Cursor (DEC Private)
- X */
- void
- DECRC (void)
- X{
- X vt_row = vt_save_row;
- X vt_col = vt_save_col;
- X Scr_ATTR = vt_save_attr;
- X rowcol (vt_row, vt_col);
- X}
- X
- X
- X
- X
- X/*------------------------------ DSR () ------------------------------*/
- X/*
- X *
- X */
- void
- DSR (void)
- X{
- X switch (p_acc [0])
- X {
- X case 5: vt_putf ("\\e[0n"); break;
- X case 6: vt_putf ("\\e[%d;%dR", vt_row + 1, vt_col + 1); break;
- X default: break;
- X }
- X}
- X
- X
- X
- X
- X/*--------------------------- ANSI_MODE () ---------------------------*/
- X/*
- X * ESC < - Enter ANSI Mode
- X */
- void
- ANSI_MODE (void)
- X{
- X ansi_mode = TRUE;
- X kp_sptr = ansi_kp;
- X cursor_sptr = (appl_mode)? ansi_cursor_set: ansi_cursor_reset;
- X}
- X
- X
- X
- X
- X/*------------------------------ SGR () ------------------------------*/
- X/*
- X *
- X */
- void
- SGR (void)
- X{
- X char blink = FALSE,
- X bold = FALSE,
- X underscore = FALSE,
- X reverse = FALSE;
- X int i;
- X for (i = 0; i < P_MAX; i++)
- X switch (p_acc[i])
- X {
- X case 1:
- X bold = TRUE;
- X break;
- X case 4:
- X underscore = TRUE;
- X break;
- X case 5:
- X blink = TRUE;
- X break;
- X case 7:
- X reverse = TRUE;
- X break;
- X default:
- X break;
- X }
- X if (underscore)
- X {
- X Scr_ATTR = UNDERLINE;
- X if (reverse)
- X Scr_ATTR |= INVERSE;
- X }
- X else if (reverse)
- X Scr_ATTR = INVERSE;
- X else
- X Scr_ATTR = NORMAL;
- X if (bold)
- X Scr_ATTR |= BRIGHT;
- X if (blink)
- X Scr_ATTR |= BLINK;
- X}
- X
- X/*----------------------------- escA () -----------------------------*/
- X/*
- X *
- X */
- void
- escA (void)
- X{
- X if ((ansi_mode == FALSE) && (vt_row))
- X rowcol (--vt_row, vt_col);
- X}
- X
- X
- X
- X
- X/*----------------------------- escB () -----------------------------*/
- X/*
- X *
- X */
- void
- escB (void)
- X{
- X if ((ansi_mode == FALSE) && (vt_row < 23))
- X rowcol (++vt_row, vt_col);
- X}
- X
- X
- X
- X
- X/*----------------------------- escC () -----------------------------*/
- X/*
- X *
- X */
- void
- escC (void)
- X{
- X if ((ansi_mode == FALSE) && (vt_col < 79))
- X rowcol (vt_row, ++vt_col);
- X}
- X
- X
- X
- X
- X/*----------------------------- escD () -----------------------------*/
- X/*
- X *
- X */
- void
- escD (void)
- X{
- X if (ansi_mode)
- X if (vt_row < vt_bot)
- X rowcol (++vt_row, vt_col);
- X else
- X scroll_up (1, vt_top, 0, vt_bot, 79);
- X else if (vt_col)
- X rowcol (vt_row, --vt_col);
- X}
- X
- X
- X
- X
- X/*----------------------------- escE () -----------------------------*/
- X/*
- X *
- X */
- void
- escE (void)
- X{
- X if (ansi_mode)
- X {
- X vt_col = 0;
- X if (vt_row < vt_bot)
- X rowcol (++vt_row, vt_col);
- X else
- X {
- X scroll_up (1, vt_top, 0, vt_bot, 79);
- X rowcol (vt_row, vt_col);
- X }
- X }
- X}
- X
- X
- X
- X
- X/*----------------------------- escF () -----------------------------*/
- X/*
- X *
- X */
- void
- escF (void)
- X{
- X special_graphics = TRUE;
- X}
- X
- X
- X
- X
- X/*----------------------------- escG () -----------------------------*/
- X/*
- X *
- X */
- void
- escG (void)
- X{
- X special_graphics = FALSE;
- X}
- X
- X
- X
- X
- X/*----------------------------- escH () -----------------------------*/
- X/*
- X *
- X */
- void
- escH (void)
- X{
- X if (ansi_mode)
- X {
- X tab_stop [vt_col] = TRUE;
- X return;
- X }
- X vt_row = vt_col = 0;
- X rowcol (vt_row, vt_col);
- X}
- X
- X
- X
- X
- X/*----------------------------- escI () -----------------------------*/
- X/*
- X *
- X */
- void
- escI (void)
- X{
- X if (ansi_mode == FALSE)
- X if (vt_row > vt_top)
- X rowcol (--vt_row, vt_col);
- X else
- X {
- X scroll_dn (1, vt_top, 0, vt_bot, 79);
- X rowcol (vt_row, vt_col);
- X }
- X}
- X
- X
- X
- X
- X/*----------------------------- escJ () -----------------------------*/
- X/*
- X *
- X */
- void
- escJ (void)
- X{
- X if (ansi_mode == FALSE)
- X {
- X clrscrn ();
- X rowcol (vt_row, vt_col);
- X }
- X}
- X
- X
- X
- X
- X/*----------------------------- escK () -----------------------------*/
- X/*
- X *
- X */
- void
- escK (void)
- X{
- X if (ansi_mode == FALSE)
- X scroll_up (0, vt_row, vt_col, vt_row, 79);
- X}
- X
- X
- X
- X
- X/*----------------------------- escM () -----------------------------*/
- X/*
- X *
- X */
- void
- escM (void)
- X{
- X if (ansi_mode)
- X if (vt_row > vt_top)
- X rowcol (--vt_row, vt_col);
- X else
- X {
- X scroll_dn (1, vt_top, 0, vt_bot, 79);
- X rowcol (vt_row, vt_col);
- X }
- X}
- X
- X
- X
- X
- X/*----------------------------- escZ () -----------------------------*/
- X/*
- X *
- X */
- void
- escZ (void)
- X{
- X vt_putf ("\\e/Z");
- X}
- X
- X
- X
- X
- X/*------------------------------ DA () ------------------------------*/
- X/*
- X *
- X */
- void
- DA (void)
- X{
- X vt_putf ("\\e[?1;0c");
- X}
- X
- X
- X
- X
- X/*------------------------------ CUU () ------------------------------*/
- X/*
- X * ESC [ Pn A - Cursor Up
- X */
- void
- CUU (void)
- X{
- X do
- X {
- X if (vt_row > vt_tlim)
- X rowcol (--vt_row, vt_col);
- X } while (--p_acc[0] > 0);
- X}
- X
- X
- X
- X
- X/*------------------------------ CUD () ------------------------------*/
- X/*
- X * ESC [ Pn B - Cursor Down
- X */
- void
- CUD (void)
- X{
- X do
- X {
- X if (vt_row < vt_blim)
- X rowcol (++vt_row, vt_col);
- X } while (--p_acc[0] > 0);
- X}
- X
- X
- X
- X
- X/*------------------------------ CUF () ------------------------------*/
- X/*
- X * ESC [ Pn C - Cursor Forward
- X */
- void
- CUF (void)
- X{
- X do
- X {
- X if (vt_col < 79)
- X rowcol (vt_row, ++vt_col);
- X } while (--p_acc[0] > 0);
- X}
- X
- X
- X
- X
- X/*------------------------------ CUB () ------------------------------*/
- X/*
- X * ESC [ Pn D - Cursor Backward
- X */
- void
- CUB (void)
- X{
- X do
- X {
- X if (vt_col)
- X rowcol (vt_row, --vt_col);
- X } while (--p_acc[0] > 0);
- X}
- X
- X
- X
- X
- X/*------------------------------ CUP () ------------------------------*/
- X/*
- X * ESC [ Pn ; Pn H - Cursor Position
- X * or
- X * ESC [ Pn ; Pn f - Horizontal and Vertical Position
- X */
- void
- CUP (void)
- X{
- X if (p_acc[0])
- X --p_acc[0];
- X if (p_acc[1])
- X --p_acc[1];
- X vt_row = p_acc[0] + vt_tlim; vt_col = p_acc[1];
- X vt_row = (vt_row<24)?vt_row:23;
- X vt_col = (vt_col<80)?vt_col:79;
- X if (vt_row <= vt_blim)
- X rowcol (vt_row, vt_col);
- X}
- X
- X
- X
- X
- X/*------------------------------ ED () ------------------------------*/
- X/*
- X * ESC [ Ps J - Erase in Display
- X */
- void
- XED (void)
- X{
- X int ch;
- X if (vt_row < vt_top || vt_row > vt_bot)
- X return;
- X switch (p_acc[0])
- X {
- X case 0: /* from current cursor position to end of page */
- X scroll_up (0, vt_row, vt_col, vt_row, 79);
- X if (vt_row < vt_bot)
- X scroll_up (0, vt_row+1, 0, vt_bot, 79);
- X break;
- X case 1: /* from start of screen to current position */
- X if (vt_row > vt_top)
- X scroll_up (0, vt_top, 0, vt_row-1, 79);
- X scroll_up (0, vt_row, 0, vt_row, vt_col);
- X break;
- X case 2:
- X scroll_up (0, vt_top, 0, vt_bot, 79);
- X break;
- X default:
- X break;
- X }
- X}
- X
- X
- X
- X
- X/*------------------------------ EL () ------------------------------*/
- X/*
- X * ESC [ Ps K - Erase In Line
- X */
- void
- XEL (void)
- X{
- X int ch;
- X if (vt_row < vt_top || vt_row > vt_bot)
- X return;
- X switch (p_acc[0])
- X {
- X case 0:
- X scroll_up (0, vt_row, vt_col, vt_row, 79);
- X break;
- X case 1: /* from start of line to current position */
- X scroll_up (0, vt_row, 0, vt_row, vt_col);
- X break;
- X case 2:
- X scroll_up (0, vt_row, 0, vt_row, 79);
- X break;
- X default:
- X break;
- X }
- X}
- X
- X
- X
- X
- X/*------------------------------ TBC () ------------------------------*/
- X/*
- X * ESC [ Ps g - Tabulation Clear
- X */
- void
- TBC (void)
- X{
- X int i;
- X if (p_acc[0] == 0)
- X tab_stop [vt_col] = FALSE;
- X else if (p_acc[0] == 3)
- X for (i = 0; i < 80; i++)
- X tab_stop [i] = FALSE;
- X}
- X
- X
- X
- X
- X/*------------------------------ SM () ------------------------------*/
- X/*
- X * ESC [ Ps ; ... ; Ps h - Set Mode
- X */
- void
- SM (void)
- X{
- X int i;
- X for (i = 0; i < P_MAX; i++)
- X switch (p_acc[i])
- X {
- X case 1:
- X appl_mode = TRUE;
- X cursor_sptr = ansi_cursor_set;
- X break;
- X case 5:
- X Scr_ATTR = INVERSE;
- X break;
- X case 6:
- X vt_org = TRUE;
- X vt_tlim = vt_row = vt_top;
- X vt_blim = vt_bot;
- X vt_col = 0;
- X rowcol (vt_row, vt_col);
- X break;
- X case 7:
- X vt_wrap = TRUE;
- X break;
- X case 20:
- X vt_crlf = TRUE;
- X break;
- X }
- X}
- X
- X
- X
- X
- X/*-------------------------- RM () --------------------------*/
- X/*
- X * ESC [ Ps l - Reset Mode
- X */
- void
- RM (void)
- X{
- X int i;
- X for (i = 0; i < P_MAX; i++)
- X switch (p_acc[i])
- X {
- X case 1:
- X appl_mode = FALSE;
- X cursor_sptr = ansi_cursor_reset;
- X break;
- X case 2:
- X ansi_mode = FALSE;
- X cursor_sptr = vt52_cursor;
- X kp_sptr = vt52_kp;
- X break;
- X case 5:
- X Scr_ATTR = NORMAL;
- X break;
- X case 6:
- X vt_org = FALSE;
- X vt_row = vt_tlim = 0; vt_col = 0;
- X vt_blim = 23;
- X rowcol (vt_row, vt_col);
- X break;
- X case 7:
- X vt_wrap = FALSE;
- X break;
- X case 20:
- X vt_crlf = FALSE;
- X break;
- X }
- X}
- X
- X
- X
- X
- X/*---------------------------- DECSTBM () ----------------------------*/
- X/*
- X *
- X */
- void
- DECSTBM (void)
- X{
- X if (p_acc [0]) p_acc [0]--;
- X if (p_acc [1]) p_acc [1]--;
- X if (p_acc[1] > p_acc[0])
- X {
- X vt_top = p_acc[0];
- X vt_bot = (p_acc[1] < 24) ? p_acc [1]: 23;
- X vt_tlim = (vt_org) ? vt_top: 0;
- X vt_blim = (vt_org) ? vt_bot: 23;
- X vt_row = vt_tlim; vt_col = 0;
- X rowcol (vt_row, vt_col);
- X }
- X}
- X
- X
- X
- X
- X/*----------------------------- RESET () -----------------------------*/
- X/*
- X *
- X */
- void
- RESET (void)
- X{
- X int i;
- X appl_mode = DECKPNM = FALSE;
- X ansi_mode = vt_wrap = TRUE;
- X cursor_sptr = ansi_cursor_reset;
- X kp_sptr = ansi_kp;
- X vt_tlim = vt_top = 0;
- X vt_blim = vt_bot = 23;
- X vt_crlf = (*CrLf == 'Y')? 1: 0;
- X vt_xoff = vt_org = FALSE;
- X p_ix = 0;
- X for (i = 0; i < 80; i++)
- X tab_stop[i] = '\0';
- X i = g_rowcol ();
- X vt_row = i / 256; vt_col = i % 256;
- X lastchar = '\0';
- X}
- X
- X
- X
- X
- X/*-------------------------- VT100_init () --------------------------*/
- X/*
- X *
- X */
- void
- VT100_init ()
- X{
- X int i;
- X if (initdone == FALSE)
- X {
- X appl_mode = DECKPNM = FALSE;
- X ansi_mode = vt_wrap = TRUE;
- X cursor_sptr = ansi_cursor_reset;
- X kp_sptr = ansi_kp;
- X vt_tlim = vt_top = 0;
- X vt_blim = vt_bot = 23;
- X vt_crlf = (*CrLf == 'Y')? 1: 0;
- X vt_xoff = vt_org = FALSE;
- X p_ix = 0;
- X for (i = 0; i < 80; i++)
- X tab_stop[i] = '\0';
- X i = g_rowcol ();
- X vt_row = i / 256; vt_col = i % 256;
- X lastchar = '\0';
- X initdone = TRUE;
- X }
- X for (i = 0; i < P_MAX; i++)
- X p_acc[i] = 0;
- X p_ix = 0;
- X rowcol (vt_row, vt_col);
- X}
- X
- X
- X
- X
- X/*--------------------------- VT100_KB () ---------------------------*/
- X/*
- X *
- X */
- void
- VT100_KB (char ch)
- X{
- X if ((ch >= PF1) && (ch <= PF4))
- X vt_putf (kp_sptr, ('P' + ch - PF1));
- X else if ((ch >= SPF1) && (ch <= SPF10))
- X if (ch == SPF10)
- X if (DECKPNM)
- X vt_putf (kp_sptr, 'p');
- X else
- X vtput_char ('0');
- X else if (DECKPNM)
- X vt_putf (kp_sptr, ('q' + ch - SPF1));
- X else
- X vtput_char (ch - SPF1 + '1');
- X else if ((ch >= UPCHAR) && (ch <= LFCHAR))
- X vt_putf (cursor_sptr, (ch - UPCHAR + 'A'));
- X else
- X switch (ch)
- X {
- X case PF7:
- X if (DECKPNM)
- X vt_putf (kp_sptr, 'm');
- X else
- X vtput_char ('-');
- X break;
- X case PF8:
- X if (DECKPNM)
- X vt_putf (kp_sptr, 'l');
- X else
- X vtput_char (',');
- X break;
- X case PF9:
- X if (DECKPNM)
- X vt_putf (kp_sptr, 'n');
- X else
- X vtput_char ('.');
- X break;
- X case PF10:
- X if (DECKPNM)
- X vt_putf (kp_sptr, 'M');
- X else
- X vtput_char (CR);
- X break;
- X case HCHAR:
- X vt_putf (cursor_sptr, 'H');
- X break;
- X case DEL1:
- X vtput_char (*RubOut);
- X break;
- X case BS:
- X vtput_char (*BackSpace);
- X break;
- X default:
- X vtput_char (ch);
- X break;
- X }
- X}
- X
- X
- X
- void vt_putf(cp, cv)
- char *cp; int cv;
- X
- X{
- X char c;
- X int *cvp,i;
- X
- X cvp = &cv;
- X while(*cp)
- X switch(c = *cp++)
- X {
- X case '\\':
- X vtput_char((c = *cp++) == 'e' ? ESC : c);
- X break;
- X case '%':
- X switch (c = *cp++)
- X {
- X case 'c':
- X vtput_char (*cvp++);
- X break;
- X case 'n':
- X c = *cp++;
- X while (!xon8250_write_buffer_empty ())
- X ;
- X for (i = 1000 * (c - '0'); i > 0; i--)
- X ;
- X break;
- X case 'd':
- X vtpf_itoa (*cvp++);
- X break;
- X default:
- X break;
- X }
- X break;
- X default:
- X vtput_char(c);
- X break;
- X }
- X}
- X
- X
- void
- vtput_char (char c)
- X{
- X int i;
- X if (*Duplex == 'H')
- X VT100_Cmd (c);
- X while (xon8250_write (c) == -1)
- X ;
- X if (c==XOFF)
- X vt_xoff = TRUE;
- X else if (c==XON)
- X vt_xoff = FALSE;
- X}
- X
- static char vtpf_str [6];
- X
- void vtpf_itoa (int i)
- X{
- X char *cp;
- X cp = vtpf_str;
- X *cp = '\0';
- X i = (i < 0) ? -i: i;
- X while (i)
- X {
- X *cp++ = (i % 10) + '0';
- X i /= 10;
- X }
- X while (--cp >= vtpf_str)
- X {
- X if (*Duplex == 'H')
- X VT100_Cmd (*cp);
- X while (xon8250_write (*cp) == -1)
- X ;
- X }
- X}
- X
- X
- void
- vt_scrup (int cnt, int tr, int tc, int br, int bc)
- X{
- X char sv_atr;
- X sv_atr = Scr_ATTR;
- X if (Scr_ATTR != 0x70 && Scr_ATTR != 0x79)
- X Scr_ATTR = NORMAL;
- X scroll_up (cnt, tr, tc, br, bc);
- X Scr_ATTR = sv_atr;
- X}
- X
- END_OF_FILE
- if test 20360 -ne `wc -c <'vt100.c'`; then
- echo shar: \"'vt100.c'\" unpacked with wrong size!
- fi
- # end of 'vt100.c'
- fi
- echo shar: End of archive 3 \(of 3\).
- cp /dev/null ark3isdone
- MISSING=""
- for I in 1 2 3 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 3 archives.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
- +----------------------
- | John Birchfield
- | jb@altair.csustan.edu
- +----------------------
-
-
-