home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
12
/
tricks
/
drucker.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-09-11
|
3KB
|
117 lines
(* ------------------------------------------------------ *)
(* 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 *)