Inicializar pantalla de SNES de modo 512x448 en ensamblador.

¡Saludos!

Últimamente, leyendo acerca de los modos gráficos de la Super Nintendo y analizando unas rutinillas en lenguaje ensamblador para SNES de lectura e impresión de imágenes en pantalla (estructuradas en dos tipos de bloques de datos, uno de mapa de tiles, y otro con el contenido de esos tiles [o teselas, me gusta evitar el uso de anglicismos innecesarios siempre que sea posible] propiamente dicho) ha llegado a mi conocimiento la existencia de un modo gráfico que, por poco usual y limitado, me había pasado desapercibido hasta ahora, al ser usado en relativamente pocos juegos: es el modo a 512x448 (que en PAL sería de 512x480, dato curioso para mí, siendo un patriota del PAL, como me considero). Este modo está limitado a 16 colores para el fondo, 4 colores para una segunda capa superpuesta opcional, y sólo dos capas (incluyendo dicho fondo).

La resolución habitual sería de 256x224, ó 256x240 en mi bienamado modo PAL. Esta resolución permite varios modos gráficos, unos con fondo de 256 colores y una o más, o ninguna capa superpuesta, de 16 colores cada una, y similares, y otros con fondo de 16 colores y una o más, o ninguna capa superpuesta, de 4 a 16 colores cada una. Son un total de 8 modos gráficos éstos, si la memoria no me falla, del 0 al 7. El famoso modo 7 sería el que permite la tan utilizada y característica "escalaridad de sprites", que permite la realización fácil de zoom's, jugar con el agrandado y disminuido de sprites sin necesidad de tener que dibujar el mismo sprite en varios tamaños, como por contra solía ocurrir con la mayoría de juegos de Mega Drive de tipo conducción o desplazamiento hacia un punto de fuga, como Super Monaco GP, Super Hang On, o Super Thunderblade (no así de Mega CD, que también permitía la escalaridad de sprites, muy utilizada en juegos como Batman Returns y sus espectaculares escenas de conducción o el port de Super Hang On y otras recreativas clásicas de SEGA a este periférico), y colocar superficies en perspectiva, a modo de plano inclinado, con sus distintos píxeles moviéndose y agrandándose a partir de un punto de fuga, llegando a generar así una bonita y extraordinaria sensación de pseudo-3D o falso 3D plano, sin tercera dimensión real, sin objetos con altura (pues aparecerían pegados sobre ese mismo plano, o directamente serían sprites independientes colocados encima, rollo los enemigos de Doom y Duke Nukem 3D).

Y aquí viene mi pregunta:
¿Alguien conoce la sucesión de instrucciones de ensamblador de SNES necesaria para cambiar la pantalla de modo 256x224/240 a modo 512x448/480? Casi todas las operaciones de este tipo, que requieren activar procesos, se realizan en SNES escribiendo información en determinados registros reservados de memoria RAM o del microprocesador (CPU), del tipo $2100, $2105, etc. Las instrucciones para escribir en uno de estos registros serían STx, por ejemplo STA, si lo que se quiere escribir está en el registro A del procesador (llamado Acumulador), STX si lo que se quiere escribir está en el registro X, STY, etc., ejemplo: LDA #$80, para cargar el valor ochenta en el Acumulador, STA $2100, para escribir lo que haya en el Acumulador, 80, en el registro reservado 2100. Pero desconozco la sucesión de instrucciones exactas para esta tarea dada y cómo actúan y se comportan, y su sintaxis y parámetros. Y tratar de dilucidarlo buceando entre un montón de información dispersa en la red de redes se me hace un mundo, no me termina de funcionar nada de lo que pruebo, compilación tras compilación e inyección desordenada tras inyección dentro de cualquier ROM, y no doy pie con bola.

Para los interesados, quienes desconocieran hasta ahora los pormenores de este último modo, recordad que éste ¡no permite dibujar más de 304 píxeles por línea horizontal de barrido!, lo que sumado a la limitación de colores a 16, ó 16+4, y su lentitud, nos da una idea de por qué apenas sí fue utilizado, si no es en juegos con poco movimiento o secciones de juegos de tipo interfaz gráfica de menúes, como podría ser un juego de gestión.

Por cierto, si alguien conoce ejemplos de juegos que utilizasen la resolución 512x448, de este tipo, agradecería que tuviera a bien compartirlo en este hilo.

¡Un saludo, y gracias por adelantado!
https://wiki.superfamicom.org/working-w ... -tile-maps

Busca $2105, que es la dirección de memoria dónde indicas el modo a usar.
dpqsr escribió:La resolución habitual sería de 256x224, ó 256x240 en mi bienamado modo PAL.


Creo que el modo 256x240 es solo en la NES PAL.

En SNES como mucho llegaba a 256x239 tanto en NTSC como en PAL.

dpqsr escribió:El famoso modo 7 sería el que permite la tan utilizada y característica "escalaridad de sprites", que permite la realización fácil de zoom's, jugar con el agrandado y disminuido de sprites sin necesidad de tener que dibujar el mismo sprite en varios tamaños


Ehhhhh.... no. El Modo 7 hasta donde yo se no escalaba sprites, solo hacia zoom y deformación de perspectiva en fondos de pantalla.

Igualmente, el Mega CD no tenía ningún Modo 7, pero si es verdad que se usó su CPU para facilitar la imitación de este modo por software, que si bien cumplía su objetivo, no alcanzaba la tasa de 60 frames estables como en SNES, pasando a 30 fps.

No obstante, en ambas consolas el "escalado" de sprites no existía como tal, si no más bien un dibujado tile a tile en la propia ROM, como ocurría en la mayoría de consolas que intentaban similar este efecto, y ya.
Si mal no recuerdo el megacd solo alcanzaba 30fps por una limitación con la comunicación entre las dos máquinas, pero creo que hardware si tiene para hacer estas cosas, no específicamente, pero que no es la cpu a pelo. Igual esto los nuevos flashcarts podrían corregirlo.

El modo a alta resolución pone dos planos a 512x224/48 y 512x448/78, uno con 16 colores por tile, y otro con 4 colores por tile. Se siguen manteniendo las 16 subpaletas. Hubiera sido una mejora enorme en definición y área jugable.


Imagen
Diskover escribió:
dpqsr escribió:No obstante, en ambas consolas el "escalado" de sprites no existía como tal, si no más bien un dibujado tile a tile en la propia ROM, como ocurría en la mayoría de consolas que intentaban similar este efecto, y ya.


¡Entiendo! Desconocía tal dato.
Muy interesante.

Más que "escalaridad de sprite" entonces, se debe decir "escalaridad de tiles" o "de fondos", o incluso "de pantalla", a palo seco.
dpqsr escribió:
Diskover escribió:No obstante, en ambas consolas el "escalado" de sprites no existía como tal, si no más bien un dibujado tile a tile en la propia ROM, como ocurría en la mayoría de consolas que intentaban similar este efecto, y ya.


¡Entiendo! Desconocía tal dato.
Muy interesante.

Más que "escalaridad de sprite" entonces, se debe decir "escalaridad de tiles" o "de fondos", o incluso "de pantalla", a palo seco.


No, no; actualización de tiles o sprites (porque un sprite puede tener el tamaño de un tile ;) ) al vuelo en la memoria de vídeo estaría mejor.
Bueno, pero al actualizarlos los escala en pantalla.
6 respuestas