! EDWIN driver for the ERCC plotters (using GRAPHPACK)

%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 %integer %spec VIEWING, DEVICE

%dynamic %routine C963 (%integer COM, X, Y)
   %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 MAXU = 0, DASH = 0, GAP = 0, UPC = 100, THETA = 0, PX, PY
   %const %real P WIDTH = 85.5
   %long %real P SIZE X, P SIZE Y
   %string (31) DEVST

   %routine CHANGE ATTRIBUTE
      %switch AS(0:7)
      %return %if X>7
      -> 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(7): ! Intensity
   %end

   %switch SW (0:9)
   %return %if COM>9 %or (DEVICE#4 %and DEVICE#13)
   -> SW(COM)

SW(0): ! Initialise
       PLOTTER TYPE (X)
       %if X=7220 %then UPC=400 %else UPC=100
       AREA FLAG ("OFF")
       %if VIEWING=0 %start
           %if X=963 %or X=1051 %start
               DEVST = "80,.GP23"
           %finish %else %if X=7220 %start
               DEVST = "80,.GP15"
           %finish %else %if X=663 %start
               DEVST = "80,.GP14"
           %finish %else %start
               DEVST = "80,T#GP"
           %finish
           VIEWING = 80 %and DEFINE (DEVST);   ! EMAS
!           VIEWING = 1;                        ! VAX
       %finish
       OPEN PLOTTER (VIEWING)
       MAXU = 0
       SX = 0;   SY = 0
       X=0;  Y=1
       CHANGE ATTRIBUTE;  ! Colour to BLACK
       X=1;  Y=0
       CHANGE ATTRIBUTE;  ! Line style normal
       X=2;  Y=12
       Y = Y * 4 %if UPC = 400; ! HP plotter
       CHANGE ATTRIBUTE;  ! 12 unit characters
       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

       %if MAXU+PSIZEY<PWIDTH %start
           SET PLOT (0, MAXU, P SIZE X, P SIZE Y+ MAXU, M'CMSV')
       %finish %else %start
           MAXU = 0
           SET PLOT (0, 0, P SIZE X, P SIZE Y, M'CMS')
       %finish

       SCALE (0, MAXU/(XS-XO), P SIZE X/(XS-XO), P SIZE Y/(YS-YO), 0)
       MAXU = MAXU + P SIZE Y + 1
       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
       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

%end

%end %of %file
