home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
04
/
tricks
/
slow.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-01-08
|
4KB
|
153 lines
(* ------------------------------------------------------ *)
(* 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 *)