stringtranslate.com

GROTESCO

Chip ANTIC en una placa base Atari 130XE

El controlador de interfaz de televisión alfanumérica [1] ( ANTIC ) es un ASIC LSI dedicado a generar gráficos de computadora 2D para mostrar en una pantalla de televisión o de computadora .

Bajo la dirección de Jay Miner , el chip fue diseñado en 1977-1978 por Joe Decuir , Francois Michel y Steve Smith [2] para las computadoras Atari de 8 bits lanzadas por primera vez en 1979. El chip fue patentado por Atari, Inc. en 1981. [3] ANTIC también se usa en la consola de videojuegos Atari 5200 de 1982 , que comparte la mayor parte del mismo hardware que las computadoras de 8 bits.

Para cada fotograma de vídeo, ANTIC lee instrucciones para definir el campo de juego o los gráficos de fondo, y luego envía un flujo de datos al chip CTIA o GTIA que lo acompaña , que añade color y superpone sprites (a los que Atari denomina "gráficos de jugador/misil"). Cada instrucción ANTIC corresponde a líneas de exploración en blanco o a uno de los 14 modos gráficos utilizados para una banda horizontal de la pantalla. La altura de cada banda depende del modo. Las instrucciones comprenden una lista de pantalla , en el lenguaje de Atari, que especifica cómo se construye toda la pantalla a partir de una pila de modos individuales.

La lista de visualización especifica de dónde provienen los datos de cada fila. Para los modos de caracteres, la dirección base de los mapas de bits de caracteres se almacena en un registro en el chip y se puede cambiar. Las instrucciones de la lista de visualización pueden habilitar el desplazamiento fino horizontal y vertical y marcar que debe ocurrir una interrupción. Una interrupción permite ejecutar código 6502 arbitrario, generalmente para cambiar configuraciones relacionadas con la visualización en medio de un cuadro.

La revista de informática Atari Antic recibió su nombre en honor al chip. [4]

Características

La siguiente lista describe las capacidades de hardware inherentes de ANTIC, es decir, la funcionalidad prevista del hardware por sí mismo, sin incluir los resultados logrados por interrupciones atendidas por la CPU o núcleos de visualización que impulsan con frecuencia cambios de registro.

ANTIC utiliza DMA para leer un programa llamado lista de visualización que especifica estas características del campo de juego:

Otras funciones basadas en registros:

Versiones

por número de pieza

Atari, Inc. pretendía combinar las funciones de los chips ANTIC y GTIA en un solo circuito integrado para reducir los costes de producción de los ordenadores Atari y las consolas 5200. Se estaban desarrollando dos prototipos de circuitos de este tipo, pero ninguno entró en producción.

Distribución de pines

Distribución de pines del Atari ANTIC (C012296)

Registros

Las computadoras Atari de 8 bits y la consola Atari 5200 asignan el chip ANTIC a la página hexadecimal $D4xx .

ANTIC proporciona 15 registros de lectura/escritura que controlan los parámetros de visualización del campo de juego, DMA para gráficos de jugador/misil, desplazamiento fino, entrada de lápiz óptico e interrupciones. Los registros de hardware no devuelven los valores escritos cuando se leen. Este problema se resuelve mediante registros Shadow del sistema operativo implementados en la RAM normal como lugares para almacenar el último valor escrito en los registros. Los registros Shadow del sistema operativo se copian de la RAM a los registros de hardware durante el espacio en blanco vertical. Por lo tanto, cualquier escritura en los registros de hardware que tengan registros Shadow correspondientes se sobrescribirá con el valor de los registros Shadow durante el próximo espacio en blanco vertical.

Algunos registros de hardware de escritura no tienen registros Shadow correspondientes. Una aplicación puede escribirlos de forma segura sin que se sobrescriba el valor durante el espacio en blanco vertical. Si la aplicación necesita saber el último estado del registro, es responsabilidad de la aplicación recordar lo que escribió.

Los registros de sombra del sistema operativo también existen para algunos registros de lectura donde leer el valor directamente desde el hardware en una etapa desconocida en el ciclo de visualización puede arrojar resultados inconsistentes.

En los listados de registros individuales que aparecen a continuación se aplica la siguiente leyenda:

DMACTL $D400 Escribir

SOMBRA: SDMCTL $022F

Control de acceso directo a memoria (DMA)

DMACTL controla el comportamiento DMA de ANTIC para los gráficos del campo de juego y del misil del jugador ( sprite ).

Valores de bits de ancho del campo de juego :

Consulte también el bit DMA de la lista de visualización con respecto a la visualización del campo de juego.

Valores de bits DMA de jugador/misil :

La función DMA de jugador/misil de ANTIC lee bytes de la memoria y envía datos para actualizar los registros de patrones gráficos GRAFP0, GRAFP1, GRAFP2, GRAFP3 y GRAFM de CTIA/GTIA , lo que libera a la CPU de la tarea de crear gráficos ( sprites ) de jugador/misil. Estos bits activan la transmisión de datos de jugador y de misil de ANTIC a CTIA/GTIA. CTIA/GTIA también debe configurarse para recibir los datos a través de su registro GRACTL para que el DMA de jugador/misil funcione como se espera.

Cuando el DMA del reproductor está habilitado, el DMA del misil se produce automáticamente para mantener la sincronización del DMA consistente, pero los datos no se envían al registro GRAFM del misil.

Cuando está habilitado, el DMA de Jugador/Misil ocurre en cada línea de escaneo en la pantalla visible, desde la línea de escaneo 8 a la 247. Por lo tanto, los datos de Jugador/Misil en el mapa de memoria (ver PMBASE de ANTIC) por encima y por debajo de esos recuentos de líneas de escaneo no se usan ni se muestran.

Valores de bits de resolución de jugador/misil :

Las actualizaciones de los registros de patrones de reproductor/misil y DMA de ANTIC se producen en cada línea de escaneo independientemente de la resolución. Cuando la resolución de doble línea está en vigor, la memoria de reproductor/misil se puede modificar entre las recuperaciones de DMA redundantes, lo que cambia el patrón enviado a los registros GRAF* y produce reproductores/misiles con resolución de línea única aparente.

Lista de visualización de valores de bits DMA :

La visualización del campo de juego requiere que la lista de visualización DMA esté habilitada y que se especifique un ancho de campo de juego. Si alguno de los valores es cero, no se generará ninguna visualización del campo de juego.

CHACTL $D401 Escribir

SOMBRA: GRÁFICO $02F3

Control de personajes

CHACTL controla la visualización de caracteres.

Los valores de bits de control de caracteres realizan las siguientes acciones:

Los bits de video inverso y video en blanco de CHACTL afectan la visualización de caracteres en los modos de texto ANTIC 2 y 3 que tienen el bit alto configurado (caracteres $80 a $FF). Al alternar los valores de los bits CHACTL se pueden hacer parpadear o dejar en blanco estos caracteres de manera global para toda la pantalla.

La activación conjunta de Video inverso y Video en blanco da como resultado que los caracteres de video inverso se muestren como un espacio en blanco inverso. Los bits de Video inverso y Video en blanco funcionan en los modos ANTIC 2 y 3, y no tienen efecto en los otros modos de texto 4, 5, 6 y 7.

El bit Video Reflect afecta a todos los modos de texto. Video Reflect es útil para situaciones que requieren efectos de duplicación sin definir un nuevo conjunto de caracteres. Un uso ideal es en juegos de cartas que muestran caras de cartas precisas que muestran los palos al revés. Como esto refleja verticalmente los datos del glifo antes de usarlo, el efecto parece inconsistente para los descendentes del modo ANTIC 3, con los bytes de glifo 6 y 7 que aparecen en la parte inferior del área del descendente.

DLISTL/DLISTH $D402/$D403 Escribir

SOMBRA: SDLSTL/SDLSTH $0230/$0231

Mostrar puntero de lista

ANTIC comienza a ejecutar la lista de visualización indicada por la dirección de 16 bits en los registros DLISTL/DLISTH (D402-D403 hex /54274-54275 dec ). Los registros de dirección se actualizan durante la ejecución de la lista de visualización mediante JMP (saltar) y JVB (saltar y esperar a que se produzca un espacio en blanco vertical) de ANTIC. La dirección también se actualiza mediante la rutina de interrupción de espacio en blanco vertical (VBI) del sistema operativo utilizando los valores de los registros de sombra SDLSTL/SDLSTH (0230-0231 hex /560-561 dec ).

Cuando la interrupción de espacio en blanco vertical del SO está habilitada, las actualizaciones directas de los registros ANTIC DLIST por parte de la CPU o las instrucciones de salto ANTIC serán sobrescritas por el SO durante el siguiente espacio en blanco vertical por los valores de los registros de sombra. Por lo tanto, el cambio de página implementado por las listas de visualización que apuntan a la siguiente lista de visualización en serie no funcionará como se espera a menos que la interrupción de espacio en blanco vertical esté deshabilitada.

HSCROL $D404 Escribir

Desplazamiento fino horizontal

Este registro especifica la distancia del desplazamiento fino horizontal en los relojes de color. Solo los 4 bits más bajos son significativos. El rango de valores de 16 relojes de color permite a ANTIC desplazar el texto del modo 2 cuatro caracteres y el texto del modo 6 dos caracteres antes de que sea necesario un desplazamiento grueso.

Cuando se habilita el desplazamiento horizontal para una línea de modo, ANTIC obtiene el siguiente incremento de tamaño mayor que el ancho de pantalla actual para proporcionar el búfer de datos sujeto al control de desplazamiento horizontal. Cuando se muestra un ancho angosto, ANTIC obtiene la RAM de pantalla necesaria para el ancho normal. De la misma manera, para el ancho normal, ANTIC obtiene la RAM de pantalla necesaria para el ancho.

ANTIC almacena en búfer los primeros bytes leídos de la memoria de pantalla que son suficientes para cubrir el rango de movimiento del reloj de 16 colores. (De dos a cuatro bytes según el modo de visualización). El valor HSCROL especifica cuántos relojes de color se deben generar a partir de los datos almacenados en búfer, comenzando desde el último reloj de color (el más a la derecha) del último byte almacenado en búfer y avanzando hacia la izquierda. Cuando HSCROL es 0, no se generan relojes de color desde el búfer, por lo que el primer byte de pantalla que se muestra es el primer byte después de los datos almacenados en búfer. A medida que HSCROL aumenta, se agregan más relojes de color desde el final (lado derecho) de los datos almacenados en búfer al borde izquierdo de la pantalla, lo que hace que el desplazamiento fino mueva el contenido de la pantalla hacia la derecha.

El modo ANTIC F (alta resolución, píxeles de reloj de color de 1/2) solo se puede desplazar dos píxeles a la vez, porque HSCROL especifica relojes de color.

Los modos ANTIC que utilizan las interpretaciones de color alternativas de GTIA deben desplazarse por un píxel GTIA completo (dos relojes de color). Solo se deben utilizar valores pares para garantizar un desplazamiento correcto. Los valores impares de HSCROL cambiarán el flujo de píxeles a un estado diferente que GTIA interpretará como colores diferentes.

A diferencia de muchas plataformas, el desplazamiento horizontal de Atari es visualmente consistente y libre de artefactos de "estroboscopia" de color debido a que el tamaño de píxel de Atari coincide con la sincronización del reloj de color necesaria para un color preciso.

VSCROL $D405 Escribir

Desplazamiento fino vertical

Este registro especifica la distancia del desplazamiento fino vertical en líneas de exploración. Los 4 bits más bajos son significativos, sin embargo, el valor del desplazamiento vertical debe oscilar entre 0 y la altura de línea de exploración de la línea del modo ANTIC: 1. Si se desplaza más allá de la cantidad de líneas de exploración del modo ANTIC, se generan líneas de datos repetidos que alteran la continuidad del desplazamiento fino (aunque esto también se puede utilizar como un comportamiento explotable).

La región de desplazamiento vertical se define configurando el bit VS ($20) en una serie secuencial de líneas de modo ANTIC en la lista de visualización . La primera línea de modo sin el bit VS configurado se convierte en el final de la región de desplazamiento y se utiliza como línea intermedia para suministrar la nueva información para desplazarse hacia arriba hasta la parte inferior de la región de desplazamiento.

El valor de desplazamiento vertical indica el número de línea de escaneo para comenzar la visualización en la primera línea de modo y también se utiliza como el número de línea de escaneo para finalizar la visualización en la última línea de modo (la línea sin el bit VS establecido).

Ejemplo: Dado un modo ANTIC de ocho líneas de escaneo (modos de texto 2, 4 o 6) con el bit VS establecido en dos líneas de modo adyacentes, la región de desplazamiento consta entonces de tres líneas de modo; la tercera línea en la región de desplazamiento es la primera línea de modo que se encuentra sin el bit VS establecido. Cuando el desplazamiento vertical no está establecido en la lista de visualización, las tres líneas de modo darían como resultado naturalmente 24 líneas de escaneo mostradas. Cuando los bits VS están establecidos en las instrucciones del modo de lista de visualización como se describe y el valor VSCROL está establecido en 2, entonces la primera línea de modo en la región comienza a mostrarse en la línea de escaneo 2 mostrando las líneas de escaneo 2 a 7 (seis líneas de escaneo u 8 - VSCROL), la segunda línea de modo se muestra completamente (ocho líneas de escaneo) y la línea de modo final termina en la línea de escaneo 2 mostrando las líneas de escaneo 0 a 2 (tres líneas de escaneo o VSCROL + 1). El total de líneas de escaneo mostradas en la región de desplazamiento es entonces 6 + 8 + 3 = 17 líneas de escaneo.

Dado que el desplazamiento fino se basa en líneas de escaneo, no en la altura de píxeles, y el movimiento de la región de desplazamiento se realiza simplemente saltando líneas de escaneo de la primera línea de modo y agregando líneas de escaneo a la última línea de modo, es posible usar diferentes modos de gráficos dentro de la región de desplazamiento. Esto solo requiere un cuidado adicional al determinar cuántas líneas de escaneo se pueden desplazar para la primera y la última línea de modo actuales en la región de desplazamiento.

Las líneas del modo en blanco no pueden estar contenidas dentro de una región de desplazamiento, porque las instrucciones de línea del modo en blanco no tienen inherentemente un bit modificador de desplazamiento vertical. (Las instrucciones de línea del modo en blanco especifican el conteo de líneas en blanco usando los bits 7 a 5 que funcionan como modificadores LMS, HS y VS para las instrucciones del modo de campo de juego "normales"). Sin embargo, una instrucción de modo en blanco se puede usar para finalizar una región de desplazamiento y aún está sujeta a los cambios de altura de línea de exploración esperados según el valor de desplazamiento vertical.

PMBASE $D407 Escribir

Dirección de la base de misiles del jugador

Esto especifica la página de la dirección base para los gráficos de jugador/misil. Cuando se utilizan gráficos P/M con una resolución de línea doble, el valor PMBASE debe comenzar en un límite de 1K. Cuando se utilizan gráficos P/M con una resolución de línea única, el valor PMBASE debe comenzar en un límite de 2K.

CHBASE $D409 Escribir

SOMBRA: CHBAS $02F4

Dirección base del personaje

Esto especifica la página de la dirección base para el conjunto de caracteres. Los modos ANTIC 2, 3, 4 y 5 utilizan 128 caracteres en el conjunto de caracteres y requieren que el valor CHBASE comience en un límite de 1K. Los modos ANTIC 6 y 7 utilizan 64 caracteres, por lo que el valor CHBASE debe comenzar en un límite de 512 bytes.

El valor predeterminado habitual es $E0 hex /224 dec para el conjunto de caracteres en ROM en $E000 hex /57344 dec .

WSYNC $D40A Escribir

Esperar sincronización horizontal

Este registro permite que los programas se sincronicen con la pantalla. Una escritura en este registro detiene el programa 6502 hasta el final de la línea de exploración actual. Este comportamiento se utiliza comúnmente durante las interrupciones de la lista de visualización para producir transiciones/cambios claros de una línea de exploración a la siguiente. El valor escrito no es importante.

VCOUNT $D40B Leer

Contador de línea vertical

Este registro rastrea la línea de escaneo que se está generando actualmente. El valor devuelto es la línea de escaneo actual dividida por 2. Se incluyen las líneas en blanco generadas al comienzo de la visualización. El valor para NTSC variará de 0 a 130 para NTSC y de 0 a 155 para PAL. Este valor es útil durante las interrupciones de la lista de visualización para identificar la posición vertical de la pantalla.

PENH $D40C Leer

SOMBRA: LPENH $0234

Posición horizontal del lápiz óptico

Este registro contiene la posición del reloj de color horizontal cuando se presiona el gatillo del lápiz óptico o pistola de luz. El registro de sombras es la fuente recomendada para leer esta información, ya que se actualizará durante el espacio en blanco vertical, lo que garantiza resultados consistentes y confiables. Los programas deben evitar leer el registro de hardware directamente a menos que el programa esté seguro de que el registro se lee en un momento que garantice que el valor es válido. Las pistolas de luz para Atari funcionan de la misma manera que los lápices ópticos con la adición de una lupa óptica que permite leer la pantalla desde una distancia mayor. El dispositivo de entrada del lápiz óptico o pistola de luz requiere un CRT convencional que utilice un haz de electrones de barrido. El lápiz óptico o pistola de luz no puede funcionar con televisores y monitores LCD modernos.

PENV $D40D Leer

SOMBRA: LPENV $0235

Posición vertical del lápiz óptico

Este contiene el valor VCOUNT capturado cuando se presiona el gatillo del lápiz óptico/pistola de luz. El registro de sombra es la fuente recomendada para leer esta información, ya que se actualizará durante el espacio en blanco vertical, lo que garantiza resultados consistentes y confiables. Los programas deben evitar leer el registro de hardware directamente a menos que el programa esté seguro de que el registro se lee en un momento que garantice que el valor es válido. Las pistolas de luz para Atari funcionan de la misma manera que los lápices ópticos con la adición de una lupa óptica que permite leer la pantalla desde una distancia mayor. El dispositivo de entrada del lápiz óptico/pistola de luz requiere un CRT convencional que utilice un haz de electrones de barrido. El lápiz óptico/pistola de luz no puede funcionar con televisores y monitores LCD modernos.

NMIEN $D40E Escribir

Habilitar interrupción no enmascarable (NMI)

NMIEN permite interrupciones no enmascarables. Los valores de bit son los siguientes:

El sistema operativo configura NMIEN en el valor predeterminado $40 hex /64 dec durante las rutinas de encendido. Las rutinas de servicio NMI primero pasan a través de $FFFA hex /65530 dec , que determina la causa y luego transfiere el control a la rutina de servicio de interrupción.

DLI:

Si el bit DLI de NMIEN está configurado cuando ANTIC encuentra una instrucción de Lista de visualización con el bit modificador DLI configurado, entonces ANTIC activa el DLI en la última línea de escaneo de esa línea del modo de instrucción de Lista de visualización.

El sistema operativo no utiliza DLI, por lo que la dirección predeterminada para el vector DLI (VDSLST, $0200 hex /512 dec ) apunta a una instrucción RTI en la ROM. La aplicación que utiliza DLI debe modificar VDSLST para que apunte a la rutina DLI deseada antes de habilitar la DLI.

El contenido de los registros X e Y del acumulador 6502 no se conserva antes de ingresar a la rutina DLI. Es responsabilidad de la rutina DLI guardar el estado de los registros que se utilizarán durante la rutina DLI y, luego, la última acción es restaurar los valores originales de los registros antes de salir con una instrucción RTI. Las rutinas generalmente envían los valores de los registros a la pila 6502.

Si se utilizan varios DLI, la primera interrupción actualiza VDSLST para que apunte a la dirección de la siguiente interrupción, y así sucesivamente para las interrupciones subsiguientes. La última rutina de interrupción de lista de visualización en la pantalla apunta a VDSLST de nuevo a la dirección de la primera interrupción de lista de visualización. Alternativamente, se puede utilizar una rutina de interrupción de espacio en blanco vertical para restablecer la dirección VDSLST y garantizar que los DLI permanezcan sincronizados con la pantalla.

VBI:

Cuando se activa el bit VBI de NMIEN, ANTIC enviará una señal de interrupción de espacio en blanco vertical al final del procesamiento del JVB (salto de espacio en blanco vertical) al final de la lista de visualización . El sistema operativo utiliza el espacio en blanco vertical para realizar varias tareas de mantenimiento (entre otras cosas, actualizar temporizadores, copiar valores de entrada del controlador a sus registros Shadow y copiar el contenido de los registros Shadow a los registros de hardware de los chips personalizados).

El SO salta a través de VVBLKI ($0222 hex /546 dec ) para comenzar la rutina de servicio VBI del SO, y la rutina VBI del SO sale con un salto a través de VVBLKD ($0224 hex /548 dec ). De manera predeterminada, VVBLKI apunta al vector de salto del SO SYSVBV ($E45F hex /58463 dec ) para comenzar la interrupción en blanco vertical, y VVBLKD apunta al vector de salto del SO XITVBV ($E462 hex /58466 dec ).

Los programas de usuario pueden insertar la ejecución de código personalizado antes (inmediatamente) o después (diferida) de las rutinas de interrupción de espacio en blanco vertical del sistema operativo. Dado que la interrupción de espacio en blanco vertical del sistema operativo se puede llamar mientras un programa de usuario está actualizando los vectores, el sistema operativo proporciona una rutina, SETVBV ($E45C hex /58460 dec ), que actualizará de forma segura los vectores VVBLKI o VVBLKD para que apunten a una nueva rutina:

Cuando el indicador CRITIC ($42 hex /66 dec ) no es cero, se suprime la ejecución de la interrupción de espacio en blanco vertical diferido, independientemente de las direcciones en los vectores. El valor predeterminado de CRITIC, 0, permite la ejecución de interrupciones de espacio en blanco vertical diferido e inmediatas.

NMIRES $D40F Escribir

Restablecimiento de interrupción no enmascarable (NMI)

Cualquier valor escrito en NMIRES restablece los bits en NMIST que indican el motivo de la interrupción no enmascarable más reciente. Esto lo utiliza el código de despacho de interrupciones en el sistema operativo y, normalmente, no habría motivo para que un programa de usuario escribiera aquí.

NMIST $D40F Leer

Estado de interrupción no enmascarable (NMI)

La rutina de despacho de interrupciones no enmascarables del sistema operativo lee este registro para determinar el motivo de la interrupción y así qué rutina de servicio ejecutar.

Los valores de bit:

Lista de visualización

La lista de visualización es la lista de instrucciones que le indican a ANTIC cómo generar la pantalla. Los datos procesados ​​por este "programa" de lista de visualización son la memoria de pantalla. La salida es la pantalla gráfica. Los tipos de gráficos en la salida (texto vs. píxeles direccionables) están determinados por las instrucciones en la lista de visualización.

La CPU escribe la lista de visualización y los datos de visualización en la RAM . ANTIC lee las instrucciones de la lista de visualización, la memoria de pantalla y la información del conjunto de caracteres de la RAM mediante una técnica conocida como acceso directo a memoria (DMA) . El trabajo de un programa de lenguaje de máquina BASIC o 6502 es inicializar la pantalla: configurar las instrucciones de la lista de visualización, organizar la memoria de pantalla (y el conjunto de caracteres si corresponde) y luego indicarle a ANTIC que inicie la pantalla. Después de esto, ANTIC se encarga automáticamente de generar la visualización de la pantalla. Esto permite que las computadoras Atari de 8 bits produzcan pantallas complejas de modo mixto sin la intervención directa de la CPU. Otras plataformas, incluso las diseñadas mucho más tarde, no pueden mezclar modos gráficos en una pantalla o hacerlo sin interrupciones complejas de la CPU.

ANTIC procesa las instrucciones en la lista de visualización, lee la memoria de pantalla (y los datos del conjunto de caracteres si corresponde), traduce esta información en un flujo de datos gráficos en tiempo real y envía este flujo de datos al chip CTIA/GTIA que aplica el color a los píxeles gráficos y genera el vídeo. Juntos, los dos chips proporcionan 6 modos de texto y 8 modos gráficos (14 en total). La versión más avanzada, GTIA , añade tres interpretaciones de color alternativas para cada modo gráfico ANTIC, lo que proporciona un total de 56 (14 veces cuatro) modos gráficos. Sin embargo, sólo los modos gráficos ANTIC basados ​​en píxeles de reloj de medio color son capaces de expresar la paleta de colores completa proporcionada por las nuevas interpretaciones de color, y de esos modos, los que son convenientes para su uso son los modos ANTIC 2 (modo gráfico OS 0 texto) y el modo ANTIC F (modo gráfico OS 8). Por tanto, la cantidad razonable de modos gráficos únicos disponibles utilizando las capacidades de hardware inherentes de ANTIC + CTIA/GTIA es de 20 a 14 modos ANTIC + 3 interpretaciones de color adicionales para cada uno de los modos ANTIC 2 y F.

Descripción general de las instrucciones de la lista de visualización

La pantalla de Atari está construida como una serie de instrucciones ANTIC, cada una de las cuales describe una línea de texto o modo gráfico de manera progresiva desde la parte superior a la inferior de la pantalla hasta que se llena el área de visualización deseada. En efecto, la pantalla es una pila vertical de instrucciones de modo ANTIC. Los diferentes modos ocupan diferentes cantidades de líneas de escaneo y utilizan diferentes cantidades de RAM. El diseño de una pantalla requiere contar las líneas de escaneo de cada instrucción de modo y realizar un seguimiento de la memoria para cada línea de modo para evitar sobrepasar las limitaciones de ANTIC o del estándar de video. (Consulte la sección Limitaciones).

La combinación de varios modos gráficos en una pantalla se realiza simplemente proporcionando diferentes instrucciones de modo de mapa o de personaje para la posición deseada en la pantalla. Por ejemplo, los modos gráficos 1 a 8 del sistema operativo Atari ofrecen visualización en pantalla completa o una opción para una ventana de texto de cuatro líneas en la parte inferior de la pantalla. Esta función de pantalla dividida se logra utilizando las capacidades inherentes de ANTIC y su lista de visualización sin interrupciones de la CPU ni manipulación personalizada del hardware de video.

ANTIC tiene cuatro tipos de instrucciones:

Las instrucciones del modo Mapa y Personaje tienen modificadores adicionales que se pueden habilitar con la instrucción:

Ejecución de instrucciones

ANTIC comienza a ejecutar la lista de visualización indicada por la dirección de 16 bits en los registros DLISTL/DLISTH ($D402-$D403 hex /54274-54275 dec ). ANTIC incrementa automáticamente los registros de dirección a medida que se ejecuta cada instrucción. ANTIC solo puede actualizar los 10 bits más bajos de la dirección durante el incremento automático, lo que limita la lista de visualización a comenzar y terminar dentro de un rango de direcciones de 1K.

Los registros también se actualizan durante la ejecución de la lista de visualización mediante JMP (saltar) y JVB (saltar y esperar a que se produzca un espacio en blanco vertical) de ANTIC. Estas instrucciones cargan los 16 bits completos de la dirección, por lo que se pueden utilizar para evitar la limitación de 1K de la lista de visualización.

La rutina de interrupción de espacio en blanco vertical (VBI) del sistema operativo también actualiza la dirección utilizando los valores de los registros de sombra SDLSTL/SDLSTH ($0230-$0231 hex /560-561 dec ). Cuando la rutina VBI del sistema operativo está habilitada, las actualizaciones directas de los registros ANTIC DLIST por parte de la CPU o las instrucciones de salto ANTIC serán sobrescritas por el sistema operativo durante el próximo espacio en blanco vertical. Dado que el procesamiento de VBI es el estado habitual del sistema, la mayoría de los programas dependen de esto y solo actualizan los registros de sombra del sistema operativo (SDLSTL/SDLSTH $0230-$0231 hex /560-561 dec ) para establecer la lista de visualización.

Bytes de instrucción

Esta leyenda se aplica a los diagramas de bits de instrucción que aparecen a continuación:

Bits de instrucciones:

Los bits 7:4 son modificadores para las instrucciones del modo de campo de juego en los bits 3:0. El valor de bit 1 habilita el modificador y 0 lo deshabilita.

Instrucción de modo 0: líneas en blanco

Cuando todos los bits de modo son cero, ANTIC no realiza ninguna DMA de campo de reproducción y muestra una o más líneas de escaneo en blanco del color de fondo. Para los modos de interpretación de color normales, el "fondo" es el registro de color COLBK (D01A hex /53274 dec ) OS Shadow COLOR4 (02C8 hex /712 dec ), aunque esto difiere para los modos de interpretación de color GTIA. Consulte la discusión de COLBK en la página GTIA para obtener más información.

La cantidad de líneas de escaneo en blanco se especifica mediante el valor de los bits 4 a 6, lo que permite un rango de 0 a 7. ANTIC suma uno a este valor y muestra la cantidad de líneas de escaneo resultante. Valores de instrucción:

Las líneas en blanco son útiles para retrasar el inicio de la visualización de la pantalla hasta que el haz de electrones haya abandonado el área de sobreescaneo vertical en la parte superior de la pantalla. El sistema operativo Atari crea todos sus modos gráficos comenzando con tres instrucciones de 70 hexadecimales /112 dec (o 24 líneas de escaneo en blanco) para este propósito. Las líneas en blanco también son útiles para dividir partes de una pantalla personalizada con diferentes propósitos (es decir, un borde entre una pantalla de estado y los gráficos principales).

Las líneas de modo en blanco no pueden incluirse dentro de una región de desplazamiento, porque las instrucciones de línea de modo en blanco no tienen bits de modificación de desplazamiento fino. Sin embargo, una instrucción de modo en blanco se puede utilizar para finalizar una región de desplazamiento vertical y aún está sujeta a los cambios de altura de línea de exploración esperados según el valor de desplazamiento vertical.

El bit modificador DLI está disponible para instrucciones de línea en blanco. Cuando el bit DLI está habilitado, se activará una interrupción de lista de visualización durante la última línea de escaneo en blanco de la instrucción. Dado que el DMA del campo de juego no se produce durante las líneas en blanco (solo se produce el DMA de lista de visualización y el DMA de jugador/misil (si está habilitado)), las líneas en blanco se pueden usar donde no se necesitarán gráficos del campo de juego, lo que da más tiempo para las rutinas de interrupción de lista de visualización que cambian los registros de color o las posiciones de jugador/misil.

Instrucciones del modo 1: Saltar

Cuando el valor de Modo es 1, ANTIC ejecuta un Salto en su programa (la Lista de Visualización). Los dos bytes siguientes en la Lista de Visualización se cargan en los registros DLISTL/DLISTH de ANTIC ($D402-$D403 hex /54274-54275 dec ) cambiando el punto de ejecución de la siguiente instrucción.

Hay dos tipos de saltos:

Los registros DLIST también son actualizados por la rutina de interrupción de espacio en blanco vertical (VBI) del sistema operativo utilizando los valores de los registros de sombra SDLSTL/SDLSTH (0230-0231 hex /560-561 dec ). Cuando la rutina VBI del sistema operativo está habilitada, las actualizaciones directas de los registros DLIST de ANTIC por parte de la CPU o las instrucciones de salto de ANTIC serán sobrescritas por el sistema operativo durante el próximo espacio en blanco vertical. Esto implica que una instrucción JVB de ANTIC (saltar y esperar espacio en blanco vertical) que especifique una dirección no válida (o una dirección válida que difiera del valor de SDLST de sombra) no tiene ningún efecto real en la pantalla.

El argumento de JVB generalmente apunta al comienzo de la misma Lista de visualización, pero también puede apuntar a otra Lista de visualización, de modo que se ejecute una cadena de Listas de visualización después de espacios en blanco verticales consecutivos. Por supuesto, para darle a ANTIC control sobre el comienzo de la siguiente Lista de visualización, la interrupción de espacio en blanco vertical del SO debe estar deshabilitada para evitar que sobrescriba los registros de hardware de ANTIC con los valores del registro de sombra.

Instrucciones de los modos 2 a F: modos de juego, personajes y mapas

A continuación se muestra la lista de instrucciones del modo gráfico de ANTIC. Para obtener descripciones más detalladas de cada modo, consulte la sección Modos gráficos del campo de juego.

El requisito de memoria para una línea de modo está determinado por dos factores:

El modificador de desplazamiento fino horizontal cambiará el requisito de memoria para la línea de modo actual del ancho especificado por DMACTL al siguiente valor más grande.

Modificadores de instrucciones

Los bits 7:4 son modificadores para las instrucciones del modo de campo de juego en los bits 3:0. Los valores de las instrucciones del modo de campo de juego varían de $02 a $0F. El valor del bit modificador 1 habilita el modificador y 0 lo deshabilita.

Modificador HS: desplazamiento fino horizontal

Bit4: valor de posición $10, controla el desplazamiento horizontal del modo de campo de juego.

Cuando el desplazamiento horizontal está habilitado, ANTIC recupera más bytes de memoria de pantalla que los que se muestran para mostrar los bytes de pantalla parcialmente desplazados al principio y al final de la línea. Si la pantalla está en modo estrecho, ANTIC recupera la cantidad de bytes de pantalla necesarios para el modo normal. Si la pantalla está en modo normal, ANTIC recupera la cantidad de bytes necesarios para el modo de pantalla ancha. En el modo de pantalla ancha, ANTIC no recupera ningún byte de pantalla adicional. El desplazamiento en pantalla ancha hará que los datos en blanco se desplacen hacia el área desplazada. Esto no es un problema, porque ocurre en el área de sobreescaneo que no es visible en una pantalla NTSC/PAL normal.

Modificador VS: desplazamiento fino vertical

Bit5: valor de posición $20, controla el desplazamiento vertical del modo Campo de Juego.

La región de desplazamiento vertical de una pantalla se define configurando el bit VS ($20) en una serie secuencial de líneas de modo ANTIC en la lista de visualización. La primera línea de modo sin el bit VS configurado se convierte en el final de la región de desplazamiento y se utiliza como línea intermedia para proporcionar la nueva información para desplazarse hacia arriba hasta la parte inferior de la región de desplazamiento.

Modificador LMS: escaneo de memoria de carga

Bit6: valor de posición $40, carga una nueva dirección para el inicio de la memoria de pantalla para la línea del modo Playfield actual.

La opción LMS carga la dirección de escaneo de la memoria de pantalla de ANTIC con el valor de 16 bits en los dos bytes siguientes a la instrucción. El modo de Carácter o Mapa especificado comenzará a mostrar bytes desde esa dirección. La opción LMS debe aparecer en la primera línea de Instrucción de Modo de Campo de Juego (no en la Línea en Blanco) en la Lista de Visualización para inicializar a ANTIC para que comience a leer al comienzo de la memoria de pantalla. La mayoría de los modos de pantalla completa generados por el Sistema Operativo tendrán solo esa ocurrencia del modificador LMS presente en la Lista de Visualización . ANTIC incrementará automáticamente su dirección LMS al final de cada línea de modo en preparación para la siguiente línea. Mientras la memoria de pantalla no cruce un límite de 4K, el modificador LMS no es necesario en las Instrucciones de Modo de Campo de Juego subsiguientes.

Las visualizaciones de pantalla completa que utilizan los modos E o F del mapa del campo de juego tendrán una segunda aparición del modificador LMS en una instrucción de mapa cerca del medio de la pantalla, ya que la visualización completa requiere más de 4K de memoria de pantalla. (Las visualizaciones del modo F incluyen líneas de alta resolución de 320 píxeles y los modos de visualización GTIA).

La combinación de las instrucciones de modo de mapa y de carácter con el bit LMS permite configurar la dirección de memoria de pantalla libremente dentro del espacio de direcciones de 64 K de forma independiente para cada línea de visualización . En otras palabras, la memoria de pantalla no tiene que ser una memoria completamente contigua escaneada secuencialmente hacia direcciones superiores, solo que una sola línea de modo debe estar provista de bytes secuenciales de memoria adecuados para cumplir con los requisitos de ese modo, el ancho de la pantalla y la función de desplazamiento.

Modificador DLI: interrupción de la lista de visualización

Bit7: valor de posición $80 , indica a ANTIC que invoque una interrupción atendida por la CPU en la última línea de escaneo del modo de campo de juego .

Si el registro ANTIC NMIEN ( D40E hex /54286 dec ) tiene Bit7 ( $80 ) establecido, entonces en la última línea de escaneo de la línea de Modo se activará una rutina de interrupción que se vectoriza a través de la dirección VDSLST (200 hex /512 dec ).

El contenido de los registros X e Y del acumulador 6502 no se conserva antes de ingresar a la rutina DLI. Es responsabilidad de la rutina DLI guardar el estado de los registros utilizados durante la DLI y luego restaurar los valores originales de los registros antes de salir con una instrucción RTI. Las rutinas generalmente envían los valores de los registros a la pila 6502.

Las rutinas DLI suelen ser breves y rápidas, y cambian los registros de color o las posiciones del jugador y el misil antes de salir. Sin embargo, no es necesario que sean breves. Siempre que la rutina DLI salga antes del inicio de la siguiente rutina DLI, la rutina DLI puede seguir actualizando valores en varias líneas de exploración.

Modos gráficos del campo de juego

El chip ANTIC permite una variedad de modos y anchos de campo de juego diferentes. Sin embargo, el sistema operativo Atari original incluido con las computadoras Atari 800/400 proporciona un acceso fácil a un subconjunto limitado de estos modos gráficos. Los modos de campo de juego ANTIC están expuestos a los usuarios a través de Atari BASIC mediante el comando "GRAPHICS", y a algunos otros lenguajes, mediante llamadas de sistema similares. Curiosamente, los modos que no son compatibles directamente con el sistema operativo original y BASIC son los modos más útiles para los juegos. La versión posterior del sistema operativo utilizado en las computadoras Atari 8-bit XL/XE agregó soporte para la mayoría de estos modos gráficos "faltantes".

El chip ANTIC utiliza una lista de visualización y otras configuraciones para crear estos modos. Cualquier modo gráfico en la interpretación de color GTIA predeterminada se puede combinar libremente sin intervención de la CPU modificando las instrucciones en la lista de visualización .

La geometría de la pantalla de ANTIC no es fija. Un registro de hardware puede indicarle a ANTIC que muestre un campo de reproducción angosto (128 relojes de color/256 píxeles de alta resolución de ancho), un campo de reproducción de ancho normal (160 relojes de color/320 píxeles de alta resolución de ancho) y un campo de reproducción de sobreescaneo ancho (192 relojes de color/384 píxeles de alta resolución de ancho). Si bien la altura predeterminada del sistema operativo para los modos gráficos es de 192 líneas de escaneo, Antic puede mostrar sobreescaneo vertical de hasta 240 líneas de escaneo de TV de alto mediante la creación de una Lista de visualización personalizada .

El modo F produce colores mediante artefactos NTSC y funciona de manera similar a los modos gráficos del Apple II . La resolución de píxeles es de 320 píxeles de ancho, pero la resolución de color es la mitad, por lo que cada grupo de dos píxeles se "mezclará" para formar un solo color y de esta manera se pueden generar cuatro colores de artefactos. Se teñirán si el color de primer plano y de fondo se configuran en algo distinto de negro/blanco/gris. Los colores exactos producidos de esta manera varían con los diferentes modelos de Atari de 8 bits y también entre los chips CTIA y GTIA, por lo que pueden resultar colores de artefactos no deseados al ejecutar software que utiliza el modo F en una máquina distinta a la que fue desarrollado. No fue posible obtener colores de artefactos en máquinas PAL y el modo F será monocromático en ellas.

El modo F no fue ampliamente utilizado por el software debido a sus altos requisitos de memoria (8k) y a los colores inconsistentes de los artefactos que no aparecían iguales en todos los modelos de computadoras Atari de 8 bits. Los juegos que lo utilizan incluyen aventuras gráficas de Sierra como Troll's Tale y Wizard and the Princess , Lode Runner y la serie Ultima .

El sistema de visualización de video fue diseñado teniendo en cuenta cuidadosamente los métodos y limitaciones de visualización NTSC. El reloj de la CPU del sistema y el hardware de video están sincronizados a la mitad de la frecuencia del reloj NTSC. En consecuencia, la salida de píxeles de todos los modos de visualización se basa en el tamaño del reloj de color NTSC, que es el tiempo mínimo necesario para garantizar un color correcto y consistente independientemente de la ubicación horizontal del píxel en la pantalla. El resultado es un tamaño de píxel preciso y una coloración que no muestra defectos de "estroboscopia" de color cuando se desplaza horizontalmente. (La estroboscopia de color son cambios de tono antiestéticos en los píxeles según la posición horizontal que se producen cuando los cambios de señal no se alinean con el reloj de color y, por lo tanto, no proporcionan al hardware del televisor/monitor el tiempo adecuado para alcanzar el color correcto).

Modos de personajes

Representación de glifos

Todos los conjuntos de caracteres utilizan 8 bytes secuenciales para representar el carácter. Hay cuatro tipos de representación de caracteres/glifos disponibles para esos bytes. Cada modo de carácter está asociado a un método de representación específico:

Modos de mapa

Modos GTIA

Los modos GTIA son pantallas Antic Mode F con una opción de interpretación de color alternativa habilitada a través del registro GTIA PRIOR ($D01B hex /53275 dec ) sombreado por GPRIOR ($026F hex /623 dec ). La expresión de color completa de estos modos GTIA también se puede activar en los modos de texto Antic 2 y 3, aunque estos también requerirán un conjunto de caracteres personalizado para lograr un uso práctico de los colores. Consulte GTIA para obtener más información.

Desplazamiento

Antes de que las pantallas de vídeo se convirtieran en una parte común de la interfaz de usuario, muchas computadoras utilizaban un teletipo, una impresora que normalmente tenía papel de alimentación continua. La entrada del usuario y la salida generada por la computadora se imprimían en el papel que pasaba por la impresora. Esta interfaz ampliamente entendida para la entrada del usuario y la salida de la computadora continuó con la introducción de las pantallas de vídeo, ya que las computadoras presentaban una metáfora de la pantalla como una ventana de visualización sobre un rollo de papel imaginario e infinito. La información se muestra en la pantalla comenzando por la parte superior hasta que llega a la parte inferior de la pantalla y cuando la computadora necesita introducir nueva información, desplaza toda la información de la pantalla hacia arriba, dejando un espacio vacío en la parte inferior para la nueva información y, en consecuencia, borrando la información superior.

Este tipo de desplazamiento se denomina "desplazamiento grueso". Se logra moviendo bytes de memoria a través de un área de visualización de pantalla designada. Mover un kilobyte (o más) de memoria requiere un uso intensivo de la CPU y las computadoras más lentas pueden no ser capaces de hacer nada más mientras actualizan los datos de la pantalla. Como medio de animación de una pantalla, los resultados pueden ser irregulares cuando la CPU no puede actualizar la memoria de la pantalla más rápido de lo que el hardware de la pantalla lee la memoria para generar la salida de video. La fluidez del movimiento se ve afectada, ya que la cantidad mínima de desplazamiento de la pantalla es del tamaño de un carácter completo. La mayoría de las computadoras, incluida la Atari de 8 bits, realizan un desplazamiento grueso como el descrito anteriormente; ejemplos comunes son ver una lista larga de programas BASIC o un directorio de archivos.

El desplazamiento grueso implementado mediante el movimiento masivo de datos suele ser el único método de desplazamiento posible en la mayoría de las computadoras. Sin embargo, ANTIC proporciona soporte de hardware directo para desplazamiento grueso y fino vertical y horizontal, llevando el concepto de una "ventana de visualización que se mueve sobre los datos" de una ilusión metafórica a una implementación literal. Estas características de ANTIC brindan un movimiento rápido, suave y de pantalla completa que requiere un tiempo de CPU insignificante y, por lo tanto, libera la CPU para otro trabajo.

Todos los modos de visualización ANTIC, modos Texto y Mapa, pueden ejercitar las funciones de desplazamiento de hardware.

Desplazamiento grueso vertical

El desplazamiento vertical grueso es la característica más fácil de ejercitar. La primera instrucción del modo Texto o Mapa en cada Lista de visualización siempre incluye el modificador de instrucción LMS que especifica el inicio de la memoria de pantalla. A medida que genera la visualización, ANTIC incrementa automáticamente su puntero de escaneo de memoria de línea de Modo a línea de Modo para mostrar la memoria de manera contigua. Por lo tanto, una visualización se puede "mover" simplemente actualizando la dirección del modificador LMS inicial; agregar la cantidad de bytes utilizados para una línea en el Modo Texto o Mapa actual desplaza el contenido de la pantalla una línea hacia arriba, mientras que restar la misma cantidad mueve la pantalla hacia abajo. Por lo tanto, la visualización es en realidad un puerto de visualización que se mueve para ver diferentes áreas de la memoria en lugar de mover la memoria a un mapa de pantalla fijo.

Dado que el contador de escaneo de memoria de ANTIC no puede incrementarse automáticamente por encima de un límite de 4K, el límite de desplazamiento vertical de esta manera simple es de hasta 4K de movimiento. Una pantalla completa de texto de Modo 2 que utilice aproximadamente 1K puede desplazarse continuamente por la altura de cuatro pantallas hasta alcanzar el límite de 4K. Del mismo modo, una pantalla de texto de Modo 7 puede desplazarse por la altura de 16 pantallas completas.

Naturalmente, ese ejemplo trivial tiene una utilidad limitada. Muchas implementaciones de desplazamiento desplazan solo una parte de la pantalla mientras que otras secciones permanecen fijas. Este problema se resuelve con las capacidades inherentes de la lista de visualización ANTIC . En esta situación, la lista de visualización agregaría instrucciones de modo utilizando modificadores LMS en la primera línea de modo de las secciones de la pantalla que no deberían moverse, lo que bloquea efectivamente estas partes de la pantalla mientras se actualiza la dirección del modificador LMS para la sección de desplazamiento.

Una mejora adicional de este concepto utiliza la opción de modificador LMS en cada línea que se desplaza. El desplazamiento vertical en esta pantalla requiere actualizar una dirección de modificador LMS para cada línea de modo en la región de desplazamiento. Cuando la pantalla se gestiona con este nivel de detalle, el límite de RAM de la pantalla 4K de ANTIC se puede sortear fácilmente. Incluso en este peor ejemplo, el esfuerzo de CPU empleado es una fracción minúscula del procesamiento necesario para mover datos de pantalla en masa.

Otro límite que se debe tener en cuenta es que la dirección del modificador LMS de dos bytes no debe actualizarse cuando ANTIC esté procesando el LMS. Si ANTIC lee la dirección LMS mientras está parcialmente actualizada, ANTIC mostrará la sección incorrecta de la memoria para esa línea de modo. Cuando la región de desplazamiento de una pantalla requiere varias actualizaciones de la dirección LMS, aumenta la posibilidad de una actualización parcial y también aumenta la posibilidad de que dos líneas posteriores muestren los mismos datos. Los programas resuelven esto de varias maneras: realizando actualizaciones durante el espacio en blanco vertical, monitoreando el VCOUNT antes de las actualizaciones o realizando las actualizaciones en las interrupciones de la lista de visualización ejecutadas durante las secciones de la pantalla alejadas de la región de desplazamiento.

Desplazamiento fino vertical

El desplazamiento fino vertical permite el movimiento de una sola línea de escaneo de la región de desplazamiento para los modos de texto y mapa que tienen una altura mayor a una línea de escaneo. El desplazamiento fino vertical para los modos de mapa que tienen una altura de una sola línea de escaneo no es, lógicamente, práctico. El efecto del desplazamiento "fino" vertical para los modos de mapa de una sola línea de escaneo se puede lograr utilizando el método de desplazamiento grueso más sencillo.

El desplazamiento fino requiere una configuración para definir la región de desplazamiento. Esto se hace configurando el bit modificador de desplazamiento vertical (VS) en las instrucciones de lista de visualización secuencial. La primera instrucción de línea de modo sin el bit VS configurado se convierte en el final de la región de desplazamiento y se utiliza como línea de búfer para suministrar las nuevas líneas de exploración para desplazarse hacia arriba hasta la parte inferior de la región de desplazamiento.

El proceso de desplazamiento fino vertical de ANTIC funciona simplemente ordenándole a ANTIC que se salte una cantidad de líneas de escaneo para la primera línea de modo de la región de desplazamiento. Las líneas de modo subsiguientes en la región de desplazamiento no se ven afectadas. La última línea de la región proporciona el borde inferior de la región de desplazamiento y muestra la cantidad de líneas de escaneo que se eliminaron de la primera línea. Esta cantidad de líneas de escaneo se controla con el registro VSCROL. El valor varía de 0 a la altura de línea de escaneo de la línea de modo ANTIC: 1. El rango de valores máximos cubre 16 líneas de escaneo de desplazamiento fino de 0 a 15.

Cuando se alcanza el límite de desplazamiento fino, el desplazamiento continúa restableciendo el valor VSCROL y realizando un desplazamiento vertical grueso de la región de desplazamiento.

Desplazamiento horizontal grueso

El desplazamiento horizontal grueso requiere un poco más de esfuerzo que el desplazamiento vertical. Si bien se espera que el desplazamiento horizontal presente la ilusión de una ventana de visualización que se mueve de izquierda a derecha a lo largo de una amplia escena panorámica formada por la memoria de la pantalla, el incremento automático del escaneo de memoria de ANTIC entra en conflicto con esta idea de que las filas de datos de la pantalla son más anchas que la pantalla. Presentar la memoria de la pantalla como líneas horizontales largas requiere un modificador LMS para cada instrucción de modo de mapa o texto de lista de visualización en la región de desplazamiento. Un paso horizontal se logra incrementando o decrementando todas las direcciones LMS de la región de desplazamiento.

El desplazamiento horizontal requiere la misma implementación de la lista de visualización que el ejemplo del peor caso descrito para el desplazamiento vertical grueso. Por lo tanto, cuando se implementa el desplazamiento horizontal, también se admite el desplazamiento vertical simplemente cambiando el valor incrementando o disminuyendo las direcciones LMS. El otro beneficio de esta disposición es que es fácil administrar la memoria de pantalla en torno al límite de memoria de pantalla 4K de ANTIC.

Consulte la sección Desplazamiento grueso vertical para obtener más información y conocer las limitaciones de tiempo al actualizar las direcciones de los modificadores LMS.

Desplazamiento fino horizontal

El desplazamiento fino horizontal permite el movimiento del reloj de un solo color de la región de desplazamiento para los modos de texto y mapa. Para todas las interpretaciones de color normales, esto se realiza por reloj de color, no por píxel, incluso cuando los píxeles son más grandes (o más pequeños) que los relojes de color. Los modos ANTIC que utilizan las interpretaciones de color GTIA alternativas deben desplazarse por un píxel GTIA completo (dos relojes de color). Solo se deben utilizar valores pares para garantizar un desplazamiento correcto de los píxeles GTIA. Los valores impares de HSCROL cambiarán el flujo de píxeles GTIA a un estado diferente que se interpretará como colores diferentes.

El desplazamiento fino requiere una configuración para definir la región de desplazamiento horizontal. El primer paso es comenzar con una Lista de visualización utilizando el modificador de instrucción LMS para especificar la dirección de inicio de cada línea de modo. Esto se hace para organizar la memoria de la pantalla como largas filas de datos para la pantalla. El siguiente paso es configurar el bit modificador de Desplazamiento horizontal (HS) en todas las instrucciones de línea del Modo de lista de visualización para la región de desplazamiento.

Este número de relojes de color a cambiar se controla con el registro HSCROL. El rango máximo de valores de HSCROL cubre el desplazamiento fino de 16 relojes de color de 0 a 15. La información del reloj de color utilizada se almacena en búfer desde el comienzo de la línea de modo (puntero de escaneo de memoria actual de ANTIC) utilizando suficientes bytes de memoria de pantalla para satisfacer los 16 relojes de color. El desplazamiento horizontal simplemente le indica a ANTIC cuántos relojes de color puede generar desde los 16 relojes de color almacenados en búfer, comenzando por el último reloj de color (más a la derecha) de la memoria almacenada en búfer. Cero (0) significa que no hay relojes de color generados desde el búfer. 1 es el último reloj de color (más a la derecha) del búfer. Los relojes de color se insertan en el borde izquierdo de la pantalla, lo que hace que el área de desplazamiento de la pantalla se desplace hacia la derecha.

Cuando se alcanza el límite de desplazamiento fino, continúe desplazándose restableciendo el valor HSCROL y realizando un desplazamiento horizontal grueso de la región de desplazamiento. El rango de reloj de 16 colores de ANTIC permite un desplazamiento fino de varios caracteres del modo de texto o más de un byte de píxeles del modo de mapa. Por lo tanto, la actualización de las direcciones LMS puede sumar o restar varios bytes.

Métodos de desplazamiento alternativos

Un uso interesante del comportamiento de escaneo de memoria DMA de ANTIC permite una estrategia para distancias de desplazamiento horizontal aparentemente largas, pero utiliza una fracción de la memoria real requerida. Como se analiza en Desplazamiento grueso horizontal, el incremento automático del escaneo de memoria de ANTIC de línea de modo a línea de modo entra en conflicto con la idea de que las filas de datos de la pantalla son más anchas que la pantalla. El uso de memoria realmente organizada como una serie de bytes contiguos, horizontales y largos requiere un modificador LMS para cada instrucción de Texto de lista de visualización o Modo de mapa en la región de desplazamiento.

En lugar de utilizar un modificador LMS para cada línea, este método utiliza una lista de visualización más "normal" que solo requiere un modificador LMS al comienzo de la región de desplazamiento. Un incremento (+1) en la dirección del modificador LMS hace que la región de desplazamiento parezca moverse hacia la izquierda. Sin embargo, la "nueva" información que se ha movido hacia el lado derecho de la región de desplazamiento era anteriormente el primer byte de la siguiente línea (excepto el último byte de la última línea; esa información había estado completamente fuera de la pantalla).

La segunda mitad de esta estrategia requiere que se actualice el último byte/carácter de cada línea en la región de desplazamiento para mostrar la nueva información deseada. Para una pantalla de desplazamiento típica, esto significaría actualizar el último byte de una o dos docenas de líneas, lo que requiere una cantidad insignificante de tiempo en el ensamblaje. Por lo tanto, si este proceso de desplazamiento implica una pantalla de texto en modo 2 o modo 4 a pantalla completa (el peor de los casos) y utiliza toda la capacidad de 4K del direccionamiento automático de memoria de pantalla de ANTIC, entonces el desplazamiento horizontal puede continuar de esta manera durante aproximadamente 3000 pasos; equivalente a 75 pantallas completas.

Sin embargo, ni siquiera se requiere el uso de memoria 4K. Una vez que todos los datos de la primera pantalla completa se han desplazado fuera de la pantalla, la aplicación de desplazamiento puede reconstruir la primera pantalla para que contenga un punto de transición conocido, de modo que la acción de desplazamiento pueda volver a la primera dirección del bloque sin interrupciones obvias ni interrupciones aparentes en el desplazamiento.

El desplazamiento fino de esta disposición requiere un poco más de planificación. Cuando se habilita el desplazamiento fino en la Lista de visualización, ANTIC recupera más información de la que la línea de modo requiere para la visualización. Como cada línea de modo ahora utiliza más memoria, la nueva información que se desplaza hacia el costado de la pantalla no es el byte/carácter que se mostró al comienzo de la siguiente línea. Sin embargo, esto no afecta el proceso de desplazamiento y simplemente cambia el valor de la suma y la resta que se utiliza para ubicar el inicio y el final de cada línea de visualización.

Lista de visualización de interrupciones (DLI)

ANTIC incluye una función para activar una interrupción atendida por la CPU en posiciones verticales específicas de la pantalla. Esto está integrado en la Lista de visualización de ANTIC, que le indica a ANTIC que active la interrupción durante la última línea de escaneo de la instrucción de modo actual, y por eso se denomina "Interrupción de lista de visualización". Otras plataformas denominan a esta actividad " interrupciones de trama " o " interrupciones de espacio en blanco horizontal ". El propósito habitual es cambiar los valores relacionados con la visualización en una ubicación conocida para que las transiciones sean visualmente precisas o se produzcan donde no entren en conflicto con la actividad de visualización. Las posibilidades incluyen, entre otras, cambiar los valores de registro de color, las posiciones horizontales del jugador/misil y los valores de desplazamiento fino. Dado que la DLI es un código de máquina 6502 ejecutado por la CPU, es posible cualquier tipo de trabajo de procesamiento siempre que sea lo suficientemente breve como para no entrar en conflicto con otra actividad y no sobrepase una Interrupción de lista de visualización posterior. Un buen ejemplo es el sondeo del controlador del ratón, que debe realizarse con una frecuencia superior a 1/60 de segundo.

Descripción general

Para iniciar correctamente la interrupción se requieren las siguientes condiciones:

Configuración adecuada

Al actualizar los valores de control de visualización, se debe tener cuidado para asegurarse de que ANTIC no los esté utilizando actualmente. Si ANTIC está procesando la Lista de visualización que contiene una Instrucción con el modificador DLI, se podría enviar una interrupción mientras se cambia la dirección VDSLST, lo que podría hacer que el sistema se bloquee. Si una Lista de visualización utiliza múltiples interrupciones y las interrupciones se habilitan en NMIEN después de que ANTIC ya haya pasado Instrucciones de modo con modificadores DLI, las Interrupciones de la Lista de visualización se iniciarán fuera de orden, lo que provocará resultados inesperados.

Una secuencia razonable de eventos para instalar una lista de visualización utilizando interrupciones de lista de visualización:

Un programa integrado estrechamente con el ciclo de visualización y que conozca la posición del haz de electrones en relación con la visualización actual puede evitar la desactivación del DMA de la lista de visualización. Asimismo, no es necesario apagar la pantalla si la configuración se produce durante el borrado vertical.

Consideraciones sobre el código

El contenido de los registros X e Y del acumulador 6502 no se conserva antes de ingresar a la rutina DLI. Es responsabilidad de la rutina DLI guardar el estado de los registros que se utilizarán durante la rutina DLI y, luego, la última acción es restaurar los valores originales de los registros antes de salir con una instrucción RTI. Las rutinas generalmente envían los valores de los registros a la pila 6502.

Si se utilizan varias DLI, la primera interrupción actualiza VDSLST para que apunte a la dirección de la siguiente interrupción, y así sucesivamente para las interrupciones subsiguientes. La última rutina de interrupción de lista de visualización en la pantalla apunta a VDSLST de nuevo a la dirección de la primera interrupción de lista de visualización.

Si un valor modificado por un DLI tiene un registro de Sombra del Sistema Operativo y las Interrupciones en Blanco Vertical están habilitadas, entonces el valor en efecto antes (encima) de la posición de pantalla de la Interrupción de Lista de Visualización es el valor de la Sombra, y el valor después (debajo) de la posición de pantalla es el valor del DLI (y cualquier otro DLI que lo cambie posteriormente). Si el valor no tiene una Sombra del Sistema Operativo, entonces debe haber una rutina DLI (o VBI) inicial que establezca un valor de inicio.

Si se muestra un objeto gráfico mientras el DLI cambia su valor, los resultados pueden ser inconsistentes. El ejemplo más común es cambiar el color de fondo. Dado que el DLI comienza a ejecutarse mientras el haz de electrones está en una parte visible de la pantalla, la transición del color de fondo anterior al nuevo color escrito por el DLI será visible en algún lugar de la línea de escaneo actual. (La ubicación exacta varía según los requisitos de DMA para el modo de visualización y los gráficos de Jugador/Misil). Para producir una transición limpia de una línea de escaneo a otra, el código primero debe escribirse en WSYNC, que detiene la ejecución del DLI hasta el final de la línea de escaneo, y luego escribir en los registros deseados.

Si bien la operación habitual de la DLI consiste en cambiar algunos valores orientados a la visualización y luego volver al código principal, esto no es un requisito. Es seguro que una DLI se ejecute durante varias o muchas líneas de escaneo siempre que finalice antes de la siguiente DLI o de la interrupción de espacio en blanco vertical.

Ejemplos

Un ejemplo trivial de una interrupción de lista de visualización que cambia el color de fondo:

 DLI PHA ; Guardar acumulador en la pila LDA # $9C ; Cargar azul claro (color $9, luminancia $C) STA WSYNC ; Esperar a sincronizar hasta el final de la línea de exploración STA COLBK ; Establecer el fondo PLA ; Restaurar acumulador de la pila RTI ; El final.               

Gráficos de jugador/misil

La mayor parte de la funcionalidad de gráficos de Player/Missile está en el dominio del chip CTIA/GTIA . CTIA/GTIA controla la posición, el tamaño, el color, la prioridad y la detección de colisiones de los objetos gráficos de Player/Missile, pero su implementación de representación de formas real no va más allá de un patrón de un solo byte por objeto presentado de manera uniforme en todas las líneas de escaneo. (Los patrones se configuran en los registros de patrones gráficos GRAF* de CTIA/GTIA ). Al final, CTIA/GTIA por sí solo genera objetos de Player/Missile como patrones de franjas verticales únicamente en la pantalla.

El diseño de ANTIC incluye la capacidad de acceso directo a la memoria (DMA) para poder leer los datos gráficos de la lista de visualización y del campo de juego. Esta capacidad de acceso directo a la memoria se aprovecha para leer datos en nombre de CTIA/GTIA y actualizar los registros de patrones gráficos GRAF* a medida que se genera cada línea de exploración de la pantalla. De esta manera, ANTIC proporciona a los objetos de jugador/misil patrones que varían a lo largo de la altura de la pantalla y, por lo tanto, aparecen como gráficos de "sprites" tradicionales.

Los bits 2 y 3 del registro DMACTL de ANTIC (sombreados por SDMCTL) controlan la recuperación de datos de Jugador/Misil de ANTIC para actualizar los registros de patrones gráficos CTIA/GTIA.

Valores de bits de control DMA del reproductor/misil DMACTL (bits [3:2]):

El DMA de misiles se puede habilitar sin el DMA del reproductor. Sin embargo, cuando el DMA del reproductor está habilitado, el DMA de misiles se activa automáticamente para mantener la sincronización del DMA constante, pero los datos no se envían al registro GRAFM del misil .

El bit 4 (valor 10 hexadecimal /16 dec ) del registro DMACTL controla la frecuencia de recuperación de nuevos datos. ANTIC recupera datos y actualiza CTIA/GTIA en cada línea de escaneo. Los ajustes de resolución DMACTL afectan la frecuencia con la que ANTIC incrementa su puntero DMA interno para obtener nuevos datos. La resolución de línea única de los gráficos de jugador/misil incrementa la dirección DMA en cada línea de escaneo, y la resolución de línea doble incrementa la dirección DMA con cada línea de escaneo par. Los valores de bit DMACTL para la resolución de jugador/misil:

CTIA/GTIA también debe estar habilitado específicamente para recibir los datos gráficos del jugador/misil a través de DMA para presentar correctamente los objetos en la pantalla. Consulte el registro GRACTL de CTIA/GTIA para obtener más información.

La ubicación de la memoria leída por ANTIC para los gráficos de Jugador/Misil está controlada por el registro PMBASE. Este valor de PMBASE proporciona la página de inicio de la dirección base para los gráficos de Jugador/Misil. Cuando funcionan los gráficos P/M con resolución de línea doble, el valor de PMBASE debe comenzar en un límite de 1K. Cuando funcionan los gráficos P/M con resolución de línea simple, el valor de PMBASE debe comenzar en un límite de 2K. Los mapas de memoria para los modos de gráficos de Jugador/Misil:

Resolución de línea doble (1 byte por cada 2 líneas de exploración, 128 bytes por cada objeto) relativa a PMBASE x 100 hexadecimal /256 dec :

Resolución de una sola línea (1 byte por línea de escaneo, 256 bytes por cada objeto) relativa a PMBASE x 100 hexadecimal / 256 dec :

Los misiles comparten los mismos bytes de los mapas de memoria anteriores, dos bits por misil:

ANTIC no utiliza las primeras y las últimas 8 líneas de escaneo de datos de la memoria del jugador/misil en el mapa de memoria. En la resolución de doble línea, se ignoran los primeros y los últimos cuatro bytes, y en la resolución de una sola línea, los primeros y los últimos ocho bytes.

Dado que el jugador/misiles son una superposición independiente de los gráficos del campo de juego y se representan en el área de sobreescaneo, las coordenadas verticales de los datos del jugador/misil deben estar desplazadas para alinear los objetos con el campo de juego. En los modos de gráficos predeterminados de 192 líneas de escaneo del sistema operativo, las coordenadas de los datos verticales del jugador/misil están desplazadas con respecto al inicio del jugador/misil en la memoria, como se muestra a continuación. Las entradas de sobreescaneo muestran los primeros y últimos desplazamientos utilizados de los datos del jugador/misil:

Limitaciones

La extensión vertical de toda la pantalla del campo de juego varía entre 0 y 240 líneas de escaneo; esto depende de la cantidad de líneas que ANTIC esté programado para mostrar de acuerdo con la Lista de visualización . ANTIC comienza a generar líneas de escaneo en la línea de escaneo de TV 8 y continúa hasta la línea 247 para un total de 240 líneas de escaneo.

El ancho horizontal de la pantalla del campo de juego se puede configurar en 256, 320 o 384 píxeles de ancho, lo que corresponde a 128, 160 o 192 relojes de color. En el modo más ancho, solo se ven 352 píxeles (176 relojes de color). Consulte DMACTL.

El desplazamiento fino horizontal mueve la región de desplazamiento hasta 16 relojes de color. Consulte HSCROL.

Los modos de mapa GTIA se deben desplazar horizontalmente en pasos del tamaño de un píxel entero (relojes de 2 colores), en lugar de un reloj de un solo color. Consulte HSCROL y la discusión, Desplazamiento fino horizontal

El desplazamiento fino vertical mueve la región de desplazamiento la cantidad de líneas de escaneo en una sola línea de modo de la región de desplazamiento, hasta un máximo de 16 líneas de escaneo. Consulte VSCROL.

Aunque el contador del programa de lista de visualización de ANTIC es de 16 bits, solo los 10 bits inferiores cambian durante la ejecución normal (es decir, secuencial) de la lista de visualización. Esto significa que la lista de visualización requiere una instrucción JMP (Jump) para cruzar un límite de 1K. Esta no es una limitación grave, porque el tamaño de una sola lista de visualización suele variar de 32 a 202 bytes, y prácticamente nunca supera los 720 bytes. Dado que se puede ubicar en cualquier lugar de la memoria, no es difícil encontrar un lugar de tamaño suficiente en la memoria que no cruce un límite de 1K.

El registro de escaneo de memoria, un registro que direcciona los datos almacenados en la memoria de la pantalla, es de 16 bits, pero solo cambian los 12 bits inferiores cuando ANTIC escanea secuencialmente la memoria de video. Esto significa que la lista de visualización requiere una instrucción de línea de modo que incluya la opción LMS (cargar escaneo de memoria) donde la memoria de la pantalla cruza un límite de 4K. Los modos gráficos E y F de ANTIC requieren más de 7,5 K de memoria de pantalla para una visualización de pantalla completa. Las listas de visualización para estas pantallas requieren que se agregue la opción LMS a una instrucción de modo cerca del medio de la pantalla donde la memoria de la pantalla cruza el límite de 4K. El límite de 4K no se puede cruzar dentro del medio de una línea de modo gráfico, sino solo entre el final de una línea de modo y el comienzo de la siguiente línea. En otras palabras, la memoria para la línea de modo anterior termina en el último byte exacto del bloque de 4K y la siguiente línea de modo comienza en el primer byte exacto del siguiente bloque de 4K.

El conjunto de caracteres se puede ubicar en cualquier lugar de la memoria (ver CHBASE), pero, dependiendo del modo de texto ANTIC, la dirección inicial debe alinearse con un límite de 512 bytes o 1K.

El mapa de memoria Jugador/Misil puede aparecer en cualquier lugar de la memoria (ver PMBASE), pero, dependiendo de la resolución, la dirección inicial debe alinearse con un límite de 1K o 2K (ver también DMACTL).

Errores y condiciones fronterizas

Ciertas combinaciones de valores en la lista de visualización pueden producir resultados inesperados. Además, algunas de las actividades de ANTIC tienen tiempos críticos. Los cambios en los registros fuera de las ventanas de tiempo adecuadas pueden producir efectos demorados o resultados inesperados. Algunas de estas situaciones se pueden aprovechar para obtener efectos interesantes y otras producen corrupciones en la visualización.

Comportamientos explotables

Gráficos 9++

Un método para utilizar los modos de color GTIA mejorados sin los grandes requisitos de memoria del modo F de ANTIC es indicarle a ANTIC que repita cada línea de datos una o más veces mediante instrucciones de línea de modo con el modificador LMS para volver a mostrar los mismos datos de pantalla en varias líneas de escaneo. Esto produce una resolución vertical más baja, donde cada píxel tiene una altura de 2 o más líneas de escaneo, pero tiene una mayor sobrecarga de DMA debido a que ANTIC necesita volver a leer los mismos bytes de la memoria de la pantalla. En lugar de utilizar modificadores LMS repetidos, se puede aprovechar una peculiaridad del desplazamiento vertical para crear un modo de cuatro líneas de escaneo que muestra píxeles utilizando los modos de interpretación de color GTIA o de alta resolución.

El desplazamiento vertical normalmente no se consideraría útil para el modo F de ANTIC, que tiene una línea de escaneo de alto. Sin embargo, si el desplazamiento vertical está habilitado para la instrucción de lista de visualización del modo F y el registro VSCROL está configurado en 13, entonces el contador de líneas de ANTIC contará de 13 a 0 (cuatro líneas de escaneo: 13, 14, 15, 0). Al hacerlo, ANTIC genera la misma línea de gráficos para cada línea de escaneo desde su búfer interno sin volver a leer la misma memoria de pantalla nuevamente. El final de la región de desplazamiento vertical debe tener VSCROL restablecido a 3, lo que permite que ANTIC cuente de 0 a 3 (cuatro líneas de escaneo). El resultado final es una pantalla de modo F donde las líneas tienen cuatro líneas de escaneo de alto en lugar de una, pero con la sobrecarga de DMA de solo una lectura de datos de memoria de pantalla que ocurre en la primera línea de escaneo.

Comportamientos no explotables

Corrupción del desplazamiento horizontal en modo 8/modo 9

Los modos 8 y 9 de mapa de ANTIC se corromperán cuando aparezcan inmediatamente después de una línea desplazada horizontalmente de un modo diferente que utilice un ancho de campo de juego normal o amplio. Esto ocurre independientemente de si la línea del modo 8 o 9 se desplaza horizontalmente o no, pero los resultados de la corrupción son diferentes en cada caso. El problema aparece con ciertos valores HSCROL que hacen que ANTIC muestre píxeles de forma incorrecta y desalinee la línea del modo 8-9.

El error no existe cuando se utiliza un campo de juego de ancho estrecho.

Dado que los valores HSCROL que causan el problema son mayores que 7, el problema se puede evitar cuando el modo 8 o 9 NO utiliza el desplazamiento horizontal limitando los cambios de HSCROL a relojes de color de 0 a 7 y actualizando la dirección LMS de la lista de visualización para que el desplazamiento horizontal sea grueso en incrementos más pequeños. Esta estrategia resuelve todos los casos en todos los modos de texto y todos los modos de mapa desde A hasta F que generan 8 o menos relojes de color por byte de memoria de pantalla.

Error de última línea de alta resolución

No se debe crear una lista de visualización con una instrucción de alta resolución (Modo F) en la línea de escaneo 247 (la última línea de escaneo que se puede visualizar). Si los bits de ancho del campo de reproducción DMACTL no son 00, ANTIC no generará la sincronización vertical correctamente, lo que podría causar distorsión en la visualización. En cualquier caso, esto es fácil de evitar, ya que no es una disposición práctica de la lista de visualización, ya que coloca la línea de modo en el área de sobreescaneo donde normalmente no es visible.

Campo de juego amplio Desplazamiento fino horizontal

El modificador de lista de visualización de desplazamiento fino horizontal hace que ANTIC obtenga memoria de pantalla adicional correspondiente al siguiente ancho de campo de juego más grande, que proporciona los datos necesarios para desplazarse en la pantalla. Dado que no hay un ancho de campo de juego mayor que el campo de juego ancho, ANTIC no tiene datos adicionales para el desplazamiento fino. ANTIC presenta datos falsos para el área vaciada por la pantalla desplazada: en el lado izquierdo de la pantalla, el color de fondo se desplazará hacia adentro y en el lado derecho aparecerán algunos relojes de color de datos aleatorios al final del rango de desplazamiento. Estos datos de píxeles generalmente no se notan, ya que ocurren en el área de sobreexploración donde normalmente no son visibles. Sin embargo, si estos píxeles de campo de juego falsos se cruzan con los píxeles de jugador/misil, se marcará una colisión. La solución para los jugadores/misiles que se han movido al área de sobreexploración es restablecer sus posiciones a cero para eliminarlos de la pantalla y así evitar colisiones falsas.

Véase también

Referencias

  1. ^ Manual de servicio técnico de la computadora doméstica Atari - 400/800 (PDF). Atari, Inc., págs. 1–8.
  2. ^ Neubauer, Doug (20 de junio de 2009). "Los años de Atari, por Doug Neubauer. Star Raiders, Solaris y Pokey". DougNeubauer.com .
  3. ^ Patente estadounidense 4296476, Mayer, Steven T.; Miner, Jay G .; Neubauer, Douglas G.; Decuir, Joseph C., "Sistema de procesamiento de datos con generador de gráficos programable", expedida el 20 de octubre de 1981, asignada a Atari, Inc. 
  4. Bisson, Gigi (mayo de 1986). «Antic entonces y ahora. Cómo la comunidad Atari y esta revista crecieron juntas». Antic . 5 (1): 16–17. ISSN  0745-2527 . Consultado el 23 de febrero de 2023 .
  5. ^ Michael Current, "¿Qué son los chips SALLY, ANTIC, CTIA/GTIA, POKEY y FREDDIE?", Computadoras Atari de 8 bits: preguntas frecuentes
  6. ^ ab Boris, Dan. "Fichas Atari". Página de inicio de Dan B. Consultado el 1 de febrero de 2011 .
  7. ^ Vendel, Curt. "Atari 800XLCR". AtariMuseum.com . Archivado desde el original el 13 de septiembre de 2011. Consultado el 1 de febrero de 2011 .
  8. ^ Vendel, Curt. "KERI Performance Tester". AtariMuseum.com . Archivado desde el original el 13 de septiembre de 2011. Consultado el 1 de febrero de 2011 .

Enlaces externos