# MIC-2

Il MIC-2 è un'architettura di processore inventata da Andrew S. Tanenbaum da utilizzare come esempio semplice ma completo per il suo libro Architettura dei calcolatori.
Il linguaggio microcodice MAL (Micro-Assembly Language) è realizzato per consentire la scrittura di un interprete IJVM (Integer Java Virtual Machine) con semplicità. Esempi di codice sorgente per questo interprete si trovano nel libro su menzionato.
È presente l'IFU (Instruction Fetch Unit), un'unità che si occupa di richiedere i byte del codice IJVM alla memoria centrale.

## IFU

L'IFU è un componente hardware che affianca l'ALU nei suoi compiti di calcolo. In particolare ha il compito di:
* Eliminare il main loop dalla fine di ogni istruzione IJVM. Al suo posto è inserito un salto alla prossima istruzione da eseguire memorizzata nel registro MBR1 e puntata da PC (Program Counter).
* Sollevare l'ALU dal compito di incrementare PC e di eseguire la procedura di fetch.
* Assemblare l'opcode in 16 bit. Successivamente lo passa direttamente all'ALU come valore a 32 bit (l'ALU lavora a 32 bit).
A differenza del MIC-1 il registro MBR viene sostituito da due registri MBR1 (di dimensione 8 bit) e MBR2 (di dimensione 16 bit) con rispettiva versione unsigned. Appena viene letto un valore da uno dei due registri si procede a memorizzare al loro interno i byte successivi da leggere prelevati dalla IFU.
La IFU è dotata di un registro IMAR per indirizzare la successiva parola da prelevare, questo registro possiede un proprio incrementatore in modo da alleggerire il carico alla ALU.

## Hardware
### BUS

Sono presenti tre Bus da 32 linee ciascuno (uno in più rispetto al MIC-1, che non possiede un A bus):
* Bus A e B: collegato all'output dei registri e all'input della unità aritmetica e logica
* Bus C: collegato all'output dello shifter e all'input dei registri

## Software
### Microistruzioni

La dimensione delle microistruzioni è differente da quella di MIC-1 in quanto viene rimosso il bit di fetch dal campo MEM e vengono aggiunti 4 bit per la codifica del bus A.

#### Differenze con MIC-1

Nella tabella sottostante è rappresentata la sequenza di microistruzioni che implementano la macroistruzione IJVM istore in MIC-1:
ISTORE in MIC-1 :
| Etichetta | Opeazione |
| istore1 | H = LV |
| istore2 | MAR = MBRU + H |
| istore3 | MDR = TOS, wr |
| istore4 | SP = MAR = SP - 1; rd |
| istore5 | PC = PC + 1; fetch |
| istore6 | TOS = MDR; goto Main1 |
Nella tabella seguente invece è rappresentata la sequenza di microistruzioni per l'implementazione della macroistruzione IJVM istore in MIC-2:
ISTORE in MIC-2 :
| Etichetta | Opeazione |
| istore1 | MAR = LV + MBR1U |
| istore2 | MDR = TOS; wr |
| istore3 | MAR = SP = SP - 1; rd |
| istore4 | nop |
| istore5 | TOS = MDR; goto(MBR1) |
Si noti che nell'istruzione per MIC-2 è possibile sommare direttamente i due registri LV e MBR1U senza usare il registro H come appoggio, questo grazie al fatto che il bus A è collegato a tutti i registri e non solo ad H come in MIC-1. Inoltre l'istruzione istore5 della codifica MIC-1 viene eliminata in quella per MIC-2 in quanto l'incremento di PC viene fatto automaticamente dalla IFU risparmiando un ciclo di clock.