home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* SCRTIMER.PAS *)
- (* Bildschirm nach n Sekunden löschen und bei Tasten- *)
- (* druck wieder herstellen. *)
- (* System: Turbo Pascal/MS-DOS *)
- (* Aufruf: SCRTIMER Wartezeit ca. 4 Minuten *)
- (* SCRTIMER 1.5 " ca. 1.5 Minuten *)
- (* ----------------------------------------------------- *)
-
- PROGRAM ScrTimer;
-
- {$K-} (* die Compiler-Optionen müssen unbedingt *)
- {$U-} (* wie hier gesetzt werden !!!! *)
- {$R-}
- {$V-}
- {$I-}
- {$C-}
-
- {$I REGS8088.INC} (* die Include-Dateien aus PASCAL *)
- {$I CRITICAL.INC} (* 6/87, "Interrupts - oder warum *)
- {$I MAKEINT.INC} (* die Milch in Ihrem Rechener..." *)
-
- CONST
- (* die benutzten Interrupt-Vektoren, zu finden eigent- *)
- (* lich in MAKEINT.INC: *)
- IntHardwareTimer = $08;
- IntHardwareKeyboard = $09;
- TimerOldInterrupt : IntEntry_ = (Offset:0; Segment:0);
- KeyBoardOldInterrupt : IntEntry_ = (Offset:0; Segment:0);
- Count : INTEGER = 0;
- Warte : BOOLEAN = FALSE;
- gedrueckt : BOOLEAN = FALSE;
-
- TYPE
- ScrBuff = ARRAY[0..16383] OF BYTE;
-
- VAR
- ColorScreen : ScrBuff ABSOLUTE $B800:0000;
- MonoScreen : ScrBuff ABSOLUTE $B000:0000;
- Video : BYTE ABSOLUTE $0040:$0049;
- Screen : ^ScrBuff;
- OldScreen : ARRAY[0..16383] OF BYTE;
- Dauer : REAL;
- error : INTEGER;
-
- (* ----------------------------------------------------- *)
- (* neue Tastatur-Interrupt-Routine - setzt lediglich das *)
- (* Flag "gedrueckt" und geht weiter zur Original-Routine *)
-
- PROCEDURE KeyBoardInterrupt;
-
- {$I BEGININT.INC}
- gedrueckt := TRUE;
- {$I EXITINT.INC}
- KeyBoardOldInterrupt);
- END;
-
- (* ----------------------------------------------------- *)
- (* neue Timer-Interrupt-Routine. Wird 18 mal in der Se- *)
- (* kunde ausgeführt und bildet das Herz des Ganzen. *)
- (* "Warte" zeigt an, ob der Bildschirm schon gelöscht *)
- (* ist und nun auf eine Taste zur Wiederherstellung des- *)
- (* selben gewartet wird. Ist "Warte" FALSE, wird ent- *)
- (* weder der Zeitzähler erhöht und bei überschreiten der *)
- (* Wartezeit der Bildschirm gelöscht oder, wenn eine *)
- (* Taste gedrückt wurde, der Zeitzähler zurückgesetzt. *)
-
- PROCEDURE TimerInterrupt;
-
- {$I BEGININT.INC}
- CASE Warte OF
- FALSE : BEGIN
- IF NOT gedrueckt THEN
- Count := Succ(Count)
- ELSE BEGIN
- gedrueckt := FALSE; Count := 0;
- END;
- IF Count > Dauer THEN BEGIN
- Move (Screen^,OldScreen,SizeOf(ScrBuff));
- FillChar(Screen^,SizeOf(ScrBuff),0);
- Warte := TRUE;
- END;
- END;
- TRUE : IF gedrueckt THEN BEGIN
- Move (OldScreen,Screen^,SizeOf(ScrBuff));
- Count := 0;
- gedrueckt := FALSE;
- Warte := FALSE;
- END;
- END; { case }
- {$I EXITINT.INC}
- TimerOldInterrupt);
- END;
-
- (* ----------------------------------------------------- *)
-
- BEGIN
- IF Video = 7 THEN { Monochrom-Bildschirm ? }
- Screen := Ptr(Seg(MonoScreen),OFs(MonoScreen))
- ELSE
- Screen := Ptr(Seg(ColorScreen),OFs(ColorScreen));
- Dauer := 4400.0; { c.a. 4 Min. warten, Voreinstellung }
- IF ParamCount > 0 THEN BEGIN (* neue Warte-Zeit ? *)
- Val(Paramstr(1),Dauer,error);
- IF error = 0 THEN
- Dauer := Dauer*60*18 { da die Proz. "TimerInterupt" }
- { 18 mal in der Sekunde auf- }
- { gerufen wird ! }
- ELSE
- Dauer := 4400.0; (* Fehler, wieder Voreinstellung *)
- IF Dauer > MaxInt THEN Dauer := MaxInt-1;
- END;
- WITH TimerOldInterrupt DO (* die Interrupts verbiegen *)
- IntGet (IntHardwareTimer,Segment, Offset);
- IntSet (IntHardwareTimer, Cseg, OFs(TimerInterrupt));
- WITH KeyBoardOldInterrupt DO
- IntGet (IntHardwareKeyBoard,Segment, Offset);
- IntSet (IntHardwareKeyBoard,Cseg,OFs(KeyBoardInterrupt));
- WriteLn; WriteLn('SCRTIMER resident...'); WriteLn;
- MakeResident; (* Programm beenden u. aktiv lassen *)
- END.