Das Intel zu Zilog - Übersetzungsprojekt
Will man sein CP/M anpassen, um beispielsweise neue Hardware einzubinden, so kommt man um Assemblerquellen nicht herum. Nur dumm, wenn man wie ich auf
seiner Z80 vor allem die Zilog - Mnemonics gelernt hat und bei MOV und MVI, bei LDAX und STAX immer durcheinander gerät ...
Weg mit der Sprachbarriere! hieß es im Mai '85 in einem Artikel der Zeitschrift c't. Ein Turbo - Pascal - Programm mit dem sinnvollen Namen SCT (Source - Code - Translator) übersetzt 8080 - Quellcode in Z80 - Mnemonics. Auch das XIZI - Paket, bestehend aus den Programmen XIZ zum Hin- und XZI zum Her-Übersetzen leistet vergleichbare Dienste.
Doch zurück zu unserem BIOS. Im PROF schafft eine reinrassige Z80, weshalb conitec sich beim Entwickeln keine falschen Beschränkungen auferlegt hat und kräftig Gebrauch von Nicht - 8080 - Befehlen macht. Dazu wird dem MAC- oder RMAC- Assembler mittels Z80.LIB einfach das erweiterte Vokabular beigebracht und fortan produzieren sie den gewünschten Code ...
... nur SCT und XIZ beißen sich daran die Zähne aus, denn sie kennen ja die Z80.LIB (noch) nicht. Nun, was jetzt kommt, ist nur konsequent und deshalb setzt hier das I 2 Z - Projekt an!
Stand der Dinge (11. Juli 2009):
- erster Versuch, die erweiterten Z80 - Befehle in SCT zu integrieren : ZSCT als CP/M - Programm, (TP 3.0, 11/85)
- Wechsel auf PC : ZSCT als DOS - Programm, unter W2k auch in der "Eingabeaufforderung" (TP 5.5, 01/07)
- Problem mit ZSCT : spaltentreue Kommentare bzw. Tabulatorbehandlung, übersetzung noch nicht vollständig (Veröffentlichung, wenn Copyright geklärt)
- Experimente mit XIZ unter YAZE-AG und nachträglich manuelle Ergänzung mit PSPad unter Verwendung regulärer Ausdrücke (06/07)
- erste Resultate mit viel Handarbeit : Monitor-Source V1.7 für den PROF (s. Downloads)
- Hinweis auf lex
im CP/M-Forum (Dank an tt, 07/07/07) (Forumslink nicht mehr existent - 2026-02-23)
- Version 1.0 des "I2Z-Translators" ist fertig. Er hat zwar noch ein paar Macken und Unzulänglichkeiten, aber man kann schon recht vernünftig mit ihm arbeiten. Das Paket ist 36k groß und ist nun (11/07/09) im Download-Bereich abrufbar. Bitte die Hinweise beachten, sonst gibt es Enttäuschungen!
I2Z: Einzelheiten
Wie vergleicht man das Ergebnis?
Nach der erfolgreichen übersetzung (das heißt, wenn der Assembler nicht mehr meckert) muss man noch überprüfen, ob das Resultat dem Original gleicht - und zwar bis auf's Bit!
Auch hierzu möchte ich meine Erfahrungen gerne weitergeben: Man nehme die HEX-Dateien und schneide mit einem guten Editor die Datenspalten heraus. Das ist nötig, wenn die Formate der beiden Dateien unterschiedlich sind. MAC/RMAC schreiben beispielsweise 16 bytes pro Zeile, Z80ASM und ASide dagegen 32. Wenn man die Adressen und Prüfsummen beseitigt und ausserdem immer zwei kurze MAC/RMAC-Zeilen in eine lange verwandelt hat, kann man (wiederum mit einem guten Editor) einen Textvergleich durchführen.
Doch oh Schreck: So viele Abweichungen! - Alles halb so schlimm. Im Code sind viele Sprungadressen versteckt, und wenn irgendwo nur ein byte dazwischen kommt oder fehlt, sind alle nachfolgenden Sprünge verschoben.
Wie findet man nun die Stelle, an der der Versatz hineingekommen ist?
Auch hier hilft ein Trick: Im Listing (LST- oder PRN-Datei) stehen die Adressen mit den OpCodes zusammen. Man nehme also
alle Zeilen, die den RET-Befehl enthalten (kommt relativ oft vor), und vergleiche sie paarweise. An der Stelle mit der ersten
Abweichung in der Liste schaut man am Besten mal nach ...
Noch ein paar Hinweise
Zum Suchen der RET-Befehle im Listing ist in PSPad der reguläre Ausdruck C9(\s+)RET geeignet. Man wähle dann
die Such-Liste, die man mit Klick links neben der Liste auf das kleine Symbol (Seite mit umgeknickter Ecke) als neues
Dokument öffnen kann. Genauso verfahre man mit dem zweiten Listing.
Die Spaltenauswahl aktiviert man in PSPad beim Mausziehen mit gehaltener ALT-Taste.
Natürlich schreit soviel Handarbeit nach automatisierenden Lösungen, womit ich hier eine Einladung zum
Mitmachen aussprechen will.
I2Z: offene Aufgaben
Was bleibt noch zu tun?
Weitere lex-Skripte, um
- Tabulatoren zu Leerzeichen zu erweitern (auf'm PC! - macht PIP unter CP/M ja bereits ...),
- Leerzeichen zu Tabulatoren wieder zusammenzufassen (na, da hilft PIP auch nicht weiter, oder?) und
- Assembler-Quelltexte spaltentreu umzuformatieren.
Automatische Lösungen für
- den Vergleich der Hex-Dateien (direkte Ausgabe der Abweichstelle) und
- den Vergleich der REL-Dateien, also der Binärdateien
Das ist bereits erledigt (s. download-Bereich):
- lex - Skript für die Z80-Befehle inkl. den Erweiterungen aus der Z80.LIB (11.7.2009)
- Einbindung der Assembler in PSPad (11.7.2009)
|