UNIT HPUnit; { Handles all aspects of HP LASER JET PRINTERS} INTERFACE USES Crt, Dos; CONST Esc = #27; HPReset = #27'E'; (* Page sizes... *) Executive = #27'&l1A'; Letter = #27'&l2A'; Legal = #27'&l3A'; A4 = #27'&l26A'; Monarch = #27'&l80A'; Commercial10 = #27'&l81A'; InternationalDL = #27'&l90A'; InternationalCS = #27'&l91A'; (* orintation *) Portrait = #27'&l0O'; Landscape = #27'&l1O'; (* symbol set... *) HpRoman8 = #27'(8U'; PC8 = #27'(10U'; (* spacQcing... *) Fixed = #27'(s0P'; Proportional = #27'(s1P'; (* style... *) Upright = #27'(s0S'; Italic = #27'(s1S'; (* stroke... *) Medium = #27'(s0B'; Bold = #27'(s1B'; (* typeface... *) Lineprinter = #27'(s0T'; Courier = #27'(s3T'; Helv = #27'(s4T'; TmsRoman = #27'(s5T'; LetterGothic = #27'(s6T'; Prestige = #27'(s8T'; Presentations = #27'(s11T'; Optima = #27'(s17T'; TCGaramond = #27'(s18T'; CooperBlack = #27'(s19T'; CooperBold = #27'(s20T'; Broadway = #27'(s21T'; BauerBodoniBlackCondensed = #27'(s22T'; CenturySchoolBook = #27'(s23T'; UniversityRoman = #27'(s24T'; StartUnderLine = #27'&d0D'; StopUnderLine = #27'&d@'; (* functions and procedures ... *) FUNCTION Copies (CopyCount : INTEGER) : STRING; FUNCTION LinesPerPage (LineCount : INTEGER) : STRING; FUNCTION LinesPerInch (LineCount : INTEGER) : STRING; FUNCTION PrimaryPitch (Pitch : INTEGER) : STRING; FUNCTION PointSize (Points : REAL) : STRING; FUNCTION PitchSize (Pitch : REAL) : STRING; FUNCTION AbsHorizPos (Inches : REAL) : STRING; FUNCTION AbsVertPos (Inches : REAL) : STRING; PROCEDURE PlotXY (VAR PrnFile : TEXT;X, Y : REAL); PROCEDURE PlotX (VAR PrnFile : TEXT; X : REAL); PROCEDURE PlotY (VAR PrnFile : TEXT;Y : REAL); FUNCTION FontId (Id : INTEGER) : STRING; FUNCTION FontStatus (ID : INTEGER; Status : CHAR) : STRING; FUNCTION FontPrimORSec (ID : INTEGER; Status : CHAR) : STRING; PROCEDURE DownloadFont (FontFileName : STRING; Id : INTEGER; Status : CHAR; StatusX, StatusY, StatusFore, StatusBack : INTEGER); PROCEDURE EjectPage (VAR PrnFile : TEXT); IMPLEMENTATION CONST BlockSize = 4096; TYPE BufferType = ARRAY [0..BlockSize - 1] OF BYTE; VAR St : STRING; PROCEDURE WriteAT (x, y, f, b : BYTE; s : STRING); VAR cnter : WORD; vidPtr : ^WORD; attrib : WORD; BEGIN attrib := SWAP ( (b SHL 4) + f); vidptr := PTR ($B800, 2 * (80 * PRED (y) + PRED (x) ) ); IF lastmode = 7 THEN DEC (LONGINT (vidptr), $08000000); { MONO ?? } FOR cnter := 1 TO LENGTH (s) DO BEGIN vidptr^ := attrib OR BYTE (s [cnter]); INC (vidptr); END; END; FUNCTION Realstr (Num : REAL; D : BYTE) : STRING; { Return a string value (width 'w')for the input real ('n') } VAR Stg : STRING; BEGIN STR (Num : 10 : D, Stg); WHILE Stg [1] = #32 DO DELETE (Stg, 1, 1); Realstr := Stg; END; FUNCTION IntStr (Num : LONGINT) : STRING; VAR Stg : STRING; BEGIN STR (Num : 10, Stg); WHILE Stg [1] = #32 DO DELETE (Stg, 1, 1); IntStr := Stg; END; PROCEDURE Dta2Prn (BufferAddr : POINTER; BufferSize : LONGINT); EXTERNAL; {$L Dta2Prn.OBJ} FUNCTION Copies; (* Get the string for the copycount... *) BEGIN STR (CopyCount, St); Copies := Esc + '&l' + St + 'X'; END; FUNCTION LinesPerPage; BEGIN STR (LineCount, St); LinesPerPage := Esc + '&l' + St + 'F'; END; FUNCTION LinesPerInch; BEGIN STR (LineCount, St); LinesPerInch := Esc + '&l' + St + 'D'; END; FUNCTION PrimaryPitch; BEGIN STR (Pitch, St); PrimaryPitch := Esc + '(s' + St + 'H'; END; FUNCTION PointSize; BEGIN St := RealStr (Points, 2); PointSize := Esc + '(s' + St + 'V'; END; FUNCTION PitchSize; BEGIN St := RealStr (Pitch, 2); PitchSize := Esc + '(s' + St + 'H' END; FUNCTION AbsHorizPos; VAR Dots : REAL; DotSt : STRING; BEGIN Dots := Inches * 300; STR (ROUND (Dots), DotSt); AbsHorizPos := Esc + '*p' + DotSt + 'X'; END; FUNCTION AbsVertPos; VAR Dots : REAL; DotSt : STRING; BEGIN Dots := Inches * 300; STR (ROUND (Dots), DotSt); AbsVertPos := Esc + '*p' + DotSt + 'Y'; END; PROCEDURE PlotXY (VAR PrnFile : TEXT; X, Y : REAL); BEGIN WRITE (PrnFile, AbsHorizPos (X) ); WRITE (PrnFile, AbsVertPos (Y) ); END; PROCEDURE PlotX (VAR PrnFile : TEXT; X : REAL); BEGIN WRITE (PrnFile, AbsHorizPos (X) ); END; PROCEDURE PlotY (VAR PrnFile : TEXT; Y : REAL); BEGIN WRITE (PrnFile, AbsVertPos (Y) ); END; FUNCTION FontID; VAR IdSt : STRING; BEGIN STR (Id, IdSt); FontID := Esc + '*c' + IdSt + 'D'; END; FUNCTION FontPrimORSec; (* Is the font you're about to send primary or secondary? Send *) (* the function 'P' or 'S' *) VAR IdSt : STRING; BEGIN Status := UPCASE (Status); STR (Id, IdSt); CASE Status OF 'P' : FontPrimORSec := Esc + '(' + IdSt + 'X'; 'S' : FontPrimORSec := Esc + ')' + IdSt + 'X' ELSE FontPrimORSec := ''; END; (* Case *) END; FUNCTION FontStatus; VAR IdSt : STRING; BEGIN Status := UPCASE (Status); STR (Id, IdSt); CASE Status OF 'P' : FontStatus := Esc + '*c5' + 'F'; (* Permanent *) 'T' : FontStatus := Esc + '*c4' + 'F'; (* Temp *) ELSE FontStatus := ''; END; (* Case *) END; PROCEDURE DownloadFont; VAR ListFile : TEXT; PrnFile, FontFile : FILE; Buffer : BufferType; RecsRead : INTEGER; BEGIN ASSIGN (FontFile, FontFileName); RESET (FontFile, 1); ASSIGN (PrnFile, 'PRN'); REWRITE (PrnFile, 1); ASSIGN (ListFile, 'PRN'); REWRITE (ListFile); WRITE (ListFile, HPReset); WRITE (ListFile, FontID (Id) ); WHILE NOT (EOF (FontFile) ) DO BEGIN BLOCKREAD (FontFile, Buffer, SIZEOF (Buffer), RecsRead); IF (StatusX <> 0) OR (StatusY <> 0) THEN WriteAt (StatusX, StatusY, StatusFore, StatusBack, IntStr (ROUND (FILEPOS (FontFile) / FILESIZE (FontFile) * 100) ) + ' % downloaded...'); Dta2Prn (@Buffer, RecsRead); END; CLOSE (FontFile); WRITE (ListFile, FontStatus (Id, Status) ); WRITE (ListFile, FontPrimORSec (Id, 'P') ); CLOSE (PrnFile); CLOSE (ListFile); END; PROCEDURE EjectPage (VAR PrnFile : TEXT); BEGIN WRITE (PrnFile, Esc + '&l0H'); END; END. (* unit *) { CUT THIS OUT TO A SEPARATE FILE .. DTA2PRN.XX, and execute XX34 D filename to create the OBJ file needed for this unit *XX3402-000499-170789--72--85-40996-----DTA2PRN.OBJ--1-OF--1 U-Q+3IAuL3FEL2x0GZl2J22mI37C9Y3HHHe65k+++3FpQa7j623nQqJhMalZQW+UJaJmQqZj PW+l9X0uW-o+ECYgHisG3IAuL3FEL2x0GZl2J22mI37C9Y3HHMa6+k-+uImK+U++O7M4++F1 HoF3FNU5+0UP++6-+FeE1U+++ER2J22mI37C++++LsU3+21V4E+tW+E+E86-YMU3+21e-+-3 W+U+ECAM++M+8UK60E-+slY++++Y++y60E-+slc++++Y+Eq6M+-+sY++++++++JDH2F0I+d+ +U+++++5IYJIEIF2IUd+-++++++6EZJ4FYJGIpc8E+M+++++0I7JFYN3IZB3Fkd+0++++++7 EZJ4FYJGHoNH0Y+8++++U+R3HYFBEJ7903O62E-+slg5HotHJ231Gkg+6+++t6US+21c+-J1 CZlII3lDEYdQF3F-AZ-GHWt-IoogHisGWNEr+++-4U+++-g++E+d++A+8U+3+0o+0++i++g+ A++B+16+1k+n+-2+B++H+1Q+3E+s+-Q+CE+M+2061E-+tURDHZBIEIB94kQ7W-2+ECM5F3F- AZ-GHVY+++2++0K61U-+tUFCFJVI4E+++Eo+qe+T++2++3K9v1D7Wos2WrM6Ax6qf19YnFTW y6jZLQ64+288+U++R+++ ***** END OF BLOCK 1 *****