Metodi di input/output
# Metodi di input/output

Memory-mapped I/O (MMIO) e port I/O (chiamato anche port-mapped I/O o PMIO) sono due metodi complementari per eseguire operazioni di input/output (I/O) in un computer, tra la CPU ed un dispositivo di I/O. Un altro metodo è quello di usare dei processori di I/O dedicati (canali).

## Memory-mapped I/O

Il Memory-mapped I/O (ingressi/uscite mappati in memoria) usa lo stesso bus per indirizzare sia la memoria che i dispositivi di I/O, e le stesse istruzioni della CPU utilizzate per leggere e scrivere. La memoria è utilizzata anche per accedere ai dispositivi di I/O. Per poter alloggiare i dispositivi di I/O, aree di spazio indirizzabile dalla CPU devono essere riservate per l'I/O invece che essere usate per la memoria. Questa suddivisione non deve necessariamente essere permanente, per esempio il Commodore 64 può effettuare lo switch tra I/O e memoria. I dispositivi di I/O controllano il bus indirizzi della CPU e rispondono ad ogni accesso allo spazio indirizzi a loro assegnato, mappando l'indirizzo nei loro registri hardware.

## Port-mapped I/O

Il Port-mapped I/O (ingressi/uscite mappati su porte) o Isolated I/O usa una speciale classe di istruzioni specifiche per l'esecuzione dell'input/output. I dispositivi di I/O hanno uno spazio indirizzi separato da quello della memoria, ottenuto tramite un extra "I/O" pin sull'interfaccia fisica della CPU oppure tramite un bus dedicato.

## Vantaggi dei due metodi di I/O

Il vantaggio principale dell'uso del port-mapped I/O si ha su CPU con limitate capacità di indirizzamento. Dato che il port-mapped I/O separa l'accesso a ingressi/uscite dagli accessi alla memoria, tutto lo spazio di indirizzi può essere usato per la memoria. L'accesso all'I/O è ovvio anche per una persona che legga un programma scritto in assembly, dato che si utilizzano istruzioni speciali.

Il vantaggio dell'uso del Memory-mapped I/O è che, non utilizzando una complessità ulteriore necessaria per il port-mapped I/O, la CPU richiede meno logica interna ed è di conseguenza più economica, veloce e facile da costruire; questo segue il principio del RISC (Reduced Instruction Set Computing). Dato che CPU con architetture a 16 bit stanno diventando obsolete e vengono rimpiazzate con architetture a 32 o 64 bit per gli usi più generici, riservare spazio nella mappatura di memoria per dei dispositivi di I/O non è più un problema. Il fatto che normali istruzioni di accesso in memoria siano usate per indirizzare dispositivi significa anche che tutti i modi di indirizzamento della CPU sono disponibili sia per la memoria che per gli I/O.

## Esempio

Si consideri un semplice sistema dotato di un microprocessore ad 8 bit. Un tale microprocessore fornisce indirizzi di dimensione 16-bit, permettendo di indirizzare fino a 64K byte (65,535 byte) di memoria. In un tale sistema, probabilmente i primi 32K di spazio di indirizzamento sarebbero riservati alla Random Access Memory (RAM), 16K sarebbero riservati alla Read only memory (ROM), e il rimanente ad una varietà di altri dispositivi come timer, contatori, dispositivi video ed audio, e così via. L'hardware del sistema è organizzato in modo che dispositivi sul bus degli indirizzi rispondano esclusivamente a specifici indirizzi emessi sul bus; tutti gli altri indirizzi sono ignorati. Questo lavoro è condotto dalla circuiteria che decodifica gli indirizzi, che quindi stabilisce la mappa di memoria del sistema.

In questo modo potremmo ottenere una mappa di memoria come segue:

| Dispositivo | Intervallo di indirizzamento | Dimensione |
| - | - | - |
| RAM | $0000 - $7FFF | 32K |
| ROM | $8000 - $BFFF | 16K |
| General purpose I/O | $C000 - $C0FF | 256 byte |
| Controllore audio | $D000 - $D0FF | 256 byte |
| Controllore video/text-mapped display RAM | $E000 - $E7FF | 2048 byte |

Si noti che questa mappa di memoria contiene delle porzioni non indirizzate. Anche questa decisione è piuttosto comune. Gli indirizzi nella tabella sono specificati in notazione esadecimale.

Per esempio, se il quarto registro appartenente al controllore video permette di impostare il colore di sfondo dello schermo, la CPU può impostare questo colore scrivendo un valore nella locazione di memoria $E003, usando la sua istruzione standard di scrittura della memoria. Usando lo stesso metodo, è possibile visualizzare dei caratteri su uno schermo scrivendo i valori dei caratteri in un'area speciale della RAM all'interno del controllore video. Prima dell'avvento degli schermi bit-mapped, questa era una tecnica diffusa per la visualizzazione di caratteri su schermi video.

## Tipologie di decodifica degli indirizzi

Gli indirizzi possono essere decodificati in maniera completa ed incompleta.

* La decodifica completa prevede che tutte le linee del bus degli indirizzi siano controllate per ottenere la regione di memoria di destinazione.
* La decodifica incompleta o parziale, utilizza invece circuiterie più semplici ed economiche, che esaminano solo un sottoinsieme delle linee degli indirizzi. Queste circuiterie, anche molto semplici, possono permettere che un dispositivo risponda a molteplici indirizzi, creando effettivamente delle copie virtuali del dispositivo in differenti posizioni della mappa di memoria. Naturalmente esiste un solo dispositivo fisico, quindi non vi sono particolari benefici in questa strategia, eccettuata la semplificazione del decodificatore. Il decodificatore stesso può essere programmabile, permettendo al sistema di riconfigurare la propria mappa di memoria se necessario.
