! EDWIN driver for Versatec Plotters driven via the Versaplot Library ! ! Rev 001 AET 18-03-88 Changed 'draw lines' to draw from second co-ord set. ! Rev 002 AET 23-11-88 Made changes for edwin patterns ! record format Point fm (integer x, y) from Edwin include Device from Edwin include Icodes from Imp include Lognames, Textutils include Versatec include Iprocs include Pattern external routine Versatec alias "EDWIN___K" (integer COM, X, Y) const string (17) Versatec Options = "VERSATEC_OPTIONS" const string (19) Versatec Controller = "VERSATEC_CONTROLLER" const string (15) Versatec Disk = "VERSATEC_DISK" const string (15) Versatec Tape = "VERSATEC_TAPE" const string (15) Versatec Memory = "VERSATEC_MEMORY" string (255) Temp own real UPCM = 200 ! Screen information own integer XL = 0 own integer XR = 511 own integer YB = 0 own integer YT = 511 own integer MAX PLOT X, MAX PLOT Y own byte Active = False, Called = False, Controller = 0 own short Shade Mode = 0 own integer Style = 0 own short Model = 9999 ! NB: following table does not include Thermal plotters with fixed paper size const integer Max Versatec = 37 own short array Models (1:Max Versatec) = 80, 81, 82, 7222, 7422, 7224, 7424, 7225, 7425, 7236, 7436, 7244, 7444, 8122, 8222, 8124, 8224, 8136, 8236, 8142, 8242, 8244, 8252, 8259, 8172, 8272, 8242, 9242, 3224, 3236, 800, 900, 1100, 1200, 1600, 2000, 2160 own real array Max Ys (1:Max Versatec) = 10.555, 10.230, 10.550, 21.115, 21.1175, 23.035, 23.0375, 23.515, 23.5175,35.195, 35.1975,43.035, 43.0375, 21.110, 21.115, 23.030, 23.035, 35.190, 35.195, 40.950, 40.955, 43.035, 52.115, 58.475, 71.670, 71.675, 40.955, 39.995, 22.555, 34.235, 7.990, 7.995, 10.230, 10.555, 9.994, 18.550, 17.994 own short Colour Model = False own integer array Colour Map (0:7) = 1, 1, 5, 7, 6, 3, 4, 2 own integer array On 1 (0:4) = 0, 2, 8, 3, 6 own integer array Off 1 (0:4) = 0, 6, 3, 5, 2 own integer array On 2 (0:4) = 0, 2, 2, 3, 6 own integer array Off 2 (0:4) = 0, 6, 3, 5, 2 integer array IARG (1:7) real array RARG (1:7) record format Data Fm (record (point fm) p, record (Data Fm) name Next) own record (Data fm) name Point List == 0 own record (Data fm) name Next point == 0 own real SX, SY, UX, UY own integer WX, WY, Nlines = 0 switch SW(0:MAX COM) routine Fault (string (255) S) Oper Message ("Fatal Error - ".S) stop end routine SWAP (integer name A, B) integer C C = A; A = B; B = C end routine draw lines record (Data fm) name PP real array X, Y (1:Nlines) integer i return if Point List == Nil SX = point list_p_x; Sy = point list_p_y Plot (SX, SY, Move To) if nlines <= 2 start SX = point list_next_p_x; SY = point list_next_p_y Plot (SX, SY, Draw To) else X(1) = SX Y(1) = SY pp == point list_next for I = 2, 1, Nlines cycle X(i) = PP_p_X; Y(i) = PP_p_Y Plot (x(i), y(i), Draw To) pp == pp_next repeat NewPen (Izero) if Style # 0 Tone (X(1), Y(1), NLINES, Ione) NewPen (style) if Style # 0 finish Active = True nlines = 0 end routine CHANGE ATTRIBUTE (integer WHAT, TO) switch AS (0:ATT MAXIMUM) -> AS (WHAT) AS(att colour): if Colour Model = True start if TO = 0 start TO = 9 finish if TO < 8 start TonFlg (Izero) else TonFlg (Ione) TonClr (To) To = 1 finish NewPen (Colour Map(To)) finish return AS(att Line Style): NewPen (To) and Style=To if Colour Model # True return AS(att Shade mode): Shade Mode = To To = 1 unless 0<=To<=31 To = 0 if To = 1 SetPat (To) return AS(*): ! All other attributes ignored end draw lines if nlines > 1 and (com = 10 or COM < 5) -> SW(COM) SW(0): ! Initialise Model = X DEV DATA_TYPE = X DEV DATA_NAME = "a Versatec model ".Itos(X,0)." plotter" if Called = False start forini ! If Model is a 9294 or a 3000 or 2000 series then use colour mode if Model = 9242 or 2000 < Model < 4000 start if 2756 <= Model <= 2766 start Iarg (1) = 3 Iarg (2) = 4 Iarg (3) = 3 Iarg (4) = 2 Iarg (5) = 0 X = 101 { Initialise for Colour Plotting } Vpopt (X, Iarg(1), Rarg(1), com) else Iarg (1) = 4 Iarg (2) = 1 Iarg (3) = 2 Iarg (4) = 3 Iarg (5) = 4 X = 101 { Initialise for Colour Plotting } Vpopt (X, Iarg(1), Rarg(1), com) finish finish ! Set Plotter Model Rarg (1) = 200 { Nibs per inch } Iarg (2) = 264 { Bytes / Scan } if 2000 < Model < 3000 { New colour models } start IArg (1) = 9999 { New Model } if Model = 2558 or Model = 2568 start R Arg (1) = 400 else if Model = 2756 or Model = 2766 ! We need to find the Bytes/Scan for Thermal <<<<<<<<< I Width = 2 { Minimum width, usually 2 } R Arg (1) = 300 if Model = 2756 start I Arg (2) = 400 else I Arg (2) = 424 finish finish X = 1 { Change default plotter Model } Vpopt (X, Iarg(1), Rarg(1), com) R Arg (1) = 0.0 R Arg (3) = 0.0 if Model = 2756 start R Arg (2) = 14.83 else R Arg (2) = 14.37 finish R Arg (4) = I Arg (2) * 8 / 300 X = 2 { Change default paper dimensions } Vpopt (X, Iarg(1), Rarg(1), com) else Iarg (1) = Model X = 1 { Change default plotter Model } Vpopt (X, Iarg(1), Rarg(1), com) if 3000 < Model < 4000 start R Arg (1) = 0.0 R Arg (3) = 0.0 if Model = 3224 start R Arg (2) = 22.555 else if Model = 3236 R Arg (2) = 34.235 else { %if Model = 3244 I Arg (1) = 3236 R Arg (2) = 42.200 finish R Arg (4) = R Arg (2) X = 2 { Change default paper dimensions } Vpopt (X, Iarg(1), Rarg(1), com) else if Model = 80 { Default to A3 length } R Arg (1) = 0.0 R Arg (2) = 16.5 R Arg (3) = 0.0 R Arg (4) = 10.555 X = 2 { Change default paper dimensions } Vpopt (X, Iarg(1), Rarg(1), com) finish finish ! Test for Paper size options begin string (255) Str, temp long real MX, MY integer I on 3,4 start Oper Message ("Error in Versatec Plotter Paper size specification") signal 14, 1 finish Str = "EDWIN_".ItoS(Model,0)."_X" Temp = Translate(Str) if Temp # Str start MX = Stoi (Temp) / 25.4 signal 4 if MX < 4 else MX = 0 finish Str = "EDWIN_".ItoS(Model,0)."_Y" Temp = Translate (Str) if Temp # Str start MY = Stoi (Temp) / 25.4 signal 4 if MY < 4 else MY = 0 finish if MX#0 start R Arg (1) = 0.0 R Arg (2) = MX R Arg (3) = 0.0 R Arg (4) = MY if MY=0 start for I = 1, 1, Max Versatec cycle R Arg (4) = Max Ys (I) if Model = Models (I) repeat finish X = 2 { Change default paper dimensions } Vpopt (X, Iarg(1), Rarg(1), com) finish end ! Check controller configuration: ! a) Is it going to a Tape Temp = Translate (Versatec Tape) if Temp # Versatec Tape start To Upper (Temp) if Temp # "N" and Temp # "Y" and Temp # "NO" and Temp # "YE" - and Temp # "YES" and Temp # "430" start Fault ("Unknown setting """.Temp.""" for ".Versatec Tape) finish if charno(temp,1)='N' start Iarg (1) = 0 else if temp="430" Iarg (1) = 1 else Iarg (1) = 2 finish X = 36 { Mag tape output flag } Vpopt (X, Iarg(1), Rarg(1), com) finish ! b) What type of controller Temp = Translate (Versatec Controller) if Temp # Versatec Controller start To Upper (Temp) if Temp # "REP" and Temp # "VRC" and Temp # "RPM" start Fault ("Unknown setting """.Temp.""" for ".Versatec Controller) finish if Temp="REP" start Controller = 1 else if Temp="VRC" Controller = 3 else Controller = 4 finish Iarg (1) = Controller X = 15 { Specify target output controller } Vpopt (X, Iarg(1), Rarg(1), com) finish ! c) Does it have a disk Temp = Translate (Versatec Disk) if Temp # Versatec Disk start To Upper (Temp) if Temp # "N" and Temp # "Y" and Temp # "NO" and Temp # "YE" - and Temp # "YES" start Fault ("Unknown setting """.Temp.""" for ".Versatec Disk) finish if charno(temp,1)='N' start Iarg (1) = 0 { No disk } else if Controller = 4 start Iarg (1) = 2 { RPM with disk } else Iarg (1) = 1 { REP with disk } finish finish X = 17 { Disk/No Disk flag } Vpopt (X, Iarg(1), Rarg(1), com) if Controller = 4 start Iarg (1) = 2 X = 41 { RPM Disk Usage Flag } Vpopt (X, Iarg(1), Rarg(1), com) finish finish Temp = Translate (Versatec Memory) if Temp # Versatec Memory start begin on * start Fault ("Unknown setting """.Temp.""" for ".Versatec Memory) finish Rarg(1) = StoR (Temp) end X = 34 { RPM controller Memory size } Vpopt (X, Iarg(1), Rarg(1), com) finish ! Initialise the Versatec package X = 0; Y = 0 X = 1 if Translate (Versatec Options) # Versatec Options PLOTS (X, Y, Izero) ! Inquire the Units being used X = -1; Iarg(1) = 0 VPOPT (X, IARG(1), RARG(1), COM) UPCM = RArg (1) ! Inquire the paper size X = -2; Iarg(1) = 0 VPOPT (X, IARG(1), RARG(1), COM) ! The 0.1 is because the paper size seems just too large (rounding?) MAX PLOT X = Trunc ((Rarg(2)-0.1) * Upcm) MAX PLOT Y = Trunc ((Rarg(4)-0.1) * Upcm) ! Inquire whether it is a colour plotter X = -101; Iarg(1) = 0 VPOPT (X, IARG(1), RARG(1), COM) if Iarg(1)<2 start Colour Model = False for Com = 0, 1, 4 cycle DefPen (Com, Ione, On1(Com), Off1(Com), On2(Com), Off2(Com)) repeat else Colour Model = True for Com = 1, 1, 7 cycle if Iwidth=2 and Com=1 then X = 8 else X=Com PenClr (Com, X) DefPen (Com, Iwidth, Izero, Izero, Izero, Izero) repeat finish Read Patterns(Int(UPCM*2.54)) for Com = 1, 1, Max Pat cycle Rotate Pattern(Patterns(Com*16),-1) repeat X = 16 DefPat (Com, Patterns(Com*16), X) for Com = 1, 1, Max Pat SetPat (Izero) Point List == New (Point List) Point List_Next == Nil Called = True finish Active = False Dev Data_Max Colour = 255 if Colour Model = True Dev Data_Units per CM = UPCM/2.54 Dev Data_X Units per cm = UPCM/2.54 Dev Data_Y Units per cm = UPCM/2.54 Dev Data_DVX = MAX PLOT X Dev Data_DVY = MAX PLOT Y Dev Data_MVX = Dev Data_DVX Dev Data_MVY = Dev Data_DVY return SW(1): !Terminate PLOT (Zero, Zero, End Plot and Job) Active = False return SW(2): ! Update return SW(3): ! New frame if Active # False start SX = 0 and SY = 0 Plot (SX, SY, End Plot) Active = False if Colour Model = False start for Com = 0, 1, 4 cycle DefPen (Com, Ione, On1(Com), Off1(Com), On2(Com), Off2(Com)) repeat NewPen (Style) else for Com = 1, 1, 7 cycle PenClr (Com, Com) DefPen (Com, Ione, Izero, Izero, Izero, Izero) repeat finish X = 16 DefPat (Com, Patterns(Com*16), X) for Com = 1, 1, Max Pat SetPat (Izero) SX = XL; UX = XR; SY = YB; UY = YT WINDOW (SX, UX, SY, UY) SX = XL / UPCM UX = XR / UPCM SY = YB / UPCM UY = YT / UPCM VPORT (SX, UX, SY, UY) finish return SW(4): ! Move Abs SX = X; SY = Y PLOT (SX, SY, Move to) point list_p_x = x; point list_p_y = y Next point == point list Nlines = 1 return SW(5): ! Line Abs if Shade Mode = 0 start SX = X; SY = Y PLOT (SX, SY, Draw to) Active = True else return if next point_p_x=x and next point_p_y=y Nlines = Nlines + 1 if Next point_next == Nil start Next point_next == New (Next point) Next point == Next point_next Next point_next == Nil else Next point == next point_next finish next point_p_x = x; next point_p_y = y finish return SW(6): ! Character signal 14, 14 SW(7): ! Attribute Change CHANGE ATTRIBUTE (X, Y) return SW(8): ! Set lower window settings XL = X; YB = Y return SW(9): ! Set upper window bounds XR = X; YT = Y SX = XL; UX = XR; SY = YB; UY = YT WINDOW (SX, UX, SY, UY) SX = XL / UPCM UX = XR / UPCM SY = YB / UPCM UY = YT / UPCM VPORT (SX, UX, SY, UY) return SW(10): ! Mode change 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 > 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. if Shade Mode # 0 start SX = WX; SY = WY; UX = X; UY = Y NewPen (Izero) if Style # 0 Rect (SX, UX, SY, UY, Ione) NewPen (style) if Style # 0 Active = True else Versatec (4, WX, WY) Versatec (5, X, WY) Versatec (5, X, Y) Versatec (5, WX, Y) Versatec (5, WX, WY) finish return SW(14): ! Circle UX = X UX = - UX if Shade Mode = 0 Circle (SX, SY, UX, Ione) return SW(*): end !%begin ! %integer x ! prompt ("Model: ") ! read (x) ! versatec (0, x, 0) ! print string (Dev Data_name.nl) ! write (dev data_Units Per Cm,1); newline !%end end of file