home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 02 / praxis / spool.mod < prev    next >
Encoding:
Modula Implementation  |  1989-11-15  |  4.4 KB  |  197 lines

  1. (********************************************************)
  2. (*                   SPOOL.MOD                          *)
  3. (* Implementations-Modul zur Ansteuerung des DOS-PRINT  *)
  4. (*         über den Multiplexer-Interrupt 2FH           *)
  5. (*      (C) Copyright 1989,1990 Jörg Heuser & toolbox   *)
  6.  
  7. IMPLEMENTATION MODULE Spool;
  8.  
  9. (* Dieses Modul stellt die Prozeduren zur Verfügung, die
  10.    zum Zugriff auf den DOS-Spooler 'PRINT' notwendig sind.
  11.    Der Zugriff geschieht über den Multiplex-Interrupt 2FH,
  12.    der die Kommunikation zwischen zwei im Rechner laufenden
  13.    Prozessen übernimmt. Der Zugriff auf die im Multiplex-
  14.    Interrupt eingelinkten Programm, erfolgt über das
  15.    AH-Register. Bei PRINT ist AH = 1. Die Auswahl der unter-
  16.    schiedlichen Funktionen erfolgt über das AL-Register.
  17. *)
  18.  
  19. FROM SYSTEM IMPORT Registers, CarryFlag, Ofs, Seg;
  20. IMPORT Lib;
  21. IMPORT Str;
  22.  
  23. TYPE QueueBuffer = ARRAY[0..31], [0..63] OF CHAR;
  24.      Ptr         = RECORD
  25.                      CASE :BOOLEAN OF
  26.                        TRUE :
  27.                          Ofs  : CARDINAL;
  28.                          Seg  : CARDINAL;
  29.                      | FALSE:
  30.                          Adr  : ADDRESS;
  31.                      END;
  32.                    END;
  33.      Ptr2        = POINTER TO QueueBuffer;
  34.  
  35. CONST
  36.   PRINTintr    =     2FH;
  37.  
  38. VAR
  39.   PRINTinstalled : BOOLEAN;
  40.   LastError      : CARDINAL;
  41.   PrtBufAdr      : Ptr;
  42.   PrtBufPos      : Ptr2;
  43.  
  44. PROCEDURE GetInstalledState(): CARDINAL;
  45. VAR
  46.   Reg : Registers;
  47. BEGIN
  48.   WITH Reg DO
  49.     AH := 1;
  50.     AL := 0;
  51.     Lib.Intr(Reg, PRINTintr);
  52.     RETURN CARDINAL(AL);
  53.   END;
  54. END GetInstalledState;
  55.  
  56. PROCEDURE SubmitFile(FileName : QueueEntryTyp);
  57. VAR
  58.   SubmitPacket : RECORD
  59.                    Level   : BYTE;
  60.                    Offset,
  61.                    Segment : CARDINAL;
  62.                  END;
  63.   Reg : Registers;
  64. BEGIN
  65.   LastError := 0;
  66.   IF PRINTinstalled THEN
  67.     WITH SubmitPacket DO
  68.       Level   := 0;
  69.       Offset  := Ofs(FileName);
  70.       Segment := Seg(FileName);
  71.     END;
  72.     WITH Reg DO
  73.       AH := 1;
  74.       AL := 1;
  75.       DX := Ofs(SubmitPacket);
  76.       DS := Seg(SubmitPacket);
  77.       Lib.Intr(Reg, PRINTintr);
  78.       IF CarryFlag IN Flags THEN
  79.         LastError := CARDINAL(AX);
  80.       ELSE
  81.         LastError := 0;
  82.       END;
  83.     END;
  84.   ELSE
  85.     LastError := 1;
  86.   END;
  87. END SubmitFile;
  88.  
  89. PROCEDURE CancelFile(FileName : QueueEntryTyp);
  90. VAR
  91.   Reg : Registers;
  92. BEGIN
  93.   LastError := 0;
  94.   IF PRINTinstalled THEN
  95.     WITH Reg DO
  96.       AH := 1;
  97.       AL := 2;
  98.       DX := Ofs(FileName);
  99.       DS := Seg(FileName);
  100.       Lib.Intr(Reg, PRINTintr);
  101.       IF CarryFlag IN Flags THEN
  102.         LastError := CARDINAL(AX);
  103.       ELSE
  104.         LastError := 0;
  105.       END;
  106.     END;
  107.   ELSE
  108.     LastError := 1;
  109.   END;
  110. END CancelFile;
  111.  
  112. PROCEDURE CancelAllFiles();
  113. VAR
  114.   Reg : Registers;
  115. BEGIN
  116.   LastError := 0;
  117.   IF PRINTinstalled THEN
  118.     WITH Reg DO
  119.       AH := 1;
  120.       AL := 3;
  121.       Lib.Intr(Reg, PRINTintr);
  122.       IF CarryFlag IN Flags THEN
  123.         LastError := CARDINAL(AX);
  124.       ELSE
  125.         LastError := 0;
  126.       END;
  127.     END;
  128.   ELSE
  129.     LastError := 1;
  130.   END;
  131. END CancelAllFiles;
  132.  
  133. PROCEDURE EndOfStatus();
  134. VAR
  135.   Reg : Registers;
  136. BEGIN
  137.   IF PRINTinstalled THEN
  138.     WITH Reg DO
  139.       AH := 1;
  140.       AL := 5;
  141.       Lib.Intr(Reg, PRINTintr);
  142.       IF CarryFlag IN Flags THEN
  143.         LastError := CARDINAL(AX);
  144.       ELSE
  145.         LastError := 0;
  146.       END;
  147.     END;
  148.   ELSE
  149.     LastError := 0;
  150.   END;
  151. END EndOfStatus;
  152.  
  153. PROCEDURE Status(VAR Queue : QueueTyp);
  154. VAR
  155.   Reg       : Registers;
  156.   QueuePos,
  157.   I         : CARDINAL;
  158. BEGIN
  159.   IF PRINTinstalled THEN
  160.     WITH Reg DO
  161.       AH := 1;
  162.       AL := 4;
  163.       Lib.Intr(Reg, PRINTintr);
  164.       IF CarryFlag IN Flags THEN
  165.         LastError := CARDINAL(AX);
  166.       ELSE
  167.         LastError := 0;
  168.       END;
  169.       PrtBufAdr.Ofs := SI;
  170.       PrtBufAdr.Seg := DS;
  171.       PrtBufPos := Ptr2(PrtBufAdr);
  172.     END;
  173.     QueuePos := 0;
  174.     IF PrtBufPos^[QueuePos,0] = 0C THEN
  175.       Queue[0] := 0C;
  176.     ELSE
  177.       FOR QueuePos:=0 TO 31 DO
  178.         FOR I:=0 TO 63 DO
  179.           Queue[QueuePos,I] := PrtBufPos^[QueuePos,I];
  180.         END;
  181.       END;
  182.     END;
  183.   ELSE
  184.     LastError := 1;
  185.   END;
  186.   EndOfStatus();
  187. END Status;
  188.  
  189. PROCEDURE Error(): CARDINAL;
  190. BEGIN
  191.   RETURN LastError;
  192. END Error;
  193.  
  194. BEGIN
  195.   LastError := 0;
  196.   PRINTinstalled := (GetInstalledState()=255);
  197. END Spool.