home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
- (*===================================================================*)
- (* PRINTER.PAS *)
- (* Ersatz für die Unit PRINTER.PAS der Borland-Pascal Laufzeit- *)
- (* Bibliothek *)
- (*-------------------------------------------------------------------*)
- (* Die Unit sucht sich bei der Initialisierung den passenden ange- *)
- (* schlossenen aktiven Drucker mit der niedrigsten Schnittstellen- *)
- (* nummer automatisch aus. Ist kein Drucker angeschlossen, wird in *)
- (* eine Datei mit dem Namen PRINTFIL.LPT gedruckt. *)
- (*===================================================================*)
-
- UNIT Printer;
-
- INTERFACE
-
- VAR
- Lst: Text;
-
- IMPLEMENTATION
- USES
- Dos;
- {$IFNDEF Ver70}
- CONST
- Seg0040: WORD = $40;
- {$ENDIF}
-
- VAR
- PrintFile: DirStr;
-
- VAR
- PrnNum: BYTE;
- OldExitProc: Pointer;
-
- PROCEDURE LstBinaryMode; { Procedure from Borland's Printer Unit }
- INLINE( { Nur als Inline, da der Assembler Lst.Handle ablehnt }
- $8B/$1E/Lst/ { MOV BX,Lst.Handle }
- $B8/$00/$44/ { MOV AX,4400H }
- $CD/$21/ { INT 21H }
- $80/$CA/$20/ { OR DL,20H }
- $B6/$00/ { MOV DH,0 }
- $B8/$01/$44/ { MOV AX,4401H }
- $CD/$21); { INT 21H }
-
- FUNCTION NumOfPorts: BYTE;
- VAR
- L1Adr, L2Adr,
- L3Adr, L4Adr: WORD;
- Num : BYTE;
- BEGIN
- Num := 0;
- L1Adr := WORD(Ptr(Seg0040, $0008)^); { LPT1 }
- L2Adr := WORD(Ptr(Seg0040, $000A)^); { LPT2 }
- L3Adr := WORD(Ptr(Seg0040, $000C)^); { LPT3 }
- L4Adr := WORD(Ptr(Seg0040, $000E)^); { LPT4 }
- IF L1Adr <> 0 THEN Inc(Num);
- IF L2Adr <> 0 THEN Inc(Num);
- IF L3Adr <> 0 THEN Inc(Num);
- IF L4Adr <> 0 THEN Inc(Num);
- NumOfPorts := Num;
- END;
-
- FUNCTION PrState(LPTNo: BYTE): BYTE;
- VAR
- check: BYTE;
- BEGIN
- IF LPTNo > 0 THEN BEGIN
- IF LPTNo < 5 THEN BEGIN
- Dec(LPTNo);
- ASM
- MOV AX, 0200h { Funktion 02h (AH) }
- MOV DL, LPTNo { Schnittstellennummer - 1 }
- XOR DH, DH
- INT 17h { Schnittstelleninterrupt }
- MOV check, AH { Rückgabe in AH }
- END;
- END ELSE check := 2;
- END ELSE check := 2;
- PrState := check;
- END;
-
- (*===================================================================*)
- (* Rückgabewerte: (NEC-Nadeldrucker u.a.) *)
- (* 0 = Drucker wird gerade initialisiert --> *)
- (* bitte warten! *)
- (* 1 = Drucker TimeOut *)
- (* 2 = Parallele Schnittstelle No. (LptNo) ist nicht *)
- (* vorhanden *)
- (* 8 = Drucker ist nicht selektiert (unselect-Signal) *)
- (* 16, 24 = Drucker nicht bereit (z.T. auch: Drucker im *)
- (* Grafikmodus) *)
- (* 40 = kein Papier (Paper-out Signal) *)
- (* 48 = Schnittstelle ok und frei (kein Drucker *)
- (* angeschlossen) *)
- (* 56 = Kabel am Rechner, aber kein externes Gerät *)
- (* angeschlossen *)
- (* 72, 184 = Drucker aus *)
- (* 80, 144, 208 = Printer ON LINE *)
- (* 200 = Printer OFF LINE *)
- (*===================================================================*)
-
- FUNCTION SelectPrinter: BYTE;
- VAR
- count, Number, check: BYTE;
- BEGIN
- Number := $FF; { vorbelegt: Dateidruck! }
- FOR count := NumOfPorts DOWNTO 1 DO
- BEGIN
- { Schnittstelle mit niedrigster Nummer wählen: }
- check := PrState(count);
- IF check IN [80, 144, 208] THEN Number := count;
- END;
- SelectPrinter := Number; { Druckerschnittstelle ist festgelegt }
- END;
-
- {$F+}
- PROCEDURE PrinterExitProc;
- VAR
- l: File OF BYTE;
- BEGIN
- Close(Lst);
- Assign(l, PRINTFILE);
- Reset(l);
- IF FileSize(l) = 0 THEN
- BEGIN
- Close(l);
- Erase(l);
- END
- ELSE
- Close(l);
- ExitProc := OldExitProc;
- END;
- {$F-}
-
- VAR
- Year, Month, Day, DayofWeek,
- Hour, Minute, Second, Sec100: WORD;
- YearS, MonthS, DayS, HourS : STRING;
- PrgDir : DirStr;
- PrgName: NameStr;
- PrgExt : ExtStr;
-
- BEGIN
- PrnNum := SelectPrinter;
- IF PrnNum = $FF THEN
- BEGIN
- PrgDir := '';
- IF Lo(DosVersion) > 2 THEN
- FSplit(ParamStr(0), PrgDir, PrgName, PrgExt);
- GetDate(Year, Month, Day, DayofWeek);
- GetTime(Hour, Minute, Second, Sec100);
- Str(Year, YearS);
- Delete(YearS, 1, 2);
- Str(Month, MonthS);
- Str(Day, DayS);
- Str(Hour, HourS);
- IF Length(DayS) = 1 THEN DayS := '0' + DayS;
- IF Length(MonthS) = 1 THEN MonthS := '0' + MonthS;
- PrintFile := PrgDir + DayS + MonthS + YearS + HourS + '.PRN';
- Assign(Lst, PrintFile);
- Rewrite(Lst);
- OldExitProc := ExitProc;
- ExitProc := @PrinterExitProc;
- END
- ELSE
- BEGIN
- CASE PrnNum OF
- 1: Assign(Lst, 'LPT1');
- 2: Assign(Lst, 'LPT2');
- 3: Assign(Lst, 'LPT3');
- ELSE Assign(Lst, 'LPT4');
- END;
- Rewrite(Lst);
- LstBinaryMode;
- END;
- END.
-
- (*===================================================================*)
-