home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (* TSR.PAS *)
- (* Installation von Pop-Up-Programmen in Turbo-Pacal V. 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 Speicher-
- größ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. *)
-
-
- 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
- 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;
- HotKey_ := HotKey;
- GetIntVec ($16,Int16Save);
- SetIntVec ($16,@int16);
- SetIntVec ($1B, Int1BSave);
- Keep(0);
- end;
-
- Begin (* Unit Initialisieren *)
- PopUpSS := SSeg;
- PopUpSp := Sptr+4;
- GetIntVec($1B,Int1BSave);
- end.
-
-