! 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