Disassembler DASM und REZ
Copyright (C) Werner Cirsovius, 1989


Diese Programme sind ausgelegt, um Binärdateien umzuwandeln in Quell texte (Typ .MAC beim DASM, .ASM beim REZ), die dann mit einem Z80 Assembler (DASM) oder 8080 Assembler (REZ) wieder zu lauffähigen Kode gewandelt werden können. Mit anderen Worten, ist eine .COM Datei vorhanden, die z.B. modifiziert werden soll, von der jedoch der Quelltext fehlt, dann sind dies genau die richtigen Programme. Während bei Arbeiten mit REZ die CP/M PLUS Assembler MAC oder RMAC genügen, benötigt man zum Arbeiten mit DASM einen Z80 Assembler, also z.B. den M80 von MICROSOFT oder ZMAC aus dem PD Tool.

Da die Regeln zum Arbeiten mit beiden Programmen gleich sind, wird hier als Beispiel DASM erläutert. Bei Abweichungen wird dies gesondert angedeutet. Allgemein gilt, daß REZ älter und weniger komfortabel ist als DASM.
(Im Anhang sind einige Änderungen angegeben, die sich speziell auf eine verbesserten Version von DASM beziehen.)

Nach dem Aufruf DASM folgt zunächst eine Meldung, danach befindet sich DASM im Befehlsmodus. Mit H kann man sich eine Kurzform der Anleitung auf dem Bildschirm ausgeben lassen.

Wie ist nun die Arbeitsweise von DASM?
Aus der zu bearbeitenden ,COM Datei werden zunächst drei weitere Dateien erzeugt:

-.SYM :Diese Datei besteht aus Informationen über Labels
-.CTL :Diese Datei besteht aus Informationen über Programmcode oder Konstanten
-.DOC :Diese Datei enthält optionalen Kommentar

Der Vorteil dieser Zerlegung in einzelne Dateien ist, daß diese sehr kurz sind. Erst am Ende einer Bearbeitung, die durchaus über mehrere Tage gehen kann, wird die endgültige Quelldatei .MAC erzeugt. Diese kann, je nach Umfang der .COM Datei sehr lang sein. Realistisch ist ein Faktor 4 bis 8, d.h. eine .COM Datei mit dem Umfang 8kByte erzeugt dann eine .MAC Datei mit 32-64kByte.

Die erste Sitzung

Nach dem Aufruf von DASM wird zunächst die .COM Datei geladen mit dem Kommando

Rdatei.COM

Danach taucht eine Menge Text über Statistik auf. DASM lädt nämlich die .COM Datei nicht in den Speicher ab 0100H sondern mit einem Versatz, der von der Länge von DASM abhängig ist. Hier sollte man sich die höchste Adresse merken, diese wird im weiteren Verlauf als HA bezeichnet. (Bei der Statistik Ausgabe, durch das Kommando ?, ist dies die .COM End Adresse -1, bei REZ ist das die Endadresse bei der Angabe PRGM). Nach dem Einlesen der Datei sollte zunächst nach vorhandenen ASCII Textstellen, danach dann nach Labels gesucht werden.
Es werden nun die folgenden Kommandos eingegeben;

QA100,HA
QB100,HA

Je nach Länge der .COM Datei kann die Ausführung dieser Kommandos dauern!
Q schaltet hier die Ausgabe auf den Bildschirm ab, die Ausgabe wäre bei den beiden Kommandos eher störend.
A sucht im angegeben Bereich - von Startadresse 0100H bis Endadresse HA - nach Kombinationen von druckbaren Zeichen. DASM ist in der Lage, Texte größer als sieben Zeichen fast immer zu finden,
B sucht, im angegebenen Bereich, wie bei A, nach Labels. D.h. bei Sprungbefehlen und Unterprogrammaufrufen wird anstelle der Adresse ein Label eingesetzt. Das gilt natürlich dann auch für die Adresse selber. Das Label hat die Form Lxxxx, wobei xxxx die Adresse in hexadezimaler Form darstellt.
An dieser Stelle soll die erste Sitzung unterbrochen werden. Die Früchte der Arbeit, werden nun gespeichert mit dem Kommando

Sdatei.ALL

Jetzt werden die Dateien .CTL, .SYM und .DOC angelegt, wie auch auf dem Bildschirm zu sehen ist. Dann fragt DASM, ob eine neue .MAC Datei angelegt werden soll, diese Frage ist an dieser Stelle mit N zu beantworten.
DASM wird beendet mit Ctrl-C, was der STOP Taste auf dem JOYCE entspricht.

Die folgenden Sitzungen

Nach Aufruf von DASM werden nun alle Dateien geladen, entweder einzeln mit

Rdatei.COM
Rdatei.CTL
Rdatei.SYM
Rdatei.DOC

oder gemeinsam mit

Rdatei.ALL

Um alle Dateien zu laden, kann DASM (nicht REZ) auch aufgerufen werden mit der Zeile DASM datei.
Sollte beim letzten Kommando eine Datei nicht gefunden werden, so wird dies auf dem Bildschirm angezeigt.
Die Arbeit wird sich jetzt auf das Lesbarmachen des Quelltextes richten. Mit dem Kommando

Ladr

kann man sich nun den disassemblierten Text auf dem Bildschirm anschauen.
Dies Kommando kann abgewandelt werden mit

Lvon,bisAnzeige ab Adresse "von" bis Adresse "bis"
L,bisAnzeige ab laufender Adresse bis zu "bis"
LAnzeige der nächsten Adressen

Das Kommando

L=nn

ändert, die Anzahl Zeilen, wenn nur L eingegeben wird. Der voreiligestellte Wert liegt bei 20 Zeilen.
Zur Beachtung :"nn" ist eine Hexzahl! - Also für 20 Zeilen gilt die Hexzahl 14
Das Kommando

L=nn,adr

entspricht der Kombination von

L=nn
Ladr

Das schon erwähnte Kommando A erlaubt ebenfalls ein Listing, jedoch ohne Textstellen.
Auch ein Hex-Dump ist möglich, dieser wird aufgerufen mit

Daddr
Dvon,bis
D,bis
D
D=nn

Die letzte Anweisung setzt die Anzahl Bytes für den Dump. Sie ist ebenfalls als Hexzahl einzugeben. Der voreingestellte Wert, beträgt 128, also 80H.
Die nächste Arbeit wird darin bestehen, die etwas aussageschwachen Labels des Typs Lxxxx umzuwandeln in aussagekräftige. Bei der Arbeit mit CP/M ist die Adresse 0005H ja gerade die BDOS Sprungadresse, um diese Adresse in ein Label zu wandeln wird das Kommando

E5,.BDOS

eingegeben. Zu beachten ist hierbei der Punkt vor dem symbolischen Namen. Es erfolgt eine Meldung, daß dieses Label gegen L0005 ausgetauscht wurde.
Ebenfalls unter CP/M wird die Adresse 0006H manchmal benötigt, da hier die höchste Speicheradresse, die zur Verfügung steht, abgespeichert ist. Diese Adresse kann nun wie folgt ersetzt werden:

E6,.BDOS+1

Hieran erkennt man eine angenehme Eigenschaft von DASM, daß nämlich nicht für jedes Label Lxxxx auch ein eigenständiges Label benötigt wird. Zu beachten ist aber, daß DASM nicht prüft, ab die Eingabe korrekt ist. DASM akzeptiert auch

E66,.BDOS+1

Dies kann aber zu Schwierigkeiten führen, wenn der Quelltext, assembliert wird.
Für die Labels Lxxxx gilt natürlich das Entsprechende bezüglich der Namensgebung mit dem Kommando E.
Zu erwähnen ist noch, daB auch Symbole in den Kommandos A, D und L erlaubt sind, hier ist allerdings immer ein Punkt vor dem Namen zu verwenden.

Beispiel:

E100,.TPASymbol 'TPA' an Adresse 0100H einsetzen
L100Disassemblieren ab 0100H
L.TPAWie L100

Man kann sich die gesamte Symboltabelle anzeigen lassen mit dem Kommando

DS

oder von einem bestimmten Symbol an mit

DS.symbol

Da die Symbole alphabetisch sortiert werden, gibt das Kommando

DS.X

alle Symbole von X bis Z aus.
Wie auch bei den Kommandos A, D, L kann auch hier die Ausgabe auf den Bildschirm durch Betätigen einer beliebigen Taste angehalten werden. DASM befindet sich dann wieder im Befehlsmodus.
Wenn beim Kommando E einmal nicht die Meldung erscheint, daß ein Symbol Lxxx gelöscht wurde, kann man davon ausgehen, daß an der eingegebenen Adresse kein Symbol steht. Vielleicht hat sich einfach ein Tippfehler eingeschlichen.
Symbole können jedoch gelöscht werden mit dem Kommando

K,symbol

Die Bearbeitung der Symboltabelle ist später in der Datei .SYM zufinden. Nachdem alle Symbole vernünftig umbenannt sind, kann nun die Kontrolltabelle bearbeitet werden. Diese Tabelle sorgt bei den gewohnten Pseudo-Opcodes für Speicherreservierungen. DASM hat einen Teil davon bereits selbst angelegt bei der Ausführung des Befehls A.
Das allgemeine Kommando zum Setzen der Kontrolltabelle lautet:

Cadr, wort

"adr" bezeichent dabei eine beliebige Adresse innerhalb des von der .COM Datei belegten Speichers. "wort" ist dann eine Kontroll Information wie folgt:

BErzeugt den Pseudocode "DB", gefolgt von einem oder mehrerer Zeichen
HErzeugt, den Pseudocode "DB", jedoch sind die Konstanten in Hexformat dargestellt (existiert nicht bei REZ)
WErzeugt den Pseudocode "DW" gefolgt von einer 16 Bit Konstanten
SErzeugt, den Pseudocode "DS", reserviert also Speicher
ISchaltet um auf Maschinencode
EErzeugt den Pseudocode "END", kennzeichnet also das Ende der Datei
KLöscht den Kontrolleintrag an dieser Stelle

Neben dem oben angegebenen Format gibt es noch

CAusgabe der gesamten Kontrolltabelle
CadrAusgabe der Kontrolltabelle ab Adresse "adr"

Wichtig ist die Kontrolltabelle bei der Korrektur von Einträgen, die DASM erstellt hat. Findet man z.B. ab Adresse 035F bis 0467 beim Listen (Kommando L) nur die Anweisung "NOP", so kann man davon ausgehen, daß hier eine Speicherreservierung vorliegt. Die Kontrolleinträge sehen wie folgt aus;

C35F,SDefiniert Bereich ab hier als Reservierung
C467,ISetzt Bereich zurück auf Maschinencode

Die Bearbeitung findet man später in der Datei .CTL.
Die letzte Datei, .DOC, beinhaltet Kommentare. DASM erlaubt die Eingabe allerdings nur eingeschränkt, nämlich pro Adresse nur eine Kommentarzeile. Außerdem steht der Kommentar nicht am Ende sondern jeweils vor einer Zeile. Besser ist da vielleicht die Utility NOTATE, welche jeweils den Kommentar an das Ende einer Zeile anhängt. Diese Utility ist auch als Public Domain Software erhältlich.
Trotzdem soll die Möglichkeit von DASM diesbezüglich erläutert werden. Im Gegensatz zu den bisher erarbeiteten Dateien, .SYM und .CTL, muß DASM bei der Kommentareingabe ein realer Speicherplatz vorgegeben werden.
Über das Kommando

?

holt man sich dazu die Speicherbelegung auf den Bildschirm und wählt die höchste verfügbare Adresse als Startadresse für Kommentare (Bei REZ ist dies die höchste Adresse bei PRGM zuzüglich dem OFFSET). Lautet die Adresse z.B. 3500H, so wird der Start der Kommentartabelle gesetzt mit

U3500

Danach können Kommentare bearbeitet werden mit den Kommandos

;adr,kommEinfügen eines Kommentars "komm" an Adresse "adr"
;adrAnzeigen des Kommentars an Adresse "adr"
;Anzeigen der gesamten Kommentare
;adr,OFFAusschalten der Adresskommentare ab Adresse "adr"
;adr,ONEinschalten der Adresskommentare ab Adresse "adr"

( Der Ausdruck "Adresskommentare" besagt, daß hinter den Labels die Originalhexadresse als Kommentar angezeigt wird. Der Grundzustand ist OFF)

Sind alle Bearbeitungen während dieser Sitzung abgeschlossen, so speicher man alle Dateien mit

Sdatei.ALL

oder aber einzeln mit

Sdatei.CTL
Sdatei.SYM
Sdatei.DOC

DASM fragt dann wieder, ob eine neue .MAC Datei angelegt werden soll, diese Frage ist an dieser Stelle ebenfalls mit N zu beantworten

Sind möglichst alle Labels Lxxxx umgewande lt in "sinnvolle" Labels, alle Felder deklariert als konstante Bytes (DB), Worte (DW) oder Reservierungen (DS), so kann der letzte Akt beginnen.

Die letzte Sitzung

In dieser Sitzung wird nun endlich eine Quelldatei .MAC erzeugt. Wie erwähnt, ist eine gründliche Vorarbeit unerläßlich, um den Quellkode möglichst optimal zu gestalten. Zunächst werden alle Dateien wieder eingelesen mit

Rdatei.ALL

Nach einer vielleicht letzten Bearbeitung muß auf jeden Fall der Befehl

Sdatei.ALL

eingegeben werden. Im Gegensatz zu vorher ist alerdings nun die Frage von DASM, ob eine .MAC Datei erstellt werden soll, mit Y zu beantworten. Dies bedeutet momentan nur, daß eine Datei datei.MAC erzeugt wird und alle Daten, die auf dem Bildschirm erscheinen nun auch in diese Datei geschrieben werden,.

Zuerst müssen alle Labels, die außerhalb des Programms liegen (wie z.B. BDOS), als Konstante (EQU) dem System mitgeteilt werden. Dies geschieht mit dem Befehl

QP100,HA

wobei HA wieder die höchste .COM Adresse ist (s.o.). Will man den Vorspann auch auf den Bildschirm ausgeben, so ist das Q wegzulassen. Vor den Konstanten wird als Vorspann noch in die Datei geschrieben

.Z80Umschalten M80 auf Z80 Kode
ASEGAbsolutes Segment setzen
ORG 0100HProgramm startet ab 0100H

Falls die Datei später in mehrere Teile zerlegt werden sollte, um dann mit dem Linker L80 gebunden zu werden, sind die Anweisungen ASEG und ORG 0100H mit dem Editor zu entfernen.
Beim REZ Programm besteht der Vorspann nur aus 'ORG 0100H', jedoch kann auch dieser Vorspann auf Wunsch weggelassen werden (bei Verwendung von RMAC empfiehlt sich das).
Nach dem Vorpann wird dann der Quelltext eingefügt mit dem schon bekannten Kommando

QL100,HA

Das Q schaltet wieder die Ausgabe auf den Bildschirm ab.
Ist vorher das Ende mit "Cadr,E" definiert worden, so wird jetzt die Datei .MAC geschlossen und DASM kann mit Ctrl-C beendet werden. War dies nicht der Fall, so muß die Datei geschlossen werden mit

Z

Abschliessend liegt nun die Datei datei.MAC vor. Diese kann jetzt mit einem Editor modifiziert und anschliessend, bis das Programm "steht", assembliert werden.

Letzte Hinweise

Neben den besprochenen Befehlen verfügt DASM noch über weitere Kommandos, deren Gebrauch allerdings nicht so oft vorkommen dürfte. Diese sind

Fwort,adrSuchen einer 16 Bit Konstanten "wort" ab Adresse "adr". Ausgabe der Adressen, wo "wort" gefunden wurde. Abbruch mit beliebiger Taste.
FwortSuchen von "wort" ab letzter Adresse
FFortsetzung der Suche
OAnzeige des aktuellen Offsets
OadrOffset neu setzen auf Adresse "adr"
XLöschen aller Tabellen und Restart DASM. Dadurch wird der Weg frei für eine neue Arbeit mit DASM
Iadr,offAddiert, den Wert "off" zur Symboltabelle ab Adresse "adr", so daß alle betroffenen Symbole beim Listen mit diesem Offset versehen angezeigt werden (Dieser Befehl existiert nicht bei REZ).

Mit dem Kommando 'Sdatei.MAC' bei DASM bzw. 'Sdatei.ASM' bei REZ kann auch gezielt eine Quelldatei erstellt werden.

REZ ist in der Lage, Z80 Kode zu erkennen. In diesem Falle wird im Quelltext der Hinweis

?Z80?

eingefügt.

Neue DASM Version

Es existiert eine neuere Version von DASM, die sich in einigen Punkten von der beschriebenen Version unterscheidet:
  1. Die Labeldatei erhält anstelle der Extension .SYM die neue Extension .SMB. Dadurch wird das übeschreiben der Labeldatei durch den CP/M Linker LINK verhindert, der als Labeldatei ebenfalls die Extension .SYM verwendet.
  2. DASM kann nicht mehr über Ctrl-C abgebrochen werden. Hierfür muß das neue Kommando # eingegeben werden. Dadurch wird ein irrtümliches Abbrechen von DASM verhindert.
  3. Wurde schon mit einer Datei gearbeitet, so können die Kommandos zum Abspeichern und Einlesen von Dateien vereinfacht werden zu z.B:

    S*.CTL

    Hiermit wird die Kontrolldatei der aktuellen Datei geschrieben. Ob eine aktuelle Datei existiert, wird durch das Kommando ? angezeigt.