! 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 PLOTS (integer name ISF, INDEX, LDEV)
dynamic routine spec PLOT (real name X, Y, integer name IPEN)
dynamic routine spec NEW PEN (integer name PEN)
!%dynamic %routine %spec SYMBOL ()
external routine CALCOMP alias "EDWIN___L" (integer COM, X, Y)
own integer LOADED = 0, WX, WY
const integer TRUE = 1, FALSE = 0
! 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 = 200
long real P SIZE X, P SIZE Y
real RX, RY
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
NEW 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 ! }
SX = 0; SY = 0
TEXT MODE = FALSE
COM = 5
PLOTS (SX, SY, COM)
return
SW(1): ! Terminate
COM = 999
PLOT (RX, RY, COM)
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
RX = XS*UPC; RY = 0; COM=-3
PLOT (RX, RY, COM)
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=2 else COM=3
RX = X; RY = Y
PLOT (RX, RY, COM)
SX = X
SY = Y
TEXT MODE = FALSE
return
SW(6): ! Character
signal 14, 14
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