(* Screen Control for the Hazeltine 1500 series CRT by:

Francis J. Monaco
Major, US ARMY
Systems Manager, Computer Graphics Laboratory
Department of Geography and Computer Science
The United States Military Academy
West Point, New York 10996
914-938-2063
*)
PROCEDURE GOTOXY ( X, Y : INTEGER );
(* Smart GOTOXY Routine for hazeltine 1500 CRT *)
(* Requires x, y of type integer : see code for functions *)
(* Note that x = -1 signals a terminal dependent function;
otherwise, cursor control to X, Y is assumed *)
(*
For terminal functions, call GOTOXY with (-1 and...
1	Homecursor
2	Clearscreen
3	Clearforeground
4	Cleartoeol
5	Cleartoeos
6	Clearbackground
7	Background follows (light intensity)
8	Foreground follows (dark intensity)
*)
(* F. J. Monaco
22 Oct 1980 *)

CONST 
      LEADINTOSCREEN = 126; (* the tilde character on the Hazeltine 1500*)
      DIRECTCURSOR = 17;
      HOMECURSOR = 18;
      CLEARFOREGROUND = 29;
      CLEARTOEOL = 15;
      CLEARTOEOS = 24;
      CLEARBACKGROUND = 23;
      BACKGROUNDFOLLOWS = 25;
      FOREGROUNDFOLLOWS = 31;
      CLEARSCREEN = 28;

VAR 
    ROW, COLUMN : INTEGER;
    ZAPCURSOR : PACKED ARRAY [ 0 .. 3 ] OF CHAR;
    ZAPSCREEN : PACKED ARRAY [ 0 .. 1 ] OF CHAR;
    COUNTER : INTEGER;
BEGIN
 IF ( ( Y >= 0 ) AND ( X >= 0 ) )
  THEN
   BEGIN
    IF X <= 30
     THEN
      COLUMN := X + 96
     ELSE
      COLUMN := X;
    ROW := Y + 96;
    ZAPCURSOR [ 0 ] := CHR ( LEADINTOSCREEN );
    ZAPCURSOR [ 1 ] := CHR ( DIRECTCURSOR );
    ZAPCURSOR [ 2 ] := CHR ( COLUMN );
    ZAPCURSOR [ 3 ] := CHR ( ROW );
    FOR COUNTER := 0 TO 3 DO
     WRITE ( ZAPCURSOR [ COUNTER ] )
   END
  ELSE
   BEGIN
    IF X = -1
     THEN
      BEGIN
       ZAPSCREEN [ 0 ] := CHR ( LEADINTOSCREEN );
       CASE Y OF
        1:  ZAPSCREEN [ 1 ] := CHR ( HOMECURSOR );
        2:  ZAPSCREEN [ 1 ] := CHR ( CLEARSCREEN );
        3:  ZAPSCREEN [ 1 ] := CHR ( CLEARFOREGROUND );
        4:  ZAPSCREEN [ 1 ] := CHR ( CLEARTOEOL );
        5:  ZAPSCREEN [ 1 ] := CHR ( CLEARTOEOS );
        6:  ZAPSCREEN [ 1 ] := CHR ( CLEARBACKGROUND );
        7:  ZAPSCREEN [ 1 ] := CHR ( BACKGROUNDFOLLOWS );
        8:  ZAPSCREEN [ 1 ] := CHR ( FOREGROUNDFOLLOWS )
       END;
       IF ( (Y >= 1) AND (Y <= 8 ) )
        THEN
         FOR COUNTER := 0 TO 1 DO
          WRITE ( ZAPSCREEN [ COUNTER ] );
      END;
   END;
END   (* GOTOXY *) ;
