! EDWIN driver for HP2648A Raster-scan terminal.
!############################################################################
!# #
!# This is a module from the EDWIN Graphics Package, which was developed #
!# in the Department of Computer Science, at Edinburgh University, from #
!# 1978 to the present day, release 5 of EDWIN in October 1984. #
!# #
!# The principal author of the EDWIN Graphics Package was J Gordon Hughes, #
!# while working for the Edinburgh University Computer Sceince Department. #
!# Parts of EDWIN have been produced by many different people, too many #
!# too mention, working for different departments of Edinburgh and Leeds #
!# Universities. #
!# #
!# This module is regarded as being in the public domain, and the authors #
!# and accept no responsibility regarding the uses to which the software #
!# will be put. #
!# #
!############################################################################
from Edwin include Device
from Edwin include Icodes
! Control characters
const integer BEL = 7
const integer cr = 13
const integer DC1 = 17
const integer esc = 27
const integer sp = ' '
! Screen information
own integer SEQ = 0; ! Escape-sequence type
own integer SUBSEQ = 0; ! Escape-subsequence
own integer pend = 0; ! Pending char in sequence
own integer alpha = 0; ! Graphics text is on if # 0
own integer SX = 0; !Current device position
own integer SY = 0
own integer XL = 0
own integer XR = 719; !Right hand side of device window
own integer YB = 0
own integer YT = 300
own integer alpha disp = 1; ! = 0 if alpha is off
routine put ( integer i )
ttput(pend) if pend # 0
pend = i
end
routine put coord ( integer x )
! Codes up binary absolute coordinate
integer hi
hi = x >> 5
put( sp + hi&2_11111 )
put( sp + x &2_11111 )
end
routine goto ( integer x, y )
put coord(x)
put coord(y)
end
routine leave
return if seq = 0
seq = 0
pend = 'z' if pend = 0
put('z') unless 'a' <= pend <= 'z'
pend = pend + 'A' - 'a'
end
routine star ( integer sub )
return if seq = '*' and subseq = sub
leave
put(esc) ; put('*') ; put(sub) ; put(0) ; !no pending
put('i') if sub = 'p'; !plotting absolute
seq = '*' ; subseq = sub
end
routine aoff
return if alpha disp = 0
star('d') ; put('f')
alpha disp = 0
end
routine aon
return unless alpha disp = 0
star('d') ; put('e')
alpha disp = 1
end
routine chars on
return if alpha # 0
star('d') ; put('s')
alpha = 1
end
routine chars off
return if alpha = 0
star('d') ; put('t')
alpha = 0
end
routine update
chars off
aon
leave
put(0) ; !clear off pend
flush output
end
external routine HP2648 alias "EDWIN___R" (integer COM, X, Y)
own integer WX, WY
switch SW(0:MAX COM)
routine SWAP (integer name A, B)
integer C
C = A; A = B; B = C
end
routine PUT CHAR
chars on ; leave
put (x)
end
routine CHANGE ATTRIBUTE (integer WHICH, TO)
own byte array mapline(0:4) = '1','7','4','6','5'
integer i
switch AS(0:ATT MAXIMUM)
-> AS(WHICH)
AS(att line style):
star('m')
to = 0 unless 0<=to<=4
put(mapline(to)) ; put('b')
return
AS(att char size):
i = (to+3)//7
i = 1 if i < 1
i = 8 if i > 8
star('m') ; put(i+'0') ; put('m')
return
AS(att char font):
star ('m')
if to=0 then put ('o') else put ('p')
return
AS(att colour mode):
star ('m'); put ('0'+to); put ('a')
return
AS(*): ! Ignore all other attributes
end
-> SW(COM)
SW(0): ! Initialise
dev data_name = "an HP 2648 Terminal"
dev data_dvx = 719
dev data_dvy = 359
dev data_Mvx = 719
dev data_Mvy = 359
star('m') ; put('r') ; !set defaults
aoff
return
SW(1): !Terminate
update
return
SW(2): ! Update
update
return
SW(3): ! New frame
aoff
star('d') ; put('a')
return
SW(4): ! Move Abs
aoff
star('p')
put('a') ; goto (x,y)
sx=x; sy=y
return
SW(5): ! Line Abs
aoff
star('p')
if alpha # 0 start; !must move first
put('a')
goto (sx,sy)
finish
goto (x,y)
sx=x; sy=y
return
SW(6): ! Character
aoff
put char
return
SW(7): ! Attribute Change
change attribute (x, Y)
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.
HP2648 (4, Wx, Wy)
HP2648 (5, Wx, y)
HP2648 (5, x,y)
HP2648 (5, x, Wy)
HP2648 (5, Wx, wy)
return
SW(*):
end
external routine R REQ alias "EDWIN___R_REQ" (integer name CH, X, Y)
integer sym
integer function num
integer res
res = 0
sym = ttget until '0' <= sym <= '9'
while '0' <= sym <= '9' cycle
res = res*10+sym-'0'
sym = ttget
repeat
result = res
end
leave ; put(bel)
star('s') ; put('4') ; put('^') ; put(dc1) ; put(0)
flush output ; seq = 0
x = num ; y = num ; ch = num
sym = ttget while sym >= ' '
put(cr)
end
end of file