home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SLOW.PAS *)
- (* Speicherresidente "Bremse" für den PC. *)
- (* (c) 1991 Olaf Heß & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$A+,B-,D-,E-,F-,I-,L+,N-,O-,R-,S-,V-}
- {$M 2048,0,0}
-
- PROGRAM Slow;
-
- USES Dos;
-
- TYPE
- pword = RECORD
- offset : WORD;
- segment : WORD;
- END;
-
- CONST
- ok : BOOLEAN = FALSE;
- test_ende : BOOLEAN = FALSE;
- inst_int : BYTE = $60;
- { Interrupts $60 - $66 frei verfügbar }
-
- VAR
- aktuell_start,
- aktuell_ende,
- verzoegerung,
- count : LONGINT;
- count_ofs,
- count_seg : WORD;
- old_int1C,
- old_int60,
- old_int9 : Pointer;
- kbdstat : WORD ABSOLUTE $40:$17;
- { Tastatur-Statusbyte }
- faktor : LONGINT;
- { Anzahl der Durchläufe der Leerschleife }
- code : INTEGER;
- eingeschaltet : BOOLEAN;
- { Ein-/Ausschalten der Verzögerung }
- identitaet : WORD; { Zur "Selbstfindung" }
-
-
- {$F+}
- PROCEDURE user_int; INTERRUPT;
- {$F-}
- { Wenn das Programm installiert ist, dann wird dieser }
- { Interrupt auf es verbogen. }
- BEGIN
- END;
-
- {$F+}
- PROCEDURE int_9; INTERRUPT;
- {$F-}
- { Ein-/Ausschalten der Verzögerung }
- BEGIN
- IF ((kbdstat AND $F00F) = 3) THEN
- eingeschaltet := NOT eingeschaltet;
- INLINE($90/$3E/$FF/$1E/old_int9);
- END;
-
- {$F+}
- PROCEDURE timer_int; INTERRUPT;
- {$F-}
- BEGIN
- INLINE($9C/$3E/$FF/$1E/old_int1C);
- IF eingeschaltet THEN
- FOR count := 0 TO verzoegerung DO BEGIN
- END;
- END;
-
- {$F+}
- PROCEDURE max_wert; INTERRUPT;
- {$F-}
- { Feststellen, wie lange sich der PC in der Leerschleife }
- { aufhalten darf, ohne daß er sich aufhängt. }
- BEGIN
- IF ok THEN
- aktuell_start := MemL[count_seg:count_ofs];
- IF test_ende THEN BEGIN
- aktuell_ende := MemL[count_seg:count_ofs];
- test_ende := FALSE;
- END;
- IF ok THEN BEGIN
- ok := FALSE;
- test_ende := TRUE;
- END;
- END;
-
- BEGIN
- identitaet := 12345; { Kennung }
- GetIntVec(inst_int, old_int60);
- IF pword(old_int60).offset = Ofs(user_int) THEN
- IF MemW[pword(old_int60).segment -
- (Seg(user_int) - PrefixSeg) +
- (Seg(identitaet) -
- PrefixSeg):Ofs(identitaet)] = 12345 THEN BEGIN
- WriteLn('Programm ist schon resident installiert!');
- Halt(1);
- END;
-
- GetIntVec($1C, old_int1C);
- count_seg := Seg(count);
- count_ofs := Ofs(count);
- SetIntVec($1C, @max_wert);
- ok := TRUE;
- FOR count := 0 TO 100000 DO BEGIN { nichts }
- END;
- verzoegerung := aktuell_ende - aktuell_start;
- SetIntVec($1C, old_int1C);
- verzoegerung := verzoegerung DIV 3 * 2;
-
- { Auswerten der Eingabezeile }
- IF (ParamStr (1) = '?') OR (ParamCount < 1) THEN
- BEGIN
- WriteLn('SLOW bremst den PC');
- WriteLn;
- WriteLn('Aufruf: SLOW [Verzögerungsfaktor]');
- WriteLn('Verzögerungsfaktor muß eine Zahl zwischen ',
- ' 0 und ', verzoegerung,' sein.');
- Halt(1);
- END ELSE BEGIN
- Val(ParamStr (1), faktor, code);
- IF (code = 0) AND (faktor <= verzoegerung) AND
- (faktor > 0) THEN
- IF faktor < verzoegerung THEN
- verzoegerung := faktor
- ELSE BEGIN
- WriteLn('Falsche Parametereingabe!');
- WriteLn;
- WriteLn('Korrekter Programmaufruf:');
- WriteLn('SLOW [Verzögerungsfaktor]');
- WriteLn('Verzögerungsfaktor muß eine Zahl ',
- 'zwischen 0 und ', verzoegerung, ' sein');
- Halt(1);
- END;
- END;
-
- WriteLn('SLOW wurde resident installiert!');
- WriteLn(#13#10'Deaktivierung - Aktivierung durch ',
- ' Drücken von Shift-links + Shift-rechts.');
- eingeschaltet := TRUE;
- SwapVectors;
- GetIntVec($9, old_int9);
- GetIntVec($1C, old_int1C);
- SetIntVec($9, @int_9);
- SetIntVec(inst_int, @user_int);
- SetIntVec($1C, @timer_int);
- Keep(0);
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SLOW.PAS *)