# Bull Gamma 3

Le Gamma 3 est un calculateur électronique conçu par la Compagnie des Machines Bull et commercialisé à partir de 1952.
Initialement conçu comme accélérateur électronique pour les tabulatrices électromécaniques, à l'instar de l'IBM 604, il fut progressivement enrichi de nouveaux dispositifs jusqu'à devenir un ordinateur de première génération (Gamma AET, 1955, puis ET, 1957), plus précisément une machine Von Neuman à programme enregistré. Les termes d'ordinateur et d'informatique n'existant pas encore, Bull désigna le Gamma ET comme un « ordonnateur ».
Au cours des dix ans de sa carrière, cette machine considérée comme charnière permis la transition entre la mécanographie et l'informatique, et entre le calculateur et l'ordinateur.
Le Gamma 3 fût un succès commercial, avec plus de 1200 unités produites, faisant également de ce dernier le premier ordinateur produit à plus de 1 000 exemplaires$^,$.

## Historique

Jusqu'aux années 1950, la Compagnie des Machines Bull, à l'instar de son rival IBM, commercialise majoritairement des tabulatrices à carte perforée destinées à la gestion des stocks, la paye, et la comptabilité.
Ces tabulatrices réalisent les opérations arithmétiques via une série de roues de totalisation, incrémentées par un dispositif électro-mécanique. Seule l'incrémentation, et donc l'addition, est supportée; les soustractions et multiplications s'avèrent donc particulièrement lentes.
Afin d’accroître la vitesse de calcul, et donc de ne pas retarder la lecture des cartes perforées lors des opérations plus complexes, un accélérateur pouvant s'affranchir des limites électro-mécaniques devient nécessaire.
À partir de 1949, la Compagnie Bull s'intéresse aux tubes à vide pour leur vitesse de commutation par rapport aux roues totalisatrices et aux relais électromécaniques. Le calculateur est conçu à partir de circuits logiques comprenant environ 400 tubes, 8000 diodes au germanium et des registres de 48 bits constitués de lignes à retard électriques, afin de réduire la dépendance aux tubes électroniques, plus fragiles. L'ensemble est cadencé par une horloge à une fréquence de 281 kHz, une vitesse alors significativement supérieure aux 50 kHz de l'IBM 604, et plusieurs ordres de grandeur plus rapide que les dispositifs électromécaniques. La vitesse d'exécution pour l'addition de deux nombres binaires varie entre 0,6 ms et 10 ms, avec une vitesse moyenne de 2 ms. Le Gamma 3 est connecté à la tabulatrice par un câble branché en lieu et place de son tableau de connexion (instructions du programme); le programme est donc installé sur le Gamma 3 plutôt que sur la tabulatrice.
Néanmoins, si le Gamma 3 est programmable par un tableau de connexion amovible analogue à ceux des tabulatrices, il n'en reste pas moins un périphérique de ces dernières et non l'inverse. De plus, bien qu'électronique, binaire et programmable avec un jeu d'instruction Turing-complet, le Gamma 3 ne pouvait fonctionner par programme enregistré et sa programmation dépendait du tableau de connexion.
Une première évolution vers l'ordinateur apparaît avec le Programme Par Carte (PPC), apportant la possibilité d’exécuter un programme chargé par carte perforée, plutôt que câblé sur un tableau de connexion. Ce concept est également expérimenté par IBM avec l'extension CPC (Card Programmed Calculator) ajoutée au 604. Néanmoins, bien que cela permette le fonctionnement de programmes de taille arbitraire plutôt que limités au nombre de connexions du tableau de branchement, le programme n'est toujours pas exécuté en mémoire vive, sa vitesse d'exécution dépend donc de la vitesse de lecture des cartes perforées du programme.
Le Gamma 3 connaît une nouvelle mise à jour en 1955 avec l'apparition d'un tambour magnétique d'une capacité de 49 ou 98 ko (64 ou 128 pistes de 8 blocs de 16 mots de 48 bits)$^,$, quantité remarquable pour l'époque. Jusqu'à trois instructions pouvaient être stockées par mot sur le tambour, permettant ainsi d'accueillir 24 576 ou 49 152 instructions. Cette nouvelle version était appelée Gamma 3 A.E.T (Armoire Extension Tambour, ou Extension Tambour).
Les programmes étaient enregistrés dans la mémoire de l'A.E.T. par groupes de 48 instructions, appelés 'séries'. Lorsque nécessaire, une série était transférée du tambour vers un groupe de mémoire intermédiaire agissant comme un cache d'instructions, ce qui permettait à l'ordinateur de récupérer chaque instruction une par une et de les transférer dans son registre d'instructions. Il est intéressant de noter que les instructions, en particulier les adresses, pouvaient être modifiées dans l'unité arithmétique de l'ordinateur, tout comme n'importe quelle autre donnée. Cette capacité a ouvert la voie plus tard à l'adressage indirect ou indexé. Le cache d'instructions a également résolu le problème rencontré avec l'IBM 650, qui nécessitait une optimisation de l'agencement des instructions sur le tambour pour éviter que sa latence ne ralentisse l'exécution du programme.
Avec la possibilité de charger et d’exécuter des programmes en mémoire, le Gamma ET (Extension Tambour) devient le premier ordinateur français. La tabulatrice est désormais un périphérique d'entrée/sortie et le Gamma ET l'unité centrale. La mécanographie cède alors progressivement sa place à l'informatique pour le traitement de l'information. Le Gamma ET se positionne en concurrent de l'ordinateur IBM 650, de conception très similaire.
Le premier client à recevoir un Gamma 3 est le Crédit Lyonnais de Saint-Étienne en 1952. Le Gamma 3 et ET fut ensuite employé tant en informatique de gestion au sein de grandes entreprises, qu'en calcul scientifique, notamment au sein du CERN et CNRS alors naissants.
Bull ne traversa jamais l'Atlantique malgré son partenariat avec Remington Rand - Univac et la création d'une version "américanisée" disposant d'une alimentation électrique à 60 Hz.
Le Gamma 3 fût un succès commercial en Europe avec environ 1200 unités vendues, dépassant les ventes de l'IBM 650. Le Gamma 3 étendu se comparait très favorablement à son concurrent : l'espace mémoire était quatre fois plus grand et permettait de stocker douze fois plus d'instructions, tandis que la vitesse de traitement était généralement plus élevée. Ce succès a incité IBM à concevoir le modèle 1401 en réponse.

## Organisation de la mémoire

Le Gamma 3 comprend trois types de mémoires, toutes basées sur des mots de 48 bits ou de 12 caractères BCD
Le premier type est constitué d'un groupe de sept registres au cœur du processeur. M1 fait partie de la Mémoire Opérateur, il sert d'accumulateur et est lié au circuit d'addition-soustraction. M2 sert d'accumulateur auxiliaire pour les opérations en double précision (96 bits). M3 à M7 sont des registres à usage général dénommées Mémoires Banales. Le transfert entre ces mémoires se fait par M1. M0 est un registre spécial lié à M1 et non accessible au programmeur.
Outre ces registres génériques, le Gamma 3 comprend également six registres internes :
* MC : Mémoire Comparaison. Ce registre contient le résultat d'une instruction de comparaison.
* MD : Mémoire Décalage. Ce registre de décalage est utilisé à la fois pour les opérations en BCD et arithmétiques.
* MS1 : Mémoire Signe. Stocke le signe actuel de l'arithmétique. Avec M1, MC et MD, ils forment ensemble l'opérateur du processeur.
* NL : Numéro de Ligne, qui serait aujourd'hui appelé le Compteur de Programme.
* RNL1 / RNL2 : Registre Numéro de Ligne, qui agit comme des registres de pile.
Afin de réduire le nombre de tubes électroniques, source fréquente de défaillances, les Mémoires Banales n'utilisent pas de bascules, mais des lignes de retard électriques.
Un second type de mémoire est appelé Mémoires Circulantes, qui agissent comme des tampons, car leur contenu est destiné à être échangé avec la mémoire tambour. Les Mémoires Circulantes, désignées de M8 à M15, sont implémentées à l'aide de lignes à retard magnétostrictives dans une armoire séparé dédié (l'Armoire ET). Ces huit mémoires sont regroupées par paires pour former quatre "groupes". Les groupes 0, 1 et 2 sont exécutables et désignés sous le nom de "séries", chaque série contenant un cache d'instructions de 48 instructions. Le panneau de connexion, s'il est utilisé, constitue la série 3. Cela sera utilisé au cours du cycle de vie de la machine pour fournir des extensions du jeu d'instruction.
Le Groupe 3 agit comme un tampon d'entrée/sortie. Une armoire complémentaire dénommée "Ordonnateur" (ORD) peut également être ajoutée, fournissant quatre groupes supplémentaires numérotés de 4 à 7, contenant des données mais sans possibilité d'exécution.
Enfin, la Mémoire Tambour sert de mémoire de masse, hébergeant à la fois du code et des données. Sur le Gamma 3, le code n'est pas exécuté depuis le tambour mais depuis les trois premiers groupes des Mémoires Circulantes (les séries). Bien que cela augmente la vitesse d'exécution, cela rend également les sauts de longue portée plus coûteux, car une page doit d'abord être transférée du tambour vers les mémoires MC à l'aide d'une instruction dédiée ("TB").
Le tambour est constitué d'un cylindre en duralium, long de 15 ou 30 cm, tournant à environ 2 750 tr/min. Il possède 64 ou 128 pistes de 8 blocs, chaque bloc contenant un groupe, permettant ainsi de stocker jusqu'à 1 024 séries, soit 49 152 instructions. La densité d'enregistrement approchait 300 bits par pouce, utilisant la modulation de phase, ce qui était une prouesse à cette époque.

## Jeu d'instructions

Une instruction Gamma 3 est constituée d'un mot de 16 bits composé de quatre chiffres hexadécimaux : un code d'opération (TO, Type d'Opération), une adresse (AD), un ordre de début OD, et un ordre de fin OF. Le champ TO spécifie le type général d'instruction, tandis que les trois autres champs agissent comme des paramètres. OD et OF définissent des positions, qui peuvent être soit des chiffres en mode binaire, soit des caractères en mode BCD. Un total de 29 mnémoniques forment le jeu d'instructions.
Aucun assembleur, souvent appelé autocodeur à l'époque, n'existait pour le Gamma 3, encore moins de langages de haut niveau comme Fortran qui devaient encore être inventés. À la place, le programmeur devait d'abord créer un schéma du programme, le compléter avec des mnémoniques, convertir manuellement les mnémoniques en code machine en utilisant un tableau, puis écrire le code résultant sur une feuille de codage pour vérification avant de le perforer sur des cartes. Une fois le programme chargé dans la mémoire du tambour, le pupitre opérateur permettait au programmeur d'examiner et de déposer des données en mémoire, ainsi que de contrôler le flux du programme à des fins de débogage.
Les instructions résident dans les série 0 à 2 hébergée sur les Mémoires Circulantes de l'armoire ET, où le code est récupéré et décodé par le processeur (l'armoire Gamma 3). Les programmes de plus petite taille peuvent être câblés directement sur le tableau de connexion, quoiqu'il était plus commode de les perforer sur des cartes, puis les lire et les transférer dans la mémoire tambour pour les exécuter comme programme enregistré. Le tableau suivant décrit les instructions avec leurs mnémoniques et les codes machine associés :
| Instruction | TO | AD | Description |
| V (Variante) | 0 | 0 | Absence d'opération (NOP) si OD et OF = 0 |
| VS (Variante Systématique) | 0 | 0 | Saut inconditionnel NL = OD + OF |
| VC (Variante Comparaison) | 0 | 1 | Saut conditionnel NL = OD + OF si MD <= 0 |
| | 0 | 2 | NL = OD + OF si MD != 0 |
| | 0 | 3 | NL = OD + OF si MD < 0 |
| | 0 | 4 | NL = OD + NF si MS1 indique positif |
| VCS (Variante Changement de Série) | 1 | 0 | Branche vers OD de la série OF La séries doit être 0, 1 ou 2 |
| | 1 | 1 | VCS, puis RNL1 = AD + 1 |
| | 1 | 2 | VCS, puis RNL2 = OD + 1 |
| VRS (Variante Retour Serie) | 1 | 5 | RNL1 -> NL (jumps back to the address stored in RNL1) |
| | 1 | 6 | RNL2 -> NL |
| ES1 (Extraction Statique) | 1 | 8 | Envoie les positions OD à OF dans le groupe 3 (registre E/S) |
| ES2 (Extraction Statique) | 1 | 9 | Idem |
| CD (Calcul Decimal) | 1 | 0xA | Place l'ALU en mode décimale (BCD) |
| CO (Commutation d'Octade) | 1 | 0xC | Sélectionne l'octade (8 mots) OF |
| CSZ (Commutation de Seizaine) | 1 | 0xD | Sélectionne la seizaine (16 mots) OF |
| CB (Calcul binaire) | 1 | 0xF | Place l'ALU en mode binaire (scientifique) |
| BT (Banale->Tambour) TB (Tambour->Banale) | 2 | | Transfère le group AD depuis/vers le bloc OF de la piste OD du tambour. La dernière position de OF sélectionne T->B or B->T |
| ZB (Zéro Banale) | 3 | | Mets à zéro la mémoire AD entre les positions OD et OF |
| KB (Constante Banale) | 4 | | Écrit la valeur de OF à la position OD de la mémoire AD |
| GG (Groupe -> Groupe) | 5 | 0 | Copie le coupe OD vers le groupe OF |
| IS (Introduction Statique) | 5 | | Reçoit des données depuis un périphérique (généralement une tabulatrice) sur le canal AD |
| BO (Banale -> Operative) | 6 | 0 | Mets M1 à zéro, puis écrit 0 à la position 1. Mets MD à zéro. |
| | 6 | | Mets M1 à zéro, puis transfère le registre AD vers M1 entre les positions OD et OF. Mets MD à zéro. |
| AMD (Alteration Mémoire Décalage) | 7 | 0 | Mets MD à 1 |
| BD (Banale -> Décalage) | 7 | 2 | Mets la position OD de M2 dans MD |
| IL (Intersection Logique) | 7 | 0xA | ET logique entre 1 et chaque position de M1 |
| | 7 | 0xC | ET logique entre M1 et M2 |
| OB (Opérateur -> Banale) | 8 | 1 | Mets M1 à zéro entre les positions OD et OF |
| | 8 | | Décale M1, puis copie les positions OD à OF de M1 vers la mémoire AD entre les mêmes positions |
| CN (Comparaison Normale) | 9 | 0 | Décale M1, puis compare la position OD à 1 et place le résultat dans MC |
| | 9 | | Décale M1, puis compare son contenu à la mémoire AD entre les positions OD et OF. Place le résultat dans MC. |
| AN (Addition Normale) | 0xA | 0 | Décale M1, ajoute 1 à la position 0 |
| | 0xA | | Décale M1, additionne les positions OD à OF de M1 et de la mémoire AD, inscrit le résultat dans M1 |
| SN (Soustraction Normale) | 0xB | 0 | Décale M1, soustrait 1 de la position 0 de M1 |
| | 0xB | | Décale M1, soustrait les positions OD à OF des mémoires M1 et AD, inscrit le résultat dans M1 |
| MR (Multiplication Réduite) | 0xC | | Multiplie le contenu de M1 par la mémoire AD entre les positions OD et OF, place le résultat dans M1 |
| DR (Division Réduite) | 0xD | | Divise le contenu de M1 par la mémoire AD entre les positions OD et OF, place le résultat dans M1 |
| MC (Multiplication Complète) | 0xE | | Multiplication double précision. Multiplie M1 par le contenu de la mémoire AD entre les positions OF et OF, inscrit le résultat dans M1-M2 |
| DC (Division Complète) | 0xF | | Division double précision. Divise le contenu de M1-M2 par le contenu de la mémoire AD entre les positions OD et OF. Le quotient est inscrit à la fin de M2, tandis que le reste est inscrit dans M1-M2. |
Le tableau de branchement étant accessible via la série 3, certaines extensions et sous-programmes en tirèrent partie en étant fournis sous forme de tableau de branchement pré-câblé. Un tel exemple est l'extension "PDF" (Point Décimal Flottant), qui ajoutait deux instructions supplémentaires : BD et DCC, permettant de faciliter la manipulation des nombres à virgule flottante.
Le jeu d'instruction détaillé accompagné d'exemples peut encore être trouvé de nos jours dans des cours de programmation d'époque$^,$.
Sur la fin de la carrière du Gamma 3, une équipe d'étudiants dirigée par le professeur Pierre Bacchus de l'Université de Lille développa un langage haut niveau pour ce dernier. Ce langage, appelé Auto-Programmation Bull (APB), combinait des éléments de l'assembleur du Gamma 3 avec des éléments structurés de ce qui deviendra l'ALGOL 60. Il s'avera assez populaire au sein du groupe d'utilisateurs du Gamma 3 et sera plus tard porté sur l'IBM 1620.

## Particularités historiques et techniques

Le Gamma 3 possède une ALU bi-mode, pouvant fonctionner en mode décimal (mots de 12 caractères BCD) pour l'informatique de gestion, ou binaire (mots de 48 bits) pour l'informatique industrielle et scientifique. Deux instructions, CB et CD, permettent de passer de l'un à l'autre.
Le Gamma 3 fut pourvu en option d'une bibliothèque virgule flottante câblée, peu commune dans les années 1950. Ce modèle dénommé 3M était destiné au calcul scientifique et finit par être intégré par défaut au Gamma ET.
Les nombres à virgule flottante sont représentés sur 48 bits. Le bit le plus significatif est utilisé pour le signe, 8 bits sont utilisés pour l'exposant, et les 39 bits les plus significatifs sont réservés pour la mantisse.
Les premiers cours de programmation universitaires en France furent dispensés sur des machines Gamma 3 ET à la fin des années 1950 par le professeur Louis Bolliet, marquant ainsi la transition des formations fournies par les fabricants vers un cadre académique. Ces cours sont aujourd'hui disponibles en ligne et ont servi à la création de simulateur de programmation.
Le Gamma 3 fût, avec l'IBM 650, le premier ordinateur produit à plus de 1 000 exemplaires.

## Préservation

Quatre exemplaires du Gamma 3 existent encore aujourd'hui. L'un est exposé au Technikum à proximité de Frankfort, un autre à la Fédération des Équipes Bull à Angers, où il était fabriqué, et un autre au Museo degli Strumenti per il Calcolo à Pise. Enfin, l'ACONIT à Grenoble héberge un exemplaire unique du Gamma ET.