! EDWIN driver for Oric MCP-40 4 colour plotter
! 1-APR-1987 ANY Written
from Edwin include Device
from Edwin include Icodes
from Edwin include Specs
! Control characters
const integer cr = 13
const integer DC1 = 17
const integer DC2 = 18
const integer esc = 27
const integer sp = ' '
const integer Min = '-'
const integer Comma = ','
! Plotter information
own integer CX = 0; !Current device position
own integer CY = 0
own integer PX = 0 {proper device position}
own integer PY = 0
own integer XL = 0
own integer XR = 679; !Right hand side of device window
own integer YB = 0
own integer YT = 479
own integer Colour = 1
own integer Pen Colour = 1
own integer Char Size = 2 {MCP-40 Size + 1, use 0 as "too wee, don't bother"}
own integer Edwin Char Size = 12
own integer Max X = 0
const integer Yes=1,No=0
own integer Drew Last = No
own integer Char Rot = 1
own integer Edwin Char Rot = 0
routine Newln
TTPut(CR)
end
routine TTString(string (255) Thing)
integer I
for I=1,1,Length(Thing) cycle
TTPut(Charno(Thing,I))
repeat
end
routine Sort Position
if PX # CX or PY # CY start
TTString("M".ITOS(PY,0).Comma)
if PX>0 then TTPut(Min)
TTString(ITOS(PX,0).CR)
CX = PX
CY = PY
finish
end
routine Check Draw
if Drew Last = Yes start
TTput(CR)
Drew Last = No
finish
end
routine update
flush output
end
external routine Oric alias "EDWIN___M" (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 CHANGE ATTRIBUTE (integer WHICH, TO)
integer i
switch AS(0:ATT MAXIMUM)
-> AS(WHICH)
AS(att Colour):
if To > 4 then To = 1
if To = Colour then return
Colour = To
if Colour # 0 start
TTPut('C')
TTPut(Colour+'0'-1)
Newln
finish
return
AS(att line style):
TTPut('L')
if To = 0 or To = 2 start
TTPut('0')
else if To = 1
TTput('2')
else if To = 3
TTput('7')
else if To = 4
TTString(ITOS(15,0))
finish
Newln
return
AS(att char size):
Edwin Char Size = To
Write(Edwin Char Size,0)
Newline
I = Edwin Char Size//6
if I > 63 then I = 63
if I # Char Size start
Char Size = I
if Char Size > 0 start
TTPut('S')
TTString(Itos(Char Size-1,0))
Newln
finish
finish
return
AS(Att Char Rot):
if To <=45 or To > 315 start
I = 1
else if 45 < To <=135
I = 0
else if 135 < To <= 225
I = 3
else if 225 < To <= 315
I = 2
finish
if Char Rot # I start
Char Rot = I
TTPut('Q')
TTPut(Char Rot+'0')
Newln
finish
return
AS(att char font):
return
AS(att colour mode):
return
AS(*): ! Ignore all other attributes
end
Write(COM,1)
Write(X,1)
Write(Y,1)
Newline
-> SW(COM)
SW(0): ! Initialise
dev data_name = "an MCP-40 Colour Printer"
dev data_dvx = 679
dev data_dvy = 479
dev data_Mvx = 999
dev data_Mvy = 479
dev data_Max Colour = 4
dev data_Max Styles = 4
dev data_Num Char Rots = 3
dev data_Num Char Sizes = 255
dev data_Units Per Cm = 50
dev data_X Units Per Cm = 50
dev data_Y Units Per Cm = 50
Set Device("EDWIN_MCP40")
TTString(DC1.CR.DC2."I".CR."L0".CR."S1".CR."C0".CR."Q1".CR)
return
SW(1): !Terminate
Check Draw
TTString("M0,")
if MaxX > 0 then TTPut(Min)
TTString(Itos(MaxX,0)) {Move to end of Plot}
Newln
TTString("L0")
Newln
TTstring("S1") {40 Col Mode}
Newln
TTstring("C0")
Newln
TTstring("Q0")
Newln
TTPut(DC1)
TTString(NL.NL.NL.NL)
flush output
return
SW(2): ! Update
Check Draw
Sort Position
flush output
return
SW(3): ! New frame
Check Draw
TTString("M0,")
if MaxX > 0 then TTPut(Min)
TTString(Itos(MaxX,0).CR) {Move to end of Plot}
TTString("I".CR)
TTString("M0,-40".CR)
TTString("I".CR)
CX = 0
CY = 0
PX = 0
CX = 0
MaxX = 0
return
SW(4): ! Move Abs
Check Draw
PX = X
PY = Y
if PX > MaxX then MaxX = PX
return
SW(5): ! Line Abs
if Colour # 0 start
if Drew Last = Yes start
TTPut(Comma)
else
Sort Position
TTPut('D')
finish
Drew Last = Yes
TTString(Itos(Y,0).Comma.Min.Itos(X,0))
CX=X
CY=Y
finish
PX=X
PY=Y
if X > MaxX then MaxX = X
return
SW(6): ! Character
Check Draw
if Char Rot = 1 start
CX = CX + (Char Size)*6
PX = PX + Edwin Char Size
else if Char Rot = 2
CY = CY - (Char Size)*6
PY = PY - Edwin Char Size
else if Char Rot = 3
CX = CX - (Char Size)*6
PX = PX - Edwin Char Size
else if Char Rot = 0
CY = CY + (Char Size)*6
PY = PY + Edwin Char Size
finish
if PX > MAxX then MaxX = PX
if Char Size = 0 then return
Sort Position
TTPut('P')
TTPut(X)
Newln
return
SW(7): ! Attribute Change
Check Draw
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(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.
Oric (4, Wx, Wy)
Oric (5, Wx, y)
Oric (5, x,y)
Oric (5, x, Wy)
Oric (5, Wx, wy)
return
SW(*):
end
end of file