
Chase H.Q. pour ZX Spectrum — rétro-ingénierie et reconstruction en C portable
Rétro-ingénierie par David Thomas, 2023-2024
Projet démarré : mars 2023

Ceci est un désassemblage en cours de la conversion ZX Spectrum de Chase H.Q. par Ocean Software. Jusqu'à présent, cela ne couvre que la version 48K et le premier niveau du jeu. La version 128K est meilleure (elle charge tous les niveaux d'un coup, propose de la musique AY et des animations sur l'écran de menu), mais elle contient beaucoup plus de code à analyser, il est donc plus facile de commencer par la version 48K, niveau 1.
Note : je travaille actuellement sur la version 128K dans la branche « 128k ».
Ce dépôt contient un fichier control SkoolKit que vous pouvez utiliser pour désassembler le jeu. Cela fonctionne lorsque le jeu est dans un état « pristine » (tout juste chargé). Voir ci-dessous pour savoir comment créer un instantané pristine et comment piloter SkoolKit. J'ai fourni un Makefile pour automatiser la plupart des étapes nécessaires.
Le désassemblage actuel se trouve ici.
Pour découvrir comment ça fonctionne ! (et peut-être qu'un jour nous pourrons créer de nouveaux niveaux...)
pip3 install skoolkit
make pristine
Vous verrez :
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
Construire un fichier skool de cette manière :
make skool
Un fichier skool est un listing assembleur de haut niveau à partir duquel nous pouvons générer des listing assembleur classiques ou des désassemblages HTML. Par défaut, les fichiers générés sont placés dans un répertoire appelé « build ». Vous pouvez modifier le fichier skool et le reconvertir en un autre fichier control comme ceci :
make ctl
Cela permet de réintégrer facilement vos modifications dans le fichier control principal en faisant :
cp build/ChaseHQ.ctl ChaseHQ.ctl
Vous pouvez également faire un diff entre les deux pour être plus sélectif dans votre intégration.
Plus le fichier control est volumineux et détaillé, meilleure est notre explication du jeu !
Construire un listing assembleur de cette manière :
make asm
J'édite généralement avec les trois fichiers control, skool et assembleur ouverts afin de vérifier l'impact de mes modifications :

Construire un fichier tap ou z80 à charger dans des émulateurs ou de vrais Spectrum comme ceci :
make tap # or z80
Vous devrez probablement faire les deux.
Voir https://youtu.be/ZcoFi4T4tsU pour une courte vidéo de moi utilisant Spectrum Analyser pour découvrir comment le jeu construit son tampon arrière (back buffer).
Si le désassemblage en lui-même ne vous intéresse pas, un sous-produit intéressant est les POKEs pour rendre le jeu plus facile, plus difficile, ou simplement différent :
Crédits infinis
POKE 39998,166
Temps infini
POKE 39937,0
1 coup pour capturer
POKE 46351,62
Turbos infinis
POKE 45221,0
Modifier le taux d'apparition des voitures
POKE 23834,<taux d'apparition> -- 20 est la valeur par défaut pour le niveau 1. 10 ferait apparaître les voitures deux fois plus souvent.
Définir la couleur du niveau
POKE 23796,<octet d'attribut> -- 112 correspond à noir sur jaune, comme pour le niveau 1. 96 donnerait noir sur vert.
POKE 23797,<octet d'attribut>
Fil du forum Spectrum Computing : https://spectrumcomputing.co.uk/forums/viewtopic.php?p=113633
Jouer à Chase H.Q. en ligne : http://torinak.com/qaop#!chasehq
Mon précédent projet de désassemblage : https://github.com/dpt/The-Great-Escape