! EDWIN driver for the HP plotter range of HP-GL based plotters !############################################################################ !# # !# 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 from Edwin include consts from Imp include Maths from Imp include Lognames from Imp include Textutils !%external %string (31) %spec Fname ! Control characters const integer ETX = 3 const integer ESC =27 const integer DEL = 127 ! The following should be an external integer spec to the UTILITY module. const integer BUFF SIZE = 251 ! Screen information own integer PLOT ACTIVE = FALSE; ! FALSE => using terminal, TRUE => PLOTTER active own integer LAST COM = 0; ! Used to optimise lines in the HP protocol own integer SX = 0; ! Current device position own integer SY = 0 own integer XL = 0, YB = 0; ! Lower window bounds. own integer YT = 25 * 400; ! Upper device window bound. own integer XR = 40 * 400; ! Right hand side of device window own byte CUR COL = 1; ! Current colour. own byte PM = FALSE; ! Pending move. own byte PC = FALSE; ! Pending colour change. own byte NEWFRAMED = FALSE; ! TRUE => NEW FRAME done own byte TEXT MODE = FALSE; ! TRUE while in text mode own byte Fill Mode = 0; ! 0 => Outline own integer Char Size = 250 { Character size, <6 => don't draw characters own integer Char Rot = 0 own integer Char Font = 0 own integer Char Mirror = 0 own integer Char Qual = 0 own integer Char Slant = 0 own byte Need Char Size = True own byte Need Char Rot = True own byte Need Char Font = True own byte Need Char Slant = False own byte Need Limits = False own byte Line Mode = 1; ! Line style own byte Rmode = 0 { shade polygons = 3, Normal lines = 1 own byte Escapes = True { Add escape sequences to HPGL own byte Fill Required = True { Can be used to generally suppress shape fill own integer NLINES = 0; ! Number of lines drawn ( = size of polygon) own integer INBUFF = 32; ! This is the initialisation code own string (255) Temp = "", Str = "" own byte Any Speed = False own byte Any Force = False own byte Any Acceleration = False own byte Any Thickness = False ! Configuration parameters - const integer MAX COLOUR = 16 const integer MAX LINE = 6 const integer MAX Fill = 7 const integer NUM HP = 9 const integer HPunk = 0, HP7220 = 1, HP7580 = 2, HP7585 = 3, HP7440 = 4 const integer HP7586 = 5, HP7470 = 6, HP7475 = 7, HP7550 = 8, HP7570 = 9 own integer current dev = False const short array DEV NUMS (0:NUM HP) = -7221, 7220, 7580, 7585, 7440, 7586, 7470, 7475, 7550, 7570 own byte array NUM PENS (0:NUM HP) = 4, 4, 8, 8, 8, 8, 2, 6, 8, 8 own integer array MAX X (0:NUM HP) = 16000, 16000, 30240, 44380, 10900, 44380, 10900, 16158, 15970, 40000 own integer array MAX Y (0:NUM HP) = 11400, 11400, 21520, 31480, 7650, 31480, 7650, 11040, 10870, 33600 const byte array Has Fill (0:NUM HP) = 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 const byte array Has Poly (0:NUM HP) = 0, 0, 0, 1, 1, 1, 0, 0, 1, 1 const byte array Has Force (0:NUM HP) = 0, 0, 1, 1, 1, 1, 0, 0, 1, 1 const byte array Has NR (0:NUM HP) = 0, 0, 1, 1, 0, 1, 0, 0, 0, 1 const byte array True Origin (0:NUM HP) = 1, 1, 0, 0, 1, 0, 1, 1, 1, 0 own string (15) array COLOUR NAME (1:MAX COLOUR) = "black", "blue", "green", "red", "magenta", "orange", "cyan", "brown", "orange", "violet", "pen 11", "pen 12", "pen 13", "pen 14", "pen 15", "pen 16" own byte array SLOT USED (0:MAX COLOUR) = 0, 4, 3, 2, 1, 0 (*) own byte array SLOT TO USE (0:MAX COLOUR) = 0, 4, 3, 2, 1, 3, 1, 2, 4, 3, 4, 1 (*) const byte array TWO SLOT TO USE (0:MAX COLOUR) = 0, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2 const byte array FOUR SLOT TO USE (0:MAX COLOUR) = 0, 4, 3, 2, 1, 3, 1, 2, 4, 3, 4, 3, 2, 1, 4, 3, 2 const byte array SIX SLOT TO USE (0:MAX COLOUR) = 0, 4, 3, 2, 1, 5, 6, 2, 4, 3, 6, 5, 4, 3, 2, 1, 6 const byte array EIGHTSLOT TO USE (0:MAX COLOUR) = 0, 4, 3, 2, 1, 5, 6, 7, 8, 3, 6, 5, 4, 3, 2, 1, 7 own byte array PEN SPEED (0:MAX COLOUR) = 0(*) own byte array PEN FORCE (0:MAX COLOUR) = 0(*) own byte array PEN ACCELERATION (0:MAX COLOUR) = 0(*) own real array PEN THICKNESS (0:MAX COLOUR) = 0(*) const byte array LINE STYLE MAP (0:MAX LINE) = '0','1','4','2','3','5','6' const real array LINE STYLE LEN (0:MAX LINE) = 0.0, 0.5, 5.0, 1.0, 5.0, 5.0, 5.0 const byte array Fill style (1:MAX Fill) = '1','3','3','3','3','4','4' const short array Fill Angle (1:MAX Fill) = 0, 0, 90, 45, -45, 45, 0 const string (127) HP NEW FRAME MESSAGE STR = "Enter a sheet of paper, type YES to go on: " external routine HP SET PEN alias "EDWIN_HP_SETPEN" (string (15) NAME, integer LOG NO, SLOT NO) return unless 1<=LOGNO<=MAX COLOUR COLOUR NAME (LOG NO) = NAME SLOT TO USE (LOG NO) = SLOT NO end external routine HP NEW FRAME MESSAGE alias "EDWIN_HP_MESSAGE" (string (127) MESSAGE) Oper Message ("Please remove the call to HP NEW FRAME MESSAGE!") end routine ADD (integer ONE, TWO) TTPUT (';') TTPUT (ONE) TTPUT (TWO) end routine ADD STR (string (255) STR) integer I TTPUT (CHARNO(STR,I)) for I = 1, 1, LENGTH(STR) end routine HP OUT NUM (integer I) ADD STR (ITOS (I, 0)) end routine HP LINE (integer X, Y); ! Go the the current X Y point own byte PATH COUNT = 0 PATH COUNT = (PATH COUNT + 1) & 7 if LAST COM = DEV LINE start TTPUT (',') if Path Count # 0 else ADD ('P', 'D') return if SX=X and SY=Y; ! Just a point ADD ('P', 'R') PATH COUNT = 1 finish TTPUT (NL) and ADD ('P', 'R') if PATH COUNT = 0 HP OUT NUM (X - SX) TTPUT (',') HP OUT NUM (Y - SY) LAST COM = DEV LINE end ! Protocol Handling routines routine HP INSTRUCTION (integer WHICH) return if Escapes = False TTPUT (ESC); TTPUT ('.'); TTPUT (WHICH) end routine END TEXT MODE TTPUT (ETX) TEXT MODE = FALSE end routine RESERVE (integer N) ! Test to see if N chars. will fit in the buffer if Viewing # 0 or CURRENT DEV#HP7220 start { No action } else IN BUFF = IN BUFF + N if IN BUFF>BUFF SIZE start END TEXT MODE if TEXT MODE = TRUE HP INSTRUCTION ('L') FLUSH OUTPUT N = TTREAD until N > ' ' N = TTREAD until N < ' '; ! Ignore the response IN BUFF = 0 finish finish end routine PON return if Viewing # 0 HP INSTRUCTION ('(') PLOT ACTIVE = TRUE end routine POF TTPUT (';') RESERVE (BUFF SIZE); ! force out anything which is present. TTPUT (NL) if Escapes = True start HP INSTRUCTION (')') TTPUT (13) finish FLUSH OUTPUT PLOT ACTIVE = FALSE end routine SET GRAPHICS LIMITS (integer LX, LY, HX, HY) integer X Base, Y Base RESERVE (25) PON if PLOT ACTIVE # TRUE END TEXT MODE if TEXT MODE = TRUE if True Origin(CURRENT DEV) = True start X Base = 0 Y Base = 0 else X Base = MAXX(CURRENT DEV) // 2 Y Base = MAXY(CURRENT DEV) // 2 finish TTPUT (NL) ADD ('I', 'P') HP OUT NUM (LX-X Base); TTPUT (','); HP OUT NUM (LY-Y Base); TTPUT (',') HP OUT NUM (HX-X Base); TTPUT (','); HP OUT NUM (HY-Y Base) ADD ('S', 'C') TTPUT ('0'); TTPUT (','); HP OUT NUM (HX-LX); TTPUT (',') TTPUT ('0'); TTPUT (','); HP OUT NUM (HY-LY) ADD ('I', 'W') if X Base = 0 start HP OUT NUM (LX); TTPUT (','); HP OUT NUM (LY); TTPUT (',') HP OUT NUM (HX); TTPUT (','); HP OUT NUM (HY) else HP OUT NUM (0); TTPUT (','); HP OUT NUM (0); TTPUT (',') HP OUT NUM (HX-LX); TTPUT (','); HP OUT NUM (HY-LY) finish Need Char Size = True TTPUT (NL) Need Limits = False end routine CHECK PLOTTING AND NO TEXT PON if PLOT ACTIVE # TRUE SET GRAPHICS LIMITS (XL, YB, XR, YT) if Need Limits = True END TEXT MODE if TEXT MODE = TRUE end routine CHECK FOR PENDING COLOURS AND MOVES integer I routine COLOUR (integer I) I = I - NUM PENS (CURRENT DEV) while I > NUM PENS (CURRENT DEV) ADD ('S', 'P'); TTPUT (I + '0') return if I = 0 if Has Force (Current Dev) = True start if Any Acceleration = true start Add ('A', 'S') Add Str (Itos(Pen Acceleration(Cur Col),0)) if Pen Acceleration(Cur Col)#0 finish if Any Force = true start Add ('F', 'S') Add Str (Itos(Pen Force(Cur Col),0)) if Pen Force(Cur Col)#0 finish if Any Thickness = true start Add ('P', 'T') Add Str (Rtos(Pen Thickness(Cur Col),-1,1)) if Pen Thickness(Cur Col) >= 0.1 finish finish if Any Speed = true start Add ('V', 'S') Add Str (Itos(Pen Speed(Cur Col),0)) if Pen Speed(Cur Col)#0 finish end PON if PLOT ACTIVE # TRUE if PC = TRUE start if Viewing = 0 and CUR COL > 0 and SLOT USED(CUR COL)=0 start ! Ask the user to change to a new pen COLOUR (0) POF OPER INTERACT ("Enter a ".COLOUR NAME(CUR COL)." pen in slot ".ITOS(SLOT TO USE (CUR COL),0).", YES to go on: ") for I = 1, 1, MAX COLOUR cycle SLOT USED (I) = 0 if SLOT USED (I) = SLOT TO USE (CUR COL) repeat SLOT USED (CUR COL) = SLOT TO USE (CUR COL) PON finish ADD ('P', 'U') COLOUR (SLOT USED (CUR COL)) finish if PC=TRUE or PM=TRUE start ADD ('P', 'U') ADD ('P', 'A'); HP OUT NUM (SX) TTPUT (','); HP OUT NUM (SY) TTPUT (NL) finish COLOUR (SLOT USED (CUR COL)) if PC=TRUE PC = FALSE PM = FALSE end routine UPDATE if PLOT ACTIVE=TRUE start RESERVE (10) PC = TRUE PM = TRUE CHECK FOR PENDING COLOURS AND MOVES POF finish end routine NEW FRAME integer OLD COL on 9 start CUR COL = OLD COL; SX = XL; SY = YB; PM = TRUE; PC = TRUE signal 9 finish PON if PLOT ACTIVE # TRUE SX = XR; SY = YT; PM = TRUE; ! Goto the edge. OLD COL = CUR COL; ! remember current colour. PC = TRUE; CUR COL = 0; ! Drop pen if Has NR (CURRENT DEV) = True start if NEWFRAMED=TRUE start ADD ('N', 'R'); TTPUT (';'); FLUSH OUTPUT OPER MESSAGE ("Press REMOTE on the plotter to continue") finish else if CURRENT DEV = HP7550 or Current Dev = HP7586 ADD ('P','G'); TTPUT (';') else if VIEWING = 0 start UPDATE ! %unless Fname = "DRAFT" %or Fname = "WAVE" %start OPER INTERACT (HP NEW FRAME MESSAGE STR) ! %finish finish finish NEW FRAMED = TRUE ! Restore default state after newframe. CUR COL = OLD COL; SX = XL; SY = YB; PM = TRUE; PC = TRUE end external routine HPPLOT alias "EDWIN___H" (integer COM, X, Y) own integer WX = 0, WY = 0 switch SW (0:MAX COM) routine SWAP (integer name A, B) integer C C = A; A = B; B = C end routine New HPGL Char settings const string (5) array ANGLE (0: 7) = "1,0", "1,1", "0,1", "-1,1", "-1,0", "-1,-1", "0,-1", "1,-1" real X, Y return if Char Size < 20 { Text too small to draw } if Need Char Size = True start ADD ('S', 'R') TTPUT ('-') if Char Mirror & Mirror in Y Axis # 0 ADD STR (Rtos(Char Size*67/(XR-XL),0,3)) TTPUT (',') TTPUT ('-') if Char Mirror & Mirror in X Axis # 0 ADD STR (RtoS(Char Size*100/(YT-YB),0,3)) Need Char Size = False finish if Need Char Rot = True start ADD ('D', 'I') if Char Rot # 0 start if Rem(Char Rot,45)=0 start ADD STR (ANGLE((Char Rot//45)&7)) else x = 100*Cos(Char Rot/DtoR) y = 100*Sin(Char Rot/DtoR) ADD STR (Rtos(x,0,3)) TTPUT (',') ADD STR (Rtos(y,0,3)) finish finish Need Char Rot = False finish if Need Char Font = True start ADD ('C', 'C') and TTPUT ('1') if Dev Nums (Current Dev) > 7500 ADD ('C', 'A') TTPUT ('1') if Char Qual >= 2 TTPUT (Char Font + '0') ADD ('C', 'S') TTPUT ('1') if Char Qual >= 2 TTPUT (Char Font + '0') Need Char Font = False finish if Need Char Slant = True start ADD ('S', 'L') TTPUT ('-') if Char Slant<0 ADD STR (RtoS(TAN(|Char Slant| / DtoR), 0, 3)) if Char Slant#0 Need Char Slant = False finish end routine NEW HP ATTRIBUTE (integer X, Y) switch AS (0:Att Maximum) -> AS (X) AS(att colour): Y = 1 unless 0<=Y<=MAX COLOUR CUR COL = Y PC = TRUE return AS(att Line Style): Line mode = Y ADD ('L', 'T') if 0<Y<=MAX LINE start TTPUT ('-') if Dev Nums (CURRENT DEV) > 7500 TTPUT (LINE STYLE MAP (Y)) TTPUT (',') ADD STR (RtoS(LINE STYLE LEN (Y), 0, 3)) finish return AS(att Char Size): Char Size = Y Need char Size = True return AS(att char rot): Char Rot = Y Need Char Rot = True return AS(att char quality): ! <2 => low quality, 5' tolerance, >2 => highest quality. Char Qual = Y Need Char Font = True return AS(att char font): Y = 0 unless 0 <= Y <= 5 Char Font = Y Need Char Font = True return AS(att char slant): ! Char slant Char Slant = Y Need Char Slant = True return AS(att shade mode): Fill Mode = Y if Fill Required = True and Has Fill (CURRENT DEV) = True start if 1<=y<=Max fill start Add ('F', 'T') if y = 1 and 0 < Pen Speed (Cur Col) < 30 start TTPUT ('2') { High Quality shading } else TTPUT (Fill style(y)) finish Add Str (",50,".Itos(Fill angle(y),0)) else Add Str (";FT4,".Itos(Y*10,0).",0") finish else Fill Mode = 0 finish return AS(att char mirror): Char Mirror = Y Need Char Size = True AS(*): end END TEXT MODE if LAST COM = DEV CHAR and COM#DEV CHAR LAST COM = COM if COM # DEV LINE ! select output (0); write (com,1); write (x,1); write (y,1); newline -> SW (COM) SW(0): ! Initialise CURRENT DEV = -1 Y = 0 Y = 8 and X=X//10 if REM(X,10)=8 for COM = 0, 1, NUM HP cycle CURRENT DEV = COM if DEV NUMS (COM) = X repeat signal 14, 0 if CURRENT DEV < 0 NUM PENS (CURRENT DEV)=8 if Y=8 Temp = ItoS (X, 0) DEV DATA_TYPE = X DEV DATA_NAME = "an HP ".Temp." plotter" begin on 3,4 start Oper Message ("Error in HP Plotter Paper size specification") signal 14, 1 finish Str = "EDWIN_".ItoS(X,0)."_X" Temp = Translate(Str) if Temp # Str start Max X (Current Dev) = Stoi (Temp) * 40 finish Str = "EDWIN_".ItoS(X,0)."_Y" Temp = Translate (Str) if Temp # Str start Max Y (Current Dev) = Stoi (Temp) * 40 finish signal 4 if Max X (Current Dev) < 1000 or Max Y (Current Dev) < 1000 end DEV DATA_DVX = MAX X (CURRENT DEV) DEV DATA_DVY = MAX Y (CURRENT DEV) DEV DATA_MVX = MAX X (CURRENT DEV) DEV DATA_MVY = MAX Y (CURRENT DEV) DEV DATA_UNITS PER CM = 400 DEV DATA_X UNITS PER CM = 400 DEV DATA_Y UNITS PER CM = 400 DEV DATA_MAX COLOUR = NUM PENS (CURRENT DEV) DEV DATA_NUM CHAR SIZES = 255 DEV DATA_NUM CHAR ROTS = 255 if NUM PENS(CURRENT DEV)=2 start SLOT USED (Y) = 0 and SLOT TO USE (Y) = TWO SLOT TO USE (Y) for Y = 3,1,8 finish else if NUM PENS (CURRENT DEV) = 4 start SLOT USED (Y) = 0 and SLOT TO USE (Y) = FOUR SLOT TO USE (Y) for Y = 5,1,8 finish else if NUM PENS (CURRENT DEV) = 6 start SLOT USED (Y) = 0 and SLOT TO USE (Y) = SIX SLOT TO USE (Y) for Y = 5,1,8 SLOT USED (Y) = SLOT TO USE (Y) for Y = 5,1,6 finish else if NUM PENS (CURRENT DEV) = 8 start SLOT USED (Y) = 0 and SLOT TO USE (Y) = EIGHT SLOT TO USE (Y) for Y = 5,1,8 SLOT USED (Y) = SLOT TO USE (Y) for Y=5,1,8 finish Temp = "EDWIN_HP_NOESCAPES" if Translate(Temp) # Temp start Oper Message ("EDWIN_HP_NOESCAPES is obsolete definition, use EDWIN_".- ItoS(Dev Data_Type,0)."_ESCAPES") signal 14, 1 finish Temp = "EDWIN_".ItoS(Dev Data_Type,0)."_ESCAPES" if Temp = Translate (Temp) start Escapes = True else Temp = Translate (Temp) To Upper (Temp) if Temp="ON" start Escapes = True else if Temp="OFF" Escapes = False else Oper Message ("Unknown setting """.Temp.""" for EDWIN_". - ItoS(DevData_Type,0)."_ESCAPES must be ON or OFF") signal 14, 1 finish finish Temp = "EDWIN_HP_FILL" if Translate(Temp) # Temp start Temp = Translate (Temp) To Upper (Temp) if Temp = "YES" start Fill Required = True else if Temp = "NO" Fill Required = False else Oper Message ("Unknown setting """.Temp.""" for EDWIN_HP_FILL".- " must be YES or NO") signal 14, 1 finish else Fill Required = True finish Temp = "EDWIN_".ItoS(Dev Data_Type,0) if TRANSLATE(Temp)#Temp and Viewing = 0 start SET DEVICE (Temp) finish TTMODE (1) if ESCAPES = TRUE start PON HP INSTRUCTION ('J') { Cancel any current device control info } HP INSTRUCTION ('K') { Zap anything else which is in the buffer } HP INSTRUCTION ('M'); ADD STR ("0;;10;:"); ! Set output mode unless CURRENT DEV = HP7220 start ! Place plotter in ^S ^Q mode HP INSTRUCTION ('I'); ADD STR (";;17;:") HP INSTRUCTION ('N'); ADD STR (";19;:") finish finish ADD ('P', 'U'); ADD ('I', 'N') INBUFF = 32 SX = XL; SY = YB; PM = TRUE NEW FRAMED = FALSE Need Limits = True POF; PON Temp = Temp."_PEN_MAP" if Translate (Temp)#Temp start Com = Input Stream begin integer I on 9 start Oper Message ("Cannot open HP PEN MAP file """.Temp.- """ (default pen mapping will be used)") return finish Temp = Translate (Temp) Open Input (3, Temp) Select Input (3) Slot Used (I) = 0 for I = 1, 1, Max Colour Any Speed = False Any Force = False Any Acceleration = False Any Thickness = False begin string (23) Concept integer I, Slot, Speed, Acceleration, Force real Thickness routine Skip Spaces Skip Symbol while Next Symbol # NL and Next Symbol <= ' ' end on 3,4,9 start if Event_Event # 9 start Oper Message ("Invalid ".concept." for colour """.temp."""") Read Symbol (Temp) until Temp=Nl else Close Input Select Input (Com) return finish finish cycle Speed = 0; Force = 0; Acceleration = 0; Thickness = 0 Read (Temp) To Upper (Temp) Concept = "slot number" Read (Slot) skip spaces if Next Symbol # NL start Concept = "pen speed" Read (Speed) Any Speed = true if Speed # 0 Skip Spaces if Next Symbol # NL start Concept = "pen force" Read (force) Any Force = true if Force # 0 Skip Spaces if Next Symbol # NL start Concept = "pen acceleration" Read (acceleration) Any Acceleration = true if acceleration # 0 Skip Spaces if Next Symbol # NL start Concept = "pen thickness" Read (thickness) Any Thickness = True finish finish finish finish Skip Symbol while Next Symbol # NL Skip Symbol for I = 1, 1, Max Edwin Colour cycle if Edwin Colours (I) = Temp or Temp = "BLACK" start I = 1 if Temp = "BLACK" if Slot <= Num Pens (Current dev) start Slot to Use (I) = Slot Slot Used (Slot) = I Pen Speed (I) = Speed Pen Force (I) = Force Pen Acceleration (I) = Acceleration Pen Thickness (I) = Thickness else Oper Message ("Slot number ".ItoS(Slot,0). - " in HP PEN MAP is too large (ignored)") finish exit else if I=Max Edwin Colour Oper Message ("Unknown Colour """.Temp.- """ in HP PEN MAP file (ignored)") finish repeat repeat end end finish return SW(1): ! Terminate SET GRAPHICS LIMITS (XL, YB, XR, YT) ADD ('D', 'F') CUR COL = 0; PC = TRUE RESERVE (10) CHECK FOR PENDING COLOURS AND MOVES if Viewing = 0 and Escapes = True start ! Wait for plot to complete POF HP INSTRUCTION ('L') FLUSH OUTPUT COM = TTREAD until COM > ' ' COM = TTREAD until COM < ' '; ! Ignore the response PON finish if Has NR (CURRENT DEV) = True start ADD ('N', 'R') else if Current Dev = HP7550 ADD ('P','G') finish TTPUT (';') if Viewing = 0 start POF TTMODE (0) else TTPUT (NL) FLUSH OUTPUT CLOSE OUTPUT finish return SW(2): ! Update UPDATE if Viewing = 0 and Escapes = True start ! Wait for plot to complete HP INSTRUCTION ('L') FLUSH OUTPUT COM = TTREAD until COM > ' ' COM = TTREAD until COM < ' '; ! Ignore the response finish return SW(3): ! New frame SET GRAPHICS LIMITS (XL, YB, XR, YT) if Need Limits = True NEW FRAME return SW(4): ! Move Abs NEW FRAME if NEW FRAMED # TRUE SX = X - XL; SY = Y - YB; PM = TRUE if Rmode=3 {polygons} start Add ('L', 'T') if Line Mode # 0 Check for Pending Colours and Moves Add ('P', 'M') and TTput ('0') if Fill Required = True finish return SW(5): ! Line Abs NEW FRAME if NEW FRAMED # TRUE PON if PLOT ACTIVE # TRUE SET GRAPHICS LIMITS (XL, YB, XR, YT) if Need Limits = True RESERVE (30) if Viewing = 0 or LAST COM # DEV LINE CHECK FOR PENDING COLOURS AND MOVES X = X - XL; Y = Y - YB HP LINE (X, Y) NLINES = NLINES + 1 SX = X; SY = Y return SW(6): ! Character return if Char Size < 20 NEW FRAME if NEWFRAMED # TRUE PON if PLOT ACTIVE # TRUE SET GRAPHICS LIMITS (XL, YB, XR, YT) if Need Limits = True RESERVE (3) if Viewing = 0 or TEXT MODE # TRUE if TEXT MODE # TRUE start CHECK FOR PENDING COLOURS AND MOVES NEW HPGL Char Settings {if required} TTPUT (NL) ADD ('L', 'B') TEXT MODE = TRUE finish TTPUT (X) return SW(7): ! New attribute PON if PLOT ACTIVE # TRUE return if X > Att Maximum RESERVE (10) if Viewing = 0 NEW HP ATTRIBUTE (X, Y) return SW(8): ! Lower window bounds X = 0 if X<0 XL = X Y = 0 if Y<0 YB = Y return SW(9): ! Upper window bounds X = MAXX (CURRENT DEV) if X > MAXX (CURRENT DEV) XR = X Y = MAXY (CURRENT DEV) if Y > MAXY (CURRENT DEV) YT = Y Need Limits = True return SW(10): ! Polygons? if Has Poly (Current Dev) = True start if RMODE = 3 start if Fill Required = True start ADD ('P', 'M'); TTPUT ('2') if Nlines > 1 start ADD ('F', 'P'); ADD ('E', 'P'); finish Nlines = 0 finish New HP Attribute (1, Line Mode) if Line Mode # 0 finish RMODE = X finish return SW(11): return { ignore mode settings } 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. NEW FRAME if NEW FRAMED # TRUE PON if PLOT ACTIVE # TRUE SET GRAPHICS LIMITS (XL, YB, XR, YT) if Need Limits = True RESERVE (30) if Viewing = 0 or LAST COM # DEV LINE Add ('L','T') if Line Mode # 0 if Fill Mode = 0 start HPPLOT (4, WX, WY) HPPLOT (5, X, WY) HPPLOT (5, X, Y) HPPLOT (5, WX, Y) HPPLOT (5, WX, WY) else SX = WX - XL; SY = WY - YB; PM = TRUE CHECK FOR PENDING COLOURS AND MOVES SX = X - XL; SY = Y - YB; PM = TRUE Add ('R','R'); HP Out Num (X-WX); TTput (','); HP Out Num (Y-WY) Add ('E','R'); HP Out Num (X-WX); TTput (','); HP Out Num (Y-WY) finish New HP Attribute (1, Line Mode) if Line Mode # 0 return SW(14): { Hardware circles } { X is the Radius, and Y is used as a temp } RESERVE (20) if Fill Mode # 0 start CHECK FOR PENDING COLOURS AND MOVES ADD ('W', 'G'); Add Str (Itos(X,0).",0,360") ADD ('E', 'W'); Add Str (Itos(X,0).",0,360") else CHECK FOR PENDING COLOURS AND MOVES ADD ('C', 'I'); HP OUT NUM (X) finish return SW(15): return end external routine HP C ARC alias "EDWIN_HP_C_ARC" (integer RAD, integer IA, FA) integer OX, OY RESERVE (20) OX = SX; OY = SY SX = SX + INT (RAD * COS (IA / DtoR)); SY = SY + INT (RAD * SIN (IA / DtoR)); PM = TRUE NEWFRAME if NEWFRAMED # TRUE CHECK PLOTTING AND NO TEXT CHECK FOR PENDING COLOURS AND MOVES ADD ('P', 'D') ADD ('A', 'R') HP OUT NUM (OX-SX); TTPUT (','); HP OUT NUM (OY-SY); TTPUT (',') FA = FA - 360 if FA > IA HP OUT NUM (FA-IA) ADD ('P', 'U') SX = OX; SY = OY; PM = TRUE end external routine HP AC ARC alias "EDWIN_HP_AC_ARC" (integer RAD, integer IA, FA) integer OX, OY RESERVE (20) OX = SX; OY = SY SX = SX + INT (RAD * COS (IA / DtoR)); SY = SY + INT ( RAD * SIN (IA / DtoR)); PM = TRUE NEWFRAME if NEWFRAMED # TRUE CHECK PLOTTING AND NO TEXT CHECK FOR PENDING COLOURS AND MOVES ADD ('P', 'D') ADD ('A', 'R') HP OUT NUM (OX-SX); TTPUT (','); HP OUT NUM (OY-SY); TTPUT (',') FA = FA + 360 if FA<IA HP OUT NUM (FA-IA) ADD ('P', 'U') SX = OX; SY = OY; PM = TRUE end external routine H REQ alias "EDWIN___H_REQ" (integer name STATE, X, Y) integer I, S on 1,2,3,4,5,6,7,8 start signal 14, 4 finish routine RAS (integer name V) ! Read and Skip symbol integer I V = 0 I = TTREAD if I='-' then S=-1 and I=0 else S=1 cycle V = V*10+(I-'0') I = TTREAD exit unless '0'<=I<='9' repeat V = V * S end signal 14, 8 if Viewing # 0 CHECK PLOTTING AND NO TEXT CHECK FOR PENDING COLOURS AND MOVES ADD ('D', 'P') cycle ADD ('O', 'S'); TTPUT (';'); FLUSH OUTPUT RAS (I) repeat until I&4#0 ADD ('O', 'D'); TTPUT (';'); FLUSH OUTPUT RAS (X); RAS (Y); RAS (STATE) STATE = STATE << 4 { for compatability } POF FLUSH OUTPUT end end of file