home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 09 / tricks / tsr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-03-07  |  2.9 KB  |  101 lines

  1. (****************************************************************************)
  2. (*                                 TSR.PAS                                  *)
  3. (*        Installation von Pop-Up-Programmen in Turbo-Pacal V. 4.0          *)
  4. (*                                                                          *)
  5. (*           (c) 1988 Karsten Gieselmann & PASCAL-International             *)
  6. (* !!! Diese Unit sollte VOR CRT in der USES-Anweisung auftauchen, um den   *)
  7. (* !!! von CRT angezapften Ctrl-Break-Vektor zu sichern und beim resident   *)
  8. (* !!! machen des 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 festgelegten Speicher-
  18.    größen für Heap und Stack ($M-Option) resident im Speicher; bei jedem
  19.    Betätigen der HOTKEY-Taste wird die bei der Adresse "Pop-Up" befindliche
  20.    parameterlose Prozedur ausgeführt.                                        *)
  21.  
  22.  
  23. Procedure MakeResident (PopUp: POINTER; HOTKEY: WORD);
  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.  
  33.   Int16Save,Int1BSave : POINTER;
  34.  
  35.  
  36. (*  die neue Routine für den Tastaturinterrupt             *)
  37. Procedure Int16  (Flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
  38.  INTERRUPT;
  39.  
  40. (* alte Tastaturroutine aufrufen und einen Tastencode holen:   *)
  41. Function KeyFromOldInt16 : word;
  42.   INLINE ($31/$C0/$9C/$FF/$1E/Int16Save);
  43.  
  44. (* Interruptprozedur verlassen und zur alten Routine weiterspringen: *)
  45.  
  46. Procedure ExitOldInt16;
  47.  
  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
  69.   SwitchStack;
  70.   GetIntVec ($16, CurrInt16);
  71.   SetIntVec ($16, Int16Save);
  72.   CallPopUp;
  73.   setIntVec ($16,CurrInt16);
  74.   Switchback;
  75.   End
  76.  until ax <> Hotkey_
  77.  else
  78.  ExitOldInt16;
  79. end;
  80.  
  81.  
  82.  
  83. Procedure MakeResident (PopUp : Pointer; HotKey : word);
  84.  
  85. Begin
  86.  PopUp_  := PopUp;
  87.  HotKey_ := HotKey;
  88.  GetIntVec ($16,Int16Save);
  89.  SetIntVec ($16,@int16);
  90.  SetIntVec ($1B, Int1BSave);
  91.  Keep(0);
  92. end;
  93.  
  94. Begin  (* Unit Initialisieren *)
  95.  PopUpSS := SSeg;
  96.  PopUpSp := Sptr+4;
  97.  GetIntVec($1B,Int1BSave);
  98. end.
  99.  
  100.  
  101.