! EDWIN driver for Westward C2014 (Tektronix compatible?) terminals.
!############################################################################
!# #
!# 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 INVOKE CURSOR = 26
const integer ESCAPE = 27
const integer GRAPHMODE = 29
const integer ALPHAMODE = 31
const integer ERASE SCREEN = 12
const integer GRAPHICS STATE = 12
const integer VDU STATE = 8_62
const integer NUL = 0
const integer DEL = 127
! Screen information
own integer AMODE = 0 { Advanced mode for 4014
own integer MODE = 0 { 0 if alphamode
own integer SX = 0, SY = 0 { Current device position
own integer XL = 0 { Left hand side of device window
own integer XR = 1023 { Right hand side of device window
own integer YB = 0 { Bottom side of device window
own integer YT = 1023 { top side of device window
own integer VIS = 0 { 0 if CVP inside VW
own integer TCS = 13 { char size.
routine PAD (integer SYM,NO)
integer I
TTPUT (SYM) for I = 1,1,NO
end
routine UPDATE
PAD (NUL,4)
TTPUT (ALPHA MODE)
TTPUT (25) if TCS=24; ! Sets big chars on 4002
FLUSH OUTPUT
MODE=0
end
external routine SET COLOUR MAP alias "EDWIN___W_MAP" (integer ADR, RED, BLUE, GREEN)
! Still to be written
end
external routine WC2014 alias "EDWIN___W" (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
! Put out a text character properly.
UPDATE if MODE#0
TTPUT (X)
TTPUT (0)
SX = SX + TCS
VIS = 1 if SX>XR
end
routine GOTO(integer X,Y); !Code up coordinates and send to TTY
constinteger HI=32,LY=96,LX=64,ENH=7
TTPUT (Y>>5&31!HI); TTPUT (Y&31!LY)
! TTPUT ((ENH<<4)!(Y>>10&3)!(X>>10&3)) %if AMODE#0
TTPUT (X>>5&31!HI); TTPUT (X&31!LX)
end
routine CHANGE ATTRIBUTE
switch SW(0:ATT MAXIMUM)
-> SW(X)
SW(att Colour):
TTPUT (ESCAPE)
TTPUT ('[')
TTPUT ('C')
TTPUT (Y+'@')
return
SW(att Line style):
Y = 0 unless 0<=Y<=4
TTPUT (ESCAPE)
TTPUT (Y + 96)
return
SW(att Char size):
TTPUT (ESCAPE)
if Y < 8 start
TTPUT (';'); TCS=7
finish else if Y < 10 start
TTPUT (':'); TCS=9
finish else if Y < 13 start
TTPUT ('9'); TCS=13
finish else start
TTPUT ('8'); TCS=14
finish
SW(*): ! all other attributes ignored
end
-> SW(COM)
SW(0): ! Initialise
DEV DATA_NAME = "a Westward 2014 terminal"
DEV DATA_MVX = 1023
DEV DATA_MVY = 767
DEV DATA_DVX = 1023
DEV DATA_DVY = 767
TTMODE (1)
TTPUT (ESCAPE); TTPUT (GRAPHICS STATE)
return
SW(1): !Terminate
! PAD (NUL,4)
! TTPUT (ALPHA MODE)
TTPUT (ESCAPE); TTPUT (VDU STATE)
TTPUT (13)
TTPUT (10)
FLUSH OUTPUT
TTMODE (0)
return
SW(2): ! Update
UPDATE
return
SW(3): ! New frame
TTPUT (ESCAPE)
TTPUT (ERASE SCREEN)
PAD(0,120)
! PAD (DEL,960)
SX=0; SY=0; MODE=0
return
SW(4): ! Move Abs
TTPUT (GRAPH MODE)
GOTO (X,Y)
SX=X; SY=Y
MODE = 1; VIS=0
return
SW(5): ! Line Abs
if MODE=0 start
TTPUT (GRAPH MODE)
GOTO (SX,SY)
finish
GOTO (X,Y)
MODE = 1
SX=X; SY=Y
VIS=0
return
SW(6): ! Character
PUT CHAR if VIS=0
return
SW(7): ! Attribute Change
CHANGE ATTRIBUTE
return
SW(8): ! Ignore lower window bounds settings
return
SW(9): ! Upper window bounds
XR=X
SW(10): SW(11): ! Ignored
return
SW(12): ! Lower box bounds
WX = X; WY = Y
return
SW(13): ! Upper box bounds, and do the box
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.
TTPUT (ESCAPE); TTPUT (2); ! Box Mode
MODE = 1
WC2014 (5, WX, WY)
WC2014 (5, X, Y)
TTPUT (ESCAPE); TTPUT (3); ! Box Mode off again
return
SW(*):
end
external routine W REQ alias "EDWIN___W_REQ" (integer name CH, X, Y)
UPDATE
TEK INPUT (CH, X, Y, INVOKE CURSOR)
end
end of file