home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1989-11-15 | 4.4 KB | 197 lines |
- (********************************************************)
- (* SPOOL.MOD *)
- (* Implementations-Modul zur Ansteuerung des DOS-PRINT *)
- (* über den Multiplexer-Interrupt 2FH *)
- (* (C) Copyright 1989,1990 Jörg Heuser & toolbox *)
-
- IMPLEMENTATION MODULE Spool;
-
- (* Dieses Modul stellt die Prozeduren zur Verfügung, die
- zum Zugriff auf den DOS-Spooler 'PRINT' notwendig sind.
- Der Zugriff geschieht über den Multiplex-Interrupt 2FH,
- der die Kommunikation zwischen zwei im Rechner laufenden
- Prozessen übernimmt. Der Zugriff auf die im Multiplex-
- Interrupt eingelinkten Programm, erfolgt über das
- AH-Register. Bei PRINT ist AH = 1. Die Auswahl der unter-
- schiedlichen Funktionen erfolgt über das AL-Register.
- *)
-
- FROM SYSTEM IMPORT Registers, CarryFlag, Ofs, Seg;
- IMPORT Lib;
- IMPORT Str;
-
- TYPE QueueBuffer = ARRAY[0..31], [0..63] OF CHAR;
- Ptr = RECORD
- CASE :BOOLEAN OF
- TRUE :
- Ofs : CARDINAL;
- Seg : CARDINAL;
- | FALSE:
- Adr : ADDRESS;
- END;
- END;
- Ptr2 = POINTER TO QueueBuffer;
-
- CONST
- PRINTintr = 2FH;
-
- VAR
- PRINTinstalled : BOOLEAN;
- LastError : CARDINAL;
- PrtBufAdr : Ptr;
- PrtBufPos : Ptr2;
-
- PROCEDURE GetInstalledState(): CARDINAL;
- VAR
- Reg : Registers;
- BEGIN
- WITH Reg DO
- AH := 1;
- AL := 0;
- Lib.Intr(Reg, PRINTintr);
- RETURN CARDINAL(AL);
- END;
- END GetInstalledState;
-
- PROCEDURE SubmitFile(FileName : QueueEntryTyp);
- VAR
- SubmitPacket : RECORD
- Level : BYTE;
- Offset,
- Segment : CARDINAL;
- END;
- Reg : Registers;
- BEGIN
- LastError := 0;
- IF PRINTinstalled THEN
- WITH SubmitPacket DO
- Level := 0;
- Offset := Ofs(FileName);
- Segment := Seg(FileName);
- END;
- WITH Reg DO
- AH := 1;
- AL := 1;
- DX := Ofs(SubmitPacket);
- DS := Seg(SubmitPacket);
- Lib.Intr(Reg, PRINTintr);
- IF CarryFlag IN Flags THEN
- LastError := CARDINAL(AX);
- ELSE
- LastError := 0;
- END;
- END;
- ELSE
- LastError := 1;
- END;
- END SubmitFile;
-
- PROCEDURE CancelFile(FileName : QueueEntryTyp);
- VAR
- Reg : Registers;
- BEGIN
- LastError := 0;
- IF PRINTinstalled THEN
- WITH Reg DO
- AH := 1;
- AL := 2;
- DX := Ofs(FileName);
- DS := Seg(FileName);
- Lib.Intr(Reg, PRINTintr);
- IF CarryFlag IN Flags THEN
- LastError := CARDINAL(AX);
- ELSE
- LastError := 0;
- END;
- END;
- ELSE
- LastError := 1;
- END;
- END CancelFile;
-
- PROCEDURE CancelAllFiles();
- VAR
- Reg : Registers;
- BEGIN
- LastError := 0;
- IF PRINTinstalled THEN
- WITH Reg DO
- AH := 1;
- AL := 3;
- Lib.Intr(Reg, PRINTintr);
- IF CarryFlag IN Flags THEN
- LastError := CARDINAL(AX);
- ELSE
- LastError := 0;
- END;
- END;
- ELSE
- LastError := 1;
- END;
- END CancelAllFiles;
-
- PROCEDURE EndOfStatus();
- VAR
- Reg : Registers;
- BEGIN
- IF PRINTinstalled THEN
- WITH Reg DO
- AH := 1;
- AL := 5;
- Lib.Intr(Reg, PRINTintr);
- IF CarryFlag IN Flags THEN
- LastError := CARDINAL(AX);
- ELSE
- LastError := 0;
- END;
- END;
- ELSE
- LastError := 0;
- END;
- END EndOfStatus;
-
- PROCEDURE Status(VAR Queue : QueueTyp);
- VAR
- Reg : Registers;
- QueuePos,
- I : CARDINAL;
- BEGIN
- IF PRINTinstalled THEN
- WITH Reg DO
- AH := 1;
- AL := 4;
- Lib.Intr(Reg, PRINTintr);
- IF CarryFlag IN Flags THEN
- LastError := CARDINAL(AX);
- ELSE
- LastError := 0;
- END;
- PrtBufAdr.Ofs := SI;
- PrtBufAdr.Seg := DS;
- PrtBufPos := Ptr2(PrtBufAdr);
- END;
- QueuePos := 0;
- IF PrtBufPos^[QueuePos,0] = 0C THEN
- Queue[0] := 0C;
- ELSE
- FOR QueuePos:=0 TO 31 DO
- FOR I:=0 TO 63 DO
- Queue[QueuePos,I] := PrtBufPos^[QueuePos,I];
- END;
- END;
- END;
- ELSE
- LastError := 1;
- END;
- EndOfStatus();
- END Status;
-
- PROCEDURE Error(): CARDINAL;
- BEGIN
- RETURN LastError;
- END Error;
-
- BEGIN
- LastError := 0;
- PRINTinstalled := (GetInstalledState()=255);
- END Spool.