# MOS 6526

Il MOS 6526 Complex Interface Adapter (CIA) è un circuito integrato prodotto da MOS Technology. Fu usato come controller input/output per la famiglia di microprocessori 65xx, a cui forniva capacità di accedere alle porte di comunicazione in modalità parallela e seriale; poteva essere usato anche come timer programmabile e come orologio. Ne fu prodotta anche una versione in tecnologia HMOS-III denominata MOS 8520 che, rispetto al 6526, aveva un consumo energetico inferiore ed aveva l'orologio interno leggermente modificato.
Il dispositivo fu usato prevalentemente negli home computer Commodore 64, Commodore 128(D) e Amiga, ognuno dei quali impiegava 2 chip. Fu usato anche nelle unità a dischi Commodore 1570, Commodore 1571 e Commodore 1581 (1 chip per periferica).

## I/O parallelo

Il CIA ha 2 porte di I/O parallele bidirezionali, ognuna delle quali ha un suo registro di direzione dei dati (Data Direction Register) che permette di impostare in ingresso o in uscita ogni singola linea. Una lettura delle porta restituisce sempre lo stato delle singole linee, indipendentemente dalla direzione di trasmissione impostata.

## I/O seriale

Un registro a scorrimento ad 8 bit permette al CIA di gestire la trasmissione seriale dei dati. Il chip può accettare una fonte esterna del segnale di clock e può inviare in uscita i dati in modalità seriale sincronizzandoli con uno dei temporizzatori programmabili integrati. Ogni volta che viene completata la trasmissione seriale di 8 bit viene generato un interrupt. Collegando insieme le uscite del clock e del registro a scorrimento dei CIA di differenti computer è possibile implementare una semplice rete.
La velocità di trasmissione massima è di 500 kbit/s per la versione a 2 MHz.

## Sincronizzazione

Il chip prevede 2 linee di controllo (/FLAG e /PC) che permettono di sincronizzare più CIA: queste linee, insieme ad 8 delle 16 linee parallele, consentono di usare il CIA come un semplice amplificatore di segnale compatibile Centronics.

## Temporizzatori

Il CIA offre 2 temporizzatori programmabili, ognuno con un livello di precisione al microsecondo. Ogni temporizzatore è composto da un contatore a 16 bit a sola lettura e da un corrispondente flip-flop in sola scrittura a 16 bit. Nel momento in cui viene avviato un temporizzatore, il suo flip-flop viene copiato automaticamente nel suo contatore, che viene decrementato ad ogni ciclo di clock finché non giunge a zero. A questo punto viene generato un interrupt.
Il temporizzatore può operare sia in modalità "singola", ovvero fermandosi dopo il primo interrupt, che "continua", ricaricando il valore scelto dopo ogni ciclo e ripartendo nel conteggio. Oltre a generare interrupt, l'uscita del temporizzatore può essere instradato sulla seconda porta di I/O.
È possibile generare intervalli relativamente lunghi programmando il temporizzatore B per contare gli azzeramenti del temporizzatore A: se entrambi raggiungono il massimo valore possibile, 65.536, allora è stato ottenuto un tempo di 1 ora, 11 minuti e 34 secondi.
Nel Commodore 64 e nel Commodore 128 i temporizzatori del CIA erano controllati dal segnale Φ2 (phase 2) del clock di sistema, che generalmente era ad 1 MHz: ciò significava che essi venivano decrementati approssimativamente ogni microsecondo. La durata esatta del periodo era però determinata dallo standard video usato nel sistema, se NTSC o PAL, che influenzava la frequenza a cui operava il computer. Per ovviare a questo problema nel C128 si ricorse ad una tecnica denominata clock stretching, che permetteva di variare il clock in modo che i temporizzatori non fossero affetti dall'alterazione del clock di sistema quando il computer passava dalla modalità "SLOW" a quella "FAST".

## Funzione di orologio

Nel CIA è incorporato un orologio che fornisce l'orario in formato a 12 ore AM/PM. Esso è composto da 4 registri che tengono traccia, rispettivamente, delle ore (il 7° bit di questo registro opera come segno AM o PM), dei minuti, dei secondi e dei decimi di secondo. Tutti questi registri memorizzano i dati in formato BCD, semplificando le operazioni di codifica/decodifica dell'orario.
La lettura dei registri restituisce sempre l'orario giornaliero. Per evitare errori di resto durante il recupero dell'orario, ogni operazione di lettura ferma immediatamente l'aggiornamento dei registri senza però compromettere l'accuratezza dell'orologio perché internamente il CIA continua l'aggiornamento dell'orario. Ogni registro, tranne quello delle ore, può essere letto "al volo", senza bloccare l'aggiornamento dello stesso. La lettura delle ore deve invece essere seguita dalla lettura dei decimi di secondo, operazione che fa ripartire l'aggiornamento dei registri.
Per impostare l'orario è necessario scrivere i giusti valori in formato BCD nei registri. Un accesso in scrittura al registro delle ore blocca l'orologio: esso riparte solo dopo la scrittura nel registro dei decimi di secondo. Dopo un'accensione del computer, i registri dell'orologio sono impostati a 1:00:00.0: con una semplice operazione di scrittura nel registro dei decimi di secondo si avvia il conteggio del tempo.
Oltre a fornire l'orario, l'orologio può essere configurato come un allarme, per generare una richiesta di interrupt ad un determinato orario. A causa di un bug presente in molti 6526, l'interrupt relativo all'allarme non viene generato quando i secondi dell'orario di allarme sono esattamente uguali a 0: per aggirare questo problema basta impostare il registro dei decimi di secondo a 1.
L'orologio interno era progettato per essere governato da un segnale di ingresso prelevato direttamente dalla fonte di alimentazione a corrente alternata, sia essa a 50 che a 60 Hz, così da permettere un'accuratezza dell'orario la più elevata possibile e la più duratura nel tempo. Questa possibilità di operare sia con una frequenza della tensione a 50 Hz che con una a 60 Hz permise al 6526 di poter essere adoperato indistintamente sia sui computer con segnali video in formato NTSC che PAL. Nei Commodore ad 8 bit era il software che doveva informare il CIA circa le frequenze regionali usate dal sistema, dato che il sistema operativo non eseguiva tale compito: non eseguire tale operazione comportava un'imprecisione nella gestione dell'orario fornito dall'orologio.

## Versioni

Il CIA fu prodotto con un package DIP40 in diverse versioni:
* 6526, con frequenza di 1 MHz;
* 6526A, identico al precedente ma capace di lavorare a 2 MHz;
* 8520, CIA prodotto con tecnologia HMOS-III destinato al computer Commodore Amiga. Rispetto al 6526 aveva un orologio interno basato su un contatore binario a 24 bit;
* 5710, una versione ridotta del CIA (solo 4 registri interni) prodotta per l'unità a dischi 1571CR.

## Bug

Oltre al già menzionato bug che affliggeva l'interrupt collegato all'allarme dell'orologio, molti CIA avevano un difetto che impediva la generazione dell'interrupt legato al temporizzatore B se il registro di controllo dell'interrupt era letto 1 o 2 cicli di clock prima del verificarsi dell'interrupt stesso. Questo bug causava spesso errori sulla RS-232 nei C64 e C128 quando questi accedevano ad alta velocità alla porta seriale.