Apple Disk II, il capolavoro di Steve Wozniak

Nella sua autobiografia, il co-fondatore della Apple Steve Wozniak racconta la progettazione del floppy disk che contribuì al successo dell'Apple II

apple disk2 floppy drive 1978

Questo articolo è tratto dalla autobiografia di Steve Wozniak, iWoz (Norton & Co, 2007), disponibile solo in lingua inglese.

Subito dopo il rilascio dell'Apple II, alcune piccole aziende iniziavano a costruire delle schede di espansione che sfruttavano gli slot di espansione. Le schede erano relativamente facili da progettare perché avevamo fornito una completa documentazione che ne spiegava il funzionamento e l’integrazione con il nostro hardware.

Avevo incluso alcuni utili strumenti: l’Apple II aveva un piccolo sistema operativo a cui gli sviluppatori potevano accedere e lanciare dei facili software di debug che avevo scritto io stesso. Come progettare una scheda per interfacciare una stampante e farla funzionare con un Apple II? Come progettare una scheda per uno scanner o un plotter? Era tutto talmente ben documentato che ad un anno dal lancio, nel giugno successivo, erano improvvisamente spuntati una serie di prodotti e accessori venduti da altre ditte.

Chi voleva progettare una scheda di espansione, non doveva realizzare solo la scheda ma anche scrivere un piccolo programma — un driver che avrebbe permesso al computer di comunicare con la specifica periferica. Questi programmi dovevano essere contenuti in chip ROM o PROM sulla scheda di espansione che venivano letti ad indirizzi predeterminati per gli otto diversi slot di espansione.
Il programma poteva occupare 256 byte, la capienza di un chip PROM, ma ogni slot aveva a disposizione altri 2Kb di spazio per ospitare un maggior quantitativo di codice. Questo secondo indirizzo di memoria era a disposizione di ogni scheda, così, per utilizzarla, era necessario un apposito circuito che riconosceva quale scheda era in uso. Altrimenti, se i 2Kb di indirizzi erano sfruttati da più schede di espansione, queste avrebbero potuto mandare contemporaneamente dei dati al processore e si sarebbe verificato un conflitto.
Ogni scheda aveva inoltre 16 indirizzi prefissati dedicati al controllo dei dispositivi hardware. C’erano così tante opzioni disponibili per i progettisti di schede di espansione che, almeno nella maggior parte dei casi, vennero presentate delle soluzioni davvero originali, proprio come volevo che fosse.

Le riviste di computer erano piene di pubblicità di prodotti hardware e software dedicati all’Apple II. Improvvisamente il nome dell’Apple II comparve dappertutto. Noi avremmo potuto fare del tutto a meno di acquistare insersioni pubblicitarie per far circolare il nostro nome. Grazie all’industria del software e dei dispositivi hardware dedicati, diventammo presto conosciutissimi. Eravamo sulla cresta dell’onda, e tutte le riviste, anche quelle generaliste, cominciarono a scrivere grandi cose su di noi.
Questo fu di grande spinta, superiore a qualsiasi tipo di pubblicità che potesse essere comprata.

Come dicevo, l’Apple II usava un registratore a cassette per leggere e scrivere i dati. Non avevo mai usato un floppy disk in vita mia. Ne conoscevo l’esistenza, sapevo che poteva essere acquistato come accessorio per altri computer come l’Altair e che era comunemente usato dai costosi minicomputer dell’epoca. Questi floppy disk erano tutti nel formato grande, da otto pollici. Gli otto pollici si riferiscono infatti alle dimensioni del diametro del disco magnetico.
Ogni floppy disk poteva contenere circa 100kb di dati, non molto rispetto agli standard attuali. In totale sono solo 100.000 caratteri. Ma durante una riunione Mike Markkula mi disse che avremmo dovuto assolutamente dotare l’Apple II di un floppy disk. Si era veramente stufato di aspettare ogni volta che caricava da cassetta il suo programmino di contabilità.

Un floppy disk, poichè girava con una velocità nettamente superiore e immagazzinava i dati con una maggiore densità, avrebbe caricato il suo programma molto più rapidamente. Per comprendere le proporzioni, un computer poteva leggere 1000 bit al secondo da una cassetta, mentre arrivava fino a 100.000 bit al secondo da un floppy. Sapevo che stavano organizzando il Consumer Electronics Show (CES) a Las Vegas, l'edizione invernale del 1978. Sarebbe stato il primo CES in cui le aziende presentavano dei personal computer, e per la Apple sarebbero andati là solo alcuni responsabili del marketing. Chiesi a Mike, nel caso in cui avessi finito in tempo il floppy drive, se potevo andare anch’io a Las Vegas per la fiera. Egli acconsentì. In pratica avevo solo due settimane di tempo per costruire un lettore di floppy disk per l’Apple II, un dispositivo che non avevo mai usato prima e neanche visto in funzione, ma avevo questa sorta di motivazione artificiale (artificiale, perchè ovviamente sarei potuto andare comunque a Las Vegas se avessi voluto) per provare a stupire di nuovo la gente lì alla Apple.

Lavorai notte e giorno durante tutte le feste di Natale e Capodanno per riuscire a completare l’impresa. Randy Wiggington, che all’epoca era ancora un liceale dell’Homestead High, la stessa scuola che Steve ed io avevamo frequentato, mi fu di grande aiuto su quel progetto. Come punto di partenza, Steve mi disse che un’azienda chiamata Shugart, che era il principale produttore di floppy disk in quel tempo, stava per presentare un nuovo formato da 5 pollici. (Alan Shugart aveva inventato il floppy disk diversi anni prima, quando lavorava in IBM) Steve era sempre attento alle nuove tecnologie e aveva un fiuto particolare per quelle che avevano un vantaggio competitivo e che si sarebbero potute affermare come standard del settore, e questo era proprio il tipico esempio.

Mi fece avere uno dei nuovi drive Shugart da 5.25 pollici, così cercai di capire se mi riusciva di farlo funzionare con un Apple II. Ciò che dovevo fare era progettare un controller — una scheda da inserire in uno slot dell’Apple II — che permetteva di leggere e scrivere i dati sul floppy. La prima cosa che feci fu esaminare il drive e la sua circuiteria di controllo per capire come funzionava. Studiai la documentazione e analizzai attentamente l’elettronica del drive Shugart.

In pratica c’era un connettore e un protocollo di segnali che venivano usati per leggere e scrivere i dati. Alla fine giunsi alla conclusione che dei ventidue chip presenti, circa venti non erano necessari. Per far funzionare il floppy disk usai il circuito del drive Shugart modificandolo secondo il mio design. Con il mio solito approccio, rimossi venti dei loro chip riducendo notevolmente la complessità del prodotto finale. Potevo leggere e scrivere i dati inviandoli alla testina usando per i segnali di start e stop un qualsiasi protocollo implementato via software dal computer. A dir la verità era molto più semplice gestire tutto dal codice piuttosto che usare il contorto sistema scelto da Shugart.
Iniziai a progettare un circuito molto semplice in grado di effettuare le operazioni basilari di lettura e scrittura sul floppy disk. Si rivelò una vera e propria sfida. Per interfacciare il registratore a cassette, avevo un segnale che variava costantemente con l’andamento alto-basso, basso-alto. Il segnale non poteva essere stoppato quando la cassetta stava girando. Il circuito che gestiva i segnali del registratore non era progettato per gestire il comando di stop. E anche il nastro magnetico della cassetta non era il tipo di supporto che consentiva ad un segnale di rimanere sulla stessa frequenza molto a lungo.

I dati in input e in output dovevano essere scritti ad intervalli di tempo sincronizzati con la frequenza del microprocessore. Stabilii che la frequenza con cui erano memorizzati i dati su cassetta doveva stare fra i 1000 e i 2000 hertz. Questa corrispondeva alla tipica frequenza della voce, poichè le cassette erano nate per registrare e riprodurre questo genere di frequenze. L’intervallo di tempo fra due picchi del segnale (alto-basso-alto) corrisponde approssimativamente ad un millesimo di secondo. Ma il floppy disk lavorava ad una frequenza nettamente maggiore ed erano necessari intervalli di tempo molto più brevi per gestire i segnali, da quattro a otto microsecondi (milionesimi di secondo). Il mio microprocessore non poteva generare questi timing, erano troppo veloci. Infatti il MOS 6502 all’interno dell’Apple II aveva la velocità di clock di 1 Mhz. La più veloce delle istruzioni impiegava due microsecondi e per generare i timing necessari ne servivano molte di più. Era un bel problema. Ma fortunatamente trovai una soluzione.

L’Apple II poteva leggere e scrivere byte di dati sulle schede presenti negli otto slot di espansione, e poteva farlo in maniera molto efficiente. Così pensai di inviare 8 bit (che corrispondono a un byte) di dati al controller del floppy, che avrebbe pensato autonomamente a spare questi bit ogni quattro microsecondi, un bit alla volta. Il codice di 8 bit conteneva solo 4 bit di dati reali. Usavo una tabella di appoggio per fare questa operazione in modo efficiente. Anche così, pur usando un programma con tutte le ottimizzazioni possibili, era davvero arduo mantenere la giusta frequenza.
Dovevo calcolare l’esatto numero di cicli di clock, in microsecondi, per ogni passaggio. Quando inviavo 8 bit di dati al controller, esattamente ogni 32 microsecondi, l’operazione doveva avvenire alla esatta frequenza in modo che i dati potessero essere effettivamente scritti sul floppy. Non aveva importanza cosa facesse il mio programma, quante istruzioni usasse, quanti loop, le risorse a cui attingeva, l’importante era che inviasse i dati ogni 32 microsecondi, quando il successivo blocco di dati doveva essere scritto.

Ottenere questo livello di precisione dei timing è un lavoro software che può riuscire solo a chi ne mastica di hardware. I programmatori puri, quelli che si occupano solo di software, spesso ignorano questo tipo di problemi. Era una parte molto delicata. Anche un piccolo cambiamento nel microprocessore poteva compromettere tutto. Ad esempio, se fosse uscita una versione del 6502 che impiegava tre microsecondi invece di quattro per eseguire una determinata istruzione, avrebbe sballato tutti i miei calcoli per ottenere i timing necessari al funzionamento del controller.

La circuiteria di controllo sul drive non doveva far altro che accettare 8 bit e trasferirli sul floppy disk attraverso una testina magnetica, nello stesso modo in cui erano scritti i dati su una cassetta. Questa era la parte semplice. Per salvare i dati sul floppy era usato un registro a 8-bit (shift register) che faceva scorrere i dati ogni quattro microsecondi. Era andare nell’altra direzione, leggere i dati dal floppy, che era molto più difficile. Mi venne l’idea di creare un piccolo processore per implementare una cosidetta macchina a stati.
Impiegai solo due chip per realizzarla: un registro a 6-bit e una PROM. Alcuni bit contenuti nel registro corrispondevano ad un particolare “stato” che la macchina poteva assumere. Questi bit puntavano ad un indirizzo nella PROM. La PROM avrebbe letto dal registro lo stato corrente della macchina e i bit di dati dal floppy disk.

Ogni microsecondo, la EPROM mandava in output il numero di stato (che poteva essere uguale al precedente) e una coppia di bit che controllavano il registro a 8- bit. In pratica, questa piccola macchina a stati analizzava ogni microsecondo i dati inviati dal floppy e li salvava in un registro a 8-bit, da non confondere con l’atro registro che conteneva gli stati della macchina. Dovevo inviare alla PROM della macchina a stati la corretta sequenza di 0 e 1 che indicavano le azioni che dovevano essere eseguite. Questo era più difficile che scrivere un comune programma, perchè ogni singolo bit nella PROM aveva un significato ben preciso. Quando completai la macchina a stati ero sicuro che avrebbe funzionato. Era elegante, tutto il progetto era elegante, ne ero molto fiero.

A questo punto, un flusso di bit fluiva dal floppy disk, ogni otto microsecondi il floppy inviava i dati al mio controller, ma dovevo essere in grado di determinare da quale 0 o 1 iniziava il byte. (Ricorda che servono 8 bit per fare un byte). Non riuscivo a trovare il modo di risolvere questo problema. Poi mi accorsi che esistevano alcune particolari combinazioni di bit che potevano essere scritte nel floppy disk ma che non corrispondevano a dei dati reali. Annotai sedici di queste combinazioni di bit e quando una di queste era letta nella mia macchina a stati, faceva shiftare il registro per allinearsi automaticamente alla posizione in cui iniziava il byte di informazioni significative. Quindi il mio programma di lettura sul computer cercava in continuazione la coppia di byte, i cosiddetti “mark bytes”, che individuavano l’inizio di una piccola porzione di dati chiamata “settore”.

Oltre ai dati, per ogni settore, scrivevo sul floppy anche un marcatore che identificava il settore stesso in modo che il programma di lettura poteva effettuare dei controlli sui dati letti, ed eventualmente ripetere la lettura se si verificava un errore in un particolare settore. Mi occupai della parte hardware del floppy e del software che leggeva e scriveva i dati ad intervalli temporizzati. Questo fu il mio pezzo forte. Randy Wiggington scrisse una routine a livello più alto, un software che comunicava con il sistema operativo, più rivolto ai programmatori che sviluppavano applicazioni.

Dopo essere riuscito a leggere e scrivere i dati, scrissi una routine per spostare la testina in ognuno dei trentasei settori del disco. La testina rimaneva nella posizione di riposo sulla traccia 0, la traccia più interna. Poi davo una serie di impulsi per avviare la meccanica che spostava la testina sulla traccia 1, sulla traccia 2 e così via, fino a raggiungere il punto esatto in cui era necessario portarla per avere accesso ai dati richiesti. Secondo le specifiche del drive Shugart, era necessario un certo tempo per spostare la testina nel punto desiderato. Far muovere quella testina era come guidare una macchina pesante. Era l’inerzia che ne caratterizzava il moto. Era lenta ad avviarsi, ma una volta partita, quando iniziava a girare grazie alla forza di inerzia, bastava dargli un piccolo impulso per farla accelerare ulteriormente.

Decisi che avrei potuto sfruttare questo principio per rendere il floppy disk più veloce. Facevo accelerare la testina quando si muoveva verso le tracce più esterne, poi la facevo decelerare per non farle superare l’ultimo settore. Se anche fosse successo ero comunque in grado di leggere il numero del settore e tornare indietro. Feci un po’ di esperimenti e scrissi una tabella di accelerazione/decelerazione in cui, rispettando i timing, assegnavo alla testina velocità di rotazione diverse in base alla posizione da raggiungere e il tutto funzionava egregiamente. Come effetto risultante, invece di un rumore click-click-click come il tamburo di una pistola, veniva prodotto un piacevole suono whoosh, più simile ad un vortice.

Grazie a questa caratteristica il nostro floppy drive aveva il tempo di accesso più rapido di tutta l’industria. Realizzarlo è stato tremendamente complicato, una vera sfida. Ma di fatto era costituito solo da poche parti. È stata una di quelle cose che non sai se sono realmente possibili finchè non metti in pratica la tua idea. Sono consapevole che è difficile spiegare questi aspetti puramente tecnici, suonano piuttosto complicati, ma ho voluto comunque trattare l’argomento perchè ancora oggi gli ingegneri mi fanno i complimenti dicendo quanto fosse geniale quel controller che avevo realizzato per il floppy. E ci impiegai solo due settimane. Ora sapete com’è andata.

Il codice era già sviluppato al punto da poter digitare "R Checkbook" per caricare il programma di contabilità o "R Color Math" per caricare il programma didattico. Con solo due settimane a disposizione non eravamo riusciti a gestire il floppy disk da sistema operativo, avevamo scritto una semplice tabella sul disco in cui avevamo riportato quali erano i numeri dei settori occupati da ogni programma. Di solito un sistema operativo legge l’indice di tutto il disco e quando un utente richiede “Color Math” ricava dall’indice la lista dei settori occupati da quel programma. Il giorno in cui avevamo il volo per Las Vegas, questa funzionalità non era stata ancora implementata, ma Randy ed io eravamo sicuri che una volta arrivati là avremmo potuto farcela con poche ore di lavoro.

Così prendemmo l’aereo a San Jose diretti a Las Vegas. Io e Randy non ci dimenticheremo mai quella notte. Era la prima volta che vedevamo le luci di Las Vegas. Ne rimanemmo impressionati. Non era sfarzosa come oggi, gli hotel non erano così lussuosi, anzi, la maggior parte erano piuttosto modesti. Ma era comunque impressionante. Non avevamo mai visto nulla del genere, questo è certo! Il nostro motel era il posto più pidocchioso della città, il Villa Roma. Era vicino Circus Circus e da lì era facile raggiungere il Convention Center di Las Vegas. Fu una notte lunga. Randy, che all’epoca aveva solo diaciassette anni, voleva andare al casinò, gli insegnai a giocare con alcune di quelle cavolate e vinse pure qualcosa come $35.

A tarda notte passammo al centro convegni, dove stavano ancora finendo di allestire gli stand. Ci sistemammo nella nostra postazione e andammo avanti a lavorare fino alle 6 di mattina, finchè tutto funzionava a dovere. A quel punto fui autore di una vera genialata. Ero stanco e avevo bisogno di dormire ma pensai che prima fosse saggio fare un back-up di quei dati su un floppy disk. Avevo un programmino che mi permetteva di leggere e scrivere intere tracce. Il floppy disk aveva trentasei tracce. Decisi di fare una copia di quel floppy disk che aveva lavorato così a lungo e che era stato così difficile da preparare.
Avevo con me solo due floppy e decisi semplicemente di copiare quello buono sull’altro vuoto. Inserii il floppy buono e digitai qualche comando per fargli leggere la traccia 0. Poi misi quello vuoto e usai quei dati per far scrivere la traccia 0 su di esso. Ripetei la stessa sequenza per tutte e trentasei le tracce. Fare il back-up è una cosa saggia da fare, lo dico sempre. Ma quando terminai quel back-up, guardai meglio i due floppy senza etichetta e fui assalito da un sentimento di frustrazione. Compiendo quell’operazione meccanicamente avevo confuso i due dischi e avevo sovrascritto quello buono, perdendo tutti i dati.

Dopo un rapido test fu subito evidente ciò che avevo combinato. Queste cose succedono quando si è estremamente stanchi. La mia buona idea aveva prodotto un pessimo risultato. Ormai era tardi ed eravamo troppi stanchi per avere un floppy funzionante da mostrare al CES che sarebbe dovuto cominciare da lì a poche ore. Che disdetta. Ce ne tornammo a dormire al motel Villa Roma. Verso le 10 ci svegliammo e ci rimettemmo subito al lavoro. Volevamo provare a rimettere insieme un qualcosa di funzionante. Avevo ancora in testa tutto il codice. Verso mezzogiorno avevamo già ricostruito tutto ed eravamo pronti per mostrarlo nel nostro stand. Collegammo il floppy ed iniziammo la dimostrazione. Il successo fu clamoroso, in particolar modo se confrontato con le attenzioni dedicate al Commodore PET e al Radio Shack TRS-80, anch'essi presenti al CES.
Il floppy drive fu messo in produzione nel corso del 1978 con il nome di Apple Disk II al costo di $595.

Il floppy disk rendeva il computer più veloce, ma fu un programma chiamato VisiCalc a mostrare a tutti quanto fosse potente. Due ragazzi di Boston, Bob Frankston e Dan Bricklin, lavorarono a stretto contatto con Mike Markkula per realizzarlo. E si dimostrò veramente il prodotto giusto al momento giusto! Fu il programma che consacrò definitivamente la nostra macchina. VisiCalc era un software di previsione finanziaria progettato per rispondere alle domanda "cosa succede se..." facendo variare i possibili scenari. Per esempio, se ricaviamo $100.000 dalla vendita del prodotto X, quale sarà il nostro guadagno? E se ne vendiamo la metà? Fu il primo foglio elettronico disponibile per personal computer, uno strumento hi-tech potentissimo nelle mani di persone comuni che lavoravano nel settore finanziario. VisiCalc era disponibile solo per Apple II.
Solo il nostro computer aveva RAM sufficiente per farlo girare. Il Radio Shack TRS-80 e il Commodore PET non erano abbastanza potenti da supportarlo. Noi avevamo la RAM e la modalità grafica ad alta risoluzione. VisiCalc non uscì su cassetta ma esclusivamente su floppy disk. Tutto sembrava sposarsi alla perfezione.

Il nostro giro d'affari esplose quando fu rilasciato VisiCalc. Il mercato dell'Apple II improvvisamente si spostò dagli hobbysti e dai videogiocatori, che non badavano troppo al fatto che i loro programmi impiegassero qualche minuto per caricarsi da cassetta, agli utenti business che potevano caricare VisiCalc quasi istantaneamente. Nel giro di un paio di mesi, il settore business copriva il 90% del mercato. All'inizio non avevamo minimamente considerato questo tipo di utenza, ma fece imboccare ad Apple una strada del tutto nuova. Da 1000 unità al mese schizzammo a 10.000 unità al mese. Avvenne tutto così in fretta. Durante il 1978 e il 1979 il successo cresceva in modo inarrestabile.
Nel 1980 fummo la prima azienda a raggiungere il traguardo di un milione di computer venduti. Quando ci quotammo in borsa, l'offerta pubblica di acquisto di azioni Apple fu così elevata da come non si vedeva dai tempi di Ford. Nella storia, mai così tante persone erano diventate milionarie in un solo giorno. Credo che la ragione di tutto questo sia da attribuire ad una combinazione di cose: l'Apple II, VisiCalc e il floppy disk.



ARTICOLI CORRELATI
La genesi dell'Apple I raccontata da Steve Wozniak
Steve Wozniak all'Homebrew Computer Club
Zaltair, lo scherzo clamoroso di Steve Wozniak
Frog Design prototipi Apple
Biancaneve Design, l’eleganza veste i computer Apple
Il Newton e l'errore dei PowerPC
La Pepsi Generation e il lifestyle marketing
La filosofia di Steve Jobs
Hartmut Esslinger, il design fra innovazione e business
La migliore custodia per iPhone 7/7s e 8/8s