! EDWIN driver for the Masscomp
from EDWIN include Device, Icodes
record format Point fm (integer x, y)
dynamic routine spec DD INIT alias "EDWIN_DD_INIT"(integer name x,y)
dynamic routine spec DD TERM alias "EDWIN_DD_TERM"
dynamic routine spec DD UPDATE alias "EDWIN_DD_UPDATE"
dynamic routine spec DD CLEAR alias "EDWIN_DD_CLEAR"
dynamic routine spec DD COL alias "EDWIN_DD_COL" (integer Col)
dynamic routine spec DD MODE alias "EDWIN_DD_MODE" (integer Mode)
dynamic routine spec DD FILL alias "EDWIN_DD_FILL" (integer Mode)
dynamic routine spec DD DOT alias "EDWIN_DD_DOT" (integer X, Y)
dynamic routine spec DD LINE alias "EDWIN_DD_LINE" (integer OX, OY, NX, NY)
dynamic routine spec DD TEXT alias "EDWIN_DD_TEXT" (integer X, Y, byte name T)
dynamic routine spec DD RECT alias "EDWIN_DD_RECT" (integer LX, LY, HX, HY)
dynamic routine spec DD POLY alias "EDWIN_DD_POLY" (integer NP,
integer name xpts,ypts)
own integer SX = 0
own integer SY = 0
own integer XL = 0
own integer YB = 0
own integer XR = 32767
own integer YT = 20479
own byte Smode=0, CCol = 1,CMode = 0
external routine Masscomp alias "EDWIN___B" (integer Com, X, Y)
own string (127) text = ""
own short Counter = 0
own integer WX, WY, Nlines = 0
record format Data Fm (record (point fm) p, record (Data Fm) name Next)
own record (Data fm) name Point List == 0
own record (Data fm) name Next point == 0
switch SW(0:15)
switch AS(0:att maximum)
! %include "Polyfill.OPS"
routine SWAP (integer name A, B)
integer C
C = A; A = B; B = C
end
routine draw lines
record (Data fm) name PP
integer array xpts,ypts(1:nlines+1)
integer i
return if Point List == Nil
if nlines <= 1 start
DD Dot (point list_p_x, point list_p_y)
else if nlines = 2
DD Line (point list_p_x, point list_p_y,
point list_next_p_x, point list_next_p_y)
else
pp == point list
for I = 1, 1, Nlines cycle
xpts(i) = pp_p_x
ypts(i) = pp_p_y
pp == pp_next
repeat
nlines = nlines + 1
xpts(nlines) = xpts(1)
ypts(nlines) = ypts(1)
DD POLY (nlines, Xpts(1),Ypts(1))
finish
nlines = 0
end
routine print text
text = text.tostring (0)
dd text (sx, sy, byte(addr (text)+1))
text = ""
end
print text if text # "" and com # 6
draw lines if nlines # 0 and (com = 10 or COM < 5)
counter = counter + 1
if counter & 64 # 0 start
counter = 0
! %signal 13,0 %if char = Etx %or char = Del
finish
! select output(0)
! print string("Device driven with ".itos(com,0).itos(x,3).itos(y,3))
! newline
-> SW (Com)
SW(0): ! Initialise
Point List == New (point list)
point List_next == Nil
Dev Data_Name = "a Masscomp Graphics Processor"
DD INIT(Dev Data_DVX,Dev Data_DVY)
Dev Data_MVX = Dev Data_DVX
Dev Data_MVY = Dev Data_DVY
XR = Dev Data_DVX
YT = Dev Data_DVY
return
SW(1): ! Terminate
DD TERM
return
SW(2): ! Update
DD UPDATE
return
SW(3): ! New frame
DD CLEAR
return
SW(4): ! Move
SX = X; SY = Y
return
SW(5): ! Line
if Smode = 2 start
DD Dot (x, y)
else if Smode = 0
DD Line (sx, sy, x, y)
else
if Nlines = 0 start
point list_p_x = sx; point list_p_y = sy
Next point == point list
Nlines = 1
finish
return if x=sx and y=sy
Nlines = Nlines + 1
if Next point_next == Nil start
Next point_next == New (Next point)
Next point == Next point_next
Next point_next == Nil
else
Next point == next point_next
finish
next point_p_x = x; next point_p_y = y
finish
sx = x; SY = y
return
SW(6): ! Char
length(text) = length(text) + 1
charno(text,length(text)) = x
print text if length(text) = 126
return
SW(7): ! Attribute
if 0<=x<=Att maximum start
-> as(x)
AS(0): ! Colour
Y = 1 unless 0 <= y <= 15
CCol = y
DD Col (CCol)
return
AS(1): ! Line style
Y = 0 unless 0<=y<=4
return
AS(2): ! Character Size
return
AS(9): ! Overwrite mode
Y = 0 unless 0<=y<=4
CMode = y
DD Mode (y)
return
AS(10): ! Shade mode
Smode = Y
DD Fill(Smode)
return
finish
AS(*): { Ignore the rest }
return
SW(8): ! Lower window bounds
XL = X; YB = Y
return
SW(9): ! Upper window bounds
XR = X; YT = Y
return
SW(10): ! ??
return
SW(11): ! Was overwrite mode
Y = X
X = Att Colour mode
-> SW (7)
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 > 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.
if Smode = 0 start
Masscomp (4, wx, wy)
Masscomp (5, x, wy)
Masscomp (5, x, y)
Masscomp (5, wx, y)
Masscomp (5, wx, wy)
else
DD Rect (wx, wy, x, y)
finish
return
SW(14): ! Circle
return
SW(*):
end
external routine draw dots alias "EDWIN_DRAW_DOTS" ( -
integer lx,ly,hx,hy,gap)
integer active,i
integer lx1,ly1,hx1,hy1,x,y,y1,x1
integer smode = Cmode, scolour = CCol
from edwin include specs
Cmode = 0 ; CCol = 1
DD mode(CMode) ; DD Col(CCol)
lx1 = lx ; ly1 = ly ; hx1 = hx ; hy1 = hy
!
! draw vertical lines
!
lx = hx1 ; ly = hy1
map to device coords(lx,ly)
y1 = ly
lx = lx1 ; ly = ly1
map to device coords(lx,ly)
y = ly
lx = lx1 ; ly = ly1
while lx <= hx1 cycle
hx = lx ; hy = ly
map to device coords(hx,hy)
DD LINE(hx,y,hx,y1)
lx = lx + gap
repeat
!
! put black boxes on top
!
CCol = 0 ; DD Col(CCol)
lx = lx1 ; ly = ly1
while ly < hy1 cycle
hy = ly ; lx = lx1
map to device coords(lx,hy) ; x = hx1
y = ly + gap
map to device coords(x,y)
DD RECT(lx,hy + 1,x + 1,y - 1)
ly = ly + gap
repeat
!
! put the old values in again
!
Cmode = smode ; DD mode(cmode)
CCol = scolour ; DD col(CCol)
end
end of file