
Chase H.Q. para ZX Spectrum: sometido a ingeniería inversa y reconstruido en C portátil
Ingeniería inversa por David Thomas, 2023-2024
Proyecto iniciado: marzo de 2023

Este es un desensamblado en curso de la conversión de Chase H.Q. para ZX Spectrum realizada por Ocean Software. Por ahora solo cubre la versión de 48K y la primera fase del juego. La versión de 128K es mejor (carga todos los niveles a la vez, tiene música AY y animaciones en la pantalla de menú) pero tiene mucho más código que considerar, así que es más fácil empezar primero con la fase 1 de 48K.
Nota: actualmente estoy trabajando en la versión de 128K en la rama "128k".
En este repositorio hay un archivo control de SkoolKit que puedes usar para desensamblar el juego. Esto funciona con el juego cuando está en un estado "pristine" recién cargado. Más abajo se indica cómo crear una instantánea "pristine" y las instrucciones para manejar SkoolKit. He incluido un Makefile para automatizar la mayoría de los pasos necesarios.
El desensamblado actual está aquí.
¡Para descubrir cómo funciona! (y quizá algún día podamos crear niveles nuevos...)
pip3 install skoolkit
make pristine
Verás:
Downloading https://worldofspectrum.net/pub/sinclair/games/c/ChaseH.Q..tzx.zip
Extracting Chase HQ - Side 1.tzx
Program: CHASE HQ
Fast loading data block: 23755,3870
Data (514 bytes)
Data (6914 bytes)
Data (19074 bytes)
Data (16130 bytes)
Data (4 bytes)
Data (6898 bytes)
Tape finished
Simulation stopped (PC at start address): PC=23372
Writing chase-hq.z80
Genera un archivo skool así:
make skool
Un archivo skool es un listado de ensamblador de alto nivel a partir del cual podemos generar listados de ensamblador normales o desensamblados HTML. Los archivos generados se colocan en un directorio llamado 'build' por defecto. Puedes editar el archivo skool y volver a convertirlo en otro archivo de control de la siguiente manera:
make ctl
Esto facilita incorporar tus cambios de nuevo al archivo de control principal ejecutando:
cp build/ChaseHQ.ctl ChaseHQ.ctl
O puedes comparar ambos con diff para ser más selectivo en la preparación de los cambios.
¡Cuanto más grande y detallado sea el archivo de control, mejor será nuestra explicación del juego!
Genera un listado de ensamblador así:
make asm
Normalmente edito con los tres archivos (control, skool y ensamblador) abiertos para comprobar el impacto de mis cambios:

Genera un archivo tap o z80 para cargarlo en emuladores o Spectrums reales así:
make tap # or z80
Probablemente tendrás que hacer ambas cosas.
Mira https://youtu.be/ZcoFi4T4tsU para ver un breve vídeo de mí ejecutando Spectrum Analyser para averiguar cómo el juego construye su búfer trasero.
Si no te interesa el desensamblado en sí, un buen subproducto son los POKEs para hacer el juego más fácil, más difícil o simplemente distinto:
Créditos infinitos
POKE 39998,166
Tiempo infinito
POKE 39937,0
1 golpe para capturar
POKE 46351,62
Turbos infinitos
POKE 45221,0
Modificar la frecuencia de aparición de coches
POKE 23834,<spawn rate> -- 20 es el valor por defecto para la fase 1. 10 haría que aparecieran el doble de veces.
Establecer el color del nivel
POKE 23796,<attribute byte> -- 112 es negro sobre amarillo, como en la fase 1. 96 daría negro sobre verde.
POKE 23797,<attribute byte>
Hilo de los foros de Spectrum Computing: https://spectrumcomputing.co.uk/forums/viewtopic.php?p=113633
Juega a Chase H.Q. en línea: http://torinak.com/qaop#!chasehq
Mi proyecto anterior de desensamblado: https://github.com/dpt/The-Great-Escape