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

  1. (* ------------------------------------------------------ *)
  2. (*                    DRUCKER.PAS                         *)
  3. (*         (c) 1990 Christian Büchel & TOOLBOX            *)
  4. (* ------------------------------------------------------ *)
  5. UNIT Drucker;
  6.  
  7. {$S-,I-,R-}
  8.  
  9. INTERFACE
  10.  
  11. USES Dos;
  12.  
  13. VAR
  14.   LST : Text;
  15.  
  16.   PROCEDURE AssignPrn(VAR F : Text; NrLpt : BYTE);
  17.  
  18. IMPLEMENTATION
  19.  
  20. TYPE
  21.   TextRec = RECORD
  22.               Handle    : WORD;      { DOS-Handle          }
  23.               Mode      : WORD;      { Modus               }
  24.               BufSize   : WORD;      { Puffergröße         }
  25.               Private   : WORD;
  26.               BufPos    : WORD;
  27.               BufEnd    : WORD;
  28.               BufPtr    : ^TextBuf;
  29.               OpenFunc  : POINTER;    { Routinen für       }
  30.               InOutFunc : POINTER;    { Open, Read/        }
  31.               FlushFunc : POINTER;    { Write, Flush       }
  32.               CloseFunc : POINTER;    { und Close          }
  33.               WhichPrn  : WORD;       { einzige neue Zeile }
  34.               UserData  : ARRAY [1..14] OF BYTE;
  35.                                       { 2 Bytes kürzer     }
  36.               Name      : ARRAY [0..79] OF CHAR;
  37.               Buffer    : TextBuf;    { Puffer in Dos      }
  38.             END;
  39.  
  40. {$F+}
  41.   FUNCTION OpenPrn(VAR F : TextRec) : INTEGER;
  42.   VAR
  43.     Regs  : Registers;
  44.     Error : WORD;
  45.   CONST
  46.     loop  : LONGINT = 0;
  47.   BEGIN
  48.     IF (F.WhichPrn > 3) OR (F.WhichPrn < 0) THEN BEGIN
  49.       OpenPrn := 151;            { IOresult : Unknown Unit }
  50.       Exit;
  51.     END;
  52.     Regs.ah := 1;
  53.     Regs.dx := F.WhichPrn;
  54.     Intr($17, Regs);
  55.     IF (Regs.ah AND 9) <> 0 THEN
  56.       Error := 160               { IOresult : time out     }
  57.     ELSE
  58.       Error := 0;                { Kein Fehler             }
  59.     IF Error = 0 THEN
  60.       REPEAT
  61.         Inc(loop);  { Diese Schleife verzögert Druckerinit }
  62.       UNTIL loop = $FFFF;
  63.              { Ohne diese "Verschnaufpause" wird erstes zu }
  64.              { druckendes Zeichen verschluckt !!!          }
  65.     OpenPrn := Error;
  66.   END;
  67.  
  68.   FUNCTION DummyPrn(VAR F : TextRec) : INTEGER;
  69.      { Wird zum Schließen der "Datei" (Drucker) aufgerufen }
  70.   BEGIN
  71.     DummyPrn := 0;
  72.   END;
  73.  
  74.   FUNCTION SendPrn(VAR F : TextRec) : INTEGER;
  75.      { Die eigentliche Druckroutine }
  76.   VAR
  77.     i    : Word;
  78.     Regs : Registers;
  79.   BEGIN
  80.     FOR i := 0 TO F.BufPos-1 DO BEGIN
  81.       Regs.ah := 0;
  82.       Regs.al := BYTE(F.BufPtr^[i]);    { Aus Puffer lesen }
  83.       Regs.dx := F.WhichPrn;
  84.       Intr($17, Regs);            { Direkt BIOS ansprechen }
  85.       IF (Regs.ah AND $20) <> 0 THEN BEGIN
  86.         SendPrn := 159;           { IOresult : paper out   }
  87.         Exit;
  88.       END;
  89.     END;
  90.     SendPrn  := 0;
  91.     F.BufPos := 0;
  92.   END;
  93.  
  94. {$F-}
  95.   PROCEDURE AssignPrn(VAR F : TEXT; NrLpt : BYTE);
  96.     { TextDatei Gerätetreiber initialisieren }
  97.   BEGIN
  98.     WITH TextRec(F) DO BEGIN
  99.       Handle    := $FFFF;   { Soll DOS nicht interessieren }
  100.       Mode      := fmclosed;
  101.       BufSize   := SizeOf(Buffer);
  102.       BufPos    := 0;
  103.       BufPtr    := @Buffer;
  104.       OpenFunc  := @OpenPrn;
  105.       InOutFunc := @SendPrn;
  106.       FlushFunc := @SendPrn;
  107.       CloseFunc := @DummyPrn;
  108.       WhichPrn  := NrLpt;               { Unser neues Feld }
  109.       Name[0]   := #0;
  110.     END;
  111.   END;
  112.  
  113. END.
  114. (* ------------------------------------------------------ *)
  115. (*                Ende von DRUCKER.PAS                    *)
  116.  
  117.