! EDWIN driver for Westward C2014  (Tektronix compatible?) terminals.

!############################################################################
!#                                                                          #
!#  This is a module from the EDWIN Graphics Package, which was developed   #
!#  in the Department of Computer Science, at Edinburgh University, from    #
!#  1978 to the present day, release 5 of EDWIN in October 1984.            #
!#                                                                          #
!#  The principal author of the EDWIN Graphics Package was J Gordon Hughes, #
!#  while working for the Edinburgh University Computer Sceince Department. #
!#  Parts of EDWIN have been produced by many different people, too many    #
!#  too mention, working for different departments of Edinburgh and Leeds   #
!#  Universities.                                                           #
!#                                                                          #
!#  This module is regarded as being in the public domain, and the authors  #
!#  and accept no responsibility regarding the uses to which the software   #
!#  will be put.                                                            #
!#                                                                          #
!############################################################################

from Edwin include Device
from Edwin include Icodes

! Control characters
const integer INVOKE CURSOR = 26
const integer ESCAPE = 27
const integer GRAPHMODE = 29
const integer ALPHAMODE = 31
const integer ERASE SCREEN = 12
const integer GRAPHICS STATE = 12
const integer VDU STATE = 8_62
const integer NUL = 0
const integer DEL = 127

! Screen information
own integer AMODE = 0        { Advanced mode for 4014
own integer MODE = 0         { 0 if alphamode
own integer SX = 0, SY = 0   { Current device position
own integer XL = 0           { Left hand side of device window
own integer XR = 1023        { Right hand side of device window
own integer YB = 0           { Bottom side of device window
own integer YT = 1023        { top side of device window
own integer VIS = 0          { 0 if CVP inside VW
own integer TCS = 13         { char size.

routine PAD (integer SYM,NO)
   integer I
   TTPUT (SYM) for I = 1,1,NO
end

routine UPDATE
   PAD (NUL,4)
   TTPUT (ALPHA MODE)
   TTPUT (25) if TCS=24;  ! Sets big chars on 4002
   FLUSH OUTPUT
   MODE=0
end

external routine SET COLOUR MAP alias "EDWIN___W_MAP" (integer ADR, RED, BLUE, GREEN)
   ! Still to be written
end

external routine WC2014 alias "EDWIN___W" (integer COM, X, Y)
   own integer WX, WY
   switch SW(0:MAX COM)

   routine SWAP (integer name  A, B)
      integer C
      C = A;   A = B;   B = C
   end

   routine PUT CHAR
      ! Put out a text character properly.
      UPDATE if MODE#0
      TTPUT (X)
      TTPUT (0)
      SX = SX + TCS
      VIS = 1 if SX>XR
   end
   
   routine GOTO(integer X,Y);   !Code up coordinates and send to TTY
      constinteger HI=32,LY=96,LX=64,ENH=7
      TTPUT (Y>>5&31!HI); TTPUT (Y&31!LY)
!      TTPUT ((ENH<<4)!(Y>>10&3)!(X>>10&3)) %if AMODE#0
      TTPUT (X>>5&31!HI); TTPUT (X&31!LX)
   end
   
   routine CHANGE ATTRIBUTE
      switch SW(0:ATT MAXIMUM)
      -> SW(X)
   
SW(att Colour):
       TTPUT (ESCAPE)
       TTPUT ('[')
       TTPUT ('C')
       TTPUT (Y+'@')
       return

SW(att Line style):
       Y = 0 unless 0<=Y<=4
       TTPUT (ESCAPE)
       TTPUT (Y + 96)
       return

SW(att Char size):
       TTPUT (ESCAPE)
       if Y <  8 start
           TTPUT (';');   TCS=7
       finish else if Y < 10 start
           TTPUT (':');   TCS=9
       finish else if Y < 13 start
           TTPUT ('9');   TCS=13
       finish else start
           TTPUT ('8');   TCS=14
       finish

SW(*): ! all other attributes ignored
   end

   -> SW(COM)

SW(0): ! Initialise
       DEV DATA_NAME = "a Westward 2014 terminal"
       DEV DATA_MVX = 1023
       DEV DATA_MVY = 767
       DEV DATA_DVX = 1023
       DEV DATA_DVY = 767
       TTMODE (1)
       TTPUT (ESCAPE);   TTPUT (GRAPHICS STATE)
       return

SW(1): !Terminate
!        PAD (NUL,4)
!        TTPUT (ALPHA MODE)
        TTPUT (ESCAPE);   TTPUT (VDU STATE)
        TTPUT (13)
        TTPUT (10)
        FLUSH OUTPUT
        TTMODE (0)
        return

SW(2): ! Update
       UPDATE
       return

SW(3): ! New frame
       TTPUT (ESCAPE)
       TTPUT (ERASE SCREEN)
PAD(0,120)
!       PAD (DEL,960)
       SX=0; SY=0; MODE=0
       return

SW(4): ! Move Abs
       TTPUT (GRAPH MODE) 
       GOTO (X,Y)
       SX=X;  SY=Y
       MODE = 1; VIS=0
       return

SW(5): ! Line Abs
       if MODE=0 start
           TTPUT (GRAPH MODE)
           GOTO (SX,SY)
       finish
       GOTO (X,Y)
       MODE = 1
       SX=X; SY=Y
       VIS=0
       return

SW(6): ! Character
       PUT CHAR if VIS=0
       return

SW(7): ! Attribute  Change
       CHANGE ATTRIBUTE
       return

SW(8): ! Ignore lower window bounds settings
       return

SW(9): ! Upper window bounds
       XR=X

SW(10): SW(11): ! Ignored
        return

SW(12): ! Lower box bounds
        WX = X;   WY = Y
        return

SW(13): ! Upper box bounds, and do the box
        swap (wx, x) if wx > x
        swap (wy, y) if wy > y
        return if WX > XR or X < XL or WY > YT or Y < YB
        WX = XL if WX < XL
        WY = YB if WY < YB
        X = XR if X > XR
        Y = YT if Y > YT
        ! Box now clipped into the screen.
        TTPUT (ESCAPE);   TTPUT (2);   ! Box Mode
        MODE = 1
        WC2014 (5, WX, WY)
        WC2014 (5, X, Y)
        TTPUT (ESCAPE);   TTPUT (3);   ! Box Mode off again
        return

SW(*):
end

external routine W REQ alias "EDWIN___W_REQ" (integer name CH, X, Y)
   UPDATE
   TEK INPUT (CH, X, Y, INVOKE CURSOR)
end

end of file