| HOME | NEWS | AWARDS | ABOUT ME | TEXTE | REFERATE | PROJEKTE |
|
MUSIK | CHAT | SPECIAL | LINKS |

2. Kapitel: Das Listing im Detail

2.1 Initialisierung

2.1.1 Compilerdirektiven

{$r-}

Diese Direktive weist den Compiler an, bei der Übersetzung des Programms keine Bereichsprüfungen zu machen, daß beschleunigt auch die Abarbeitung des Programms.


{$i-}

Diese Direktive weist an, daß bei der Ausführung keine Überprüfung des Stacks stattfindet. Dies ist ebenfalls eine Beschleunigung der Software, die bei Interruptprogrammierung sehr nützlich ist, zudem kann es sonst zu Abstürzen kommen, da der Stack ständig umgeschaltet werden kann.


{$M 8000,0,0}

Hier wird festgelegt, wieviel Stack dem Programm eingeräumt wird und ob hoher Speicher verwendet wird. Letzteres ist nicht der Fall. Als Stack werden 8000 Bytes reserviert. Diese Direktive ist notwendig, da ohne sie der gesamte Speicher vom Programm eingen ommen wird und ein Betreiben von DOS so unmöglich wird.


2.1.2 Globale Variablen

intvec8, intvec9, intvec28

Diese Variablen werden zu Beginn des Programms auf die Adressen der Originalinterruptadressen gesetzt, um diese beim beenden des TSR´s wiederherstellen zu können. Da es sich um Speicheradressen handelt, sind sie als Pointer deklariert.


Idstring

Mit dieser Variable wird die Programmkennung im Speicher installiert. Dies ist notwendig, um eine Mehrfachinstallation des TSR´s zu verhindern.


Active

Dieser Schalter legt fest, ob das TSR gerade aktiv ist, oder nicht. Im Normalfall ist er auf false gesetzt.


Mouseon

Zeigt an, ob der Mauszeiger gerade zu sehen ist, oder nicht. Ist im Normalfall auf true gesetzt.


Turbosp, turboss, oldsp, oldss

Diese Variablen werden benötigt um zwischen dem TSR-Stack und dem DOS-Stack umzuschalten. Die ersten beiden werden bei Programmstart auf die Werte des Programmstacks gesetzt und die letzten beiden enthalten beim Umschalten die Werte des DOS-Stacks.


I

I ist lediglich eine Laufvariable und wird eingesetzt, wenn die Ergebniswerte sowohl positiv, als auch negativ sein können. Sie wird auch zur Aktualisierung des Mauszeigers eingesetzt.


A,b

Diese Variablen werden als Dummy eingesetzt, wenn die Ergebnisswerte im Wordbereich vorliegen, z.B. zum Abfragen der Cursorposition.


Taste

Diese Variable enthält den Scancode des zuletzt eingegebenen Zeichens.


2.1.3 Units

Dos

Diese Unit wird benötigt, um Interrupt und Registeroperationen zu verwenden.


Crt

Wird lediglich für den „Delay“-Befehl in der „action“-Prozedur benötigt


Maus

Unit zur Maussteuerung. Die Variablen „mousex“, „mousey“ und „button“ geben immer die Mausposition bzw. die gedrückte Taste an (1=links, 2=rechts, 3=beide, 0=keine). Folgende Prozeduren wurden verwendet:

mouseinit : Initialisierund der Maus
mouseshow : Anzeigen der Maus
mousehide : Maus verstecken
mousestatus : Vorbereiten für das Auslesen des Mausstatus
getmousestatus : Auslesen/Aktualisieren der Mausdaten


2.2. Prozeduren und Funktionen

Prozedur :totalexec

Parameter:s(string)
Funktion:Diese Prozedur schreibt eine Zeichenkette(s) in den Tastaturpuffer von Microsoft-DOS und fügt dem String ein Return an.
Anwendung:Beim Start von Fremdprogrammen oder auszuführenden Befehlen auf der DOS-Ebene kann so der Befehl EXEC vermieden werden und es kommt bei TSR-Programmen zu weniger Konflikten, da das Umschreiben der Vektoren vermieden wird. Diese Prozedur istz auch nützlich um ein Programm aus einem laufenden Programm zu starten, nachdem dieses bereits beendet ist.
Verweise:Der Tastaturpuffer (1.Kapitel)
Prozedur action (2.Kapitel)


Prozedur setcursor

Parameter:x,y(byte)
Funktion:Setzen der Cursorposition mittels des BIOS
Anwendung:Um das Mausmenü im Programm zu aktualisieren bedarf es des Umsetzens des Cursors, um das Menü stets am gleichen Platz auf dem Bildschirm zu schreiben.
Verweise:BIOS (1. Kapitel)
Prozedur screenwork (2.Kapitel)


Prozedur getcursor

Parameter:x,y(byte, Variablenparameter)
Funktion:Abfragen der Cursorposition mittels des BIOS
Anwendung:Um das Mausmenü im Programm zu aktualisieren bedarf es des Umsetzens des Cursors, um das Menü stets am gleichen Platz auf dem Bildschirm zu schreiben. Da der Cursor danach wieder an seine alte Position gesetzt werden muß, müssen die Ursprungswerte zuvor gesichert werden.
Verweise:BIOS (1. Kapitel)
Prozedur screenwork (2.Kapitel)
Anmerkung:Die Prozedur „gotoxy“, sowie die TP-Variablen „mousex“ und „mousey“ waren nicht anwendbar bei der TSR- Programmierung, weshalb der Weg über das BIOS gewählt wurde.


Funktion getstringatmouse

Parameter:keine
Rückgabe:string
Funktion:Abfrage des Strings, der sich direkt unter dem Mauszeiger befindet. Dazu wird der Bildschirmspeicher an der Mausposition nach links und nach rechts ausgelesen bis man auf ein Leerzeichen oder das Zeilenende bzw. den Zeilenanfang trifft. Danach wird der erhaltene String programmspezifisch verändert, d.h. Klammer werden beseitigt und das eventuell vorhandene Prompt im String entfernt.
Anwendung:Um einen Befehl mit der Maus auszuführen muß man auf ihn klicken. Um dann diesen Befehl auch auszuführen, muß man ihn zunächst einmal kennen und ihn dazu aus dem Bildspeicher lesen.
Verweise:Bildspeicher (1.Kapitel)
Prozedur action (2. Kapitel)


Das Entfernen des Programmes wird in 3 Schritten erledigt. Es ist zunächst notwendig zu kontrollieren, ob die vom eigenen Programm umgebogenen Interrupts (bzw. deren Vektoren) immer noch auf ihre jeweiligen Interrupt-Service-Rountinen zeigen. Anschließend werden die Interrupt-Vektoren wieder auf ihren Original-Handler zurückgesetzt und der benutzte Speicher wieder freigegeben.


Funktion vecs_changed

Parameter: keine
Rückgabe: boolean
Variablen: akt_seg--> sichert die jeweils ermittelte Segmentadresse der aktuellen Interrupt-Handler
int_no--> für Interrupt 21h, Unterfunktion 35h, notwendiges Byte,daß eine Interruptnummer sichert
newints_feld--> eindimensionales Feld mit 3 Komponenten, die die Segmentadressen der Interrupt-Service-Routinen aufnehmen
Funktion:Diese Funktion ermittelt, ob die vom Programm umgebogenen Interrupt- Vektoren immer noch auf ihre eigene Interrupt-Service-Routine zeigen. Wäre dies nicht der Fall, so kann man davon ausgehen, das ein anderes TSR-Programm irgendeinen dieser Vektor en auf eine eigene ISR umgebogen hat. Ein Entfernen unseres Programms wäre dann unmöglich.
Dazu füllt die Funktion zunächst ein Feld mit den Segmentadressen der Interrupt- Service-Rountinen, auf die die umgebogenen Interrupt-Vektoren zeigen. In einer Schleife holt sich die Funktion über die Unterfunktion 35h (GETINTVEC), des Interrupts 21h, die S egmentadressen der aktuellen Interrupt-Handler und vergleicht diese mit Segmentadressen der eigenen Interrupt-Service-Routinen. Im Falle einer Ungleichheit wird an das aufrufende Programm ein TRUE zurückgeliefert, daß anzeigt, daß das Entfernen unmöglich ist.
Anwendung: In der Prozedur „action“, wenn der Befehl „unload“ aktiviert wurde.
Verweise:Interrupts (1. Kapitel)
Prozedur action (2. Kapitel)


Prozedur reset_vecs

Parameter: keine
Funktion: Diese Prozedur setzt über die Pascal-Prozedur SETINTVEC alle vom Programm umgebogenen Interrupt-Vektoren auf ihren Original-Handler zurück, um die Auslösemechanismen für das TSR-Programm zu löschen und den „alten Zustand“ der Interrupts wieder herzustellen.
Anwendung:Wenn der Befehl „unload“ in der „action“-Prozedur erkannt wurde.
Verweise:Interrupts (1. Kapitel)
Prozedur action (2.Kapitel)


Prozedur re_alloc_mem

Parameter: keine
Funktion: Über die Service-Funktion 49h des DOS, wird der vom Programm belegte Speicherplatz frei gegeben. Im ersten Schritt wird dabei der Umgebungsbereich, im zweiten das Programm samt Daten aus dem Speicher entfernt (Umkehrfunktion zur Pascal-Prozedur KEEP).
Anwendung:Wenn in der Prozedur „action“ der Befehl „unload“ erkannt wurde.
Verweise: Turbo Pascal Hilfefunktion, Stichwort: PREFIXSEG
Prozedur action (2.Kapitel)
Anmerkung:Diese Prozedur wurde aus Gründen der Einfachheit und der Kürze aus dem Buch „Effektives Programmieren mit Turbo Pascal“ entnommen.


Prozedur action

Parameter:keine
Funktion:Diese Prozedur führt nach einem Mausklick die gewünschte Aktion aus. Dazu liest sie zunächst den auszuführenden Befehl aus (=>getstringatmouse). Sollte es sich um den rechten Mausbutton handeln, wird dem Befehl die Anweisung zum Verzeichniswechsel vorangestellt.
Jetzt wird geprüft, ob es sich um den programminternen Befehl „Unload“ handelt. In diesem Fall wird das Programm, wenn möglich, aus dem Speicher entfernt. Sollte es sich jedoch um einen anderen Befehl handeln, wird er in den Tastaturpuffer übertragen(=>totalexec)
Anwendung:Wird aufgerufen, wenn eine Mausaktion(Mausklick) vorliegt.
Verweise:Prozeduren reset_vecs, re_alloc_mem, totalexec (2.Kapitel)
Funktion getstringatmouse (2.Kapitel)
Interruptprozedur int8 (2. Kapitel)
Anmerkung:Der Mauszeiger wird bei dieser Prozedur versteckt(mouseon=false) und über den Interrupt 28h wieder aktiviert. Ebenso ist die Variable „active“ während dieser Zeit auf true gesetzt, um den Programm mitzuteilen, daß es bereits aktiv ist.


Prozedur screenwork

Parameter:keine
Funktion:Erneuern des Mausmenüs und des Mauszeigers
Anwendung:Wird in regelmäßigen Abständen von der Prozedur „int8“ aufgerufen, wenn das TSR gerade nicht aktiv ist.
Verweise:Prozeduren getcursor, setcursor (2.Kapitel)
Interruptprozedur int8 (2.Kapitel)


Interruptprozedur int8

Parameter:keine
Funktion:Der Timerinterrupt wird auf diese Prozedur verbogen, da diese Prozedur die Steuerung des Programmes übernehmen soll. Es wurde der Timerinterrupt gewählt, da dieser regelmäßig 18,2 Mal pro Sekunde aufgerufen wird und somit die ständige Bereitschaft des TSR sichert.
Nach dem Aufruf des Interrupts wird zunächst per INLINE-Code die Originalhandlerroutine der Timers aufgerufen, um Konflikte zu vermeiden. Danach wird geprüft, ob das TSR gerade aktiv ist, somit also keiner weiteren Aufrufe bedarf. Ist dies nicht der Fall, wird geprüft, ob die Zählervariable (i) den Wert zum Auffrischen von Menü und Mauszeiger erreicht hat. Ist dies der Fall, wird die Prozedur „screenwork“ aufgerufen. Danach wird der Zähler um eins erhöht. Zuden wurde bereits der aktuelle Mausstatus abgefragt. Ist dabei eine Maustaste gedrückt worden, wird das TSR aktiviert.
Zunächst werden nun die aktuellen Stackdaten gesichert und der Stack auf den programmeigenen Stack umgebogen. Zuletzt werden die Interrupts wieder freigegeben, nachdem sie zu Beginn gesperrt wurden. Dies alles geschieht in Assembler, da Turbo Pascal keine eigenen Prozeduren zur Verfügung stellt.
Jetzt wird dem Programm bekanntgegeben, daß das TSR aktiv ist (active=true) und dann die „action“-Prozedur aufgerufen.
Nachdem diese beendet ist, wird wieder der alte Stack restauriert.
Anwendung:Wird von Microsoft-DOS regelmäßig aufgerufen und dient der Programmkoordination für das TSR.
Verweise:Prozeduren screenwork,action (2.Kapitel)
Interrupts (1.Kapitel)


Interruptprozedur int28

Parameter:keine
Funktion:Der Interrupt 28h wird immer dann aufgerufen, wenn DOS gerade nicht aktiv ist. Da dies meist nach einem Funktionsaufruf der Fall ist, kann dieser Interrupt dazu benutzt werden, um festzustellen, wann der vom TSR oder von DOS ausgeführte Befehl beendet ist und somit die nötigen Variablen wieder zurückgesetzt werden können, die einen vorigen Neuaufruf durch die Maus verhindert hatten.
Im sicher zu gehen, daß bereits wieder Eingaben vorgenommen werden können, wird geprüft, ob sich links vom Cursor irgendwo das Zeichen „>“ befindet, was als Indikator für das Prompt und somit der Eingabebereitschaft von DOS steht. Um dieses Zeichen zu erkennen wird der Bildspeicher ausgelesen. Zum Schluß wird der eigentliche Interrupt 28h aufegerufen.
Anwendung:Die beschriebene Funktionsweise wird dann durchgeführt, wenn zuvor die Prozedur „action“ aufgerufen wurde und sich so die Variablen „mouseon“ auf false und „active“ auf true stehen. Ist das nicht der Fall wird lediglich der Originalinterrupt aufgerufen.
Verweise:Interrupts (1.Kapitel)
Prozedur action (2.Kapitel)


Interruptprozedur int9

Parameter:keine
Funktion:Der Interrupt 9h ist der Tastaturinterrupt, der bei jeder Aktivität der Tastatur aufgerufen wird. In der neuen ISR wird nun abgefragt, ob die RETURN-Taste gedrückt wurde. Ist dies der Fall, wird das Programm deaktiviert, indem man vorgibt, daß Programm sei bereits aktiv (active:=true). Nachdem das DOS-Prompt wieder erschienen ist, wird das TSR wieder über den Interrupt 28h in Bereitschaft versetzt.
Anwendung:Wird von DOS bei Tastatureingaben aktivert und nicht gesondert vom Programm aufgerufen.
Verweise:Interrupts (1.Kapitel)
Interruptprozedur int28(2.Kapitel)


Prozedur instid

Parameter:n(string)
Funktion:Schreibt eine Programmkennung (n) in den Speicher an eine Segmentgrenze.
Anwendung:Bei Aufruf des Programmes wird im Speicher nach der Kennung gesucht, um festzustellen, ob das Programm bereits installiert ist. Ist dies nicht der Fall so wird diese Prozedur aufgerufen und die Kennung installiert.
Verweise:Prozedur findit (2.Kapitel)
Hauptprogramm (2.Kapitel)
Anmerkung:Diese Prozedur wurde wegen ihrer Kürze und der einfach zu verstehenden Syntax aus dem Buch „Effektives Programmieren mit Turbo-Pascal“ (=>Quellenverzeichnis) übernommen.


Prozedur findid

Parameter:n(string)
Funktion:Sucht die Programmkennung (n) im Speicher.
Anwendung:Bei Aufruf des Programmes wird im Speicher nach der Kennung gesucht, um festzustellen, ob das Programm bereits installiert ist.
Verweise:Prozedur instid (2.Kapitel)
Hauptprogramm (2.Kapitel)
Anmerkung:Diese Prozedur wurde wegen ihrer Kürze und der einfach zu verstehenden Syntax aus dem Buch „Effektives Programmieren mit Turbo-Pascal“ (=>Quellenverzeichnis) übernommen.


Prozedur init

Parameter:keine
Funktion:Setzen der Interrupts 8h, 9h und 28h auf eigene Prozeduren, sowie Installation der Programmkennung und Initialisierung der Maus. Zudem werden die Variablen „i“, „active“ und „mouseon“ mit Startwerten versehen.
Anwendung:Wird beim Programmstart zur Initialisierung aufgerufen.
Verweise :Hauptprogramm (2.Kapitel)
Interrupts (1.Kapitel)


2.3 Hauptprogramm

Hier wird zunächst geprüft, ob das TSR bereits installiert ist. Wenn dies nicht der Fall ist, wird die Prozedur „init“ aufgerufen und die Werte des Programmstacks gesichert. Danach wird es speicherresident gemacht.
Ist das Programm schon installiert, wird eine Fehlermeldung ausgegeben.

Zurück

| HOME | NEWS | AWARDS | ABOUT ME | TEXTE | REFERATE | PROJEKTE |
|
MUSIK | CHAT | SPECIAL | LINKS |