Sprites y la OAM (Object Attribute Memory)

La OAM (Object Attribute Memory) es una memoria de 544 bytes dentro del chip gráfico de la SNES, que almacena las posiciones y propiedades de hasta 128 sprites. Se divide en dos tablas porque la información que un sprite necesita requiere 34 bits, pero la Tabla Principal solo le puede dar 32 bits (4 bytes). Los 2 bits sobrantes de cada sprite se guardan amontonados en la Tabla Secundaria.


La Tabla Principal (512 bytes)

Esta tabla tiene 128 bloques, uno por cada sprite. Cada bloque usa 4 bytes.

Ejemplo de memoria cruda (4 bloques / 4 sprites):
58 B7 40 30 | 68 B7 42 30 | 80 B7 44 30 | 90 B7 46 30

Tomemos el primer bloque, que corresponde al Sprite 0: 58 B7 40 30

El hardware lee esto byte por byte:

  • Byte 0 (Coordenada X) – 58 (Hex): En decimal es 88. El PPU sabe que debe empezar a dibujar este sprite 88 píxeles a la derecha del borde de la pantalla.
  • Byte 1 (Coordenada Y) – B7 (Hex): En decimal es 183. El sprite se dibuja en la línea horizontal 183 (hacia abajo).
  • Byte 2 (Tile) – 40 (Hex): En decimal es 64. Esto le dice al PPU: “Busca en la memoria de video (VRAM) el cuadrito gráfico número 64, porque ese es el dibujo que lleva este sprite”.
  • Byte 3 (Atributos) – 30 (Hex): En binario es 0011 0000. Cada bit funciona como un interruptor de encendido/apagado para características visuales:
    • Bit 7 (V-Flip) = 0: No voltear verticalmente.
    • Bit 6 (H-Flip) = 0: No voltear horizontalmente.
    • Bits 5 y 4 (Prioridad) = 11: Dibujarlo por delante de casi todo el escenario (alta prioridad).
    • Bits 3, 2 y 1 (Paleta) = 000: Usar la primera paleta de colores de los sprites.
    • Bit 0 (Nombre) = 0: Usar la primera página de gráficos.

La Tabla Secundaria (32 bytes)

Aquí es donde están los 2 bits extra que le faltaban a cada sprite. Como 2 bits es muy poco para ocupar un byte completo, el PPU empaca la información de 4 sprites diferentes dentro de un solo byte.

Tomemos un byte de esta tabla secundaria para ver cómo funciona: 5A (Hex).
En binario, 5A es 0101 1010.

Ese byte se divide en cuatro pares de bits (2 bits por sprite):

  • 01 (Para el Sprite 3)
  • 01 (Para el Sprite 2)
  • 10 (Para el Sprite 1)
  • 10 (Para el Sprite 0)

Para el Sprite 0 el PPU lee su par de bits, que es 10

  • El primer bit (1) es el bit de Tamaño: La SNES te deja elegir globalmente dos tamaños para los sprites, por ejemplo, pequeños de 8×8 y grandes de 16×16. Este bit le dice al PPU: “Usa el tamaño grande (16×16)”. Si fuera 0, usaría el pequeño (8×8).
  • El segundo bit (0) es el Noveno bit de X: Esto resuelve un problema físico. La pantalla de la SNES mide 256 píxeles de ancho. El Byte 0 de la Tabla Principal (que era 58 Hex, 88 en decimal) solo puede contar hasta 255.
    • Si queremos que un enemigo entre a la pantalla suavemente por la izquierda, su coordenada X necesita ser negativa (ej. -10).
    • Si queremos que salga por la derecha suavemente, su X tiene que ser mayor a 255 (ej. 260).
    • El Byte 0 no puede hacer números negativos ni mayores a 255 por sí solo.
    • Este “Noveno bit” actúa como un multiplicador o extensor de rango. Si está en 0, la X es normal (de 0 a 255). Si se pone en 1, el rango de la X cambia, permitiendo valores desde -256 hasta 511. Como nuestro Sprite 0 tiene un 0 aquí, su posición real sigue siendo 88. Si este bit hubiera sido 1, el hardware habría calculado la posición como 88 - 256 = -168, dibujándolo fuera de la pantalla.

Leave a Reply

Your email address will not be published. Required fields are marked *

Are you human? Please solve:Captcha