| HOME | NEWS | AWARDS | ABOUT ME | TEXTE | REFERATE | PROJEKTE |
| MUSIK
| CHAT
| SPECIAL | LINKS |
{$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.
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.
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
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)
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.
| HOME | NEWS | AWARDS | ABOUT ME | TEXTE | REFERATE | PROJEKTE |
| MUSIK
| CHAT
| SPECIAL | LINKS |