开发者生态
morning
ZX频谱系统导览:文本模式
摘要
Now that we’ve taken a look at the kind of control that the Spectrum’s BASIC gives us over the hardware, it’s time to dip down into machine language and see what is offered to us there. There’s quite ...
the
that
and
was
Spectrum
quite
this
The
bit
also
2026-08-04
1 阅读
约6分钟阅读
rbanffy
字号:
现在我们已经了解了 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 中不同的 LOAD 和 BLOAD 命令。要从磁带加载机器代码,我们将关键字 CODE 放在文件名后面。 BASIC 可以通过向 CLEAR 命令传递参数来限制其内存使用。通过将 BASIC 内存顶部降低到机器代码加载点以下,内存冲突应该是完全可以避免的。 BASIC 使用 USR 函数调用机器代码子例程。这将例程的地址作为其参数;例程完成其工作,然后使用 RET 指令返回到 BASIC。 BC 寄存器对的值作为 16 位无符号整数的函数值返回到 BASIC。没有有意义的返回值的例程通常通过将其传递给随机数生成器来处理它:Sinclair BASIC 中的 RANDOMIZE USR 完成的任务与 C64 BASIC 中的 SYS 大致相同。除了保存二进制数据范围之外,SAVE 函数还可以保存 BASIC 程序,使其在 LOAD 后立即开始运行,并且允许您从任意行号开始执行。早在 2017 年,我就为我的 Spectrum 程序创建了一个更复杂的 BASIC 存根,从那时起我就一直使用它。一般策略是这样的:保存 BASIC 程序,以便它在第 30 行而不是第 10 行开始执行。第 30 行的代码使用 CLEAR 命令限制 BASIC 的内存,然后将磁带上的下一个文件(我们的实际程序)作为二进制加载。一旦加载完成,它就会跳到程序的顶部。第 10 行和第 20 行使用 RANDOMIZE USR 调用加载的机器代码,然后跳过加载器逻辑以使程序正常退出。
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱