home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 13 / tsr / tsr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-02-24  |  3.5 KB  |  100 lines

  1. (*********************************************************)
  2. (*                        TSR.PAS                        *)
  3. (*   Installation von Pop-Up-Prog. in Turbo Pascal-4.0   *)
  4. (* (c) 1988  Karsten Gieselmann  &  PASCAL International *)
  5. (* !!! Diese UNIT sollte vor Crt in der USES-Anweisung   *)
  6. (* !!! auftauchen, um den von Crt angezapften Ctrl-Break-*)
  7. (* !!! Vektor zu sichern und beim resident machen des    *)
  8. (* !!! Programms wieder zurückzusetzen.                  *)
  9. (*********************************************************)
  10.  
  11. UNIT TSR;
  12.  
  13. INTERFACE
  14.  
  15. USES Dos;
  16.  
  17. (* beläßt das aktuelle Programm mit den beim  Kompilieren
  18.    festgelegten Speichergrößen für Heap und Stack ($M-
  19.    Option) resident im Speicher; bei jedem Betätigen der
  20.    Hotkey-Taste wird die bei der Adresse "Pop-Up" befind-
  21.    lich parameterlose Prozedur ausgeführt.               *)
  22. PROCEDURE MakeResident (PopUp :POINTER; HotKey :WORD);
  23.  
  24.  
  25. IMPLEMENTATION
  26.  
  27. VAR
  28.   SystemSP,SystemSS, (* Zwischenspeicher für Stapelwerte *)
  29.   PopUpSS,PopUpSP,   (* Stackwerte für die PopUp-Routine *)
  30.   HotKey_            :WORD;
  31.   CurrInt16,PopUp_,
  32.   Int16Save,Int1BSave:POINTER;
  33.  
  34.  
  35. (*       die neue Routine für den Tastaturinterrupt      *)
  36. PROCEDURE Int16
  37.             (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP :WORD);
  38. INTERRUPT;
  39.  
  40.   (* alte Tastaturroutine aufrufen und einen Tastencode
  41.      holen:                                              *)
  42.   FUNCTION KeyFromOldInt16 :WORD;
  43.     INLINE ($31/$C0/$9C/$FF/$1E/Int16Save);
  44.  
  45.   (* Interruptprozedur verlassen und zur alten Routine
  46.      weiterspringen:                                     *)
  47.   PROCEDURE ExitOldInt16;
  48.     INLINE ($A1/Int16Save+2/$87/$46/$10/$8B/$1E/Int16Save/
  49.             $87/$5E/$0E/$5D/$07/$1F/$5F/$5E/$5A/$59/$CB);
  50.  
  51.   PROCEDURE CallPopUp;        (* Pop-Up-Routine aufrufen *)
  52.     INLINE ($FF/$1E/PopUp_);
  53.  
  54.   (*     vom System- auf den Pop-Up-Stapel umschalten:   *)
  55.   PROCEDURE SwitchStack;
  56.     INLINE ($8C/$16/SystemSS/$89/$26/SystemSP/$FA/
  57.             $8E/$16/PopUpSS/$8B/$26/PopUpSP/$FB);
  58.  
  59.   (*   vom Pop-Up- zurück auf den Systemstapel schalten  *)
  60.   PROCEDURE SwitchBack;
  61.     INLINE ($FA/$8E/$16/SystemSS/$8B/$26/SystemSP/$FB);
  62.  
  63. BEGIN
  64.              (* soll überhaupt eine Taste geholt werden? *)
  65.   IF (Hi(AX)=0) THEN
  66.     REPEAT               (* ja, dann alte Routine rufen: *)
  67.       AX := KeyFromOldInt16;
  68.       IF AX = HotKey_ THEN BEGIN    (* war Taste Hotkey? *)
  69.         SwitchStack;    (* ja, dann Stapel umschalten... *)
  70.         GetIntVec ($16, CurrInt16);
  71.                          (* Int16-Vektor auf alten Wert: *)
  72.         SetIntVec ($16, Int16Save);
  73.         CallPopUp;           (* Pop-Up-Programm aufrufen *)
  74.         SetIntVec ($16, CurrInt16); (* und Änderungen... *)
  75.         SwitchBack;       (* ...wieder rückgängig machen *)
  76.       END
  77.     UNTIL AX <> HotKey_
  78.   ELSE   (* keine Taste holen, weiter zur alten Routine! *)
  79.     ExitOldInt16;
  80. END;
  81.  
  82.  
  83. PROCEDURE MakeResident (PopUp :POINTER; HotKey :WORD);
  84.  
  85. BEGIN
  86.   PopUp_ := PopUp;      (* Installationsparameter sichen *)
  87.   HotKey_ := HotKey;
  88.   GetIntVec ($16, Int16Save);  (* alte Routine holen.... *)
  89.   SetIntVec ($16, @Int16);  (* ...und neue installieren! *)
  90.   SetIntVec ($1B, Int1BSave); (* Ctrl-Break zurücksetzen *)
  91.   Keep (0)                   (* Programm resident machen *)
  92. END;
  93.  
  94.  
  95. BEGIN (* Unit initialisieren *)
  96.   PopUpSS := SSeg;             (* die Stapelwerte merken *)
  97.   PopUpSP := SPtr+4;  (* Sprung hierhin berücksichtigen! *)
  98.   GetIntVec($1B,Int1BSave); (* Ctrl-Break-Vektor sichern *)
  99. END.
  100.