PAL8: Strings, Text und Encodings

Alles Text oder was?!

Auf der PDP-8 werden Strings als “gepackte 6-Bit-Werte” gespeichert. Ein 12 Bit Wort bildet dabei 2 Zeichen ab; jweils 6 Bit für ein Zeichen. Wie sind diese Zeichen definiert?

Zeichentabelle aus der PAL-8 Dokumentation
Zeichentabelle aus der PAL-8 Dokumentation

Weder die 6- noch die 8-Bit-Codierung entsprechen dem heute gebräuchlichen (7-Bit-)ASCII.

Analyse der Zeichencodes

Um diese Zeichen auf einem ASCII Terminal (oder Drucker ;)) abzubilden müssen wir die Zeichen passend “umwandeln”. Die Analyse ergibt folgende Anhaltspunkte:

A..Z und einzelne Sonderzeichen

Oktal 01..37: Addiere 100
Sowie:

weitere Sonderzeichen und die Ziffern 0..9

Oktal 40..77: passt, ist ASCII

Damit können wir folgenden Algorithmus formulieren:

  • Maskiere den AC mit 0077 (untere 6 Bits)
  • Subtrahiere 0040 (Addiere -0040)
  • Wenn AC negativ ist, Addiere 0100
  • Addiere die vorher subtrahierten 0040
  • Gib Zeichen aus

Zeichen konvertieren und ausgeben

/ constants for ascii conversion
KM40,   -40 
K40,    0040
K77,    0077
K100,   0100

/ write to TTY (6-bit to ASCII)
put6c,  0           / return addr
        AND K77     / keep lower 6 bits
        CLL         / clear link before adding
        TAD KM40    / add -40
        SPA         / Skip next on positive Accu
        TAD K100    / 40..77, add 100 
        TAD K40     / restore original value
        TSF         / wait for teletype
        JMP .-1     /  until ready
        TLS         / print
        JMP I put6c / return to caller

Aufgerufen wird diese Routine beispielsweise so:

CLA CLL    / Accu und Link löschen
TAD ["A    / Zeichen A im 6-bit-Format
JMS put6c  / Ausgabe aufs ASCII TTY

Strings definieren

Mit PAL-8 bzw. MARCO-8 werden gepackte Strings mit der Pseudo-Anweisung TEXT (oder TEXTZ) angelegt:

/ 6-bit packed string, zero terminated
hi, TEXT "HELLO, WORLD!"

Ein Blick ins Listing zeigt wie die Zeichen abgelegt werden:

00035 1005 hi, TEXT "HELLO, WORLD!"
00036 1414
00037 1754
00040 4027
00041 1722
00042 1404
00043 4100

Im PAL-8 Assembler muss für 0-terminierte Strings die Anweisung TEXTX verwendet werden; macro8x aus dem simh Paket kennt nur TEXT, welches immer 0-terminierte Strings abbildet.