home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* DRUCKER.PAS *)
- (* (c) 1990 Christian Büchel & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT Drucker;
-
- {$S-,I-,R-}
-
- INTERFACE
-
- USES Dos;
-
- VAR
- LST : Text;
-
- PROCEDURE AssignPrn(VAR F : Text; NrLpt : BYTE);
-
- IMPLEMENTATION
-
- TYPE
- TextRec = RECORD
- Handle : WORD; { DOS-Handle }
- Mode : WORD; { Modus }
- BufSize : WORD; { Puffergröße }
- Private : WORD;
- BufPos : WORD;
- BufEnd : WORD;
- BufPtr : ^TextBuf;
- OpenFunc : POINTER; { Routinen für }
- InOutFunc : POINTER; { Open, Read/ }
- FlushFunc : POINTER; { Write, Flush }
- CloseFunc : POINTER; { und Close }
- WhichPrn : WORD; { einzige neue Zeile }
- UserData : ARRAY [1..14] OF BYTE;
- { 2 Bytes kürzer }
- Name : ARRAY [0..79] OF CHAR;
- Buffer : TextBuf; { Puffer in Dos }
- END;
-
- {$F+}
- FUNCTION OpenPrn(VAR F : TextRec) : INTEGER;
- VAR
- Regs : Registers;
- Error : WORD;
- CONST
- loop : LONGINT = 0;
- BEGIN
- IF (F.WhichPrn > 3) OR (F.WhichPrn < 0) THEN BEGIN
- OpenPrn := 151; { IOresult : Unknown Unit }
- Exit;
- END;
- Regs.ah := 1;
- Regs.dx := F.WhichPrn;
- Intr($17, Regs);
- IF (Regs.ah AND 9) <> 0 THEN
- Error := 160 { IOresult : time out }
- ELSE
- Error := 0; { Kein Fehler }
- IF Error = 0 THEN
- REPEAT
- Inc(loop); { Diese Schleife verzögert Druckerinit }
- UNTIL loop = $FFFF;
- { Ohne diese "Verschnaufpause" wird erstes zu }
- { druckendes Zeichen verschluckt !!! }
- OpenPrn := Error;
- END;
-
- FUNCTION DummyPrn(VAR F : TextRec) : INTEGER;
- { Wird zum Schließen der "Datei" (Drucker) aufgerufen }
- BEGIN
- DummyPrn := 0;
- END;
-
- FUNCTION SendPrn(VAR F : TextRec) : INTEGER;
- { Die eigentliche Druckroutine }
- VAR
- i : Word;
- Regs : Registers;
- BEGIN
- FOR i := 0 TO F.BufPos-1 DO BEGIN
- Regs.ah := 0;
- Regs.al := BYTE(F.BufPtr^[i]); { Aus Puffer lesen }
- Regs.dx := F.WhichPrn;
- Intr($17, Regs); { Direkt BIOS ansprechen }
- IF (Regs.ah AND $20) <> 0 THEN BEGIN
- SendPrn := 159; { IOresult : paper out }
- Exit;
- END;
- END;
- SendPrn := 0;
- F.BufPos := 0;
- END;
-
- {$F-}
- PROCEDURE AssignPrn(VAR F : TEXT; NrLpt : BYTE);
- { TextDatei Gerätetreiber initialisieren }
- BEGIN
- WITH TextRec(F) DO BEGIN
- Handle := $FFFF; { Soll DOS nicht interessieren }
- Mode := fmclosed;
- BufSize := SizeOf(Buffer);
- BufPos := 0;
- BufPtr := @Buffer;
- OpenFunc := @OpenPrn;
- InOutFunc := @SendPrn;
- FlushFunc := @SendPrn;
- CloseFunc := @DummyPrn;
- WhichPrn := NrLpt; { Unser neues Feld }
- Name[0] := #0;
- END;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von DRUCKER.PAS *)
-