home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / bonus / hercules.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-02-06  |  4.2 KB  |  148 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     HERCULES.PAS                       *)
  3. (*          Residentes Tool für die Hercules-Karte        *)
  4. (*             (c) 1991 Roland Ruder & TOOLBOX            *)
  5. (* ------------------------------------------------------ *)
  6. {$A+,B+,D-,E+,F-,I-,L-,N-,O-,R-,S-,V-}
  7. {$M 1024,0,0}  (* Wichtig, da TSR *)
  8. PROGRAM Hercules;
  9.  
  10. USES Dos, MausIt;
  11.  
  12. TYPE
  13.   CrtControl = ARRAY[0..11] OF BYTE;
  14.  
  15. CONST
  16.   TTable : CrtControl = ($61, $50, $52, $0F, $19, $06, $19, $19,
  17.                          $02, $0D, $0B, $0C);
  18.   GTable : CrtControl = ($35, $2D, $2E, $07, $5B, $02, $57, $57,
  19.                          $02, $03, $00, $00);
  20.   DelayCount = 2184; (* Wartezeit vier Minuten *)
  21.   S_Key = 31; (* Scancode der Taste S *)
  22.   M_Key = 50; (* Scancode der Taste M *)
  23.   KeybdStatus = 12; (* Ctrl_Alt *)
  24.  
  25. VAR
  26.   OldVector : Pointer;
  27.   Status : 0..2;
  28.   Count : INTEGER;
  29.   VideoModus : BYTE ABSOLUTE $40:$65;
  30.  
  31. {$F+}
  32. PROCEDURE ToggleScr;
  33. (* Videocontrollerbaustein (Motorola 6845) direkt programmieren *)
  34. VAR
  35.   B:BYTE;
  36. BEGIN
  37.   IF Status = 0 THEN BEGIN (* In den Textmodus schalten *)
  38.     Status := 1;
  39.     Port[$03B4] := $20; (* Textmodus, Monitor aus *)
  40.     FOR B := 0 TO 11 DO (* 12 Register, indirekte Adressierung*)
  41.     BEGIN
  42.       Port[$03B4] := B;
  43.       Port[$03B5] := TTable[B];
  44.     END;
  45.     Port[$03B8] := $28; (* Textmodus, Monitor ein *)
  46.   END
  47.   ELSE
  48.     IF Status = 1 THEN BEGIN (* Auf Graphik Seite 1 schalten *)
  49.       Status := 2;
  50.       Port[$03B8] := 2; (* Graphikmodus, Monitor aus *)
  51.       FOR B := 0 TO 11 DO BEGIN
  52.         Port[$03B4] := B;
  53.         Port[$03B5] := GTable[B];
  54.       END;
  55.       Port[$03B8] := $A; (* Graphikmodus, Monitor ein *)
  56.     END
  57.   ELSE BEGIN             (* Dunkelschalten *)
  58.     Status := 0;
  59.     Port[$03B8] := $20; (* Textmodus, Monitor aus *)
  60.     FOR B := 0 TO 11 DO BEGIN
  61.       Port[$03B4] := B;
  62.       Port[$03B5] := TTable[B];
  63.     END;
  64.     Port[$03B8] := $20;
  65.   END;
  66. END;
  67. {$F-}
  68.  
  69.  
  70. PROCEDURE KeybdInt;INTERRUPT;
  71. (* Wenn aus: Monitor bei Tastendruck einschalten; neue Wartezeit *)
  72. BEGIN
  73.   IF Count = 0 THEN
  74.     Port[$3B8] := VideoModus OR $08;
  75.   Count := DelayCount;
  76.   IF (Port[$60] = M_Key) AND
  77.      (Mem[$40:$17] = Mem[$40:$17] OR KeybdStatus)
  78.      THEN SwitchMouse;
  79. (* Ein-/Ausschalten der Mausemulation mit [Ctrl-Alt-M]
  80.    und stoppen der Uhrzeitanzeige (falls Maus installiert) *)
  81.   IF (Port[$60] = S_Key) AND
  82.      (Mem[$40:$17] = Mem[$40:$17] OR KeybdStatus)
  83.      THEN ToggleScr;
  84. (* Umschalten Textmodus/Graphikmodus/Dunkel mit [Ctrl-Alt-S] *)
  85.   INLINE($9C / $3E / $FF / $1E / OldVector)
  86. END;
  87.  
  88.  
  89. PROCEDURE TimerInt;INTERRUPT;
  90. (* Uhrzeitanzeige und Wartezeitkontrolle *)
  91. CONST
  92.   Video = $B000;
  93.   Time : REAL = 0.0;
  94.   Flag : BYTE = 0;
  95.  
  96. VAR
  97.   Clock : ARRAY[0..16, 0..1] OF CHAR ABSOLUTE Video:$7E;
  98.   TimeLow : WORD ABSOLUTE $40:$6C;
  99.   TimeHigh : WORD ABSOLUTE $40:$6E;
  100.   I : INTEGER;
  101.  
  102. BEGIN
  103.   IF Flag > 0 THEN BEGIN
  104.     Flag := 0;
  105.     Exit;
  106.   END;
  107.   Inc(Flag);
  108.   FOR I := 6 TO 15 DO (* Zeitanzeige unterstreichen *)
  109.     Clock[I, 1] := Chr($01);
  110.   Time := TimeLow + TimeHigh * 65536.0;
  111.   Time := Time / 18.2;
  112.   I := Trunc(Time / 3600.0);
  113.   Clock[6, 0] := '[';
  114.   Clock[7, 0] := Chr((I DIV 10) + 48);
  115.   Clock[8, 0] := Chr((I MOD 10) + 48);
  116.   Clock[9, 0] := '.';
  117.   Time := Time - (I * 3600.0);
  118.   I := Trunc(Time / 60);
  119.   Clock[10, 0] := Chr((I DIV 10) + 48);
  120.   Clock[11, 0] := Chr((I MOD 10) + 48);
  121.   Clock[12, 0] := '.';
  122.   I := Trunc(Time - (I * 60));
  123.   Clock[13, 0] := Chr((I DIV 10) + 48);
  124.   Clock[14, 0] := Chr((I MOD 10) + 48);
  125.   Clock[15, 0] := ']';
  126.   IF Count = 0 THEN (* Dunkelschalten im Text- oder Graphikmodus *)
  127.     Port[$3B8] := VideoModus AND $F7
  128.   ELSE
  129.     Count := Count - 1;
  130. END;
  131.  
  132.  
  133. BEGIN
  134.   Status := 1; (* Textmodus *)
  135.   Count := DelayCount; (* Wartezeit *)
  136.   WriteLn('(c) 1991 R. Ruder & toolbox');
  137.   MouseOff;
  138. (* Kann man weglassen, dann läuft die Uhrzeitanzeige immer *)
  139.   GetIntVec($09, OldVector);
  140.   SetIntVec($09, @KeybdInt);
  141.   SetIntVec($1C, @TimerInt);
  142. (* Die automatische Mausemulation via Interrupt $1c wurde gerade
  143.    überschrieben, deshalb Emulation noch einmal "von Hand" einschalten: *)
  144.   MouseOn;
  145.   Keep(0); (* Resident installieren, "Verbrauch" knapp 7 KB *)
  146. END.
  147.  
  148.