home *** CD-ROM | disk | FTP | other *** search
- (*********************************************************)
- (* TSR.PAS *)
- (* Installation von Pop-Up-Prog. in Turbo Pascal-4.0 *)
- (* (c) 1988 Karsten Gieselmann & PASCAL International *)
- (* !!! Diese UNIT sollte vor Crt in der USES-Anweisung *)
- (* !!! auftauchen, um den von Crt angezapften Ctrl-Break-*)
- (* !!! Vektor zu sichern und beim resident machen des *)
- (* !!! Programms wieder zurückzusetzen. *)
- (*********************************************************)
-
- UNIT TSR;
-
- INTERFACE
-
- USES Dos;
-
- (* beläßt das aktuelle Programm mit den beim Kompilieren
- 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" befind-
- lich parameterlose Prozedur ausgeführt. *)
- PROCEDURE MakeResident (PopUp :POINTER; HotKey :WORD);
-
-
- IMPLEMENTATION
-
- VAR
- SystemSP,SystemSS, (* Zwischenspeicher für Stapelwerte *)
- PopUpSS,PopUpSP, (* Stackwerte für die PopUp-Routine *)
- HotKey_ :WORD;
- CurrInt16,PopUp_,
- Int16Save,Int1BSave:POINTER;
-
-
- (* die neue Routine für den Tastaturinterrupt *)
- PROCEDURE Int16
- (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP :WORD);
- INTERRUPT;
-
- (* alte Tastaturroutine aufrufen und einen Tastencode
- holen: *)
- FUNCTION KeyFromOldInt16 :WORD;
- INLINE ($31/$C0/$9C/$FF/$1E/Int16Save);
-
- (* Interruptprozedur verlassen und zur alten Routine
- weiterspringen: *)
- PROCEDURE ExitOldInt16;
- 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_);
-
- (* vom System- auf den Pop-Up-Stapel umschalten: *)
- PROCEDURE SwitchStack;
- INLINE ($8C/$16/SystemSS/$89/$26/SystemSP/$FA/
- $8E/$16/PopUpSS/$8B/$26/PopUpSP/$FB);
-
- (* vom Pop-Up- zurück auf den Systemstapel schalten *)
- PROCEDURE SwitchBack;
- INLINE ($FA/$8E/$16/SystemSS/$8B/$26/SystemSP/$FB);
-
- BEGIN
- (* soll überhaupt eine Taste geholt werden? *)
- IF (Hi(AX)=0) THEN
- REPEAT (* ja, dann alte Routine rufen: *)
- AX := KeyFromOldInt16;
- IF AX = HotKey_ THEN BEGIN (* war Taste Hotkey? *)
- SwitchStack; (* ja, dann Stapel umschalten... *)
- GetIntVec ($16, CurrInt16);
- (* Int16-Vektor auf alten Wert: *)
- SetIntVec ($16, Int16Save);
- CallPopUp; (* Pop-Up-Programm aufrufen *)
- SetIntVec ($16, CurrInt16); (* und Änderungen... *)
- SwitchBack; (* ...wieder rückgängig machen *)
- END
- UNTIL AX <> HotKey_
- ELSE (* keine Taste holen, weiter zur alten Routine! *)
- ExitOldInt16;
- 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 (* Unit initialisieren *)
- PopUpSS := SSeg; (* die Stapelwerte merken *)
- PopUpSP := SPtr+4; (* Sprung hierhin berücksichtigen! *)
- GetIntVec($1B,Int1BSave); (* Ctrl-Break-Vektor sichern *)
- END.