! EDWIN driver for the ERCC plotters (using GRAPHPACK)

from Edwin include Device
from Edwin include Icodes

!%system %routine %spec CASCADE LOAD (%integer %name FLAG, %integer LOCLL)
!%system %routine %spec LOADFILE2(%string (31) FILENAME, %integer %name FLAG,
!     %integer LEVEL)
!%system %integer %fn %spec CURRENTLL
dynamic routine spec DEFINE (string (255) ST)
dynamic routine spec PLOTTER TYPE (integer N)
dynamic routine spec OPEN PLOTTER (integer ICHAN)
dynamic routine spec SET PLOT (longreal XMIN,YMIN,XMAX,YMAX, integer UNITS)
dynamic routine spec SCALE (longreal XORIGIN,YORIGIN, XSCALE, YSCALE, THETA)
dynamic routine spec CLOSE PLOTTER
dynamic routine spec CHANGE PEN (integer PENNO)
dynamic routine spec PLOT (integer IPEN,longreal TOX,TOY,DASH,GAP)
dynamic routine spec AREA FLAG (string(3) S)
dynamic routine spec ANNOTATE (longreal X,Y, SIZE, THETA)
dynamic routine spec PLOT SYMBOL (integer ICODE)
dynamic routine spec PEN POSITION (long real name X, Y)

external routine CALCOMP alias "EDWIN___N" (integer COM, X, Y)
   own integer LOADED = 0, WX, WY
   const integer ION = 16_E0, IOFF = 16_E1, TRUE = 0, FALSE = 1
   ! Plotter control
   own integer IPEN=2, XO=0, XS=1500, YO=0, YS=1500, SX=0, SY=0
   own integer TCS = 12, ITALICS = FALSE, TEXT MODE = FALSE, NEW FRAMED = FALSE
   own long real DASH = 0, GAP = 0, THETA = 0, PX, PY
   const integer UPC = 100
   long real P SIZE X, P SIZE Y
   string (31) DEVST

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

   routine CHANGE ATTRIBUTE (integer X, Y)
      switch AS(0:ATT MAXIMUM)
      -> AS(X)

AS(0): ! Colour change
       CHANGE PEN (Y)
       return

AS(1): ! Line style change
       Y=0 unless 0<=Y<=4
       if Y=0 then DASH=0 and GAP=0 and IPEN=2
       if Y=1 then DASH=3 and GAP=3 and IPEN=0
       if Y=2 then DASH=0 and GAP=0 and IPEN=2
       if Y=3 then DASH=8 and GAP=3 and IPEN=0
       if Y=4 then DASH=15 and GAP=3 and IPEN=0
       return

AS(2): ! Character size change
       TCS = Y
       return

AS(3): ! Character orientation
       THETA = Y
AS(4): ! Character quality
AS(5): ! Character font
       return

AS(6): ! Character slant
       if 0<Y<90 then ITALICS = TRUE else ITALICS = FALSE
       return

AS(*):
   end

   switch SW (0:max com)
   return if COM>MAX COM
   -> SW(COM)

SW(0): ! Initialise
!       %if LOADED = 0 %start
!           Y = 1
!           LOAD FILE 2 ("ERCLIB.GRAPHICSY_RCOGRAF13Y", Y, CURRENT LL)
!           %signal 14, 1 %if Y#0
!           CASCADE LOAD (Y, CURRENT LL)
!           %signal 14, 1 %if Y#0
!           LOADED = 1
!       %finish
       DEV DATA_NAME = "a Calcomp plotter"
       DEV DATA_DVX = 4000
       DEV DATA_DVY = 2800
       DEV DATA_MVX = 32000
       DEV DATA_MVY = 32000
       DEV DATA_UNITS PER CM = UPC
       X = X - 1000 if 1001 <= X <= 1016  { Treated as Graph-pack numbers ! }
       PLOTTER TYPE (X)
       AREA FLAG ("OFF")
       if VIEWING=0 start
           if X=963 or X=1051 start
               DEVST = ",.GP23"
           else
               DEVST = ",T#GP"
           finish
           VIEWING = NON TERMINAL DEFAULT
           OPEN OUTPUT (NON TERMINAL DEFAULT, DEVST)
       finish
       OPEN PLOTTER (VIEWING)
       SX = 0;   SY = 0
       TEXT MODE = FALSE
       return

SW(1): ! Terminate
       CLOSE PLOTTER
       return

SW(2): ! Update (ignored for C963 as user can't see it!)
       return

SW(3): ! New frame
       P SIZE X = (XS-XO)/UPC
       P SIZE Y = (YS-YO)/UPC
       SET PLOT (0, 0, P SIZE X, P SIZE Y, M'CMS')
       SCALE (0, 0, P SIZE X/(XS-XO), P SIZE Y/(YS-YO), 0)
       SX = 0;   SY = 0
       TEXT MODE = FALSE
       NEWFRAMED = TRUE
       -> SW(COM) if COM#3
       return

SW(4): ! Move Abs
SW(5): ! Line abs
       -> SW(3) if NEWFRAMED # TRUE
       if COM=5 then COM=IPEN else COM=1
       PLOT (COM, X, Y, DASH, GAP)
       SX = X
       SY = Y
       TEXT MODE = FALSE
       return

SW(6): ! Character
       -> SW(3) if NEWFRAMED # TRUE
       if TEXT MODE = FALSE start
           ANNOTATE (SX, SY, TCS/3*2, THETA)
           PLOT SYMBOL (ION) if ITALICS = TRUE
           TEXT MODE = TRUE
       finish
       PLOT SYMBOL (X)
       PEN POSITION (PX, PY)
       SX = INT (PX);   SY = INT (PY)
       return

SW(7): ! Attribute change
       CHANGE ATTRIBUTE (x, y)
       TEXT MODE = FALSE
       return

SW(8): ! Set lower limits of device window
       XO = X;   YO = Y
       return

SW(9): ! Set upper limits of device window
       XS = X;   YS = Y
       return

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

SW(13): ! Upper box bounds
        swap (wx, x) if wx > x
        swap (wy, y) if wy > y
        return if WX > XS or X < XO or WY > YS or Y < YO
        WX = XO if WX < XO
        WY = YO if WY < YO
        X = XS if X > XS
        Y = YS if Y > YS
        ! Box now clipped into the screen.
        Calcomp (4, Wx, Wy)
        Calcomp (5, Wx, y)
        Calcomp (5, x,y)
        Calcomp (5, x, Wy)
        Calcomp (5, Wx, wy)
        return

SW(*):
end

end of file