PDP-8 octal printing

Zahlen ausgeben

Die PDP-8/I bzw. PiDP-8/I hat ein elegantes Front Panel, das Interaktionen mit dem Programmierer ermöglicht. Für die Ausgabe auf dem Terminal benötigen wir aber bald eine Routine, welche uns Werte im Oktalen Zahlensystem ausgibt. Ich habe mich an eine Implementierung gewagt und vergleiche meinen Ansatz mit der Version aus dem “Commonly Used Utility Routines” (siehe vt100.net) Dokument von 1971.

Algorithmus

Schauen wir uns dazu die Zahl 5316 (Oktal) an:

| 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|  1    0   1 | 0   1   1 | 0   0   1 | 1   1   0 |
|       5     |     3     |     1     |     6     |

Daraus können wir einen einfachen Algorithmus formulieren:

  1. Auszugebendes Bit-Tripel auf niederwertigste Bit Positionen schieben
  2. ASCII “0” addieren
  3. Zeichen ausgeben
  4. schon alle durch? dann Ende
  5. weiter zu 1

Meine Version: pr8

Code und Kommentare sind hoffentlich selbst erklärend… 🙂

pr8n,   0 / number to print
pr8,    0 / return addr
DCA pr8n  / preserve number
TAD pr8n  / L abc xxx xxx xxx
RTL       / b cxx xxx xxx xxa
RTL       / x xxx xxx xxx abc
AND K7    / keep lowest 3 Bit
TAD K60   / add ASCII '0'
JMS putc  / print it

Analog dazu habe ich die drei übrigen Bit-Tripel mit Schiebeoperationen in Position gebracht und ausgegeben.

Mein Code belegt 28 Worte (sowie 2 weitere Worte für die Konstanten K7 und K60 sowie die Variable pr8n).

Octal Memory Dump: TOCT

Vor 50 Jahren haben kluge Köpfe eine elegante und kürzere Version verfasst und im Handbuch Commonly Used Utility Routines im Kapitel 5 veröffentlicht. Die TOCT Routine sieht so aus:

TOCT, 0
CLL RAL     /ROTATE ADDRESS 1 LEFT
DCA WORD
TAD M4      /SET NUMBER OF DIGITS PER WORD
DCA NDX
LP03, TAD WORD
RTL
RAL
DCA WORD
TAD WORD
AND C7      /MASK BITS 9-11
TAD C260    /ADD 260 FOR OUTPUT
JMS TCHAR   /OUTPUT DIGIT
ISZ NDX     /DONE FOUR?
JMP LP03    /NO. PICK UP ANOTHER DIGIT
JMP I TOCT  /YES. RETURN

Diese Routine ist mit 16 Worten viel kürzer, selbst unter Berücksichtigung 5 weiterer Worte für Variablen und Konstanten.

Fazit

Das Elegante an der über 50 Jahre alten Routine ist unter anderem darin begründet, dass die TCHAR Routine das Link Bit nicht anfasst. So können alle 4 Bit-Tripel durch wiederholtes Schieben in Position gebracht und ausgegeben werden.

Meine putc entspricht ziemlich genau der TCHAR Routine und fasst das Link Bit ebenfalls nicht an; ich habe als “defensiver” Programmierer aber nicht darauf gesetzt, dass dies immer so bleibt und deshalb eine Implementierung mit Schleife verworfen, da das Speichern und wieder Herstellen des Link Bit zusätzliche Komplexität birgt.

Hier werde ich eine Entscheidung treffen und festlegen, wie meine putc zurück kehrt in Bezug auf AC und L. Zur Zeit habe ich das nicht definiert und gehe davon aus, dass AC und L beliebige Werte haben können.