Revistas en Papel
Anterior
Menú
Logotipo

AMIGA.InFo • Mayo/Junio 1995 • Número 3

 
 

AMIGA INTERNO

F.Martin

NOTA: Pulsando sobre las fotos con borde azul ampliarás la imagen.

 

LOS CIA DEL AMIGA:
Complex Interface Adapters
(Parte 1)

En todo esquema interno de un ordenador aparece una circuitería dedicada a la entrada/salida de datos a través de los puertos, así como señales de control de los periféricos, tanto internos como externos, utilizados por los protocolos de comunicación.

De forma general, debido a que un microprocesador por sí solo no dispone de estas señales, se han diseñado circuitos programables que permitan generar con flexibilidad distintas señales para distintos protocolos estándares.

En Amiga existe un chip que engloba la mayor parte de las señales de control y comunicación de datos con los periféricos: EL CIA.


Introducción

A los usuarios de los Amiga 500 y A2000, seguramente nos sonará, y a veces desafortunadamente, el nombre CIA. ¿A quién le ha dejado de funcionar el puerto paralelo o el serie? ¿A quién le da errores de lectura o escritura cuando accede a la unidad de disco? Probablemente éstos y otros muchos problemas de funcionamiento que aparecen a lo largo de la vida de un Amiga, vienen ocasionados la mayoría de las veces por un mal funcionamiento de este chip con nombre de "central de inteligencia" ...

Para los poseedores de Amigas más reciente -A1200, A4000-, estos problemas no son tan frecuentes, puesto que en ambos las CIAs están mejor protegidas contra errores de conexión y sobrecargas eléctricas en los puertos paralelo y serie. Sin embargo...nunca se sabe..., así que, es muy recomendable siempre efectuar las conexiones en estos puertos con el ordenador apagado.

Diseñado por Commodore, el Complex Interface Adapter tiene su historia en el ordenador C64 -por todos conocidos-, ya que éste integraba en su placa base dos CIA tipo 6526. Las diferencias entre aquel modelo y el actual, denominado 8520, son internamente mínimas, puesto que su diseño responde a la necesidad de integrar al máximo en una sola pastilla de silicio todas las funciones de Entrada/Salida, así como contadores, relojes, señales de control de periféricos, etc. Posiblemente los diseñadores del Amiga aprovecharon este versátil componente debido a su facilidad de integración dentro de cualquier sistema y, por supuesto, a motivos económicos, ya que todo el proceso de producción estaba montado en la fabricación del anterior modelo C=64.

Puesto que fue ideado para trabajar con máquinas de ocho bits, y más concretamente, con el antiguo procesador 6502 del C=64, el microprocesador del Amiga accede a los registros del CIA en modo síncrono -necesita un reloj que sincronice y marque los accesos-. Por la misma razón, los datos utilizados son siempre de tamaño byte, así como todos sus registros internos, aunque algunos de ellos se unen -Byte alto, Byte bajo- para formar palabras de 16 bits.

El hecho de que su arquitectura interna sea de 8 bits, puede parecer actualmente desfasado, y sobre todo cuando han aparecido máquinas de 32 bits como puedan ser el A3000, A1200 ó A4000. Sin embargo, se podrá observar en los siguientes apartados cómo los dos CIA's integrados en el Amiga son utilizados al máximo en todas las funciones que tienen asignadas, como pueden ser control del puerto paralelo Centronics o Serie, actuar como contadores y relojes programables de alta precisión, generar algunas señales de control de las unidades de disco, control del teclado, joystick, ratón, etc.

El acceso al CIA se realiza mediante 16 registros internos de tamaño byte, mapeados en memoria como direcciones. Esta característica, debida a que los MC680X0 tienen todos sus circuitos periféricos mapeados en memoria, facilita un acceso rápido y una programación sencilla. Evidentemente, en el espacio de direcciones ocupado por los CIA, no existe memoria física usable por el programador o por el sistema, sino que se accede directamente a los registros que posee dicho integrado, propósito logrado gracias a un circuito denominado 'lógica de decodificación'.

Cuando se lee/escribe en una dirección mapeada en un registro interno CIA, esta lógica de decodificación se encarga de activar convenientemente al CIA para que el dato se lea/escriba en su registro interno correcto y no en memoria. Según el modelo de Amiga, la lógica está compuesta por simples puertas lógicas o integrada en el interior de un chip denominado Gary del cual se hablará en posteriores capítulos.

Existen diferencias entre algunos modelos de Amiga en cuanto al reloj de sincronización utilizado. esto se debe al microprocesador que llevan incorporado en la placa, en caso de ser un MC68000/MC68010, todas las señales de control son generadas por el propio microprocesador, desde la frecuencia de funcionamiento (EClock 0.7 MHz) hasta las señales de selección y lectura/escritura (R/W) de registros. Sin embargo, las máquinas que incorporen los MC68020, MC68030. MC68040 han de suplirse con un componente secundario que genere todas estas señales y actúe como lógica de decodificación.

En los siguientes apartados de este capítulo, se describen detalladamente todas las características y partes de un 8520, pero adelantemos algunas de ellas:

  • 16 líneas programables de entrada/salida, divididas en dos puertos paralelos de 8 bits (PA y PB).
  • Líneas de protocolo de 8 y 16 bits para entrada/salida.
  • 2 temporalizadores de intervalo en cascada de 16 bits (A y B).
  • Un contador de 24 bits con alarma programable (TOD).
  • Registro de desplazamiento de 8 bits para la entrada/salida en serie (SP).
  • 16 registros internos de control que se encuentran mapeados en la memoria y son accedidos por el microprocesador.
  • Posibilidad de generar interrupciones de nivel 2 y nivel 6.


Un par de socios directos del microprocesador

Tal y como se ha citado anteriormente, el CIA es un chip conectado directamente al bus de direcciones y de datos del procesador (ver nros. AInFo 1 y 2). Debido a esto, es el mismo procesador el único que puede acceder a ellos para controlarlos y leer/escribir datos en sus registros. Ningún otro chip tiene acceso directo a un CIA.

Hasta ahora hemos hablado del CIA en singular, sin embargo, en la placa de todos los modelos de Amiga existen dos chips CIA idénticos, pero con distintas funciones a realizar. de forma "muy original", se suele llamar a cada uno de ellos como CIA A o CIA B, o CIA Par o CIA Impar, por razones que más tarde veremos.

¿Dónde están los CIA en un A1200?

Es interesante observar estas dos imágenes de dos modelos diferentes de Amiga. En este caso tenemos un A1200, con sus dos CIAs. Si nos fijamos detenidamente observaremos que no son como las del 500, sino que están soldadas sobre la superficie de la placa y sin zócalo. Por desgracia, aunque este sistema de ensamblaje de componentes es mucho más seguro y económico, hoy en día, es difícil de reparar en caso de avería, puesto que se requieren herramientas diseñadas para tal fin.

Se puede apreciar que un CIA del A1200 -iguales a los del A4000- ocupa la mitad del espacio que en el A500.


¿Dónde están los CIA en un A500?

Es fácil encontrar los dos CIAs del A500, puesto que son de gran tamaño y exactamente iguales. Van ensamblados en un zócalo, y es fácil su extracción en caso de avería. Aunque los chips colocados en zócalos tienen esa ventaja, son más propensos a tener averías y sufrir daños por contactos defectuosos entre el zócalo y los pines del integrado. Los costes de fabricación son más elevados, y actualmente todos los fabricantes han dejado de lado este tipo de montaje para pasar al de soldadura directa en superficie.

Truco: Muchas veces, en los Amiga que tienen los CIA en zócalos, es posible solucionar una avería intercambiando los dos CIAs. Si hay suerte, la parte averiada del CIA no es utilizada en el otro zócalo, y por lo tanto podremos utilizarlo sin problemas graves. es una solución temporal pero efectiva en momentos de desesperación. Por ejemplo, el puerto de la impresora no funciona correctamente y hemos detectado que el CIA es muy probable que esté averiado. Intercambiamos ése CIA con el otro y seguramente el puerto paralelo volverá a funcionar...

El trío "CIA A / Microprocesador Motorola / CIA B" está muy unido en cuanto a intercambios de información y tareas que llevan a cabo en común.

Por una parte, para el microprocesador, los CIA son un puente para recibir o enviar datos al exterior del ordenador, a través de los puertos paralelo o serie. También obtiene de ellos unos temporizadores programables de alta precisión que miden el tiempo transcurrido en producirse un determinado evento, y estos relojes son mucho más precisos de lo que el propio microprocesador podría ser si los programáramos para ello.

También programa a través de ellos varias señales de control de las unidades de disco y del teclado, y tiene la posibilidad de generar señales periódicas de amplitud variable con tan sólo un poco de programación del CIA.

Por otra parte, los CIA son parte muy importante dentro del funcionamiento del sistema operativo del Amiga. En sus temporizadores se basa el tiempo o "quantum" para cambiar de tarea al microprocesador y pasar a ejecutar otra -es decir, la multitarea-. También están basados muchos dispositivos -"devices"- de control de algunos periféricos como son el trackdisk.device, keyboard.device y algunas librerías como la graphics.library y la exec.library.


¿Para qué programar un CIA?

A muchos de nuestros lectores quizás les interese el tema por curiosidad, a otros, podría interesarles por su afición a la electrónica, y a otros por saber programar un chip más del Amiga y sacar partido de él.

Para los que sean aficionados a la electrónica, gracias a los dos CIA se puede disponer de dos puertos de 8 canales de entrada/salida de datos con los CIA podemos obtener un magnífico generador de interrupciones para el procesador. Podemos programar un CIA de forma que pasado un cierto tiempo -que puede ir de nanosegundos a minutos- genere una señal directa al microprocesador. Este la recibe y pasa inmediatamente a ejecutar una rutina especial que atenderá a esa señal, es decir, una rutina de servicio a la interrupción (o RSI).

Descripción de Pins

El Cia 8520 tiene 40 patillas de conexión, cada una con una función determinada. En la figura derecha se muestran todos los pines y a continuación se describen las señales. El esquema representa el tipo de CIA que está insertado en zócalo (tipo DIP) incorporado en todos los Amiga excepto los A1200 y A4000, modelos donde la tecnología empleada para su fabricación ha cambiado totalmente, ya que son montados directamente en la superficie de la placa base (SMD) sin necesidad de zócalo. (Quién tiene esquemas de un A1200/A4000 ???)

Básicamente los pines principales de conexión corresponden a los que se puedan encontrar en un circuito de control de periféricos, es decir, 8 líneas de bus de datos, 4 líneas de selección de registros (16 posibles registro), Chip Select o Pin de permiso de funcionamiento del CIA, reloj y Reset. Los pines TOD, CNT, -PC, FLAG son entradas/salidas de las frecuencias de los distintos temporizadores y controladores internos que existen, mientras que PA/PB son las líneas de entrada/salida de los puertos paralelos de 8 bits.

Podríamos encontrar cierta semejanza entre el CIA y el Intel 8250 que incorporan la mayoría de los PCs para puertos de entrada/salida, aunque este último no tiene contador de 24 bits, dos puertos de 8 bits, etc.

Y es que cada chip CIA incorpora 16 patillas de propósito general -dos puertos de entrada/salida programables a nivel de bit-, un registro de desplazamiento en serie, tres temporizadores, un generador de pulsos y una entrada detectora de pulsos por flanco. No está nada mal para ser un chip diseñado por Commodore en los 80... ¿verdad?

Pin/s Señal Descripción
 
1 GND Masa
2-9 PA0->PA7 Puerto A de E/S; 8 bits, bidireccional
10-17 PB0->PB7 Puerto B de E/S; 8 bits, bidireccional
18 -PC Puerto de control, indica la disponibilidad de datos en el puerto B o en ambos puertos (salida)
19 TOD Time /of Day, dispara el contador de 24 bits (entrada)
20 VCC +5V, Tensión de alimentación
21 -IRQ Interrupt Request, indica la existencia de petición de interrupción al microprocesador
22 -R/W Read/Write, entrada
  0 = leer del bus de datos
  1 = escribir en el bus de datos
23 -CS Chip Select:
  0 = bus de datos válido (entrada),
  1 = bus de datos en estado de alta impedancia
24 -FLAG La misma función que -PC (entrada)
25 O2Phi2 Reloj de uso interno (0.7MHz) para sincronización con el bus de datos del microprocesador
26-33 D/->D0 Enlace bidireccional con el bus datos del procesador
34 -RES Reset:
  0 = inicializar el estado original del CIA (entrada)
35-38 A3-A0 Líneas para seleccionar uno de los 16 reg. del CIA
(sólo válido cuando -CS=0) entrada)
39 SP Serial Port: sirve de entrada/salida del registro de desplazamiento SP (bidireccional)
40 CNT Count: Entrada/salida de la frecuencia del registro de desplazamiento, o entrada de la frecuencia del temporizador de intervalo A/B (bidireccional)

Mientras el procesador ejecuta la rutina RSI, el código del programa que estaba ejecutándose antes de la interrupción del CIA queda en un estado congelado, y se volverá a él una vez finalizada dicha RSI.

De hecho, los dos CIA pertenecen al conjunto de los chips del Amiga que permiten generar interrupciones hardware al procesador. Otros chips son el Blitter, el Copper, etc de los que hablaremos próximamente.

Los temporizadores internos son una de las partes del CIA que puede funcionar como generador de interrupción, pero también lo pueden ser el registro de desplazamiento del puerto serie, el contador de 24 bits o si existe una señal en un pin denominado FLAG. De todas estas fuentes hablaremos más adelante, cuando veamos interesantes ejemplos de programación.

Sin embargo, probablemente el tema de más interés podría ser programar los puertos para recibir o enviar datos.

Algunos ejemplos de ello son la programación de protocolos de comunicación -ya sea por el puerto serie o paralelo- o la obtención de datos a través de conversores analógicos/digitales de vídeo o sonido.

La unión de todos estos ingredientes en un solo chip dan multitud de posibilidades diferentes de aplicación, además, afortunadamente, no es complicada su programación como ya veremos.

Líneas de control externas:
Estas líneas de entrada permiten seleccionar el registro del CIA al que se accede, si es escritura/lectura, resetear el estado del chip... etc. Todas son generadas por el 68000 o por el Gary.
NOTA: Las flechas anchas indican bus 8 bits y las de trazo simple son de 1 bit.
Las señales con asterisco * indican que son activas a nivel bajo.
Diagrama de bloques del CIA 8520


Diagrama de Bloques

Una forma de comprender las partes básicas que componen un CIA es observando un esquema donde se muestren, a nivel de bloques, las principales interconexiones que existen en ellas. En la figura superior podemos observar los distintos bloques que forman internamente al CIA, destacando un bus de datos interno de 8 bits que sirve de puente entre el microprocesador y los registros internos. Estos últimos están conectados mediante sus buffers correspondientes a líneas externas a donde mandan o extraen información.

Fundamentalmente los componentes activos de la figura son:

- Temporizadores A y B:

Son contadores de 16 bits, pero con la particularidad de que decrementan el valor inicial hasta llegar a cero. Su frecuencia es variable, y son utilizados principalmente para medir tiempos del orden de microsegundos o nanosegundos. Los dos que existen en cada CIA pueden trabajar sincronizados para formar un contador de 32 bits.

- Controlador TOD de 24 bits:

Es un contador normal, es decir, incrementa un valor inicial hasta llegar al máximo valor de 2^24 bits. Su frecuencia es normalmente 50 Hz, puesto que el reloj proviene de la línea de sincronismo vertical de pantalla, aunque en algunos nuevos modelos de Amiga puede variar a 48 Hz o 72 Hz según el modo de pantalla. Es utilizado normalmente para medir tiempos del orden de horas, minutos o segundos.

- Puertos A y B:

Cada puerto está formado por 8 líneas paralelas, donde cada una de ellas puede actuar como entrada o salida independientemente de las demás. Se utilizan principalmente para controlar periféricos externos como puedan ser impresoras, digitalizadores, joysticks, ratón... etc.

- Puerto SP:

Puerto de una sola línea utilizado para enviar o recibir datos en serie. Es posible mediante este puerto convertir datos paralelos a serie, y viceversa. El teclado, por ejemplo, está conectado a esta línea para enviar los códigos de las teclas pulsadas.

Existe un registro central denominado INT/MASK utilizado como máscara y registro de estado de las interrupciones que provoquen los temporizadores A/B, contador de 24 bits o pin externo -FLAG. Estos últimos pueden trabajar en conjunto o individualmente y son totalmente accesibles al programador.

Los dos temporizadores A y B tienen cada uno su respectivo registro de control, así como los puertos de 8 bits. Hay que notar cómo algunos de los bloques están interrelacionados, es decir, pueden variar en función de su estado el funcionamiento de otro bloque. Un ejemplo de ello es cómo el bloque puerto SP tiene una línea conectada directamente a los dos temporizadores, utilizados para generar la frecuencia de la entrada/salida de los bits en serie, es decir, la velocidad de transmisión.

Este diagrama de bloques es exactamente el mismo para los dos CIAs, sin embargo, la misión que desempeña cada uno de ellos es diferente una vez se integran en la placa del Amiga. Los puertos, contadores, etc, da cada CIA son utilizados y compartidos tanto por el sistema operativo como por otros componentes hardware, para tareas completamente independientes o relacionadas entre sí.

Si bien los bloques y el pin-out vistos hasta ahora son importantes, en realidad el corazón de todo el chip reside en un banco de 16 registros de control y de datos que cada CIA posee. Desde el punto de vista del programador, es la única vía de acceso que se tiene a este chip y como consecuencia de ello, es necesario detallar qué función tiene cada uno para poder programarlo. Veámoslo a continuación.

Conexión al Sistema Amiga

En los anteriores apartados, el CIA se ha mostrado desde un punto de vista independiente, sin tener en cuenta la aplicación que dentro del sistema Amiga pudiera tener. En este apartado, se integra al CIA con los restantes componentes y se detallan las funciones asignadas a los pins que se vierten en el apdo. 2.2.1.1.

A continuación, se detallan las líneas del sistema Amiga que están directamente conectadas con los pins del CIA A:

CIA A

Pin Línea de conexión
-IRQ -INT2 Genera una interrupción de nivel 2. Salida conectada al Paula
-RES Conectado a la línea de reinicialización (Reset) del sistema
D0-D7 Conectado a los bits 0.7 del bus de datos del procesador
A0-A3 Conectado a los bits 8-11 del bus de direcciones del procesador
phi2 Conectado a la frecuencia 'E', generada por el 68000 o Gary (0.7 Mhz)
R/-W Conectado a la señal Lectura/Escritura generada por el 68000 o Gary
PA7 Conectado al puerto de juego no 1, pin 6 (Botón de disparo)
PA6 Conectado al puerto de juego 0, pin 6 (botón de disparo)
PA5 -RDY Señal de control desde la unidad de disco. Indica si el disco está preparado
PA4 -TK0 Señal de control desde la undiad de disco. Indica que el cabezal está en la pista 0
PA3 -WPRO Señal de control desde la unidad de disco. Indica si el disco está protegido contra escritura
PA2 -CHNG Señal de control desde la unidad de disco. Indica que se ha cambiado de disco
PA1 LED Señal que controla el LED de POWER del ordenador (1=apagado, 0=encendido)
PA0 Bit de solapamiento de memoria (NO CAMBIAR!!!)
SP KDAT Conectado a la línea de comunicación serie con el teclado
CNT KCLK Línea de reloj utilizada por el teclado
PB0-PB7   Puerto de datos paralelo Centronics (8 bits)
PC -DRDY Señal del protocolo Centronics: Datos preparados
FLAG -ACK Señal del protocolo Centronics: Data Acknowledge

A continuación se detallan las líneas del sistema Amiga que están directamente conectada con los pins del CIA B:

CIA B

Pin Línea de conexión
-IRQ INT 6 Genera una interrupción de nivel 6 Salida conectada al Paula
-RES Conectado a la línea de reinicialización (Reset) del Sistema
D0-D7   Conectado a los bits 8-15 del bus de datos del procesador
phi2 Conectado a la frecuencia 'E', generada por el 68000 o Gary (0.7 MHz)
R/-W Conectado a la señal Lectura/Escritura generada por el 68000 o Gary
PA7 -DTR Señal utilizada puerto serie RS323C Data Terminal Ready
PA6 -RTS Señal utilizada en el puerto serie RS323C Request To Send
PA5 -CD Señal utilizada en el puerto serie RS323C Carrier Detect
PA4 -CTS Señal utilizada en el puerto serie RS232C Clear To Send
PA3 -DSR Señal utilizada en el puerto serie RS323C Data Set Ready
PA2 SEL Señal utilizada en el puerto paralelo Centronics Select
PA1 POUT Señal utilizada en el puerto paralelo Centronics Paper Out
PA0 BUSY Señal utilizada en el puerto paralelo Centronics Busy
SP Conectado directamente con PA0
CNT Conectado directamente con PA1
PB7 -MTR Conectado a la undiad de disco. Controla la activación/desactivación del motor de giro
PB6 -SEL3 Conectado al puerto de la undiad externa de disco. Selecciona la unidad no 3
PB5 -SEL2 Conectado al puerto de la unidad externa de disco. Selecciona la undiad no 2
PB4 -SEl1 Conectado al puerto de la unidad externa de disco. Selecciona la unidad no 1
PB3 -SEL0 Conectado al puerto de la unidad interna de disco. Selecciona la unidad interna no 0
PB2 -SIDE Señal de control para la unidad de disco. Indica la cara del disco a la que se accede
PB1 DIR Señal de control para la undiad de disco. Indica la dirección del movimiento del cabezal
PB0 -STEP Señal de control para la unidad de disco
PC No usado
FLAG INDEX Señal de control desde la undiad de disco. Es una señal de sincronización


Registros Internos del CIA

La programación del CIA se realiza a través de 16 registros intenros que proporciona un acceso directo al hardware. Cada uno de ellos se podría clasificar, según su función, dentro de dos grupos:

  • Registros de Estado: Cuando se efectúa una lectura, obtenemos el estado actual de, por ejemplo, un contador, temporizador o puerto. Cuando se accede para escribir, modificamos el estado de uno de ellos.

  • Registros de Control: Estos registros normalmente están divididos en 8 bits diferentes. Cada uno de ellos tiene asignada una función de control sobre alguna parte del CIA, ya sea puertos, contadores, temporizadores ... Mediante estos registros se puede cambiar el modo de funcionamiento de una de estas partes.

Hay que prestar atención a algunos de los registros, ya que pueden realizar dos funciones distintas según el tipo de acceso: escritura o lectura. Por ejemplo, el registro número 4 refleja el estado del temporizador A (byte bajo) si se realiza una lectura, en caso contrario, si escribimos en él, cargamos el valor inicial a partir del cual se decrementará este mismo contador hasta llegar a cero. Este tipo de registros tienen explicadas por separado las funciones que realizan, según sea el acceso para lectura o escritura.

Todos los registros son de tamaño byte, aunque algunos de ellos forman parte de un valor de 16 ó 24 bits en forma de byte bajo, medio o alto. Es el caso de los registros de estado de los temporizadores de 16 bits y el contador de 24.

Es recomendable no acceder a los registros que Commodore ha clasificado como NO UTILIZADOS, puesto que su función es desconocida o en futuras versiones podrían ser implementados (!).


¿Cómo podemos acceder a estos registros?

Como ya hemos dicho anteriormente, los CIA están integrados en el sistema Amiga de forma que puedan ser accedidos directamente por el procesador. en el mapa de memoria del Amiga existen dos zonas dedicadas a los CIA. Cuando escribimos o leemos valores de determinadas posiciones de esta zona de memoria, estamos leyendo directamente los registros internos del CIA. La suma total de los 16 registros de cada CIA hacen un total de 32 posiciones diferentes de memoria a las que podemos acceder.

Esta técnica se denomina "mapeo en memoria de la entrada/salida", y es una característica que todos los procesadores de la familia Motorola 680x0 tienen en común.

Mediante este método, podemos acceder a los registros internos del CIA de una manera muy fácil, como si de posiciones de memoria se tratasen. Pongamos un ejemplo el registro de control general -llamado CRA- del CIA A está mapeado en la posición de memoria $BFEE01.

Mediante la siguiente instrucción de ensamblador:

   MOVE.b #5, $BFEE01

estaremos colocando un 5 (%00000101 en binario) en el registro CRA.

Si por el contrario, queremos leer su estado:

   MOVE.b $BFEE01, D0

esta instrucción nos copia el contenido del registro CRA en el registro del procesador D0.

Para diferenciar cada uno de los dos CIA's se denomina CIA A al que tiene como dirección base %BFE001, y CIA B al que tiene la $BFD000.

No son accedidos en posiciones consecutivas de memoria, sino que entre registro y registro existe un espacio de 256 bytes, con direcciones siempre impares (CiA A) o pares (CIA B) -de aquí que alguna vez se denominen CIA par y CIA impar-.

 DESCRIPCIÓN REGISTROS 
INTERNOS DEL CIA

REG 0  PRA
(Port Register A)

$0
Acceso: Lectura/Escritura
Función: Corresponde al estado de los pins PA0-PA7 (Puerto A). Contienen el dato recibido o enviado.

REG 4  TALO
(Timer A LO-Byte)

$4
Acceso: Lectura
Función: Registro que refleja el estado actual del byte menos significativo del temporizador A (timer A).
Acceso: Escritura
Función: Registro donde se almacena el byte bajo del valor, a partir del cual, el temporizador inicia la cuenta atrás.

REG 8  TODLOW Event low
(Time Of Day, LO-Byte)

$8
Acceso: Lectura
Función: Contiene los bits 0-7 del contador de 24 bits.
Acceso: Escritura
FUnción: Inicializa los bits 0-7 del contador con un determinado valor.

REG 1  PRB
(Port Register B)

$1
Acceso: Lectura/Escritura
Función: Corresponde al estado de los pins PB0-PB7 (Puerto B). Contienen el dato recibido o enviado.

REG 5  TAHI
(Timer A, HI-Byte)

$5
Acceso: Lectura
Función: Registro que refleja el estado actual del byte más significativo del temporizador A (timer A).
Acceso: Escritura
FUnción: Registro donde se almacena el byte alto del valor, a partir del cual el temporizador inicia la cuenta atrás.

REG 9  TODMID Event med
(Time Of Day, MED-Byte)

$9
Acceso: Lectura
Función: Contiene los bits 8-15 del contador de 24 bits.
Acceso: Escritura
Función: Inicializa los bits 8-15 del contador con un determinado valor.

REG 2  DDRA
(PortADataDirection Register)

$2
Acceso: Lectura/Escritura
Función: Bits que determinan la dirección del flujo de datos de las líenas del puerto A (1= línea de salida, 0= línea de entrada)

REG 6  TBLO
(Timer B, LO-Byte)

$6
Acceso: Lectura
Función: Registro que refleja el estado actual del byte menos significativo del temporizador B (timer B).
Acceso: Escritura
FUnción: Registro donde se almacena el byte bajo del valor, a partir del cual el temporizador inicia la cuenta atrás.

REG 10  TODHI Event high
(Time Of Day, HI-Byte)

$A
Acceso: Lectura
Función: Contiene los bits 16-23 del contador de 24 bits
Acceso: Escritura
Función: Inicializa los mbits 16-23 del contador con un determinado valor.

REG 3  DDRB
(PortBDataDirection Register)

$3
Acceso: Lectura/Escritura
Función: Bits que determinan la dirección del flujo de datos de las líneas del puerto B. (1= Línea de salida, 0= línea de entrada)

REG 7  TBHI
(Timer B, HI-Byte)

$7
Acceso: Lectura
Función: Este registro refleja el estado actual del byte más significativo del temporizador B (timer B).
Acceso: Escritura
Función: En este registro se carga el byte bajo del valor, a partir del cual el temporizador inicia la cuenta atrás.

REG 11  NO USADO

$B

REG 12  SP o SDR
(Serial port data register)

$C
Acceso: Lectura/Escritura
Función: Contiene el dato enviado o recibido, en serie, por el puerto serial (Pin SP)


REG 13  ICR
(Interrupt Control Register)

$D
Acceso: Lectura (Int Data)
Función: Registro de datos donde cada uno de los bits tiene asignado una fuente de interrupción:
ATENCIÓN: Al leer este registro todos sus bits son desactivados a cero. (Hay que salvarlo previamente a la lectura si querremos utilizarlo más tarde)
TA bit 0: Llegada al valor cero (underflow) del temporizador A (si activado a 1)
TB bit 1: Llegada al valor cero (underflow) del temporizador B (si activada a 1)
ALRM bit 2: Coincidencia del valor del contador de 24 bits con el valor almacenado en la alarma (si activado a 1)
SP bit 3: El registro de desplazamiento del puerto serial está completo (si activado a 1) o vacío (si activado a 0)
FLG bit 4: indica si existe señal en el pin Flag.
- bit 5: Siempre a cero.
- bit 6: Siempre a cero
IR bit 7: Existe la coincidencia de algún bit de Int Data y bit Mask. (si activado a 1)
Acceso: Escritura (Int Mask)
Función: Registro de máscara que indica las interrupciones que se permiten y atienden (bit correspondiente activado a 1) o las que no (activado a 0)
TA bit 0: Si activado a 1 se permite interrupción 'undeflow A'.
TB bit 1: Si activado a 1 se permite interrupción 'underflow B'
ALRM bit 2: Si activado a 1 se permite interrupción alarma.
SP bit 3: SI activado a 1 se permite interrupción puerto serie.
FLG bit 4: Si activado a 1 se permite interrupción pin Flag.
X bit 5: Siempre a cero.
X bit 6: Siempre a cero.
SET/CLR bit 7:
Si activado a 1: Cada bit a 1 del valor a escribir, activa el correspondiente bit de enmascaramiento. Los demás bits no son afectados.
Si desactivado a 0: Cada bit a 1 del valor a escribir desactiva a 0 el correspondiente bit de enmascaramiento. Los demás bits no son afectados.
NOTA: 'underflow' significa a al valor cero del temporizador.

REG 14  CRA
(Control Register A)

$E
Acceso: Lectura/Escritura
Función: Registro de control general del temporizador A y pin del puerto serie SP.

START bit 0: Si se activa a 1, el temporizador A inicia la cuenta atrás. SI se desactiva a 0, se produce la parada del temporizador A.
PBON bit 1: Si se activa a 1, el la llegada a cero del temporizador A es señalizado en el pin PB6 (puerto B del CIA). Si se desactiva a 0, el pin PB6 tiene su función normal en el puerto B.
OUTMODE bit 2: Si se activa a 1, cada llegada a cero del temporizador A cambia de estado al pin PB6 (Modo Toogle). SI se desactiva a 0, cada llegada a cero del temporizador A genera en el pin PB6 un pulso alto de duración igual al período de la frecuencia phi2 0.7MHz (Modo Pulse).
(el pin PB6 se configura como salida en el puerto B del CIA).
RUNMODE bit 3: Si se activa a 1, el temporizador A descuenta únicamente desde el valor inicial hasta cero, genera una interrupción, reinicializa el valor de cuenta y se detiene (modo One-shot). Si se desactiva a 0, el temporizador A descuenta el valor inicial hasta cero, genera una interrupción, reinicializa de nuevo el temporizador con el valor y vuelve a decrementar repitiendo el proceso cíclicamente sin detenerse (modo Continuous).
LOAD bit 4: Si se activa a 1, se permite la carga forzada del temporizador A en cualquier momento con un nuevo valor. (Esté o no esté el temporizador en funcionamiento). Este bit actúa como Strobe, es decir, debe activarse de nuevo en cada carga forzada que se produzca.
INMODE bit 5: Si se activa a 1, el temporizador A es sincronizado con los flancos ascendentes (cambio de 0 a 1) del pin CNT. Si se desactiva a 0, el temporizador A es sincronizado con la señal phi2 (0.7 MHz).
SPMODE bit 6: Si se desactiva a 0, el pin SP es configurado como entrada y CNT es utilizado como reloj de desplazamiento del puerto serie.
Si se activa a 1, el pin SP es configurado como salida, y se requiere un reloj de desplazamiento externo (En este caso se utiliza el temporizador A)
- bit 7: No usado.

REG 15  CRB
(Control Register B)

$F
Acceso: Lectura/Escritura
Función: Registro general de control del temporizador B y alarma del TOD.
START bit 0: SI se activa a 1, el temporizador B inicia la cuenta atrás. Si se desactiva a 0, se produce la parada del temporizador B.
PBON bit 1: Si se activa a 1, el la llegado a cero del temporizador A es señalizado en el pin PB7 (puerto B del CIA). Si se desactiva a 0, el pin PB7 tiene su función normal en el puerto B.
OUTMODE bit 2: Si se activa a 1, cada llegada a cero del temporizador A cambia de estado al pin PB/ (modo Toggle). Si se desactiva a 0, cada llegada a cero del temporizador A genera en el pin PB7 un pulso alto de duración igual al período de la frecuencia phi2 0.7MHz (modo Pulse) (el pin PB7 se configura como salida en el puerto B del CIA).
RUNMODE bit 3: Si se activa a 1, el temporizador B descuenta únicamente desde el valor inicial hasta cero, genera una interrupción, reinicializa el valor de cuenta y se detiene (modo One-Shot), Si se desactiva a 0, el temporizador A descuenta el valor inicial hasta cero, genera una interrupción, reinicializa de nuevo el temporizador con el valor y vuelve a decrementar repitiendo el proceso cíclicamente sin detenerse (modo Continuous)
LOAD bit 4: Si se activa a 1, se permite la carga forzada del temporizador B en cualquier momento con un nuevo valor (Esté o no esté temporizador en funcionamiento). Este bit actúa como Strobe, es decir, debe activarse de nuevo en cada carga forzada que se produzca.
INMODE bit 5,6: Estos bits determinan la procedencia de la frecuencia de reloj del temporizador B:
CRB6 CRB5 Modo seleccionado
0 0 Temporizador B cuenta pulsos de la señal phi2
0 1 Temporizador B cuenta flancos ascendentes de CNT
1 0 Temp. B cuenta llegadas a cero del temporizador A
1 1 Temp. B cuenta llegadas a cero del temp. A cuando CNT=1
ALARM bit 7: Si se activa a 1, al escribir en los registros de contador de 24 bits (Regs. 8, 9 y 10) inicializamos el valor de alarma, de forma que cuando el valor de éste y del contador coincidan, se producirá una interrupción que es indicada en el registro ICR. Si se desactiva a 0, al escribir en el contador de 24 bits (Regs. 8, 9 y 10) se indica su valor inicial, a partir del cual incrementará en una unidad con cada pulso del reloj del pin TOD.

El acceso a cada registro se puede realizar mediante su correspondiente dirección, o bien sumándole un offset o desplazamiento a la dirección base del CIA. Notar que sumando el desplazamiento $100 a una dirección de un registro, obtenemos la dirección del siguiente.

En las dos tablas de la derecha podemos ver resumidas las direcciones de memoria que cada registro del CIA tiene asignada, así como la función de cada uno de los bits de dicho registro.

En la página siguiente se muestra una tabla de consulta para facilitar el acceso rápido a la información de cualquier registro que podáis necesitar para programar.

En el próximo número explicaremos con detalle los puertos de entrada/salida y los temporizadores de 16 bits. Veremos ejemplos en ensamblador que os ayudarán a comprender la programación de estos chips y posiblemente podréis encontrar aplicaciones de los CIA para vuestros propios programas.

Direcciones del CIA A

Este CIA está conectado a los 8 bits bajos del bus de datos del procesador (D0-D7). Su dirección base es $BFE001. La siguiente tabla muestra las direcciones asignadas a cada registro y su correspondiente función.

Dirección   Nombre Función Nro. de Bit
    7 6 5 4 3 2 1 0
$BFE001 PRA -FIR1 -FIR0 -RDY -TK0 -WPRO -CHNG LED OVL
$BFE101 PRB Datos Puerto paralelo Centronics
$BFE201 DDRA 0 0 0 0 0 0 1 1
$BFE301 DDRB 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
$BFE401 TALO CIA A byte bajo del temporizador A (.709379 Mhz PAL)
$BFE501 TAHI CIA A byte alto del temporizador A
$BFE601 TBLO CIA A byte bajo del temporizador B (.709379 Mhz PAL)
$BFE701 TBHI CIA A byte alto del temporizador B
$BFE801 TODLOW   8 bits bajos (7-0) del contador de 24 bits (VSync)
$BFE901 TODMID 8 bits medios (15-8) del contador de 24 bits
$BFEA01 TODHI 8 bits altos (23-16) del contador de 24 bits
$BFEB01 -- No utilizado
$BFEC01 SDR Entrada del código de la tecla pulsada (KDAT)
$BFED01 ICR Registro de Control de INterrupciones
$BFEE01 CRA Registro de Control A
$BFEF01 CRB Registro de Control B
  • Las direcciones están en hexadecimal y son siempre impares.
  • En los temporizadores/contadores aparece entre paréntesis la frecuencia de funcionamiento (en ordenadores con pantalla PAL)
  • La frecuencia del contador de 24 bits es extraída normalmente de la frecuencia de rastreo vertical de la pantalla (50 Hz). En algunos modelos de Amiga que incorporen ECS/AGA puede ser 48 Hz ó 71 Hz. Este contador es utilizado por el timer.device.
  • El registro DDRA siempre contiene el valor binario 00000011. De esta forma se obliga a las líneas PA0, PA1 a configurarse como salida, ya que controlan el led del power y el solapamiento de memoria.
  • El registro no. 11 no es utilizado en el Amiga (Dirección $BFEB01).
  • El temporizador A es utilizado como sincronizador en el canal de comunicaciones con el teclado.
  • El temporizador B es utilizado por el Timer.device, usado por el Sistema Operativo para cambio de tareas, interrupciones y temporizaciones. Su uso directo en modo multitarea puede ocasionar trastornos en el sistema.
  • Los nombres de bits con un signo '-' indican que son activos cuando están a cero.

Direcciones del CIA B

El segundo CIA, denominado CIA B, tiene como dirección base $BFD000. Sus registros están en direcciones pares porque el bus de datos interno está conectado a los 8 bits superiores del bus de datos del procesador (D8-D15)

Dirección   Registro Función Nro. de Bit
    7 6 5 4 3 2 1 0
$BFD000 PRA -DTR -RTS -CD -CTS -DSR -SEL POUT BUSY
$BFD100 PRB -MTR -SEL3 -SEL2 -SEL1 -SEL0 -SIDE DIR -STEP
$BFD200 DDRA 1 1 1 1 1 1 1 1
$BFD300 DDRB 1 1 1 1 1 1 1 1
$BFD400 TALO Temporizador A, byte bajo. No utilizado
$BFD500 TAHI Temporizador A, byte alto. No utilizado
$BFD600 TBLO Temporizador B, byte bajo. No utilizado
$BFD700 TBHI Temporizador B, byte alto. No utilizado
$BFD800 TODLOW   8 bits bajos (7-0) del contador de 24 bits (Hsync)
$BFD900 TODMID 8 bits medios (15-8) del contador de 24 bits
$BFDA00 TODHI 8 bits altos (23-16) del contador de 24 bits
$BFDB00 -- No utilizado
$BFDC00 SDR Registro de datos del puerto serial. No utilizado
$BFDD00 ICR Registro de Control de Interrupciones
$BFDE00 CRA Registro de Control A
$BFDF00 CRB Registro de Control B
  • Las direcciones están en hexadecimal y son siempre pares.
  • Los temporizadores A y B normalmente están libres, únicamente son utilizados por el serial.device cuando es requerido.
  • El contador de 24 bits es utilizado por la graphics.library para sincronizar tareas gráficas con el haz de electrones de la pantalla (Cuenta pulsos del sincronismo horizontal).
  • El registro 11 no es utilizado por el Amiga.
  • Los registros DDRA/DDRB siempre tienen como valor $FF, debido a que todas las líneas de los puertos A y B están configuradas como salidas. Controlan las señales necesarias para la unidad de disco y el puerto serial RS-232C.

Guía de consulta rápida de los CIA

CIA A

Dirección Base: $BFE001

Nombre Dirección Offset Asignación interna del Amiga a los bits Función
      7 6 5 4 3 2 1 0  
ciaApra $BFE001 $0 -FIR1 -FIR0 -RDY -TK0 -WPRO -CHNG LED OVL Registro de datos del puerto paralelo A
ciaAprb $BFE101 $100 Dato enviado/recibido (byte) por el puerto Centronics Registro de datos del puerto paralelo B
ciaAddra $BFE201 $200 0 0 0 0 0 0 1 1

Registro de dirección del flujo de datos de los bits del puerto A (1=salida)

ciaAddrb $BFE301 $300 Control entrada/salida puerto Centronics. Uso libre

Registro de Direcciones del flujo de datos de los bits del puerto B (1=salida)

ciaAtalo $BFE401 $400 Sincroniza la transmisión de datos del teclado Registro que contiene el valor del byte bajo del temporizador A
ciaAtahi $BFE501 $500 Sincroniza la transmisión de datos del teclado Registro que contiene el valor del byte alto del temporizador A
ciaAtblo $BFE601 $600 Usado por Exec para cambios, interrupciones y tiempos CPU Registro que contiene el valor del byte bajo del temporizador B
ciaArbhi $BFE701 $700 Usado por Exec para cambios, interrupciones y tiempos CPU Registro que contiene el valor del byte alto del temporizador B
ciaAtodlow $BFE801 $800 Usado por el Timer.device Registro que contiene el valor del byte bajo (0..7) del contador TOD
ciaAtodmid $BFE901 $900 Usado por el Timer.device Registro que contiene el valor del byte medio (8..15) del contador TOD
ciaAtodhi $BFEA01 $A00 Usado por el Timer.device Registro que contiene el valor del byte alto (16..24) del contador TOD
ciaAsdr $BFEc01 $C00 Usado por el teclado. Contiene el código de tecla pulsada Registro que contiene el dato enviado/recibido por el puerto serie SP
ciaAicr $BFED01 $D00 SETCLR IR0 0 FLG SP ALRM TB TA Registro de estado y máscara de las interrupciones
ciaAcra $BFEE01 $E00 - SPMODE INMODE LOAD RUNMODE OUTMODE PBON START Registro de control A (Temporizador A y TOD)
ciaAcrb $BFEF01 $F00 ALRM INMODE1 INMODE0 LOAD RUNMODE OUTMODE PRON START Registro de control B (Temporizador A y Alarma TOD)
CIA B

Dirección base: $BFD000

Nombre Dirección Offset Asignación interna del Amiga a los bits Función
      7 6 5 4 3 2 1 0  
ciaBpra $BFD000 $0 -DTR -RTS -CD -CTS -DSR -SEL POUT BUSY Registro de datos del puerto paralelo A
ciaBprb $BFD100 $100 -MTR -SEL3 -SEL2 -SEL1 -SEL0 -SIDE DIR STEP Registro de dirección del flujo de datos de los bits del puerto A (1=salida)
ciaBddra $BFD200 $200 1 1 1 1 1 1 1 1 Registro de dirección del flujo de datos de los bits del puerto A (1=salida)
ciaBddrb $BFD300 $300 1 1 1 1 1 1 1 1 Registro de dirección del flujo de datos de los bits del puerto B (1=salida)
ciaBtalo $BFD400 $400 No usado normalmente Registro que contiene el valor del byte bajo del temporizador A
ciaBtahi $BFD500 $500 No usado normalmente Registro que contiene el valor del byte alto del temporizador A
ciaBtblo $BFD600 $600 No usado normalmente Registro que contiene el valor del byte bajo del temporizador B
ciaBtbhi $BFD700 $700 No usado normalmente Registro que contiene el valor del byte alto del temporizador B
ciaBtodlow $BFD800 $800 Usado por la Graphics.library para sincronizar tareas Registro que contiene el valor del byte bajo (0..7) del contador TOD
ciaBtodmid $BFD900 $900 Gráficas con el haz de electrones de la pantalla Registro que contiene el valor del byte medio (8.15) del contador TOD
ciaBtodhi $BFDA00 $A00 Usado por Graphics.library Registro que contiene el valor del byte alto (16..24) del contador TOD
ciaBsdr $BFDC00 $C00 No usado Registro que contiene el dato enviado/recibido por el puerto serie Sp
ciaBicr $BFDD00 $D00 SETCLR IR 0 0 FLG SP ALRM TB TA Registro de estado y máscara de las interrupciones
ciaBcra $BFDE00 $E00 -- SPMODE INMODE LOAD RUNMODE GETMODE PBON START Registro de control A (Temporizador A y TOD)
ciaBcrb $BFDF00 $F00 ALRM INMODE1 INMODE0 LOAD RUNMODE OUTMODE PBON START Registro de control B (Temporizador B y Alarma TOD)

Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal