

Il bus è un semplice cavo. Il trucco
è nelle porte utilizzate per connettere i vari elementi, che sono porte tristate.|
Input a c |
Output b |
|
x 0 x 1 |
disconnesso x |

| Codice | Operazione |
|
0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 |
AND OR NOT COMPARAZIONE logica e aritmetica TEST B ADD SHIFT LEFT SHIFT RIGHT |
| Flag | Evento |
|
Z |
segnala se il risultato dell'operazione logica o aritmetica compiuta ha come risultato la stringa nulla |
|
N |
segnala se il risultato dell'operazione compiuta è un numero negativo; questa segnalazione ha senso solo per operazioni aritmetiche, cioè quando le stringhe operando hanno significato numerico; tuttavia la ALU segnala comunque come negative anche le stringhe con significato logico, perchè si preoccupa soltanto di rilevare se il MSB è 1 (vedere "Rappresentazione in Complemento a Due"), quasiasi sia la natura della stringa. |
|
C |
segnala il trabocco di un uno sul MSB o LSB (trabocchi di zero non contano visto che il numero non cambia: 00214 è uguale a 214). |
|
V |
segnala un overflow o underflow. |





A tal proposito si usa un registro di memoria speciale
detto registro di estensione, che si trova in una zona della RAM di nome MM (Memory Managment). Tale registro contiene i bit in più (rispetto alla lunghezza della parola) che si
vogliono usare per indirizzare la memoria.
- 1: istruzioni del programma che non richiedono I\O
- 2: caricamento dell'indirizzo di memoria centrale da cui scrivere i dati trasferiti
- 3: caricamento della condizione di fine: o il numero di word da trasferire o la particolare word che appena letta fa terminare il trasferimento
- 4: test se il bit di pronto in lettura del registro di stato della periferica è alto
- 5: se il bit di pronto in lettura è basso ripeti l'istruzione precedente, altrimenti continua
- 6: istruzione che trasferisce la word dal registro di dato in uscita della periferica alla RAM o a un registro interno alla macchina
- 7: se la condizione di fine non è verificata ripeti da 4, altrimenti continua
- 8: parte restante del programma
rispetto agli altri metodi è molto inefficiente perchè tiene occupata la CPU a ciclare; è ormai abbandonato
- 1: abilitazione di quella periferica a lanciare interruzioni, alzando l'apposito bit del suo registro di stato
- 2: dichiarazione della posizione di memoria in cui si trova il programma di servizio di quella interruzione, inserendo l'indirizzo nel vettore delle interruzioni
- 3: istruzioni del programma che non richiedono I\O
- 4: caricamento dell'indirizzo di memoria centrale da cui scrivere i dati trasferiti (qui o nel programma di servizio?)
- 5: caricamento della condizione di fine: o il numero di word da trasferire o la particolare word che appena letta fa terminare il trasferimento (qui o nel programma di servizio?)
- 6: istruzione di lettura da periferiferica: o il programma ha un'istruzione di attesa - il calcolatore si ferma ad aspettare che la periferiferica sia pronta in lettura senza poter fare niente -
o ha un'istruzione di trap verso il sistema operativo - il sistema operativo cede il controllo della CPU ad altri programmi finchè non arriva il segnale di pronto -
quando il bit di pronto in and con il bit di abilitazione delle interruzioni della periferica è alto, la periferica lancia una interruzione e viene
attivato il programma di servizio, che trasferisce la word dal registro di dato in uscita della periferica alla RAM o ad un registro interno al calcolatore;
ciò si ripete finchè non viene raggiunta la condizione di fine; a questo punto, il programma di servizio ritorna e cancella l'interruzione
- 5: parte restante del programma
è utilizzato per le periferiche più lente e che non trsferiscono molti dati(ad es. la tastiera)
- 1: istruzioni del programma che non richiedono I\O
- 2: caricamento nel registro di indirizzo del controllore di DMA dell'indirizzo di memoria centrale da cui scrivere i dati trasferiti
- 3: caricamento nel registro di dato del controllore di DMA della condizione di fine: o il numero di word da trasferire
- 4: abilitazione di quella periferica a lanciare interruzioni, alzando l'apposito bit del suo registro di stato
- 5: dichiarazione della posizione di memoria in cui si trova il programma di servizio di quella interruzione, inserendo l'indirizzo nel vettore delle interruzioni
- 6: istruzione di avvio del trasferimento: o il programma ha un'istruzione di attesa - il calcolatore si ferma ad aspettare che la periferiferica abbia trasferito tutti i dati, senza poter fare niente -
o ha un'istruzione di trap verso il sistema operativo - il sistema operativo cede il controllo della CPU ad altri programmi finchè non arriva l'interruzione di fine trasferimento -
quando l'interruzione di fine trasferimento arriva, o finisce l'attesa o arriva un'istruzione di trap al sistema operativo che decide se far ripartire il programma
- 7: parte restante del programma
è un metodo pensato per liberare la CPU dall'incombenza di gestire lo scambio di dati fra periferiche e calcolatore: la differenza con gli altri due metodi, infatti, sta nell'inviare una interruzione
non per ogni word trasferita, ma per ogni blocco di word trasferito; in questo modo la CPU non deve eseguire un'istruzione di move da un indirizzo ad un altro per ogni
dato da scambiare.
Questo è possibile perchè alle periferiche viene permesso di accedere alla memoria centrale direttamente, senza
l'intervento della CPU. Ciò è possibile solo tramite un opportuno circuito detto controllore di DMA, unico e a cui si possono collegare più feriferiche e che è a sua volta collegato al bus.
Questo componente ha
almeno tre registri, che vengono usati al posto dei registri delle periferiche: un registro di stato, un registro contatore di indirizzo, un registro contatore di dato. Il programmatore assembly specifica, tramite un opportuno bit del registro di stato, se la
periferica deve leggere o scrivere sulla memoria centrale. Specifica quindi nel registro contatore di indirizzo l'indirizzo di partenza della memoria centrale, su cui leggere o scrivere. Nel
registro contatore di dato mette il numero delle informazioni da leggere o scrivere, ovvero il numero di celle di memoria da usare. Avvia quindi il trasferimento alzando un opportuno bit nel
registro di stato. Eseguite queste istruzioni, la CPU non viene più chiamata in causa e può svolgere altri compiti. Durante il trasferimento, il registro contatore di indirizzo
viene incrementato ed il registro contatore di dato decrementato. Quando il registro contatore di dato arriva a zero, la periferica segnala la fine del trasferimento alzando un opportuno bit
del registro di stato per mandare un'interruzione alla CPU.