現代のコンピュータには「テキストアドベンチャー」をプレイするための洗練された方法が数多くありますが、愛好家は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はメモリや特定のハードウェアインターフェースが限られたマイクロコンピュータ向けに設計されていたため、エミュレータはOSが起動しバイナリを実行できる環境を再現する必要があります。

セットアップには、コアエミュレータとサポートツールのソースからのビルドが含まれます。機能した後は、システムを初期化してコマンドプロンプトを提供する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`コマンドで更新されると、ユーザーはゲームを実行できます。その結果、ゲームのテキスト出力がホストのターミナルに直接渡され、ヴィンテージのマイクロコンピュータの体験を模倣する機能的な環境が構築されます。

Zork 1を実行するためのコードリストとターミナル出力を示すスクリーンショット。
エミュレートされた環境内でのZork 1の実行を示すターミナルインターフェース。kevinboone.me

このスクリーンショットは、ゲームのテキスト出力がホストターミナルに渡される機能的な環境を例示しています。

トレードオフと現代的な代替手段

この方法の主なトレードオフは複雑さです。現代的な手法は大幅に簡単であるため、特にZorkのためにCP/Mエミュレータを使用する実用的な理由はありません。エミュレータは主に教育目的、またはレトロコンピューティングアーキテクチャへの深い習熟のために使用されます。

cpmulatorのような新しいプロジェクトは、ローカルファイルシステムとやり取りするGoベースのエミュレータを使用することで、より合理的な体験を提供します。これにより複雑な仮想ディスク管理の必要性はなくなりますが、物理的なトラックやセクタを参照するAPI呼び出しに対する完全なディスクサポートを欠く可能性があります。

Hacker Newsの読者の反応

  • 代替案: あるコメント投稿者は、LinuxおよびBSDシステムでこれらの種類のゲームをプレイする方法としてFrotzエミュレータを使用することを提案しました。 コメント ↗
  • 代替案: 別のユーザーは、仮想ディスクの代わりにローカルファイルシステムを使用する、自身で開発したGoベースのCP/Mエミュレータを共有し、Dockerを介してソフトウェアを実行する方法を提示しました。 コメント ↗
  • 体験談: ある読者は、学部生として勉強していた際にDECSYSTEM-2060でZorkをプレイした個人的な経験を共有しました。 コメント ↗

Hacker Newsのスレッドで出た意見の要約です。事実として検証されたものではありません。 議論の全文を読む ↗