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

  1. (* ------------------------------------------------------ *)
  2. (*                       SLOW.PAS                         *)
  3. (*         Speicherresidente "Bremse" für den PC.         *)
  4. (*              (c) 1991 Olaf Heß & TOOLBOX               *)
  5. (* ------------------------------------------------------ *)
  6. {$A+,B-,D-,E-,F-,I-,L+,N-,O-,R-,S-,V-}
  7. {$M 2048,0,0}
  8.  
  9. PROGRAM Slow;
  10.  
  11. USES Dos;
  12.  
  13. TYPE
  14.   pword = RECORD
  15.             offset : WORD;
  16.             segment : WORD;
  17.           END;
  18.  
  19. CONST
  20.   ok        : BOOLEAN = FALSE;
  21.   test_ende : BOOLEAN = FALSE;
  22.   inst_int  : BYTE    = $60;
  23.                      { Interrupts $60 - $66 frei verfügbar }
  24.  
  25. VAR
  26.   aktuell_start,
  27.   aktuell_ende,
  28.   verzoegerung,
  29.   count         : LONGINT;
  30.   count_ofs,
  31.   count_seg     : WORD;
  32.   old_int1C,
  33.   old_int60,
  34.   old_int9      : Pointer;
  35.   kbdstat       : WORD ABSOLUTE $40:$17;
  36.                                      { Tastatur-Statusbyte }
  37.   faktor        : LONGINT;
  38.                   { Anzahl der Durchläufe der Leerschleife }
  39.   code          : INTEGER;
  40.   eingeschaltet : BOOLEAN;
  41.                         { Ein-/Ausschalten der Verzögerung }
  42.   identitaet    : WORD;              { Zur "Selbstfindung" }
  43.  
  44.  
  45.   {$F+}
  46.   PROCEDURE user_int; INTERRUPT;
  47.   {$F-}
  48.   { Wenn das Programm installiert ist, dann wird dieser    }
  49.   { Interrupt auf es verbogen.                             }
  50.   BEGIN
  51.   END;
  52.  
  53.   {$F+}
  54.   PROCEDURE int_9; INTERRUPT;
  55.   {$F-}
  56.   { Ein-/Ausschalten der Verzögerung }
  57.   BEGIN
  58.     IF ((kbdstat AND $F00F) = 3) THEN
  59.       eingeschaltet := NOT eingeschaltet;
  60.     INLINE($90/$3E/$FF/$1E/old_int9);
  61.   END;
  62.  
  63.   {$F+}
  64.   PROCEDURE timer_int; INTERRUPT;
  65.   {$F-}
  66.   BEGIN
  67.     INLINE($9C/$3E/$FF/$1E/old_int1C);
  68.     IF eingeschaltet THEN
  69.       FOR count := 0 TO verzoegerung DO BEGIN
  70.       END;
  71.   END;
  72.  
  73.   {$F+}
  74.   PROCEDURE max_wert; INTERRUPT;
  75.   {$F-}
  76.   { Feststellen, wie lange sich der PC in der Leerschleife }
  77.   { aufhalten darf, ohne daß er sich aufhängt.             }
  78.   BEGIN
  79.     IF ok THEN
  80.       aktuell_start := MemL[count_seg:count_ofs];
  81.     IF test_ende THEN BEGIN
  82.       aktuell_ende := MemL[count_seg:count_ofs];
  83.       test_ende := FALSE;
  84.     END;
  85.     IF ok THEN BEGIN
  86.       ok := FALSE;
  87.       test_ende := TRUE;
  88.     END;
  89.   END;
  90.  
  91. BEGIN
  92.   identitaet := 12345;                 { Kennung }
  93.   GetIntVec(inst_int, old_int60);
  94.   IF pword(old_int60).offset = Ofs(user_int) THEN
  95.     IF MemW[pword(old_int60).segment -
  96.             (Seg(user_int) - PrefixSeg) +
  97.             (Seg(identitaet) -
  98.             PrefixSeg):Ofs(identitaet)] = 12345 THEN BEGIN
  99.       WriteLn('Programm ist schon resident installiert!');
  100.       Halt(1);
  101.     END;
  102.  
  103.     GetIntVec($1C, old_int1C);
  104.     count_seg := Seg(count);
  105.     count_ofs := Ofs(count);
  106.     SetIntVec($1C, @max_wert);
  107.     ok := TRUE;
  108.     FOR count := 0 TO 100000 DO BEGIN { nichts }
  109.     END;
  110.     verzoegerung := aktuell_ende - aktuell_start;
  111.     SetIntVec($1C, old_int1C);
  112.     verzoegerung := verzoegerung DIV 3 * 2;
  113.  
  114.     { Auswerten der Eingabezeile }
  115.     IF (ParamStr (1) = '?') OR (ParamCount < 1) THEN
  116.     BEGIN
  117.       WriteLn('SLOW bremst den PC');
  118.       WriteLn;
  119.       WriteLn('Aufruf: SLOW [Verzögerungsfaktor]');
  120.       WriteLn('Verzögerungsfaktor muß eine Zahl zwischen ',
  121.               ' 0 und ', verzoegerung,' sein.');
  122.       Halt(1);
  123.     END ELSE BEGIN
  124.       Val(ParamStr (1), faktor, code);
  125.       IF (code = 0) AND (faktor <= verzoegerung) AND
  126.          (faktor > 0) THEN
  127.         IF faktor < verzoegerung THEN
  128.           verzoegerung := faktor
  129.         ELSE BEGIN
  130.           WriteLn('Falsche Parametereingabe!');
  131.           WriteLn;
  132.           WriteLn('Korrekter Programmaufruf:');
  133.           WriteLn('SLOW [Verzögerungsfaktor]');
  134.           WriteLn('Verzögerungsfaktor muß eine Zahl ',
  135.                   'zwischen 0 und ', verzoegerung, ' sein');
  136.           Halt(1);
  137.         END;
  138.     END;
  139.  
  140.     WriteLn('SLOW wurde resident installiert!');
  141.     WriteLn(#13#10'Deaktivierung - Aktivierung durch ',
  142.             ' Drücken von Shift-links + Shift-rechts.');
  143.     eingeschaltet := TRUE;
  144.     SwapVectors;
  145.     GetIntVec($9, old_int9);
  146.     GetIntVec($1C, old_int1C);
  147.     SetIntVec($9, @int_9);
  148.     SetIntVec(inst_int, @user_int);
  149.     SetIntVec($1C, @timer_int);
  150.     Keep(0);
  151. END.
  152. (* ------------------------------------------------------ *)
  153. (*               Ende von SLOW.PAS                        *)