# MIC-1

Il MIC-1 è un'architettura di processore inventata da Tanenbaum da utilizzare come esempio semplice ma completo per il suo libro Architettura dei calcolatori.
Consiste di una unità di controllo molto semplice che esegue microcodice da una memoria di 512 parole. Il linguaggio microcodice MAL (Micro-Assembly Language) è realizzato per consentire la scrittura di un interprete IJVM (Integer Java Virtual Machine) con semplicità.

## Hardware
### Percorso Dati

Il percorso dati (data path) è il cuore del Mic-1. Esso contiene i registri a 32 bit specificati prima, i bus di collegamento e la ALU.

#### BUS

Sono presenti due Bus da 32 linee ciascuno:
* Bus B: collegato all'output dei registri e all'input della ALU
* Bus C: collegato all'output dello shifter e all'input dei registri

#### Registri

I registri sono selezionati da due linee di controllo, una per abilitare il bus B e l'altra per abilitare il bus C. Il bus B può essere abilitato da un solo registro per volta, in quanto il trasferimento dei dati da parte di due registri contemporaneamente porterebbe a dei dati inconsistenti. Il bus C può essere invece abilitato da più di un registro contemporaneamente; lo stesso valore presente in esso può infatti essere scritto senza problemi su più di un registro.
Le operazioni di lettura e scrittura vengono effettuate in un solo ciclo di clock.
Il registro MBR pur essendo di sola lettura, possiede due linee di controllo. Essendo un registro a 8 bit, il suo output è collegato alle linee meno significative del bus B. Può essere impostato per fornire il suo output in due modi:
* Complemento a due (MBR): vengono impostati i rimanenti 24 bit del bus a 1 se si tratta di un numero negativo oppure a 0 se si tratta di un numero positivo (estensione del segno)
* Senza complemento (MBRU): vengono impostati i rimanenti 24 bit del bus a 0.

#### ALU

La ALU possiede le seguenti linee di input/output/controllo:
* 2 linee di input da 32 bit per il bus B e per il bus che la collega direttamente al registro H
* 1 linea di output da 32 bit collegata direttamente allo shifter
* 6 linee di controllo per la selezione delle operazioni
* 2 linee di output per i flag di stato N (negative) e Z (zero)
La ALU contiene al suo interno 32 circuiti combinatori. Ogni circuito combinatorio è capace di eseguire istruzioni logiche di AND, OR e NOT e istruzioni aritmetiche di somma.

#### Shifter

Lo shifter possiede un input e un output a 32 bit. L'output è collegato direttamente al bus C. Esso è utilizzato per effettuare operazioni di shift logico e shift aritmetico semplicemente impostando i due segnali di controllo SLL8 (Shift Left Logical o Scorrimento logico a sinistra) e SRA1 (Shift Right Arithmetic o scorrimento aritmetico a destra). Il suo funzionamento può essere anche trasparente trasferendo in output il segnale senza effettuare alcuna operazione.

### RAM

La RAM del Mic-1 è una ram orientata al byte. Essa è costituita da parole di 4 celle, ogni cella è formata da 8 bit. Essa possiede 3 segnali di controllo, rispettivamente per abilitare le funzioni di Read, Write e Fetch. Con le operazioni di Read e Write si vanno a leggere e scrivere intere parole (4 celle) invece con Fetch si possono leggere le singole celle (8 bit).
Rappresentazione schematica:
| ParolaCellaCellaCellaCella 00123 14567 2891011 312131415 ............... | Esempio di indirizzamento: la parola 2 ha indirizzo 8 la parola 3 ha indirizzo 12 la cella 2 ha indirizzo 2 |

### Registri del Mic-1

Il Mic-1 possiede i seguenti registri:
| RegistroLetturaScritturaLettura/scrittura32 bit8 bit MAR MDR PC MBR MBRU SP LV TOS CPP OPC H | Tutti i registri tranne MBRU possono contenere numeri interi rappresentabili in complemento a due. Il registro MBRU può contenere solo numeri interi a 8 bit non negativi. MAR: questo registro contiene indirizzi di memoria ed è collegato al bus indirizzi della RAM shiftato di 2 linee in modo da moltiplicare il suo valore per 4. Questa moltiplicazione è necessaria in quanto la RAM è una memoria orientata al byte e quindi l'indirizzo di ogni parola è specificato dall'indirizzo del suo primo byte (o della sua prima cella). MDR: questo registro è direttamente collegato al bus dati della RAM PC: come MAR è collegato al bus indirizzi della RAM però senza nessun shift delle sue linee. Con PC infatti si possono indirizzare le singole celle di memoria. |

## Micro-assembly language

Un programma scritto in MAL (Micro-assembly language) può essere considerato come una semplice sequenza di istruzioni in quanto non è possibile rappresentare concetti sintattici più complessi come blocco, procedura o metodo.

### Semantica

Un'istruzione può avere la seguente forma:
    <Istruzione> ::= [<Etichetta>] [<Assegnamento>;][<Lettura/scrittura>;][<Salto>]
Ogni parte è opzionale in quanto è possibile avere istruzioni vuote.
    <Etichetta> ::= Qualsiasi carattere alfanumerico
    <Assegnamento> ::= Var$_1$ = Var$_2$ = ... = Var$_i$ = <exp>[<shift>]
Si possono avere assegnamenti multipli, e le variabili Var$_i$ devono essere variabili in scrittura.
    <Var$_i$> ::= MDR|LV|MAR|...
    <exp> ::=
    <shift> ::= >1|<<8
Lo shift può essere di tipo aritmetico a destra di 1 bit (per effettuare ad esempio la divisione per 2) oppure logico a sinistra di 8 bit. register_std-logic _vector