# MOS CIA

El Adaptador de interfaz compleja (CIA por sus siglas en inglés Complex Interface Adapter) 6526/8520 es un circuito integrado fabricado por MOS Technology. Sirvió como un controlador de puerto de E/S para la familia de microprocesadores 6502, proporcionando capacidades de E/S en paralelo y en serie, así como temporizadores y un reloj de hora del día (TOD). El uso más destacado del dispositivo fue en el Commodore 64 y el Commodore 128, cada uno de los cuales incluía dos chips CIA. Las unidades de disquete Commodore 1570 y Commodore 1571 contenían una CIA cada una. Además, las computadoras domésticas Amiga y la unidad de disquete Commodore 1581 empleaban una variante modificada del circuito CIA llamada 8520. El 8520 es funcionalmente equivalente al 6526, excepto por el circuito TOD simplificado.

## E/S paralelas

La CIA tenía dos puertos de E/S paralelos bidireccionales de 8 bits. Cada puerto tenía un registro de dirección de datos correspondiente, que permitía que cada línea de datos se configurara individualmente en modo de entrada o salida. Una lectura de estos puertos siempre devuelve el estado de las líneas individuales, independientemente de la dirección de datos que se haya establecido.

## E/S en serie

Un registro de desplazamiento interno bidireccional de 8 bits permitió a la CIA manejar E/S en serie. El chip podría aceptar entradas en serie sincronizadas desde una fuente externa, y podría enviar salidas en serie sincronizadas con uno de los temporizadores programables incorporados. Se generaba una interrupción cada vez que se completaba una transferencia en serie de 8 bits. Fue posible implementar una simple " red" conectando el registro de desplazamiento y las salidas de reloj de varias computadoras juntas. La tasa de bits máxima es de 500 kbit/s para la versión de 2 MHz.
La CIA incorpora una solución a un error en el registro de desplazamiento en serie en el 6522 anterior. Originalmente, la CIA tenía la intención de permitir una comunicación rápida con una unidad de disco, pero al final no se pudo utilizar debido al deseo de mantener la compatibilidad de la unidad de disco con el VIC-20; en la práctica, la unidad 1541 tuvo que hacerse aún más lenta que su predecesora VIC-20 porque el procesador del C64 está apagado durante 40 microsegundos cada 512 microsegundos para admitir video.

## Temporizadores de intervalo

Dos temporizadores de intervalo programables estaban disponibles, cada uno con una precisión de menos de un microsegundo. Cada temporizador constaba de un contador descendente predefinible de solo lectura de 16 bits y un pestillo de solo escritura de 16 bits correspondiente. Cada vez que se iniciaba un temporizador, el temporizador se copiaba automáticamente en su contador, y el contador disminuía con cada ciclo de reloj hasta el desbordamiento, en el cual se generaría una interrupción.
El temporizador podría funcionar en modo "one-shot", deteniéndose después de la primera interrupción, o en modo "continuo", volviendo a cargar el valor de retención e iniciando nuevamente el ciclo del temporizador. Además de generar interrupciones, la salida del temporizador también podría conectarse al segundo puerto de E/S.
Según lo configurado en el Commodore 64 y el Commodore 128, la sincronización de la CIA fue controlada por el reloj del sistema de fase dos, nominalmente un MHz . Esto significaba que los temporizadores disminuían a intervalos de aproximadamente un microsegundo, y el período de tiempo exacto se determinaba si el sistema usaba el estándar de video NTSC o PAL. En el C128, se empleó el alargamiento del reloj para que la sincronización de la CIA no se viera afectada por si el sistema funcionaba en modo SLOW o FAST.
Fue posible generar intervalos de tiempo relativamente largos programando el temporizador B para contar los desbordamientos del temporizador A. Si ambos temporizadores se cargaran con el valor de intervalo máximo de 65.535, se obtendría un intervalo de tiempo de una hora, 11 minutos y 34 segundos.

## Reloj de hora del día (TOD)

Se incorpora un reloj de tiempo real en la CIA, que proporciona un dispositivo de cronometraje más propicio para las necesidades humanas que la precisión de microsegundos de los temporizadores de intervalo. La hora se mantiene en el formato estadounidense de 12 horas AM/PM. El reloj TOD consiste en cuatro registros de E/S: horas (con el bit 7 actuando como el indicador AM/PM), minutos, segundos y décimas de segundo. Todos los registros se leen en formato BCD, lo que simplifica el proceso de codificación/decodificación.
La lectura de los registros siempre devolverá la hora del día. Para evitar un error de acarreo mientras se recupera el tiempo, leer el registro de horas detendrá inmediatamente la actualización del registro, sin afectar la precisión del cronometraje interno. Una vez que se haya leído el décimo registro, se reanudará la actualización. Es posible leer cualquier registro que no sea el registro de horas "sobre la marcha", haciendo que el uso de un reloj TOD en funcionamiento como temporizador sea una aplicación práctica. Sin embargo, si se lee el registro de horas, es esencial leer posteriormente el registro de décimas. De lo contrario, todos los registros TOD permanecerán "congelados".
Establecer el tiempo implica escribir los valores BCD apropiados en los registros. Un acceso de escritura al registro de horas detendrá completamente el reloj. El reloj no volverá a comenzar hasta que se haya escrito un valor en el registro de décimas. Debido al orden en que aparecen los registros en el mapa de memoria del sistema, todo lo que se requiere para escribir los registros en el orden correcto es un bucle simple. Está permitido escribir solo en el registro de décimas para "empujar" el reloj a la acción, en el cual, después de un reinicio de hardware, el reloj comenzará a la 1: 00: 00.0.
Además de sus funciones de cronometraje, el TOD se puede configurar para que actúe como un reloj de alarma, organizando para que genere una solicitud de interrupción en cualquier momento deseado. Debido a un error en muchos 6526s (vea también las erratas a continuación), la IRQ de alarma no siempre ocurriría cuando el componente de segundos de la hora de alarma es exactamente cero. La solución alternativa es establecer el valor de décimas de la alarma en 0.1 segundos.
Los circuitos internos del reloj TOD están diseñados para funcionar con una frecuencia de reloj de 50 o 60 Hz, que puede derivarse a bajo costo de la fuente de alimentación de CA, lo que da como resultado un cronómetro estable con poca deriva a largo plazo. La capacidad de trabajar con ambas frecuencias de línea de alimentación permitió usar una sola versión del 6526 en computadoras operadas en países con líneas de alimentación de 50 o 60 Hz. Es importante tener en cuenta que, contrariamente a la creencia popular, los estándares de video NTSC o PAL no están directamente relacionados con la frecuencia de la red eléctrica. Además, algunas computadoras no obtuvieron su frecuencia de reloj TOD de la fuente de alimentación principal. Por ejemplo, las variantes NTSC y PAL de Commodore SX-64 usan 60 Hz TOD reloj suministrado por un cristal dedicado. El sistema operativo KERNAL en Commodore 64, por ejemplo, determinará el estándar de video durante el inicio del sistema, pero no intenta identificar la frecuencia de reloj TOD suministrada ni inicializar las CIA correctamente en 50 Hz. Por lo tanto, es responsabilidad de cualquier software de aplicación que desee utilizar la función TOD de la CIA para determinar la frecuencia suministrada y establecer la bandera de la CIA en consecuencia. De lo contrario, el reloj puede desviarse rápidamente de la hora correcta.
La revisión 8520 de la CIA, como se usa en la unidad de disco Amiga y Commodore 1581, modifica el reloj de la hora del día para que sea un contador binario de 24 bits, reemplazando el formato BCD del 6526. Sin embargo, otro comportamiento fue similar.

## Versiones

La CIA estaba disponible en versiones de 1 MHz (6526), 2 MHz (6526A) y 3 MHz (6526B). El factor de forma fue un JEDEC estándar de 40 pines de cerámica o de plástico DIP. El 8520 CIA, con su reloj modificado de la hora del día, se utilizó en las computadoras de Amiga.
Commodore incluyó una lógica similar a la CIA reducida (solo 4 registros) para el Commodore 1571 de costo reducido dentro del C128DCR (Ver Commodore 128) en una matriz de puerta llamada 5710 que también contiene otras funciones. El 5710 CIA tiene el reloj en serie para la interfaz en serie rápida conectada a un valor de temporizador A equivalente CIA6526 de 5, lo que lleva a un tiempo por bit de 5 μs en la transmisión. Esto es diferente de lo que solía ser un valor de temporizador A de 6 en el 6526 CIA en el Commodore 1571 original. El 5710 CIA no contiene registros de control de temporizador o temporizador. Solo contiene dos registros de puerto y el registro para controlar el desplazador en serie y su evento.

## Errata

Además del error de interrupción del reloj de alarma mencionado anteriormente, muchas CIA exhibieron un defecto en el que la parte no generaría una interrupción de hardware del temporizador B si el registro de control de interrupción (ICR) se leía uno o dos ciclos de reloj antes del momento en que la interrupción debería En realidad han ocurrido. Este defecto, así como los errores lógicos en el sistema operativo provisto por Commodore (8 bits), causaron frecuentes errores pseudo -RS-232 en las computadoras Commodore 64 y Commodore 128 cuando se ejecutaban a velocidades de transmisión más altas.