In diesem Artikel geht es um Assembler im Sinne von Programmen, die Source Code in Binärcode (Maschinensprache) übersetzen. Zur Assembler-Sprache siehe meinen neueren Artikel.
Möglichkeiten und Grenzen von simh
Für kleine Tests bietet simh die Möglichkeit, Daten und Programme direkt im Speicher abzulegen. Das Deposit-Kommando (d, id) verarbeitet neben Oktalzahlen auch Mnemonics.
Etwas komplexere Programme überlässt man besser einem Assembler. Das hat folgende Vorteile:
- Fehler lassen sich einfach korrigieren
- Der Code lässt sich dokumentieren
- Code ist leichter wieder verwendbar
- Code lässt sich teilen im Sinne von Open Source Software
- Der Programmstart lässt sich anpassen
- Symbole erleichtern die Verwendung von Variablen und Sprungzielen (Unterprogrammen, Schleifen)
- Der Assembler kümmert sich um die Adressierung über Seitengrenzen hinweg
Nachteile:
- Nach jeder Anpassung ist wieder ein Übersetzungslauf nötig
- Ohne Cross-Assembler ist das Erstellen von Programmen auf der PDP-8 direkt selbst für Kommandozeilen-Fetischisten mühselig. Die Editoren für die PDP-8 sind wenig leistungsfähig. vi(m)/emacs sind deutlich komformtabler.
Assembler auf der PDP-8
DEC hat verschiedene Assembler für die PDP-8 veröffentlicht. PAL8, SABR und RLAP/RALR sind Übersetzer, die unter OS/8 laufen. Im OS/8 handbook (Erste Ausgabe 1974) werden diese Assembler, ihre Möglichkeiten und der Ablauf von der Programm-Erstellung bis zum lauffähigen Binärprogramm ausführlich beschrieben.
Ein weiterer Assembler von DEC ist MACRO-8, zu dem es ein ausführliches Handbuch gibt (“PDP-8 Programming Manual Macro 8”, DEC-08-CMAA-D).
Cross-Assembler
Bequemer ist die Entwicklung von Programmen für die PDP-8, wenn man seine gewohnte Umgebung nutzen kann. Ich verwende vim um Programme zu schreiben, stosse dann die Übersetzung des Programms an (macro8x) und lade den Binärcode direkt in simh.
macro8x
Beim Durchstöbern des simh Pakets habe ich mehr zufällig entdeckt, dass auch ein Cross-Assembler namens macro8x mit geliefert wird.
This is a cross-assembler to for PDP/8 assembly language programs. It will produce an output file in bin format, rim format, and using the appropriate pseudo-ops, a combination of rim and bin formats. A listing file is always produced and with an optional symbol table and/or a symbol cross-reference (concordance)
Ansonsten ist die Dokumentation leider äusserst knapp.
macro8x scheint weitgehend kompatibel mit dem MACRO-8 Assembler von DEC zu sein. Das bedeutet insbesondere:
- Ein Stern referenziert den Program Counter bzw. legt die aktuelle Adresse fest.
- Kommentare werden mit einem Schrägstrich (slash) eingeleitet
- Labels sind Ausdrücke, die mit einem Komma enden
Für Experimente habe ich ein kurzes Programm geschrieben welches eine Multiplikation ausführt auf einer Maschine ohne Arithmetik-Einheit (wir können also nur Addieren und Schieben).
Übersetzen und Tests
Der Source Code wird mit macro8x übersetzt:
macro8x -d mul-pdp8.pal
Der Assembler generiert 2 Dateien:
- .lst assembly listing (output)
- .bin assembly output in DEC’s bin format (output)
Es bietet sich an, macro8x mit der Option -d auszuführen, das fügt dem Listing die Symboltabelle an.
Ein Blick ins Listing zeigt, dass das Programm ab 0020 im SPeicher liegt, und der Einstiegspunkt (Mnemonic CLA) liegt auf 0025.
Programm in simh analysieren
In simh können wir BIN Files direkt mit dem load Kommando in den Speicher laden und dann mit dem go Kommando anspringen.
PDP-8 simulator V3.8-1 sim> load mul-pdp8.bin sim> ex -m 25-57 25: CLA 26: TAD 20 27: CLL 30: RAR ... sim> go 25 HALT instruction, PC: 00047 (CLA CLL) sim> ex L,AC,20-24 L: 0 AC: 0000 20: 0000 21: 0050 22: 0000 23: 0067 24: 0000