# PDP-8

Le PDP-8 a été le premier mini-ordinateur à succès de la société Digital Equipment Corporation, avec 50 000 exemplaires produits entre son lancement le 22 mars 1965 et son arrêt de fabrication en 1984 (PDP-8/A). Il a parfois été qualifié de Ford T de l'informatique en raison de sa très grande simplicité architecturale, permettant de réduire les coûts, ainsi qu'en étant le premier ordinateur abordable (moins de $10 000 USD de l'époque pour le PDP-8/S) produit en masse.

## Vue d'ensemble

Le tout premier modèle de PDP-8, parfois désigné sous le nom de « Straight-8 », a été introduit le 22 mars 1965 au prix de 18 500 $ (soit environ 178 900 $ en 2023), significativement moins que les ordinateurs de l'époque coûtant généralement plusieurs centaines de milliers de dollars. Il utilisait une logique discrète à diode-transistor (DTL), intégrée sur des cartes Flip-Chip du même constructeur, et se présentait sous la forme d'une machine de la taille d’un petit réfrigérateur.
Le PDP-8 fut le premier ordinateur vendu à moins de 20 000 $, en faisant le modèle d’ordinateur le plus populaire de l’époque. Le Straight-8 a été remplacé en 1966 par le PDP-8/S, proposé en versions de bureau et montable en rack. Grâce à une unité arithmétique et logique (UAL) série à un bit plutôt que 12 bits parallèle, le PDP-8/S était plus compact et moins coûteux, bien que considérablement plus lent que le PDP-8 d'origine. Un PDP-8/S de base était vendu à moins de 10 000 $, devenant ainsi le premier ordinateur à franchir ce seuil.
Les systèmes ultérieurs (PDP-8/I et /L, PDP-8/E, /F et /M, ainsi que le PDP-8/A) ont bénéficié d'une implémentation parallèle et en logique MSI à transistor-transistor (TTL), bien moins coûteuse. La plupart des PDP-8 encore existants proviennent de cette période. Le PDP-8/E était particulièrement courant et apprécié en raison de la diversité des périphériques d'entrée/sortie disponibles pour ce modèle. Les derniers modèles commerciaux de PDP-8, introduits en 1979 et appelés « CMOS-8 », étaient basés sur des microprocesseurs CMOS, cependant, ces modèles n’étaient pas compétitifs en termes de prix et furent des échecs commerciaux. Intersil a néanmoins vendu les circuits intégrés associés jusqu'en 1982 sous le nom de famille Intersil 6100. Grâce à leur technologie CMOS, ces modèles nécessitaient peu d'énergie et ont été utilisés dans certains systèmes militaires embarqués.
L’ingénieur en chef ayant conçu la version initiale du PDP-8 était Edson de Castro, qui a ensuite fondé Data General.

## Particularités techniques

Le PDP-8 alliait une extrême simplicité architecturale à une extensibilité remarquable, doublé d'une conception soigneusement optimisée pour minimiser le nombre de composants électroniques et ainsi réduire les coûts. Son importance historique réside principalement dans le fait que son faible coût et son volume de production élevé ont rendu l'informatique accessible à de nombreux nouveaux clients et à une grande variété d’usages.
Cette simplicité architecturale avait néanmoins un coût : elle rendait la programmation laborieuse, particulièrement concernant la gestion de la mémoire et des interruptions. En raison d'un jeu d'instruction extrêmement minimaliste - seulement huit instructions de base - et d'une absence de registres généraux (seulement un accumulateur), une grande partie du code devait être consacrée à la gestion de trivialités bas-niveau plutôt qu’à la focalisation sur les algorithmes. Par exemple, soustraire un nombre nécessitait de calculer son complément à deux avant de l’ajouter ; écrire un saut conditionnel impliquait de coder un saut conditionnel inversé autour du saut souhaité. Certains projets de programmation plus ambitieux ne tenaient pas dans la mémoire disponible (6 Ko par défaut) ou faisaient face à des limites techniques insolubles. Par exemple, une récursion accidentelle d’une sous-routine engendrait des problèmes difficiles à attribuer à la sous-routine concernée, rendant le débogage ardu.
Au fur et à mesure que les progrès techniques ont réduit les coûts des puces et de la mémoire, le temps consacré au développement est devenu plus problématique que le coût du matériel, rendant l'approche du PDP-8 caduque. A l'opposé du PDP-8 conçu pour la plus grande simplicité architecturale possible, les ordinateurs CISC ultérieurs mettront l’accent sur la facilité de programmation en adoptant des jeux d’instructions toujours plus sophistiqués et intuitifs.
De manière intéressante, la quasi-totalité du code machine est aujourd'hui généré par des compilateurs, déchargeant les programmeurs des trivialités. L'architecture RISC (Reduced Instruction Set Computer) est ainsi revenue à la philosophie du PDP-8, privilégiant un jeu d’instructions simple et l’exécution de plusieurs actions par cycle d’instruction pour maximiser la vitesse d’exécution, bien que les jeux d’instruction des ordinateurs modernes soient beaucoup plus complexes.

## Caractéristiques

La taille de mot du PDP-8 était de 12 bits, car le codage des caractères chez DEC utilisait du Sixbit sur 6 bits plutôt que de l'ASCII sur 8 bits. Bon nombre des mini-ordinateurs commercialisés par DEC employaient donc un multiple de 6 en largeur de mot, soit 12 bits pour le PDP-8, 18 bits pour les PDP 1, 5, 7, 9 et 15, ou encore 36 bits pour le PDP-10. De plus, le PDP-8 se destinait notamment parmi ses cas d'usage à l'instrumentation de laboratoire (par intégration OEM) et ces 12 bits correspondaient à la résolution maximale des capteurs disponibles à l'époque. Le coût de la mémoire étant alors élevé, ce choix constituait un optimum économique puisque ni les télécommunications, ni le traitement de texte n'imposaient alors l'octet. Celui-ci ne sera utilisé chez DEC que bien plus tard, avec le PDP-11.
Sa mémoire standard était de 4096 mots de 12 bits (maximum adressable avec ces 12 bits), possédant un temps de cycle de 1,5 µs. Une extension mémoire permettait d'augmenter la mémoire à huit pages de 4 096 mots de 12 bits en faisant appel à un registre de page. C'était une mémoire à tores de ferrite, conservant ses données lors d'une coupure d'alimentation.
Il utilisait comme unité de pupitrage un télétype ASR-33 (en) et comportait un disque dur fixe complété de bandes magnétiques adressantes DECtapes. Il était cependant possible de l'alimenter en programmes avec le lecteur de ruban perforé (papier) de l'ASR33.
La taille de mot de 12 bits du PDP-8 avait fait choisir pour cette machine l'usage généralisé de l'octal plutôt que de l'hexadécimal. Le contenu d'un mot aussi bien que les adresses étaient représentés par quatre chiffres en octal.

## Programmation

Les premiers systèmes PDP-8 étaient livrés sans logiciel préinstallé ; chaque fois que le PDP-8 était mis sous tension, l'utilisateur devait entrer manuellement les instructions à l'aide d'une série de 12 interrupteurs à bascule en façade dénommés "clés". En général, ces instructions constituaient un chargeur d'amorçage ("bootloader") permettant de charger un autre programme depuis le lecteur de ruban perforé. Le développement de programmes pouvait ensuite se poursuivre en employant le lecteur de ruban perforé. Cet amorceur primitif était nommé RIM Loader par DEC. Un autre amorceur, le BIN Loader, plus avancé, était capable de charger des programmes binaires complexes avec vérification des erreurs et une meilleure gestion des adresses mémoire. Le BIN Loader se trouvait généralement sur ruban perforé et devait donc d'abord être chargé par le RIM Loader.
Des versions sur ruban perforé de plusieurs langages de programmation étaient disponibles, notamment l'interpréteur FOCAL de DEC et un compilateur et environnement d'exécution FORTRAN pour une mémoire de 4 Ko.
Vers la fin de l'ère du PDP-8, des systèmes d'exploitation comme OS/8 et COS-310 permettaient d'utiliser un éditeur en ligne de commande et un système de développement avec compilateur, prenant en charge des langages tels que l'assembleur PAL-III, FORTRAN, BASIC et DIBOL.
Des systèmes d'exploitation temps réel (RTOS) relativement modernes et avancés, ainsi que des systèmes multitâches préemptifs multi-utilisateurs, étaient disponibles : un système temps réel (RTS-8), des systèmes commerciaux multi-utilisateurs (COS-300 et COS-310), ainsi qu'un système dédié de traitement de texte monoposte (WPS-8).
Un système de partage de temps, TSS-8, était également disponible. TSS-8 permettait à plusieurs utilisateurs de se connecter au système via des terminaux à 110 bauds pour éditer, compiler et déboguer des programmes. Les langages pris en charge incluaient une version spéciale de BASIC, un sous-ensemble de FORTRAN similaire à FORTRAN-1 (sans sous-routines ni fonctions définies par l'utilisateur), un sous-ensemble d'ALGOL, FOCAL et un assembleur appelé PAL-D.
Une quantité considérable de logiciels offerts par des utilisateurs du PDP-8 était disponible via DECUS (Digital Equipment Corporation User Society), souvent accompagnés du code source complet et de la documentation.

## Jeu d'instructions

Chaque mot d'instruction du PDP-8 est constitué de 12 bits dont les trois bits de poids fort (étiquetés bits 0 à 2) constituent le code d'opération. Puis, pour les six opérations faisant référence à la mémoire, les bits 5 à 11 fournissent une adresse sur 7 bits. Le bit 4, s'il est activé, indique que l'adresse doit être complétée en utilisant les cinq bits de poids fort du compteur de programme (PC), ce qui implique que l'adresse cible se trouve dans les 128 mots suivants à partir de l'instruction. Si le bit 4 est désactivé, des zéros sont utilisés, plaçant ainsi l'adresse cible dans les 128 premiers mots de la mémoire.
Le bit 3 spécifie l'indirection ; s'il est activé, l'adresse obtenue jusqu'à présent pointe vers une valeur de 12 bits en mémoire, représentant l'adresse effective réelle pour l'instruction. De cette manière, les opérandes peuvent se trouver n'importe où en mémoire, au prix d'un mot supplémentaire.
L'instruction JMP n'opère pas directement sur une adresse mémoire, sauf si l'indirection est spécifiée, mais elle utilise les mêmes champs de bits.
Décomposition des douze bits d'un mot d'instruction :
| 0 | | 2 | 3 | 4 | 5 | | | | | | 11 |
| Opération | Opération | Opération | I | Z | Adresse (7 bits) | Adresse (7 bits) | Adresse (7 bits) | Adresse (7 bits) | Adresse (7 bits) | Adresse (7 bits) | Adresse (7 bits) |

### Pages mémoire

Cette utilisation des douze bits d'un mot d'instruction divise la mémoire de 4 096 mots en 32 pages de 128 mots ; le bit 4 de l'instruction sélectionne soit la page courante, soit la page 0 (adresses 0000–0177 en octal). Le contenu de la page 0 est donc extrêmement précieux, car les variables placées ici peuvent être adressées directement depuis n'importe laquelle des autres pages.
De plus :
* L'adresse 0000 est le point d'entrée de toute routine du gestionnaire d'interruption.
* Les adresses 0010–0017 sont auto-incrémentées avant toute référence indirecte via elles.
L'assembleur place les valeurs constantes pour les opérations arithmétiques dans la page courante. De même, les sauts et appels de sous-programmes inter-pages utilisent une adresse indirecte dans la page courante.
Sur le PDP-8, il était crucial d'écrire des routines tenant dans une page de 128 mots, ou d'organiser les routines pour minimiser les transitions de page, car les références et sauts en dehors de la page courante nécessitent un mot supplémentaire. Par conséquent, les programmeurs consacraient beaucoup de temps à économiser quelques mots avec ingéniosité, et plaçaient volontairement du code en fin de page pour faciliter une transition gratuite vers la page suivante lorsque le PC (compteur de programme) était incrémenté.

### Instructions de base

* 000 – AND : Effectue un ET logique entre l'opérande mémoire et le registre AC (accumulateur).
* 001 – TAD (Two Complement Add) : Le contenu de l'adresse mémoire (les 7 bits de poids faible du mot d'instruction) est ajouté à l'accumulateur. Le résultat est laissé dans l'accumulateur. Si le résultat entraîne une retenue, le bit "L" est activé.
* 010 – ISZ (Increment and Skip if Zero) : Incrémente l'opérande mémoire et saute l'instruction suivante si le résultat est zéro.
* 011 – DCA (Deposit and Clear Accumulator) : dépose le contenu de l'accumulateur dans l'opérande mémoire et réinitialise l'accumulateur à zéro.
* 100 – JMS (JuMp to Subroutine) : Saut à une sous-routine, en stockant l'adresse de retour dans le premier mot de la sous-routine.
* 101 – JMP (JuMP) : Saut direct.
* 110 – IOT (Input Output Transfer) : Transfert Entrée/Sortie (Input/Output Transfer).
* 111 – OPR (Operation) : Micro-instructions codées (voir ci-dessous).

### Instructions d'entrées-sorties

Le processeur du PDP-8 définissait peu d'instructions de transfert d'entrées-sorties (IOT), mais fournissait une structure générique. La majorité des instructions IOT étaient définies par les périphériques d'E/S. Le mot d'instruction se décomposait alors ainsi :
| 0 | | 2 | 3 | | | | | 8 | 9 | | 11 |
| 110 = IOT | 110 = IOT | 110 = IOT | Périphérique | Périphérique | Périphérique | Périphérique | Périphérique | Périphérique | Fonction E/S | Fonction E/S | Fonction E/S |

#### Périphérique

Les bits 3 à 8 d'une instruction IOT sélectionnent un périphérique d'E/S. Certaines de ces adresses de périphérique étaient normalisées par convention :
* 00 : Géré directement par le processeur, sans être envoyé à un périphérique.
* 01 : Lecteur de ruban perforé haute vitesse.
* 02 : Perforatrice de ruban perforé haute vitesse.
* 03 : Clavier de console (ou tout lecteur de ruban perforé basse vitesse).
* 04 : Imprimante de console (ou toute perforatrice de ruban perforé basse vitesse).
Les instructions pour le périphérique 0 affectent directement le processeur. Par exemple :
* ION (6001) : Active le traitement des interruptions.
* IOFF (6002) : Désactive le traitement des interruptions.

### Opérations microcodées (OPR)

De nombreuses opérations du PDP-8 sont réalisées à l'aide de l'instruction OPR, notamment la plupart des sauts conditionnels. OPR ne référence pas une adresse mémoire ; l'exécution conditionnelle est obtenue en sautant l'instruction suivante, généralement un JMP.
L'instruction OPR est dite "microcodée". Dans le PDP-8, cela ne signifie pas qu'un microcode va chercher et interpréter l'instruction, mais plutôt que chaque bit du mot d'instruction correspond à une action spécifique, permettant au programmeur d'effectuer plusieurs actions en un seul cycle d'instruction en combinant plusieurs bits à la façon d'un microcode. Les assembleurs permettent d'écrire plusieurs mnémoniques d'instruction sur une même ligne ; ils sont ensuite combinés par un OU logique (OR) pour former le mot d'instruction effectif.
De nombreux périphériques d'entrée/sortie (IOT) utilisent également ce principe de micro-instructions codées.
Les actions microcodées s'exécutent dans une séquence bien définie, optimisée pour permettre de combiner les instructions de manière utile.
Les instructions OPR sont regroupées en Groupes. Les bits 3, 8 et 11 déterminent le groupe OPR, ce qui rend impossible la combinaison d'actions provenant de groupes différents.
Un bit commun à tous les groupes est le bit 4 (CLA). S'il est activé, il efface l'accumulateur (AC).

#### Groupe 1

   * 7200 – CLA : Efface l'Accumulator (AC)
   * 7100 – CLL : Efface le bit L (link)
   * 7040 – CMA : Complémente les bits de AC (négation binaire)
   * 7020 – CML : Complémente le bit L
   * 7001 – IAC : Incrémente le couple <L,AC>
   * 7010 – RAR : Rotation droite de <L,AC>
   * 7004 – RAL : Rotation gauche de <L,AC>
   * 7012 – RTR : Rotation droite deux fois
   * 7006 – RTL : Rotation gauche deux fois
   * 7002 – BSW : Échange les deux octets de 6 bits (PDP-8/e et versions ultérieures) Les opérations sont organisées de manière à permettre des combinaisons efficaces. Par exemple :
   * CLA CLL IAC : Efface AC et L, puis incrémente AC, laissant AC = 1.
   * CLA CLL IAC RAL : Efface AC et L, incrémente AC, puis effectue une rotation gauche, laissant AC = 2. La combinaison CMA IAC (abrégée CIA) produit l'inverse arithmétique de AC (négation en complément à deux). Une instruction OPR Groupe 1 sans bits actifs est une instruction NOP (No Operation).

#### Groupe 2 – OR

* 7600 – CLA : Efface AC
* 7500 – SMA : Saute si AC < 0
* 7440 – SZA : Saute si AC = 0
* 7420 – SNL : Saute si L ≠ 0
* 7404 – OSR : Effectue un OU logique entre les interrupteurs du panneau avant et AC
* 7402 – HLT : Arrête le processeur (Halt)
Les bits SMA, SZA, SNL spécifient des conditions de saut. Par exemple :
* SMA SZA (7540) saute si AC ≤ 0.

#### Groupe 2 - AND

* 7410 – SKP : Saute inconditionnellement
* 7610 – CLA : Efface AC
* 7510 – SPA : Saute si AC ≥ 0
* 7450 – SNA : Saute si AC ≠ 0
* 7430 – SZL : Saute si L = 0
Quand le bit 8 est activé, les conditions de saut sont inversées. Par exemple :
* SPA SNA (7550) saute si AC > 0.

#### Groupe 3

Les combinaisons inutilisées du groupe OPR sont définies comme un troisième groupe, principalement pour le registre MQ (Multiplier/Quotient) et les instructions arithmétiques étendues (EAE).
   * 7601 – CLA : Efface AC
   * 7501 – MQA : Combine MQ avec AC (OU logique)
   * 7441 – SCA : Charge le compteur d'étape ("step counter") dans AC
   * 7421 – MQL : Transfère AC → MQ, efface AC
   * 7621 – CAM : Efface à la fois AC et MQ Instructions spéciales :
   * 7403 – SCL : Charge le compteur d'étape
   * 7405 – MUY : Multiplie
   * 7407 – DVI : Divise
   * 7411 – NMI : Normalise
   * 7413 – SHL : Décale à gauche
   * 7415 – ASR : Décale arithmétiquement à droite
   * 7417 – LSR : Décale logiquement à droite

## Modèles

Les modèles suivant furent fabriqués, de 1965 jusqu'au retrait de la gamme en 1984 :
| Modèle | Caractéristiques techniques | Année | Prix (USD) | Unités vendues | Poids |
| PDP-8 | Logique discrète DTL | 1965 | $18 000 | 1450 | 113 kg |
| LINC-8 | Modèle de laboratoire, pouvait faire fonctionner du code LINC et PDP-8 | 1966 | $38 500 | 142 | |
| PDP-8/S | Version bas coût à CPU série plutôt que parallèle | 1966 | $10 000 | 1024 | 38 kg |
| PDP-8/I | Premier PDP-8 à logique intégrée (MSI) TTL | 1968 | $12 800 | 3698 | 110 kg |
| PDP-8/L | Version bas coût du PDP-8/I | 1968 | $8 500 | 3902 | 36 kg |
| PDP-12 | Remplaçant du LINC-8, basé sur un PDP-8/I | 1969 | $27 900 | 755 | |
| PDP-8/E | Cartes plus larges et moins nombreuses pour réduire le prix et améliorer la fiabilité | 1970 | $6 500 | | 41 kg (typique) |
| PDP-8/F | Version bas coût du PDP-8/E | 1972 | | | 26 kg (typique) |
| PDP-8/M | Version OEM du PDP-8/F avec panneau frontal adapté | 1972 | $5 000 | | 26 kg (typique) |
| PDP-8/A | Logique LSI permettant un processeur intégré sur une seule carte et une forte réduction de coût | 1974 | $1 835 | | |
| Intersil 6100 | PDP-8 intégré sur une seule puce (microprocesseur). Utilisé dans le DEC VT78 | 1975 | | | |
| Harris 6120 | PDP-8 sur microprocesseur, CMOS. Utilisé dans le traitement de texte DECmate | 1976 | | | |

## Galerie

* Exemple de carte Flip-Chip en logique discrète, ici une bascule et son schéma associé. Les processeurs du PDP-8 et 8/S sont formés de plusieurs centaines de ces cartes.
* Carte FlipChip à circuits intégrés équipant le PDP-8/I. Cette carte implémente trois bascules.
* Processeur du PDP-8/I. Les Flip-Chip vertes (série G) sont des circuits analogiques servant au contrôle de la mémoire. Les Flip-Chips rouges du PDP-8/I (série M), comprennent des circuits intégrés TTL plutôt que de la logique discrète.
* Carte de mémoire à ferrite d'un PDP-8/E, d'une capacité de 16 kbits (2 ko). Un PDP-8 en comprend trois pour un total de 4 kmots de 12 bits.
* Une des cartes de contrôle mémoire du PDP-8/E.
* Vue interne d'un PDP-8/E. Son processeur, le KK8-E, est formé des cinq cartes sur la gauche, après la carte du panneau frontal. Les cartes suivantes servent au contrôle de périphériques, et le bloc de cartes de droite à la mémoire et son contrôle.