
Chase H.Q. для ZX Spectrum — реверс-инжиниринг и восстановление на переносимом C
Реверс-инжиниринг Дэвида Томаса, 2023–2024
Проект начат: март 2023

Это незавершённая работа по дизассемблированию версии Chase H.Q. для ZX Spectrum от Ocean Software. Пока что она охватывает только версию 48K и первый этап игры. Версия 128K лучше (загружает все уровни сразу, имеет музыку AY и анимации экрана меню), но в ней гораздо больше кода, который нужно рассмотреть, поэтому проще начать с этапа 1 версии 48K.
Примечание: сейчас я работаю над версией 128K в ветке «128k».
В этом репозитории находится управляющий файл SkoolKit, который можно использовать для дизассемблирования игры. Он работает с игрой, когда она находится в «нетронутом» состоянии сразу после загрузки. См. ниже, как создать нетронутый снимок памяти, и инструкции по работе со SkoolKit. Я предоставил Makefile для автоматизации большинства необходимых шагов.
Текущий результат дизассемблирования доступен здесь.
Чтобы понять, как она работает! (и, возможно, когда-нибудь мы сможем создавать новые уровни...)
pip3 install skoolkit
make pristine
Вы увидите:
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
Соберите skool-файл следующим образом:
make skool
Skool-файл — это высокоуровневый ассемблерный листинг, из которого можно создавать обычные ассемблерные листинги или HTML-дизассемблеры. Сгенерированные файлы по умолчанию помещаются в каталог 'build'. Вы можете отредактировать skool-файл и преобразовать его обратно в другой управляющий файл следующим образом:
make ctl
Это упрощает перенос ваших изменений обратно в основной управляющий файл:
cp build/ChaseHQ.ctl ChaseHQ.ctl
Или вы можете сравнить два файла (diff), чтобы более избирательно подходить к фиксации изменений.
Чем больше и подробнее становится управляющий файл, тем лучше наше описание игры!
Соберите ассемблерный листинг следующим образом:
make asm
Обычно я редактирую, держа открытыми все три файла: управляющий, skool и листинг, чтобы проверять влияние своих изменений:

Соберите файл .tap или .z80 для загрузки в эмуляторы или настоящие Spectrum следующим образом:
make tap # or z80
Вероятно, вам придётся делать и то, и другое.
Смотрите https://youtu.be/ZcoFi4T4tsU — короткое видео, где я запускаю Spectrum Analyser, чтобы выяснить, как игра строит свой задний буфер.
Если вас не интересует само дизассемблирование, приятным побочным продуктом являются POKE-коды, которые делают игру проще, сложнее или просто другой:
Бесконечные кредиты
POKE 39998,166
Бесконечное время
POKE 39937,0
Одно попадание для поимки
POKE 46351,62
Бесконечные турбо
POKE 45221,0
Изменение частоты появления машин
POKE 23834,<spawn rate> -- 20 — значение по умолчанию для этапа 1. 10 будет вызывать появление вдвое чаще.
Установить цвет уровня
POKE 23796,<attribute byte> -- 112 — чёрный на жёлтом, как для этапа 1. 96 даст чёрный на зелёном.
POKE 23797,<attribute byte>
Тема на форуме Spectrum Computing: https://spectrumcomputing.co.uk/forums/viewtopic.php?p=113633
Играть в Chase H.Q. онлайн: http://torinak.com/qaop#!chasehq
Мой предыдущий проект по дизассемблированию: https://github.com/dpt/The-Great-Escape