Cuatro maneras de pintar 128 píxeles con un chip que no tiene memoria de vídeo.
El problema
La sala del original mide 256 × 160 píxeles. En la 2600 equivale a 128 × 160, pero el TIA no tiene memoria de vídeo: dibuja con dos jugadores de 8 píxeles (hasta tres copias cada uno), dos misiles, la bola y un playfield de píxeles de 4 de ancho. El truco clásico de los 48 píxeles (los dos jugadores con tres copias juntas y VDEL, para precargar datos) es el máximo sin parpadeo. Más allá hay que recolocar los jugadores con RESP a mitad de línea, y cada RESP anula las copias pendientes. La salida es entrelazar: que cada campo pinte la mitad.
Los cuatro modos del menú comparten todo lo demás: el ARM compone siempre la sala entera y cada modo solo decide qué parte se ve y cómo. Las capturas de este capítulo están hechas en Stella con los colores de depuración, que pintan cada objeto del TIA de un color, en los dos campos seguidos.
FRANJA: 48 píxeles, sin parpadeo
Los dos jugadores en x = 56 y 64 con NUSIZ = 3 (tres copias juntas) y VDEL: seis bytes seguidos, 48 píxeles a 60 Hz. Cada línea escribe GRP0, GRP1, GRP0, carga A, X e Y con los tres bytes siguientes y los vuelca con cuatro escrituras de 3 ciclos. La ventana sigue a Guillermo y muestra el 37 % del ancho de la sala. No necesita bus stuffing.
FRANJA. La ventana de 48 píxeles: tres copias del jugador 0 intercaladas con tres del 1. Los dos campos son iguales. Colores de depuración de Stella: jugador 0, misil 0, jugador 1, misil 1, playfield, bola y fondo. A la izquierda el campo 0 y a la derecha el 1.
FRANJA+: la ventana y el resto en playfield
La misma ventana, más el resto de la sala insinuado en un playfield asimétrico de un azul algo más claro que el papel: el mismo tono con 4 puntos más de luminancia, lo justo para que el dibujo se distinga sin competir con la ventana. Cada píxel del playfield resume cuatro de la sala (se enciende si lo están al menos dos), y bajo la ventana se apaga. Para que el paso del playfield a la ventana sea limpio, la ventana se mueve de 4 en 4 píxeles: así sus dos bordes coinciden con los de un píxel del playfield, y ninguno queda mitad playfield y mitad sprite. Son 14 escrituras por línea más el jmp: las seis de PF0, PF1 y PF2 de cada mitad, las de la ventana y la muestra de sonido. Con bus stuffing, sin parpadeo.
FRANJA+. La ventana de 48 píxeles sobre la sala en playfield (morado en la depuración). Colores de depuración de Stella: jugador 0, misil 0, jugador 1, misil 1, playfield, bola y fondo. A la izquierda el campo 0 y a la derecha el 1.
DOBLE: 96 píxeles en damero
Los jugadores en x = 32 y 48 con NUSIZ = 6 (tres copias separadas 32 píxeles) y sin VDEL. Cada línea pinta seis bloques de 8 píxeles con huecos de 8. Hay dos tipos de línea: en las A, un HMOVE en el ciclo 3 lleva los jugadores 8 píxeles a la derecha y otro en el ciclo 73 los devuelve; las B se quedan donde están. Las líneas van A, B, A, B y en el frame siguiente B, A, B, A, así que cada bloque sale en una línea de cada dos y cambia de línea en cada frame, como las casillas de un damero. PF0 en negro tapa el «peine» que deja el HMOVE a la izquierda. Siete escrituras gráficas por línea, sin bus stuffing.
DOBLE. En cada línea, seis bloques; en la siguiente, los otros seis, 8 píxeles más allá. En el otro campo, al revés. Colores de depuración de Stella: jugador 0, misil 0, jugador 1, misil 1, playfield, bola y fondo. A la izquierda el campo 0 y a la derecha el 1.
COMPLETO: la sala entera en damero
El mismo damero, a 128 píxeles. La sala, en x = 16 a 143, son 16 bloques de 8 píxeles, y cada línea pinta 8 de ellos solo con los dos jugadores: las líneas A, los bloques 1, 3, 5, 7, 9, 10, 13 y 14; las B, los demás. El jugador 0 se recoloca con RESP0 en el ciclo 76 de cada línea y dos veces a media línea; el 1 solo va y viene con los HMOVE, 8 píxeles a la derecha con el del principio de cada línea A y 8 a la izquierda con uno tardío en su ciclo 73. Como en DOBLE, las líneas van A, B, A, B y en el frame siguiente al revés: cada píxel sale uno de cada dos frames y el ojo funde los dos. Los bloques son bytes enteros de la sala, así que no quedan costuras y no hacen falta los misiles ni la bola. Los bordes negros (x = 0 a 15 y 144 a 159) son PF0 reflejado.
Las escrituras de cada pareja de líneas, cada una en su ciclo (los gráficos, los RESP0, los HMOVE, la muestra de sonido, el salto y, en el marcador, sus cambios de color y de playfield), las resuelve una herramienta fuera de la ROM, y la ROM las lleva en una tabla: en el ARM costaban segundos. Cuesta unos 43 MIPS en Stella, frente a los 39 de los otros modos.
La idea de los gráficos de 128 píxeles de ancho viene de las demos de bus stuffing que Darrell Spice Jr. (SpiceWare) compartió en AtariAge.
COMPLETO. Ocho bloques por línea, de los jugadores 0 (rojo) y 1 (amarillo); en la línea siguiente, los otros ocho. En el otro campo, al revés. Colores de depuración de Stella: jugador 0, misil 0, jugador 1, misil 1, playfield, bola y fondo. A la izquierda el campo 0 y a la derecha el 1.