Le toca el turno a la consola de SNK

#1 Las entrañas de Neo-Geo

La CPU de Neo-Geo es la CPU estándar de los sistemas de 16 bits, el 68K, en este caso un clon del del mismo funcionando a los 12 Mhz de velocidad de reloj. El 68K tiene asignados unos 64KB de memoria RAM, 128KB de ROM en la placa de la propia Neo-Geo y pude acceder hasta 2MB de ROM en el cartucho, pudiendo 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, el 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 y que el 68K solo tuviese acceso directo a P ROM y a la Color RAM.

MS3_Bf.jpg

Esta configuración de los cartuchos de Neo-Geo recuerda a la de los cartuchos de la Famicom/NES donde el programa y los patrones/sprites estaban separados en dos pozos de memoria diferenciados. Este tipo de diferenciación por motivos de coste de los cartuchos no era habitual en las consolas domésticas y solo en los arcades pero Neo-Geo era una máquina arcade llevada al ambito doméstico por lo que esas reglas no se aplicaban en absoluto. ¿El resultado? Juegos extremadamente caros que resultaban un lujo para sus compradores.

00173.jpg

Son precios de España de principios de los 90, pero para que os hagáis una idea el polémico por caro Street Fighter II de SNES fue un escandalo por salir a 12.990 ptas de la época, los juegos de Genesis/Mega Drive solían por las 9.990 ptas por lo general, los de NES nuevos por 7.990 más o menos y los de Game Boy 5.990 ptas. Era en esa época donde el CD-ROM sonaba a la vuelta de la esquina por lo caro que resultaba llegar a ciertos volumenes de memoria en concreto y no solo en consolas sino también en PC donde la capacidad limitada de los disquettes se empezaba a ver.

Por lo que nos encontramos con que los cartuchos de la consola tienen varios tipos de ROM distintos.

  • C-ROM: Almacenan los patrones/sprites a utilizar en los juegos, se tratan de ROMS con un bus de 16 bits entre ambas organizadas por pares donde uno contiene la mitad de los patrones/sprites y el otro la otra mitad. Suelen ser de 8MB cada uno y por tanto 16MB en total.
  • M1 ROM: La Neo-Geo utiliza un Z80 para controlar el audio, el programa que tiene que ejecutar el Z80 se encuentra en estas ROM de 64KB, el cual no debe confundirse con el audio sino que es el programa de control del audio lo que tenemos en las M1.
  • S ROM: En esta memoria se guardan los gráficos utilizados para la generación de la Fix Layer, algo que veremos más adelante.
  • V ROM: Son las llamadas Voice ROM, contienen los samples en ADCPM en dos ROMS distintos para generar el audio del juego. Cada una de las ROMS es de unos 4MB, haciendo un total de 8MB.

Una cosa por la cual Neo-Geo era famosa era por lo que se leía al encender la consola:

Normalmente en los arcades no se asignaba un chip de memoria para los gráficos o el sonido de todo el juego sino que a través de un mecanismo de Bank Switching se iban cambiando los gráficos y el sonido de cada escenario. Esta metodologia en un sistema doméstico limitado por el precio pues como que era un suicidio en costes pero a SNK le iba bien tal y como tenía planteada la Neo-Geo. Plantearse una consola con 330 Megabits en ROMS de cartucho a principios de los 90 era desde el punto de vista doméstico una locura.

#2 Gráficos en la Neo-Geo

 

Los gráficos de la Neo-Geo son generados por su generador de patrones/sprites, el LPSC.

El LPSC es el encargado de generar los gráfico en pantalla, se trata de un generador de patrones/sprites como los que hemos ido viendo en las última entradas pero su funcionamiento difiere en parte de lo visto hasta este momento en esta serie de entradas, principalmente motivado por el hecho de que estamos hablando de literalmente una placa arcade travestida como sistema doméstico.

#2.1 Patrones/Sprites

El LPSC puede colocar hasta unos 380 patrones/sprites a 16×16 pixeles cada uno y unos 4 bits de color. La posición en pantalla y sus carácteristicas se encuentran en la VRAM en una tabla llamada SCB que se subdivide en SCB1 a SCB4, cada sub-división tiene 2 o 4 bytes de longitud y se almacena en lugares diferenciados de la VRAM.

Vrammap

#2.1.1 SCB1

Byte 0+Byte 1: Dirección de memoria donde se encuentra el patron/sprite dentro del banco actual.

Byte 2 (bit 0): El patrón/sprite se dibuja horizontalmente a la inversa.

Byte 2 (bit 1): El patrón/sprite se dibuja verticalmente a la inversa.

Byte 2 (bits 2-3): Nos sirve para marcar que hasta 8 siguientes patrones/sprites son patrones/sprites de animación sucesivos al actual.

Byte 2(bits 4-7): Nos sirve para marcar el banco de patrones/sprites. Esto en combinación con el Byte 0+1 nos dan unos 2^20 patrones/sprites diferentes para un juego, que contando que cada uno es de unos 32 bytes esto nos da unos 32MB de patrones/sprites posibles y por tanto hasta 4 bancos C-ROM posibles.

Byte 3: Este Byte es la paleta, tenemos unas 256 paletas distintas de 16 valores cada una (15 colores+transparente) por lo que Neo-Geo puede poner en pantalla unos 3840 colores distintos. Neo-Geo tiene unos 16KB de Color RAM donde se almacenan las paletas. Dicha memoria no forma parte de la VRAM y es accesible tanto por el LPSC como el 68K. Tenemos dos bancos con un total de 256 paletas de 15 colores+transparente (16 valores), lo que nos dan unos 3840 colores distintos por escena como he comentado antes.

 

El LPSC al contrario de otros sistemas puede leer directamente los patrones/sprites directamente de la ROM de los cartuchos y operar desde ellos, lo hace a una velocidad de 8 Mhz porque esa es la velocidad de las ROMs de Neo-Geo y de ahi a colocarlo en a Lower VRAM por el hecho que es la parte de la tabla cuya información de referencia no se encuentra en la VRAM. De las cuatro subsecciones del SCB solo el SCB1 esta en la Lower VRAM.

Esto es posible gracias a que el LPSC tiene una unidad MMU con un direcccionamiento de 20 bits, esto le da acceso a un total de 2^20 patrones/sprites distintos donde el tamaño medio de cada uno de ellos es de 16×16 pixeles con 4 bits de color de media. Esto son 128 bytes por patrón/sprite y si hacéis cálculos veréis que son unos 128MB en patrones/sprites pero Neo-Geo no puede direccionar tanta memoria realmente, aunque con un sistema multibanco es posible hacerlo.

Neo-Geo en los últimos años de la vida de la consola desarrollo cartuchos que superaban los famosos 330 Megabits, superado los 500 Megabits y acercandose al Gigabit en lo que a memoria disponible en los mismos se refiere. Tened en cuenta que la gran ventaja de Neo-Geo respecto a las consolas de la competencia era esa. Pero para ello era necesario el uso de ROMS muy caras o de varios chips para alcanzar los anchos de banda necesarios de tal manera que las C ROMS no sean un cuello de botella para el LPSC

#2.1.2 SCB2

El SCB2 junto al SCB3 y el SCB4 se encuentra en la Upper RAM por lo que la velocidad de acceso a esa parte de la VRAM es de 24 Mhz.

El SCB2 almacena los valores para aumento y reducción de los patrones/sprites, Neo-Geo puede reducir el tamaño de los patrones/sprites, no se trata de un re-escalado manteniendo las propiedades originales dado que en el caso que nos ocupa se eliminan lineas tanto en horizontal como en vertical del patrón/sprite.

Byte 0: Nos sirve para escalar el valor vertical, tenemos un byte entero por lo que eso significa dividir el número de lineas por 256. La cifra es sumamente alta por la existencia de patrones/sprites de 512 pixeles de alto en la memoria del cartucho.Por lo que verticalmente podemos escalar un patrón/sprite hasta el tamaño de 2 pixeles.

Byte 1 (Bits 0-3): Nos sirve para escalar el valor horizontal, aqui tenemos unos 16 valores posibles por lo podemos escalar hasta el tamaño de 1 pixel en horizontal el patrón/sprite.

Byte 1 (Bits 4-7): No se utilizan

Los efectos de reducción de escala (vertical) se pueden ver perfectamente representados en el siguiente video, fijaos cuando son derrotados los enemigos en algunos juegos.

#2.1.3 SCB3

El SCB3 se utiliza para marcar la posición vertical del patrón/sprite.

Byte 0 (bits 0-4): Nos sirve para marcar el tamaño vertical del patrón/sprite. Los patrones patrones/sprites de hasta 16×512 pixeles se realizan a partir de uno de 16×16 base utilizando como referencia este valor en el SCB3.

Byte 0 (bit 6):Esta bit nos sirve para marcar si el patrón/Sprite forma parte del anterior en la lista.

Byte 0 (bit 7) y Byte 1: Posicion vertical del patrón/sprite en pantalla,

#2.1.4 SCB4

El SCB4 se utiliza para marcar la posición horizontal del patrón/sprite.

Byte 0 (bits 0-6): No se utilizan

Byte 0 (bit7)+Byte 1: Posición horizontal del patrón/sprite en pantalla,

En otras consolas tenemos una enorme Name Table para los fondos del nivel que son de varias pantallas, en el caso de la Neo-Geo lo que tenemos son unos 512×512 pixeles de referencia que es por donde distribuimos los 512 patrones/sprites.

#2.2 Fondos y Line Buffer

El LPSC al igual que otros generadores de patrones/sprites tiene un registro que es el color que se escribe en una zona de pantalla cuando no se le envia nada, es decir, el valor por defecto. En teoría solo puede dibujar una capa de patrones/sprites. ¿Como lo hace para representar más capas de las que puede dibujar en teoria.

El LPSC puede dibujar por linea de escaneo hasta unos 1536 pixeles en total, pero la cantidad de pixeles en pantalla no es esa cifra. ¿Que es lo que ocurre? Bueno, digamos que Neo-Geo no tienen ningún bit de prioridad si os habéis dado cuenta por lo que el LPSC va a dibujar en pantalla todos los pixeles que le manden. Esto permite que a partir de 1536 pixeles en horizontal obtener unas 4 capas de 384 pixeles cada una, la primera de ellas para patrones/sprites y la otra para fondos, aunque el orden puede ser cualquiera.  Ahora bien,la otra parte de la trampa esta en la existencia del Line Buffer.

 

En el Line Buffer se almacenan todos los pixeles correspondientes a la linea, incluyendo aquellos que no son mostrados en pantalla. El Line Buffer se almacena en dos memorias que trabajan en conjunto y en donde una se almacenan los 192 pixeles pares y en la otra los 192 pixeles impares.  Cada pixel del Line Buffer tiene unos 12 bits (4 bits para el valor en la paleta actual y 8 bits para escoger paleta) que son los referenciados en el SCB1. Si no hubiese Line Buffer no se podrían generar los siguientes fondos.

Kizunadocksbg.gif

img006

#2.3 Fix Layer

Para esta capa solo se pueden utilizar las 16 primeras paletas por lo que tenemos un total solamente de 256 por patrón/sprite, los cuales se almacenen todo en la ROM pero la forma en la que estos son organizados en pantalla es escrito por la CPU en la VRAM (via LPSC) en forma de Name Table. Dicha Name Table es de 2560 bytes y contiene cada 16 bits la siguiente información:

  • Los 12 primeros bits es el indice en el que se encuentra el patrón/sprite a utilizar
  • Los otros 4 bits es la paleta a elegir Para esta capa solo se pueden utilizar las 16 primeras paletas por lo que tenemos un total solamente de 256 colores distintos para la Capa Fija.

A la hora de dibujar la escena la Fix Layer va a ser la que se generará una vez generado el Line Buffer, el LPSC envia a la señal de video la información en el Line Buffer por un lado y por el otro la información de la Fix Layer dandole preferencia a esta última a la hora de representar sus pixeles en pantalla.

Con esto termino la parte en la que describo como Neo-Geo genera los gráficos.

 

#3 Neo-Geo CD

La Neo-Geo CD es una versión con lector CD-ROM de la Neo-Geo original, tecnicamente el hardware es cuasi igual pero la sustitución del slot de cartuchos por un lector de CDs obliga a cambiar por completo la estructura de memoria RAM del sistema dado que el CD no es lo suficientemene rápido como operar desde el mismo.

284606-20-mejores-juegos-neo-geo-cd.jpg

La consola tiene un total de 7MB de memoria adicionales respecto a la Neo-Geo original, desglosados de la siguiente manera:

  • 1MB para samples de audio.
  • 4MB para patrones/sprites
  • 2MB para hacer las funciones de la P-ROM

Gracias al lector de CD-ROMS el coste de los juegos se abarataba enormemente en comparación con la Neo-Geo original pero salio en los tiempos en que el lector CD-ROM y la RAM eran en teoría excesivamente caras.  Aunque su lanzamiento fue a finales de 1994 en Japón, momento en que tanto Sony como Sega lanzaron sus consolas de 32 bits, mucho más complejas que la Neo-Geo CD y la consola se pudo beneficiar en la bajada de costes de la RAM y del lector de CDs no fue del agrado de la gente que ya veia a Neo-Geo desfasada. Con 4MB de VRAM lo más normal hubiese sido dejar de lado ya un generador de patrones/sprites con un búfer de imagen completo. Pero era más que suficiente para ir volcando entre tiempo de cara y tiempo de carga los patrones/sprites de la siguiente escena. ¿La contrapartida? Los enormes tiempos de carga entre escenario y escenario.

En todo caso en comparación con otros sistemas de la época la Neo-Geo CD era un sistema sumamente desfasado, incluso más que la ultra-criticada Jaguar.  No solo eso, sino que Neo-Geo se diseño en su dia para hacer uso de ultra-caros pero ultra-rapidos cartuchos y eso requería colocar RAM en grandes cantidades en el nuevo sistema con tal de adoptar su funcionamiento. Si SNK hubiese reemplazado el LPSC por un procesador como un TMS34020 por ejemplo, hubiese alcanzado la misma calidad visual por una porción del coste, aunque eso si, hubiese perdido la compatibilidad hacía atrás. Y es que al fin y al cabo Neo-Geo CD no era una consola nueva sino una especie de Multimega o Turbo Duo, ya que SNK no vendió el lector de CD-ROM aparte y lo lanzo todo integrado, pero demasiado tarde.

PD: Voy a dejar esta serie de entradas una temporada larga, lo digo porque estoy desactualizado por completo de la actualidad.