IMPLEMENTATION MODULE GSXIN;

FROM GSXMAIN IMPORT simple, simplESC, CARDIN, CARDOUT, PTSIN, PTSOUT, CB;

PROCEDURE Tablet ( ) : BOOLEAN;
BEGIN
  simplESC ( 16 );
  RETURN CARDOUT[1] > 0;
END Tablet;

PROCEDURE Locator ( Device : CARDINAL; VAR C : CHAR; VAR Moved, Terminated : BOOLEAN );
BEGIN
  CARDIN[1]  := Device;
  PTSIN[1].X := CursorX;
  PTSIN[1].Y := CursorY;
  PTSOUT[1]  := PTSIN[1];		(* ...if not moved at all *)
  WITH CB DO
    CINLEN   := 1;
    PINLEN   := 1;
  END;
  simple ( 28 );
  CursorX    := PTSOUT[1].X;
  CursorY    := PTSOUT[1].Y;
  C          := CHAR ( CARDOUT[1] );
  Moved      := CB.POUTLEN > 0;
  Terminated := CB.COUTLEN > 0;
END Locator;

PROCEDURE Valuator ( VAR C : CHAR; VAR Changed, Terminated : BOOLEAN );
BEGIN
  CARDIN[2]  := Value;
  CARDOUT[1] := Value;
  CB.CINLEN  := 2;
  simple ( 29 );
  Value      := CARDOUT[1];
  C          := CHAR ( CARDOUT[2] );
  Changed    := CB.COUTLEN > 0;
  Terminated := CB.COUTLEN = 2;
END Valuator;

PROCEDURE Choice ( Device : CARDINAL; VAR N : CARDINAL; VAR C : CHAR;
		   VAR Choiced, Terminated : BOOLEAN );
BEGIN
  CARDIN[1]  := Device;
  CB.CINLEN  := 1;
  simple ( 30 );
  N          := CARDOUT[1];
  C	     := CHAR ( CARDOUT[2] );
  Choiced    := CB.COUTLEN = 1;
  Terminated := CB.COUTLEN = 2;
END Choice;

PROCEDURE String ( Device : CARDINAL; Echo : BOOLEAN; X,Y : CARDINAL;
		   VAR Text : ARRAY OF CHAR; VAR Done : BOOLEAN );
VAR i, m : CARDINAL;
BEGIN
  CARDIN[1]  := Device;
  CARDIN[2]  := HIGH ( Text );
  CARDIN[3]  := ORD ( Echo );
  PTSIN[1].X := X;
  PTSIN[1].Y := Y;
  WITH CB DO
    CINLEN   := 3;
    PINLEN   := 1;
  END;
  simple ( 31 );
  m	     := CB.COUTLEN;
  Done       := m > 0;
  IF Done THEN 
    FOR i := 1 TO m DO Text[i-1] := CHAR ( CARDOUT[i] ); END;
  END;
  Text[m] := CHAR ( 0 );
END String;

PROCEDURE InputMode ( Device, Mode : CARDINAL );
BEGIN
  CARDIN[1]  := Device;
  CARDIN[2]  := Mode;
  CB.CINLEN  := 2;
  simple ( 33 );
END InputMode;

BEGIN
  CursorX := 16384;
  CursorY := 16384;
END GSXIN.
                                                                     