# PDP-8

Der PDP-8 (bei Anwendern meist 'die PDP-8') war ein 12-Bit Minirechner aus der Reihe Programmed Data Processor von Digital Equipment Corporation (DEC). Es war der erste kommerziell erfolgreiche Minicomputer mit weit über 50.000 verkauften Exemplaren, Schätzungen gehen sogar von bis zu 300.000 Exemplaren aus bei Berücksichtigung von kompatiblen Nachbauten.
Das zugrunde liegende Design folgt dem des LINC, allerdings mit reduziertem Befehlssatz, der wiederum eine Erweiterung des Befehlssatz der PDP-5 ist. Spätere, ähnliche Maschinen von DEC waren der PDP-12, der modernisierte Nachfolger der PDP-8, und das PDP-14 Industrial Control System.

## Geschichte

Das Urmodell der PDP-8, später informell „Straight-8“ (engl., „straight“ = „astrein, unverfälscht“) genannt, wurde am 22. März 1965 vorgestellt mit einem Verkaufspreis von damals 18.000 US-Dollar, was Mitte 2019 einem Wert von etwa 135.000 Euro entsprach. Im Kern der Maschine arbeitete kein Mikroprozessor, stattdessen war die Zentraleinheit diskret in Diode-Transistor-Logik auf Steckkarten („Flip-Chip“ in der Bezeichnung von DEC) implementiert, die wiederum in einem Gehäuse vom Volumen eines übergroßen Haushalts-Kühlschranks verbaut waren (69⅛″×22¼″×27⅛″, etwa 176cm×57cm×69cm). Es war der erste Computer, der für unter 20.000 US-Dollar verkauft wurde, was ihn schnell zum Verkaufsschlager machte.
Bereits 1966 wurde der Straight-8 die PDP-8/S zur Seite gestellt, die es sowohl in Versionen zum Einbau in ein Rack als auch für den Schreibtisch gab. Die Verwendung einer 1-Bit Arithmetikeinheit (ALU) im PDP-8/S erlaubte es DEC, das Gerät einfacher, kleiner und günstiger zu fertigen und somit als erster Computer überhaupt die Preismarke von 10.000 US-Dollar zu unterschreiten. Zwar war die PDP-8/S aufgrund der einfacheren ALU deutlich langsamer als die Straight-8, ihre Verkaufszahlen waren aber dennoch gut.
Spätere Geräte der Reihe, die PDP-8/I und /L, die PDP-8/E, /F und /M sowie die PDP-8/A, verwendeten dann wieder vollwertig parallele 12-Bit Arithmetikeinheiten, wechselten aber zu günstigeren Transistor-Transistor-Logik (TTL) in integrierten Schaltungen (medium scale integration, MSI). Die meisten heute noch operablen PDP-8 stammen aus dieser Zeit. Darunter wiederum ist die PDP-8/E das verbreitetste Gerät, weil es die größte Anzahl an Speicher- sowie Ein-/ Ausgabegeräten für diesen Gerätetyp gab.
Die letzten kommerziell eingeführten Geräte der PDP-8-Familie kamen als VT78 bzw. DECmate ab 1979 auf den Markt und verwendeten dann CMOS-Mikroprozessoren. Da das Angebot allerdings preislich nicht bestehen konnte, floppten die Geräte. Die Firma Intersil verkaufte die Prozessoren unter der Bezeichnung Intersil 6100 bis 1982, auf Grund der sehr geringen Stromaufnahme der CMOS-Technologie fanden sich Einsatzgebiete in einigen militärisch genutzten Embedded Systems.
Der Chefentwickler und Designer der ersten Generation der PDP-8 war Edson de Castro, welcher später Data General gründete.
Noch funktionsfähige Exemplare der PDP-8 können im Museum „technikum29“ bei Frankfurt am Main und in den Computermuseen der Fakultät Informatik an der Universität Stuttgart sowie der Universität Erlangen-Nürnberg besichtigt werden.

### Bedeutung für die Entwicklung der Rechnerarchitekturen

Die Design-Ziele hinter der PDP-8 waren geringer Preis, einfacher Aufbau, Erweiterbarkeit und solide Konstruktion. Aus heutiger Sicht bedeutend sind hierbei der geringe Preis und die hohen Absatzzahlen – die PDP-8 war damit erstmals attraktiv für neue Kundenkreise und neue Anwendungsfelder.
Die geringe Komplexität des Aufbaus führte jedoch auch zu technischen Nachteilen: Die Programmierung der PDP-8 war umständlich und aufwändig, was sich vor allem aus dem kleinen Befehlssatz ergibt. Da es weder ein eingebautes Betriebssystem noch Bibliotheken gab, nicht einmal für einfache Aufgaben, musste ein wesentlicher Teil an Programmcode darauf verwendet werden, die Maschine selbst zu steuern, und die Implementierung von Geschäftslogik trat dem gegenüber oft in den Hintergrund.
Zum Beispiel gab es keinen eingebauten Befehl um zwei Zahlen zu subtrahieren. Stattdessen musste der Programmierer selbst zuerst das Zweierkomplement des Subtrahenden bestimmen und dann zum Minuenden addieren.
Viele ambitionierte Software-Projekte scheiterten dran, dass der verfügbare Speicher mit 4.096 Wörtern auch aufgrund dieser Umstände nicht ausreichend war oder aber dass der eingeschränkte Befehlssatz zu Software-Design-Einschränkungen führte, die nicht sauber programmatisch lösbar waren. Zum Beispiel führt das Fehlen eines Stacks dazu, dass versehentliche Rekursion zu Programmfehlern führte, die nur schwer aufzuspüren und zu beheben waren.
Da die fortschreitende Weiterentwicklung zu sinkenden Kosten für Prozessoren und Speicher führten, wurde der Aufwand, den ein Programmierer leisten musste, ein zunehmend relevanter Kostenfaktor. Auch deshalb trugen spätere Computersysteme durch größere und funktional mächtigere Befehlssätze dem Rechnung, um die Programmierung der Systeme einfacher und weniger zeitintensiv zu gestalten.
Über die Zeit wurden schließlich die meisten Programme über Compiler oder Reportgeneratoren erzeugt.

## Technische Beschreibung

Register der PDP-8 :
| $_0$ | $_1$ | $_2$ | $_3$ | $_4$ | $_5$ | $_6$ | $_7$ | $_8$ | $_9$ | $^1$$_0$ | $^1$$_1$ | (bit position) |
| Hauptregister |||||||||||||
| AC | AC | AC | AC | AC | AC | AC | AC | AC | AC | AC | AC | ACcumulator |
| | | | | | | DF | DF | DF | | | | Data Field |
| Programmzähler |||||||||||||
| PC | PC | PC | PC | PC | PC | PC | PC | PC | PC | PC | PC | Program Counter |
| | | | | | | IF | IF | IF | | | | Instruction Field |
| Status Flags |||||||||||||
| L | | | | | | | | | | | | Link register |
| Interne Register (nicht programmierbar) |||||||||||||
| MBR | MBR | MBR | MBR | MBR | MBR | MBR | MBR | MBR | MBR | MBR | MBR | Memory-buffer register |
| MAR | MAR | MAR | MAR | MAR | MAR | MAR | MAR | MAR | MAR | MAR | MAR | Memory-address register |
Technisch handelte es sich bei der PDP-8 um einen 12-Bit-Rechner. Der Hauptspeicher bestand aus 4.096 12-Bit-Wörtern in Form eines Core Stack aus einzelnen Miniatur-Ringmagneten (Kernspeicher), wobei ein Ring genau ein Bit aufnahm. Ein Wort konnte zwei 6-Bit-Zeichen speichern. Waren die ersten PDP-8 noch in DTL-Logik verwirklicht, wurde bei späteren Versionen die Architektur in der schnelleren TTL-Logik implementiert. Mangels Bootloader wurde der Rechner zunächst über eine Maschinenkonsole mit Schaltern und LEDs («Blinkenlights») bedient. Lief die Anwendungssoftware ursprünglich direkt auf der Hardware, wurde später hauptsächlich das Betriebssystem OS/8, seltener RTS-8, verwendet. Programmiert wurde in Assembler, BASIC, Fortran, Focal und Dibol. Abgespeichert wurde die Software anfangs vornehmlich auf Lochstreifen, später auch auf Kleinmagnetbändern, 8-Zoll-Disketten und Festplatten.

## Versionen der PDP-8

Die Gesamtzahl verkaufter Geräte aus der PDP-8 Familie wird auf über 300.000 Exemplare geschätzt. Dabei wurden etwa 3.000 bis 1970, 30.000 bis 1976 verkauft.
Über den Produktionszeitraum wurde die PDP-8 in verschiedenen Fassungen und Konfigurationen verkauft, wobei die PDP-8/E als das prägende Modell betrachtet werden kann.
Von DEC wurden in der erweiterten PDP-8-Familie diese Geräte gebaut:
Modelle aus der PDP-8 Familie :
| Modell | Zeitraum | Anzahl | Preis | Technologie | Gewicht | Anmerkungen |
| PDP-5 | 1963–1965 | 116 | ? | DTL | | Vorläufer mit einem Subset an Instruktionen |
| PDP-8 | 1965–1969 | 1.450 | $ 15.000,00 | DTL | 113 kg | |
| LINC-8 | 1966–1969 | 142 | $ 38.000,00 | DTL | | Kombination einer LINC und einer PDP-8 in einem Gehäuse. |
| PDP-8/S | 1966–1970 | 1.024 | $ 10.000,00 | DTL | 38 kg | Serielle Implementation, daher vergleichsweise langsam. |
| PDP-8/I | 1968–1971 | 3.698 | $ 12.800,00 | TTL | 110 kg | 55 ⨉ 76 ⨉ 181 cm. 32 kB RAM. |
| PDP-8/L | 1968–1971 | 3.902 | $ 8.500,00 | TTL | 36 kg | Verkleinerte Version der PDP-8/I |
| PDP-12 | 1969–1973 (?) | 755 | $ 27.900,00 | TTL | | Nachfolger der LINC-8 |
| PDP-8/E | 1970–1978 | > 10.000 (?) | $ 6.500,00 | TTL MSI Omnibus | 41 kg | |
| PDP-8/F | 1972–1978 (?) | > 10.000 (?) | < $ 5.000,00 | TTL MSI Omnibus | 26 kg | Basiert auf der PDP-8/E CPU |
| PDP-8/M | 1972–1978 (?) | > 10.000 (?) | < $ 5.000,00 | TTL MSI Omnibus | 26 kg | OEM-Version der PDP-8/F |
| PDP-8/A | 1975–1984 (?) | > 10.000 (?) | $ 1.317,00 | TTL LSI Omnibus | | |
| VT78 | 1978–1980 | | $ 7.995,00 | Intersil 6100 | | kompatible Arbeitsplatz-Workstation |
| DECmate | 1980–1984 | | ? | Harris 6120 | | kompatible Arbeitsplatz-Workstation |
| DECmate II | 1982–1986 | | $ 1.435,00 | Harris 6120 | | kompatible Arbeitsplatz-Workstation |
| DECmate III | 1984–1990 | | $ 2.695,00 | Harris 6120 | | kompatible Arbeitsplatz-Workstation |
| DECmate III+ | 1985–1990 | | ? | Harris 6120 | | kompatible Arbeitsplatz-Workstation |

### Klone und Nachbauten

Im Ostblock entstanden schnell Nachbauten der PDP-Serie von Computern, die ungarischen TPA1001, TPA1001/i, TPA/l, TPA1/128H, TPA/s und TPA Quadro waren dort anfänglich auf Basis von Transistoren, später auch auf Basis der Intersil-6100-Prozessoren entwickelte Klone.
Sowjetische Nachbauten waren die Electronica-100, Electronica-100I und Saratov-2-Geräte. Ferner gab es auf Kuba die CID-201, von der mehr als 200 Exemplare gebaut wurden, sowie im damaligen Jugoslawien die Electrotechnica-100I (die eventuell technisch identisch zur sowjetischen Electronica-100I war).
Teilweise kompatible Geräte im Westen waren die SPEAR u-LINC 100 und SPEAR u-LINC 300, die DCC-112 und DCC-112H, sowie die von Intersil gebauten Intercept I und Intercept Jr.

### Emulationen

Basierend darauf, dass heutzutage selbst kleinste Rechner eine größere Leistungsfähigkeit haben als die originalen PDP-8-Modelle, gibt es eine Vielzahl von Emulatoren. Ein JAVA-Emulator in Form eines einzelnen JAR-Paketes visualisiert das gesamte Bediensystem (inkl. Frontpanel) sowie die Hardware. Bei dem am weitesten verbreiteten Emulator dürfte es sich um SIMH handeln; dieser Emulator ist in der Lage, eine Vielzahl historischer CPUs zu emulieren. Ein verkleinertes, jedoch authentisches Frontpanel der PDP-8 mit entsprechender Logik in Kombination mit einem Emulator, der auf einem Raspberry Pi läuft, lässt das ursprüngliche System wieder auferstehen.

## Befehlssatz

Befehlscodierung der PDP-8 :
| $_0$ | $_1$ | $_2$ | $_3$ | $_4$ | $_5$ | $_6$ | $_7$ | $_8$ | $_9$ | $^1$$_0$ | $^1$$_1$ | (bit position) |
| Basisbefehle |||||||||||||
| OP | OP | OP | | | | | | | | | | OPeration |
| | | | I | | | | | | | | | Instruction-relative |
| | | | | Z | | | | | | | | Zero-Page |
| | | | | | OFF | OFF | OFF | OFF | OFF | OFF | OFF | OFFset |
| IOT: Ein-/Ausgabe, Transfer |||||||||||||
| 1 | 1 | 0 | | | | | | | | | | 6: Code für IOT |
| | | | Device | Device | Device | Device | Device | Device | | | | Gerätecode |
| | | | | | | | | | Func. | Func. | Func. | Function |
| OPR1: Operationsgruppe 1 |||||||||||||
| 1 | 1 | 1 | 0 | | | | | | | | | OPeRate Gruppe 1 |
| | | | | Instruction | Instruction | Instruction | Instruction | Instruction | Instruction | Instruction | Instruction | Instruction |
| OPR2O: Operationsgruppe 2/OR |||||||||||||
| 1 | 1 | 1 | 1 | | | | | 1 | | | 0 | OPeRate 2/Or |
| | | | | Ins | Ins | Ins | Ins | | Ins | Ins | | Instruction |
| OPR2A: Operationsgruppe 2/AND |||||||||||||
| 1 | 1 | 1 | 1 | | | | | 1 | | | 0 | OPeRate 2/And |
| | | | | Ins | Ins | Ins | Ins | | Ins | Ins | | Instruction |
| OPR3: Operationsgruppe 3 |||||||||||||
| 1 | 1 | 1 | 1 | | | | | | | | 1 | OPeRate Gruppe 3 |
| | | | | Ins | Ins | Ins | Ins | | | | | Instruction |
| | | | | | | | | Code | Code | Code | | Code |
Der Befehlssatz der PDP-8 codiert Befehl und Operand in stets genau ein 12-Bit Wort, dabei ist es für einige Operationen sogar möglich, bei identischem Operanden mehrere Befehle in ein einziges 12-Bit Wort zu kodieren.
Die drei höchsten Bits des 12-Bit Worts (mit den Bits 0 bis 2 bezeichnet) sind der Befehlscode. Bei den sechs Operationen, die sich auf den Speicher beziehen, geben die Bits 5 bis 11 eine 7-Bit-Adresse an. Wenn Bit 4 gesetzt ist, bedeutet dies, dass die Adresse mit den 5 höchsten Bits des Programmzählerregisters (PC) vervollständigt werden soll, was bedeutet, dass sich die adressierte Stelle innerhalb der gleichen 128 Wörter wie der Befehl befindet. Wenn Bit 4 nicht gesetzt ist, werden Nullen verwendet, so dass die adressierte Stelle innerhalb der ersten 128 Wörter des Speichers liegt. Bit 3 spezifiziert "indirection"; wenn es gesetzt ist, verweist die so erhaltene Adresse auf einen 12-Bit-Wert im Speicher, der die tatsächliche effektive Adresse für die Anweisung angibt. Dadurch können die Operanden an einer beliebigen Stelle im Speicher liegen, was jedoch dann ein zusätzliches 12-Bit Wort kostet. Der JMP-Befehl operiert nicht mit einem Speicherwort, es sei denn, es ist "indirection" angegeben, nutzt aber die gleichen Bitfelder.

### Programmbeispiele

Die folgenden Beispiele zeigen Code in PDP-8 Assemblersprache, wie er mit dem PAL-III Assembler übersetzt werden könnte.

#### Vergleich zweier Zahlen

Wie im oben stehenden Abschnitt zur Bedeutung der PDP-8 erwähnt, war ein Programmierer für die PDP-8 sehr viel damit beschäftigt, einfache Dinge aufwändig selbst zu programmieren. Diese 6 Instruktionen sind notwendig, um zwei Zahlen in den Speicherstellen ORD1 und ORD2 zu vergleichen:

#### Zeichenausgabe

Eine mögliche Fassung von „Hello, world!“ mit Ausgabe auf dem Drucker, wobei hier zur Illustration der Befehlskodierung die Ausgabe des PAL Assemblers gezeigt wird, also Speicherstelle (Spalte 1) und Speicherinhalt (Spalte 2), der eigentliche Programmcode steht ab Spalte 3:
Die Ausgabe von Speicheradresse und -inhalt ist oktal dargestellt, sodass diese leicht über die Schalter am Bedienfeld direkt in die Speicherstellen eingegeben werden können. Für oben stehendes Programm würde zunächst den Wert 0010 einstellen (oktal, also 000-000-00I-000 mit 0 bzw. I als Aus bzw. Ein) und dann mittels Load Add als aktive Adresse setzen. Anschließend würde der Wert 0207 (000-0I0-000-III) eingestellt und mittels Dep im Speicher deponiert. Der Addresszähler springt dabei automatisch eine Stelle weiter (und zeigt dann auf 0011). Als nächstes wird 0200 (000-0I0-000-000) eingestellt und mit Load Add geladen, dann 7300 (III-0II-000-000) mit Dep deponiert, anschließend ist der Adresszeiger korrekt und die nächste Instruktion kann sofort mit 1410 (00I-I00-001-000) deponiert werden usf.
Am Ende wird erneut Adresse 0200 eingestellt und mit Start gestartet. Das Programm gibt „Hello, world!“ auf dem Drucker aus und die Maschine geht in den Haltezustand.