/* Terminal Initialization for TVI 950 by Richard Conn The purpose of this program is to quickly initialize the TVI 950 to a desired state. Only a file name is allowed, and this program has to be reassembled in order to change the initialization parameters. */ #define version 11 /* Version Number */ /* Header File */ #include "a:bdscio.h" /* File Name and Mode Strings */ #define configfile "STD.CFG" /* File Name */ #define configtype ".CFG" /* Data File Type */ #define configmode 0 /* Read/Only */ /* Basic Constants */ #define strlen 100 /* Max number of chars in a string */ #define ESC 0x1b /* Escape code */ #define CR '\r' /* Carriage Return */ #define BEL 0x07 /* Ring Bell */ #define CTRLH 0x08 /* Backspace Char */ #define CTRLL 0x0c /* Cursor Back */ #define CTRLU 0x15 /* Delete Line Char */ #define CTRLX 0x18 /* Delete Line Char */ #define RUBOUT 0x7f /* Backspace Char */ #define FALSE 0 #define TRUE -1 #define echo TRUE #define noecho FALSE #define YES 'Y' #define NO 'N' /* Buffer Sizes */ #define ullen 81 /* User Line Length of ULBUFFER */ #define tablen 80 /* Length of TABBUFFER */ #define fkeylen 464 /* Length of FKEYBUFFER */ /* Cursor Positioning */ #define gotoxy '=' /* Position Cursor */ /* Clear Screen */ #define clear '+' /* Clear screen */ /* Function Keys */ #define fctkey '|' /* Begin function key definition */ #define fctend 0x19 /* Ctrl-Y for end function key definition */ #define ctrlp 0x10 /* Control-P for char ESCAPE in Fct Key cmd */ /* User Line */ #define loadusr 'f' /* Load User Line */ #define dispusr 'g' /* Display User Line */ #define dispst 'h' /* Display Status Line */ /* Scrolling */ #define sscroll '8' /* Enable Smooth Scrolling */ #define hscroll '9' /* Enable Hard Scrolling (no Smooth Scrolling) */ /* Tabs */ #define tabclr '3' /* Clear All Tabs */ #define tabset '1' /* Set Tab at Cursor */ /* Video */ #define vidnorm 'd' /* Normal (white on black) Video */ #define vidrev 'b' /* Reverse (black on white) Video */ /* Key Click */ #define clkon '>' /* Keyclick ON */ #define clkoff '<' /* Keyclick OFF */ /* Cursor Type */ #define curs '.' /* Set cursor attribute */ /* Single-char settings */ #define cls '+' /* Clear Screen */ #define unlock '"' /* Unlock Keyboard */ #define nograph '%' /* Graphics Mode OFF */ #define noprot 0x27 /* Protect Mode OFF */ #define normi '(' /* Normal Intensity */ #define notabs '3' /* Clear All Tabs */ #define noclick '<' /* Key Click OFF */ #define nocopy 'A' /* Copy Print Mode OFF */ #define cmode 'C' /* Conversation Mode ON (Block Mode OFF) */ #define fdx 'F' /* Full Duplex */ #define nomonit 'X' /* Clear Monitor Mode */ #define nobufpr 'a' /* Buffer Print OFF */ #define vid1 'd' /* White on Black */ #define nopage 'w' /* Auto Page OFF */ /* String Settings */ #define videom "G0" /* Normal Video */ #define insert "e " /* Set Insert Char to */ char iobuf[BUFSIZ]; char ulbuffer[ullen], tabbuffer[tablen], fkeybuffer[fkeylen]; char cursor, click, scroll, uline, video, tabs, fkeys; main(argc,argv) int argc; char **argv; { char *argstr; banner(); /* Print Banner */ tinit(); /* Initialize terminal */ switch (argc) { case 1 : readfile(configfile); /* Program from default */ program(); break; case 2 : argstr = argv[1]; /* Pt to first arg */ if (*argstr == '/') help(); else { readfile(argstr); /* Program from file */ program(); } break; default : help(); break; } exit(TRUE); } /* End of Mainline */ help() /* HELP File */ { banner(); /* Print Banner */ printf("\nTerminal Initialization for TVI 950"); printf("\n\n\tThis program is invoked in one of two ways --"); printf("\n\t\tTINIT <-- Initialize from %s File",configfile); printf("\n\t\tTINIT filename.typ <-- Initialize from file"); printf("\n\t\t\t\t(typ defaults to CFG)\n"); } banner() /* Print Banner of Program */ { printf("\nTINIT Version %d.%d\n",version/10,version%10); } readfile(name) /* Read Indicated File */ char *name; { int fd, i, type, inch; char newfile[20], filename[20], *ptr; ptr = name; /* Copy passed name into FILENAME */ type = FALSE; i = 0; while (*ptr != '\0') { if (*ptr == '.') type = TRUE; /* Note if file type given */ filename[i++] = *ptr++; } filename[i] = '\0'; if (!type) strcat (filename,configtype); /* Set default file type */ fd = fopen (filename, iobuf); /* Try to open file */ if (fd == ERROR) { /* If failure, try to open file on A: */ newfile[0] = '\0'; strcat (newfile,"A:"); strcat (newfile,filename); fd = fopen (newfile, iobuf); if (fd == ERROR) { /* If this fails, give error */ printf("File %s not found", filename); exit (FALSE); } } /* Read in parameters from disk file */ inch = getc(iobuf); if (inch == ERROR) abort(); cursor = inch; inch = getc(iobuf); if (inch == ERROR) abort(); fkeys = inch; inch = getc(iobuf); if (inch == ERROR) abort(); click = inch; inch = getc(iobuf); if (inch == ERROR) abort(); scroll = inch; inch = getc(iobuf); if (inch == ERROR) abort(); tabs = inch; inch = getc(iobuf); if (inch == ERROR) abort(); uline = inch; inch = getc(iobuf); if (inch == ERROR) abort(); video = inch; getc(iobuf); getc(iobuf); /* Ignore */ if (uline == YES) readbuffer (ulbuffer, ullen); if (tabs == YES) readbuffer (tabbuffer, tablen); if (fkeys == YES) readbuffer (fkeybuffer, fkeylen); fclose(iobuf); } readbuffer (bufname, buflen) /* Read into the buffer pted to by bufname */ char *bufname; int buflen; { int i, inch; char *bptr; bptr = bufname; for (i=1;i<=buflen;i++) { inch = getc(iobuf); if (inch == ERROR) abort(); *bptr++ = inch; } getc(iobuf); getc(iobuf); /* Flush */ } program() /* Program the Terminal */ { char *pstr; int i; char fch; printf("%c%c%c",ESC,curs,cursor); /* Config Cursor Type */ if (fkeys == YES) { /* Program Function Keys */ for (i=1;i<=22;i++) { pstr = fkeybuffer + (i-1)*20; fch = i+'1'-1; if (*pstr != '\0') printf("%c%c%c%s%c",ESC,fctkey,fch,pstr,fctend); } } cmnd(click); /* Set Key Click */ cmnd(scroll); /* Set Scrolling */ if (tabs == YES) { /* Set Tab Stops */ cmnd(tabclr); /* Clear ALL Tab Stops */ printf("\n"); pstr = tabbuffer; for (i=1;i<=80;i++) { if (*pstr++ == '.') cmnd(tabset); putchar(' '); } printf("\n"); sleep(2); /* Delay 0.2 sec */ } if (uline == YES) { /* Program User Line */ printf("%c%c%s%c",ESC,loadusr,ulbuffer,'\r'); cmnd(dispusr); } sleep(2); /* Delay 0.2 sec */ cmnd(video); cmnd(cls); /* New Screen */ } tinit() /* Initialize Terminal */ { cmnd (unlock); cmnd (nograph); cmnd (noprot); cmnd (normi); cmnd (notabs); cmnd (noclick); cmnd (nocopy); cmnd (cmode); cmnd (fdx); cmnd (nomonit); cmnd (nobufpr); cmnd (vid1); cmnd (nopage); cmnds (videom); cmnds (insert); sleep(2); /* Delay 0.2 sec */ } abort() /* Abort to CP/M */ { printf("\nFatal Error in Data File -- Aborting\n"); exit(FALSE); } cmnd (ch) /* Issue single-character command */ char ch; { putchar(ESC); putchar(ch); } cmnds (st) /* Issue String command */ char *st; { printf("%c%s",ESC,st); }  .