Gráficos en consolas antiguas (XII): Atari Lynx

Comentario original:

Recuerda si es posible hacer una entradilla sobre la Atari Lynx 😉 Consolaza portatil para la epoca. Le falló su marketing o qué se yó…

La Atari Lyni inicialmente no la iba a incluir en la serie por dos motivos:

  • Es una consola demasiado oscura y si he descartado la PC-Engine y la Neo-Geo AES esta no podría ser menos.
  • Su forma de renderizar gráficos no es a través de celdas/tiles como ocurría con el resto de consolas de la época, por lo que la entrada podría llevar a confusiones.

Pero pensando bien la cosa creo que merece la pena dedicarle una entrada ya que aunque fue un enorme fiasco comercial fue la primera consola en tener un sistema gráfico contemporáneo.

Las especificaciones técnicas de la Atari Lynx fueron las siguientes:

  • CPU “Mikey” MOS 65SC02 a 4 Mhz.
  • 64KB DRAM a 120ns
  • Procesador Gráfico Suzy a 16Mhz.
  • Resolución de 160×102 pixeles.
  • Paleta de 4096 colores (12 bits).
  • 4 bits de color por pixel (15 colores+transparente).

La Lynx era un verdadero armatoste en comparación con el resto de portátiles de su época.

 

Incluso sacando una segunda version mucho más pequeña seguía siendo enorme, hoy en dia una GB Tocho nos parece un enorme ladrillo así que imaginad el tamaño que tenia.

LynxSize

 

Fue diseñada por la misma gente que diseñaría después la 3DO y que previamente había diseñado el Commodore Amiga excepto Jay Miner, inicialmente para la compañía Epyx bajo el nombre de Handy, quienes la vendieron a Atari.

La CPU de la Lynx no es más que un 6502 con instrucciones adicionales y mejor gestión en las interrupciones, su velocidad de reloj hace que en ese aspecto fuera el doble de rápida que la de la Famicom/NES, pero lo que era novedoso en el plano de las consolas era su procesador gráfico, el cual no derivaba del TMS9918A sino que se podría considerar inspirado por el “Agnus” del Commodore Amiga 1000. No en vano, el diseñador del “Suzy” fue RJ Mical quien había escrito las librerías gráficas y la documentación del “Agnus”, el chip gráfico del Commodore Amiga 1000, el cual había sido diseñado por Jay Miner.

jay-miner-1

¿Quien fue Jay Miner? este buen hombre, quien tristemente falleció en 1994. Antes de crear el Agnus había sido el creador del chip TIA utilizado en la Atari VCS 2600 y del ANTIC utilizado en la gama de ordenadores de 8 bits de Atari y en la Atari 5200. El Agnus heredo las Display Lists del ANTIC pero cambio completamente el paradigma por un motivo, el Amiga 1000 era un ordenador y la memoria se había abaratado lo suficiente como para poder colocar un búfer de imagen completo en el sistema.

En los primeros ordenadores el búfer de pantalla se mantenia normalmente en la memoria principal y bajo el control de la CPU. Pero a medida que  la memoria se abarataba y se volvía más rápida, los búfers de imagen mejoraban por lo que había la posibilidad de crear gráficos más complejos, para las rutinas gráficas que hacían falta manipular grandes cantidades de memoria y cuando tocaba dibujar la escena el búfer de imagen quedaba limitado a la capacidad de la CPU que era la encargada de realizar las operaciones en lo que a gráficos se refiere, incluidas las de manejo de memoria.

El hardware de la Atari Lynx difería por completo de las consolas de la época en cuanto al apartado gráfico ya que heredo muchas cosas del Commodore Amiga por lo que para entender como funciona el apartado gráfico de la Atari Lynx y ciertas consolas posteriores que tratare en futuras entradas, tenemos que entender en cuenta en que difirió el Commodore Amiga del resto y el primer concepto que tenemos que tener en cuenta una unidad llamada “Blitter”, la cual seguramente a muchos nos han hablado pero os diré una cosa, se encuentra dentro de vuestros ordenadores, teléfonos móviles, consolas de sobremesa y portátiles, tablets… todo aquello que tenga un procesador gráfico moderno tiene en su interior un “Blitter”.

¿Que es lo que hace un “Blitter”? Pues hace “Blitting”, por lo que tiene que ver con una cosa llamada “Blitts”, la Wikipedia tiene una bonita explicación de que se tratan:

Es una operación de gráficos por ordenador en la cual varios bitmaps se combinan en uno solo utilizando un raster operator.

La operacíón implica al menos dos bitmaps, uno de origen y otro de destinacion, posiblemente un tercero que a menudo es llamado “mascara” y algunas veces un cuarto utilizado para crear un stencil. Los pixeles de cada uno son combinados de acuerdo con la operación de rasterizado (ROP) y el resultado se escribe en la destinación.

Un mapa de bits es una estructura de datos espacio de memoria que representa un mapa (x,y) en el que cada posición contiene un valor, con esto se puede crear un patrón/sprite en dicho espacio y almacenarlo. En la definición nos hablan de dos mapas de bits, uno de ellos es el mapa de bit origen y el otro es el mapa de bit resultado que se obtiene tras realizar sobre este una serie de operaciones sobre el mismo, dichas operaciones se realizan al vuelo y el resultado se escribe en otro espacio de la misma memoria o en otra memoria. Sí tuvieramos que realizar esto con una CPU convencional de época (ya sea un Z80, un 68000 o un 6502) nos encontraríamos con que las operaciones de traslado y manipulación tendriamos que hacerlas pixel por pixel por lo que se gastaría un enorme cantidad de ciclos de reloj. Así que para realizar todo el proceso arriba explicado lo mejor es una máquina de estado que lee el patron/sprite/bitmap de una posición de origen, lo procesa según como se encuentre configurado en ese momento y escriba el resultado en otro espacio de memoria. Ahora imaginad que el espacio de memoria destino es un mapa de bits que representa la pantalla sobre la que dibujamos y habréis entendido todo el proceso.

Así que la solución a la que llego Miner fue el Blitter, una pieza que se vio por primera vez en el Commodore Amiga y formaba parte del Agnus que era el chip gráfico. En la documentación del Commodore Amiga se define al Blitter de la siguiente manera:

El Blitter es uno de los dos co-procesadores en el Amiga, forma parte del chip Agnus, y se utiliza para copiar bloques de memoria y dibujar lineas. Cuando esta copiando memoria, este es el doble de rápido que el 68K, con la capacidad de mover 4MB por segundo.

En el caso del ANTIC explique como este se encargaba de controlar el CTIA a través de las Display Lists pero este sistema no estaba pensado para manipular bitmaps/patrones/sprites por lo que las instrucciones revelaban como se tenía que dibujar dicha linea, en el caso del Agnus las instrucciones revelaban como tenía que dibujar el patrón/sprite por lo que en realidad pasabamos de tener una serie de tablas (caso del TMS9918A) a definir cada patrón/sprite en memoria como si fuese un mapa de bits donde cada posición contuviera el color.

La primera ventaja de tener un Blitter+Búfer de imagen era la facilidad de programación, inicialmente los Blitter tenían operaciones muy simples pero a medida que fueron avanzando fueron ganando la capacidad de poder dibujar los diferentes patrones/sprites que componían la escena a través de su descripción. Pero la mayor ventaja de tener un búfer de imagen es que no tenías que dibujar el mismo patrón/sprite varias veces sino que si estaba repetido solo tenías que dibujarlo una vez y luego copiarlo en las posiciones necesarías del búfer de imagen, ahorrando ciclos de procesamiento.

Os voy a dar un ejemplo de ello,  imaginad por un momento que tenéis que dibujar la siguiente escena en pantalla:

Legend_of_Zelda_-_NES_-_Overworld

Utilizando la metodología derivada del TMS9918A cada uno de los árboles que forman la escena tendrían que ser generados varias veces, con un blitter y un búfer de imagen solo haría falta generarlos una vez para luego repetirlos varias veces en el búfer de imagen. No solo eso, sino que con el Blitter podemos tener un sprite para los Moblins que sea general y aplicar una operación sobre el color de salida para tener varios tipos… y solo haría falta dibujar el patrón una vez ya que el cambio de color se haría al vuelo.

Otro elemento son las operaciones de manipulación de pantalla, imaginad que queremos rotar todos los patrones/sprite en pantalla, sin un Blitter esto supone rotarlos uno por uno por parte de la CPU, con un Blitter solo se tiene que enviar la instrucción correspondiente al Blitter y este se encarga de rotarlos (cambiar los valores de posición) uno por uno y con una sola instrucción de la CPU para todos ellos en conjunto. Como veis la ventaja del Blitter es que reducía la carga de la CPU para hacer operaciones gráficas.

A medida que los Blitters fueron avanzando con el tiempo añadieron operaciones gráficas complejas como la capacidadde dibujar lineas (vertices) a partir de que el desarrollador diese las coordenadas correspondientes, también se añadieron instrucciones con el tiempo para rellenar el espacio interno de los polígonos, primero con un color y más tarde con un patrón/sprite, lo que llevo a la aplicación del mapeado de texturas. Como inciso… ¿Os acordáis de la entrada que realice recientemente sobre SNES en la que hable del chip SuperFX que se utilizo en muchos juegos como Star Fox y Super Mario World 2 entre otros?

Pues el SuperFX era un Blitter, al igual que el chip que Sega coloco dentro del cartucho del Virtua Racing para MegaDrive.

Pero claro, no todo era bonito en los inicios ya que los Blitter se veían altamente limitados por la velocidad de la memoria. Al fin y al cabo lo que hacía un blitter era escribir sobre una memoria concreta por lo que es dependiente de la velocidad de escritura de la memoria a la que este asociado. Por otro lado con el Blitter se rompia el concepto de “correr al compas del haz de electrones” ya que en cada pixel el procesador gráfico podía llegar a realizar una serie de operaciones que no siempre eran las mismas, esto llevo a que la tasa de fotogramas por segundo de los juegos pasara de estar fija a ser completamente variable, dependiendo de la resolución de pantalla y de la complejidad de los gráficos. Esto se sigue manteniendo hoy en día. Al separar la generación de gráficos del timing de la pantalla y hacer que las operaciones gráficas cayeran en manos del procesador gráfico esto hizo que durante los periodos de VBlank (utilizados habitualmente por la CPU o la CPU+DMA para escribir en la memoria gráfica) no se parase el procesador gráfico, simplemente este escribía la siguiente escena sobre el búfer de imagen independientemente de los tiempos del VBlank, luego el mecanismo correspondiente ya se encargaría de enviar la imagen resultante a pantalla.

Desgraciadamente el Blitter no se dio en consolas de sobremesa hasta que la memoria no fue lo suficientemente barata y rápida como para soportar un bufer de imagen completo sin restricciones.

En el caso del procesador gráfico de la Atari Lynx,Suzy,  pese a poder definirse como un  Mini-Agnus y ser mucho más avanzado en prestaciones a los procesadores gráficos de la época en potencia era mucho más limitado que estos ya que podía dibujar 75 fotogramas por segundo a una resolución 160×102 pixeles (no, no es ningún error) por lo que su tasa de relleno era de 1.2 Mega (Millones) de pixeles por segundo. Esta limitación era debido a que la memoria RAM era compartida entre gráficos y sistema por lo que el Suzy no siempre podía acceder a la RAM ya que estaba siendo utilizada por la CPU y por tanto esto dejaba completamente parado el procesador gráfico. Dicho de otra manera, la memoria era el mayor cuello de botella que tenía el sistema.

¿Pero como se comparaba con sus contemporáneas? En el siguiente video podréis ver una prueba de lo avanzado que era el chipset gráfico de la Lynx en comparación al de Game Boy y Game Gear:

En el video se pueden ver ejemplos que demuestran que el procesador gráfico de la Atari Lynx era mucho más avanzado, no tuvimos una consola con una capacidad portátil con la misma capacidad hasta el lanzamiento de Game Boy Advance más de diez años después.

Anuncios