Lorenzo Vainigli

Android Developer

Il codice che ci ha portato oltre i nostri confini

20 Luglio 2019
Assembly Storia
5 min.
39

This post is available in English

A mezzo secolo dall’impresa di Neil Armstrong sono stati pubblicati online i codici sorgente dell’Apollo 11

Oggi sono 50 anni esatti dal giorno in cui il primo uomo ha messo piede sulla Luna, il 20 luglio 1969. “Un piccolo passo per l’uomo, un grande passo per l’umanità” è la frase che continua a riecheggiare nelle nostre vite, ma quanto l’informatica ha aiutato l’uomo a raggiungere il satellite terrestre? Semplicemente è stata fondamentale. Vediamo di capire meglio quali strumenti avevano a disposizione gli astronauti.

L’Apollo Guidance Computer

Su Github è presente una repository che contiene parte dei codici sorgente per l’Apollo Guidance Computer, ossia il centro di controllo per il modulo di comando e per il modulo lunare (foto di copertina). Il codice è proprio quello originale conservato in forma cartacea al museo del MIT.
Prima di dargli un’occhiata, consideriamo le specifiche tecniche dell’AGC.

  • Processore basato su Discrete IC RTL a 2,048 MHz.
  • 4 KB di memoria RAM a nucleo magnetico composta da 2.048 parole di 16 bit (di cui un bit di parità).
  • 72 KB di memoria ROM di tipo core rope composta da 36.864 parole.
  • Consumo energetico: 55W.
  • Peso: 32 kg.
  • Dimensioni: 61 x 32 x 17 cm.

Negli anni in cui c’era entusiasmo perché i computer erano capaci di entrare “solo” in una stanza, questo apparecchio era avveniristico. Le sue performance sono poi state raggiunte dai personal computer di fine anni ‘70, come l’Apple II.

L’AGC si componeva di 4 registri principali: l’accumulatore (A), il program counter (Z), il registro per il return address o per il resto di una divisione (Q) e il registro per il lower product delle moltiplicazioni (LP). Vi erano anche altri 23 registri, di cui 4 facenti parte di un gruppo IN (input) e 4 di un gruppo OUT (output).

L’intefaccia di comando

Interfaccia DSKY

L’AGC aveva la sua interfaccia di comando: il DSKY. Da una parte erano presenti una serie di luci che mostravano lo status del computer, dall’altra un display che indicava il numero del programma in esecuzione (se presente); verb e noun, ovvero i due parametri di input che gli astronauti potevano inserire, e tre valori di output. In basso era presente una tastiera numerica con pulsanti dedicati.

I programmi disponibili nel computer erano identificati da numeri e un programma si avviava quando veniva inserito il suo numero. Di seguito sono riportate le tabelle con i numeri di programmi, verb e noun.

Il codice sorgente

Margaret Hamilton insieme al codice sorgente scritto per l’Apollo Guidance Computer.

Il linguaggio di programmazione utilizzato per programmare il computer dell’Apollo 11 è una versione di assembly sviluppata ad-hoc da un gruppo di scienziati al MIT diretto di Margaret Hamilton, divenuta per questo una delle donne più influenti della storia dell’informatica.
Tra le numerose e complesse istruzioni se ne possono riportare alcune che vedremo non essere molto distanti dalle istruzioni generali di assembly.

  • TC (Transfer Control): salto incondizionato utilizzabile per la chiamata di procedure.
  • CCS (Count, Compare, Skip): comando complesso utilizzato per generare cicli; lavora con il registro A.
  • INDEX: recupera i dati da un indirizzo passato come parametro; veniva utilizzato per array e look-up.
  • RESUME: caso particolare di INDEX con parametro 25. Permetteva di riprendere l’esecuzione dopo un interrupt.
  • XCH (Exchange): una sorta di ibrido tra load e store, scambia il contenuto dell’indirizzo indicato con quello del registro A. Se la memoria è di sola lettura, si limita a caricare il dato in A.
  • CS (Clear and Subtract): carica in A il valore ottenuto complementando tutti i bit del dato presente nell’indirizzo di memoria passato come parametro.
  • TS (Transfer to Storage): effettua uno store del contenuto di A e si occupa della rilevazione di errori di overflow.
  • AD (Add): aggiunge il contenuto dell’indirizzo indicato ad A.
  • MASK: and logico tra il contenuto dell’indirizzo di memoria ed A; salva il risultato in A.
  • MP (Multiply): effettua una moltiplicazione tra il contenuto dell’indirizzo di memoria ed A, quindi salva i bit meno significativi del risultato in LP e quelli più significativi in A.
  • DV (Divide): divisione tra il contenuto dell’indirizzo di memoria ed A. Salva il quoziente in A e il resto in Q.
  • SU (Subtract): sottrae da A il complementare (bit per bit) del contenuto dell’indirizzo di memoria.

Si può notare che come parametri a questi comandi devono essere passati solo indirizzi di memoria e il registro A è fondamentale per ognuno di essi.
Ci sono altri tipi di istruzioni, anche più complicate, che sono riportate sul manuale.

In conclusione

I linguaggi assembly-based ormai fanno parte degli archivi storici dell’informatica e hanno lasciato il passo ai più versatili e potenti linguaggi di alto livello. Oggi è impensabile scrivere un intero programma in assembly, a meno che non si tratti di qualcosa simile ad un Hello World; in qualche caso particolare però assembly può tornare ancora utile, sempre che si voglia mettere mano alla gestione dei registri e degli indirizzi di memoria.
Può essere allora questo un momento per ricordare che, solo 50 anni fa, lo stato dell’arte in questo campo era lontanissimo da quello di oggi, ma non per questo incapace di lasciare il segno nella storia dell’umanità.

A chi volesse approfondire consiglio l’Introduzione all’Apollo Guidance Computer, sempre da questo sito si può scaricare un simulatore dei due moduli (di comando e lunare).
Qui invece è stato realizzato lo stesso simulatore in javascript.

Chissà quale sarà il codice che un giorno ci porterà su Marte…



Riferimenti:

Apollo Guidance Computer su Wikipedia EN
Virtual AGC

Lorenzo Vainigli

Sviluppatore Android e appassionato fin da piccolo di computer e tecnologia.
Ho una laurea magistrale in Informatica conseguita all'Università di Bologna.
Mi piacciono l'astronomia 🌌 e la cultura giapponese ⛩️.
Qui racconto di più su di me.