Linux上のCP/MエミュレータでZork 1をプレイする (2021年)
Playing Zork 1 on a CP/M emulator on Linux (2021) (kevinboone.me)
要約
この記事では、Linux上でz80pack Z80エミュレータを使用してCP/Mを実行し、そのCP/M環境でテキストアドベンチャーゲーム「Zork 1」をプレイする方法を解説しています。z80packのインストール、CP/Mツールのセットアップ、仮想ディスクの作成、そしてZork 1の実行手順をコマンドライン操作を中心に説明しています。実用的な目的ではなく、CP/Mへの理解を深めるためのガイドです。
全文翻訳
Linux上のCP/MエミュレータでZork 1をプレイする
[画像: Z80の写真]この記事は、z80pack Z80エミュレータを使用してLinux上でCP/Mを実行し、その後CP/M実装を使用してZork 1を実行することについてです。この例としてZork 1を選んだのは、非自明なプログラムでありながら、プレーンテキストの入出力のみを使用するためです。WordStarのようなものを実行する方がより説明的かもしれませんが、それは私がこの簡単な例では触れたくないターミナル関連の問題を引き起こします。ただし、記事の最後にこのトピックについて議論します。
注意:
CP/Mエミュレータを使用してZorkをプレイする実用的な理由は全くありません。もしプレイしたいのであれば、現代のコンピューターでZorkをプレイする方がはるかに良い方法がたくさんあります。CP/Mエミュレータを使用する理由—おそらく唯一の理由—は、Z80ベースのレトロコンピューターの構築を視野に入れて、CP/M全般に慣れることです。
Zorkは、今日「インタラクティブフィクション」と呼ばれるものの初期の例ですが、すべてのコンピューティングがテキストベースだった時代には「テキストアドベンチャー」として知られていました。Zorkは、「take axe」や「look at box」のような簡単な指示を、本質的にパズル解決演習であるものへの入力として受け入れます。CP/Mは初期のオペレーティングシステムで、元々はフロッピーディスクドライブを備えたマイクロコンピューター向けでしたが、最終的には初期のハードディスクにも対応しました。50歳未満のほとんどの人は、CP/Mが最新かつ最高だった頃の使用を覚えていませんが、その遺産は、CP/Mに触発されたMS-DOSに生き続けています。
CP/Mは元々8080マイクロプロセッサ用に開発されましたが、Z80でより広く使用されました。LinuxでCP/Mを実行するには、おそらく最も簡単なアプローチはZ80エミュレータを使用することです。
この記事では、Linux用のz80packといくつかのCP/Mツールの取得とビルド方法、Zorkファイルを保存するための仮想ディスクの設定方法、そしてCP/Mコマンドプロンプトからプログラムを実行する方法の概要を説明します。
Linuxに精通しており、コマンドラインツールを扱う意欲があることを前提としています。また、CP/Mが何であるかについて少なくともいくらかの知識があることを前提としています。
z80packのインストール
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のビルドとインストール
cpmtoolsはCP/Mディスクイメージを管理するためのユーティリティセットです。ディスクイメージの内容をリストしたり、ファイルを送受信したりできます。プログラムファイルとデータをホストシステムからCP/Mにコピーするためにこれが必要になります。
cpmtoolsはさまざまなLinuxリポジトリで利用可能ですが、私の(Fedora 31)システムのレポジトリバージョンは信頼性高く動作しないことがわかりました。しかし、ソースからビルドするのは簡単です。
ソースをダウンロードします。アーカイブを展開し、./configure、次にmake、そしてsudo make installを実行します。デフォルトのインストール先は/usr/local/binですが、これは$PATHに含まれている場合とそうでない場合があります。
z80packのディスク処理方法
z80packは、ほとんどの仮想化ソフトウェアと同様に、ファイルを(イメージとして)物理ディスクを表します。ファイルは、ある意味で物理ディスクの構造を表す構造を持っているため、それらを操作するツール(つまり、cpmtoolsパッケージのユーティリティ)は物理ディスク構造を知る必要があります。cpmtoolsユーティリティは、デフォルトで720kB、8インチフロッピーディスクを想定しています—これは多くの目的で問題ありません。実際、Zork 1を実行するのにも問題ありませんが、それでもハードディスクイメージを作成する方法を説明します。なぜなら、いつか必要になる可能性が高いからです。
cpmsimはデフォルトで"./disks"ディレクトリ内のディスクイメージを探します。つまり、カレントワーキングディレクトリからの相対パスでディレクトリを探します。基本的に、フロッピードライブA:からD:、およびハードディスクI:とP:の6つのディスクデバイスをサポートしています。これらのディスクのイメージをdrivea.dsk、driveb.dskなどのファイルとして見つけることを期待しています。これらのイメージファイルがすべて存在しない場合でも、cpmsimは起動します—単にメディアがドライブにないかのように応答します。
CP/M 3を起動するために最低限必要なのは、ドライブA:としてのdisks/library/cpm3-1.dskイメージです。しかし、CP/Mセットの2番目のディスクには、ドライブB:に割り当てられた便利なユーティリティがいくつかあります。したがって:
$ cp disks/library/cpm3-1.dsk disks/drivea.dsk
$ cp disks/library/cpm3-2.dsk disks/driveb.dsk
これで./cpmsimを実行できるようになり、ドライブA:とB:のみが利用可能であることがわかります。
ドライブI:として機能する4MBのハードディスクを作成しましょう(CP/M-3は実際には最大500MBをサポートしますが、この例では4MBで十分です)。
$ /usr/local/bin/mkfs.cpm -fz80pack-hd disks/drivei.dsk
このコマンドでは、z80pack-hdは/usr/local/share/diskdefsファイルに格納されている物理ディスクパラメータのセットを参照します。このパラメータを省略すると、720kBのフロッピーディスクイメージが作成されます。
Zork 1プログラムファイルの取得とインストール
すべてのオリジナルのInfocomゲームと同様に、Zorkシリーズは一種の法的曖昧な状態にあり、おそらく少なくともあと10年はそうであり続けるでしょう。知的財産権が現在誰にあるのか、そしてどのような再配布条件が存在するのかは不明確です。したがって、Zork 1のCP/Mバージョンを入手するのは簡単ですが、「公式」ソースはなく、私も自分でホストするつもりはありません。私のコピーはここから入手しました。
Zork 1のCP/Mバージョンは、バイナリZORK1.COMとデータファイルZORK1.DATの2つのファイルで構成されています。データファイルは実際にはz-machineプログラムであり、frotzのようなさまざまな代替z-machineエミュレータを使用して再生できます。これらの2つのファイルは、次のように同じディスクイメージに配置する必要があります。
$ /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コマンドプロンプトはDELに応答して文字を消去しますが、Zork 1はより伝統的な「Ctrl-H」(ASCII 8)を必要とします。文字を削除するために明示的に「Ctrl-H」を入力することはまだ可能ですが、バックスペースキーが実際にCtrl-Hを生成するようにターミナルを設定する方がエレガントです。Gnomeターミナルでは、関連する設定はプロファイル設定ページの「互換性」タブにあります。他のターミナルやターミナルエミュレータには、この設定を変更するための他の方法があります。
この変更を行った後、Linuxターミナルインフラストラクチャに新しいキーマッピングを通知する必要があるでしょう。そうしないと、バックスペースキーはZork内以外ではどこでも機能しません。そのために:
$ stty erase ^H
Linuxシェルは通常通り機能するはずですが、バックスペースキーは異なるコードを生成します。これで、Zork 1を実行するのは非常に簡単になります。
$ ./cpmsim
...
...
A> i:
I> zork1
ZORK I: The Great Underground Empire
Copyright 1982 by Infocom, Inc.
All rights reserved.
ZORK is a trademark of Infocom, Inc.
Release 25 / Serial number 000000
West of House
You are standing in an open field west of a white house, with
a boarded front door.
There is a small mailbox here.
>open mailbox
Opening the mailbox reveals a leaflet.
>read leaflet
(Taken)
WELCOME TO ZORK
ZORK is a game of adventure, danger, and low cunning. In
it you will explore some of the most amazing territory ever
seen by mortals.
No computer should be without one!
Copyright 1982 by Infocom, Inc.
All rights reserved.
ZORK is a trademark of Infocom, Inc.
…そして、始めましょう。
CP/Mでのさらなる冒険
CP/Mはその時代に非常に人気のあるオペレーティングシステムであり、それ用の膨大な量のソフトウェアが入手可能です。Zorkゲームと同様に、その多くは法的に不確かな状態にあります。しかし、ソフトウェアは入手しやすく、「abandonware」として、個人的および教育目的での使用は誰かを不快にさせる可能性は低いでしょう。
CP/Mの「キラーアプリ」はWordStarであり、この基本的なワードプロセッサはまだ入手可能で、驚くほど広く使用されています。もう一つの名誉ある言及は、BorlandのTurbo Pascalです—驚くほど優れたコンパイラで、Z80がアドレス指定できる限られたRAM(64k)を回避するためにさまざまなトリックを使用しました。
これらのアプリケーションはすべてラインベースではなく、スクリーンベースです。それらを実行すると、ターミナル処理に関連する複雑さが生じます。CP/Mアプリケーションでターミナル出力を行う普遍的な方法はありませんでした—各アプリケーションは独自の準備をしていました。z80packはターミナルを提供しません—単にCP/Mプログラムからの出力をそれをホストしているターミナルに渡すだけです。ほとんどのLinuxターミナルエミュレータは、大まかにVT100ライクであり、CP/MソフトウェアをVT100またはVT52ターミナルを使用するように設定すると、おそらく合理的な結果が得られるでしょう。
このページに応答して何か投稿しましたか?
このページを参照しているブログやページのURLを教えて、webmentionを送信してください。