! 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