ZSID

Ein wichtiges Hilfsmittel bei der Entwicklung von Assemblerprogrammen ist ein Debugger. Der Standard-Debugger unter CP/M 2.x war der DDT (Dynamic-Debugging Tool). Unter CP/M 3.x gab es eine überarbeitete Version, den SID (Symbolic Instruction Debugger). Inoffiziell fand sich vom SID auch eine Version mit Z80-Mnemoics — der ZSID (Z80-SID).
Für den JOYCE gab es hier aber das Problem mit einem Interrupt-Vektor, so dass ich den Original-ZSID disassembliert habe. Aus dem Quellcode habe ich dann einige Fehler des Programms entfernt und einige Änderungen vorgenommen.

Neue Kommandos sind:
KommandoAktion
BSuche nach einer Byte- oder Zeichenkette
OAuswahl einer anderen Bank als TPA Bank 1
QBeenden des Debuggers (statt Ende mit ^C)

Angeregt durch den Disassembler DASM kann das Modul für die Befehle L (Liste des Assemblercodes) und A (Assemblierung) entweder für die 8080 oder die Z80 gewählt werden.

Die Debugger sind — genau wie die zu untersuchenden Programme — .COM Dateien, d.h. sie werden ebenfalls ab 0100H in den Speicher geladen. Nach dem Laden des Debug-Programms muss dieses über ein Ladeprogramm den Platz ab 0100H freimachen, sich also selber verschieben.

Programmunterbrechungen werden typischerweise über Breakpoints gemacht, beim 8080 bzw. Z80 sind dies meist RST-Befehle. Und genau hier gab es einen Konflikt mit dem JOYCE: Dieser benutzte den Interrupt Modus 1, welcher die Adresse 038H als Einsprungadresse verwendete. Der Breakpoint des ZSID ist der RST 7 — das ist ebenfalls die Einsprungadresse 0038h!

Eine Anleitung zum Erstellen eines neuen ZSID findet sich hier.

Hier die Quelldateien:
Originale Quellen
SID und damit ZSID erlauben den Gebrauch zweier Dienstprogramme, die zusätzlich geladen werden können:
  1. HIST.UTL erstellt ein Histogramm (Balkendiagramm), das die relative Häufigkeit von ausgeführtem Code innerhalb ausgesuchter Programmsegmente des Testprogramms anzeigt. Das Dienstprogramm HIST erlaubt die Überwachung der Stellen mit dem am häufigsten ausgeführten Code.
  2. TRACE.UTL stellt eine Ablaufverfolgung der Anweisungen her, die zu einem bestimmten Breakpoint im Testprogramm führen. Es können die Adressen von bis zu 256 Anweisungen zwischen den Passpoints in der Betriebsart U und T erfasst werden.
Hier die Quelldateien:
Zurück zu den Disassembler-Aktivitäten