home *** CD-ROM | disk | FTP | other *** search
- { The following Program, LPRINT, illustrates how to do control a }
- { Printer directly without using the BIOS (Printers connected to }
- { the parallel port, not serial Printers connected to an RS-232 }
- { port). }
- { LPRINT checks to see if you want to print a line from the command }
- { prompt, as in: }
- { LPRINT Hello, World! }
- { If there's no command input, LPRINT checks For Characters at the }
- { "standard input," so you can print Files or directories using }
- { redirection or piping: LPRINT < myFile.pas }
- { DIR | LPRINT }
- { LPT1 is used. You can modify LPRINT to use another, or be able to }
- { specify which Printer via the command line (eg. /2 For LPT2,etc.) }
- { This source code is a bit cramped, to fit into one message. }
- { }
-
- Program LPRINT;
- Uses
- Dos;
- Const
- BusyB =$80; { status port 'busy' bit }
- AckB =$40; { status port 'ack' bit }
- Var
- DataP,
- Strobe,
- Status, { assigned lpt i/o ports }
- MaxWait : Word; { seconds before timing out }
- Done : Boolean; { sanity clause }
- Reg : Registers; { For Dos i/o }
- txtptr : Byte; { counter Byte }
-
- Procedure VerifyPrinter( Var Printer, Status, Strobe : Word );
- { check For presence of specified Printer - returning ports }
- begin
- if Printer in [1..3] then { must be known }
- begin
- DEC( Printer ); { For 0..2 }
- Printer := MemW[$40 : (Printer + 8 + Printer * 2)];
- if ((Port[Printer + 1] and AckB) = 0) then
- Printer := 0 { to say it's not there }
- else
- begin
- Status := Printer + 1;
- Strobe := Printer + 2;
- end
- end
- end; {VerifyPrinter}
-
- Procedure Print( DataP : Word; chout : Byte; Var Done : Boolean);
- { send Character to Printer port, With busy timeout and feedback }
- Var
- WaitTime : LongInt;
- Timer : LongInt Absolute 0:$046c;
- BusyWait : Word;
- begin
- BusyWait := 0;
- WaitTime := Timer;
- While ((Port[Status] and BusyB) = 0) and (BusyWait < MaxWait * 19) do
- { wait up to MaxWait seconds For non-busy state }
- BusyWait := Word( Timer - WaitTime );
- if BusyWait >= (MaxWait * 19) then { Printer "busy" For too long? }
- Done := False { failed }
- else
- begin
- Port[DataP] := chout; { send the Char data}
- Port[Strobe] := $0c; { strobe it in }
- Port[Strobe] := $0d; { reset strobe }
- Done := True; { success }
- end {else}
- end; {Print}
-
- begin {LPRINT}
- WriteLn(#10, 'LPRINT v1.0 G.S.Vigneault', #10);
- DataP := 1; { LPT1 }
- VerifyPrinter( DataP, Status, Strobe );
- { DataP will be 0 now if requested Printer didn't respond }
- if DataP = 0 then
- begin
- WriteLn('Printer not detected!',#10,#7);
- Halt(1);
- end;
- MaxWait := 10; { max wait 10sec before timing out lpt }
- if ParamCount = 0 then { no command-line input? }
- { handle redirected and piped }
- Repeat
- Reg.AH := $b; { to see if a Char is available }
- MsDos( Reg );
- if Reg.AL <> 0 then
- begin
- Reg.AH := 8; { get the Char }
- MsDos( Reg ); { via Dos }
- Print( DataP, Reg.AL, Done );{ lprint it }
- end; {if}
- Until (Reg.AL = 0) or not Done
- else { print the command line Text }
- begin
- txtptr := $82;
- Repeat
- Print( DataP, Mem[PrefixSeg:txtptr], Done );
- INC( txtptr );
- Until (Mem[PrefixSeg:txtptr] = 13) or not Done;
- if Done then
- Print( DataP, 10, Done); { lf }
- end;
- end {LPRINT}.
- (********************************************************************)