home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 04 / tricks / tsr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-10  |  4.0 KB  |  135 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      TSR.PAS                           *)
  3. (*     Unit zum Abfangen von Intr 16H und des InDosByte   *)
  4. (*            nach einer Idee aus PASCAL 5'88             *)
  5. (* ------------------------------------------------------ *)
  6. UNIT Tsr ;
  7.  
  8. INTERFACE      (* all das, was nacher zur Verfügung steht *)
  9.  
  10. USES  Dos;                               (* für Registers *)
  11.  
  12. PROCEDURE MakeResident(PopUp : POINTER; HotKey : word);
  13. PROCEDURE SwitchBackDos;
  14.             (* bricht das aktuelle Vordergrundprogramm ab *)
  15.  
  16. (* ------------------------------------------------------ *)
  17. IMPLEMENTATION
  18.  
  19. VAR SystemSP, SystemSS   : word;
  20.     PopUPSp , PopUpSS,
  21.     HotKey_              : word;
  22.     CurrInt16,
  23.     PopUp_,
  24.     Int16Save, Int1BSave : POINTER;
  25.     Regs                 : Registers;
  26.  
  27. PROCEDURE SwitchBack;             (* Stack zurückschalten *)
  28.                    (* urspunglich eine Unterprozedur  von *)
  29.                    (* Int16_ Prozedur weiter unten        *)
  30.                    (* Sie muss hierher verschoben werden  *)
  31.     INLINE($FA/
  32.            $8E/
  33.            $16/
  34.            SystemSS/
  35.            $8B/
  36.            $26/
  37.            SystemSP/
  38.            $FB);
  39.  
  40. PROCEDURE SwitchBackDos;
  41.                 (* bricht das aktuelle Programm ab, dies  *)
  42. BEGIN           (* ist etwa bei unendlichen Schleifen gut *)
  43.     SetIntVec($16,CurrInt16);
  44.     SwitchBack;          (* aus der alten Int16_ Prozedur *)
  45.     Regs.AX := $4CC8;                   (* ExitCode = 200 *)
  46.     MsDos(Regs);
  47. END;
  48.  
  49. PROCEDURE Int16_(Flags,CS,IP,AX,BX,CX,DX,
  50.                        SI,DI,DS,ES,BP : word); INTERRUPT;
  51.   FUNCTION KeyFromOldInt16 : word;     (* Zeichen abholen *)
  52.     INLINE($31/
  53.            $C0/
  54.            $9C/
  55.            $FF/
  56.            $1E/Int16Save);
  57.  
  58.   PROCEDURE ExitOldInt16;
  59.     INLINE($A1/Int16Save+2/
  60.            $87/
  61.            $46/
  62.            $10/
  63.            $8B/
  64.            $1E/Int16Save/
  65.            $87/
  66.            $5E/
  67.            $0E/
  68.            $5D/
  69.            $07/
  70.            $1F/
  71.            $5F/
  72.            $5E/
  73.            $5A/
  74.            $59/
  75.            $CB);
  76.  
  77.   PROCEDURE SwitchStack;     (* für einen IntrVektor !!!  *)
  78.     INLINE($8C/
  79.            $16/
  80.            SystemSS/
  81.            $89/
  82.            $26/
  83.            SystemSP/
  84.            $FA/
  85.            $8E/
  86.            $16/
  87.            PopUpSS/ (* <-- für den diese Routine *)
  88.                     (*     installiert wird      *)
  89.            $8B/
  90.            $26/
  91.            PopUPSp/ (* <-- StackPointer der neuen Routine *)
  92.            $FB);
  93.  
  94.   PROCEDURE CallPopUp;                 (* call far PopUp_ *)
  95.     INLINE($FF/$1E/PopUp_);
  96.  
  97. BEGIN
  98.   IF (Hi(AX) = 0) THEN             (* liegt etwas vor ... *)
  99.     REPEAT
  100.       AX := KeyFromOldInt16;      (* ... ja, also abholen *)
  101.       IF AX = HotKey_ THEN BEGIN
  102.         SwitchStack;
  103.         GetIntVec($16,CurrInt16);
  104.         SetIntVec($16,Int16Save);
  105.         CallPopUp;
  106.         SetIntVec($16,CurrInt16);
  107.         SwitchBack;
  108.       END;
  109.     UNTIL AX <> HotKey_
  110.   ELSE
  111.     ExitOldInt16;
  112. END;
  113.  
  114. PROCEDURE MakeResident(PopUp : POINTER; HotKey : word);
  115.  
  116. BEGIN
  117.   PopUp_ := PopUp;     (* Installations-Parameter sichern *)
  118.   HotKey_ := HotKey;
  119.   GetIntVec($16,Int16Save);   (* alten Intr 16H holen ... *)
  120.   SetIntVec($16,@Int16_);     (* ... und neuen eintragen  *)
  121.   SetIntVec($1B,Int1BSave);   (* Ctrl-Break zurücksetzen  *)
  122.   Keep(0);
  123. END;
  124.  
  125. BEGIN                              (* unit initialisieren *)
  126.   PopUpSS := SSeg;                 (* Stack und Heap wird *)
  127.   PopUPSp := SPtr+4;               (* nicht von Turbo 4.0 *)
  128.                                    (* gesichert: also ... *)
  129.                                    (* .... speichern !!!! *)
  130.   GetIntVec($1B,Int1BSave);        (* Ctrl-Break Vektor   *)
  131.                                    (* sichern !!!!!       *)
  132. END.
  133. (* ------------------------------------------------------ *)
  134. (*                  Ende von TSR.PAS                      *)
  135.