home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* TSR.PAS (v1.0) *)
- (* Installation von Pop-Up-Programmen in Turbo 4.0/5.0 *)
- (* (c) 1988 Karsten Gieselmann & PASCAL International *)
- (* *)
- (* Diese UNIT sollte vor Crt in der USES-Anweisung auf- *)
- (* tauchen, um den von Crt angezapften Ctrl-Break-Vektor *)
- (* zu sichern und beim resident machen des Programms *)
- (* wieder zurückzusetzen. *)
- (* ------------------------------------------------------ *)
- {$R-,S-,I-,V-,B-,N-} (* größtmögliche Geschwindigkeit! *)
-
- UNIT TSR;
-
- INTERFACE USES Dos;
-
- PROCEDURE MakeResident (PopUp :POINTER; HotKey :WORD);
- (* beläßt das aktuelle Programm mit den beim
- Compilieren festgelegten Speichergrößen für Heap
- und Stack ($M-Option) resident im Speicher;
- bei jedem Betätigen der Hotkey-Taste wird die bei
- der Adresse "Pop-Up" befindliche parameterlose
- Prozedur ausgeführt. *)
-
- IMPLEMENTATION
-
- VAR
- SystemSP,SystemSS,
- (* Zwischenspeicher für Stapelwerte *)
- PopUpSS,PopUpSP, (* Stackwerte für die PopUp-Routine *)
- HotKey_ :WORD;
- CurrInt16,PopUp_,
- Int16Save,Int1BSave :POINTER;
-
- PROCEDURE Int16 (Flags,CS,IP,AX,BX,CX,DX,
- SI,DI,DS,ES,BP :WORD);
- (* die neue Routine für den Tastaturinterrupt *)
-
- INTERRUPT;
-
- FUNCTION KeyFromOldInt16 :WORD;
- (* alte Tastaturroutine aufrufen und einen Tastencode
- holen *)
- INLINE ($31/$C0/$9C/$FF/$1E/Int16Save);
-
- PROCEDURE ExitOldInt16;
- (* Interruptprozedur verlassen und zur alten Routine
- weiterspringen *)
- INLINE ($A1/Int16Save+2/$87/$46/$10/$8B/$1E/Int16Save/
- $87/$5E/$0E/$5D/$07/$1F/$5F/$5E/$5A/$59/$CB);
-
- PROCEDURE CallPopUp;
- (* Pop-Up-Routine aufrufen *)
- INLINE ($FF/$1E/PopUp_);
-
- PROCEDURE SwitchStack;
- (* vom System- auf den Pop-Up-Stapel umschalten *)
- INLINE ($8C/$16/SystemSS/$89/$26/SystemSP/$FA/
- $8E/$16/PopUpSS/$8B/$26/PopUpSP/$FB);
-
- PROCEDURE SwitchBack;
- (* vom Pop-Up- zurück auf den Systemstapel
- zurückschalten *)
- INLINE ($FA/$8E/$16/SystemSS/$8B/$26/SystemSP/$FB);
-
- BEGIN
- IF (Hi(AX)=0) THEN
- (* soll überhaupt eine Taste geholt werden? *)
- REPEAT
- AX := KeyFromOldInt16;
- (* ja, dann alte Routine rufen *)
- IF AX = HotKey_ THEN BEGIN
- (* war gedrückte Taste der Hotkey? *)
- SwitchStack; (* ja, dann Stapel umschalten... *)
- GetIntVec ($16, CurrInt16);
- SetIntVec ($16, Int16Save);
- (* Int16-Vektor auf alten Wert *)
- CallPopUp; (* Pop-Up-Programm aufrufen *)
- SetIntVec ($16, CurrInt16);
- (* und obige Änderungen.... *)
- SwitchBack; (* ...wieder rückgängig machen *)
- END
- UNTIL AX <> HotKey_
- ELSE
- ExitOldInt16;
- (* keine Taste holen, dann weiter zur alten Routine! *)
- END;
-
- PROCEDURE MakeResident (PopUp :POINTER; HotKey :WORD);
-
- BEGIN
- PopUp_ := PopUp;
- (* Installationsparameter sichen *)
- HotKey_ := HotKey;
- GetIntVec ($16, Int16Save);
- (* alte Routine holen.... *)
- SetIntVec ($16, @Int16);
- (* ....und neue installieren! *)
- SetIntVec ($1B, Int1BSave);
- (* Ctrl-Break zurücksetzen *)
- Keep (0) (* Programm resident machen *)
- END;
-
- BEGIN
- PopUpSS := SSeg; (* die Stapelwerte merken *)
- PopUpSP := SPtr + 4; (* Sprung hierhin berücksichtigen! *)
- GetIntVec ($1B, Int1BSave);
- (* Ctrl-Break-Vektor sichern *)
- END.
- (* ------------------------------------------------------ *)
- (* Ende von TSR.PAS *)