# IBM 704

Il calcolatore IBM 704 è un modello di computer realizzato dalla IBM nel 1954 ed è stato il primo calcolatore in grado di eseguire calcoli in virgola mobile ad essere prodotto in massa.

## Pietre miliari

Per l'IBM 704 vennero sviluppati appositamente i linguaggi Fortran e LISP così come l'assembler SAP (Symbolic Assembly Program) successivamente distribuito dal gruppo SHARE come SHARE Assembly Program (mantenendo l'acronimo).
Il primo programma di musica per computer, MUSIC-N, fu sviluppato da Max Mathews utilizzando un IBM 704.
Nell'autunno del 1957 l'IBM 704 del Centro di Calcolo del MIT Computation Center fu usato come strumento di rilevamento ufficiale nell'operazione Moonwatch dallo Smithsonian Astrophysical Observatory. L'IBM inviò quattro suoi scienziati per aiutare i ricercatori e i matematici dell'osservatorioi a calcolare le orbite del satellite: Giampiero Rossoni, John Greenstadt, Thomas Apple e Richard Hatch.
Nel 1961 il fisico John Larry Kelly Jr. diede vita a uno dei momenti più famosi nella storia dei laboratori Bell utilizzando un computer IBM 704 per la sintesi vocale. Il sintetizzatore vocale creato da Kelly, chiamato vocoder, rese l'elaboratore in grado di cantare la filastrocca Daisy Bell, con accompagnamento musicale di Max Mathews. Per puro caso, alla dimostrazione assistette lo scrittore di fantascienza Arthur C. Clarke, che si trovava lì per incontrare un amico e collega e ne rimase fortemente impressionato. Sette anni più tardi, Clarke inserì una situazione analoga nel suo romanzo 2001: Odissea nello spazio e nella sceneggiatura del film omonimo diretto da Stanley Kubrick: sia nel libro che nella versione in lingua originale del film, il computer HAL 9000, riesumando i propri ricordi d'infanzia mentre viene disattivato dall'astronauta David Bowman, canta proprio Daisy Bell (nel doppiaggio italiano del film, invece, è stata usata la popolare canzoncina Giro giro tondo).
Edward O. Thorp, matematico del MIT, impiegò l'IBM 704 come strumento di ricerca per analizzare le probabilità di vincita durante lo sviluppo della sua teoria sul gioco del blackjack per dimostrare che non si tratta di un gioco d'azzardo; Thorp utilizzò il linguaggio Fortran per formulare le equazioni del suo modello di ricerca.

## Descrizione

Il manuale di istruzioni dell'IBM 704 riporta:
«The type 704 Electronic Data-Processing Machine is a large-scale, high-speed electronic calculator controlled by an internally stored program of the single address type.»
«Il sistema di elaborazione dati modello 704 è un calcolatore elettronico ad alta velocità e su larga scala controllato da un programma interno a indirizzamento singolo.»
(IBM 704 - Manual of Operation)
All'epoca, l'IBM 704 era considerato come "l'unico computer in grado di eseguire calcoli matematici complessi".
L'IBM 704 rappresentò un miglioramento significativo rispetto al precedente modello IBM 701 in termini sia di architettura che di implementazione. Come il modello 701, anche il 704 per i circuiti logici utilizzava valvole termoioniche e parole binarie da 36 bit. Di nuovo rispetto al 701 c'erano l'introduzione della memoria a nucleo magnetico al posto del tubo Williams, il supporto delle istruzioni aritmetiche a virgola mobile, uno schema di indirizzamento a 15 bit e l'aggiunta di tre registri indice. Per gestire queste nuove funzionalità le istruzioni vennero estese per impiegare un'intera parola a 36 bit. Il nuovo set di istruzioni, non compatibile con quello usato dal modello 701, divenne la base per la sottoclasse "architettura scientifica" delle future serie IBM 700/7000.
L'IBM 704 era in grado di eseguire fino a 12 000 somme in virgola mobile al secondo Tra il 1955 e il 1960 furono venduti 140 sistemi IBM 704.
In Italia, il primo modello di IBM 704 fu installato nel 1961 presso il Centro di Calcolo del CNENdi Bologna.

### Registri

L'IBM 704 era dotato di un accumulatore a 38 bit, di un registro di moltiplicazione-divisione a 36 bit e di tre registri indice a 15 bit per l'indirizzamento. Il contenuto dei registri indice veniva sottratto dall'indirizzo base e per questo motivo i registri indice erano detti anche "registri di decremento". Tutti e tre i registri potevano far parte di un'istruzione: i tre bit del campo tag dell'istruzione rappresentavano una codifica che indicava quali dei tre registri erano utilizzati nell'istruzione. Se veniva selezionato più di un registro, il loro contenuto veniva combinato mediante un'operazione booleana di OR e il risultato utilizzato per decrementare l'indirizzo base. Questo meccanismo venne mantenuto anche nelle macchine ad architettura scientifica successive come l'IBM 709 e IBM 7090 fino all'IBM 7094. Quest'ultimo, introdotto nel 1962, possedeva sette registri indice di cui veniva selezionato uno solo per volta ma manteneva il meccanismo dell'"OR" quando usato in modalità compatibile.

### Istruzioni e formato dei dati

Erano previsti due formati di istruzione, denominati "Tipo A" e "Tipo B". La maggior parte delle istruzioni erano di tipo B.
Il formato delle istruzioni di Tipo A prevedeva, in sequenza, un prefisso di tre bit (codice di istruzione), un campo di decremento a 15 bit, un campo tag di tre bit e un campo indirizzo di 15 bit. Vi erano operazioni di salto condizionale basate sul valore dei registri indice specificato nel campo tag. Alcune istruzioni prevedevano di sottrarre il campo decremento dal contenuto dei registri indice. Le istruzioni di tipo A erano contraddistinte dall'avere gli ultimi due bit del codice dell'istruzione diversi da "00": da questo risulta che i codici di istruzione di tipo A erano in tutto sei, corrispondenti ai codici binari "001", "010", "011", "101", "110" e "111". Una di esse ("STR", codice di istruzione binario "101") fu implementata solo a partire dall'IBM 709.
Le istruzioni di Tipo B erano composte, in sequenza, da un codice di istruzione a 12 bit, con il secondo e il terzo bit fissi a zero per distinguerle dal tipo A (i relativi codici di istruzione quindi iniziavano sempre con "000" o "100"), un campo flag a 2 bit, quattro bit non utilizzati, un campo tag a 3 bit e un campo indirizzo a 15 bit. Con questa struttura venivano quindi gestiti fino a 1024 codici di istruzione differenti.
Per quanto riguarda i dati:
* I numeri a virgola fissa erano memorizzati in formato binario segno-valore
* I numeri a virgola mobile in precisione singola erano memorizzati come segno, esponente di 2 rappresentato su 8 bit con segno in formato "excess-128" (esponente variabile da -126 a +127) e valore della mantissa su 27 bit
* I caratteri alfanumerici usavano una codifica di tipo BCD a 6-bit, con 6 caratteri memorizzati per ogni parola.
Il set di istruzioni suddivide implicitamente il formato dei dati negli stessi campi delle istruzioni di tipo A: prefisso, decremento, tag e indirizzo. Erano previste istruzioni per convertire ciascuno di questi campi in una parola dati senza cambiare il resto della parola.
L'implementazione originale del Lisp usava i campi indirizzo e decremento per memorizzare, rispettivamente, la testa e la coda di una lista concatenata. Le funzioni primitive "car" (contenuto della parte indirizzi del registro) e "cdr" (contenuto della parte decremento del registro) hanno preso il loro nome proprio da questi campi.

### Memoria e periferiche

Il 704 era in grado di controllare: un lettore di schede perforate IBM 711; una stampante alfanumerica IBM 716; un registratore di schede perforate IBM 721; cinque unità a nastro magnetico IBM 727 associate a un'unità di controllo nastri IMB 753; una unità di lettura/scrittura su memoria a tamburo IBM 733 e un'unità di memoria a nucleo magnetico IBM 737. L'installazione completa aveva un peso complessivo di 8,8 t.
Di suo, l'IBM 794 era dotato di una console di controllo con 36 tasti di controllo vari e 36 interruttori di ingresso, ciascuno in grado di impostare un bit di un registro. In termini di input, la console consentiva soltanto di impostare il valore binario di un registro tramite i 36 interruttori; il valore binario assunto dal registro veniva visualizzato su un display costituito da piccoli tubi al neon, con aspetto simile a quello di un moderno display a LED. L'interazione con l'operatore umano avveniva tramite schede perforate per il caricamento dei programmi, mentre l'uscita in formato leggibile veniva inviata alla stampante.
Era disponibile anche il registratore di uscita a raggi catodici IBM 780: si trattava di uno schermo vettoriale da 21 pollici (simile a quello di un oscilloscopio) con un tempo di persistenza dei fosfori molto lungo (20 secondi) dedicato alla visione umana unito a un secondo schermo più piccolo da 7 pollici, che riproduceva la stessa uscita, ma con fosfori a persistenza molto più bassa e progettato appositamente per essere ripreso da una cinepresa o da una macchina fotografica.
L'unità di memoria a nucleo magnetico 737 svolgeva la funzione di RAM ed era in grado di memorizzare 4096 parole a 36 bit, equivalenti a 18 432 byte. Le unità a nastro magnetico 727 erano in grado di immagazzinare oltre 5 milioni di caratteri a sei bit per bobina.