Rilevamento interruzioni e chiamata del gestore interruzioni

L'interprete di IJVM è realizzato in Mic-1 (per questo viene chiamato, anche nel testo, microinterprete). Le microistruzioni che lo compomgono sono contenute nel Control Store (CS).

CPU
Il microinterprete dovrà, all'inizio di ogni ciclo di fetch-execute, controllare per prima cosa che le interruzioni siano abilitate(OPC[0]=0).
OPC[0] abilita/disabilita le interruzioni
In caso positivo, e se è presente almeno un'interruzione, vengono eseguite le seguenti operazioni (N.B. per semplicita' nella rappresentazione grafica, OPC si suppone lungo 16 bit):
Come gia' detto, il linguaggio macchina considerato puo' benissimo essere diverso da IJVM, l'importante, nel nostro esempio, e' che sia realizzato per interpretazione sopra Mic-1).
Da notare che, al contrario dell'esempio del testo (sezione 5.6.5), più vicino alla realtà, non si parla di interrupt vector (numero intero messo sul bus dal controllore del dispositivo quando questo si accorge che la CPU ha rilevato la richiesta di interrupt), poiché abbiamo supposto di avere linee multiple di interrupt, attraverso le quali e' possibile rilevare l'identita' di chi ha richiesto un interrupt controllando il contenuto di OPC.
Vediamo come andrebbe modificato il microcodice della Figura 4.17 del testo per far si che ci si accorga della presenza di richieste di interruzioni e, nel caso, si eseguano le operazioni descritte in precedenza.
Per semplicita' supponiamo di avere un linguaggio Mic-1 esteso nel quale è possibile, per esempio, fare dei salti condizionati le cui condizioni sono bit di OPC o espressioni booleane che li utilizzano (con la notazione OPC[X] indichiamo il bit X di OPC). La modifica consiste in pratica nell'aggiungere le seguenti microistruzioni prima di quella con etichetta Main1:

int1 if opc[0] goto main1;/ controllo se le interruzioni sono abilitate. Estendiamo il mic-1 con il costrutto if (OPC[x]) per indicare che si deve saltare alla etichetta main1 se il bit presente in OPC[15] è pari a uno, cioè le interruzioni sono disabilitate.

int2 if (not(opc[15]) and not(opc[14]) ... and not(opc[8])) goto main1; / controlla se ci sono interruzioni; se tutti i devices non fanno richiesta di interruzione si deve saltare alla etichetta main1

int3 SP=MAR=SP+1;

int4 MDR=PC; wr; /salva il PC del programma corrente sullo stack (*).

int5 SP=MAR=SP+1;

int6 MDR=OPC; wr; /salva OPC sullo Stack

int7 MAR=OxFF; rd; /iniziamo la lettura del contenuto della locazione 255. La locazione 255 contiene l'indirizzo del gestore delle interruzioni

int8 OPC[0]=1; /disabilito gli interrupt, ci penserà il gestore degli interrupt a riabilitare;

int9 PC=MDR; fetch; /inizio l'estrazione della prima istruzione del gestore delle interruzioni;

int10 /attendo il completamento del fetch precedente

main1 PC=PC+1; fetch; goto(MBR); / tutti i goto seguenti nel codice del microinterprete che prima, nel caso senza interruzioni, andavano a main1, ora devono andare a int1 /

:

resto del microinterprete

:
(*) Le informazioni da salvare sullo stack per poter ripristinare lo stato della computazione corrente sono molte di più. Possiamo supporre che tali informazioni vengano salvate dal gestore delle interruzioni, anche se in realtà il gestore, se e' scritto in IJVM, non ha accesso diretto ai registri di Mic-1.


Se l'interprete quindi, ad interruzioni abilitate, trova 1 nei bit 0-7 di OPC, chiama il gestore delle interruzioni. Vediamo nel seguito cosa succede nel gestore

<---- La gestione delle interruzioni Il gestore delle interruzioni ---->