! EDWIN Utility procedures for Acron Workstation

%from Imp %include Lognames

%own %string(255) Buffer = ""

%external %routine TT Mode %alias "EDWIN_TTMODE" ( %integer M )
%end

%external %routine Set Device %alias "EDWIN_SET_DEVICE" (%string(255) Dev Name)
%end

%external %routine Flush Output %alias "EDWIN_FLUSH"
   %external %routine %spec TTPUT (%integer S)
   %external %routine %spec FLUSH OUTPUT
   %integer STM, I
   STM = OUTPUT STREAM
   SELECT OUTPUT (0)
   TTPUT (CHARNO(Buffer,I)) %for I = 1, 1, LENGTH (Buffer)
   FLUSH OUTPUT
   SELECT OUTPUT (STM)
   Buffer = ""
%end

%external %routine TT Put %alias "EDWIN_TTPUT" ( %integer Char )
   Flush Output %if Length(Buffer) = 255
   Buffer = Buffer . Char
%end

%external %integer %function TT Get %alias "EDWIN_TTGET"
   %external %integer %fn %spec TTGET
   %result = TTGET
%end

%external %integer %function TT Read %alias "EDWIN_TTREAD"
   %external %integer %fn %spec TTGET
   %integer I = TTGET
   TTPUT (I)
   FLUSH OUTPUT
   %result = I
%end

%external %routine OPER MESSAGE %alias "EDWIN_OPER_MESSAGE" (%string (255) S)
   %integer OS
   OS = Output Stream
   Select output (0)
   Print string (S)
   Newline
   Select output (OS)
%end

%external %routine OPER INTERACT %alias "EDWIN_OPER_INTERACT" (%string (255) S)
   %string (127) OLD PROMPT = "Data: "
   %integer IS, REPLY
   %on 9 %start
       Prompt (OLD PROMPT)
       %signal 9
   %finish
   IS = Input Stream
   Select input (0)
!   OLD PROMPT = CURRENT PROMPT
   Prompt (S)
   Read symbol (REPLY) %until REPLY&95='Y'
   Read symbol (REPLY) %until REPLY=NL
   Select input (IS)
   Prompt (OLD PROMPT)
%end

!%external %routine TEK INPUT %alias "EDWIN___TEK_INPUT" (%integer %name A, X, Y, %integer cursor)
!   %integer b, c, d, e, f
!   ttput (27);   ttput (cursor);   flush output
!   Set Device ("") %if Device == Nil
!   Set Cbreak (1);   Set Echo (1)
!   A = opt read;   B = opt read;   C = opt read;   D = opt read;   E = opt read
!   F = opt read
!   Set Cbreak (0)
!   X = (B&31)<<5!C&31
!   Y = (D&31)<<5!E&31
!%end

%external %integer %fn MUL DIV %alias "EDWIN___MUL_DIV" (%integer A, B, C)
   ! Calculates int(A*B/C) to double precision.
   %integer Sign
   %integer RES, REM

   %result = 0 %if A=0 %or B=0 %or C=0
   Sign = A!!B!!C
   A = |A| ; B = |B| ; C = |C|
   * MOVD _ B, 0
   * MEID _ A, 0
   * DEID _ C, 0
   * MOVD _ 1, RES
   * MOVD _ 0, REM
   RES = RES + 1 %if REM > C//2
   Res = -Res %if Sign < 0
   %result = RES
%end

%end %of %file
