Source: https://josepjroca.wordpress.com/2015/02/20/graficos-en-consolas-antiguas-rarezas-japonesas-ii-neo-geo-aescd/
Timestamp: 2017-12-17 05:57:24+00:00

Document:
Gráficos en consolas antiguas (Rarezas japonesas II): Neo-Geo AES/CD | Disruptive Sketchbook
Urian 4:20 PM el 20 February, 2015
Gráficos en consolas antiguas (Rarezas japonesas II): Neo-Geo AES/CD
Por petición popular le toca a la consola de SNK
La consola es del mismo tipo que sus contemporaneas en cuanto a arquitectura gráfica, por lo que os recomiendo repasar el artículo que hice sobre como el TMS9918A y los chips derivados y/o basados en el mismo funcionan. Lo podéis encontrar aquí.
La CPU de Neo-Geo es la CPU estándar de los sistemas de 16 bits, el 68K, es más, la consola a simple vista parece una Mega Drive subida de vueltas, lo parece pero no lo es. En primer lugar la consola de SNK carece del mecanismo DMA para traspasar datos de la RAM a la VRAM que se utiliza para crear la Name Table. Esto significa que la CPU al contrario que con SNES y Genesis/Mega Drive no crea la Name Table sobre la RAM que luego es copiada la VRAM utilizando el DMA. En vez de ello la CPU de Neo-Geo tiene que acceder a la VRAM escribiendo el valor de lectura o escritura sobre los registros correspondientes del LSPC-A2 que es el nombre que SNK le da al sistema gráfico de la Neo-Geo.
Dado que Neo-Geo tiene una resolución de 320×224 pixeles y cada celda de la Name Table son 8×8 pixeles entonces tendríamos un formato de 40×28 celdas si hablaramos de un sistema convencional, no obstante la cosa no funciona de esta manera. En el caso de Neo-Geo cada Name Table no corresponde a la pantalla completa sino a un tira vertical que puede llegar hasta los 16 pixeles de tamaño en horizontal y que en resolución vertical puede llegar hasta los 512 pixeles con un mínimo de 16 pixeles de tamaño. La particularidad de Neo-Geo es que los patrones/sprites no pueden ser más anchos de 16 pixeles pero un patrón/sprite puede ocupar hasta 512 pixeles en vertical, esto se hace encadenando varios patrones/sprites de 16×16 pixeles cada uno de ellos.
Sobre la forma en la que el hardware de Neo-Geo dibuja la escena lo veremos más adelante, pero de momento ha de quedar claro que la Name Table de la capa de patrones/sprites no funciona de la misma manera que el resto de consolas. La otra Name Table es la correspondiente al Fix Layer, esta capa es la capa que tiene más prioridad de todas en mostrarse en pantalla y al contrario de las otras dos no tiene scroll y utiliza una Name Table de 40×28. Se utiliza para dibujar los textos, marcadores de vida, marcadores de puntuación… Pero sobre cada una de las capas ya entrare más adelante.
El otro tema a tratar es la RAM del sistema el 68K tiene asignados unos 64KB de memoria RAM y puede acceder hasta 1MB de memoria en los cartuchos que contienen el programa, se pueden asignar hasta un máximo de dos bancos de 1MB cada uno de ellos. Las ROMS en el cartucho que contienen el programa (no contienen datos gráficos ni de sonido) son llamadas P ROMS dentro de los cartuchos. le 68K puede direccionar hasta unos 24 bits, lo que se traducen en unos 16MB de memoria en total, no obstante SNK decidió que en su consola los programas ocupasen como mucho 2MB.
El siguiente paso es la VRAM, al contrario de Genesis/MegaDrive los patrones/sprites no se vuelcan en la VRAM sino que son leidos directamente del cartucho, pero sobre ello ya entraremos. El tamaño es de 64KB debido a que para acceder a dicha memoria es necesario escribir sobre un registro de 16 bits (uno para lectura, otro para escritura) del LSPC-A2 y eso hace un total de 64KB. De estos 64KB la VRAM tiene acceso a 32KB solamente, sobre la organización de los primeros 32KB ya entraré más adelante. El siguiente espacio de unos 16KB corresponde a la Color RAM, lo que da para una paleta de colores de 16.384 colores distintos. Sobre la forma de tratar el color en Neo-Geo entrare más adelante.
Lo que si que hace particularmente poderoso a este sistema y por encima de la competencia es el Line Buffer, se trata de dos bancos de 2KB cada uno. Cuando el sistema de video esta leyendo un banco para dibujar la linea actual el sistema esta dibujando sobre el otro, esto es una ventaja enorme respecto a otros sistemas de la época pero no se puede confundir con un doble búfer. La gracia es que el Line Buffer es independiente a la VRAM, esto significa que el contenido de la VRAM puede ser manipulado por la CPU al mismo tiempo que el LSPC-A2 dibuja la escena sobre el Line Buffer.
Por otro lado el LSPC-A2 tiene una unidad MMU que le permite direccionar hasta 24 bits de memoria para acceder al cartucho. Esto hace que los bandos de memoria S ROM (128KB máximo) y C ROM puedan tener un tamaño total de 16MB. Es más, en otros sistemas de 16 bits los patrones/sprites son cargados del cartucho hacía la VRAM y desde ahí leídos por el sistema gráfico. En Neo-Geo no, en Neo-Geo se podía leer directamente desde el cartucho, eso si, requería una interfaz de memoria en los cartuchos muy cara y compuesta por muchos chips de memoria en comparación con los otros sistemas de la época.
El LSPC-A2 podía acceder sin esperas a la VRAM y al Line Buffer, no obstante no se puede decir lo mismo de los cartuchos. Los patrones/sprites no podían ser de menos de 16 pixeles en horizontal por el hecho que este era el tiempo que necesitaba el sistema gráfico en leer cada uno de los pixeles patrones/sprites del cartucho y escribirlos sobre el Line Buffer eran unos 16 ciclos. Dado que el LSPC-A2 ejecuta unos 1536 ciclos de reloj por escaneo de linea esto son unos 96 sprites en total de 16×16. Pero la resolución de pantalla es de 320 pixeles, lo que debería dar para unos 20 sprites solamente. ¿No debería ser la resolución superior? He aquí la particularidad de Neo-Geo a la hora de dibujar la escena y que la diferencia del resto de consolas contemporaneas a la misma.
Para empezar no son 96 sprites sino 80 ya que los 1536 con el tiempo de pantalla activo+HBlank, mientras que el tiempo de pantalla activo son unos 1280 ciclos, esto da un total de 80 Sprites, lo cual son 20 sprites más de lo que correspondería por la resolución de pantalla si cada uno de ellos tiene un tamaño horizontal de 16 pixeles.
El LSPC-A2 dibuja las escenas en tres capas distintas que van de atrás hacia adelante.
Marcadores (Fix Layer).
En otros sistemas lo que se hace es un sistema de prioridad, de tal manera que si tiene que dibujar un patrón/sprite en pantalla se mira si tiene prioridad sobre otros. En el caso de Neo-Geo no es así y se tira de fuerza bruta. Esto significa que se dibuja una capa sobre el Line Buffer, luego se dibuja la que esta encima re-escribiendo en las zonas donde la capa superior tiene prioridad y dejando el valor en aquellas partes donde el color sea transparente, así hasta llegar a la última capa que es la Fix Layer. Fondo y Sprites son capas que soportan scroll, la capa de marcadores no lo soporta y como he explicado antes tiene su propia Name Table. Sí descontamos la Fix Layer esto significa que Neo-Geo tiene un total de 3 capas (dos de sprites y una de fondo) para utilizar.
En cuanto al color en pantalla, Neo-Geo soportaba hasta 256 paletas de colores de 15 colores+transparente cada una (4096 colores en pantalla). Las primeras 16 paletas son utilizadas por la Fix Layer, las siguientes hasta la penultima por la capa de sprites y la última de todos por la capa de fondo.
Dado que cada uno de los patrones/sprite no se vuelcan a la VRAM esta tienen un uso distinto, en primer lugar sabemos que el LSPC-A2 lee los patrones/sprites desde la ROM de los cartuchos y los escribe desde el Line Buffer. ¿Entonces para que se utiliza la VRAM del sistema? En otros sistema tenemos la llamada SAT/OAM que es la tabla de atributos de los sprites, en el caso de MegaDrive esta puede almacenar la información de hasta 80 patrones/sprites, en el caso de SNES unos 128. SNES tiene un total de 256 bytes disponibles para esa tarea… ¡Neo Geo puede utilizar los 32KB de VRAM primeros no solamente para almacenar las Name Tables de cada una de las capas sino tambien para almacenar las tablas de atributos de los patrones/sprites.
Los primeros 4KB son utilizados para la Name Table de la Fix Layer, dicha tabla no soporta scroll y tiene una organización convencional de 40×28 celdas de 8×8 cada una de ellas. En los siguientes 28KB se almacenan las Name Tables de los planos de scroll y sprite. En ellas se podrían almacenar hasta 441 tablas pero dado que se necesita un espacio para las Name Tables la cosa se reduce a las 380 tablas. esto significa que una escena en la Neo-Geo puede estar compuesta por hasta 380 patrones/sprites distintos. Tened en cuenta que si cada patrón/sprite tiene un tamaño de 16×16 pixeles esto son unos 280 sprites en pantalla distintos a una resolución de 320×224 pixeles. Lo que se traduce en que en Neo-Geo sus desarrolladores podían permitirse el lujo de hacer escenas donde no se repitiese ni un solo patrón/sprite. Cada una de las tablas tiene un tamaño de 8 bytes y no, he calculado mal. Lo que ocurre es que no solo almacena la sprite table de la animación actual del patrón/sprite sino este y los 7 siguientes cuadros de animación correspondientes al mismo patrón/sprite. Esto permite realizar además patrones/sprites independientemente animados del resto.
No obstante en cuanto a manipulación de patrones/sprite andaba muy limitada. En Mega Drive/Genesis el 68K al tener acceso a los patrones/sprites de la VRAM podía manipularlos y hacer efectos de rotación sobre los mismos. En SNES los chips de apoyo podían tambien hacer lo mismo por el hecho que los patrones/sprites se encontraban en la VRAM, pero en el caso de Neo-Geo se encuentran en el cartucho que era un area de solo lectura y por tanto no se podian manipular los datos y cuando se copiaban a memoria se copiaban en el Line Buffer a la que la CPU no podía acceder por lo que cosas como la rotación tenían que ser previamente simuladas a través del hecho que por cada Sprite Table en pantalla se incluian las 7 siguientes correspondientes a la animación. Lo máximo que podía hacer era escalar sprites para hacer efecto “Zoom” y esto era gracias al hecho que en las Sprite Table no solamente se incluía información sobre como se tenía que dibujar el sprite de forma normal sino también escalado.
Dada la dependencia del sistema de cartuchos en el caso de la Neo-Geo AES esto hizo que su contrapartida con CD-ROM necesitara de memoria RAM adicional para emular el funcionamiento de los mismos en la versión CD, por lo que SNK le puso un total de 7MB de memoria adicionales respecto a la Neo-Geo base, lo cual era una exageración para la época. Estos 7MB se dividían de la siguiente manera:
2MB para el 68K.
4MB para el subsistema gráfico.
1MB para el sonido.
El sistema trataba la RAM adicional como un cartucho sobre el que se volcaban los datos por lo que fuera del lector CD el sistema funcionaba exactamente igual.
Esto es todo, estoy realmente agotado, estas entradas agotan mucho mentalmente.
Adelio Manuel 10:28 PM el 20 febrero, 2015
Mucho más de lo que me esperaba, gracias. El bonus de NG CD ha sido un sorpresón, porque en wikipedias y tal se puede leer que la consola tiene 7 MegaBytes; pero ya es más difícil encontrar una fuente fiable de como está repartida.
Pff.. ¿Qué más puedo pedir? Yo creo que todas mis dudas técnicas de pubertad están solventadas, o al menos más iluminadas, ya que la pasada generación la estudié en la Carrera de los Bit y los Mhz y otras entradas de David Senabre, etc.
Adelio Manuel 2:36 PM el 21 febrero, 2015
Por cierto, la resolución más extendida en los títulos de Neo Geo es 304×224, por mucho que conste 320 en la horizontal en todas las “wikis”.
Y la V-Ram es de 68 Kb, no 64 😉
Urian 2:44 PM el 21 febrero, 2015
Aunque los 4KB son dos pozos de 2KB, ya que uno siempre es leido por el conversor de señal para generar la imagen en el televisor. Se encuentran de forma separada a la VRAM, no estan mapeados para la CPU y su ancho de banda es más rápido.
Adelio Manuel 3:34 PM el 21 febrero, 2015
LOL, ¿chaché vram xD?
Urian 3:36 PM el 21 febrero, 2015
más bien un Line Buffer donde se almacena la siguiente linea de sprites a dibujar.
Adelio Manuel 3:35 PM el 21 febrero, 2015
← El anunciado retiró de Aonuma produce pánico en los N64 Kids
Yo no le tengo manía a Aonuma, le tengo manía al trabajo de Aonuma →

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución