home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* HARDCOPY.PAS *)
- (* HARDCOPY-Bibliothek *)
- (* (C) 1989 by W. Amslinger, P. Kurzweil & TOOLBOX *)
- (* ------------------------------------------------- *)
-
- UNIT HardcopyBib;
-
- INTERFACE
-
- USES Dos, Crt, Printer, Graph;
-
- TYPE
- strg255 = STRING[255];
- VAR
- Regs : Registers;
-
- PROCEDURE HardCopyOn;
- { Methode1: Aktiviert [SHIFT PrtScr] }
- PROCEDURE HardCopyOff;
- { Desaktiviert [SHIFT PrtScr] }
- PROCEDURE TestHardCopy;
- { Methode2: Hardcopy mit anderer Taste }
-
- IMPLEMENTATION
-
- CONST
- LPT = 1;
- { Schnittstelle 1 = LPT1:, 2 = LPT2:, 3 = LPT: }
- VAR
- OldVec, NewVec : POINTER;
- error, active : BOOLEAN;
-
- PROCEDURE PrintByte(ch : CHAR);
- { Zeichen auf Parallelschnittstelle ausgeben }
- VAR
- status : BYTE;
- i : WORD;
- BEGIN
- error := FALSE; i := 0;
- REPEAT
- i := Succ(i); { Printer status }
- Regs.ah := $02;
- Regs.dx := LPT - 1;
- Intr($17, Regs);
- status := Regs.ah;
- error := ((status AND $29) > 0); { 00101001 }
- IF i > 20000 THEN BEGIN
- error := TRUE;
- Exit;
- END; { Timeout }
- UNTIL ((status AND $90) XOR $90) = 0;
- Regs.ah := $00;
- Regs.dx := LPT - 1;
- Regs.al := Ord(ch); { Byte senden }
- Intr($17, Regs);
- END;
-
- PROCEDURE PrintString(s : strg255);
- { String auf Parallelschnittstelle ausgeben }
- VAR
- i : INTEGER;
- BEGIN
- error := FALSE;
- FOR i := 1 TO Length(s) DO BEGIN
- PrintByte(s[i]);
- IF error THEN Exit;
- END;
- END;
-
- PROCEDURE HGChardCopy;
- LABEL 1;
- CONST
- xres = 720; yres = 348;
- p : ARRAY[0..7] OF BYTE = (128,64,32,16,8,4,2,1);
- VAR
- x, y, i, j, n1, n2 : INTEGER;
- v, b, d : BYTE;
- BEGIN
- PrintString(#27#64);
- IF error THEN GOTO 1; { ESC @ = reset }
- PrintString(#27#85#49);
- IF error THEN GOTO 1; { ESC U 1 = unidirectional }
- PrintString(#27#51#21);
- IF error THEN GOTO 1; { ESC 3 21 = 21/216 Zoll }
- n2 := xres DIV 256;
- n1 := xres MOD 256;
- FOR i:= 0 TO Pred(yres DIV 8) DO BEGIN
- PrintString(#9#27#76 + Chr(n1) + Chr(n2));
- IF error THEN GOTO 1;
- FOR x := 0 TO Pred(xres) DO BEGIN
- b := x MOD 8;
- d := 0;
- FOR j := 0 TO 7 DO BEGIN
- y := i * 8 + j;
- v := Mem[$B000:$2000 * (y MOD 4) +
- 90 * (y SHR 2) + (x SHR 3)];
- IF (v AND p[b]) > 0 THEN d := d + p[j];
- END;
- PrintString(Chr(d));
- IF error THEN GOTO 1;
- END;
- PrintString(#13#10);
- IF error THEN GOTO 1;
- END;
- IF (yres MOD 8) <> 0 THEN BEGIN { letzte Zeile }
- PrintString(#9#27#76 + Chr(n1) + Chr(n2));
- IF error THEN GOTO 1;
- FOR x := 0 TO Pred(xres) DO BEGIN
- b := x MOD 8;
- d := 0;
- FOR y := 8*(yres DIV 8) TO Pred(yres) DO BEGIN
- v := Mem[$B000:$2000 * (y MOD 4) +
- 90 * (y SHR 2) + (x SHR 3)];
- IF (v AND p[b]) > 0 THEN d := d + p[y MOD 8];
- END;
- PrintString(Chr(d));
- IF error THEN GOTO 1;
- END;
- PrintString(#13#10);
- IF error THEN GOTO 1;
- END;
- PrintString(#27#65#12#27#50);
- IF error THEN GOTO 1; { 12/72" Zoll }
- PrintString(#27#85#48);
- IF error THEN GOTO 1; { ESC U 0 = unidirect. off }
- PrintString(#27#64); { Reset }
- 1:
- END;
-
- PROCEDURE IBMHardCopy;
- LABEL 9;
- CONST
- p : ARRAY[0..7] OF BYTE = (128,64,32,16,8,4,2,1);
- VAR
- modus, page, d : BYTE;
- x, y, i, j, n1, n2, xres, yres : WORD;
- BEGIN
- Regs.ah := $0F;
- Intr($10, Regs);
- modus := Regs.al;
- page := Regs.bh;
- CASE modus OF
- $04, $05, $0d, $13 : BEGIN
- xres := 320; yres := 200;
- END;
- $06, $0E : BEGIN
- xres := 640; yres := 200;
- END;
- $40, $48 : BEGIN
- xres := 640; yres := 400;
- END;
- $0F, $10, $2d : BEGIN
- xres := 640; yres := 350;
- END;
- $11, $12, $25, $2E : BEGIN
- xres := 640; yres := 480;
- END;
- $29, $30 : BEGIN
- xres := 800; yres := 600;
- END;
- END;
- n2 := xres DIV 256;
- n1 := xres MOD 256;
- PrintString(#27#64);
- IF error THEN GOTO 9; { ESC @ = reset }
- PrintString(#27#85#49);
- IF error THEN GOTO 9; { ESC U 1 = unidirectional }
- PrintString(#27#51#21);
- IF error THEN GOTO 9; { ESC 3 21 = 21/216 Zoll }
- FOR i := 0 TO (yres DIV 8) DO BEGIN
- PrintString(#9#27#76 + Chr(n1) + Chr(n2));
- IF error THEN GOTO 9; { TAB ESC L }
- FOR x := 0 TO Pred(xres) DO BEGIN
- d := 0;
- FOR j := 0 TO 7 DO BEGIN
- y := i * 8 + j;
- Regs.ah := $0d;
- Regs.bh := page;
- Regs.cx := x;
- Regs.dx := y;
- Intr($10, Regs);
- IF Regs.al > 0 THEN d := d + p[j];
- END;
- PrintString(Chr(d));
- IF error THEN GOTO 9;
- END;
- PrintString(#13#10);
- IF error THEN GOTO 9;
- END;
- PrintString(#27#65#12#27#50);
- IF error THEN GOTO 9; { 12/72" Zoll }
- PrintString(#27#85#48);
- IF error THEN GOTO 9; { ESC U 0 = unidirect. off }
- PrintString(#27#64); { Reset }
- 9:
- END;
-
- {$F+}
- PROCEDURE HardCopy; INTERRUPT;
- { Aufruf über [SHIFT PrtScr] }
- BEGIN
- IF NOT active THEN BEGIN
- active := TRUE;
- error := FALSE;
- IF ((GetMaxX = 719) AND (GetMaxY = 347)) THEN
- HGCHardCopy
- ELSE
- IBMHardCopy;
- IF error THEN Write(#7#7#7);
- active := FALSE;
- END;
- END;
- {$F-}
-
- PROCEDURE HardCopyOn;
- { Aktiviert [SHIFT PrtScr]-Taste }
- BEGIN
- NewVec := @HardCopy;
- { Interrupt 5 startet Prozedur Hardcopy }
- GetIntVec($5, OldVec);
- SetIntVec($5, NewVec);
- active := FALSE;
- END;
-
- {$F+}
- PROCEDURE HardCopyOff;
- { Deaktiviert [SHIFT PrtScr]-Taste }
- BEGIN
- SetIntVec($5, OldVec);
- END;
- {$F-}
-
- PROCEDURE TestHardCopy;
- { Löst Hardcopy mit *-Taste aus }
- VAR
- ch : CHAR;
- BEGIN
- REPEAT
- ch := ReadKey;
- IF ch = '*' THEN BEGIN
- IF ((GetMaxX = 719) AND (GetMaxY = 347)) THEN
- HGChardcopy
- ELSE
- IBMhardcopy;
- IF error THEN BEGIN
- Write(#7#7#7);
- Exit;
- END;
- END;
- UNTIL ch IN ['*',#27,#13];
- { ESC oder RETURN -> Abbrechen }
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von HARDCOPY.PAS *)