home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* TSR.PAS *)
- (* Unit zum Abfangen von Intr 16H und des InDosByte *)
- (* nach einer Idee aus PASCAL 5'88 *)
- (* ------------------------------------------------------ *)
- UNIT Tsr ;
-
- INTERFACE (* all das, was nacher zur Verfügung steht *)
-
- USES Dos; (* für Registers *)
-
- PROCEDURE MakeResident(PopUp : POINTER; HotKey : word);
- PROCEDURE SwitchBackDos;
- (* bricht das aktuelle Vordergrundprogramm ab *)
-
- (* ------------------------------------------------------ *)
- IMPLEMENTATION
-
- VAR SystemSP, SystemSS : word;
- PopUPSp , PopUpSS,
- HotKey_ : word;
- CurrInt16,
- PopUp_,
- Int16Save, Int1BSave : POINTER;
- Regs : Registers;
-
- PROCEDURE SwitchBack; (* Stack zurückschalten *)
- (* urspunglich eine Unterprozedur von *)
- (* Int16_ Prozedur weiter unten *)
- (* Sie muss hierher verschoben werden *)
- INLINE($FA/
- $8E/
- $16/
- SystemSS/
- $8B/
- $26/
- SystemSP/
- $FB);
-
- PROCEDURE SwitchBackDos;
- (* bricht das aktuelle Programm ab, dies *)
- BEGIN (* ist etwa bei unendlichen Schleifen gut *)
- SetIntVec($16,CurrInt16);
- SwitchBack; (* aus der alten Int16_ Prozedur *)
- Regs.AX := $4CC8; (* ExitCode = 200 *)
- MsDos(Regs);
- END;
-
- PROCEDURE Int16_(Flags,CS,IP,AX,BX,CX,DX,
- SI,DI,DS,ES,BP : word); INTERRUPT;
- FUNCTION KeyFromOldInt16 : word; (* Zeichen abholen *)
- INLINE($31/
- $C0/
- $9C/
- $FF/
- $1E/Int16Save);
-
- PROCEDURE ExitOldInt16;
- INLINE($A1/Int16Save+2/
- $87/
- $46/
- $10/
- $8B/
- $1E/Int16Save/
- $87/
- $5E/
- $0E/
- $5D/
- $07/
- $1F/
- $5F/
- $5E/
- $5A/
- $59/
- $CB);
-
- PROCEDURE SwitchStack; (* für einen IntrVektor !!! *)
- INLINE($8C/
- $16/
- SystemSS/
- $89/
- $26/
- SystemSP/
- $FA/
- $8E/
- $16/
- PopUpSS/ (* <-- für den diese Routine *)
- (* installiert wird *)
- $8B/
- $26/
- PopUPSp/ (* <-- StackPointer der neuen Routine *)
- $FB);
-
- PROCEDURE CallPopUp; (* call far PopUp_ *)
- INLINE($FF/$1E/PopUp_);
-
- BEGIN
- IF (Hi(AX) = 0) THEN (* liegt etwas vor ... *)
- REPEAT
- AX := KeyFromOldInt16; (* ... ja, also abholen *)
- IF AX = HotKey_ THEN BEGIN
- SwitchStack;
- GetIntVec($16,CurrInt16);
- SetIntVec($16,Int16Save);
- CallPopUp;
- SetIntVec($16,CurrInt16);
- SwitchBack;
- END;
- UNTIL AX <> HotKey_
- ELSE
- ExitOldInt16;
- END;
-
- PROCEDURE MakeResident(PopUp : POINTER; HotKey : word);
-
- BEGIN
- PopUp_ := PopUp; (* Installations-Parameter sichern *)
- HotKey_ := HotKey;
- GetIntVec($16,Int16Save); (* alten Intr 16H holen ... *)
- SetIntVec($16,@Int16_); (* ... und neuen eintragen *)
- SetIntVec($1B,Int1BSave); (* Ctrl-Break zurücksetzen *)
- Keep(0);
- END;
-
- BEGIN (* unit initialisieren *)
- PopUpSS := SSeg; (* Stack und Heap wird *)
- PopUPSp := SPtr+4; (* nicht von Turbo 4.0 *)
- (* gesichert: also ... *)
- (* .... speichern !!!! *)
- GetIntVec($1B,Int1BSave); (* Ctrl-Break Vektor *)
- (* sichern !!!!! *)
- END.
- (* ------------------------------------------------------ *)
- (* Ende von TSR.PAS *)
-