home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
modem
/
cvt100.arc
/
VTTIO.C
< prev
Wrap
Text File
|
1988-08-03
|
18KB
|
653 lines
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define NORMAL 0x7 /* Normal video attribute */
#define BOLD 0x8 /* Bold video attribute */
#define UNDERLINED 0xA /* Underlined video attribute */
#define REVERSE 0x70 /* Reverse video attribute */
/****************************************************************************/
/* Function prototypes */
void VTInit( void );
void ConOut( unsigned char );
static void atnrm( unsigned char );
static void (*ttstate)() = atnrm;
static void atescf( unsigned char );
static void AnsiParse( unsigned char );
static void ExtParse( unsigned char );
static void AnsiModeSet( char, int );
static void ExtModeSet( char, int );
static void SetChar0( unsigned char );
static void SetChar1( unsigned char );
static void SetDouble( unsigned char );
static void TransmitId( void );
static void VTBell( void );
/****************************************************************************/
/* Global variables */
unsigned originmode; /* Origin mode, relative or absolute */
unsigned insertmode; /* Insert mode, off or on */
unsigned autowrap; /* Automatic wrap mode, off or on */
unsigned newline; /* Newline mode, off or on, GLOBAL data!*/
unsigned cursorvisible; /* Cursor visibility, on or hidden */
unsigned reversebackground; /* Reverse background attribute, on or off*/
unsigned screenwid; /* Screen column width */
unsigned char log; /* Flag to indicate char logging is on */
/****************************************************************************/
/* External variables */
/****************************************************************************/
/* Local static data */
char term_id_str[]= "[?1;2c"; /* VT100 id string */
#define lansarg 10 /* Max number of ANSI arguments */
static int nansarg = 0; /* Index for ANSI argument list */
static int ansargs[lansarg]; /* Room for 10 ANSI arguments */
static unsigned char lastc; /* Saved last character */
/*****************************************************************************/
/*****************************************************************************/
/* V T I N I T -- */
void VTinit() {
if (GetVTSetup() == 0) { /* If there are no saved values for */
screenwid = 80; /* VT emulation parameters then provid'em */
newline = 0;
autowrap = 0;
insertmode = 0;
cursorvisible = 1;
reversebackground = 0;
log = 0;
}
Setvattr( NORMAL );
ttstate = atnrm; /* initial output state is normal */
SetScroll(0,0);
ClearScreen();
SetCharSet(0, 'B');
SetCharSet(1, 'B');
MapCharSet(0);
ClearAllTabs();
InitTabs();
SetScreenWidth(screenwid);
SetCursorVisibility(cursorvisible);
SetBackGround(reversebackground);
SetCurs(1,1);
SaveCursor();
lastc = '\0';
}
/* C O N O U T -- Put a character to the terminal screen */
void ConOut(unsigned char c) {
(*ttstate) (c);
if (log)
writelog(c);
lastc = c;
}
/* A T N R M -- local routine to process an arbitrary character */
static void atnrm(c) unsigned char c; {
if ( c >= 32 && c < 0x80 )
chrwrite(c);
else switch (c) {
case 27: /* Escape */
ttstate = atescf; /* next state parser is esc follower */
break;
case '\r': /* Carriage return */
SetCurs(1,0);
break;
case '\n': /* Line feed */
if (newline)
SetCurs(1,0);
case 11: /* Vertical tab */
case 12: /* Form feed */
ScrollUp();
break;
case '\a': /* Ring terminal bell */
VTBell();
break;
case 8: /* back space */
SetRelCurs( -1, 0 );
break;
case '\t': /* Horizontal tab */
DoTab();
break;
case 14: /* Map G1 to current */
MapCharSet(1);
break;
case 15: /* Map G0 to current */
MapCharSet(0);
break;
case 5: /* transmit answer back */
break;
default:
}
}
/* A T E S C F -- escape sequence follower */
static void atescf(c) unsigned char c; {
register char *termid = term_id_str;
switch (c) {
case '[': /* Parse ansi args */
memset(ansargs,0,sizeof(ansargs));
nansarg = 0;
ttstate = AnsiParse;
break;
case 'D': /* Index */
ScrollUp();
ttstate = atnrm;
break;
case 'E': /* Carriage return/line feed combination */
SetCurs(1,0);
ScrollUp();
ttstate = atnrm;
break;
case 'M': /* Reverse Index */
ScrollDown();
ttstate = atnrm;
break;
case 'H': /* Set a tab stop */
SetTabStop();
ttstate = atnrm;
break;
case '7': /* Save cursor description */
SaveCursor();
ttstate = atnrm;
break;
case '8': /* Restore cursor description */
RestoreCursor();
ttstate = atnrm;
break;
case '=': /* Enable application keypad */
SetKeyPad(1);
ttstate = atnrm;
break;
case '>': /* Enable numeric keypad */
SetKeyPad(0);
ttstate = atnrm;
break;
case 'c': /* Reset terminal to power on values */
VTInit();
ttstate = atnrm;
break;
case '(': /* Select character set G0 */
ttstate = SetChar0;
break;
case ')': /* Select character set G1 */
ttstate = SetChar1;
break;
case '#': /* Set double high/wide characters */
ttstate = SetDouble;
break;
case 24:
case 26: /* Cancel escape sequence */
ttstate = atnrm;
break;
case 'Z': /* Transmit the terminal ID */
TransmitId();
ttstate = atnrm;
break;
case '\\':
ttstate = atnrm;
break;
case '<':
ttstate = atnrm;
break;
case 'P':
ttstate = atnrm;
break;
case '*':
ttstate = atnrm;
break;
default: /* unrecognized so ignore */
ttstate = atnrm;
break;
}
}
/* A N S I P A R S E -- parse ansi arguments */
static void AnsiParse(c) unsigned char c; {
register int i;
register int j;
c &= 0x7F;
switch(c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ansargs[nansarg] = (ansargs[nansarg] * 10) + ( c - '0');
break;
case ';': /* Argument separator */
if ( ++nansarg > lansarg)
ttstate = atnrm;
break;
case 'h': /* Set ANSI mode */
for( i = 0, ++nansarg; i < nansarg && i <= lansarg; i++)
AnsiModeSet(ansargs[i],1);
ttstate = atnrm;
break;
case 'l': /* Reset ANSI mode */
for( i = 0, ++nansarg; i < nansarg && i <= lansarg; i++)
AnsiModeSet(ansargs[i],0);
ttstate = atnrm;
break;
case 'H': /* Address cursor to line and column */
case 'f':
i = ansargs[0];
j = ansargs[1];
if ( i == 0)
i = 1;
if ( j == 0)
j = 1;
SetCurs(j,i);
ttstate = atnrm;
break;
case 'J': /* Erase screen */
if (ansargs[0] == 0){ /* from cursur to end of the screen */
ClearEOS();
}
else if (ansargs[0] == 1){ /* from home position to cursur */
ClearBOS();
}
else if (ansargs[0] == 2){ /* whole screen */
ClearScreen();
}
ttstate = atnrm;
break;
case 'K': /* Erase Line */
if (ansargs[0] == 0) /* from cursur to end of the line */
ClearEOL();
else if (ansargs[0] == 1) /* start of line to cursur */
ClearBOL();
else if (ansargs[0] == 2){ /* whole line */
ClearBOL();
ClearEOL();
}
ttstate = atnrm;
break;
case 'm': /* Select screen attribute */
ttstate = atnrm;
if ( ++nansarg <= lansarg) {
for ( i = 0; i < nansarg; i++) {
switch (ansargs[i]) {
case 0:
case 22:
if (i == 0)
SetVattr( NORMAL );
else
AddVattr(NORMAL);
break;
case 1:
if (i == 0)
SetVattr( BOLD);
else
AddVattr(BOLD);
break;
case 2:
SubVattr( BOLD );
break;
case 4:
if (i == 0)
SetVattr( UNDERLINED );
else
AddVattr( UNDERLINED );
break;
case 5:
if (i == 0)
SetVattr( BLINK );
else
AddVattr( BLINK );
break;
case 7:
if (i == 0)
SetVattr( REVERSE );
else
AddVattr( REVERSE );
break;
case 24:
SubVattr( UNDERLINED );
break;
case 25:
SubVattr( BLINK );
break;
case 27:
SubVattr( REVERSE );
break;
default:
break;
}
}
}
break;
case '?': /* Extended mode set/reset */
if (lastc == '[')
ttstate = ExtParse;
else
ttstate = atnrm;
break;
case 'r': /* Define scrolling region */
SetScroll(ansargs[0],ansargs[1]);
ttstate = atnrm;
break;
case 'A': /* Move cursor up */
if (ansargs[0] == 0)
SetRelCurs(0,-1);
else
SetRelCurs(0,-ansargs[0]);
ttstate = atnrm;
break;
case 'B': /* Move cursor down */
if (ansargs[0] == 0)
SetRelCurs(0,1);
else
SetRelCurs(0,ansargs[0]);
ttstate = atnrm;
break;
case 'C': /* Move cursor right */
if (ansargs[0] == 0)
SetRelCurs(1,0);
else
SetRelCurs(ansargs[0],0);
ttstate = atnrm;
break;
case 'D': /* Move cursor left */
if (ansargs[0] == 0)
SetRelCurs(-1,0);
else
SetRelCurs(-ansargs[0],0);
ttstate = atnrm;
break;
case 'g': /* Tab stop set/reset */
if (ansargs[0] == 0)
ClearTabStop();
else if (ansargs[0] == 3)
ClearAllTabs();
ttstate = atnrm;
break;
case 'c': /* Transmit the terminal ID */
TransmitId();
break;
case 24:
case 26: /* Cancel escape sequence */
ttstate = atnrm;
break;
default: /* unrecognized so ignore */
ttstate = atnrm;
break;
}
}
/* E X T P A R S E -- Parse extended mode Set/Reset */
static void ExtParse(unsigned char c) {
register int i;
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ansargs[nansarg] = (ansargs[nansarg] * 10) + ( c - '0');
break;
case ';': /* Argument separator */
if ( ++nansarg > lansarg)
ttstate = atnrm;
break;
case 'h':
for( i = 0, ++nansarg; i < nansarg && i <= lansarg; i++)
ExtModeSet(ansargs[i],1);
ttstate = atnrm;
break;
case 'l':
for( i = 0, ++nansarg; i < nansarg && i <= lansarg; i++)
ExtModeSet(ansargs[i],0);
ttstate = atnrm;
break;
case 24:
case 26: /* Cancel escape sequence */
ttstate = atnrm;
break;
default:
ttstate = atnrm;
break;
}
}
/* A N S I M O D E S E T -- Set/Reset ANSI mode , ESC [ P1,,, Pn h/l */
static void AnsiModeSet( char c, register int mode) {
switch (c ) {
case 2: /* Lock/unlock keyboard */
break;
case 4: /* Insert/Replace setting */
insertmode = mode;
break;
case 12: /* Echo */
break;
case 20: /* New Line mode */
newline = mode;
break;
default:
break;
}
}
/* E X T M O D E S E T -- Set/Reset extended mode after ESC [ ? */
static void ExtModeSet(char c, int mode) {
switch (c) {
case 1:
SetCursorKey(mode); /* set cursor key mode */
break;
case 3: /* Set the screen width */
if (mode)
SetScreenWidth(132);
else
SetScreenWidth(80);
break;
case 4: /* Jump/smooth scroll (not supported) */
break;
case 5: /* Set the background attribute */
SetBackGround(mode);
break;
case 6: /* Set the scrolling origin */
originmode = mode;
break;
case 7: /* set the autowrap mode */
autowrap = mode;
break;
case 8: /* Auto repeat on/off */
break;
case 18: /* Page print terminator */
break;
case 19: /* Print region */
break;
case 25: /* Display/Hide cursor */
SetCursorVisibility(mode);
break;
default:
break;
}
}
/* A T C H R S E T 0 -- Set the current character set for G0 */
void SetChar0( unsigned char c) {
SetCharSet( 0, c );
ttstate = atnrm;
}
/* A T C H R S E T 1 -- Set the current character set for G1 */
void SetChar1( unsigned char c) {
SetCharSet( 1, c );
ttstate = atnrm;
}
/* S E T D O U B L E -- Set the current line to double high and/or wide */
void SetDouble( unsigned char c) {
switch (c) {
case '5': /* Single width */
case '6': /* Double width */
case '3': /* Double height/width */
case '4': /* Bottom half of double height/width */
default:
}
ttstate = atnrm;
}
/* T R A N S M I T I D -- Transmit the terminal id to the host */
static void TransmitId() {
register char *termid = term_id_str;
ttoc(27);
while(*termid != '\0') /* Do until end of id string */
ttoc(*termid++); /* Transmit each character of string */
}
/* V T B E L L -- Do a VT100 style bell */
static void VTBell() {
sound(880);
delay(125);
nosound();
}