返回

文章详情

ZX Spectrum 系统巡礼:文本模式 – Bumbershoot 软件

Hacker News2026年8月3日 21:39

现在我们已经查看了 Spectrum 的 BASIC 如何控制硬件,是时候深入机器语言,看看那里的内容了。在这个领域还有很多内容要覆盖,我预计这将分布在很多帖子中。与许多其他平台相比,这一领域的风险更大,因为 Sinclair 仅对暴露一致且结构化的固件接口给予了最小的关注。Commodore 的 8 位计算机,从原始的 PET 到 C128,在其 "KERNAL" ROM 的末尾都有向后兼容的跳转表,这意味着很多机器语言代码即使在进行文件处理和磁盘访问时也能相同地运作。MSX 根本不是单一的计算机,而是一个行业标准,制造商按照它进行编程,重要的一点是有一个在中断向量附近定义良好的跳转表。IBM PC 的 BIOS 执行了类似的角色,但不那么自愿。然而,Spectrum 只有少数定义的入口点,因此开发人员往往不得不直接调用系统 ROM 中更深层的内容,以获得所需的结果。Timex Sinclair 2068 拥有不兼容的 ROM,因此几乎没有 Spectrum 软件能在其上运行——这似乎被理解为其在美国市场失败的一个主要原因。我对此持怀疑态度,因为那场突如其来的美国崩溃同样影响了 MSX、Commodore 16 和 Coleco Adam,它们都是潜在的 TS2068 直接竞争对手。然而,鉴于 128 是在 2068 失败后发布的,并且 128 在其 ROM 的相关部分与 48K 版本保持了非常小心的兼容性,我怀疑 Sinclair 在这里还是学到了一个重要的教训。在本系列中,我将把 48K Spectrum 作为目标平台,但也确保我所描述的技术同样适用于 16K 和 128K 机器。有大量 Spectrum 克隆和续作,其保真度各异;如果我途中遇到有趣的内容,我会提到,但这将纯粹是额外的内容。对于我们的第一次探险,我将查看我们可以命令的设施,以获得像上周展示的 100%-BASIC 的 "Manic Mechanic" 游戏那样的显示:在这第一篇帖子中,我们将首先看看基本的系统组织:机器语言程序在系统上是如何存在的,它们是如何加载和运行的,以及它们如何与 BASIC 和 BIOS 共存。然后我们将深入系统上的基于文本的显示设施,包括 "用户定义图形" 设施,"Manic Mechanic" 本身依赖于此。最后,我们将看看键盘和操纵杆输入,结果发现这与我们在 BASIC 中必须做的事情非常接近。基本原则:运行代码 在我第一次开始探索 ZX Spectrum 时,我非常惊讶于 BASIC 如何能够轻松与机器代码共存。许多标准 BASIC 命令具有额外模式,这些模式不仅非常适合纯机器代码程序,也适合混合 BASIC/ML 组合。磁带上的文件标识为 BASIC 代码、BASIC 数据或二进制数据。BASIC 的 SAVE 和 LOAD 命令有扩展以指定确切要加载的内容,类似于其他 BASIC 中的 DISTINCT LOAD 和 BLOAD 命令。要从磁带加载机器代码,我们在文件名后添加关键字 CODE。BASIC 可以通过向 CLEAR 命令传递参数来限制其内存使用。通过将 BASIC 内存的顶部降低到恰好低于机器代码的加载点,内存冲突应该可以完全避免。BASIC 通过 USR 函数调用机器代码子例程。该函数将例程的地址作为参数;例程完成工作后,通过 RET 指令返回到 BASIC。BC 寄存器对的值作为无符号 16 位整数返回到 BASIC,作为函数的值。没有有意义返回值的例程通常通过将其传递给随机数生成器来处理:在 Sinclair BASIC 中,RANDOMIZE USR 完成了与 C64 BASIC 中 SYS 类似的功能。除了保存二进制数据范围外,SAVE 函数还可以保存 BASIC 程序,以便在加载后立即开始运行——并且允许您从任何所需的行号开始执行。早在 2017 年,我为我的 Spectrum 程序创建了一个更复杂的 BASIC 桩程序,从那时起一直在使用。总体策略是这样的:BASIC 程序被保存,使其执行在行 30 开始,而不是 10。行 30 的代码通过 CLEAR 命令限制 BASIC 的内存,然后将磁带上的下一个文件(我们的实际程序)作为二进制加载。加载完成后,它会跳转到程序的顶部。行 10 和 20 使用 RANDOMIZE USR 调用加载的机器代码,然后跳过加载程序逻辑,使程序正常退出。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡