Funkamateur 04/88

 

DEB 31 - Ein Zusatzdebugger für den "AC1"

U. ZELLNER

Wer sich viel mit Programmen auf der Maschinenebene befaßt, wird bald die Grenzen des AC1-Monitors nach [1] erkannt haben. Auf Grund dieser Beschränkungen entstand in Abstimmung mit der Computer-Arbeitsgruppe"AC1" diese Programmergänzung.
Dieser Debugger ergänzt und erweitert die Funktionen des "AC1". Da auch auf Programmteile im residenten Teil des Monitors zurückgegriffen wird, ist auf die Übereinstimmung der Versionsnummern zu achten. Die Version 3.1 entspricht der 32-Zeilen-Version des in [2] veröffentlichten Monitors. Auf besonderen Wunsch ist auch eine 16zeilige Version beziehbar.

Hardwarevoraussetzungen

Da der Debugger einen Umfang von etwa 4 KByte (ohne Help) hat, muß also ein entsprechender Zusatz-RAM vorhanden sein. Weiterhin sollte eine entprellte NMI-Taste installiert sein. Für den Betrieb mit "Next" ist das Programm auf Speicher ohne WAIT-Generierung ausgelegt. Falls dies notwendig ist, müssen alle Speicherbereiche, in denen Programme laufen, die gleiche WAIT-Generierung haben. Weiterhin ist in dem in der Tabelle 2 wiedergegebenen Programmteil eine Taktanpassung durchzuführen.
Dies ist mit Hilfe der Zeitkonstante des Reservebytes und der Füllbefehle zu realisieren. Dazu ist die Zeitkonstante auf 11H zu ändern. Ein Testbereich (etwa 20H) ist mit NOP zu füllen. Der PC ist auf das erste Byte einzustellen und ein "Next" durchzuführen. Anhand der zuviel abgearbeiteten Befehle (NOPs) kann jetzt die Einstellung korrigiert werden, da jedes NOP 4 Taktzyklen benötigt.

Software

Das Programm ist relocatibel. Dabei sollte jedoch auf glatte 100H als Ladeadresse geachtet werden, um die richtige Funktion des Reassemblers zu garantieren. Ein integrierter Linker stellt nach dem ersten Programmstart die aktuellen Adressen ein. Danach ist das Programm nicht mehr verschiebbar, da auch der Linker zerstört ist. Dies muß bei der Weitergabe des Programms beachtet werden. Der Kommandoaufruf und die Benutzung der Systemzellen erfo1gt analog zum Monitor. Es werden jedoch einige Systemzellen mehr benötigt. Eine Aufstellung erfolgt am Schluß des Beitrages. Die Interrupttabelle für die CTC befindet sich auf 1880H.

Kommandobeschreibung

Es werden hier nur die geänderten bzw. neuen Kommandos beschrieben. Nachdem der Debugger geladen und mittels "J Ladeadr." gestartet wurde, meldet er sich mit seiner Speicherbelegung und dem Promptsymbol "&". Dieses Symbol darf bei Zeichenketteneingaben nicht verwendet werden. Im Gegensatz zum Monitor ist es nicht mehr möglich, das Promptsymbol mittels Backspace zu löschen.
[Leerzeichen] cr
Das zuvor gegebene Kommando wird mit seinen Argumenten nochmals ausgeführt. Dies bringt bei einigen Kommandos Vorteile.
": [arg1 [arg2 [arg3]]]"
Es können Argumente eingegeben werden. Wenn man anstelle der Argumente einen weiteren Doppelpunkt (& : :) eingibt, kommen die gerade gültigen Argumente zur Anzeige.
"B [adr]"
Mit diesem Kommando können Haltepunkte eingegeben werden. Für "adr" kommen nur RAM-Adressen als Haltepunkt in Frage. Nach der Aktivierung wird auf diese Adresse ein RST 30 (F7H) eingetragen. Es ist eine Eingabe bis zu 255 Haltepunkten möglich. Falls man keine Adresse oder die Adresse 0 angegeben bat, erfolgt die Anzeige der Haltepunkte mit den dazugehörigen Adreßinhalten. Weiterhin werden die Argumente so vorgeladen, daß sich mittels S: Name die Breaktabelle auf Kassette auslagern läßt. Dies kann für spätere Testläufe eines Programmes günstig sein. Allerdings muß dann zu jenem Zeitpunkt der Debugger auf die gleiche Adresse geladen werden.
"b [adr]"
Hiermit kann man die Haltepunkte löschen. Wenn eine Adresse angegeben wird, löscht der Befehl nur den entsprechenden Haltepunkt.
"c aadr [eadr opt]]"
Der Befehl führt eine CRC-Berechnung nach [3] durch.
"D aadr [eadr [opt]]"
Mit diesem Kommando können Speicherbereiche angezeigt und beschrieben werden. Dabei bedeutet aaaa die Anfangsadresse, eeee die Endadresse und opt mögliche Optionen. Als Optionen kommen
A - Anzeige Hex und Zeichensatz,
B - Anzeige Hex und Prüfbyte nach [3]
keine Opt.- Anzeige Hex und ASCII
in Frage. Nach der kompletten Anzeige gibt das Programm noch den CRC-Wert über die vorgegebene Länge aus. Der Dump wird jedoch immer über ganze 16 Byte angezeigt. Das bedeutet bei der Option mit Prüfbyte, daß das letzte Prüfbyte ebenfalls über die gesamte Zeile berechnet wird. Dies ist bei der nachfolgenden Kontrolle von Speichereingaben von Bedeutung. Die anschließend folgende Berechnung des CRC-Wertes erfolgt jedoch nur über den angegebenen Bereich. Falls bei der Anzeige mehr als eine Bildschirmfläche benötigt wird, stoppt das Programm nach 31 Zeilen und gibt ein "+" aus. Die Fortsetzung der Ausgabe erfolgt mit "cr". Dies gilt für alle Ausgaben, die mehr als eine Bildschirmfläche ausmachen. Wird als Argument zu D nur die Anfangsadresse angegeben, ist der Modus für Speicherbeschreiben eingeschaltet. Es werden die Adresse, der Speicherinhalt als Hex-Zahl und, wenn möglich, die Interpretation als ASCII angezeigt. Darauf folgt das Promptsymbol "&". Die Eingabe erfolgt analog zum Monitor. Jedoch sind folgende Ergänzungen eingearbeitet.
' --> Es folgt eine Zeichenkette (sie muß mit "cr" beendet werden).
^ --> Eine Adresse zurück
Nach Beendigung der Eingabe mittels "." kann über ein nochmaliges "cr" der Anzeigemodus mit Prüfbyteausgabe aufgerufen werden. Dabei kommt der Bereich von erster Eingabeadresse bis zu der Adresse vor dem Abbruch zur Anzeige. Hierbei kann es - wie oben erwähnt - zu Abweichungen des letzten Prüfbytes kommen.
"E adr"
Es wird ein Anwenderprogramm ab einer bestimmten Adresse angesprungen. Dabei aktiviert man die gesetzten Prüfpunkte.
"G"
Das Programm setzt sich ab Anwender-PC fort. Es werden ebenfalls alle Haltepunkte aktiviert. Das Programm läßt sich auch von einem Haltepunkt aus fortsetzen. Ein "cr" bewirkt eine Wiederholung des Go-Kommandos.
"I"
Alle Register der Anwender-CPU werden auf 0 gesetzt. Der Anwender-SP wird auf RAM.Ende + 1 gesetzt.
"J adr"
Wie E, jedoch ohne Haltepunktaktivierung.
"N [anz]"
Es erfolgt ein Schrittbetrieb. Dabei kann man die Anzahl der Schritte angeben. Nach jedem Schritt erfolgt eine Registeranzeige. Bei erneutem "cr" werden wieder die vorgegebenen Schritte durchgeführt.
"R reg"
Mit diesem Kommando lassen sich Register ebenso wie im Monitor anzeigen und beschreiben. Zusätzlich können auch Einzelregister und mit "& Ff" (f für ein Flag) auch die Flags des Vorder- und Hintergrundes beschrieben werden. Der Hintergrund ist durch ein nachgesetztes Hochkomma gekennzeichnet.
z.B. & R FH' - es kann das Hintergrundflag H beschrieben werden & R B - es wird B im Vordergrund beschrieben.
Die Registeranzeige ist geändert. Es werden die Anzahl der gesetzten Haltepunkte angezeigt und der Befehl, auf den der PC zeigt, reassembliert. Weiterhin kommen die Inhalte der Speicherzellen, auf die die Doppelregister BC, DE, HL, IX, IY und SP weisen, zur Anzeige.
"@ aadr [eadr [ofs]]"
Es werden ab der Anfangsadresse (aadr) bis zur Endadresse (eadr) die Befehle mit einem Offset (ofs) reassembliert. Dabei werden nur die definierten Befehle dargestellt. Die nichtdefinierten Befehle oder Daten erscheinen als ???
"?[K]"
Über dieses Kommando ist eine Helpausgabe möglich. Falls ein Kommandobuchstabe angegeben wird, bezieht sich das Help auf dieses Kommando.

Weitere Besonderheiten

Mittels einer entprellten NMI-Taste läßt sich jedes Programm - also auch der Monitor unterbrechen. Es wird dann-sofort in die Registeranzeige gesprungen und die zum Unterbrechungszeitpunkt gültige Registerbelegung zur Anzeige gebracht.
Noch einige Worte zu NEXT und GO. Da dieser Betrieb mittels Interrupt realisiert ist, muß man einige Einschränkungen beachten:
- Es darf der Interruptmodus 2 nicht verlassen werden.
- Es wird zwar bei einem "Next"-Kommando ein DI ignoriert, falls dieses jedoch von einem "Break" gegeben wurde, ist der "Next"-Betrieb bis zur nächsten Freigabe (EI) gesperrt.
- Es dürfen keine weiteren Interrupts von peripheren Schaltkreisen ausgelöst werden.
- Die Interrupttabelle ab 1880H darf nicht verändert werden und der Kanal 0 der CTC bleibt dem Debugger vorbehalten.
Weiterhin muß die Hardware exakt arbeiten, da zur lnterruptgewinnung die Rechnertakte gezählt werden.

Nutzbare Routinen

Nach dem Linkvorgang wird ab Ladeadresse ein Sprungverteiler aufgebaut. Dieser hat folgendes Aussehen:
Lad. adr.
+0 jp debug ; Sprung zum Debugger
+3 jp reas ; Sprung zum Reassembler
+6 jp inline ; Sprung zur Eingabe
+9 jp nextI ; Sprung zum Schrittb.
+ 12 jp crcent ; Sprung zur CRC-Ber.
Reassembler (reas)
Der Reassembler nach [4] wurde dem AC1 angepaßt. Schnittstellen:
aktadr - aktuelle Adresse
ofsadr - Adreßoffset
tmemn - Tabulator für Mnemonik
tkom - Tabulator für Kommentar
In diesen Zellen müssen die Werte übergeben werden. Der Reassembler übergibt in aktadr die Anfangsadresse des nächsten Befehls.
Zeicheneingabe (inline)
Es wird ab Kursorposition folgende Zeichenkette ausgegeben: "&"
Die eingegebenen Zeichen werden als Echo weiterverarbeitet. Ein Backspace ist nur bis zu Beginn der Eingabe möglich. Es werden b, c und e zerstört. Es kann in (prompt) ein anderes Promptsymbol übergeben werden.
Output: bc - Anzahl der eingegebenen Zeichen
e - letztes Zeichen von der Tastatur
Der Kursor steht, bedingt durch den Abbruch, auf dem nächsten Zeilenanfang.
next1
Hiermit ist es möglich, ein bestimmtes Programm nach Abarbeitung eines Befehls anzuspringen. Es befindet sich in der gleichen Ebene wie der Aufruf.
Input: hl - Adresse des nachfolgenden Programms
CRC-Berechnung(crcent)
Es kann der CRC-Wert über einen Bereich berechnet werden.
Input: arg1 - Anfangsadresse
arg2 - Endadresse
Output: Ausgabe auf Schirm ab Kursorposition
Die Programme reas, inline und crcent müssen mittels "CALL" aufgerufen werden. Beim Aufruf von "next1" richtet sich die Art des Aufrufs nach dem Nachfolgeprogramm.

Literatur

[1] Heyder, F.: Funkamateure entwickeln Amateurcomputer "AC1",
FUNKAMATEUR 33/34/35 (1983/84/85) Beitragsfolge
[2] Heyder, F.: Erweiterungen für den Amateurcomputer "AC1",
FUNKAMATEUR 35 (1986) H.1, S.46 und H.6, S.306
[3] Heyder, F.: Falsche Bytes - schnell gefunden.
FUNKAMATEUR 35 (1986), H.11, S.565
[4] Maudrich, G.: Disassembler für U-880-Systeme,
rfe 31 (1982) H.7

213 KByte 212 KByte 212 KByte
Listing Teil 1 Listing Teil 2 Listing Teil 3

213 KByte 209 KByte 217 KByte
Listing Teil 4 Listing Teil 5 Listing Teil 6

25 KByte 272 KByte 38 KByte
Listing Teil 7 Tabelle 1 Tabelle 2