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?
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.