! EDWIN driver for the LEEDS SIGMA terminal.
from Edwin include Device
from Edwin include Icodes
from Imp include Ascii
const integer s = 1
const integer l = -1
const integer GRAPHICS = 1
const integer IN TEXT = -1
const integer UP = 1
const integer DOWN = -1
const integer array C SIZE(1:28) = 5,7,10,14,15,20,21,25,28,30,35,40,42,45,
49,50,55,56,60,63,65,70,75,77,88,91,98,105
const integer array C TYPE(1:28) = s, l, s, l, s, s, l, s, l, s, s, s, l,s,
l, s, s, l, s, l, s, s, s, l, l, l, l,l
const integer array C SCALE(1:28) =1,1,2,2,3,4,3,5,4,6,7,8,6,9,7,10,
11,8,12,9,13,14,15,11,12,13,14,15
const string(4) array LINE STYLES(0:4) = "FFFF","8888","F93F","C3C3","F00F"
own short Model = 5680 { Options 5680, 5684, 5688 }
own short Graph Mode = False
own integer char scale = 1
own integer MODE = GRAPHICS
own integer omode = 0 { Colour Overwrite mode }
own integer curcol = 1 { Current EDWIN colour number }
own integer last x = 0
own integer last y = 0
own integer X MIN = 0
own integer Y MIN = 0
own integer X MAX = 511
own integer Y MAX = 767
own integer VIS = 0
own integer TCS = 5
own integer PEN = UP
own integer move pending = FALSE
own integer TYPE C = s
own integer Shade mode = 0
own string (7) Init = "+-*/"
routine Hex (integer N)
const byte array H(0:15) = '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
if Model = 5688 start
TTput (H(N>>4&15))
finish
TTput (H(N&15))
end
routine Add (integer A, B)
TTput (a); TTput (b)
end
routine ADD STR (string(255) CMD)
integer I
TTput (Charno(CMD,I)) for I = 1, 1, Length(CMD)
end
routine PEN UP
ADD ('G','I')
PEN = UP
end
routine PEN DOWN
ADD ('G','J')
PEN = DOWN
end
routine TEXT ON
short s, t
t = char scale
if char scale > 9 start
s = 1
t = t - 10
else
s = 0
finish
ADD ('D','E'); TTput(s+'0'); TTput(t+'0'); Add ('B','A')
mode = IN TEXT
end
routine TEXT OFF
ADD STR ("+-*/")
mode = GRAPHICS
end
routine NUM(integer x)
integer d1, d2, d3
d1 = x//100
x = x - d1*100
d2 = x//10
d3 = x - d2*10
TTput (d1 + '0'); TTput (d2 + '0'); TTput (d3 + '0')
end
routine GOTO(integer X,Y);
NUM(x+100)
NUM(y+100)
end
routine do move
TEXT OFF if mode = IN TEXT
pen up
goto(last x,last y)
move pending = FALSE
end
external routine SET COLOUR MAP alias "EDWIN___S_MAP" (integer REG, RED, BLUE, GREEN)
TEXT OFF IF MODE = IN TEXT
if 0 <= reg <= 255 and 0 <= red <= 255 and c
0 <= blue <= 255 and 0 <= green <= 255 start
Add Str (init)
Add ('J', 'G')
hex(reg); hex(red); hex(green); hex(blue); hex(0)
TTput (nl)
Flush Output
Graph mode = False
finish
end
routine SET COLOURS
integer i
if Model#5688 start
SET COLOUR MAP(0,0,0,0)
SET COLOUR MAP(1,0,0,15)
SET COLOUR MAP(2,15,0,0)
SET COLOUR MAP(3,15,0,8)
SET COLOUR MAP(4,0,15,0)
SET COLOUR MAP(5,0,15,15)
SET COLOUR MAP(6,15,15,0)
SET COLOUR MAP(7,10,10,10)
SET COLOUR MAP(8,15,0,15)
SET COLOUR MAP(9,10,10,15)
SET COLOUR MAP(10,15,0,8)
SET COLOUR MAP(11,15,10,10)
SET COLOUR MAP(12,0,0,10)
SET COLOUR MAP(13,8,8,15)
SET COLOUR MAP(14,10,0,0)
SET COLOUR MAP(15,15,15,15)
else
SET COLOUR MAP(0,0,0,0)
SET COLOUR MAP(1,0,0,255)
SET COLOUR MAP(2,0,255,0)
SET COLOUR MAP(3,0,255,255)
SET COLOUR MAP(4,255,0,0)
SET COLOUR MAP(5,255,0,127)
SET COLOUR MAP(6,255,255,0)
SET COLOUR MAP(7,192,192,192)
SET COLOUR MAP(8,255,0,255)
SET COLOUR MAP(9,160,160,255)
SET COLOUR MAP(10,0,0,160)
SET COLOUR MAP(11,160,160,255)
SET COLOUR MAP(12,255,0,127)
SET COLOUR MAP(13,255,160,160)
SET COLOUR MAP(14,160,0,0)
SET COLOUR MAP(15,200,200,200)
SET COLOUR MAP(16,127,127,127)
SET COLOUR MAP(17,127,127,255)
SET COLOUR MAP(18,127,255,127)
SET COLOUR MAP(19,127,255,255)
SET COLOUR MAP(20,255,127,127)
SET COLOUR MAP(21,255,127,180)
SET COLOUR MAP(22,255,220,127)
SET COLOUR MAP(23,225,225,225)
SET COLOUR MAP(24,127,127,127)
SET COLOUR MAP(25,127,127,255)
SET COLOUR MAP(26,127,255,127)
SET COLOUR MAP(27,127,255,255)
SET COLOUR MAP(28,255,127,127)
SET COLOUR MAP(29,255,127,180)
SET COLOUR MAP(30,255,220,127)
SET COLOUR MAP(31,225,225,225)
SET COLOUR MAP(32,70,70,70)
for i = 33,1,63 cycle
SET COLOUR MAP(i,0,0,0)
repeat
for i = 64,1,127 cycle
SET COLOUR MAP(i,255,255,255)
repeat
for i = 128,1,255 cycle
SET COLOUR MAP(i,255,255,255)
repeat
finish
end
routine NEW FRAME
ADD ('H', 'J'); Hex (16_FF) { Enable all planes }
Add ('D', 'A') { Zero all enabled planes }
Add ('J', 'A'); Hex (16_FF) { Display all planes }
last x = 0
last y = 0
vis = 0
end
external routine SIGMA alias "EDWIN___S" (integer COM, X, Y)
own integer WX, WY
switch SW(0:MAX COM)
routine PUT CHAR
do move if move pending = TRUE
pen down if pen = UP
TEXT ON if MODE = GRAPHICS
last x=last x+TCS
if last x > X MAX start
vis = 1
else
TTput (x)
finish
end
routine CHANGE ATTRIBUTE (integer WHAT, TO)
const byte array CMAP (0:15) = 0, 15, 4, 1, 2, 6, 8, 5, 10, 3, 7, 9, 11, 12, 13, 14
{ Map EDWIN colours onto sigma colour map }
integer i
switch as(0:att maximum)
-> AS(What)
AS(att colour):
return unless 0<=to<=255
to = to & 15 if Model # 5688
cur col = to
add ('H','I')
if Model # 5688 start
HEX(CMAP(to))
else
HEX (to)
finish
if omode = 2 start { OR mode }
add ('H','J')
if Model # 5688 start
HEX(CMAP(to))
else
HEX (to)
finish
else
add ('H','J'); Hex (16_FF)
finish
return
AS(att line style):
TO = 0 unless 0<=TO<=4
if to = 0 start
ADD str ("FAFC")
else
ADD str ("FAFDDL".line styles(to))
finish
return
AS(att char size):
return if to = TCS
for i =28,-1,1 cycle
exit if to >= C SIZE(i)
repeat
if C TYPE(i) # TYPE C start
if C TYPE(i) = s start
ADD str ("EIIH006II010")
else
ADD ('E','N')
finish
finish
char scale = C SCALE(i)
TYPE C = C TYPE(i)
TCS = C SIZE(i)
return
AS(att shade mode):
Shade mode = to
return
AS(att colour mode):
! Mode 0 = Overwrite, Mode 2 = OR mode, others ignored
omode = to
to = CurCol
-> AS (att colour)
AS(*): ! All other attributes ignored
end
routine SWAP (integer name A, B)
integer C
C = A; A = B; B = C
end
! Main body of routine starts here.
if graph mode = False and Com#0 and Com#2 start
Add Str (init)
Graph Mode = True
finish
TEXT OFF if MODE = IN TEXT and COM # 6
-> SW(COM)
SW(0): ! Initialise
Model = X
DEV DATA_NAME = "a Sigma terminal"
DEV DATA_DVX = 767
DEV DATA_DVY = 511
DEV DATA_MVX = 767
DEV DATA_MVY = 511
if Model=5688 start
DEV DATA_MAX COLOUR = 255
else
DEV DATA_MAX COLOUR = 15
finish
TTMODE (1)
Init = snl."+-*/"
Add Str (init."GADD000DF019DG017")
Add ('C', 'M')
if Model = 5688 start
TTPUT ('1') { 8 plane operation }
else
TTPUT ('0') { 4 plane operation }
finish
Add ('H', 'N')
! Set up the function keys to enable/disable planes
if Model#5688 start
Add Str (init."HK10#".init."JA1#".snl)
Add Str (init."HK11#".init."JA2#".snl)
Add Str (init."HK12#".init."JA3#".snl)
Add Str (init."HK13#".init."JA4#".snl)
Add Str (init."HK14#".init."JA5#".snl)
Add Str (init."HK15#".init."JA6#".snl)
Add Str (init."HK16#".init."JA7#".snl)
Add Str (init."HK17#".init."JA8#".snl)
Flush Output { Sigma seems to like break after NL for these }
Add Str (init."HK18#".init."JA9#".snl)
Add Str (init."HK19#".init."JAA#".snl)
Add Str (init."HK20#".init."JAB#".snl)
Add Str (init."HK21#".init."JAC#".snl)
Add Str (init."HK22#".init."JAD#".snl)
Add Str (init."HK23#".init."JAE#".snl)
Add Str (init."HK24#".init."JAF#".snl)
else
Add Str (init."HK10#".init."HP$PL NI".tostring(13)."$#".init)
Add Str (init."HK11#".init."HP$PL ND".tostring(CR)."$#".init)
Add Str (init."HK12#".init."HP$PL NP".tostring(CR)."$#".init)
Add Str (init."HK13#".init."HP$PL NB".tostring(CR)."$#".init)
Add Str (init."HK14#".init."HP$PL NM".tostring(CR)."$#".init)
Add Str (init."HK15#".init."HP$PL NC".tostring(CR)."$#".init)
Add Str (init."HK16#".init."HP$PL NT".tostring(CR)."$#".init)
Add Str (init."HK17#".init."HP$PL NV".tostring(CR)."$#".init)
Add Str (init."HK18#".init."HP$PL NI ND NP NB NM NC NG NT NV".tostring(CR)."$#".init)
Add Str (init."HK24#".init."HP$PL -NI".tostring(CR)."$#".init)
Add Str (init."HK25#".init."HP$PL -ND".tostring(CR)."$#".init)
Add Str (init."HK26#".init."HP$PL -NP".tostring(CR)."$#".init)
Add Str (init."HK27#".init."HP$PL -NB".tostring(CR)."$#".init)
Add Str (init."HK28#".init."HP$PL -NM".tostring(CR)."$#".init)
Add Str (init."HK29#".init."HP$PL -NC".tostring(CR)."$#".init)
Add Str (init."HK30#".init."HP$PL -NT".tostring(CR)."$#".init)
Add Str (init."HK31#".init."HP$PL -NV".tostring(CR)."$#".init)
Add Str (init."HK32#".init."HP$PL -NI -ND NP -NB -NM -NC -NG -NT -NV".tostring(CR)."$#".init)
finish
Add Str (init)
NEW FRAME
Flush Output
SET COLOURS
return
SW(1): ! Terminate
Add ('H', 'N')
TTput (NL)
Graph Mode = False
Flush Output
TTMODE (0)
return
SW(3): ! New frame
NEW FRAME
SW(2): ! UPDATE
return if Graph Mode = False
TTput (NL)
Graph Mode = False
Flush Output
return
SW(4): ! Move Abs
move pending = TRUE
last x=X; last y=Y
return
SW(5): ! Line Abs
do move if move pending = TRUE
pen down if pen = UP
GOTO (X,Y)
MODE = GRAPHICS
last x=X; last y=Y
VIS=0
return
SW(6): ! Character
PUT CHAR if VIS=0
return
SW(7): ! Attribute Change
CHANGE ATTRIBUTE (X, Y)
return
SW(8): ! Ignore lower window bounds settings
X MIN = X; Y MIN = Y
return
SW(9): ! Upper window bounds
X MAX = X; Y MAX = Y
return
SW(11): ! Set Colour replacement mode (old entry point)
CHANGE ATTRIBUTE (att colour mode, X)
return
SW(12): ! Lower box bounds
WX = X; WY = Y
return
SW(13): ! Upper box bounds, and do box
SWAP (WX, X) if WX > X
SWAP (WY, Y) if WY > Y
return if WX > xmax or X < xmin or WY > ymax or Y < ymin
WX = xmin if WX < xmin
WY = ymin if WY < ymin
X = xmax if X > xmax
Y = ymax if Y > ymax
! Box now clipped into the screen.
TEXT OFF if MODE = IN TEXT
Add ('F','H'); Add('B','G')
sigma(4, WX, WY)
sigma(5, X, Y)
Add ('F','G')
return
SW(14): ! Circle fill
Do move
if Shade mode = 0 start
Add ('J', 'M')
else
Add ('J', 'N')
finish
Num (x+100)
TTput ('0')
return
SW(*): ! Other device commands ignored
end
external routine S REQ alias "EDWIN___S_REQ" (integer name STATE, X, Y)
integer T
integer function GET NUM
result = (TTGET - '0')*100 + (TTGET - '0')*10 + (TTGET - '0')
end
TEXT OFF if mode = IN TEXT
Add Str (init) if Graph Mode = False
Add ('C','A'); Add ('H','F')
TTput (nl); Flush Output
STATE = TTGET
X = get num
T = TTGET
Y = get num
T = TTGET
Add Str (Init)
Add ('C','B')
Graph Mode = True
end
endoffile