Funkamateur 04/88 |
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.
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.
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.
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.
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.
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.
[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 |