El adaptador de interfaz compleja ( CIA ) 6526/8520 era un circuito integrado fabricado por MOS Technology . Sirvió como 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 TOD (hora del día). El uso más destacado del dispositivo fue en el Commodore 64 y el Commodore 128(D) , cada uno de los cuales incluía dos chips CIA. Las unidades de disquete Commodore 1570 y Commodore 1571 contenían un CIA cada una. Además, los ordenadores domésticos 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. El predecesor del CIA fue PIA .
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 configurar individualmente cada línea de datos en modo de entrada o salida. Una lectura de estos puertos siempre devolvía el estado de las líneas individuales, independientemente de la dirección de datos que se hubiera configurado.
Un registro de desplazamiento bidireccional interno de 8 bits le permitió al CIA manejar E/S seriales . El chip podía aceptar entradas seriales sincronizadas desde una fuente externa y podía enviar salidas seriales sincronizadas con uno de los temporizadores programables integrados. Se generaba una interrupción cada vez que se completaba una transferencia serial de 8 bits. Era posible implementar una " red " simple conectando las salidas de registro de desplazamiento y de reloj de varias computadoras. La tasa de bits máxima es de 500 kbit/s para la versión de 2 MHz.
La CIA incorpora una corrección a un error en el registro de desplazamiento en serie del anterior VIA 6522. La CIA fue pensada originalmente para 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, el firmware de la unidad 1541 tuvo que hacerse incluso más lento que su predecesor VIC-20 para solucionar un comportamiento del procesador de vídeo del C64 , que, al dibujar la pantalla, apagaba la CPU durante 40 microsegundos cada 512 microsegundos y en ese intervalo de tiempo no puede escuchar al bus, con el riesgo de perder algún bit. [1] [2]
Se disponía de dos temporizadores de intervalo programables, cada uno con una precisión de menos de un microsegundo . Cada temporizador constaba de un contador descendente preajustable de solo lectura de 16 bits y un latch correspondiente de solo escritura de 16 bits . Siempre que se iniciaba un temporizador, el latch del temporizador se copiaba automáticamente en su contador, y el contador luego decrecía con cada ciclo de reloj hasta que se producía un desbordamiento, momento en el que se generaba una interrupción si la CIA estaba configurada para ello.
El temporizador podría funcionar en modo "one-shot", deteniéndose después de un desbordamiento por debajo de la capacidad nominal, o en modo "continuo", recargando el valor de enclavamiento y comenzando de nuevo el ciclo del temporizador. Además de generar interrupciones, la salida del temporizador también podría estar conectada al segundo puerto de E/S.
Tal como se configuró en el Commodore 64 y el Commodore 128 , la sincronización de la CIA estaba controlada por el reloj del sistema Ø2, nominalmente un MHz . Esto significaba que los temporizadores decrecían en intervalos de aproximadamente un microsegundo, y el período de tiempo exacto se determinaba según si el sistema usaba el estándar de video NTSC o PAL . En el C-128, se empleó el estiramiento del reloj para que la sincronización de la CIA no se viera afectada por si el sistema estaba funcionando en modo LENTO o RÁPIDO.
Fue posible generar intervalos de tiempo relativamente largos programando el temporizador B para que contara los desbordamientos del temporizador A. Si ambos temporizadores se cargaran con el valor de intervalo máximo de 65.535, el resultado sería un intervalo de tiempo de una hora, 11 minutos y 34 segundos.
El CIA incorpora un reloj de tiempo real, lo que proporciona un dispositivo de cronometraje más adecuado a las necesidades humanas que la precisión de microsegundos de los cronómetros de intervalos. El tiempo se mantiene en el formato americano de 12 horas AM/PM. El reloj TOD consta de cuatro registros de lectura/escritura: horas (con el bit 7 actuando como 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/descodificación.
La lectura de los registros siempre devolverá la hora del día. Para evitar un error de acarreo al obtener la hora, la lectura del registro de horas detendrá inmediatamente la actualización del registro, sin efecto sobre la precisión interna del cronometraje. Una vez que se haya leído el registro de décimas, se reanudará la actualización. Es posible leer cualquier registro que no sea el de horas "sobre la marcha", lo que hace 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".
Para ajustar la hora se escriben los valores BCD adecuados en los registros. Un acceso de escritura al registro de horas detendrá por completo el reloj. El reloj no se pondrá en marcha de nuevo hasta que se haya escrito un valor en el registro de décimas. Debido al orden en el que aparecen los registros en el mapa de memoria del sistema , un simple bucle es todo lo que se necesita para escribir los registros en el orden correcto. Está permitido escribir solo en el registro de décimas para "empujar" el reloj a la acción, en la que después de un reinicio del hardware, el reloj comenzará a funcionar a las 1:00:00.0.
Además de sus funciones de cronometraje, el TOD se puede configurar para que actúe como un despertador , haciendo que genere una solicitud de interrupción en cualquier momento deseado. Debido a un error en muchos 6526 (ver también la errata a continuación), la IRQ de alarma no siempre se producía cuando el componente de segundos del tiempo de alarma era exactamente cero. La solución alternativa es establecer el valor de décimas de la alarma en 0,1 segundos.
El circuito interno del reloj TOD está diseñado para ser accionado por una señal de onda sinusoidal de 50 o 60 Hz . Tal como se utiliza en el C-64 y el C-128(D), la fuente de alimentación del ordenador suministraba dicha señal desde la red eléctrica, lo que daba como resultado un cronómetro estable con poca desviación a largo plazo. La capacidad de trabajar con ambas frecuencias de la línea eléctrica permitió utilizar una única versión del 6526 en ordenadores que funcionaban en países con energía de 50 o 60 Hz. Es importante señalar que, contrariamente a la creencia popular, los estándares de vídeo NTSC o PAL no están directamente vinculados a la frecuencia de la red eléctrica. Además, algunos ordenadores no derivaban su frecuencia de reloj TOD de la fuente de alimentación de la red eléctrica. Por ejemplo, las variantes NTSC y PAL del Commodore SX-64 utilizan un reloj TOD de 60 Hz suministrado por un cristal dedicado. Por ejemplo, el sistema operativo KERNAL en Commodore 64 determinará el estándar de video durante el inicio del sistema, pero no intentará identificar la frecuencia de reloj TOD suministrada ni inicializar las CIA correctamente en máquinas que funcionen a 50 Hz. Por lo tanto, es responsabilidad de cualquier software de aplicación que desee utilizar la función TOD de cualquiera de las CIA determinar la frecuencia suministrada y configurar el indicador de las CIA en consecuencia. Si no lo hace, es posible que el reloj se desvíe rápidamente de la hora correcta.
La revisión 8520 de la CIA, utilizada en el Amiga y en la unidad de disco Commodore 1581 , modificó el reloj de la hora del día para que fuera un contador binario de 24 bits, reemplazando el formato BCD del 6526. Sin embargo, el resto del comportamiento era similar.
La CIA estaba disponible en versiones de 1 MHz (6526), 2 MHz (6526A) y 3 MHz (6526B). El encapsulado era un DIP de plástico o cerámica de 40 pines, estándar JEDEC . La CIA 8520, con su reloj de hora del día modificado, se utilizó en los ordenadores Amiga .
Commodore incorporó 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 puertas llamada 5710 que también contiene otras funciones. La CIA 5710 tiene el reloj serial para la interfaz serial rápida cableado a un valor de Timer A equivalente a CIA6526 de 5, lo que genera un tiempo por bit de 5 μs en la transmisión. Esto es diferente de lo que solía ser un valor de Timer A de 6 en la CIA 6526 en el Commodore 1571 original . La CIA 5710 no contiene temporizador ni registros de control de temporizador. Solo contiene dos registros de puerto y el registro para controlar el cambiador serial y su evento.
Además del error de interrupción del despertador mencionado anteriormente, muchas CIA presentaban un defecto en el que la pieza no generaba 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 haberse producido realmente. Este defecto, así como los errores lógicos en el sistema operativo proporcionado por Commodore (8 bits), causaban frecuentes errores pseudo- RS-232 en las computadoras Commodore 64 y Commodore 128 cuando funcionaban a velocidades de transmisión más altas .