Assembler für die PDP-8

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 schreibenstosse 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).

Source Code: mul-pdp8.pal

Ü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