REAL TIME CLOCK SUL PC128S

di Concari, Ottaviani e proteus075

Dopo il 2011 durante uno dei recuperi di vecchiè unità PC128S, mi è capitata una motherboard con a bordo un circuito integrato aggiunto artiginalmente di cui non capivo il funzionamento. Sfortunatamente quella unità era ridotta molto male, coperta di terriccio e rimasta per anni esposta alle intemperie. Il propietario però mi parlava di questo orologio in tempo reale che spaccava il secondo e rimaneva in memoria anche dopo lo spegnimento del computer. Sino a quel momento io sapevo che il comando *TIME restituiva la data, che nel 1986 era lontanamente futura, di meno un secondo dalla mezzanotte del 2000, come spiegato a pagina 195 della guida per l’uso del sistema in dotazione ad ogni 128S. Anni dopo però venni a conoscenza di un articolo sfogliando delle vecchie riviste facenti parte della galassia Acorn.

Interpellai subito le menti brillanti del gruppo ed inizialmente dopo qualche scetticismo prese forma, sopratutto grazie all’esperienza del nostro affezionatissimo Ing. Ottaviani, la possibilità concreta di far funzionare l’orologio in tempo reale sul nostro piccolo Olivetti Prodest.

In effetti su stardot, ci erano riusciti utilizzando un circuito didattico che viene utilizzato comunemente con Arduino, ma anche in questo caso era stato snobbato il 128S, quindi entra in scena Ing. Concari che in pratica ha riscritto la ROM apportanto le traduzioni necessarie affinchè potesse funzionare sul MASTER COMPACT e quindi sul nostro computer. L’orologio infatti per funzionare necessita di una EPROM fisica montata in uno dei zoccoli liberi da 16k, contenente la I2C31C.rom

Come si realizza in pratica e come funziona. Anzitutto, utilizzare le solite precauzioni per l’elettricità statica prima di lavorare sulla motherboard del 128S, sconnettere tutte le periferiche, l’alimentazione, il connettore tastiera. Predisporre il circuitino “time clock I2C” saldando ad angolo i 4 pin ed inserire la pila CR1220. Tenere conto che una volta ultimato il lavoro è necessario evitare ogni contatto con qualsiasi parte della scheda madre. Per esempio, utilizzare un piedino o isolare con un anello largo di guaina termorestringente. Montare i restanti 4 pin nei fori indicati come nelle foto seguenti, questa tipo di installazione se fatta bene è completamente reversibile qualora occorra ripristinare l’originalità del computer. Montare la EPROM “CLOCK I2C31C” stando attenti al verso dell’integrato (l’incavo deve essere sempre rivolto verso sinistra come tutti gli altri della scheda). Possibilmente montarlo in uno dei primi tre zoccoli a partire dall’alto, quindi 17, 23 o 29. Collegati i fili e verificate le giunzioni, rimontare scheda viti e tastiera, quindi accendere. Anzitutto digitare *ROMS e verificare che sia presente nella lista la ROM I2C e poi con il comando *HELP I2C ci vengono elencati un sunto dei parametri rapidi per la configurazione ed utilizzo come nella foto allegata. Per impostare l’orario corrente seguire la sintassi suggerita, ad esempio per l’orario digitare :

*TSET 14:22:00 e premere RETURN

*DSET Thu 17-11-22 e premere RETURN

Abbiamo impostato l’orologio ad esempio sono le 2 e 22 del pomeriggio di Giovedì (Thursday) 17 giorno del mese 11 mese, anno 22 = 2022. Purtroppo il 128S era soggetto al “millenium bug” quindi quasi ovunque nei vari software è possibile vedere la data 1922 anziché 2022 !

L’orologio è impostato ed indicherà con precisione sempre l’ora giusta su vostro 128S a prescindere che sia acceso o spento la batteria terrà in funzione il piccolo circuito del tempo I2C.

Per verificare l’orario digitare :

*TIME

Prima di questa modifica appariva un orario a -1 secondo allo scoccare della mezzanotte del 2000, come riportato nel manuale d’uso a pagina 195. Ora apparirà l’orario e la data corrente con il giorno della settimana corretto dato che è presente un calendario perpetuo.

Thu,17 Nov 2022.14:22:35

Il circuito contiene anche una piccola termocoppia, di conseguenza c’è una funzione aggiuntiva che misura la temperatura dell’aria interna del 128S, digitare :

*TEMP

Appare come risposta nel nostro caso 23degC che vuol dire 23°C

Queste due funzioni ora possono essere inserite dentro dei programmi, in allegato al kit ho messo due floppy virtuali per gotek. Uno è la versione del welcome con l’orologio della scrivania funzionante, l’altro è un programmino che disegna un trend della temperatura interna del 128S nei minuti successivi all’accensione, in tempo reale, vedere screenshot allegati.

La EPROM I2C in funzione, in attesa dei settaggi.
Il circuito “time clock I2C” montato sulla motherboard del 128S.
La scrivania del WELCOME segna sempre l’ora giusta.
Un applicazione del circuito “time clock I2C” è possibile visualizzare la temperatura del 128S.

Può sembrare strano ma paradossalmente ha richiesto più tempo la correzione (adattamento) del file in BASIC contenuto del disco WELCOME per consentire che l’orologio sia effettivamente sincronizzato con l’orario del computer. Le motivazioni sono dovute al fatto che alcune righe di questi programmi sono scritte in modo criptico e molto sintetizzate e compresse, è facilissimo confondere le variabili. Questo ostacolo è stato superato grazie al nostro iscritto Ing. Ottaviani, che descrive in dettaglio ciò che segue.

Una volta realizzata la modifica al chip RTC e adattata la ROM di gestione del protocollo I2C per aggiornare le variabili di sistema ed i comandi MOS *TIME e *DATE, restava da allineare anche l’unico programma che (probabilmente) lo usa nel PC128S: l’agenda della “Scrivania” del disco Welcome, che ha un bellissimo menu “Orologio” che mostra, appunto, un orologio con solo, ahimè, un piccolo difetto: riparte sempre dalle ore 00:00 ad ogni avvio del programma.

Il perchè è presto detto: il programma, all’avvio, inizializzava l’orario con zeri, non avendo il PC128S l’orologio con batteria tampone fornito in dotazione al fratello maggiore Master BBC.

La modifica quindi è stata semplice, questi i passi seguiti:

  • individuare il programma: la gestione dell’orologio è in WIMPS/P/crnw
  • caricato il programma “crnw”, in BASIC, si trovano le righe in cui le variabili sono inizializzate. Il programma non è molto leggibile, è scritto in forma estremamente compatta per risparmia memoria, ma si trova a riga 260 l’assegnazione di 0 alla variabile TIME e alle variabili t0%, n0% e h0%, che sono usate nella procedura PROCY(n0%,h0%,b1%) alla riga 4640 che disegna le “lancette” sullo schermo, e che contengono le ore, i minuti ed i secondi correnti.
  • Prima della riga 260, ci inseriamo quindi per inizializzare le variabili con l’orario corretto letto in Basic con la variabile di distema TIME$:

255TZ$=RIGHT$(TIME$,8):b1%=VAL(RIGHT$(TZ$,2)):h0%=VAL(MID$(TZ$,4,2)):n0%=VAL(LEFT$(TZ$,2))

256TIME=b1%*100+n0%*6000+h0%*360000

In pratica TIME$ ritorna una stringa con l’orario nel formato “DDD,DD MMM YYYY.HH:MM:SS (ad es. Tue,10 Jan 2023.20:48:59), quindi con le funzioni di estrazione stringa prendiamo gli ultimi 8 caratteri e, in particolare, le “coppie” di caratteri relativi ad ore, minuti e secondi e li convertiamo, con la funzione VAL, in numero per inizializzare le variabili del programma.

  • Cambiamo anche l’incipit della riga 260, per sostituire t0%=TIME che adesso riporterà l’ora corretta, e rimuovendo le precedenti assegnazioni a zero alle variabili TIME, b1%, h0%,n0%.
  • Fatto! Salvate crmw, CTRL+BREAK ed il vostro PC128S con RTC Clock I2C e relativa ROM, vi mostrerà l’orologio della scrivania puntuale come non mai!

Il nostro Ing. Carlo Concari, come detto prima, si è occupato della EPROM. Il lavoro è iniziato dalla ROM I2C31B, scritta da uno sviluppatore che risponde al nome utente MartinB sul forum di stardot.
La ROM I2C31B aggiunge funzionalità generiche I2C e real time clock al BBC Micro Model B ma, come detto, non supporta il Master Compact ne il PC128S. Digitando *TIME riporta sempre il secondo antecedente l’inizio del nuovo millennio:

Fri,31 Dec 1999.23:59:59

Addentrandosi nel sistema operativo con il debugger dell’emulatore B-Em, ha visto che il comando *TIME si appoggia a una chiamata OSWORD 14 con numero di funzione 0 (leggi data/ora sotto forma di stringa). Poi, disassemblando la ROM I2C31B di MartinB, ha trovato che essa risponde ad alcune chiamate OSWORD 14, ma non a quella con funzione 0: ha deciso così di implementarla.
Fortunatamente la ROM I2C31B non occupa tutti i 16 kB a disposizione, c’è spazio libero più che sufficiente per una picola routine in linguaggio macchina che risponda alla chiamata con numero di funzione 0 e ritorni una stringa contenente data e ora correnti, lette dal real-time clock di Ottaviani. Ha preparato un programma in BASIC “I2CMCBAS” che assembla il codice mancante nella memoria del PC128S e lo salva su un file “I2CMC”. Tale codice va inserito nella ROM I2C31B a partire dall’indirizzo &9276. Occorre infine modificare un paio di linee di codice macchina della ROM per “agganciare” il nuovo codice con quello esistente (la modifica è documentata nei commenti del file “I2CMCBAS”), ed ecco pronta una ROM adattata al nostro glorioso PC128S.

Un frammento del listato del file I2CMCBAS.
Un listato DUMP del file in linguaggio macchina I2CMC creato dal I2CMCBAS.

Il risultato finale è un file binario che tramite un programmatore di EPROM può essere riversato su una ROM da 16k che per semplicità di utilizzo è comodo montare in uno zoccolo libero del 128S.

Chi fosse interessato a costruirsi o farsi spedire questo piccolo kit o necessiti di aiuto e informazioni, come sempre può scrivermi una email a: proteus075@gmail.com