Introducción
Spellbound fue el segundo juego de la saga Magic Knight creada por el polifacético autor David Jones. Muy diferente a Finders Keepers, su predecesor, Spellbound estableció un nuevo sistema de juego que su autor bautizó como Windimation.
Probablemente sin ser plenamente consciente, Jones estableció las bases para todo un nuevo género de videojuego, mezcla de arcade, plataformas, aventura gráfica y conversacional.
Como usuario «de siempre» de ordenadores MSX, yo conocí la saga primero por Knight Tyme y posteriormente por el también excelente Stormbringer. Encandilado por el ambiente del juego y su diseño conceptual, investigué toda la saga solo para descubrir que a los MSXeros nos faltaba Spellbound, probablemente el más importante por ser el que estableció el sistema de juego.
Durante años pensé en la posibilidad de portar a MSX la versión de Spectrum (siguiendo la estrategia oficial de Mastertronic para el resto de juegos de la saga) añadiendo algunos extras que aprovechasen mejor el hardware de la norma japonesa. Finalmente, una conversación con el gran desarrollador Félix Espina (que había tenido un propósito similar y había hecho ya algún análisis del código confirmando la viabilidad) me terminó de animar a acometer la empresa de portar Spellbound al MSX.
A la caza de David Jones
Históricamente, los ordenadores MSX fueron maltratados en Europa con conversiones de juegos de Spectrum que se conocían como lazy ports: básicamente parcheaban las rutinas de vídeo y control para insertar unas compatibles con el hardware del MSX, pero necesariamente más lentas por la diferente forma de organización de la memoria de vídeo en ambos ordenadores. Yo no debía caer en el mismo error, por lo que decidí hacer una
conversión elaborada y al mismo tiempo respetuosa con el autor original, lo que pasaba por contactar con él para explicarle el proyecto y obtener una autorización de manera oficial.
La única manera de encontrar a Jones fue a través de su perfil de Facebook. Como yo no tenía un perfil propio (jamás cederé mis datos personales a esa compañía) tuve la ocurrencia de generar un perfil «anónimo» usando el nombre falso de Tracy Lewis (que obtuve de un generador online de nombres aleatorios). Con ese nombre contacté con David Jones quien inmediatamente se interesó por el proyecto. Estuvimos conversando acerca del approach que estaba siguiendo y de los asuntos legales.
Con una amabilidad y simpatía dignos de alguien de su grandeza, llegamos al acuerdo de que el juego se distribuiría en Itch.io, que los derechos seguirían siendo suyos (como no podría ser de otra forma), y que hiciese
desaparecer el «Copyright Mastertronic» y en su lugar pusiese mi (falso) nombre. Según explicó, Mastertronic nunca tuvo el copyright, pero él mismo lo añadió a la pantalla principal porque «le sobraba espacio» y también le sobraba «juventud e inocencia».
Adicionalmente, Jones me pidió que debíamos obtener una autorización expresa de Rob Hubbard para poder usar su composición musical original. Hubbard está jubilado y no usa redes sociales, pero el publisher oficial de sus músicas (que es quien tiene los derechos de publicación y uso de las mismas) finalmente fue quien amablemente nos dio luz verde.
Con todas las piezas del puzle necesarias, nos pusimos manos a la obra. Eso sí, con el falso nombre de Tracy Lewis.
Desensamblando el original
Si quería realizar un port con el mimo y dedicación que merecía, no podía conformarme con meter unos saltos JP en las rutinas gráficas a modo de parche. Requería un análisis en profundidad, un posterior desensamblado, y finalmente un reworking de la totalidad del código y los gráficos para garantizar la compatibilidad de todas las rutinas, la máxima eficiencia posible y un uso más provechoso del hardware dedicado de los ordenadores MSX.
Para ello, encontré un archivo SNA que contenía el juego en su versión ZX Spectrum 48K (que suele ser el habitual punto de partida para conversiones a ordenadores MSX1) y realicé el desensamblado con la excelente herramienta Ghidra publicada por la agencia NSA estadounidense (ghidra-sre.org).
Ghidra permite, interactivamente, etiquetar correctamente todos los punteros a memoria y realizar así una separación perfecta de código y datos. Permite además hacerlo de una manera no destructiva y que a partir del fuente generado se pueda reensamblar el programa original.
La tarea no fue fácil a pesar de la potencia de la herramienta: David Jones llenó el código de rutinas que se automodifican en RAM (¡más de cien de ellas!) en algunos casos simplemente modificando valores a cargar en registros y en otros directamente forjando el op-code de una instrucción de manera programática.
Tras el desensamblado, hice una separación entre aquellas rutinas pertenecientes a la lógica interna del juego (comportamiento de personajes, objetos, situaciones especiales, etc.) y las rutinas técnicas: pintar en pantalla, generar efectos de sonido, leer el teclado/joystick… Aquí vino el segundo susto: dicha separación en ocasiones brillaba por su ausencia. Hay escrituras en la RAM de vídeo dispersas por todo el código y mezcladas en la
propia lógica del juego, lo que requirió un análisis en mayor profundidad, si cabe.
Reescribiendo el juego
Con el análisis anteriormente descrito ya llegó el momento de comenzar a reescribir el código. La estrategia seguida fue:
- Sustituir las rutinas de sonido de 1 bit y color de borde por unas equivalentes. El motivo de comenzar (en apariencia) la casa por el tejado es bien conocido: la ULA del Spectrum usa el puerto #FE que en MSX se usa para gestionar el memory mapper, causando así un espléndido e inmediato cuelgue.
- Mediante un script, cambiar el formato de almacenamiento de los gráficos del juego para adecuarse a las nuevas rutinas de pintado de pantalla minimizando el esfuerzo.
- Reescribir las rutinas de dibujo de menús, ventanas e impresión de texto tokenizado.
- Escribir rutinas para mapear los colores del Spectrum a colores del MSX y simular los atributos de brillo y flasheo.
- Gestionar mediante sprites hardware nativos de MSX el dibujo y animaciones del personaje principal, los enemigos móviles y el «dedo» de selección de los menús (y algún otro huevo de pascua que el autor original dejó por ahí y que he decidido mantener).
- Reescribir las rutinas del decorado.
- Reescribir las rutinas de lectura de teclado y joystick.
- Diseñar un nuevo main loop y una nueva rutina síncrona vinculada a la interrupción de vídeo para optimizar el repintado eliminando cualquier jitter, tearing, etc. y mantener constante la velocidad del movimiento de los sprites independientemente de la situación (algo que no ocurría en la versión ZX).
- Adaptación de las situaciones dependientes de un contador de tiempo para su funcionamiento tanto en modelos de 50 Hz como de 60 Hz.
- Reescritura de las rutinas que requieren modificar los gráficos en caliente en situaciones especiales.
- Corrección de bugs originales en la lógica del juego (algunos flagrantes) y optimización de código.
Tras varias iteraciones y correcciones de los pasos anteriores, obtuve por fin una primera versión preliminar que empezaba a parecerse a un Spellbound en MSX. Pero aún quedaba mucha faena por delante.
Adaptando el juego a MSX
No tenía sentido una conversión a MSX si se dejaba todo con el mismo aspecto de un juego de ZX Spectrum, por lo que se ha enriquecido añadiendo o mejorando algunos elementos:
La pantalla de carga se importó de Spectrum pero fue mejorada sustancialmente por uno de los mejores pixel artists del ámbito 8-bit en España: me refiero a Sutchan, ex-componente de Bohken y Kralizec, diseñador de obras maestras como Booming Boy, The Goonies ‘R’ Good Enough o el remake de la recreativa Bomb Jack para MSX2.
Como se describió antes, todos los elementos móviles han sido convertidos a sprites hardware multicolor cuyo movimiento es perfecto y siempre a 60 frames or segundo.
En ordenadores MSX2 o superiores se muestra una paleta gráfica alternativa y mejor ambientada en el juego, inspirada en la excelente versión de Commodore 64. Aprovechando la ultra velocidad de pintado de un sprite hardware en un ordenador MSX, se ha creado un efecto de glow en la armadura de Magic Knight cuando se invoca el hechizo «Armouris Photonicus» que habría sido imposible realizar en otros ordenadores de la época
y que precisa de un monitor capaz de mostrar imágenes a 60 Hz.
Cuando un enemigo entra en contacto con Magic Knight, se produce un efecto de sacudida de la pantalla en ordenadores MSX2 o superiores.
El ending del juego ha sido reprogramado usando sprites hardware y añadiendo una sensación tridimensional al
efecto mostrado.
Además de los efectos originales de sonido de 1-bit, se han añadido algunos efectos sonoros usando el chip PSG (AY-3-8910) que tienen todos los MSX.
Se han optimizado los controles para teclas de cursor y joystick estándar.
Se ha añadido la posibilidad de jugarlo a 50 o a 60 Hz (lo que afecta al tempo de la música y a la velocidad de la acción y los controles del juego, aunque se ha calibrado para que los sucesos dependientes del tiempo no se vean alterados).
¿Y qué pasa con la música?
Cuando comencé este port de Spellbound tomé como referencia la versión de 48K tanto para gráficos como para la lógica del juego. Pero entonces caí en la cuenta de que los ordenadores Spectrum de 48K suelen ser muy pobres en música, y por eso Spellbound no tenía ninguna. Decidí entonces tomarla de la versión 128K (que, como solía ser habitual, tenía una música extra en un chip AY-3-8912 compatible con el AY-3-8910 de los MSX).
Sin embargo, mi olfato como músico (ocupación a la que he dedicado toda mi vida) me decía que algo raro pasaba con esa melodía. Las voces parecían estar desincronizadas, algunas alteraciones accidentales sonaban muy extrañas y, en general, todo el arreglo sonaba bastante mal. Estos problemas se aprecian también en la versión original de Spectrum 128K, así que no eran causados por el port. Decidí escuchar la versión inicial
creada por el gran Rob Hubbard para Commodore 64 y así entender mejor qué estaba pasando.
Para empezar, observé que las versiones ZX y MSX sonaban 2 semitonos más bajas que la de C64. Esto rápidamente me recordó a un problema similar que corregí en la maltrecha música de La Abadía del Crimen y rápidamente entendí el problema: la versión de la música de Spellbound para Spectrum fue en realidad hecha para el Amstrad CPC. El chip AY está normalmente sincronizado al reloj principal de la CPU, que en CPC
es 4 MHz mientras que en Spectrum es 3,57 MHz.
Esto, traducido al mundo de la música, significa que una frecuencia mayor supone también un tono más alto. La diferencia de 4 a 3,57 provoca que justamente la versión de Spectrum suene 2 semitonos más baja de lo normal.
Para arreglar esto, busqué en la rutina de reproducción la tabla de notas y frecuencias y apliqué la siguiente fór-
mula: F’=(F*3,579545)/4 y asunto arreglado. La música empezó a sonar en MI menor, que era el tono original de la versión C64 (y su adaptación a Z80 en los CPC).
Pero eso no era nada: la música en sus versiones Z80 tenía un montón más de problemas: notas ligadas que debían estar separadas, desincronización de voces, terribles errores de transcripción (notas erróneas)… ni siquiera tení a implementado el tercer canal y faltaba toda la armonización (lo que muchos conocéis como «acordes» o «arpegios»).
Finalmente, decidí que la única manera de arreglar eso era tirar a la basura la música del Spectrum 128K y hacer mi propio arreglo basándome en la de C64. Para ello seguí los siguientes pasos:
- Ampliar la funcionalidad de la rutina reproductora para soportar trinos a alta velocidad (un recurso habitual en
música chiptune para poder enriquecer armónicamente las composiciones usando un único canal). - Añadir soporte de envolvente para modular la amplitud (una curva típica ADSR para modificar el volumen y
poder hacer notas más o menos percusivas, con una «cola» de diferentes duraciones, etc.). - Transcribir la melodía y armonía original de C64 literalmente a una partitura y realizar un nuevo arreglo respetando la composición original.
- Con la ayuda de algunas macros creadas en el ensamblador SjASM, codificar de nuevo la anterior partitura en lenguaje ensamblador.
Ahora la música mantiene la esencia de la composición original de Rob Hubbard (aunque sin los artificios técnicos que solo un chip SID puede realizar).
Para concluir
El juego ha sido liberado en Itch.io tal y como fue pactado con David Jones. Se ha adaptado a formato .ROM de 32KB (cualquier cartucho de 32KB sin mapper sería compatible) aunque debido a las rutinas auto-modificables que aún persisten, el juego necesita para correr al menos 48KB de RAM (exactamente como el resto de juegos de la saga Magic Knight que sí fueron portados a MSX en los años 80).
También se han añadido versiones .CAS (cinta) y disco de simple cara (1DD).
El usuario británico de MSX Duncan Edwards ha colaborado creando una versión del inlay de cassette adaptado para MSX y un montón más de voluntarios han testeado el juego (tarea harto compleja por la inmensa cantidad de situaciones y combinaciones que pueden darse durante el transcurso del juego).
Desde aquí mi agradecimiento a todos ellos, y especialmente a los dos grandes genios y artífices originales de esta maravilla de juego: David Jones y Rob Hubbard por haber autorizado la publicación de esta versión e incluso haberse involucrado en el desarrollo.
Espero que todo el mundo disfrute jugando Spellbound en sus MSX tanto como yo he disfrutado desarrollando el port.
mastropiero.itch.io/spellbound-msx