# Apollo Abort Guidance System

Le système AGS (Abort Guidance System) était l'ordinateur de secours utilisé en cas de déaillance du système de guidage principal du module lunaire du programme Apollo. Il était conçu pour être mis en œuvre en mode dégradé, durant les phases d'alunissage, de décollage, ou de rendez-vous en orbite lunaire. En tant que système de secours, il n'était pas prévu pour gérer un alunissage. Il était en revanche capable de faciliter un amarrage en orbite.

## Développement

Le système AGS a été développé par la société TRW, d'une manière totalement séparée du système de guidage principal (PGNCS) et entre autres de l'ordinateur principal (AGC). C'est historiquement le premier système de guidage à faire usage d'une centrale inertielle de type strapdown (c'est-à-dire sans cardans rotatifs). C'est également le seul système du programme Apollo à posséder cette particularité. Si cette conception ne lui permet pas d'être aussi précis que ses homologues à cardan, elle est suffisante pour une navigation assistée par le télescope optique (AOT) et le radar de rendez-vous. Le principal intérêt du strapdown réside dans sa faible masse et son encombrement réduit.

## Description

L'AGS comprend les composants suivants :
* l'AEA, Abort Electronic Assembly : le calculateur ;
* l'ASA, Abort Sensor Assembly : une centrale inertielle de type strapdown ;
* le DEDA, Data Entry and Display Assembly : une interface utilisateur, similaire au DSKY de l'AGC.
Le calculateur utilisé était un MARCO 4418, mesurant 12,7 x 20,3 60,33 centimètres. Sa masse était de 14,83 kg, et il consommait 90 watts. La présence d'une interface mémoire série le rendait en moyenne plus lent que l'AGC. Cependant, certaines opérations étaient effectuées plus rapidement par l'AGS, en raison de différences d'architecture entre les deux machines.
Le calculateur possédait les caractéristiques suivantes :
* une taille mémoire de 4096 mots. Les 2048 premiers mots constituaient la mémoire vive (RAM), les 2048 derniers la mémoire morte (ROM). La construction similaire des deux types de mémoire rendait le ratio de celles-ci adaptable au besoin ;
* une architecture 18 bits, avec 17 bits numéraires et un bit de signe ;
* un adressage en 13 bits, le bit de poids fort (MSB) indiquant l'adressage indexé ;
* un codage des mots de données en complément à deux et en virgule fixe.

### Registres

Le calculateur possédait les registres suivants :
* A : l'accumulateur (18 bits) ;
* M : le registre mémoire (18 bits), contenant les données transférées entre la mémoire et l'unité de calcul ;
* Q : le registre multiplicateur/quotient (18 bits), contenant la moitié de poids le plus faible du résultat d'une opération de multiplication ou de quotient. Il est également possible de s'en servir comme d'une extension du registre A (accumulateur) ;
* le registre d'indexation (3 bits), utilisé pour les index d'adressage ;
* le registre d'adresse (12 bits), contenant l'adresse mémoire demandée par l'unité de calcul ;
* le registre d'opcode (5 bits), contenant le code d'instruction pendant son exécution ;
* le compteur ordinal (12 bits) ;
* le compteur de cycles, ou registre a décalage (5 bits), contrôlant les instructions de décalage ;
* deux timers, fournissant le contrôle des timings ;
* treize registres d'entrée.
Les données y sont notées sur la base du complément à deux, le premier bit des registres désigne donc habituellement le signe du nombre.

### Instructions

Les instructions du calculateur étaient sous la forme suivante :
Le bit d'index indique un adressage indexé. Le processeur avait un set de 27 instructions :
ADD : le contenu de la zone mémoire spécifiée est ajouté au registre A (accumulateur) ;
ADZ (Add and Zero) : identique à l'instruction ADD, avec remise à zéro de la zone mémoire ;
SUB (Subtract) : le contenu de la zone mémoire spécifiée est soustrait au registre A (accumulateur) ;
SUZ (Subtract and Zero) : identique à l'instruction SUB, avec remise à zéro de la zone mémoire ;
MPY (Multiply) : le contenu du registre A est multiplié par le contenu de la mémoire. La moitié la plus significative du résultat est stockée dans le registre A, la moins significative dans le registre Q ;
MPR (Multiply and Round) : identique à l'instruction MPY, le contenu du registre A étant arrondi en lui ajoutant 1 si le bit de poids fort du registre Q est 1 ;
MPZ (Multiply and Zero) : identique à l'instruction MPR, avec remise à zéro de la mémoire ;
DVP (Divide) : le contenu concaténé des registres A et Q est divisé par le contenu de la mémoire. Le résultat est stocké dans le registre A, et arrondi (sauf si arrondir provoquerait un dépassement mémoire) ;
COM (Complement Accumulator) : le contenu du registre A est remplacé par son complément à deux. Si le contenu du registre A est positif, nul ou égal à -1, il n'est pas modifié ;
CLA (Clear and Add) : la mémoire est copiée dans le registre A ;
CLZ (Clear, Add and Zero) : identique à CLA, avec remise a zéro de la mémoire ;
LDQ (Load Q Register) : la mémoire est copiée dans le registre Q ;
STO (Store Accumulator) : le contenu du registre A est copié en mémoire ;
STQ (Store Q Register) : le contenu du registre Q est copié en mémoire ;
ALS N (Arithmetic Left Shift) : le contenu du registre A est décalé vers la gauche de N bits ;
LLS N (Long Left Shift) : le contenu concaténé du registre A et des 17 derniers bits du registre Q est décalé vers la gauche de N bits. Le signe du registre Q (premier bit) est rendu identique au signe du registre A ;
LRS N (Long Right Shift) : similaire à LLS, mais le contenu est décalé vers la droite ;
TRA (Transfer) : l'instruction suivante est chargée depuis la mémoire ;
TSQ (Transfer and Set Q) : le contenu du registre Q est remplacé par l'adresse supérieure à la zone mémoire spécifiée. L'instruction suivante est ensuite chargée depuis la mémoire ;
TMI (Transfer on Minus Accumulator) : si le contenu du registre A est négatif, l'instruction suivante est chargée depuis la mémoire ;
TOV (Transfer on Overflow) : si l'indicateur de débordement mémoire est à l'état haut, l'instruction suivante est chargée depuis la mémoire ;
AXT N (Address to Index) : le registre d'indexation prend la valeur N ;
TIX (Test Index and Transfer) : si le registre d'indexation est positif, il est décrémenté, puis l'instruction suivante est chargée depuis la mémoire ;
DLY (Delay) : l’exécution s'arrête jusqu'à la réception d'un signal de timing. L'instruction suivante est par la suite chargée depuis la mémoire ;
INP (Input) : le contenu du registre d'entrée à l'adresse mémoire spécifiée est placé dans le registre A. Selon le registre sélectionné, il y a ou non remise à zéro du registre d'entrée ;
OUT (Output) : le contenu du registre A est placé dans le registre de sortie à l'adresse mémoire spécifiée.