! EDWIN driver for Opus board
from EDWIN include Device, Icodes
record format Point fm (integer x, y)
external routine spec DD INIT alias "EDWIN_DD_INIT"(integer name x,y)
external routine spec DD TERM alias "EDWIN_DD_TERM"
external routine spec DD UPDATE alias "EDWIN_DD_UPDATE"
external routine spec DD CLEAR alias "EDWIN_DD_CLEAR"
external routine spec DD COL alias "EDWIN_DD_COL" (integer Col)
external routine spec DD MODE alias "EDWIN_DD_MODE" (integer Mode)
external routine spec DD FILL alias "EDWIN_DD_FILL" (integer Mode)
external routine spec DD DOT alias "EDWIN_DD_DOT" (integer X, Y)
external routine spec DD LINE alias "EDWIN_DD_LINE" (integer OX, OY, NX, NY)
external routine spec DD TEXT alias "EDWIN_DD_TEXT" (integer X, Y, byte name T)
external routine spec DD RECT alias "EDWIN_DD_RECT" (integer LX, LY, HX, HY)
external routine spec DD POLY alias "EDWIN_DD_POLY" (integer NP,
integer name xpts,ypts)
external routine spec DD CIRCLE alias "EDWIN_DD_CIRCLE"(integer x,y,rad)
external integer function spec DD INTCHECK alias "EDWIN_DD_INTCHECK"
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 OPUS 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 DD INTCHECK = 1
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 IBM PC-AT with OPUS board system"
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
Opus (4, wx, wy)
Opus (5, x, wy)
Opus (5, x, y)
Opus (5, wx, y)
Opus (5, wx, wy)
else
DD Rect (wx, wy, x, y)
finish
return
SW(14): ! Circle
dd circle(sx,sy,x)
return
SW(*):
end
from Edwin include Specs
external routine Set Device Viewport (integer x, y)
Dev Data_MVX = x
Dev Data_MVY = y
Viewport (0, x, 0, y)
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 scmode = Cmode, scolour = CCol
integer fmode = Smode
Cmode = 0 ; CCol = 1 ; Smode = 1
DD mode(CMode) ; DD Col(CCol)
DD fill(Smode)
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 = scmode ; DD mode(cmode)
CCol = scolour ; DD col(CCol)
Smode = fmode ; DD fill(Smode)
end
end of file