home *** CD-ROM | disk | FTP | other *** search
- TSR-Programmierung in Assembler
-
-
- Fast jeder Computerbenutzer kennt sie, die hilfreichen kleinen Programme,
- die im Arbeitsspeicher darauf lauern, aktiviert zu werden. Wie man selbst
- solche Programme schreibt, soll der Inhalt dieses Artikels sein.
-
- Ein Programm, das speicherresident im RAM verbleiben soll, muß mit mehreren
- Systemeigenheiten fertig werden.
-
-
- Zum einen muß dafür gesorgt werden, daß der Speicherplatz in dem das TSR
- Programm abgelegt ist, nach dessen Installierung nicht von anderen
- Programmen überschrieben wird. Hierfür bietet MS-DOS dem Programmierer
- Hilfestellung an. Der Interrupt 27h sorgt dafür, daß ein bestimmter
- Speicherbereich nicht überschrieben wird.
-
- Wenn Sie ein Programm schreiben möchten, das im Speicher verbleibt, müssen
- Sie sich Gedanken darüber machen, wann das Programm aktiviert werden soll.
- Um dieses realisieren zu können muß man über einige Kenntnisse der internen
- Abläufe des Computers verfügen.
-
- Ein laufendes Programm wird ohne das der Anwender davon etwas merkt häufig
- unterbrochen. Diese Unterbrechungen (Interrupt's) können von
- unterschiedlichen Ereignissen ausgelöst werden. Dieses geschieht
- beispielsweise beim Drücken einer Taste, beim Einstellen des Videomodis,
- beim Fortzählen der internen Uhr etc.
-
- Da es bei einem Computer mehrere dieser Ereignisse gibt, sind auh mehrere
- Reaktionen des Computers vorgesehen. Was bei einer Unterbrechung genau
- geschehen soll, bestimmt die sogenannte Interruptroutine. Dieses ist
- eigentlich nichts anderes, als ein Programm, das bei eintreten eines
- Ereignisses ausgeführt wird.
-
- Wo befindet sich eine Interruptroutine ?
-
- An der ersten RAM Speicherstelle (0000:0000) beginnt ein Bereich, in dem
- sämtliche Adressen der verschiedenen Interruptroutinen zu finden sind.
- Dieser Speicherbereich wird auch als Vektortabelle bezeichnet. Wird nun ein
- Eintrag der Vektortabelle mit der Speicheradresse eines Programms
- überschrieben, so wird fortan bei einer Interruptanforderung dieses
- Programm abgearbeitet. Diese Vorgehensweise wird im Fachjargon als
- "Verbiegen der Interrupts" bezeichnet.
-
- Um nun wieder auf die TSR Programmierung zurückzukommen: Ein TSR Programm
- muß zur Aktivierung mindestens einen Interrupt verbiegen, wenn es nicht bis
- zum nächsten Booten des Computers sein Dasein als Datenleiche fristen will.
- Außerdem müssen Überlegungen angestellt werden, was mit dem alten
- Interrupt geschehen soll. Eine häufige Technik ist es hierbei, die Adresse
- des alten Interrupts zu speichern, und diesen bei Bedarf aus der neuen
- Interruptroutine aufzurufen. Somit wäre geklärt, wie ein Programm im
- Speicher gehalten und aktiviert werden kann.
-
- Damit eine, durch ein TSR Programm unterbrochene Routine nach dessen
- Beendigung korrekt weiterarbeiten kann, muß das TSR Programm den Zustand
- des Computers herstellen, den er vor der Unterbrechung hatte. Um den
- Originalzustand wiederherstellen zu können, ist wichtig alle
- Prozessorregister zu sichern. Bei der Aktivierung eines TSR Programms kann
- außerdem nicht festgestellt werden, wieviel freier Stackspeicher das
- laufende Programm noch bietet. Da man grundsätzlich davon ausgehen muß, daß
- zu wenig Stack bereitsteht, ist es ratsam dem TSR Programm einen eigenen
- Stackspeicher zu spendieren. Hierzu müssen die Stackregister SS und SP auf
- einen eigenen Speicherbereich gesetzt werden.
-
-
- Werden mit dem TSR Programm Bildschirmausgaben gemacht, so muß auch der
- Bildschirminhalt nach Beendigung des TSR Programms wieder in den
- Originalzustand versetzt werden.
-
- Wird während eines speicherresidenten Programmes die CTRL C Kombination
- betätigt, so ist bei eingeschalteter CTRL C Prüfung auch das laufende
- Anwenderprogramm davon betroffen. Damit dieses nicht auch abgebrochen
- wird, ist es ratsam für das speicherresidente Programm die CTRL C Prüfung
- grundsätzlich abzuschalten.
-
- Ein weiteres Problem ist die nicht Wiedereintrittsfähigkeit (Reentranz) der
- MS-DOS Funktionen. Diese Tatsache ist darin begründet, daß INT 21h
- Funktionen einen eigenen Variablenspeicher besitzen. Wird eine INT 21h
- Funktion unterbrochen, und ruft die Unterberechung ihrerseits wieder INT
- 21h Funktionen auf, so werden die DOS Variablen mit neuen Werten belegt.
- Wird die Unterbrechung beendet, so sind in den Variablen nur noch die
- veränderten Werte enthalten. Versucht nun die unterbrochene DOS Funktion
- die alten Werte zu lesen, so werden nur noch falsche Werte zurückgeliefert.
- Ein korrektes Weiterarbeiten ist dann sehr in Frage gestellt. Das
- Betriebssystem kommt gründlich durcheinander, ein Systemabsturz wird
- höchstwahrscheinlich die Folge sein.
-
- Ein TSR Programm hat jetzt 2 Möglichkeiten, dieses Problem in den Griff zu
- bekommen. Entweder es benutzt keine INT 21h Aufrufe, oder das TSR Programm
- darf nur gestartet werden wenn gerade keine DOS Funktion aktiv ist. Da man
- um den Gebrauch von DOS Funktionen bei manchen Programmen nicht
- herumkommt (beispielsweise bei der Speicherung von Daten auf Diskette), ist
- die 2. Lösung für den Programmierer die angenehmere.
-
- Hotkey Programme
-
- Speicherresidente Programme, die über eine bestimmte Tastenkombination
- aktiviert werden, werden häufig als Hotkey Programme bezeichnet. Wie
- schreibt man ein solches Programm selbst ?
-
- Für die Aktivierung eines Hotkey Programms sind 2 Varianten denkbar. Zum
- einen könnte der Interrupt 9, der bei jedem Tastendruck aktiviert wird, auf
- eine eigene Routine verbogen werden, die dann unser speicherresidentes
- Programm bei Bedarf startet. Da ein INT 9 jedoch jederzeit erfolgen kann,
- ist nicht sichergestellt, ob eine DOS Funktion gerade aktiv ist oder nicht.
- Zwar könnte man hierfür eine Überprüfung in das TSR Programm mit einfügen,
- aber das würde den Umfang des Programms nur erhöhen. Eine einfachere
- Möglichkeit ist mit dem Interupt 16h gegeben. Dieser Interrupt wird von den
- meisten Programmen, die auf Tastendrücke reagieren, zum Tasteneinlesen
- verwendet. Wenn wir diesen Interrupt durch einen eigenen ersetzen, können
- wir sicher sein, daß sich unser Betriebssystem in einem Status befindet, der
- unterbrochen werden darf. Bei einem Zeitpunkt, bei dem von einem Programm
- eine Taste angefordert wird (auch bei DOS in der Kommandozeile), können
- nähmlich keine anderen Routinen gerade ablaufen, als eben diese
- Tastenabfrage. Es ist zwar möglich, daß DOS beim Warten auf eine Taste
- unterbrochen wurde, aber dieses ist ausnahmsweise gestattet.
-
- Ein eigenes Hotkey Programm
-
- Uns steht jetzt nichts mehr im Wege, eigene Hotkey Programme zu erstellen.
- Das Listing INT16TSR.ASM berücksichtigt alle wichtigen Faktoren, die ein
- speicherresidentes Programm beachten muß. Hierbei ist INT16TSR kein
- eigenständiges Programm. Es ist vielmehr als eine Art Gerüstprogramm zu
- verstehen, das eine Assemblerroutine speicherresident installieren kann.
- Diese Assemblerroutine wird mittels einer INCLUDE Anweißung in das Programm
- eingebunden. Weiterhin muß die Routine mit dem Namen "TSRPROGRAM PROC"
- bezeichnet sein.
-
- Innerhalb dieser Routine dürfen Sie sämtliche Prozessorregister bis auf
- CS,SS und SP verändern. Sie können Unterprogramme aufrufen, oder Interrupts
- benutzen (auch die DOS Funktionen des INT 21h). Sollten Sie in Ihrem
- Programm einen erhöhten Stackbedarf haben, so kann es durchaus sein, daß
- Sie den Stackspeicher des Hotkey Programms vergrößern müssen. Hierzu geben
- Sie lediglich in der Zeile über dem Label "NEWSTACK" eine größer Byteanzahl
- an (siehe auch Kommentar im Listing). Die Konstante "_HOTKEY" zu beginn des
- Listings gibt den Scancode an, bei dem das Hotkey Programm aktiviert wird.
- Die Konstante "_MELD" beeinhaltet den Text, der bei der Installierung des
- Programms ausgegeben wird. Der einzigste INCLUDE Befehl bindet Ihre
- eigentliche speicherresidente Routine in das TSR Programm ein.
-
- Einen Nachteil haben die TSR Programme, die mit INT16TSR erstellt wurden:
- Hat ein Anwenderprogramm keine Tastenabfragen oder liest ein Programm die
- Tasten ohne den INT 16h ein, so kann unser erstelltes Programm nicht
- aktiviert werden. Dieses sind zum Glück jedoch die wenigsten Programme.
-
- INT16TSR.ASM läßt sich mit dem TASM 1.0 oder höher von Borland übersetzen.
-
- Die Beispielsprogramme
-
- Um Ihnen den Umgang mit INT16TSR zu zeigen, haben wir 4 kleine
- Demoprogramme geschrieben:
-
- CSNAP.TSR ist ein Snapshotprogramm, das den aktuellen Bildschirm speichert.
- Nach der Aktivierung des Hotkey's wird der Bildschirminhalt auf Diskette
- oder Festplatte gespeichert. Der Clou der Sache ist, daß zusätzlich zu den
- Bildschirmdaten ein kleines Ladeprogramm mit gespeichert wird. Dadurch ist
- es möglich, die DATEN im COM Format zu speichern. CSNAP erzeugt die Datei
- SCREEN.COM im aktuellen Verzeichnis. Sie brauchen also nur den Dateinamen
- SCREEN anzugeben um den Bildschirminhalt betrachten zu können. Es können
- alle Viedomodis von 1 .. 6 gespeichert werden (alle Text- und CGA
- Grafikmodis).
-
- UHR.TSR zeigt auf Tastendruck in der rechten oberen Ecke des Bildschirms
- die Uhrzeit an. Auf einen weiteren Tastendruck verschwindet sie wieder.
-
- GETKEY.TSR zeigt nach Aktivierung die hexadezimalen Scancodes der Tasten
- an,, wie sie der INT 16h liefert. Mit diesem Utility sind Sie in der Lage auf
- einfachste Weise die Zahlenwerte zu ermitteln, wie sie das Gerüstprogram
- INT16TSR.ASM benötigt.
-
- TEST.TSR gibt einen Text aus, und läßt ihn nach einem weiteren Tastendruck
- wieder verschwinden.
-
-
- Empfohlene Scancodes
-
- Die folgende Auflistung gibt nur eine Empfehlung aus, mit welchen
- Tastencombinationen die Beispielsprogramme versehen werden können
-
-
- CSNAP ALT C 2E00h
- GETKEY ALT G 2200h
- UHR ALT U 1600h
- TEST ALT T 1400h
-