Maschinenprogramme stürzen bei Fehlern meist ohne Hinweis auf den Fehlerort ab. Mit Trace lassen sich Maschinenprogramme Befehl für Befehl abarbeiten. Es werden dabei die momentanen Registerwerte (Programmcounter, X-, Y-Register, Akku, Stackpointer und Flags) angezeigt. Diese Werte lassen sich ohne weiteres ändern. Als Dreingabe erscheinen auch noch der Zustand des User-Ports und des Datenrichtungsregisters B auf dem Bildschirm.
Das Programm läßt eine Ausführung von Maschinenprogrammen im Einzelschrittmodus zu. Dabei wird das Programm wirklich ausgeführt also nicht simuliert. Es bietet Einzelschritt, langsam und schnellen Trace. Alle Register werden angezeigt und können verändert werden. Zusätzlich wird der Befehl disassembliert. Laden und Abspeichern des Programms geschieht je nach Assemblerversion des Lesers. Das Assemblerprogramm erlaubt ein freies Verschieben von Trace durch Änderung in Zeile 100: *=$XXXX. Der Startwert für PC (Programmcounter) kann in Zeile 270 frei gewählt werden.
Programmfunktionen
Nach dem SYS-Befehl befindet man sich im Tracemodus. Es sind nur die Tasten F1 bis F7 und X für Exit aktiv. Folgende Register werden angezeigt:
PC = Programmcounter.
SP = Stackpointer.
YR = Y-Register.
XR = X-Register.
AC = Akkumulator.
Prozessorstatusflags.
User-Port mit Datenrichtungsregister. Entsprechende Eingangsleitungen sind revers dargestellt.
Es werden 1 bis 3 Hexbytes angezeigt, die verändert werden können, dann wird der Befehl disassembliert dargestellt. Trace wartet jetzt auf einen Tastendruck. Der Programmcounter zeigt am Anfang auf Hex C000.
Folgende Tastenfunktionen stehen zur Verfügung:
Taste F7 = Einzelschritt. Pro Tastendruck wird ein Befehl des Testprogramms ausgeführt (genauer gesagt beim Loslassen von F1). Danach werden wieder die Register angezeigt und disassembliert.
Tast F5 = Slow Trace. Solange diese Taste gedrückt ist, wird das Testprogramm Befehl für Befehl abgearbeitet, die Register angezeigt und pro Befehl noch zusätzlich um zirka 65 ms verzögert.
Taste F3 = Tast Trace. Wie F5 jedoch ohne Verzögerung.
Taste F1 = Set Register, Editmodus. Durch Drücken von F1 kommen Sie in den Editmodus.
Beschreibung Editmodus
Die erste Ziffer des Programmcounters wird zur Kennzeichnung des Cursororts revers dargestellt. Sie können jetzt alle angezeigten Werte überschreiben. Der Stackpointer und die Userport-Anzeige können zwar überschrieben werden, dies hat aber keinen Einfluß auf die Werte. Eine Veränderung des SP würde meist zum Absturz des Systems führen, da die CPU nach dem Interrupt nicht mehr die korrekten Rücksprungadressen auf dem Stack vorfindet. Die Cursor-Right-Taste bewegt den Cursor nach rechts, die Cursor-Up-Taste nach links. Neben diesen Steuertasten sind nur die Tasten A bis F, 0 bis 9 für die Hexziffern, der »Pfeil nach oben«, um ein Flag zu setzen, und das »Minuszeichen«, um ein Flag zu löschen, sinnvoll. Die Spacetaste ist auch erlaubt.
Die DELETE-Taste funktioniert nicht. Entsprechen die Änderungen in der PC-Zeile Ihren Wünschen, dann drücken Sie (RETURN) und können die disassemblierte Zeile editieren. Hier sind je nach Befehlslänge 1 bis 3 Hexbytes am Anfang der Zeile veränderbar, das heißt Sie können die Operanden oder auch den Opcode selbst noch vor der Ausführung verändern, was zum Austesten von Programmen sehr praktisch ist. Verlassen können Sie die disassemblierte Zeile wieder mit (RETURN). Sie befinden sich jetzt wieder im Tracemodus, das heißt die Tasten F1, F3, F5, F7 und X sind wieder aktiv.
Den Tracemodus können Sie durch Drücken der X-Taste verlassen, der Computer ist jetzt im Basic-Editmodus. Trace kann mit SYS 49152 wieder gestartet werden, wobei hier der Disassembler immer aktiviert ist. Starten Sie mit SYS 49160, dann ist der Disassembler nur beim Editieren an, Trace ist dann etwas schneller. Setzen Sie Trace nicht auf sich selbst an.
Funktionsweise
Siehe hierzu auch Assemblersourcelisting. Zuerst schalte ich den normalen Tastaturinterrupt über Timer A aus und benütze den Timer B in CIA 1 für meine Interruptroutine. Timer A läuft zwar weiter, aber sendet keine IRQ mehr. Dann setze ich den IRQ-Vektor auf Trace. Trace initialisiert beim Start den Stack und beginnt dann mit der eigentlichen Einzelschrittroutine. Diese Routine dient als neue Interruptroutine, da der IRQ-Vektor auf Trace geändert wurde. Der Interrupt wird aber nicht mehr alle 1/60 Sekunde durch den Timer A ausgelöst, sondern durch Timer B und zwar alle 25 Mikrosekunden nach Start des Timers.
In dieser Zeit kann der Prozessor das Ende der normalen IRQ-Routine durchlaufen (Register vom Stack holen). Jetzt bleibt aber nur mehr Zeit, um einen Befehl des Testprogramms abzuarbeiten, da Timer B ja schon in genau einer Mikrosekunde erneut einen IRQ sendet. Der Prozessor legt nach diesem einen Befehl alle Register auf den Stack und verzweigt entsprechend dem IRQ-Vektor wieder auf Trace. Für genauere Information siehe Listing. Innerhalb der Traceroutine wird ein IRQ nicht akzeptiert, da sich sonst das Programm immer selbst unterbrechen würde. Trace läßt sich also nur durch einen NMI unterbrechen.
Beispiel:
SYS 49152 = Trace starten. Disassembler an.
Taste F1 drücken = Editmodus wählen.
PC auf $AF08 setzen. Diese Systemroutine gibt »Syntax Error« aus. Sie können zum Spaß auch die Register verändern, benützen Sie auch die Cursorsteuertasten.
RETURN drücken = Edit für disassemblierte Zeile. Hier können Sie die Hexbytes editieren. Eine Änderung hätte aber keinen Sinn, da wir ja eine ROM-Routine tracen. Drücken Sie nur (RETURN), und Sie gelangen wieder in den Tracemodus.
F7 drücken = Einen Befehl ab PC ausführen.
F5 drücken = Trace. Anzeige läuft. Flags werden in schneller Folge geändert. Die disassemblierte Zeile ändert sich sehr schnell. Halten Sie die Taste gedrückt, nach ein paar Sekunden sehen Sie schön langsam Buchstabe für Buchstabe »Syntax Error« erscheinen. Befindet sich der Cursor zufällig gerade am unteren Bildschirmrand und ist der Bildschirm vollgeschrieben, dann kann man schön verfolgen, wie die Scrollroutine arbeitet, der Bildschirminhalt wird Zeile für Zeile nach oben geschoben, um Platz für die Meldung zu machen.