home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* NEUPSC.PAS *)
- (* Hardcopy vom Hercules-Bildschirm *)
- (* (c) 1988 by Dieter Bührer & TOOLBOX *)
- (* ------------------------------------------------------ *)
-
- PROGRAM NeuPrintScreen;
-
- {$M 4096,0,0} (* Achtung! TSR --> kein Heap *)
-
- USES Dos,Crt;
-
- CONST PAGE :BYTE =0; (* bei HGC Seite 0,1 möglich *)
- INVERS:BOOLEAN=FALSE;
- DNR = 0; (* Drucker-Nummer 0..2 = LPT1..3 *)
-
- VAR PrintScreenVec: POINTER;
-
- {$L HGCMODE.OBJ} (* Objektdatei linken *)
-
- FUNCTION GET_HGC_MODE:INTEGER; EXTERNAL;
-
- FUNCTION GET_CGA_MODE:INTEGER;
- VAR r: Registers;
- BEGIN
- r.AH := 15;
- INTR($10, r);
- IF r.AL = 6 THEN GET_CGA_MODE := 1
- ELSE GET_CGA_MODE := 0;
- END;
-
-
- PROCEDURE PrintScreenNeu; INTERRUPT;
-
- VAR BildSpeicher: ARRAY[0..1999,0..1] OF
- BYTE ABSOLUTE $B000:$00;
- i, TimeOut: WORD;
- r : Registers;
- offset : WORD;
- x, y : INTEGER;
- b : BYTE;
-
- FUNCTION Abbruch: BOOLEAN;
- BEGIN
- IF (TimeOut>100) OR
- ((mem[$40:$1A]<>mem[$40:$1C]) AND
- (mem[$40:mem[$40:$1A]]=27)) THEN BEGIN
- MemW[$40:$1A] := MemW[$40:$1C];
- (* Tastaturpuffer löschen *)
- Sound(200); Delay(100);
- NoSound; (* dumpfer Ton *)
- r.ax := $0100;
- r.dx := dnr;
- intr($17, r); (* Druckerinitialisierung *)
- Abbruch := TRUE;
- END ELSE
- Abbruch := FALSE;
- END;
-
- PROCEDURE Print_B(B: BYTE);
- BEGIN
- TimeOut := 0;
- REPEAT
- r.al := b; r.ah := 0; r.dx := dnr;
- Intr($17, r);
- Inc(TimeOut);
- UNTIL ((r.ah AND $38)=$10) OR (TimeOut>100) OR
- ((mem[$40:$1A]<>mem[$40:$1C]) AND
- (mem[$40:mem[$40:$1A]]=27));
- END;
-
- BEGIN
- r.ax := $0200; r.dx := dnr;
- Intr($17, r); (* Drucker bereit ? *)
- IF (r.ah AND $38)<>$10 THEN BEGIN
- Sound(200); Delay(100);
- NoSound; exit; (* Nein ==> exit *)
- END;
- r.ax := $0100; r.dx := dnr;
- Intr($17, r); (* Druckerinitialisierung *)
-
- (* Const Not_busy =128; Bit 7 gesetzt *)
- (* Acknowledge =64; Bit 6 gesetzt *)
- (* Out_of_paper =32; Bit 5 gesetzt *)
- (* Selected =16; Bit 4 gesetzt *)
- (* IO_Error =8; Bit 3 gesetzt *)
- (* Unused_1 =4; Bit 2 gesetzt *)
- (* Unused_2 =2; Bit 1 gesetzt *)
- (* Time_out =1; Bit 0 gesetzt *)
-
- IF GET_HGC_MODE = 0 THEN BEGIN
- FOR i := 1 TO 2000 DO BEGIN
- IF BildSpeicher[I-1, 0] < 32 THEN
- Print_B($20) (* Steuerzeichen --> SPACE *)
- Else
- Print_B(BildSpeicher[I-1, 0]);
- (* sichtbares Zeichen wird gedruckt *)
- If Abbruch THEN exit;
- IF I/80 = TRUNC(I/80) THEN BEGIN
- Print_B($0A) (* Zeilenvorschub *)
- END;
- END;
- END ELSE BEGIN
-
- (* 8-Nadel Hardcopy für HGC. Ausdruck um 90 Grad gedreht *)
- (* ESC-A,7 ==> Zeilenabstand auf 7/72 Zoll bei EPSON *)
- (* ESC-A,7 ==> Zeilenabstand auf 7/60 Zoll bei NEC P6 *)
-
- Print_B(27); (* ESC *) If Abbruch THEN exit;
- Print_B(65); (* 'A' *) If Abbruch THEN exit;
- Print_B(7); (* 7 *) If Abbruch THEN exit;
- FOR x := 0 TO 89 DO BEGIN
-
- (* 90*8=720 (x-Auflösung HGC) ==> 90 Spalten a 8 Bit *)
- (* <ESC> K n1 n2 : *)
- (* Setze 8 Bit-Grafik mit einfacher Dichte(60 DPI) und *)
- (* mit n=348 Druckspalten ==> n1=348 MOD 256 =92 *)
- (* n2=INT(348/256)=1 *)
-
- Print_B(27); (* ESC *) If Abbruch THEN exit;
- Print_B(75); (* 'K' *) If Abbruch THEN exit;
- Print_B(92); (* CHR(92) *) If Abbruch THEN exit;
- Print_B(1); (* CHR(1) *) If Abbruch THEN exit;
- FOR y := 347 DOWNTO 0 DO BEGIN
-
- (* y-Auflösung Herkules 0..347 *)
- (* von links unten bis links oben je ein Byte drucken *)
- (* errechne Byte Offset-Adresse für Spalte x und Zeile y *)
-
- Offset := $2000 * (y MOD 4) + 90 * (y SHR 2) + x;
- IF (page = 0) THEN b := Mem[$b000: Offset]
- ELSE
- IF (PAGE = 1) THEN b := Mem[$b800: Offset];
- IF (invers) THEN b := (NOT b);
-
- (* drucke 8-Bit Muster: *)
-
- Print_B(b); If Abbruch THEN exit;
- END;
- Print_B($0A); (* LineFeed *) If Abbruch THEN exit;
- END;
-
- (* ESC 0: beendet horizontalen und vertikalen Tabulator *)
-
- Print_B(27); (* ESC *) If Abbruch THEN exit;
- Print_B(0); (* NUL *) If Abbruch THEN exit;
- END;
- Sound(1000);
- (* Alles okay => heller Beep und Ende der Hardcopy *)
- Delay(50);
- NoSound;
- END;
-
- PROCEDURE PrintScreenUmlenken;
- BEGIN
- GetInTVec(5, PrintScreenVec); (* Originalvektor sichern *)
- INLINE($FA); (* CLI - disable Interrpt *)
- SetInTVec(5, @PrintScreenNeu);(* eigene Routine *)
- INLINE($FB); (* STI - enable Interrupt *)
- END;
-
- BEGIN
- GetInTVec(5, PrintScreenVec);
- PrintScreenUmlenken;
- Writeln('Printscreen-Hardcopy installiert auf :LPT',
- DNR+1:1,', C) D.Bührer 1988, (ESC=ABBRUCH)');
- KEEP(0);
-
- (* Programm resident beenden als letzte Programmanweisung *)
-
- END.
-
- (* ------------------------------------------------------ *)
- (* Ende von NEUPSC.PAS *)