home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* HERCULES.PAS *)
- (* Residentes Tool für die Hercules-Karte *)
- (* (c) 1991 Roland Ruder & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$A+,B+,D-,E+,F-,I-,L-,N-,O-,R-,S-,V-}
- {$M 1024,0,0} (* Wichtig, da TSR *)
- PROGRAM Hercules;
-
- USES Dos, MausIt;
-
- TYPE
- CrtControl = ARRAY[0..11] OF BYTE;
-
- CONST
- TTable : CrtControl = ($61, $50, $52, $0F, $19, $06, $19, $19,
- $02, $0D, $0B, $0C);
- GTable : CrtControl = ($35, $2D, $2E, $07, $5B, $02, $57, $57,
- $02, $03, $00, $00);
- DelayCount = 2184; (* Wartezeit vier Minuten *)
- S_Key = 31; (* Scancode der Taste S *)
- M_Key = 50; (* Scancode der Taste M *)
- KeybdStatus = 12; (* Ctrl_Alt *)
-
- VAR
- OldVector : Pointer;
- Status : 0..2;
- Count : INTEGER;
- VideoModus : BYTE ABSOLUTE $40:$65;
-
- {$F+}
- PROCEDURE ToggleScr;
- (* Videocontrollerbaustein (Motorola 6845) direkt programmieren *)
- VAR
- B:BYTE;
- BEGIN
- IF Status = 0 THEN BEGIN (* In den Textmodus schalten *)
- Status := 1;
- Port[$03B4] := $20; (* Textmodus, Monitor aus *)
- FOR B := 0 TO 11 DO (* 12 Register, indirekte Adressierung*)
- BEGIN
- Port[$03B4] := B;
- Port[$03B5] := TTable[B];
- END;
- Port[$03B8] := $28; (* Textmodus, Monitor ein *)
- END
- ELSE
- IF Status = 1 THEN BEGIN (* Auf Graphik Seite 1 schalten *)
- Status := 2;
- Port[$03B8] := 2; (* Graphikmodus, Monitor aus *)
- FOR B := 0 TO 11 DO BEGIN
- Port[$03B4] := B;
- Port[$03B5] := GTable[B];
- END;
- Port[$03B8] := $A; (* Graphikmodus, Monitor ein *)
- END
- ELSE BEGIN (* Dunkelschalten *)
- Status := 0;
- Port[$03B8] := $20; (* Textmodus, Monitor aus *)
- FOR B := 0 TO 11 DO BEGIN
- Port[$03B4] := B;
- Port[$03B5] := TTable[B];
- END;
- Port[$03B8] := $20;
- END;
- END;
- {$F-}
-
-
- PROCEDURE KeybdInt;INTERRUPT;
- (* Wenn aus: Monitor bei Tastendruck einschalten; neue Wartezeit *)
- BEGIN
- IF Count = 0 THEN
- Port[$3B8] := VideoModus OR $08;
- Count := DelayCount;
- IF (Port[$60] = M_Key) AND
- (Mem[$40:$17] = Mem[$40:$17] OR KeybdStatus)
- THEN SwitchMouse;
- (* Ein-/Ausschalten der Mausemulation mit [Ctrl-Alt-M]
- und stoppen der Uhrzeitanzeige (falls Maus installiert) *)
- IF (Port[$60] = S_Key) AND
- (Mem[$40:$17] = Mem[$40:$17] OR KeybdStatus)
- THEN ToggleScr;
- (* Umschalten Textmodus/Graphikmodus/Dunkel mit [Ctrl-Alt-S] *)
- INLINE($9C / $3E / $FF / $1E / OldVector)
- END;
-
-
- PROCEDURE TimerInt;INTERRUPT;
- (* Uhrzeitanzeige und Wartezeitkontrolle *)
- CONST
- Video = $B000;
- Time : REAL = 0.0;
- Flag : BYTE = 0;
-
- VAR
- Clock : ARRAY[0..16, 0..1] OF CHAR ABSOLUTE Video:$7E;
- TimeLow : WORD ABSOLUTE $40:$6C;
- TimeHigh : WORD ABSOLUTE $40:$6E;
- I : INTEGER;
-
- BEGIN
- IF Flag > 0 THEN BEGIN
- Flag := 0;
- Exit;
- END;
- Inc(Flag);
- FOR I := 6 TO 15 DO (* Zeitanzeige unterstreichen *)
- Clock[I, 1] := Chr($01);
- Time := TimeLow + TimeHigh * 65536.0;
- Time := Time / 18.2;
- I := Trunc(Time / 3600.0);
- Clock[6, 0] := '[';
- Clock[7, 0] := Chr((I DIV 10) + 48);
- Clock[8, 0] := Chr((I MOD 10) + 48);
- Clock[9, 0] := '.';
- Time := Time - (I * 3600.0);
- I := Trunc(Time / 60);
- Clock[10, 0] := Chr((I DIV 10) + 48);
- Clock[11, 0] := Chr((I MOD 10) + 48);
- Clock[12, 0] := '.';
- I := Trunc(Time - (I * 60));
- Clock[13, 0] := Chr((I DIV 10) + 48);
- Clock[14, 0] := Chr((I MOD 10) + 48);
- Clock[15, 0] := ']';
- IF Count = 0 THEN (* Dunkelschalten im Text- oder Graphikmodus *)
- Port[$3B8] := VideoModus AND $F7
- ELSE
- Count := Count - 1;
- END;
-
-
- BEGIN
- Status := 1; (* Textmodus *)
- Count := DelayCount; (* Wartezeit *)
- WriteLn('(c) 1991 R. Ruder & toolbox');
- MouseOff;
- (* Kann man weglassen, dann läuft die Uhrzeitanzeige immer *)
- GetIntVec($09, OldVector);
- SetIntVec($09, @KeybdInt);
- SetIntVec($1C, @TimerInt);
- (* Die automatische Mausemulation via Interrupt $1c wurde gerade
- überschrieben, deshalb Emulation noch einmal "von Hand" einschalten: *)
- MouseOn;
- Keep(0); (* Resident installieren, "Verbrauch" knapp 7 KB *)
- END.
-
-