L’Olivetti P602 fu la terza macchina della “serie P” Olivetti, dopo la leggendaria P101, a cui possiamo assimilare la P102, e la P203, che era collegata a una macchina da scrivere per uso fatturatrice. Poca documentazione è disponibile su questa interessante macchina, ho deciso dunque di scrivere questo articolo sintetizzando le funzioni principali del calcolatore, le sue capacità e il suo set di istruzioni così da favorire qualsiasi successiva ricerca.

P602

Storia

Olivetti, con la sua P101, aprì effettivamente il mercato dei calcolatori da tavolo, prima appannaggio di alcune piccole aziende americane che creavano prodotti o non completamente programmabili (come la Mathatron) o con varie peculiarità (come il LOCI-2). Tuttavia venne presto superata dal mercato americano, specie da HP, che rilasciò l’HP 9100, un prodotto differente dalla P101 nella programmabilità (era una macchina a notazione polacca inversa, non programmabile in assembly) ma più potente, con più periferiche disponibili e, soprattutto, con una ROM con varie funzioni matematiche, che sulla P101 andavano lette da scheda. Ciò che sulla P101 richiedeva una cartolina magnetica sull’HP 9100 si faceva premendo un bottone.

La risposta dell’azienda eporediese non si fece attendere: nel 1971 venne rilasciata l’Olivetti P602, una macchina concettualmente simile alla Perottina ma più potente, con un numero maggiore di registri per poter ospitare più dati o istruzioni, la possibilità di avere una ROM matematica paragonabile a quella HP e molte più periferiche disponibili, tra cui lettori e perforatori di nastro e anche la possibilità di usare un nastro magnetico.

Nel 1972 venne rilasciata l’Olivetti P603, che era interfacciata permanentemente ad una macchina per scrivere per essere utilizzata come fatturatrice. Proprio per questa ragione non era venduta con la ROM matematica, che era comunque disponibile a parte.

Nel 1973 Olivetti rilasciò l’Olivetti P652, sistema ancor più avanzato della P602, di cui magari parleremo più avanti.

Architettura

Come già detto l’architettura della P602 (in foto, quella della P603, versione con inserita nativamente una macchina per scrivere) non era molto differente da quella della P101, che vi consiglio di approfondire in questo articolo. Restano validi i principi di divisione della memoria tra dati e istruzioni, ma è modificata la struttura dei registri.

Struttura del calcolatore come vista sul manuale della P603

Struttura della memoria

Restano dalla P101 i registri di lavoro M, A ed R, e i registri B, C, D, E ed F, e vengono aggiunti i registri RC, RD, RE ed RF. I registri di programma sono raddoppiati: dagli 1 e 2 della P101 si passa ai P1, P2, P3 e P4 della P602. Ogni registro ospita 30 cifre (o 32 istruzioni) e, escludendo quelli di lavoro, può essere diviso in mezzi (come sulla P101), ognuno da 15 cifre, o in quarti, ognuno da 7 cifre, anche in modo promiscuo (si può avere un registro diviso in una parte da 7 cifre e una da 22 cifre).

Se nella P101 i registri che possono essere adibiti a programma sono la metà della memoria intera (1, 2, F, E, D), sulla P602 è possibile utilizzare tutti i registri meno che i tre di lavoro e B. Resta possibile, in ogni caso, l’uso promiscuo dei registri, ossia utilizzare un registro destinato alle istruzioni per salvare dei dati, assicurandosi che il contatore di programma non vada mai sui dati con un saldo incondizonato, così come resta possibile la codificazione di costanti, in modo non dissimile dalla Programma 101. Per questa ragione, a mio parere, anche la P602 ha un’architettura di Harvard modificata.

Viene introdotta anche l’idea di “zone della memoria”, che possono essere cancellate in blocco con un singolo comando e collegate alla memoria esterna a nastro magnetico. Esse sono:

  1. I registri da P1 a P4
  2. I nuovi registri RC, RD, RE ed RF
  3. I registri classici C, D, E ed F

Tali zone sono operabili da cartolina magnetica e possono ospitare le istruzioni di programma. Al fine di accogliere l’aumentata memoria la cartolina magnetica è divisa in due sezioni, una composta dai registri da P1 a RE e l’altra composta dai registri da RD a C. Uno switch permette di scegliere quale sezione della memoria salvare su cartolina.

Utile da notare il fatto che le cartoline magnetiche risultano più flessibili: esiste infatti l’istruzione “/V” che ordina al calcolatore di fermare la lettura della cartolina magnetica, funzione detta “Protezione Memoria”. Anche la Programma 101 ammetteva le schede parziali, ma riguardavano sempre e solamente i registri E e D, mentre con la P602 si può scegliere con estrema precisione come e quando occupare la memoria, cosa utilissima nei programmi multischeda.

Tipi di dato

La P602 supporta, essenzialmente, tre tipi di dato:

  1. Numeri a virgola fissa, lo standard del calcolatore
  2. Numeri a virgola mobile, in base 10
  3. Dati alfanumerici

I numeri a virgola fissa, similmente alla Programma 101, son codificati in BCD e ogni posizione di un registro può ospitare una cifra.

Nel caso dei numeri a virgola mobile, invece, vengono salvati nel calcolatore come combinazione di esponente e mantissa, ed è bene notare che non si possono effettuare calcoli con le funzioni normali di calcolo ma è necessario usare apposite funzioni, prefissate da “/ *", che vengono lette dalla ROM.

I dati alfanumerici vengono utilizzati solo nei riguardi dell’interfaccia IPSO, che vedremo più avanti, e possono essere trasferiti con le funzioni normali, ma non possono essere utilizzati come operandi, poiché sono concettualmente separati dai dati numerici, tanto da necessitare di differenti funzioni di trasferimento.

Salti

I salti sono radicalmente cambiati tra la P101 e la P602. Per chi non ricordasse, la P101 offre 16 coppie di etichette per salti incondizionati e 16 per salti condizionati, la cui condizione è solamente “maggiore di 0” e, con alcuni trucchi” “uguale a 0”.

La P602, invece, utilizza un sistema radicalmente diverso: le etichette sono uniche e identificano il punto in cui “atterra” un salto, così com'è unica l’istruzione di salto. Tale istruzione è incondizionata, a meno che abbia un prefisso che può controllare tre condizioni: maggiore di zero (“A S”), uguale a zero (“R S”) o se degli “interruttori” binari sono accesi o spenti.

Tali interruttori binari sono la vera innovazione del salto nella P602: sono tre, identificati da M, A ed R (nessun legame con gli omonimi registri), e possono avere un valore “ON” e uno “OFF”. La verifica avviene con le istruzioni “/ S” per M, “a S” per A e “r S” per R e e possono essere settati in qualsiasi punto del programma con le istruzioni “/ +”, “a +” e “r +”, così come possono essere resettati con le istruzioni “/ -", “a -” e “r -". Si tratta chiaramente di un’opzione comoda, dato che permette di segnalare avvenimenti durante l’esecuzione del programma senza occupare un intero registro con un’informazione essenzialmente binaria.

Si può usare l’istruzione “B S” per verificare che siano avvenuti determinati eventi nelle periferiche, il cui significato varia da periferica a periferica. Nel caso della P603, versione fatturatrice, viene favorita la macchina da scrivere in questa verifica, ed è inoltre presente un secondo pulsante “S”, denominato “S 1”, utile allo scopo.

Similmente alla P101 le etichette di salto sono definite da un sistema di “delta” che vediamo qui sotto:

ComandoEtichetta
ΔVΔ/V
ΔWΔ/W
ΔYΔ/Y
ΔZΔ/Z

Si può ottenere un comando e la corrispondente etichetta di salto sostituendo alla delta un qualsivoglia registro. Come sulla P101 V, W, Y e Z chiamano delle routine da tastiera, ma per V non è necessario inserire la corrispondente AV - come sulla P101 - ma reindirizza direttamente il contatore di programma alla posizione 0 di P1.

È bene notare che da un punto di vista informatico qualsiasi salto condizionato equivale ad un altro, dato che basta un minimo di uso delle proprietà delle equazioni per effettuare qualsiasi test necessario. Da un punto di vista del programmatore, ovviamente, risulta molto più comoda la P602 della P101, dato che offre più etichette, più funzioni di controllo e gli interruttori binari.

Subroutine

La P602 permette anche l’uso di quattro subroutine (giustamente denominate sottoprogrammi nel manuale italiano), chiamabili da C√, D√, E√ ed F√ e identificate, in apertura e chiusura, da c√, d√, e√ ed f√. La subroutine può essere chiamata in qualsiasi punto del programma e ritorna quando termina al punto in cui è stata chiamata, ed è anche possibile chiamare una subroutine da una subroutine, mentre non è possibile saltare da una subroutine al programma “normale” e viceversa.

IPSO

L’IPSO (Interfaccia Periferiche Standard Olivetti) permette di collegare le varie periferiche alla P602 ed utilizza lo “standard ISO a 8 bit”, equivalente al primo blocco di Unicode, per comunicare. Tramite l’IPSO si possono anche inviare istruzioni, seguendo una codifica riportata nel manuale della macchina, e si possono collegare sino a quattro periferiche contemporaneamente.

È interessante notare che nella P603 la macchina per scrivere sia collegata come periferica tramite lo standard IPSO, a differenza della P203 dove era attaccata con elettromagneti, e che quindi sia a tutti gli effetti una periferica.

Tra le periferiche a disposizione vi erano plotter, lettori e perforatori di nastro e strumenti di misura, così com’era possibile produrne di propri.

Controllo delle periferiche

La P602 permette di controllare sino a quattro unità esterne, inviando loro comandi, testando eventuali condizioni sull’unità e inviando o ricevendo dati da una periferica.

Le istruzioni di I/O son costituite da due caratteri e, alle volte, richiedono un prefisso addizionale. Nel manuale della P603 viene mostrato questo sistema convenzionale (come si vede nel grafico del calcolatore a inizio articolo, si tratta di un collegamento fisico, cosa da ricordare, vista la possibilità di collegare varie periferiche, anche autocostruite) di riferirsi ai dispositivi:

  • M: macchina per scrivere (input)
  • B: lettore a nastro (input)
  • C: macchina per scrivere (output)
  • D: punzonatore a nastro (output)
  • E: output in combinazione su nastro e su macchina per scrivere

La P602 può inviare in output dati numerici, alfanumerici e di programma con vari tipi di istruzione, trattati alle pagine 65-67 del manuale della P603 linkato in fondo. Nel modello P603 è sempre possibile inviare vari comandi alla macchina per scrivere che permettono di manipolare la posizione del carrello, il colore utilizzato, la tabulazione e così via.

A differenza della P203, che utilizzava la macchina per scrivere solo per l’output, la P603 può ricevere in input da essa. L’input numerico o alfanumerico, trattato alle pagine 71-73 del manuale della P603, può essere controllato in lunghezza o meno e può anche essere richiesto all’operatore di inserire una cartolina magnetica, selezionando dal programma dove verrà trasferita in memoria.

Indirizzamento indiretto

A differenza della Programma 101, dove un registro può essere indirizzato solo direttamente dalla tastiera, la P602 ammette l’indirizzamento indiretto, con un numero da 0 a 31 che rappresenta ogni quarto di registro da C a RF.

Per utilizzarlo si deve scegliere un registro base che conterrà questo numero, e prefissare l’istruzione da eseguire con un prefisso che, in base al prefisso del registro che si vuole usare (la P603, per gestire così tanti registri, usa alcuni prefissi per evidenziare le divisioni in quarti), può essere “/S”, “aS”, “rS” o “bS” e poi eseguire l’istruzione con il registro base come argomento.

Ad esempio, posto che il registro “b” contenga il numero 3 questo codice:

/S
b#

Stamperà il contenuto del registro C, che è associato al numero 3. Senza il prefisso “/S”, invece, sarebbe stampato “3”, ossia il numero contenuto in b.

Ciò permette, ad esempio, di implementare degli array in poche istruzioni o di stampare numerosi registri con un loop, senza dover dare manualmente il comando di stampa per ogni singolo registro.

Altre cose da notare

Alcune piccole note relative alla P602.

MLU 600

Oltre all’interfaccia IPSO era disponibile un’altra espansione per periferiche, che permetteva di interfacciarsi ad un sistema a cartucce magnetiche dello MLU 600, che offre una memoria di massa di grande capacità. Il nastro interno poteva essere composto da 56, 112 o 224 blocchi, con ogni blocco che permetteva di copiare una zona, ossia quattro registri, sia di dati che di istruzioni.

Il MLU 600 permetteva un accesso casuale, con istruzioni per cercare un blocco, leggerlo o scriverlo, direttamente da programma.

Indicatore decimale

Oltre all’indicatore dei decimali di stampa già presente sulla P101, con le solite posizioni da 0 a 15, la P602 aggiunge un interruttore dei decimali aggiuntivi, da 0 a 11 o FL (Lunghezza Fissa), che permette di scegliere quanti decimali avrà il risultato che si forma nel registro A: tale numero corrisponde alla somma dei due indicatori, con un massimo, ovviamente, di 26 decimali, mentre i decimali stampabili restano quelli indicati dal primo indicatore. Nella posizione FL, invece, il risultato si forma con 15 cifre (totali, non decimali), ma viene stampato sempre in base al primo indicatore decimale.

Set di istruzioni

Virgola fissa

Le operazioni aritmetiche a virgola fissa vengono sempre eseguite nella forma A = A (operazione) M, ma possono essere eseguite anche con un altro registro come secondo operando. Tale registro viene copiato in M e viene eseguita l’operazione. In R viene salvato il risultato non troncato o il resto.

ComandoSimbolo P602Simbolo compatibileOperazioneNote
Addizione++A = A + REG
Sottrazione--A = A - REG
MoltiplicazionexxA = A *REG
Divisione÷:A = A/REG
Radice quadrataA = sqrt(REF)Possibile solo su M e A
Valore assolutoA↓A!A = abs(a)Possibile solo su A
Cambio di segnoA↕A><A = -APossibile solo su A
Percentuale/ X/ XA = (A*M)/100
Divisione troncata/ ÷/ :A = int(A/M)

Il “simbolo compatibile” è una notazione da me sviluppata e già usata per la Programma 101, che consente di rappresentare i simboli della P101 con caratteri comunemente disponibili.

Virgola mobile

Quasi tutte operano assumendo un numero a virgola mobile in A, eventuali casi speciali verranno trattati. Possono, in alcuni casi, essere usate in modo sensato su numeri a virgola fissa, come spiegato più dettagliatamente nel manuale, che tra l’altro presenta un’ottima descrizione del funzionamento della virgola mobile, per di più in base 10.

Un numero in virgola mobile può essere rappresentato, nei limiti delle trenta cifre totali, come ogni combinazione tra mantissa ed esponente.

Su di essi operano le ordinarie funzioni di trasferimento e, se sondati per un salto condizionato, viene tenuta in conto solo la mantissa.

Come si nota, nativamente il calcolatore permette solamente di passare da virgola fissa a virgola mobile e viceversa, mentre per le operazioni aritmetiche si dovranno utilizzare funzioni in ROM che vedremo più avanti.

ComandoSimbolo P602Simbolo compatibileOperazione
Normalizzaa:Trasforma il numero in A nella mantissa e lascia in M l’esponente
Congiunzione/↕/><Crea in A un numero a virgola mobile con mantissa in A e esponente in M
Separazioner↕r><Divide la parte decimale da quella intera, sia su numeri a virgola fissa che mobile
ScorrimentoaXaXEssenzialmente l’inverso di “Normalizza”, se applicato su un numero a virgola mobile ne dà l’equivalente in virgola fissa
Cambio di segno (mantissa)a↕a><Cambia il segno della mantissa
Stampa (in M)/♢/#Stampa il numero in virgola mobile in M con segno per mantissa e esponente
Stampa (in A)a♢a#Stampa il numero in virgola mobile in A con segno per mantissa e esponente

Funzioni di servizio

ComandoSimbolo P602Simbolo compatibileOperazioneSpiegazione
Trasferimento in A!A = REGSposta il registro selezionato in A
Trasferimento da M^REG = MSposta M nel registro selezionato
Scambio con A><A = REG e REG = AScambia A e il registro selezionato
Stampa#print(REG)Stampa il registro selezionato
Interlinea/ ♢/ #Avanza il rotolo di carta
Azzeramento**REG = 0Azzera il registro selezionato.
Azzeramento zona 2R/*R/*Azzera la zona 2
Azzeramento zona 3A/*A/*Azzera la zona 3
Input/output<Gestione I/OSi utilizza solo quando il calcolatore è collegato ad una periferica

Rappresentazione di dati alfanumerici

I dati alfanumerici vengono rappresentati come numeri ma codificati tramite istruzioni all’interno dei registri e possono essere utilizzati per comunicare con le periferiche, soprattutto con la macchina per scrivere integrata con la P603. Essi possono rappresentare i simboli dalla colonna 2 alla colonna 7 dello standard ISO, ossia le lettere maiuscole, quelle minuscole, i numeri e alcuni segni d’interpunzione fondamentali. Generalmente parlando le lettere minuscole, site nelle colonne 6 e 7, possono essere stampate solo come singole lettere, mentre le altre possono essere rappresentate liberamente, nei limiti delle capacità di un registro.

I caratteri alfanumerici vengono inseriti nel programma grazie ad una tabella di conversione, presente nel manuale della P603 e qui riportata:

Tavola caratteri

Come esempio, riporto la scritta “OLIVETTI”, proposta proprio nel manuale:

A^ (Inizio costante)
R* (I)
D+ (T)
D+ (T)
R- (E)
Dx (V)
Rx (I)
RV (L)
RS (O)
/S (Fine costante)

La codifica avviene dal carattere meno significativo ossia, volgarmente, dall’ultimo.

Rappresentazione di dati di programma

È possibile anche caricare un programma da una periferica, che emula essenzialmente uno dei due lati di una cartolina magnetica. Esiste una tabella di conversione tra caratteri ISO/ASCII e istruzioni di programma, non è possibile invece (probabilmente per le limitazioni della memoria derivanti dall’architettura in stile Harvard) dare in output istruzioni di programma, che devono essere invece inserite tramite l’equivalenza ASCII.

Istruzioni dalla ROM

È bene notare che queste istruzioni, che ovviamente richiedono la presenza della ROM, spesso usano alcuni registri del calcolatore per ragioni di servizio. È bene leggere il manuale per qualsiasi uso serio, poiché possono essere presenti altre condizioni non trattate in questo sintetico articolo. L’uso delle funzioni in ROM azzera i registri M, A, R, B e B/ e possono lavorare solo su dati di massimo 15 cifre, poiché utilizzano i registri B e B/ divisi. È possibile chiamare le funzioni in ROM anche da tastiera, così da poterle utilizzare nel funzionamento manuale del calcolatore.

Il manuale, inoltre, contiene un dettagliato esame dell’errore presente in ogni funzione a causa della struttura del calcolatore.

Generali

ComandoSaltoOperazione
Chiamata/ *Chiama una funzione in ROM, segue la funzione da chiamare

Logaritmiche

ComandoSaltoOperazione
Logaritmo in base 10YCalcola il logaritmo in base 10 di A
Logaritmo naturaleAYCalcola il logaritmo naturale di A

Esponenziali

ComandoSaltoOperazione
10^XZSalva 10^A in virgola mobile, con mantissa in A ed esponente in M
e^xAZSalva e^A in virgola mobile, con mantissa in A ed esponente in M

Costanti

ComandoSaltoOperazione
Logaritmo naturale di 10AVSalva in M ln 10
Pi Greco fratto 2AWSalva pi/2 in M

Goniometriche

ComandoSaltoOperazione
Seno di XRVSalva in A il seno di A
Coseno di XRWSalva in A il coseno di A
Tangente di XRYSalva in A la tangente di A
Arcotangente di XRZSalva in A l’arcotangente di A

Istruzioni aritmetiche a virgola mobile

In queste operazioni B è il primo operando e A il secondo. Il risultato viene salvato in A.

ComandoSaltoOperazione
SommaBVSomma in virgola mobile
SottrazioneBWSottrazione in virgola mobile
MoltiplicazioneBYMoltiplicazione in virgola mobile
DivisioneBZDivisione in virgola mobile

Casi speciali

Trucchetti

Il manuale contiene numerosi trucchetti per ottenere alla svelta determinate costanti o determinati risultati, così come vi sono anche alcuni trucchi per utilizzare in modo più efficiente la memoria: questi trucchi non sono propriamente parte del set di istruzioni, quanto usi furbi delle istruzioni presenti e delle regole della matematica. Un esempio è relativo all’uso di un singolo registro per salvare più dati, semplicemente dividendo per un opportuno fattore di dieci, ad esempio se si ha 103203 e lo si divide senza resto per 100, si ottiene il 103 iniziale, se poi si prende la parte decimale si ha il 203.

Stampa di spazi bianchie del punto

È possibile stampare degli spazi bianchi al fine di spostare il posizionamento di un numero con il comando “D<” da codificare come istruzione. Il numero così modificato non potrà essere utilizzato per i calcoli.

Parimenti, è possibile codificare come istruzione il punto come carattere autonomo e ordinarne la stampa. La codifica da utilizzare, che fa uso di quella precedente, è:

A^
D<
D<
/<

Cosa manca?

Nei manuali linkati sono presenti altre informazioni molto utili che qui, per brevità, sono state omesse, ad esempio le precise istruzioni di input-output o per il collegamento e la programmazione delle periferiche.

Per qualsiasi dubbio o errore, non fatevi problemi a contattarmi via e-mail, idem se avete qualche documento utile per migliorare l’articolo.

Collegamenti utili

  1. Manuale della P603
  2. Manuale della P602 (contattaemi via e-mail o cercate su LibGen)