home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 04 / tricks / tsr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-02-21  |  4.2 KB  |  111 lines

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