Aller au contenu

PDP-8

Un article de Wikipédia, l'encyclopédie libre.
PDP-8
Vue générale d'un PDP-8 originel. Le processeur, en logique discrète, se trouve dans l'armoire de droite. L'amoire de gauche contient la mémoire à ferrite et sa logique de gestion.
Développeur
Fabricant
Famille
Date de sortie
Date de retrait
1984 (PDP-8/A)
Fonctions
Type
Génération
Deuxième (PDP-8) puis troisième génération (PDP-8/I, /E, /F, /A)
Unités vendues
50000+
Caractéristiques
Processeur
Logique discrète DTL (PDP-8) puis LSI (PDP-8/I et ultérieur). Environ 0.333 MIPS
Mémoire
4K mots de 12 bits (8 Ko). Extensible à 32K mots de 12 bits (48 Ko). Cycle d'horloge de 1.5 μs (667 kHz)
Système d'exploitation
Optionnel: OS/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 et son arrêt de fabrication en 1984 (PDP-8/A[1]). 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[2], ainsi qu'en étant le premier ordinateur abordable (moins de $10 000 USD de l'époque pour le PDP-8/S) produit en masse[3].

Vue d'ensemble

[modifier | modifier le code]

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 $[4] (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[5]. 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 $[6], en faisant le modèle d’ordinateur le plus populaire de l’époque[7]. 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[8].

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[9].

Particularités techniques

[modifier | modifier le code]

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[10] et ainsi réduire les coûts[4]. 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 - 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.

Panneau frontal du PDP-8 originel ("Straight 8")

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[11], 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

[modifier | modifier le code]
Un PDP-8/e (centre) avec un lecteur de bande (haut) et un disque-dur RK05 de 2.5 Mo (bas)

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

[modifier | modifier le code]
Panneau frontal d'un PDP-8/I. Sur la gauche, le RIM Loader : la séquence de code octal à saisir "aux clés" pour charger un programme depuis le lecteur de ruban perforé

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[12].

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[13].

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

[modifier | modifier le code]

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[14]. 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 I Z Adresse (7 bits)

Pages mémoire

[modifier | modifier le code]

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

[modifier | modifier le code]
  • 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

[modifier | modifier le code]

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 Périphérique Fonction E/S

Périphérique

[modifier | modifier le code]

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)

[modifier | modifier le code]

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

        00 01 02 03 04 05 06 07 08 09 10 11
        ___________________________________
       | 1| 1| 1| 0|  |  |  |  |  |  |  |  |
       |__|__|__|__|__|__|__|__|__|__|__|__|
                   |CLA   CMA   RAR   BSW
                       CLL   CML   RAL   IAC

  Ordre d'exécution  1  1  2  2  4  4  4  3
  • 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

[modifier | modifier le code]
         00 01 02 03 04 05 06 07 08 09 10 11
        ___________________________________
       | 1| 1| 1| 1|  |  |  |  | 0|  |  | 0|
       |__|__|__|__|__|__|__|__|__|__|__|__|
                   |CLA   SZA      OSR
                       SMA   SNL      HLT

                     2  1  1  1     3  3
  • 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

[modifier | modifier le code]
         00 01 02 03 04 05 06 07 08 09 10 11
        ___________________________________
       | 1| 1| 1| 1|  |  |  |  | 1|  |  | 0|
       |__|__|__|__|__|__|__|__|__|__|__|__|
                   |CLA   SNA      OSR
                       SPA   SZL      HLT

                     2  1  1  1     3  2
  • 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.

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

        00 01 02 03 04 05 06 07 08 09 10 11
        ___________________________________
       | 1| 1| 1| 1|  |  |  |  |  |  |  | 1|
       |__|__|__|__|__|__|__|__|__|__|__|__|
                   |CLA   SCA   \_    _/
                   |   MQA   MQL  CODE

                     1* 2  2  2     3
  • 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
Panneau frontal d'un PDP-8/S

Les modèles suivant furent fabriqués, de 1965 jusqu'au retrait de la gamme en 1984 [15] :

Panneau frontal d'un PDP-8/E
Panneau frontal d'un PDP-8/A
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

Articles connexes

[modifier | modifier le code]

Références

[modifier | modifier le code]
  1. « PDP-8 Summary of Models and Options (posted every other month)Section - What is a PDP-8/A? », sur www.faqs.org (consulté le )
  2. (en) « Bizarre DTL Logic Levels - The Discrete Component PDP-8 | Details | Hackaday.io », sur hackaday.io (consulté le )
  3. (en) David Gesswein, « Online PDP-8 Home Page, Run a PDP-8 » (consulté le )
  4. a et b « Doug Jones's DEC PDP-8 FAQs », sur homepage.cs.uiowa.edu (consulté le )
  5. (en-US) The Digital Grapevine, « (1965) PDP-8: The First Minicomputer: A Revolution in Computing Accessibility », sur The Digital Grapevine, (consulté le )
  6. (en) Edgar H. Schein, Paul J. Kampas, Peter S. DeLisi et Michael M. Sonduck, DEC Is Dead, Long Live DEC: The Lasting Legacy of Digital Equipment Corporation, Berrett-Koehler Publishers, (ISBN 978-1-60509-302-4, lire en ligne)
  7. « System Source Computer Museum », sur museum.syssrc.com (consulté le )
  8. « DEC PDP-8/S #1 », sur www.ricomputermuseum.org (consulté le )
  9. (en) Glenn Rifkin et George Harrar, The Ultimate Entrepreneur: The Story of Ken Olsen and Digital Equipment Corporation, Contemporary Books, (ISBN 978-0-8092-4559-8, lire en ligne)
  10. (en) « Bizarre DTL Logic Levels - The Discrete Component PDP-8 | Details | Hackaday.io », sur hackaday.io (consulté le )
  11. (en) Ziff Davis Inc, PC Mag, Ziff Davis, Inc., (lire en ligne)
  12. « How to use the PiDP-8 », sur obsolescence.dev (consulté le )
  13. (en) Digital Equipment Corporation, FOCAL Programming Manual for PDP-8, PDP-8/S, PDP-8/I, LAB-8, LINC-8, (lire en ligne)
  14. « GRC's | Digital Equipment Corporation's PDP-8   », sur www.grc.com (consulté le )
  15. « PDP-8 Summary of Models and Options (posted every other month) », sur www.faqs.org (consulté le )

Liens externes

[modifier | modifier le code]
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy