dpt/ChaseHQ
GitHub: dpt/ChaseHQ
这是一个逆向工程 ZX Spectrum 经典游戏《Chase H.Q.》的反汇编项目,通过 SkoolKit 还原源码并生成可浏览的交叉引用文档,附带大量游戏修改 POKE 码。
Stars: 33 | Forks: 1
# 拆解 ZX Spectrum 版的 _Chase H.Q._
由 David Thomas 逆向工程,2023-2026
项目开始时间:2023 年 3 月

这是 [由 Ocean Software 制作的 ZX Spectrum 版 Chase H.Q.](https://spectrumcomputing.co.uk/entry/903/ZX-Spectrum/Chase_HQ) 的反汇编(进行中)。
**注意:我目前正在 [128k 分支](https://github.com/dpt/ChaseHQ/tree/128k) 上开发该游戏的 128K 版本。我也已经开始将游戏逻辑移植到 C。**
这个仓库中包含一个 [SkoolKit](https://skoolkit.ca/) _控制_ 文件,你可以用它来反汇编游戏。这会对处于“原始”刚加载状态的游戏进行反汇编。有关如何制作原始快照以及如何驱动 SkoolKit 的说明,请参见下文。我提供了一个 Makefile 来自动化所需的步骤。
当前的反汇编输出[可在此处查看](https://dpt.github.io/ChaseHQ/)。
## 为什么?
为了弄清楚它是如何运行的!(也许有一天我们可以制作新的关卡……)
## 如何操作
- 安装 SkoolKit:
```
pip3 install skoolkit
```
- 下载游戏并将其转换为 .z80 格式的快照:
```
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
```
或者你可以对比这两个文件以更有选择性地暂存更改。
控制文件越详细,我们对游戏的解释就越好!
像这样构建汇编列表:
```
make asm
```
我通常在编辑时同时打开控制文件、skool 和汇编文件,以便检查更改的影响:

像这样构建用于加载到模拟器或真实 Spectrum 中的 tap 或 z80 文件:
```
make tap # or z80
```
## 我们如何弄清楚游戏是如何运行的?
- 选项(1)是在 [Spectrum Analyser 交互式反汇编器](https://colourclash.co.uk/spectrum-analyser/) 中运行游戏并寻找线索。
- 选项(2)是_非常努力地_盯着代码看,直到看懂为止。
你可能必须两者都做。
请参阅 https://youtu.be/ZcoFi4T4tsU,观看我在 Spectrum Analyser 中运行游戏以了解它是如何构建其后台缓冲区的简短视频。
## POKE
如果你对游戏的运行原理不感兴趣,而只是想玩玩,那么一个不错的副产品是可以通过 POKE 让游戏变得更简单、更难或者只是有所不同:
* 无限投币数
`POKE 39998,166`
* 无限时间
`POKE 39937,0`
* 1 次撞击即可逮捕
`POKE 46351,62`
* 无限 Turbo
`POKE 45221,0`
* 影响汽车生成率
`POKE 23834,`<生成率> -- `20` 是 Stage 1 的默认值。`10` 会使生成频率加倍。
* 设置关卡颜色
`POKE 23796,`<属性字节> -- `112` 是黄底黑字,即 Stage 1 的配色。`96` 会呈现绿底黑字。
`POKE 23797,`<属性字节>
* 提高最高速度
45461 处的字设置了非加速状态下的最高速度。默认内部值为 360(显示的最高速度读数为 294)。所以你可以尝试 450:
`POKE 45461,194`
`POKE 45462,1`
要恢复默认的 360:
`POKE 45461,104`
`POKE 45462,1`
(Turbo 速度为 695)。
* 更宽的道路(尽管它们会向左倾斜……)
`POKE 52382,169` -- `217` 是默认值。`237` 会产生狭窄的道路。
## 链接
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
标签:Findomain, SkoolKit, ZX Spectrum, 云资产清单, 怀旧游戏, 汇编, 游戏开发, 逆向工具, 逆向工程