Articolo pubblicato sul n. 40 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nell'aprile 1985

MCmicrocomputer


Commodore 64
Gestione delle interruzioni

(prima parte)

di Andrea de Prisco

Alla scoperta del Commodore 64, dopo la grafica, il suono, il disco, il sistema operativo e l'ADP Basic, parleremo di interrupt: perché avvengono e come si possono manipolare per far svolgere nuove funzioni al nostro super smanetto-computer. Copertina del numero di MCmicrocomputer contenente l'articolo

Gli Interrupt del CIA 6526

 Questo mese parleremo delle interruzioni al microprocessore da parte del CIA 6526; il mese prossimo vedremo quelle relative al video interface chip 6567. Alla fine di questo ciclo avremo aggiunto al nostro 64 i caratteri lampeggianti, la visualizzazione continua dell'orologio, una sveglia programmabile, la visualizzazione di 16 sprite contemporaneamente su video, nonché la possibilità di aprire finestre testo-grafica ad alta risoluzione.

 Il tutto s'intende senza paralizzare il funzionamento della macchina: potremo comodamente editare un programma mentre in un angolo dello schermo, secondo dopo secondo, l'orologio scandirà il tempo.

 Per ben descrivere queste nuove cose per il 64, dovremo un po' parlare dell'elaborazione parallela, di come sia possibile far girare contemporaneamente (o quasi) due programmi con un solo processore, o se preferite all'interno dello stesso computer. Il "quasi" tra parentesi indica che il trucco c'è ma non si vede. Di fatto un processore può elaborare un solo programma: è con tutta una serie di piccoli artifici che si può simulare una multiprogrammazione. Si può ad esempio far girare per un intervallo di tempo un programma, per un successivo intervallo un altro, poi un altro e ciclicamante ripetere il tutto, continuamente. Il processore, per così dire, spartisce il tempo, dedicandosi un po' per ogni programma in memoria. Se immaginiamo intervallini di tempo piccolissimi, dell'ordine di qualche millesimo di secondo, l'approssimazione sarà eccellente: a tutti gli effetti il nostro sistema apparirà come una macchina capace di eseguire parallelamente programmi. Per fare un esempio, immaginiamo di scrivere due programmi grafici: il primo disegna sulla metà sinistra dello schermo un quadrato, l'altro un cerchio nel semischermo opposto. Senza programmazione parallela, qualsiasi computer disegnerà prima l'uno e poi l'altro. Con il sistema sopra descritto, disegnerà un pezzo di quadrato, un pezzo di cerchio, poi un pezzo di quadrato, un pezzo di cerchio, fino a completamento di ambedue le forme. Anche così il risultato può essere deludente, non c'è molta differenza fra i due modi descritti. Il passo importante è velocizzare quanto più possibile questa sincronia: se il tutto avviene a intervalli di un millesimo di secondo o poco più vedremo cerchio e quadrato formarsi contemporaneamente sul video. Anzi non sarà possibile dall'esterno capire se sono due processori a eseguire due programmi, ognuno per conto proprio o un solo processore che spartisce equamente il suo tempo macchina.

 Anche il 64 è una macchina multiprocesso, per l'esattezza bi-processo. Sin dal momento dell'accensione girano contemporaneamente due programmi. Anche in questo caso il "contemporaneamente" va preso con le dovute cautele: diciamo, come sempre, che per qualche attimo fa una cosa, in altri momenti ne fa un'altra. Ciò che normalmente fa è eseguire programmi Basic o più semplicemente attendere comandi mostrando un bel cursore lampeggiante. Straordinariamente (ogni sessantesimo di secondo) molla tutto e esegue alcune funzioni. Tra queste la famosissima scansione della tastiera per sapere se è stato schiacciato qualche tasto, e l'aggiornamento dell'orologio interno. Dopo un altro sessantesimo di secondo, rimolla tutto e riesegue la stessa sequenza di istruzioni. Che quanto detto corrisponde a realtà lo si toccare con mano, semplicemente considerando la variabile TI$: qualsiasi cosa stiamo facendo c'è sempre qualcosa che provvede a incrementarla, segnando sempre l'orario esatto (o quasi).

Un altro "quasi" tra parentesi: cosa c'è?

Scendiamo un altro po' nei dettagli. Dicevamo che ogni sessantesimo di secondo il microprocessore interrompe le operazioni in corso per eseguire la scansione della tastiera e altro. Interrompe è il termine più adatto: è proprio una interruzione che arriva dall'esterno ad avvertire il 6510 che un'altro 60-esimo di secondo è passato. Uno dei due processori di I/O un 6526, ha un contatto diretto con il microprocessore: un vero e proprio filo elettrico collega due piedini dei due integrati. Il 6526 manda un impulso elettrico ogni 60-esimo di secondo al piedino IRQ del 6510. IRQ sta per Interrupt ReQuest, in linguaggio Made in Italy: Richiesta di Interruzione. Non sempre però l'interruzione è accolta: se il processore sta facendo qualcosa di più importante preferisce non essere disturbato. Questo capita ad esempio, durante le operazioni di Input/Output con le periferiche. Per questo motivo, se si usa il disco, l'aggiornamento dell'orologio interno non è assicurato ad ogni 60-esimo di secondo e lo stesso tende a perdere terreno rispetto all'ora esatta.

 Quando l'impulso (l'interrupt) è accolto, il processore salva in apposite locazioni lo stato del processo e esegue il cosiddetto programma di manipolazione dell'interruzioni. Lo stato del processo, è una coppia di informazioni: una è il Program Counter, l'indirizzo della prossima istruzione da eseguire e l'altra è la  Processor Status Word, un particolare registro che conserva varie informazioni tra cui l'esito dell'ultima operazione e altro. Entrambe servono per ripristinare lo stato interno al ritorno dal programma di manipolazione dell'interruzioni.

 L'indirizzo di questo è memorizzato nelle due ultime locazioni della memoria del 64: la $FFFE e la $FFFF e contengono il valore esadecimale $FF48.

 Sappiamo dunque che ogni 60-esimo di secondo il 6510 salta a $FF48: vediamo cosa succede. Curiosando a quell'indirizzo, troviamo la seguente serie di istruzioni in linguaggio macchina:

   $FF48   PHA  

   $FF49   TXA

   $FF4A   PHA

   $FF4B   TYA

   $FF4C   PHA

   $FF4D   TSX

   $FF4E   LDA $0104,X

   $FF51   AND #$10

   $FF53   BEQ $FF58

   $FF55   JMP ($0316)

   $FF58   JMP ($0314)

Le prime 5 istruzioni provvedono a salvare in una apposita zona di memoria detta Stack il contenuto dei tre registri del 6510. Le successive tre istruzioni servono per interrogare la Processor Status Word salvata anch'essa nello Stack al momento dell'interruzione. L'informazione che si vuole conoscere è se l'interrupt proviene dall'esterno (è scoccato un altro 60-esimo di secondo) o è semplicemente dovuto all'esecuzione dell'intruzione BRK (Break) che provoca un inturrupt interno. Il BEQ di $FF53 seleziona le due possibilità: a noi serve il secondo JMP, ci troviamo nel caso di interruzione dall'esterno. L'istruzione JMP corrisponde a un GOTO e ha due formati: diretto e indiretto. Nel primo caso il salto è normale: l'indirizzo che segue la JMP specifica dove si vuole far continuare l'esecuzione. La JMP indiretta si specifica con un indirizzo tra parentesi: nel nostro caso si deve saltare all'indirizzo contenuto nella cella $0314 e seguente (ci vogliono 2 byte per specificare un indirizzo). Cambiando il contenuto di $0314 e $0315 è possibile manipolare le interruzioni in modo diverso. Si può ad esempio inserire un nuovo pezzo di programma, a capo di quello per la manipolazione dell'interruzione (locato a EA31), che sarà eseguito ogni 60-esimo di secondo. Inseriremo in $0314 e $0315 l'indirizzo della nostra routine e al termine di questa un JMP $EA31 consentirà l'esecuzione del programma di manipolazione dell'interruzione vero e proprio.

   Tre Routine

Come prima applicazione di questo metodo, è stato preparato il programma "Orologio" che permette la visualizzazione continua della variabile TI$ nell'angolo in alto a sinistra del video. Per questo e per gli altri, prima di batterli o di caricarli in memoria è necessario spostare il puntatore di inizio programmi basic, come indicato in testa ad ogni listato, per fare spazio alla rotine in linguaggio macchina.

 Dopo aver dato run al primo programma, per far partire l'orologio, sempre dopo aver inizializzato TI$, è sufficiente digitare SYS€£2049.

 Il programma orologio è assai semplice: la prima operazione che compie è di inizializzare un proprio orologio interno a partire dalla variabile numerica TI locata nelle celle 160-162 (decimale). Con qualche semplice divisione intera a partire da questa, inserisce nelle locazioni 251-253 i corrispondenti secondi, minuti e ore. Una volta ogni 60 chiamate di questo programma incrementa la locazione 251 (i secondi). Ogni 60 incrementi di 251, incrementa 252 (i minuti) e ogni 60 incrementi di 252, incrementa 253 (le ore). La visualizzazione avviene ogni secondo, quindi se si cancella il video con Shift + ClrHome dopo pochi attimi si rivedrà comparire l'orario. Quando siamo stufi, è sufficiente battere RunStop e Restore per veder scomparire l'orario (SYS 2049 per riattivarlo). Questo perché la sequenza RunStop e Restore resetta vari puntatori interni, tra cui l'indirizzo del programma di manipolazione dell'interruzioni.

Il secondo programma implementa via software i caratteri lampeggianti sul 64. Una volta caricato e fatto partire con SYS€£2049 risulteranno lampeggianti tutti i carratteri visulizzati nei colori Nero, Bianco, Rosso, Ciano, Arancio, Marrone, Rosso Chiaro e Grigio Scuro, in altre parole i colori ottenibili con la pressione dei tasti 1-4, preceduti da Control o il logo Commodore. Si consiglia di far lampeggiare scritte non in modo diretto (selezionando il colore e digitando il testo), ma sottoforma di istruzione PRINT, racchidendo tra apici il testo che si vuol fare lampeggiare, inserendo come primo carattere un colore Flashing e come ultimo un colore a scelta tra gli altri 8. In questo modo si evita che porzioni di schermo (arbitrariamente colorate dal 64) inizino a lampeggiare contro le nostre aspettative.

 Per quanto riguarda il funzionamento,basta notare che i codici dei colori lampeggianti hanno tutti il bit 2 a zero, infatti:

    Colore        Decimale    Binario

   Nero           00         0000

   Bianco         01         0001

   Rosso          02         0010

   Ciano          03         0011

   Porpora        04         0100

   Verde          05         0101

   Blu            06         0110

   Giallo         07         0111

   Arancio        08         1000

   Marrone        09         1001

   Rosso C.       10         1010

   Grigio S.      11         1011

   Grigio M.      12         1100

   Verde C.       13         1101

   Blu C.         14         1110

   Grigio C.      15         1111

Il bit 2 è il terzo a cominciare da destra.

Ogni 32 sessantesimi di secondo (circa 1/2 s.) la nostra routine "parallela" scandisce tutta la pagina colore e dove trova un codice col bit 2 a zero, nella corrispondente posizione in pagina video, settando o resettando il bit 7, converte il carattere da normale a Reverse o viceversa.

Il terzo dei tre programmi riportati realizza una vera e propria sveglia programmabile sul 64. Anche in questo caso, dopo aver caricato il programma, bisogna inizializzare TI$ per informare il computer circa l'orario corrente. Prima del fatidico SYS€£2049 bisogna indicare nella variabile AL$ l'orario di sveglia. A differenza di TI$, AL$ è in formato 4 cifre: ore e minuti. Quando TI$ raggiunge AL$ si avvertirà un segnale dall'altoparlante del vostro TV. Potrebbe essere utile per ricordarsi gli appuntamenti mentre si lavora al computer: ai softwaristi (ogni riferimento al sottoscritto è puramente "casuale") capita di immergersi talmente nel problema da non avvertire più il passare del tempo!


Impaginato originale...


Clicca per ingrandire... Clicca per ingrandire...
Clicca per ingrandire... Clicca per ingrandire...

Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui