[Back to PRINTING SWAG index] [Back to Main SWAG index] [Original]
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 *****
[Back to PRINTING SWAG index] [Back to Main SWAG index] [Original]