{ Donated by Warren Smith, Feb 1982 }

Module CRT_Televideo;

{ This set of routines is designed to support a Televideo 912/920 type  }
{ of terminal.  If you have trouble adapting it to your terminal, give  }
{ me a call.                                                            }

Const
       Direct_IO = 6 ;
       Crt_Status_Port = $5D;  { Godbout System Support 1 serial status port }
       Char_Rcvd_Bit   = 2;    { may be unique to the Signetics 2651 U/SART }

{ This is an external function supplied with Pascal MT+ which gives     }
{ you a hook into CPM.                                                  }
External Function @BDOS (Func, Parm : integer) : integer;

Function Con_In : char ;        { non-echoed input from the console     }

 Const
       Parm = 255;

 Begin { Con_In }
 Con_In := chr(@BDOS(Direct_IO, Parm))
 end ; { Con_In }

Procedure Con_Out (Out_Char : char) ;

 Var
       Dummy : integer ;

 Begin { Con_Out }
 Dummy := @BDOS(Direct_IO, ord(Out_Char))
 end ; { Con_Out }

Function KeyPressed : Boolean ;

 Begin { KeyPressed }
 KeyPressed := Tstbit (Inp[$5D], 1)    { Specific to System Support board }
 end ; { KeyPressed }

Function Get_Console : char ;   { waits for a single character from the }
                               { console.                              }
 Begin { Get_Console }
 While not KeyPressed do;
 Get_Console := Con_In
 end ; { Get_Console }

Procedure GoToXY (X, Y : integer) ;

Const X_PLAC = 4 ;
     Y_PLAC = 3 ;
     MAX_X  = 80 ;
     MAX_Y  = 24 ;
     X_OFF  = 31 ;
     Y_OFF  = 31 ;

 Var BUFFER : array [1..4] of char ;

 Begin { GoToXY }
 BUFFER [1] := chr(27) ;
 BUFFER [2] := '=' ;
 If X < 1 Then
   BUFFER [X_PLAC] := chr(X_OFF)
 else
   If X > MAX_X then
     BUFFER [X_PLAC] := chr(MAX_X + X_OFF)
   else
     BUFFER [X_PLAC] := chr(X + X_OFF) ;

 If Y < 1 then
   BUFFER [Y_PLAC] := chr(Y_OFF)
 else
   If Y > MAX_Y then
     BUFFER [Y_PLAC] := chr(MAX_Y + Y_OFF)
   else
     BUFFER [Y_PLAC] := chr(Y + Y_OFF) ;

 Con_Out(Buffer[1]) ;
 Con_Out(Buffer[2]) ;
 Con_Out(Buffer[3]) ;
 Con_Out(Buffer[4])

 end ; { GoToXY }

Procedure Home ;

 Begin { Home }
 Con_Out (chr($1E))
 end ; { Home }

Procedure ScreenClr ;

 Begin { ScreenClr }
 Con_Out (chr(26))
 end ; { ScreenClr }

Procedure LineClr;

 Begin { LineClr }
 Con_Out (chr(27));
 Con_Out ('t')
 end;  { LineClr }

Procedure Read_Cursor (Var X, Y : integer);

   Var
       Discard : char;

   begin { Read_Cursor }
       { request cursor coordinates from TeleVideo 912 or 920 }
   ConOut (chr(27));
   ConOut ('?');
   While not KeyPressed do;
   Y := ord(ConIn) - $1F;
   While not KeyPressed do;
   X := ord(ConIn) - $1F;
   While not KeyPressed do;
   Discard := ConIn    { this last character is supposed to be a CR }
   end;  { Read_Cursor }

ModEnd.