Gráficos en consolas antiguas (XI): SNES

Es el turno de la SFC/Super Nintendo, os recomiendo antes de leer esta entrada que os miréis las anteriores de la serie,en especial la de Famicom/NES y Genesis/MegaDrive.

imgnintendo-snes2

CPU+RAM+Cartucho.

Como siempre dejare el sonido aparte y empezare con la CPU, la cual fue una enorme polémica en su día dado que el 65816 es un 6502 de 16 bits, lo cual fue altamente criticado por los desarrolladores occidentales que habían desarrollado para máquinas de 16 bits ya que Mega Drive/Genesis, Amiga y Atari ST llevaban un 68000 que por su enorme cantidad de registros e instrucciones (ya que era un CISC) lo hacían fácil de programar. El 65816 en cambió tenía un set de instrucciones limitado (tenía que realizar ciertas instrucciones concatenando otras más existentes) y se trataba de un procesador de pila. No obstante Nintendo escogió este procesador porque inicialmente querían que la consola fuese retro-compatible con la Famicom/NES por un lado y por el otro para facilitar la transición a los 16 bits para los desarrolladores de su 8 bits.

En primer lugar se ha de tener en cuenta que la velocidad de reloj de dicha CPU es variable en tres velocidades distintas: 1.79 Mhz, 2.68 Mhz, 3.58 Mhz. Estas velocidades dependen de la velocidad de los chips de memoria ROM dentro de los cartuchos, esto significaba que si un juego utilizaba una memoria a 1.79 Mhz entonces la CPU de SNES iba a esa velocidad. Pero esto no es el único defecto que tenía, el otro defecto era el ancho de banda de la memoria. Comparativamente el 68000 tardaba 4 ciclos de reloj en hacer una operación de memoria, este tardaba solamente un ciclo de reloj pero con la desventaja de ir a una velocidad de reloj mucho menor y transmitir y/o recibir 8 bits en vez de 16 bits.

En cuanto a la comunicación de la CPU con la memoria y otros componentes, la consola utilizaba dos buses distintos, el primer bus tenía asociado un bus de direcciones de 24 bits por lo que el sistema podía llegar a soportar hasta 2^24 bytes que se traduce en 16MB. Este bus se comunicaba con la RAM principal, la cual era de 128KB y con el cartucho, eso si, con un ancho de banda de 8 bits. El segundo bus tenía un direccionamiento de 8 bits y transmitía también 8 bits de memoria y servía para comunicar la CPU con las PPU y el procesador de sonido.

El soporte de un direccionamiento de 24 bits en la CPU elimino los chips MMU/MMC que se había estado utilizando en Famicom/NES, pero Nintendo no dejo de utilizar chips de apoyo pero esta vez con el objetivo de aumentar las capacidades de procesamiento de la CPU, esto que fue criticado en su día como una demostración de la falta de potencia de la CPU de SNES es en realidad una de las cosas que más ventaja le dio, por eso es dificil juzgar a la consola por su CPU.

De ahí a que la parte de la CPU sea un “depende”,  por ejemplo Genesis/MegaDrive puede realizar rotación de patrones/sprites via CPU a una velocidad aceptable. SFC/SNES no puede hacerlo  a la misma velocidad con su CPU por el hecho que esta carece de instrucción de multiplicación… ¿entonces los juegos con rotación de sprites? Utilizaban un chip de apoyo en el cartucho, un chip llamado DSP-1 que se encargaba de rotar los patrones/sprites a una enorme velocidad. También vimos juegos con capacidad poligonal como el StarFox, el hecho de dibujar poligonos en pantalla por muy simples que resulten significa tener que realizar cálculos muy complejos que el 5A22 no podía realizar y mucho menos a la velocidad del 68000 pero fue gracias al SuperFX, otro chip de apoyo que puedo realizarlos. El otro chip es el SA-1, este es un 5A22 pero funcionando a 10.5 Mhz, por lo que era una CPU sustituta y se utilizo en diversos juegos.

yoshis_island3

 

Juegos como Yoshi’s Island utilizaban chips de apoyo, en este caso la potencia del SuperFX2 para realizar operaciones de rotación, escalado y desplazamiento de patrones/sprites a gran velocidad. El SuperFX es junto a otro chip, el Nintendo SA-1 el que provoca que sea dificil juzgar a SNES por su CPU, el motivo de ello es que se pueden considerar expansiones de la consola y dado que en esa época la CPU era un elemento muy importante al mover los gráficos entonces lo podemos traducir en… “Depende del juego. Depende la ROM que utilice el juego, depende de los chips de apoyo… es todo tan relativo que al contrario de otras entradas no me pondre a comentar tampoco el rendimiento de la CPU y su funcionamiento en cuanto a gráficos a la hora de moverlos y generar la Name Table. Es el mismo que en el resto, pero comparativamente respecto a NES/Famicom la cosa ha cambiado y se ha adoptado un mecanismo DMA.

Su funcionamiento es el siguiente:

  • Puede transmitir del cartucho a la RAM principal, del cartucho a la VRAM, de la RAM principal a la VRAM. En los dos primeros casos en una sola dirección (lectura), en el último caso en ambas direcciones.
  • No se encuentra dentro de las PPU como ocurre en el procesador de Genesis/Mega Drive, por lo que su velocidad de transferencia es siempre la misma. 3.58MB/seg, independientemente de la velocidad de otros componentes.
  • Tiene 8 canales distintos de un bus cada uno, dichos canales se pueden utilizar para transmitir datos de la forma que quieran los desarrolladores.
  • Al contrario del de Genesis/Mega Drive no puede enviar datos durante el periodo HBlank sino solo durante el periodo VBlank.

La adopción de un mecanismo DMA significa que la CPU ya no hace accesos continuos a la PPU para transmitir datos sobre la VRAM sino que mueve los datos de la RAM a la VRAM a través del mecanismo DMA.

El segundo mecanismo es el HDMA:

  • No accede a ningún tipo de memoria solo a los registros de las PPU durante el periodo HBlank.
  • Se utiliza para para generar efectos visuales a mitad de la generación de un fotograma.

Una vez explicada la CPU y la memoria principal toca mirar el procesador gráfico.

SPPU1+SPPU2+VRAM.

En Famicom/NES la PPU tenía unos 2KB de memoria externa asignada para almacenar las Name Tables llamada CIRAM, unos 256 bytes para el OAM/SAT (Sprite Attribute Table) dentro de la PPU, la paleta de colores también se almacenaba dentro de la PPU y para terminar los patrones/sprites a utilizar se almacenaban en la memoria del cartucho. En SNES se hicieron los siguientes cambios:

  • La memoria para gráficos en el cartucho dejo de existir y paso a estar fusionada con la CIRAM para formar la VRAM. Esto aumento la memoria externa de los 2KB a los 64KB. Por otro lado es entendible dada la velocidad variable de las ROMS de los cartuchos y el hecho que esto pudiese afectar al rendimiento gráfico.
  • LA OAM ha sido aumentada a los 544 bytes, los primeros 512 bytes contienen la tabla para los 128 sprites distintos en pantalla, los ultimos 32 bytes contienen datos adicionales de cada uno de ellos. Esta es almacenada en la PPU1.
  • La paleta de colores ha pasado a ser de 15 bits (32.768 colores), esta se almacena en la PPU2.

Tanto la PPU1 como la PPU2 se encuentran en el mismo encapsulado, funcionan a 21 Mhz de velocidad de reloj, esto sitúa la velocidad de reloj del sistema gráfico de SNES a 4 veces más veloz que la Genesis/Mega Drive en modo H32 y tres veces más veloz que en el modo H40. Esta potencia es utilizada para poder mostrar diferentes modos gráficos:

  • Modo 0: 4 planos/scroll con 4 colores cada uno de ellos.
  • Modo 1: 2 Planos/scroll con 16 colores cada uno, un plano con cuatro colores.
  • Modo 2: 2 planos/scroll con 16 colores cada uno.
  • Modo 3: Un fondo de 256 colores, u fondo de 16 colores.
  • Modo 4: Un fondo de 4 colores, un fondo de 256 colores.
  • Modo 5: Un fondo de 16 colores y un fondo de cuatro colores.
  • Modo 6: Un fondo de 16 colores.
  • Modo 7: Un fondo de 256 colores, el cual se dibuja en la parte inferior de la pantalla. Dejando los Patrones/Sprites en la parte superior de la pantalla.

En cuanto al número de patrones/sprites en pantalla como he mencionado antes es de 128, por escaneo de linea es de 32 en contra de los 16 del modo H32 de Genesis/Mega Drive y los 20 del modo H40 de la misma consola. Cada uno de ellos tiene asignada una paleta de 16 colores.

La resolución de pantalla estandar es de 256×224, dada la velocidad de reloj de la SPPU1+SPPU2 esto significa que puede dedicarle unos 4 ciclos de reloj por pixel, esto permite aplicar ciertos efectos gráficos y en cuanto a su tasa de relleno, tarda unos cuatro ciclos en escribir en memoria en comparación con los dos ciclos de Genesis/Mega Drive pero dada su mayor velocidad de reloj su tasa de relleno es superior. Ahora bien, es posible aumentar la resolución vertical a 240 pixeles, esto tiene como consecuencia que la CPU tiene menos tiempo para mover los objetos en pantalla y generar las Name Tables por lo que se utiliza solamente en juegos que utilizan un procesador de apoyo. También es posible doblar la resolucion horizontal a 512, eso si reduciendo a la mitad el número de ciclos de las SPPU por pixel y por tanto la calidad final de la imagen

La metodología a la hora de dibujar la escena en pantalla es la misma que la de los chips basados e inspirados en el TMS9918A que han sido explicados en esta serie anteriormente. La única diferencia es que en este caso tenemos dos chips en vez de uno y las operaciones con el color las hace la SPPU2 y el resto de ellas el SPPU1. Ambas comparten la misma cantidad de memoria y el hecho que la SPPU2 tenga un canal de memoria externa de 8 bits sin utilizar hace pensar que en el diseño original de la consola la SPPU2 tenía que su propia memoria externa asignada, la cual se recorto a última hora por motivos de coste.

Anuncios