在 Linux 上通过 CP/M 模拟器运行 Zork 1
来源标题:Playing Zork 1 on a CP/M emulator on Linux (2021)
文章介绍如何用 z80pack Z80 模拟器在 Linux 上运行 CP/M,再借助 CP/M 运行 Zork 1。作者选 Zork 1 是因为它是纯文本输入输出的非简单程序,可避开 WordStar 那类终端相关问题。
以下正文由 AI 翻译自 Hacker News(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
本文介绍如何使用 z80pack 这个 Z80 模拟器在 Linux 上运行 CP/M,然后再借助这个 CP/M 实现来运行 Zork 1。我之所以选 Zork 1 作为示例,是因为它是一个不算简单的程序,却只用到纯文本的输入和输出。运行 WordStar 之类的软件可能更有说明性,但那会带来与终端相关的问题,而我不想在这个简单的示例里牵扯这些。不过,我会在文章末尾讨论这个话题。
Zork 是如今被称为"互动小说"、而在所有计算都还是文本形式的年代被称为"文字冒险"的早期例子。Zork 接受"take axe"和"look at box"这样的简单指令作为输入,本质上是一个解谜练习。
CP/M 是一个早期的操作系统,最初面向配有软驱的微型计算机,后来也用于早期的硬盘。如今 50 岁以下的人几乎不记得 CP/M 如日中天的样子,但它的遗产在受它启发的 MS-DOS 中延续了下来。
CP/M 最初是为 8080 微处理器开发的,但与 Z80 搭配使用得更为广泛。要在 Linux 上运行 CP/M,最简单的办法大概是使用一个 Z80 模拟器。
本文将概述如何获取并构建 z80pack 和一些用于 Linux 的 CP/M 工具、如何建立虚拟磁盘来存放 Zork 文件,以及如何从 CP/M 命令提示符运行该程序。
我假定你熟悉 Linux,并且愿意使用命令行工具。我还假定你至少对 CP/M 是什么略知一二。
我认为 z80pack 并不常出现在标准的 Linux 软件仓库中——即便有,也可能不是最新版本。你需要下载源码并构建它。
把源码解压到任意方便的目录。我使用的是 $HOME/lib/z80pack-1.37。
$ cd ~/lib/z80pack-1.37/cpmsim/srcsim $ make -f Makefile.linux
编译配套工具:
$ cd ~/lib/z80pack-1.37/cpmsim/srctools $ make -f Makefile.linux
通过启动 CP/M 3 来测试安装是否基本可用:
$ cd ~/lib/z80pack-1.37/cpmsim $ ./cpm3
注意,cpm3 只是一个脚本,它先从磁盘映像库中复制相关磁盘(详见下文),然后运行 ./cpmsim。
cpmtools 是一套用于管理 CP/M 磁盘映像的工具。它可以列出磁盘映像的内容,并在映像与主机之间复制文件。我们需要用它把程序文件和数据从宿主系统复制到 CP/M 中。
cpmtools 在各种 Linux 仓库中都有,但我发现我的系统(Fedora 31)仓库中的版本无法稳定工作。不过从源码构建很容易。
下载源码。解压归档,运行 ./configure,然后 make,再 sudo make install。默认安装到 /usr/local/bin,这个目录可能在也可能不在你的 $PATH 中。
z80pack 像大多数虚拟化软件一样,用文件(映像)来表示物理磁盘。这些文件的结构在某种意义上是对物理磁盘的表示,因此操作它们的工具(也就是 cpmtools 包中的工具)需要了解物理磁盘的结构。cpmtools 中的工具默认假定是 720kB 的 8 英寸软盘——这对许多用途来说足够了。事实上,运行 Zork 1 用它就够了,但我还是打算说明如何创建硬盘映像,因为你很可能在某个时候会需要。
cpmsim 默认在"./disks"目录中查找磁盘映像。也就是说,它查找的是相对于当前工作目录的一个目录。它基本上支持六个磁盘设备:软驱 A: 到 D:,以及硬盘 I: 和 P:。它期望以 drivea.dsk、driveb.dsk 等文件的形式找到这些磁盘的映像。如果这些映像文件没有全部存在,cpmsim 仍然会启动——只是会表现得像驱动器中没有介质一样。
启动 CP/M 3 至少需要把 disks/library/cpm3-1.dsk 作为 A: 盘的映像。不过,CP/M 套装的第二张盘上有一些有用的工具,要放到 B: 盘。所以:
$ cp disks/library/cpm3-1.dsk disks/drivea.dsk $ cp disks/library/cpm3-2.dsk disks/driveb.dsk
现在你应该可以运行 ./cpmsim 了,你会发现只有 A: 和 B: 盘可用。
我们来创建一个 4Mb 的硬盘作为 I: 盘(CP/M-3 实际上最高支持 500Mb,但对这个示例来说 4Mb 绰绰有余)。
$ /usr/local/bin/mkfs.cpm -fz80pack-hd disks/drivei.dsk
在这个命令中,z80pack-hd 指的是一组物理磁盘参数,存放在文件 /usr/local/share/diskdefs 中。省略这个参数将创建一个 720kB 的软盘映像。
与所有原版 Infocom 游戏一样,Zork 系列处于一种法律上的灰色地带,而且很可能至少在未来十年内继续如此。目前不清楚谁拥有这项知识产权,也不清楚是否存在任何再分发条款。因此,尽管很容易弄到 CP/M 版的 Zork 1,但并没有"官方"来源,我也不会自己托管它。我的副本是从这里获取的。
CP/M 版的 Zork 1 由两个文件组成:二进制文件 ZORK1.COM 和数据文件 ZORK1.DAT。数据文件实际上是一个 z-machine 程序,可以用 frotz 等各种替代的 z-machine 模拟器来玩。这两个文件需要放入同一个磁盘映像,像这样:
$ /usr/local/bin/cpmcp -fz80pack-hd disks/drivei.dsk ZORK1.COM 0: $ /usr/local/bin/cpmcp -fz80pack-hd disks/drivei.dsk ZORK1.DAT 0:
注意:CP/M 磁盘不支持子目录。取而代之的是编号的"用户区",可以在命令提示符下选择。在上面的命令中,我们复制到默认的用户区,即零区。
运行 Zork 1
有一个小麻烦与 cpmsim 中"退格"键的使用有关。一般来说,Linux 终端和终端模拟器在你按下退格键时会生成 DEL 码(ASCII 127)。CP/M 命令提示符会对
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。