虽然现代计算机提供了许多简便的方法来游玩“文字冒险”游戏,但爱好者仍可以通过 Linux 上的 CP/M 模拟器运行 Zork 1,体验到启发了 MS-DOS 的原始操作系统环境。这一过程需要使用 z80pack 等专门的模拟工具,来架起现代硬件与 Z80 微处理器架构之间的桥梁。

一张 Zilog Z80 微处理器芯片的特写照片。
Z80 微处理器架构是 CP/M 操作系统的基础。kevinboone.me

文章解释了 CP/M 是如何为使用 Z80 架构的微型计算机设计的。

CP/M 模拟的架构

要在 Linux 上运行 CP/M,最常用的方法是使用像 z80pack 这样的 Z80 模拟器。由于 CP/M 是为具有有限内存和特定硬件接口的微型计算机设计的,模拟器必须重建操作系统能够启动并执行二进制文件的环境。

设置过程包括从源代码构建核心模拟器和支持工具。一旦功能就绪,系统还需要一个磁盘镜像库来提供必要的启动文件,例如 CP/M 3 镜像,它允许系统初始化并提供命令行提示符。

“完全没有任何实际理由使用 CP/M 模拟器来玩 Zork。”

— Kevin Boone: Playing Zork 1 on a CP/M emulator on Linux

管理虚拟磁盘和用户区域

与现代操作系统不同,CP/M 磁盘不支持子目录。相反,它们利用编号的“用户区域”来组织文件。要运行 Zork 1,必须将二进制文件 (ZORK1.COM) 及其数据文件 (ZORK1.DAT) 复制到虚拟磁盘镜像的默认用户区域(区域零)中。

用户可以创建不同类型的虚拟驱动器,例如用于驱动器 I: 的 4Mb 硬盘镜像。可以使用 cpmtools 等工具来管理这些镜像,允许用户列出内容并在主机系统与模拟环境之间复制文件。

CP/M 磁盘和内存规格: 标准软盘 720kB; 硬盘示例 4Mb; 最大 CP/M-3 硬盘 500Mb
CP/M 磁盘和内存规格kevinboone.me

由 HN Digest 根据 kevinboone.me 报告的数据绘制;数值与源文件一致。

终端兼容性和输入处理

一个特定的技术障碍涉及“退格”键。现代 Linux 终端通常生成 DEL 代码(ASCII 127),但 Zork 1 需要传统的“ctrl-h”(ASCII 8)代码来擦除字符。这需要配置终端模拟器以正确映射退格键。

一旦配置好终端并使用 `stty erase` 命令更新 shell,用户就可以执行游戏。结果是一个功能齐全的环境,游戏的文本输出直接传递到主机的终端,模拟了复古微型计算机的体验。

一张显示运行 Zork 1 的代码列表和终端输出的截图。
一个演示在模拟环境中执行 Zork 1 的终端界面。kevinboone.me

此截图展示了游戏文本输出传递到主机终端的功能环境。

权衡与现代替代方案

这种方法的首要权衡是复杂性;专门为了 Zork 而使用 CP/M 模拟器并没有实际理由,因为现代方法要简单得多。该模拟器主要用于教育目的或为了建立对复古计算架构更深入的了解。

较新的项目如 cpmulator 提供了一种更简化的体验,它使用基于 Go 的模拟器与本地文件系统交互。虽然这消除了对复杂虚拟磁盘管理的需求,但它可能缺乏对任何引用物理轨道或扇区的 API 调用提供完整的磁盘支持。

Hacker News 读者的反应

  • 替代方案: 一位评论者建议使用 Frotz 模拟器作为在 Linux 和 BSD 系统上玩这类游戏的方法。 评论 ↗
  • 替代方案: 另一位用户分享了他们开发的基于 Go 的 CP/M 模拟器,该模拟器使用本地文件系统而非虚拟磁盘,提供了一种通过 Docker 运行软件的方法。 评论 ↗
  • 亲身经验: 一位读者分享了他们在本科学习期间在 DECSYSTEM-2060 上玩 Zork 的个人经历。 评论 ↗

以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗