Valutazione attuale:  / 1
ScarsoOttimo 

Il 1401 IBM

L'hardware . . .

Il 1401 era una macchina molto diversa dal 7070 non tanto per la tecnologia hardware usata, che rimaneva quella realizzata con schede inserite negli appositi backplanes e con collegamenti di tipo wire-up, quanto per la rappresentazione ed il trattamento dei dati in memoria e per il set di istruzioni completamente diverso.

La macchina era sta progettata sia per essere un calcolatore elettronico autonomo destinato ad aziende di modeste dimensioni, sia per fare da "servente" agli elaboratori più grandi e potenti, quale ad esempio il 7070.

Per questo uso infatti il Banco di Napoli aveva fatto installare nel suo centro elettronico due di queste macchine, le quali avevano soltanto il compito di manipolare l'input e l'output dei dati da inviare e da ricevere dal 7070.

La memoria centrale dei nostri due piccoli 1401 era di appena 2000 caratteri (ancora il byte non era apparso) e solo qualche mese dopo fu portato a 4000; ogni carattere era rappresentato in memoria in maniera completamente diversa dal 7070, qui non esistevano le word e ogni carattere era rappresentato esattamente come sui nastri magnetici e cioè secondo il codice BCD; questo rendeva più facile all'hardware il compito di leggere e scrivere; per il programmatore rimaneva però il fastidioso compito di eliminare in lettura e di inserire in scrittura il carattere DELTA, se il nastro proveniva o era destinato al 7070.

Dunque ogni carattere era rappresentato nella memoria centrale del 1401 da sette bits (compreso quello della parità), ma in più qui vi era un'altro bit aggiuntivo (chiamato word-mark) che non veniva mai letto o scritto su nastro e che poteva essere settato e resettato da apposite istruzioni; come diceva il suo nome la word mark serviva a delimitare un campo, cioè un insieme di bytes su cui si desiderava operare.

La generica istruzione di macchina del 1401 era di lunghezza variabile nel senso che ogni istruzione aveva la sua lunghezza; nelle istruzioni era ovviamente sempre presente l'indirizzo del dato su cui occorreva operare, ma non vi era mai indicata una lunghezza; le istruzioni puntavano al carattere di estrema destra del campo da manipolare e il termine del campo (andando all'indietro) era indicato dalla presenza di una word mark.

Questo sistema dava la possibilità alle istruzioni di agire su campi di qualunque lunghezza; gli spostamenti erano sempre effettuati all'indietro e cioè dalla posizione di ordine basso del campo fino a quella di ordine più alto segnato dalla presenza della word mark; i campi potevano essere raggruppati o spezzati a run time semplicemente resettando e settando le word mark; esistevano istruzioni di MOVE che spostavano il dato fermandosi all'incontro della prima word mark presente nel campo di input o in quello di output e istruzioni di LOAD che interrompevano il trasferimento soltanto quando veniva incontrata la word mark del campo di input, queste istruzioni provvedevano a ricopiare nell'output anche la word mark e, durante il trasferimento, "spazzavano via" ogni eventuale word mark già presente.

Nella memoria del 1401 c'erano ad un indirizzo ben preciso due aree di memoria (una di 80 caratteri ed una di 132 caratteri) che servivano ad un uso particolare, la prima era l'area in cui il lettore di schede trasferiva il contenuto di ogni scheda letta, la seconda invece era la zona che doveva essere riempita con le righe di stampa; per leggere una scheda bisgnava quindi eseguire l'apposita istruzione che comandava il lettore a leggere e poi andare a prelevare con istruzioni di MOVE i dati ormai presenti nell'area di lettura; per stampare invece si preparava con una serie di MOVE l'area di stampa e poi si eseguiva l'istruzione che comandava la stampatrice a stampare su una riga il suo contenuto.

Anche se la tecnica di gestione dei dati nel 1401 era più evoluta di quella del 7070, la sua architettura era molto più semplice e non esisteva nessun meccanismo che potesse consentire una sia pur semplice multiprogrammazione; non esistendo alcun meccanismo di gestione degli interrupts, ogni operazione di lettura e scrittura sia delle periferiche a nastro sia delle periferiche lente manteneva la CPU in attesa fino al suo completamento.

Per la gestione della macchina non esistema una console come quella del 7070, ma sulla parte anteriore dell'armadio dell'unità centrale erano disposti una serie di tasti luminosi, di switches e di lucette a filamento che indicavano lo stato della macchina; tra i vari switches erano presenti una serie di "alteration switches" che potevano stare in posizione ON o OFF, questi switches potevano essere eaminati da programma e potevano servire per far comportare il programma in maniera diversa a seconda del loro posizionamento; l'operatore poteva quindi influenzare il comportamento del programma impostando opportunamente gli alteration switches.

Altri switches consentivano di interrogare e far visualizzare su apposite lucette il contenuto della memoria e anche di alterare la stessa.

C'era poi un tasto (a nome PROCESS) che ogni programmatore avrebbe voluto vedere sempre spento, infatti esso si accendeva quando un'istruzione andava in errore per un qualche motivo; la macchina si bloccava all'indirizzo in errore ed utilizzando i vari switches disponibili si indagava sul motivo, poi eventualmente si correggeva l'istruzione modificando il suo codice assoluto e si riprendeva l'elaborazione da quel punto o da un punto diverso del programma.

 

Curiosità
Ricordo che durante la stampa degli estratti conto trimestrali, stampa che impegnava contemporaneamente entrambi i 1401 e che per la grossa mole di dati durava intere giornate, un programma realizzato da me, dopo ore di lavoro, si bloccava con il fatidico tasto di PROCESS acceso; dall'esame dei dati in memoria non ero riuscito a in nessun modo a trovare alcun errore nel codice anche se avevo un fondato sospetto che la cosa non dipendesse da me; non ero però riuscito a convincere nessun tecnico di manutenzione della IBM ad esaminare la cosa perchè tutti loro (anche con una punta di sarcasmo) erano convinti che il problema dipendesse dal mio software, e questo anche per il fatto che si presentava su entrambe le macchine; devo dire che a questa loro osservazione non sapevo opporre alcuna giustificazione, per cui continuai a lungo nella ricerca; ero convinto che il problema riguardava i dati provenienti dal nastro che infatti avrebbero potuto provocare quell'errore con un record più lungo del previsto, ma avevo anche verificato che invece l'input era perfetto; mi resi conto allora che l'unico "essere" che avrebbe potuto scoprire il motivo dell'anomalia non era altro che il computer stesso; preparai quindi una "trappola di programma" scrivendo alcune istruzioni subito dopo la lettura di ogni record, queste istruzioni imponevano al programma di fermarsi nell'ipotesi la lunghezza del record letto fosse stata maggiore degli 80 caratteri previsti; riavviai il programma e dopo alcune ore, con mia grande soddisfazione vidi illuminarsi un tasto rosso e la macchina si fermò; dopo aver chiamato a raccolta i tecnici ella IBM, esaminai immediatamente la situazione e riuscire a dimostrare loro che il record appena letto aveva una lunghezza di 81 caratteri e non di 80; con un comando mandai indietro il nastro di un record e lo feci rileggere e con grande stupore tutti dovettero ammettere che questa volta il record era stao letto per 80 caratteri; sul viso dei tecnici era chiaro lo smarrimento, mentre io me ne tornavo alla mia scrivania trionfante; i tecnici cominciarono ad annaspare nel buio più assoluto, quando improvvisamente arrivò loro una notizia sensazionale che dette a me ancora più soddisfazione: la IBM mondiale segnalava a tutti i settori tecnici che per un errore di progettazione, il raffreddamanto di certe parti della macchina era insufficiente e si suggeriva quindi di installare una nuova ventola di raffredamento in un posto determinato; veniva anche chiarito che l'inconveniente che si poteva verificare nel caso di surriscaldamento di quella parte di macchina, era la generazione non sollecitata di uno ZERO durante la lettura di un record !!! L'accaduto fece scalpore e da quel momento i tecnici IBM non ebbero mai più il coraggio di trascurare le mie richieste di intervento. 
 

 

. . . e il software

In questa macchina il software era assolutamente inesistente ed ogni istruzione necessaria al suo funzionamento doveva essere stata scritta da noi programmatori.

In particolare per l'input e output il programmatore si doveva fare carico di scrivere per ogni operazione la necessaria routine da eseguire in caso di errore.

Anche il 1401 veniva programmato nel suo assembler e il suo assemblatore si chiamava SPS (Symbolic Programming System).

Il nostro primo 1401 aveva una memoria di solo 2000 caratteri; poichè anche per il 1401 il processo di assemblaggio era piuttosto lungo, spesso le correzioni venivano fatte modificando direttamente il codice oggetto in memoria; poichè la lunghezza delle istruzioni era variabile, spesso era necessario sostituire un gruppo di istruzioni con un altro gruppo che complessivamente impegnavano un numero di caratteri diverso ed allora:

  • Se il numero di caratteri delle nuove istruzioni era maggiore di quello impegnato dalla vecchia routine occorreva inserire un'istruzione di salto che rimandava il programma ad un indirizzo di memoria libero; a quell'indirizzo venivano scritte di seguito tutte le nuove istruzioni e alla fine con un'altra istruzione di salto si rimandava il programma a continuare con le istruzioni successive.
  • Se invece lo spazio impegnato dalle nuove istruzioni era minore di quello impegnato dalle vecchie, le nuove istruzioni venivano scritte ricoprendo parte delle vecchie; alla fine di queste ultime rimaneva però uno spazio che divideva l'ultima nuova istruzione scritta dalla prima istruzione valida preesistente e il programma non avrebbe potuto funzionare se non riempiendo quel "vuoto" con qualcosa di eseguibile; è per questo motivo che il 1401 era dotato di un'istruzione lunga un carattere a nome NOP (No Operation); una serie di queste istruzioni poste nel "vuoto" citato prima risolceva egregiamente il problema.
Curiosità 
Far entrare un programma anche semplice in solo 2000 posizioni di memoria era sempre un'impresa piuttosto ardua; ricordo che un giorno il mio collega Aurelio mi disse: Franco ho finito di scrivere il programma ed occupa 1999 posizioni di memoria: nella posizione 2000 ci ho messo un No Operation !!!

 

Una realizzazione particolare

Nel 1401 i programmi venivano normalmente caricati da schede, ma volendo era possibile anche leggere un programma da nastro, semplicemente premendo un tasto opportuno; era scomodo ed antieconomico però tenere ogni programma su una bobina di nastro diversa, anche perchè un programma per un 1401 anche con memoria di 4000 era costituito appunto al massimo da 4000 caratteri; pensai allora di mettere su un solo nastro tutti i programmi disponibili e di realizzare un programma capace di scegliere e caricare quello desiderato; il programma di ricerca doveva essere naturalmente presente come primo programma su nastro; alla pressione dell'apposito tasto di caricamento da nastro, veniva caricato il programma di ricerca che poi avrebbe dovuto provvedere a cercare il programma desiderato e lo avrebbe dovuto caricare in memoria; i problemi da superare però erano due: bisognava evitare che il programma di ricerca fosse ricoperto durante il caricamento da quello scelto e occorreva in qualche modo comunicare quale era il programma che si desiderava caricare; per risolvere il primo problema decisi di usare l'area di stampa che sicuramente sarebbe stata lasciata libera da tutti i programmatori (e riuscii a farlo utilizzando soltanto i 132 caratteri disponibili); per comunicare il programma da caricare decisi di far impostare il numero del programma in una locazione sempre dell'area di stampa con l'uso degli appositi switches; la cosa funzionò perfettamente e da allora il caricamento dei programmi fu molto più comodo. 

 

Torna all'indice