Liber VII

El demake

Cómo se mete una abadía en una consola de 1977.

Todo empezó con una pregunta sencilla: ¿cabe? La referencia es la versión de La Abadía del Crimen para ZX Spectrum 128K. Su zona de juego mide 256 × 160 píxeles en dos colores, está hecha con 256 baldosas de 16 × 8 y reparte sus 94 pantallas entre la planta baja, el scriptorium y la biblioteca.

En tamaño, cabe: un píxel de la Atari es casi el doble de ancho que uno del Spectrum, así que 128 píxeles de la 2600 ocupan en la tele lo mismo que la pantalla original. Lo que no cabe es el ancho de banda. El TIA no guarda ninguna imagen, sino que hay que dárselo todo línea a línea, al paso del haz de electrones, y de forma limpia solo puede pintar unos 48 píxeles seguidos de alta resolución. De ahí nace el reto.

Para entusiastas: los capítulos técnicos

Cómo funciona por dentro, tema a tema, para quien conozca la 2600: el cartucho, el bus stuffing, los kernels de cada modo, los marcadores, las pantallas especiales, el sonido y el rendimiento. Cada capítulo se lee por separado.

Estudiar el original

Antes de dibujar nada había que entender la abadía por dentro. Para ello se escribió un emulador mínimo de Spectrum 128K y un juego de herramientas que se saltan la intro, mueven a Guillermo de sala en sala, vuelcan la memoria y los registros del chip de sonido y desensamblan el código Z80. El análisis público de la versión CPC que hizo Manuel Abadía, publicado entre 2003 y 2005 con el código Z80 desensamblado y comentado, fue un apoyo valiosísimo.

Las baldosas son un buen ejemplo de cómo se adaptó el juego de una máquina a otra. En el Amstrad CPC, donde nació, cada píxel usa una de cuatro tintas, que en la sala de entrada son cian oscuro, naranja, amarillo y negro. La transparencia no es un color fijo, sino que depende de la baldosa: el CPC las dibuja con unas tablas de máscaras que, en las baldosas 11 a 127, dejan ver lo de debajo donde hay amarillo, y en las 128 a 255, donde hay naranja. Las once primeras se copian enteras. Así una baldosa puede tener las cuatro tintas y, a la vez, huecos. El Spectrum solo pone dos colores en cada bloque, así que su versión las redibujó con papel, tinta y transparente: el negro y el cian pasan casi siempre a papel, y el naranja y el amarillo, a tinta. La transparencia se conserva: coincide en el 98 % de los píxeles. El demake usa las baldosas del Spectrum, por motivos obvios: es la versión de referencia, y una tinta sobre un fondo es justo lo que el TIA sabe pintar en cada línea. La Atari pinta la sala con 128 píxeles de ancho, la mitad que el Spectrum, así que cada baldosa se queda en 8 × 8, y cada pareja de píxeles pasa a uno. Hay diez maneras de hacerlo (alternando por filas, por columnas o en damero, quedándose siempre con el de un lado, dando prioridad a la tinta o al hueco), y para cada baldosa se elige la que mejor conserva el tono y la dirección de sus trazos en las 94 salas montadas, junto a sus vecinas.

Las 256 baldosas del juego en grupos de tres: Amstrad CPC, ZX Spectrum y Atari 2600
Lámina I. Las 256 baldosas de 16 × 8 píxeles con las que se construye toda la abadía, en grupos de tres: arriba, como están en la memoria del Amstrad CPC; en medio, la misma baldosa en la versión de ZX Spectrum, de la que parte el demake; y abajo, como la pinta la Atari 2600, con la mitad de píxeles a lo ancho.
CPC, con las tintas de la sala de entrada: cian oscuro, naranja, amarillo, negro y transparente (el amarillo en las baldosas 11 a 127 y el naranja en las 128 a 255). Spectrum y Atari: papel, tinta y transparente.

Con los personajes pasa lo contrario: sus gráficos son idénticos, byte a byte, en el CPC y en el Spectrum, con los mismos cuatro valores. Lo que cambia es cómo se pintan: el CPC usa tres tintas y deja el cuarto valor transparente, y el Spectrum pinta las dos tintas claras con su tinta y la negra como papel. Para la Atari, cada gráfico se reduce a la mitad de ancho pareja a pareja: si los dos píxeles coinciden, queda ese; si uno es tinta y el otro no, gana el que más contrasta con lo que lo rodea, para no perder ni los trazos finos ni los huecos entre ellos.

Guillermo, Adso, el abad, Malaquías y Bernardo Gui en los colores del CPC, del Spectrum y reducidos para la Atari 2600
Lámina II. Guillermo, Adso, el abad, Malaquías y Bernardo Gui: arriba, con los colores del CPC; en medio, como los pinta el Spectrum; abajo, reducidos a la mitad de ancho para la Atari 2600. El damero es lo transparente.

Cinco maneras de pintar una sala

Se evaluaron cinco formas de presentar las salas. Dos se descartaron: una partía la resolución vertical y rompía las diagonales de un píxel, y la otra, con toda la sala en playfield, volvía ilegible la arquitectura. De las otras tres salieron los cuatro modos que ofrece hoy el menú del juego.

El claustro en el original y en varias opciones de visualización
Lámina III. El claustro: el original de Spectrum frente a la sala entrelazada completa, uno solo de sus campos y la ventana de 48 píxeles.
Opciones de visualización descartadas
Lámina IV. Lo que se probó y se descartó, con su defecto a la vista.

La decisión fue no elegir. Un único motor en el ARM compone siempre la sala completa, igual que hacía el original en la memoria del Spectrum, y la consola la presenta en cualquiera de esos cuatro modos: COMPLETO, la sala entera de 128 píxeles en un damero de bloques que cambia en cada imagen y que el ojo funde en una, que es el modo inicial; DOBLE, una ventana de 96 píxeles, también en damero; FRANJA+, una ventana nítida de 48 píxeles sin parpadeo, con el resto de la sala insinuado en playfield atenuado; y FRANJA, solo la ventana de 48 píxeles, que funciona en cualquier consola.

0Barras de color

El primer hito solo pretendía demostrar que la cadena de herramientas funcionaba: una ROM ELF mínima con barras de colores en movimiento. La gracia está en el bus stuffing: el ARM coloca el dato directamente en el bus y el TIA recibe una escritura cada tres ciclos. Con él, el ARM cambia el color del fondo 23 veces por línea, una cada 3 ciclos: franjas de 9 píxeles, de las que se ven 17, porque las primeras caen fuera de la pantalla, en el borrado horizontal. Sin él, cada cambio (lda # y sta) cuesta 5 ciclos: caben 13 por línea, en franjas de 15 píxeles, y se ven 10.

Barras de color en Stella con y sin bus stuffing
Lámina V. Hito 0 en Stella: con bus stuffing, 17 franjas visibles de 9 píxeles; sin él, con el botón pulsado, 10 de 15 píxeles.

ILa prueba de pantalla

Tres salas reales (claustro, entrada e iglesia) y los cuatro modos de visualización, intercambiables con el interruptor de dificultad. Fue el hito más delicado. Para la ventana de 48 píxeles, los dos sprites de la consola se repiten tres veces cada uno. Para la sala completa hay que recolocarlos a mitad de línea en líneas de exactamente 76 ciclos, con un planificador que reparte cada escritura en su hueco. Una herramienta compara las capturas de Stella con la imagen esperada y la coincidencia es exacta, píxel a píxel.

El claustro en los cuatro modos de visualización
Lámina VI. El claustro en los cuatro modos: 48 px sin parpadeo, 96 px entrelazado, 128 px entrelazado y ventana con playfield.
Campos pares, impares y la imagen fundida
Lámina VII. Cómo funciona el entrelazado: campo par, campo impar y lo que percibe el ojo.

Bajo la sala vive el marcador: frases que se desplazan con la tipografía original, iconos de objetos, el día en números romanos, la hora canónica y la barra de Obsequium. Y suena la música: un pequeño sintetizador imita los tres canales del chip AY del Spectrum y escribe una muestra de 4 bits en cada línea de pantalla, usando el volumen del TIA como conversor digital-analógico.

Tres propuestas de marcador
Lámina VIII. Las ideas de marcador antes de decidir.
El marcador en los cuatro modos
Lámina IX. El marcador en los cuatro modos.

IIDesmontar la abadía

El segundo hito fue de arqueología: sacar del Spectrum las baldosas, los mapas de cada planta, las 94 pantallas, los sprites de los personajes, la tipografía del marcador con sus 56 frases y la música de la intro, registro a registro. Hay detalles curiosos. Los monjes se componen con una cabeza y un cuerpo intercambiables, y la biblioteca se pinta en negro si Guillermo no lleva la lámpara.

Mapa de la primera planta
Lámina X. Mapa de la primera planta: el scriptorium, con el código de cada pantalla.

IIIEl motor de dibujo

La abadía original no guarda sus salas como imágenes. Las describe con una lista de bloques que ejecutan pequeños programas en un bytecode propio, con registros, bucles, subrutinas y espejo. El demake reimplementa ese intérprete en C: 12 KB de programas y descripciones en lugar de 180 KB de pantallas, y las 94 salas salen idénticas.

Encima se dibujan los personajes con el algoritmo del pintor, de atrás hacia delante, para que Guillermo pase por detrás de columnas y arcos. Todo esto ocurre en el breve respiro entre imagen e imagen, porque mientras se pinta la pantalla el ARM no puede distraerse ni un instante.

Escenas del original junto al demake
Lámina XI. A la izquierda, el original; en el centro, la sala completa entrelazada; a la derecha, la ventana con playfield.

IVDar vida a la abadía

El cuarto hito ha convertido las pruebas en un juego. La ROM final, abadia2600.bin, recorre ya el ciclo completo del original: portada, menú, el papiro de la intro, la partida y el papiro final.

Toda la lógica se ha traducido del Z80 a C, comprobada contra el juego de verdad. Los guiones, el reloj, los días y las noches, el Obsequium y los diálogos se comprobaron primero en un prototipo, que coincide tic a tic con una partida completa de siete días en el emulador, y después se pasaron a la ROM. Los guiones del original se recompilan a unos 2,5 KB de código de bytes. Adso sigue a Guillermo con el mismo buscador de caminos que el original. Las puertas se abren y se cierran según los permisos de cada momento, y los objetos se cogen al acercarse y aparecen en el marcador.

Los diálogos entran por la derecha del marcador letra a letra, con un pitido distinto para cada personaje, como en el Spectrum.

La partida en modo FRANJA+, con la frase del abad en el marcador
Lámina XII. En modo FRANJA+, con la ROM actual: el abad pide a Guillermo que le siga, y su frase entra por el marcador. Hora nona.
La partida en modo COMPLETO, con la frase del abad en el marcador del Spectrum
Lámina XIII. Lo mismo en modo COMPLETO, con la ROM de mediados de octubre: el abad pide a Guillermo que le siga, y su frase pasa por el marco del marcador del Spectrum. La captura mezcla los dos campos del entrelazado, como se ve en la tele.

Una portada nueva

Convertir automáticamente la pantalla de carga original dejaba el rótulo legible y el resto en manchas, así que la portada se ha redibujado a mano para el TIA. Cada línea es un pequeño programa de escrituras en el chip de vídeo, con su ciclo exacto, y un simulador calibrado con Stella garantiza que la consola la pinta al píxel. Muestra a un monje anciano que escribe de noche a la luz de tres velas, sentado en un sillón frailero, como en las portadas originales. Es la misma en los cuatro modos y no necesita bus stuffing.

Al pulsar el botón, la parte baja de la portada se convierte en un menú con cuatro ajustes: el sistema de televisión (NTSC, PAL 60 o PAL 50), el idioma, el modo de pantalla y el HMOVE (NORMAL o CORTO, para las consolas fabricadas en China desde 1989, como las últimas Jr. y las 7800 PAL, en las que el HMOVE del final de la línea mueve un píxel menos). Debajo del ajuste elegido aparece su valor, con flechas que parpadean hacia los lados a los que se puede cambiar. En el PlusCart y el UnoCart, una quinta fila, SALIR, vuelve al menú del cartucho; debajo, en vez de un valor, el nombre del cartucho, que el juego averigua al arrancar mirando por qué puerto del ARM sale el bus de datos de la consola.

Portada redibujada con el menú en español
Lámina XIV. La portada con el menú en español.
Portada redibujada con el menú en inglés
Lámina XV. El mismo menú en inglés.

El papiro y los idiomas

Los papiros de la intro y del final se escriben como en el original: una pluma traza cada letra gótica con sus mismos tiempos, y el resultado coincide al píxel con el emulador. Una sola pulsación los salta, como la barra espaciadora del Spectrum.

El juego se puede jugar en español o en inglés. Los textos ingleses salen de la traducción que hizo la comunidad para la versión de CPC, con sus trucos de época: el apóstrofo ocupa el hueco de la Í y la W, el de la Ñ.

Primera página del papiro de la intro en español
Lámina XVI. «Ya al final de mi vida de pecador…»: la intro en español.
Primera página del papiro de la intro en inglés
Lámina XVII. La misma página en inglés.

Sonido y rendimiento

La música de la intro y del final se guarda ahora comprimida, con un LZ77 hecho a medida, y ocupa unos 10 KB menos. Se han corregido también varios detalles del sintetizador: la intro arranca con el estado real del chip de sonido y la señal va centrada para que el volumen no «bombee».

El cartucho de destino, el Chameleon Cart, lleva un ARM Cortex-M0+ modesto. Para que el juego vaya a 60 imágenes por segundo en todos los modos con el procesador a 56 MIPS (medidos en Stella), se ha reorganizado el trabajo: la sala se construye por trozos, la lógica se reparte en dos mitades y solo se recalcula lo que cambia. El modo más exigente ha pasado de necesitar 111 MIPS a 41. Falta comprobarlo en el cartucho real.

VLa abadía completa

El último tramo ha completado el juego. Los monjes ya se dibujan como en el original, con una cabeza propia sobre un cuerpo compartido, y recorren la abadía con sus horarios. Cada planta y cada hora del día tienen sus colores, y las salas nuevas aparecen con la misma cortinilla en espiral del Spectrum, de dentro hacia fuera.

También están los detalles que hacían especial al original: la cámara que, si Guillermo se queda quieto, pasa a seguir a otro personaje; la biblioteca a oscuras, donde solo se ve lo que alumbra la lámpara; el espejo y su trampa, y la pantalla «Has resuelto el n por ciento de la investigación» antes del papiro final. Los iconos del inventario salen del mismo gráfico con que se pinta cada objeto en la sala, invertidos como en el Spectrum.

La Atari tiene menos botones que un teclado, así que los controles se han repartido entre el joystick y los interruptores de la consola. SELECT abre un menú de pausa para seguir y, si hay una SaveKey o una AtariVox en el puerto derecho, para grabar o cargar la partida, que se guarda en ella y se puede recuperar después de apagar. El interruptor de dificultad izquierdo muestra el plano de alturas de la sala, como la tecla ENTER del original: la posición en que está al empezar la partida es la normal, y basta con cambiarlo para ver el plano. El derecho elige el ritmo: en la posición que tiene al encender la consola, el juego va al ritmo nominal del original, y en la otra, algo más lento, como se jugaba en el Spectrum. Al cambiarlo, el marcador dice durante un par de segundos el ritmo elegido.

Toda la lógica del original está ya en la ROM: los siete días, los finales, la cámara y el espejo, cada parte comprobada contra el emulador de Spectrum.

Monjes en la sala de entrada
Lámina XVIII. Los monjes ya se dibujan y recorren la abadía. Sala completa.
Menú de pausa en el marcador
Lámina XIX. La pausa, con SELECT: seguir, grabar o cargar la partida.
Plano de alturas sobre la sala
Lámina XX. El plano de alturas, con el interruptor de dificultad izquierdo.
Cortinilla en espiral al empezar la partida
Lámina XXI. La cortinilla en espiral con la que aparecen las salas.

Los últimos retoques

En el modo COMPLETO quedaban huecos. Los sprites del TIA miden 8 píxeles, pero para repetirlos a lo largo de la línea hay que volver a colocarlos escribiendo en sus registros RESP0 y RESP1, y cada escritura ocupa 3 ciclos de la CPU, 9 píxeles: dos copias seguidas quedan a 9 píxeles, con un píxel suelto entre ellas. Así que en cada línea había nueve columnas de un píxel que no pintaba ningún campo: rayas finas de papel que cruzaban la sala de arriba abajo. La primera solución fue rellenarlas con un misil, el objeto de un píxel de ancho que el TIA ofrece además de los sprites. Las nueve columnas forman tres grupos separados 32 píxeles, igual que las tres copias que el TIA hace de cada objeto, así que basta con encender el misil tres veces por línea para cubrir un grupo entero. En cada imagen se rellena un grupo distinto, de modo que cada columna aparece una de cada tres imágenes. El kernel no cambia y el ARM solo necesita 0,8 MIPS más.

Así las columnas se ven a un tercio del tono, más tenues que el resto de la sala, que se ve a la mitad porque cada píxel sale en uno de los dos campos, y con un parpadeo lento, de seis imágenes. Un modo nuevo, COMPLETO+, las igualó: reparte las columnas entre los dos campos como el resto de la sala, con el misil 0 en dos grupos, el misil 1 en el tercero y la bola para corregir la tercera copia de ese misil, así que se ven a la mitad y alternan en cada imagen. Cuesta unos 46 MIPS en Stella, frente a los 40 del primero. Durante un tiempo convivieron en el menú; al final el primero se quitó y COMPLETO+ se quedó con su nombre.

Después llegó el damero, una forma nueva de dibujar COMPLETO. En vez de repartir la sala por columnas entre los dos campos, cada línea pinta la mitad de los bloques de 8 píxeles y la siguiente, la otra mitad; en la imagen siguiente, al revés, como las casillas de un tablero. Los bloques son bytes enteros de la sala: no quedan columnas sueltas, no hacen falta los misiles ni la bola, las barras del marcador salen en todas las imágenes y el ARM trabaja menos, unos 43 MIPS en Stella frente a 46. DOBLE pinta su ventana de 96 píxeles de la misma manera, sin bus stuffing. 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.

La pantalla de resultado, «Has resuelto el n por ciento de la investigación», ha pasado por tres versiones. Al principio se pintaba como una sala más, repartida entre los dos campos: cada campo enseñaba media frase, con letras estrechadas a 4 píxeles, y no había quien la leyera. La segunda versión la sacó del entrelazado y la mostraba en la ventana de 48 píxeles en todos los modos, en once líneas cortas. La definitiva vuelve a parecerse al original: en COMPLETO usa la fuente del juego, con letras de 8 píxeles, a lo ancho de los 128 píxeles de la sala, como el papiro. En DOBLE, donde la frase no cabe, se muestra en la ventana de 48 píxeles, igual que en los dos modos FRANJA.

El mismo trozo de sala sin relleno, con el primer relleno y con el actual
Lámina XXII. El mismo trozo de la sala de entrada sin relleno (izquierda), con el primer relleno, las columnas a un tercio del tono (centro), y con el actual, a la mitad, como el resto (derecha).
Pantalla de resultado: Has resuelto el 42 por ciento de la investigación
Lámina XXIII. La pantalla de resultado en COMPLETO, con la fuente del juego. La cifra es de prueba.

El marcador, como en el Spectrum

Hasta ahora el marcador era un diseño propio, compacto y común a todos los modos. En COMPLETO es ya el del Spectrum entero, a la mitad de escala, igual que la sala: «Día» en letra gótica con el número romano, la hora sobre su barra roja, el marco por el que entran las frases, los seis huecos del inventario, con los objetos invertidos como en el Spectrum, y la palabra «obsequium», dibujada a mano en una gótica estrecha, con su barra. Se pinta con el mismo kernel que la sala, como si fuera una franja más de 32 líneas: tinta cian arriba y amarilla abajo, y las barras rojas con el playfield y la bola, otro de los objetos del TIA. Para dejar sitio a las barras, los huecos del inventario están más juntos que en el original. DOBLE tiene una versión estrecha, de 96 píxeles: el inventario y las barras se aprietan, y «Día» y «obsequium» se abrevian en «D.» y «ob.» para que la frase quepa con 14 letras. Los dos modos FRANJA tienen un marcador propio, más parecido también al original y sin bus stuffing: la frase en una caja cian, seis huecos con los objetos en amarillo sobre negro, como en el original, unidos por conectores dobles, el día en verde a la izquierda, la barra roja del obsequium a la derecha y la hora en cian sobre otra barra roja.

El marcador también está en inglés. «Day» sale del marcador de la traducción que hizo la comunidad para la versión de CPC, con la misma gótica; las horas van de NIGHT a COMPLINE, y «obsequium» se queda igual, como en ese CPC inglés.

El marcador del Spectrum y, debajo, los del demake en COMPLETO, DOBLE y FRANJA, en español y en inglés
Lámina XXIV. Arriba, el marcador del Spectrum; debajo, el del demake en COMPLETO, el estrecho de DOBLE y el de los modos FRANJA, cada uno en español y en inglés. En la tele, los de COMPLETO y DOBLE se ven más tenues, porque van entrelazados.

Manos y máquinas

Como ya es costumbre en el desarrollo de software de estos años, este demake se ha hecho con inteligencia artificial: Claude Code, de Anthropic, sobre todo con los modelos Opus 5.5 y Sonnet 5.5. Todos los commits del juego llevan su firma junto a la mía. Con él se han hecho también las herramientas de apoyo: el emulador mínimo de Spectrum para estudiar el original, los extractores de baldosas, sprites, textos y música, el editor de gráficos y guiones, los guiones de capturas en Stella y esta misma web. La mayor parte del código la ha escrito la máquina.

La mano humana, la mía, ha estado en lo que no se delega:

Una Atari de seis interruptores con un PlusCart, conectada a un televisor LG que muestra la sala de entrada de la abadía con el marcador del Spectrum
Lámina XXV. La primera vez que el juego arrancó en una consola de verdad: mi Atari de seis interruptores con el PlusCart, conectada por la salida de antena al televisor LG. Día I, hora nona, en la sala de entrada. Como muchos televisores modernos, este toma la señal progresiva de la consola (240p) como si fuera entrelazada (480i): en los modos que alternan dos campos no los funde, sino que dobla las líneas de cada uno, y aparecen escalones.
La portada del demake en el mismo televisor LG, con el menú en PAL 60, español y COMPLETO+, el nombre que tenía entonces COMPLETO
Lámina XXVI. La portada en la misma consola y el mismo televisor, con el menú en PAL 60, español y COMPLETO+ (el nombre que tenía entonces el modo COMPLETO). Aquí no hay escalones: la portada es igual en todos los frames, así que doblar las líneas no se nota.