home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / tricks / asm / tsr.con < prev    next >
Encoding:
Text File  |  1992-01-10  |  10.0 KB  |  185 lines

  1.                   TSR-Programmierung in Assembler
  2.   
  3.   
  4.   Fast jeder Computerbenutzer kennt sie, die hilfreichen kleinen Programme,
  5.   die im Arbeitsspeicher darauf lauern, aktiviert zu werden. Wie man selbst
  6.   solche Programme schreibt, soll der Inhalt dieses Artikels sein.
  7.   
  8.   Ein Programm, das speicherresident im RAM verbleiben soll, muß mit mehreren
  9.   Systemeigenheiten fertig werden.
  10.   
  11.   
  12.   Zum einen muß dafür gesorgt werden, daß der Speicherplatz in dem das TSR
  13.   Programm abgelegt ist, nach dessen Installierung nicht von anderen
  14.   Programmen überschrieben wird. Hierfür bietet MS-DOS dem Programmierer
  15.   Hilfestellung an. Der Interrupt 27h sorgt dafür, daß ein bestimmter
  16.   Speicherbereich nicht überschrieben wird.
  17.   
  18.   Wenn Sie ein Programm schreiben möchten, das im Speicher verbleibt, müssen
  19.   Sie sich Gedanken darüber machen, wann das Programm aktiviert werden soll.
  20.   Um dieses realisieren zu können muß man über einige Kenntnisse der internen
  21.   Abläufe des Computers verfügen.
  22.   
  23.   Ein laufendes Programm wird ohne das der Anwender davon etwas merkt häufig
  24.   unterbrochen. Diese Unterbrechungen (Interrupt's) können von
  25.   unterschiedlichen Ereignissen ausgelöst werden. Dieses geschieht
  26.   beispielsweise beim Drücken einer Taste, beim Einstellen des Videomodis,
  27.   beim Fortzählen der internen Uhr etc.
  28.   
  29.   Da es bei einem Computer mehrere dieser Ereignisse gibt, sind auh mehrere
  30.   Reaktionen des Computers vorgesehen. Was bei einer Unterbrechung genau
  31.   geschehen soll, bestimmt die sogenannte Interruptroutine. Dieses ist
  32.   eigentlich nichts anderes, als ein Programm, das bei eintreten eines
  33.   Ereignisses ausgeführt wird.
  34.   
  35.              Wo befindet sich eine Interruptroutine ?
  36.   
  37.   An der ersten RAM Speicherstelle (0000:0000) beginnt ein Bereich, in dem
  38.   sämtliche Adressen der verschiedenen Interruptroutinen zu finden sind.
  39.   Dieser Speicherbereich wird auch als Vektortabelle bezeichnet. Wird nun ein
  40.   Eintrag der Vektortabelle mit der Speicheradresse eines Programms
  41.   überschrieben, so wird fortan bei einer Interruptanforderung dieses
  42.   Programm abgearbeitet. Diese Vorgehensweise wird im Fachjargon als
  43.   "Verbiegen der Interrupts" bezeichnet.
  44.   
  45.   Um nun wieder auf die TSR Programmierung zurückzukommen: Ein TSR Programm
  46.   muß zur Aktivierung mindestens einen Interrupt verbiegen, wenn es nicht bis
  47.   zum nächsten Booten des Computers sein Dasein als Datenleiche fristen will.
  48.   Außerdem müssen Überlegungen angestellt werden, was mit dem alten
  49.   Interrupt geschehen soll. Eine häufige Technik ist es hierbei, die Adresse
  50.   des alten Interrupts zu speichern, und diesen bei Bedarf aus der neuen
  51.   Interruptroutine aufzurufen. Somit wäre geklärt, wie ein Programm im
  52.   Speicher gehalten und aktiviert werden kann.
  53.   
  54.   Damit eine, durch ein TSR Programm unterbrochene Routine nach dessen
  55.   Beendigung korrekt weiterarbeiten kann, muß das TSR Programm den Zustand
  56.   des Computers herstellen, den er vor der Unterbrechung hatte. Um den
  57.   Originalzustand wiederherstellen zu können, ist wichtig alle
  58.   Prozessorregister zu sichern. Bei der Aktivierung eines TSR Programms kann
  59.   außerdem nicht festgestellt werden, wieviel freier Stackspeicher das
  60.   laufende Programm noch bietet. Da man grundsätzlich davon ausgehen muß, daß
  61.   zu wenig Stack bereitsteht, ist es ratsam dem TSR Programm einen eigenen
  62.   Stackspeicher zu spendieren. Hierzu müssen die Stackregister SS und SP auf
  63.   einen eigenen Speicherbereich gesetzt werden.
  64.   
  65.   
  66.   Werden mit dem TSR Programm Bildschirmausgaben gemacht, so muß auch der
  67.   Bildschirminhalt nach Beendigung des TSR Programms wieder in den
  68.   Originalzustand versetzt werden.
  69.   
  70.   Wird während eines speicherresidenten Programmes die CTRL C Kombination
  71.   betätigt, so ist bei eingeschalteter CTRL C Prüfung auch das laufende
  72.   Anwenderprogramm davon betroffen. Damit dieses nicht auch abgebrochen
  73.   wird, ist es ratsam für das speicherresidente Programm die CTRL C Prüfung
  74.   grundsätzlich abzuschalten.
  75.   
  76.   Ein weiteres Problem ist die nicht Wiedereintrittsfähigkeit (Reentranz) der
  77.   MS-DOS Funktionen. Diese Tatsache ist darin begründet, daß INT 21h
  78.   Funktionen einen eigenen Variablenspeicher besitzen. Wird eine INT 21h
  79.   Funktion unterbrochen, und ruft die Unterberechung ihrerseits wieder INT
  80.   21h Funktionen auf, so werden die DOS Variablen mit neuen Werten belegt.
  81.   Wird die Unterbrechung beendet, so sind in den Variablen nur noch die
  82.   veränderten Werte enthalten. Versucht nun die unterbrochene DOS Funktion
  83.   die alten Werte zu lesen, so werden nur noch falsche Werte zurückgeliefert.
  84.   Ein korrektes Weiterarbeiten ist dann sehr in Frage gestellt. Das
  85.   Betriebssystem kommt gründlich durcheinander, ein Systemabsturz wird
  86.   höchstwahrscheinlich die Folge sein.
  87.   
  88.   Ein TSR Programm hat jetzt 2 Möglichkeiten, dieses Problem in den Griff zu
  89.   bekommen. Entweder es benutzt keine INT 21h Aufrufe, oder das TSR Programm
  90.   darf nur gestartet werden wenn gerade keine DOS Funktion aktiv ist. Da man
  91.   um den Gebrauch von DOS Funktionen bei manchen Programmen nicht
  92.   herumkommt (beispielsweise bei der Speicherung von Daten auf Diskette), ist
  93.   die 2. Lösung für den Programmierer die angenehmere.
  94.   
  95.                          Hotkey Programme
  96.   
  97.   Speicherresidente Programme, die über eine bestimmte Tastenkombination
  98.   aktiviert werden, werden häufig als Hotkey Programme bezeichnet. Wie
  99.   schreibt man ein solches Programm selbst ?
  100.   
  101.   Für die Aktivierung eines Hotkey Programms sind 2 Varianten denkbar. Zum
  102.   einen könnte der Interrupt 9, der bei jedem Tastendruck aktiviert wird, auf
  103.   eine eigene Routine verbogen werden, die dann unser speicherresidentes
  104.   Programm bei Bedarf startet. Da ein INT 9 jedoch jederzeit erfolgen kann,
  105.   ist nicht sichergestellt, ob eine DOS Funktion gerade aktiv ist oder nicht.
  106.   Zwar könnte man hierfür eine Überprüfung in das TSR Programm mit einfügen,
  107.   aber das würde den Umfang des Programms nur erhöhen. Eine einfachere
  108.   Möglichkeit ist mit dem Interupt 16h gegeben. Dieser Interrupt wird von den
  109.   meisten Programmen, die auf Tastendrücke reagieren, zum Tasteneinlesen
  110.   verwendet. Wenn wir diesen Interrupt durch einen eigenen ersetzen, können
  111.   wir sicher sein, daß sich unser Betriebssystem in einem Status befindet, der
  112.   unterbrochen werden darf. Bei einem Zeitpunkt, bei dem von einem Programm
  113.   eine Taste angefordert wird (auch bei DOS in der Kommandozeile), können
  114.   nähmlich keine anderen Routinen gerade ablaufen, als eben diese
  115.   Tastenabfrage. Es ist zwar möglich, daß DOS beim Warten auf eine Taste
  116.   unterbrochen wurde, aber dieses ist ausnahmsweise gestattet.
  117.   
  118.                     Ein eigenes Hotkey Programm
  119.   
  120.   Uns steht jetzt nichts mehr im Wege, eigene Hotkey Programme zu erstellen.
  121.   Das Listing INT16TSR.ASM berücksichtigt alle wichtigen Faktoren, die ein
  122.   speicherresidentes Programm beachten muß. Hierbei ist INT16TSR kein
  123.   eigenständiges Programm. Es ist vielmehr als eine Art Gerüstprogramm zu
  124.   verstehen, das eine Assemblerroutine speicherresident installieren kann.
  125.   Diese Assemblerroutine wird mittels einer INCLUDE Anweißung in das Programm
  126.   eingebunden. Weiterhin muß die Routine mit dem Namen "TSRPROGRAM PROC"
  127.   bezeichnet sein.
  128.   
  129.   Innerhalb dieser Routine dürfen Sie sämtliche Prozessorregister bis auf
  130.   CS,SS und SP verändern. Sie können Unterprogramme aufrufen, oder Interrupts
  131.   benutzen (auch die DOS Funktionen des INT 21h). Sollten Sie in Ihrem
  132.   Programm einen erhöhten Stackbedarf haben, so kann es durchaus sein, daß
  133.   Sie den Stackspeicher des Hotkey Programms vergrößern müssen. Hierzu geben
  134.   Sie lediglich in der Zeile über dem Label "NEWSTACK" eine größer Byteanzahl
  135.   an (siehe auch Kommentar im Listing). Die Konstante "_HOTKEY" zu beginn des
  136.   Listings gibt den Scancode an, bei dem das Hotkey Programm aktiviert wird.
  137.   Die Konstante "_MELD" beeinhaltet den Text, der bei der Installierung des
  138.   Programms ausgegeben wird. Der einzigste INCLUDE Befehl bindet Ihre
  139.   eigentliche speicherresidente Routine in das TSR Programm ein.
  140.   
  141.   Einen Nachteil haben die TSR Programme, die mit INT16TSR erstellt wurden:
  142.   Hat ein Anwenderprogramm keine Tastenabfragen oder liest ein Programm die
  143.   Tasten ohne den INT 16h ein, so kann unser erstelltes Programm nicht
  144.   aktiviert werden. Dieses sind zum Glück jedoch die wenigsten Programme.
  145.   
  146.   INT16TSR.ASM läßt sich mit dem TASM 1.0 oder höher von Borland übersetzen.
  147.   
  148.                       Die Beispielsprogramme
  149.   
  150.   Um Ihnen den Umgang mit INT16TSR zu zeigen, haben wir 4 kleine
  151.   Demoprogramme geschrieben:
  152.   
  153.   CSNAP.TSR ist ein Snapshotprogramm, das den aktuellen Bildschirm speichert.
  154.   Nach der Aktivierung des Hotkey's wird der Bildschirminhalt auf Diskette
  155.   oder Festplatte gespeichert. Der Clou der Sache ist, daß zusätzlich zu den
  156.   Bildschirmdaten ein kleines Ladeprogramm mit gespeichert wird. Dadurch ist
  157.   es möglich, die DATEN im COM Format zu speichern. CSNAP erzeugt die Datei
  158.   SCREEN.COM im aktuellen Verzeichnis. Sie brauchen also nur den Dateinamen
  159.   SCREEN anzugeben um den Bildschirminhalt betrachten zu können. Es können
  160.   alle Viedomodis von 1 .. 6 gespeichert werden (alle Text- und CGA
  161.   Grafikmodis).
  162.   
  163.   UHR.TSR zeigt auf Tastendruck in der rechten oberen Ecke des Bildschirms
  164.   die Uhrzeit an. Auf einen weiteren Tastendruck verschwindet sie wieder.
  165.   
  166.   GETKEY.TSR zeigt nach Aktivierung die hexadezimalen Scancodes der Tasten
  167.   an,, wie sie der INT 16h liefert. Mit diesem Utility sind Sie in der Lage auf
  168.   einfachste Weise die Zahlenwerte zu ermitteln, wie sie das Gerüstprogram
  169.   INT16TSR.ASM benötigt.
  170.   
  171.   TEST.TSR gibt einen Text aus, und läßt ihn nach einem weiteren Tastendruck
  172.   wieder verschwinden.
  173.   
  174.   
  175.                        Empfohlene Scancodes
  176.   
  177.   Die folgende Auflistung gibt nur eine Empfehlung aus, mit welchen
  178.   Tastencombinationen die Beispielsprogramme versehen werden können
  179.   
  180.   
  181.        CSNAP          ALT C          2E00h
  182.        GETKEY         ALT G          2200h
  183.        UHR            ALT U          1600h
  184.        TEST           ALT T          1400h
  185.