
Chase H.Q. para ZX Spectrum — com engenharia reversa e reconstruído em C portátil
Engenharia reversa por David Thomas, 2023-2024
Projeto iniciado: março de 2023

Esta é uma desmontagem em andamento da conversão para ZX Spectrum de Chase H.Q. pela Ocean Software. Até agora, isso cobre apenas a versão 48K e a primeira fase do jogo. A versão 128K é melhor (carrega todas as fases de uma vez, tem música AY e animações no menu) mas tem muito mais código a considerar, então é mais fácil começar pela fase 1 da versão 48K.
Nota: atualmente estou trabalhando na versão 128K no branch "128k".
Neste repositório há um arquivo de controle do SkoolKit que você pode usar para desmontar o jogo. Isso funciona com o jogo quando ele está em um estado "pristine", recém-carregado. Veja abaixo como criar um snapshot pristine e instruções sobre como usar o SkoolKit. Forneci um Makefile para automatizar a maioria das etapas necessárias.
A desmontagem atual está aqui.
Para descobrir como funciona! (e talvez um dia possamos criar novas fases...)
pip3 install skoolkit
make pristine
Você verá:
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
Crie um arquivo skool assim:
make skool
Um arquivo skool é uma listagem de assembly de alto nível a partir da qual podemos gerar listagens de assembly comuns ou desmontagens em HTML. Os arquivos gerados são colocados em um diretório chamado 'build' por padrão. Você pode editar o arquivo skool e transformá-lo novamente em outro arquivo de controle assim:
make ctl
Isso facilita trazer suas alterações de volta ao arquivo de controle principal fazendo:
cp build/ChaseHQ.ctl ChaseHQ.ctl
Ou você pode usar diff nos dois para ser mais seletivo no seu staging.
Quanto maior e mais detalhado o arquivo de controle ficar, melhor será a nossa explicação do jogo!
Crie uma listagem de assembly assim:
make asm
Eu costumo editar com os três arquivos — controle, skool e assembly — todos abertos, para poder verificar o impacto das minhas alterações:

Crie um arquivo tap ou z80 para carregar em emuladores ou Spectrums reais assim:
make tap # or z80
Você provavelmente terá que fazer as duas coisas.
Veja https://youtu.be/ZcoFi4T4tsU para um vídeo curto de mim usando o Spectrum Analyser para descobrir como o jogo monta seu back buffer.
Se você não está interessado na desmontagem em si, um bom subproduto são os POKEs para tornar o jogo mais fácil, mais difícil ou apenas diferente:
Créditos Infinitos
POKE 39998,166
Tempo Infinito
POKE 39937,0
1 Batida Para Capturar
POKE 46351,62
Turbos Infinitos
POKE 45221,0
Afetar a Taxa de Spawn de Carros
POKE 23834,<spawn rate> -- 20 é o padrão para a Fase 1. 10 faria aparecer com o dobro da frequência.
Definir a Cor da Fase
POKE 23796,<attribute byte> -- 112 é preto sobre amarelo, como na Fase 1. 96 daria preto sobre verde.
POKE 23797,<attribute byte>
Tópico dos fóruns Spectrum Computing: https://spectrumcomputing.co.uk/forums/viewtopic.php?p=113633
Jogue Chase H.Q. online: http://torinak.com/qaop#!chasehq
Meu projeto anterior de desmontagem: https://github.com/dpt/The-Great-Escape