PROGRAM INSTALL;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{+ WRITTEN BY:		 Raymond E. Penley		+}
{+ DATE WRITTEN:	 September 19, 1981		+}
{+							+}
{+ SUMMARY:						+}
{+    Writes a data file 'TERMIO.FIL' that may be used	+}
{+  by a User Prgm for different terminal types without +}
{+  having to rewrite the source prgm.			+}
{+							+}
{+ NOTES:						+}
{+   The variable definitions for all the terminals	+}
{+  are not complete.  Please modify for your terminal	+}
{+  and send a copy of the changes to the Pascal/Z	+}
{+  Users' Group.  Thank you.                           +}
{+							+}
{+    writes()	       - write a sequence to console	+}
{+    puts()	       - write a sequence to disk file	+}
{+    gets()	       - read a sequence from disk file +}
{+    closes()	       - writes nulls to data file	+}
{+    concats()        - concatenates 2 short sequences +}
{+    clear_screen     -				+}
{+    gotoxy(xy)       - position to XY coordinates	+}
{+							+}
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

CONST
  alphalen = 10;
  default = 80;

TYPE
  BYTE = 0..255;
  alpha = array [0..alphalen] of byte;
  BFILE = FILE OF BYTE;
  DSTRING = STRING DEFAULT;
  STRING34 = PACKED ARRAY [1..34] OF CHAR;
  STRING0 = STRING 0;
  STRING10 = STRING 10;
  STRING255 = STRING 255;

VAR
  bell	 : char;	{ ASCII value for terminal bell character }
  bx	 : byte;	{ global byte indexer }
  ESC	 : BYTE;	{ ASCII escape character }
  ix	 : integer;	{ global integer indexer }
  NULL	 : BYTE;	{ ASCII null character }
  selected : BOOLEAN;	{ a terminal has been selected flag }
  termio : BFILE;	{ terminal data file   }
  termtype : byte;
  VALID  : BOOLEAN;

	 { first 5 bytes for some misc terminal values }
   DELMIS,		{ delay after other functions. e.g. home up }
   DELCUS,		{ delay after direct addressing of cursor }
   X_OFF,		{ offset to add to column }
   Y_OFF,		{ offset to add to row }
   XY	     : BYTE;	{ flag for column/row or row/column addressing scheme }
	 { string sequences }
   CLRSCR,		{ CLEAR SCREEN }
   CUR, 		{ CURSOR ADDRESSING LEADIN STRING }
   eraeos,		{ CLEAR TO END OF SCREEN }
   eraeol,		{ CLEAR TO END OF LINE }
   HOME,		{ HOME UP CURSOR }
   LockKbd,		{ Lock KEYBOARD }
   UnlockKbd,		{ Unlock KEYBOARD }
   LINDEL,		{ delete screen line containing cursor }
   LININS,		{ insert a blank line on screen }
   INVON,		{ turn on highlighting - inverse video }
   INVOFF,		{ turn off highlighting }
   CRSON,		{ SET CURSOR ON AND BLINKING }
   CRSOFF : ALPHA;	{ SET CURSOR DISPLAY OFF }


function length(x:string255): integer;external;

procedure setlength(var x: string0; y: integer); external;

procedure keyin(var c: char); external;

function toupper(ch: char): char;
begin
  if  (('a'<=ch) and (ch<='z')) then
    toupper := chr(ord(ch)-32)
  else
    toupper := ch
end{ of toupper };


procedure writes( strng: alpha );
{ writes writes a string of type alpha to the console
  device. }
var	ix: byte;
begin
  for ix:=1 to strng[0] do
    write( chr(strng[ix]) )
end{ of writes };


procedure puts( var fb: BFILE; var strng: alpha );
{ procedure puts writes a string of type alpha
  to the specified file of type BFILE. }
var	ix: byte;
begin
  write( fb, strng[0]:1 );	  { length byte }
  for ix:=1 to strng[0] do
    write( fb, strng[ix]:1 )
end{ of puts };


procedure gets( var fb: BFILE; var strng: alpha );
{ procedure gets reads a string of type alpha from the
  specified file of type BFILE. }
var	ix: byte;
begin
  read( fb, strng[0] ); 	{ first byte is always length }
  for ix:=1 to strng[0] do
    read( fb, strng[ix] )
end{ of gets };


procedure closes( var fb: BFILE );
{ closes marks the end of file with 8 nulls }
var	ix: 1..8;
	null : byte;
begin
  null := 0;
  for ix:=1 to 8 do
     write( fb, null:1 )
end;


procedure concats( var first, second, new: alpha );
{ concatenates two short strings of type alpha into
  a third string "new".
  e.g.	   concats( INVON, REVERSE, RVON );
}
var	ix,k,k1: byte;
begin
  if ( first[0] + second[0] ) <= alphalen then begin
     k := first[0];	{ length(first) }
     k1 := second[0];	{ length(second) }
     for ix:=1 to k do new[ix] := first[ix];
     for ix:=1 to k1 do new[k+ix] := second[ix];
     new[0] := k + k1
  end
  else
     new[0] := 0
end{ of concats };



    {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
    {+ THE FOLLOWING PROCEDURES ARE TO BE USED IN YOUR PROGRAMS +}
    {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

Procedure Clear_Screen;
var	ix: byte;
begin
  writes( CLRSCR );
  for ix:=0 to DELMIS do {}
end;


Procedure gotoxy(x_coord, y_coord: integer);
var	ix, x_pos, y_pos: integer;
begin
  X_POS := x_coord + X_OFF;
  Y_POS := y_coord + Y_OFF;
  IF ( XY=2 ) AND ( X_POS<31 ) THEN X_POS := X_POS + 96;
  writes( CUR );
  IF ( XY=1 ) OR ( XY=2 ) THEN
    write( CHR(X_POS), CHR(Y_POS) )
  ELSE
    write( CHR(Y_POS), CHR(X_POS) );
  for ix:=0 TO DELCUS do {}
end;


PROCEDURE CVRT( alphanum   : dstring;  { input string to be parsed }
		var vector : alpha;    { returned values }
		var len    : integer;  { count of # of values returned }
		low_check,	       { low range }
		high_check : integer); { high range }
{ RETURNS len = -1 for any errors }
label 2;{quick exit}
var	error  : boolean;
	int    : integer; { integer number returned by IVAL }
	rng    : integer; { Range of alphanumeric string.   }
			  { required by IVAL		    }

{$iDELETE.LIB }

{$iIVAL.LIB }

BEGIN { parse alphanum, check for errors }
  error := false;
  len := 0;
  if length(alphanum)=0 then {EXIT} goto 2;
  Repeat
    rng := IVAL( alphanum, int );
    if ( rng>0 ) then begin { valid digit entered }
       if int<low_check then begin { valid integer but < low range }
	 writeln( bell, int, ' less than ', low_check:1, '. Reenter');
	 error := true
       end{if int<low_check}
       else if int>high_check then begin { valid integer but > high range }
	 writeln( bell, int, ' exceeds ', high_check:1, '. Reenter');
	 error := true
       end{if int>high_check}
       else begin { digits in range low_check..high_check }
	 len := len + 1;
	 vector[len] := int
       end{else};
       { compress input string until all gone }
       delete( alphanum, 1, rng-1 )
    end{ if rng > 0 };
    if ( rng<0 ) then begin { integer exceeds maxint }
      writeln( bell, ' overflow');
      error := true
    end
  Until ( rng<=0 ) or ( error );
  if error then len := -1;
2:{quick exit}
End{ of CVRT };


PROCEDURE CREATE;
VAR  ix       : byte;
     done     : boolean;
     len      : integer;
     t	      : alpha;
     answer   : dstring;

   PROCEDURE DO_strng( S: DSTRING; VAR strng: alpha );
   begin
     Repeat
       done := false;
       writeln; writeln;
       writeln('*** ', S, ' ***               Normally 2 or more bytes.');
       writeln;
       write(' ':12, 'Present Values               --->');
       if strng[0]>0 then
	 for ix:=1 to strng[0] do write( strng[ix]:4 );
       writeln;
       write(' ':12, 'Enter New Values or Return   ---> ');
       readln(answer);
       CVRT( answer, t, len, 0, 255 );
       if len=0 then done := true
       else if len>0 then begin
	  strng[0] := len;
	  for ix:=1 to len do strng[ix] := t[ix]
       end
       { else len<0 so error }
     Until ( done )
   END{ of Q };

   PROCEDURE DO_abyte( S: DSTRING; VAR abyte: byte );
   BEGIN
     Repeat
       done := false;
       writeln; writeln;
       writeln('*** ', S, ' ***               Normally 1 Byte.');
       writeln;
       writeln(' ':12, 'Present Value                --->', abyte:4 );
       write(  ' ':12, 'Enter New Value or Return    ---> ');
       readln(answer);
       CVRT( answer, t, len, 0, 255 );
       if len=0 then
	 done := true
       else if len>0 then
	 abyte := t[1]
       { else len<0 so error }
     Until ( done )
   END{ of P };


BEGIN{ CREATE }
  WRITELN; ; WRITELN;
  WRITELN('Enter Decimal Equiv. of Esc Sequence separated by CR');
  WRITELN;

  DO_strng('Clear Screen Code', CLRSCR);

  DO_abyte('Delay for Clear Screen', DELMIS );

  DO_abyte('Delay for Cursor Addr', DELCUS );

  DO_abyte('Column Offset', X_OFF );

  DO_abyte('Row Offset', Y_OFF );

  WRITELN(' ':18, 'Cursor Addressing Scheme');
  writeln; writeln;
  writeln('Direct cursor positioning e.g. Escape + "=" + Column + Row');

  DO_strng('Cursor Leadin String', CUR);
  writeln;writeln;
  writeln('Column/Row or Row/Column flag');
  writeln('ENTER:');
  writeln('   0 = ROW/COLUMN = Row first <most terminals>');
  writeln('   1 = COLUMN/ROW = Column first');
  writeln('   2 = Hazeltine terminal');
  Repeat
    done := false;
    writeln;
    writeln(' ':12, 'Present Value                --->', XY:3 );
    write(  ' ':12, 'Enter New Value or Return    ---> ');
    readln(answer);
    CVRT( answer, t, len, 0, 2 );
    if len=0 then done := true
    else if len>0 then XY := t[1]
  Until ( done );

  DO_strng('Clear to End of Screen', eraeos);

  DO_strng('Clear to End of Line', eraeol);

  DO_strng('Home Command Code', HOME);

  DO_strng('Keyboard Lock Code', LockKbd);

  DO_strng('Keyboard Unlock Code', UnlockKbd);

  DO_strng('Delete Screen line Code', LINDEL);

  DO_strng('Insert blank line Code', LININS);

  DO_strng('Inverse Video On', INVON);

  DO_strng('Inverse Video Off', INVOFF);

  DO_strng('Cursor Display On', CRSON);

  DO_strng('Cursor Display Off', CRSOFF);

  { additional strings may be entered here }

END{ of CREATE };


Procedure InitDefault;
begin
   { INIT SOME TERMINAL VARIABLES TO STANDARD DEFINITIONS }
    DELMIS := 20;  { NOTE - YOU MIGHT HAVE TO TRY DIFFERENT VALUES }
    DELCUS := 20;  { DEPENDING ON THE REACTIONS OF YOUR TERMINAL.  }
    XY := 0;
    X_OFF := 32;
    Y_OFF := 32;
   { INITIALIZE LENGTHS OF STRINGS TO 2 CHARS }
    CLRSCR[0] := 2;
    CUR[0] := 2;
    eraeos[0] := 2;
    eraeol[0] := 2;
    HOME[0] := 2;
    LockKbd[0] := 2;
    UnlockKbd[0] := 2;
    LINDEL[0] := 2;
    LININS[0] := 2;
    INVON[0] := 2;
    INVOFF[0] := 2;
    CRSON[0] := 2;
    CRSOFF[0] := 2;

    {++++++++++++++++++++++++++++++++++++++++++++++++++++}
    { DEFAULT PARAMETERS FOR TELEVIDEO 912/920 TERMINALS }
    {++++++++++++++++++++++++++++++++++++++++++++++++++++}

	{ CLEAR SCREEN }
    CLRSCR[1] := ESC;		CLRSCR[2] := 43;
	{ CURSOR POSITIONING LEAD IN STRING }
    CUR[1] := ESC;		CUR[2] := 61;
	{ ERASE TO END OF SCREEN }
    eraeos[1]:= ESC;		eraeos[2] := 89;
	{ ERASE TO END OF LINE }
    eraeol[1] := ESC;		eraeol[2] := 59;
    HOME[1] := ESC;		HOME[2] := 30;
    LockKbd[1] := ESC;		LockKbd[2] := 35;
    UnlockKbd[1] := ESC;	UnlockKbd[2] := NULL;
    LINDEL[1] := esc;		LINDEL[2] := ord('R');
    LININS[1] := esc;		LININS[2] := ord('E');
	{ INVERSE VIDEO ON }
    INVON[1] := ESC;		INVON[2] := ORD('j');
	{ INVERSE VIDEO OFF }
    INVOFF[1] := ESC;		INVOFF[2] := ord('k');
    CRSON[1] := NULL;		CRSON[2] := NULL;
    CRSOFF := CRSON;
end{ of InitDefault };


PROCEDURE INITIALIZE;
{ terminal type is not one of those listed or user desires to }
{ make changes to terminal data file. }
VAR	ch    : char;
	bx    : byte;
	valid : boolean;

   PROCEDURE INIT1;
   BEGIN
   {   INITIALIZE STRING SEQUENCES TO ZERO LENGTH   }
     XY := 0;
     CLRSCR[0] := 0;
     CUR[0] := 0;
     DELMIS := 0;
     CLRSCR[0] := 0;
     DELCUS := 0;
     X_OFF := 0;
     Y_OFF := 0;
     eraeos[0] := 0;
     eraeol[0] := 0;
     HOME[0] := 0;
     LockKbd[0] := 0;
     UnlockKbd[0] := 0;
     INVON[0] := 0;
     INVOFF[0] := 0;
     LINDEL[0] := 0;
     LININS[0] := 0;
     CRSON[0] := 0;
     CRSOFF[0] := 0;
   END{ of INIT1 };

BEGIN{ INITIALIZE }
  { First try to open data file. }
  { OPEN file TERMIO.FIL for READ assign termio }
  RESET('TERMIO.FIL',termio);

  INIT1; { init string sequences to zero }

  { if end of file then file does not exist, so continue to process. }
  if not eof(termio) then begin
    read( termio, bx, DELMIS, DELCUS, X_OFF, Y_OFF, XY );
    gets( termio, CLRSCR );
    gets( termio, CUR );
    gets( termio, eraeos );
    gets( termio, eraeol );
    gets( termio, HOME );
    gets( termio, LockKbd );
    gets( termio, UnlockKbd );
    gets( termio, LINDEL );
    gets( termio, LININS );
    gets( termio, INVON );
    gets( termio, INVOFF );
    gets( termio, CRSON );
    gets( termio, CRSOFF );
  end{if};

  { Create new/revised data file }
  CREATE
END{ of INITIALIZE };


PROCEDURE Menu;
BEGIN
  WRITELN(' 1 - HAZELTINE 1500');
  WRITELN(' 2 - SOROC IQ-120 or IQ-140');
  WRITELN(' 3 - INFOTON I-100');
  WRITELN(' 4 - TELEVIDEO 912 or 920');
  WRITELN(' 5 - BEEHIVE');
  WRITELN(' 6 - HEATH H-19');
  WRITELN(' 7 - ADDS REGENT');
  WRITELN(' 8 - ZENTEC (DYNABYTE 5022)');
  WRITELN(' 9 - DIRECT VP800');
  WRITELN('10 - TRS-80 (Pickles & Trout CP/M)');
  WRITELN('11 - VECTOR GRAPHIC ( w/ 4.0 or newer Monitor ROM)');
  WRITELN('12 - TELEVIDEO 950');
  WRITELN('13 - NONE OF THE ABOVE');
  WRITELN;  WRITELN
END{ of Menu };


Procedure Write_File;
var	bx : byte;
begin
{ OPEN file TERMIO_FIL for WRITE assign termio }
  REWRITE( 'TERMIO.FIL', termio );
  WRITELN; 

  bx := 5;	 { set length for this string sequence }
  write( termio,		{ first 5 bytes in this sequence }
	     bx:1,		{ length byte }
	     DELMIS:1,		{ delay - misc }
	     DELCUS:1,		{ delay - cursor addressing }
	     X_OFF:1,		{ x-coord offset }
	     Y_OFF:1,		{ y-coord offset }
	     XY:1 );		{ col/row or row/col flag }
  puts(termio, CLRSCR);      { CLEAR SCREEN }
  puts(termio, CUR);	     { CURSOR LEADIN STRING }
  puts(termio, eraeos);      { CLEAR TO END OF SCREEN }
  puts(termio, eraeol);      { CLEAR TO END OF LINE }
  puts(termio, HOME);	     { HOME UP CURSOR }
  puts(termio, LockKbd);     { Lock KEYBOARD }
  puts(termio, UnlockKbd);   { UNLOCK KEYBOARD }
  puts(termio, LINDEL);      { delete screen line containing cursor }
  puts(termio, LININS);      { insert a blank line on screen }
  puts(termio, INVON);	     { turn on highlighting - inverse video }
  puts(termio, INVOFF);      { turn off highlighting }
  puts(termio, CRSON);	     { cursor display on }
  puts(termio, CRSOFF);      { cursor display off }
  closes( termio );
end{ of Write File };



BEGIN { MAIN PROGRAM }
  FOR bx:=1 TO 24 DO WRITELN;
  bell := chr(7);	{ ASCII value bell character }
  ESC := 27;		{ ASCII Escape char }
  NULL := 0;		{ ASCII Null char   }
  REPEAT
    VALID := TRUE;
    Menu;
    WRITE('Enter Terminal Type to be Used ( 1 - 13 ) : ');
    READLN( termtype );
    IF ( termtype<1 ) OR ( termtype>13 ) THEN BEGIN
      VALID := FALSE;
      WRITELN;
      WRITELN;
      WRITELN(bell, 'Invalid terminal type. Reenter.');
      WRITELN; WRITELN; WRITELN
    END
  UNTIL VALID;

  InitDefault;	  { INIT SOME TERMINAL VARIABLES TO STANDARD DEFINITIONS }

  CASE termtype OF
     1: BEGIN { ******	HAZELTINE TERMINAL ****** }
	  CLRSCR[1] := 126;	CLRSCR[2] := 28;
	  CUR[1] := 126;	CUR[2] := 17;
	  XY := 2;
	  X_OFF := 0;
	  Y_OFF := 32;
	  eraeos[1] := 126;	eraeos[2] := 24;
	  eraeol[1] := 126;	eraeol[2] := 15;
	  HOME[1] := 126;	HOME[2] := 18;
	  LockKbd[1] := 126;	LockKbd[2] := 21;
	  UnlockKbd[1] := 126;	UnlockKbd[2] := 6;
	END;

     2: BEGIN { ****** SOROC TERMINAL ****** }
	  CLRSCR[0] := 4;
	  CLRSCR[1] := ESC;
	  CLRSCR[2] := 43;
	  CLRSCR[3] := NULL;
	  CLRSCR[4] := NULL;
	  CUR[2] := 61;
	  eraeos[2] := 89;
	  eraeol[2] := 59;
	  HOME[0] := 1;
	  HOME[1] := 30;
	  LockKbd[2] := 35;
	  UnlockKbd[2] := NULL;
	END;

     3: BEGIN { ****** INFOTON TERMINAL ****** }
	  CLRSCR[0] := 1;
	  CLRSCR[1] := 12;
	  CUR[2] := 102;
	  eraeos[2] := 74;
	  eraeol[2] := 75;
	  HOME[2] := 72;
	  LockKbd[2] := 104;
	  UnlockKbd[2] := 108;
	END;

     4: { ****** TELEVIDEO TERMINAL ****** };
	{ DEFAULT PARAMETERS ARE SET UP FOR TVI 912/920 TERM }

     5: BEGIN { ******* BEEHIVE TERMINAL  ****** }
		CLRSCR[2] := 69;
		CUR[2] := 70;
		eraeos[2] := 74;
		eraeol[2] := 75;
		HOME[2] := 72;
		LockKbd[2] := 35;
		UnlockKbd[2] := NULL;
	END;

     6: BEGIN { ****** HEATH TERMINAL ****** }
		CLRSCR[2] := 69;
		CUR[2] := 89;
		eraeos[2] := 74;
		eraeol[2] := 75;
		HOME[2] := 72;
		LockKbd[2] := 125;
		UnlockKbd[2] := 123;
	END;

     7: BEGIN { ****** ADDS 60 ****** }
	  CLRSCR[0] := 0;
	  CLRSCR[1] := 12;
	  CUR[2] := 89;
	  eraeos[2] := 107;
	  eraeol[2] := 75;
	  HOME[0] := 1;
	  HOME[1] := 8;
	  LockKbd[2] := 53;
	  UnlockKbd[2] := 54;
	END;

     8: BEGIN { ****** ZENTEC (DYNABYTE 5022) ****** }
	  eraeos[2] := 121;
	  eraeol[2] := 84;
	  HOME[0] := 1;
	  HOME[1] := 30;
	END;

     9: BEGIN { ****** DIRECT VP800 ****** }
	  CLRSCR[0] := 5;
	  CLRSCR[1] := ESC;		  CLRSCR[2] := 72;
	  CLRSCR[3] := NULL;		  CLRSCR[4] := ESC;
	  CLRSCR[5] := 74;
	  CUR[2] := 89;
	  eraeos[2] := 74;
	  eraeol[2] := 75;
	  HOME[2] := 72;
	  LockKbd[0] := 1;
	  LockKbd[1] := NULL;
	  UnlockKbd[0] := 1;
	  UnlockKbd[1] := NULL;

	  FOR IX:=1 TO 24 DO WRITELN;
	  WRITELN('NOTE:');
	  WRITELN;
	  WRITE('PRIOR TO RUNNING THE SOFTWARE THE TERMINAL ');
	  WRITELN('MUST BE CONFIGURED TO EMULATE');
	  WRITE('A VT-52 TERMINAL_ ');
	  WRITELN('PLEASE CONSULT THE VP800 USER MANUAL FOR PROCEDURE ON');
	  WRITELN('HOW TO ALTER AND SAVE SETUP FEATURES'); WRITELN;
	  WRITELN;
	END;

    10: BEGIN { ****** TRS-80 (PICKLES & TROUT) ****** }
	  CLRSCR[0] := 1;
	  CLRSCR[1] := 12;
	  CUR[1] := ESC;	CUR[2] := 89;
	  eraeos[0] := 1;
	  eraeos[1]:= 2;
	  eraeol[0] := 1;
	  eraeol[1] :=	1;
	  HOME[0] := 1;
	  HOME[1] := 6;
	  LockKbd[0] := 1;
	  LockKbd[1] := NULL;
	  UnlockKbd[0] := 1;
	  UnlockKbd[1] := NULL;
	END;

    11: BEGIN { ****** VECTOR GRAPHIC W/ 4.0 OR NEWER MONITOR ****** }
	  CLRSCR[0] := 1;
	  CLRSCR[1] := 4;
	  CUR[0] := 1;
	  CUR[1] := ESC;
	  XY := 1;
	  X_OFF := 128;
	  Y_OFF := 128;
	  eraeos[0] := 1;
	  eraeos[1]:= 16;
	  eraeol[0] := 1;
	  eraeol[1] := 17;
	  HOME[0] := 1;
	  HOME[1] := 2;
	  LockKbd[0] := 1;
	  LockKbd[1] := NULL;
	  UnlockKbd[0] := 1;
	  UnlockKbd[1] := NULL;
	END;

     12: BEGIN { ***** TELEVIDEO 950 ***** }
	   DELMIS := 10;
	   DELCUS := 10;
	   LINDEL[0] := 2;
	   LINDEL[1] := ESC;
	   LINDEL[2] := ORD('R');
	   LININS[0] := 2;
	   LININS[1] := ESC;
	   LININS[2] := ORD('E');
	   LockKbd[0] := 2;
	   LockKbd[1] := ESC;
	   LockKbd[2] := ORD('#');
	   UnlockKbd[0] := 2;
	   UnlockKbd[1] := ESC;
	   UnlockKbd[2] := ORD('"');
	   INVON[0] := 3;	{ INVERSE VIDEO ON }
	   INVON[1] := ESC;
	   INVON[2] := ORD('G');
	   INVON[3] := ORD('4');
	   INVOFF[0] := 3;	{ INVERSE VIDEO OFF }
	   INVOFF[1] := ESC;
	   INVOFF[2] := ORD('G');
	   INVOFF[3] := ORD('0');
	   CRSON[0] := 3;	{ SET CURSOR ON AND BLINKING }
	   CRSOFF[0] := 3;	{ SET CURSOR DISPLAY OFF }
	   CRSON[1] := ESC;
	   CRSON[2] := ORD('.');
	   CRSON[3] := ORD('1');
	   CRSOFF[0] := 3;	{ SET CURSOR DISPLAY OFF }
	   CRSOFF[1] := ESC;
	   CRSOFF[2] := ORD('.');
	   CRSOFF[3] := ORD('0');
	 END;

     13: BEGIN { ****** TERMINAL NOT ONE OF THE ABOVE TYPES ****** }
	   INITIALIZE;
	 END
  END{CASE};

  Write_File;

  for bx:=1 to 5 do writeln;
END{ of INSTALL }.

