Raspberry PiでCP/M
2018年9月、懐かしいCP/MをRaspberry Pi2で実行しました。
CP/M(Control Program for Microcomputer)は、デジタルリサーチ社が開発したIntel8080プロセッサー用のオペレーティングシステム(OS)です。1976年に発売されたので、現在(2018年)から42年も昔のOSです。
以前に、Altair 8800 simulatorを使用してCP/MをWindowsで実行しました。このシミュレーターは、SIMHシミュレーターを使用してi8080/Z80をシミュレートすることによりCP/Mが動作します。
今回は、Raspberry PiでSIMHシミュレーターを実行することによりCP/Mの実行ができました。
SIMHとは
SIMHとは、「The Computer History Simulation Project」による移植性の高いマルチシステムシミュレーターです。
SIMH is a highly portable, multi-system simulator.
SimH (History Simulator) is a loose Internet-based collective of people interested in restoring historically significant computer hardware and software systems by simulation.
The goal of the project is to create highly portable system simulators and to publish them as freeware on the Internet, with freely available copies of significant or representative software.
【要約】SIMHは移植性の高いマルチシステムシミュレーターです。
SimH(History Simulator)は、シミュレーションによって歴史的に重要なコンピューターハードウェアとソフトウェアシステムを復元することに関心を持つ、インターネットベースの自由な集団です。このプロジェクトの目的は、可搬性の高いシステムシミュレーターを作成し、インターネットでフリーウェアとして公開し、重要または代表的なソフトウェアの自由に入手できるコピーを公開することです。
- SIMH (V3.10-0 RC1) updated 01-Jun-2018.
- PDF copies of the documentation
コンピューター史上で貴重なソフトウェアシステムをシミュレーションによって復元することを目的としています。DEC社のPDPシリーズなど貴重なソフトウェア資産が残っていますが、ソフトウェアを実行するハードウェアは現存しなくなりました。そのソフトウェア資産を復活させるために、SIMHシステムシミュレーターが開発されました。SIMHシミュレーターは、DEC社のPDPシリーズやVAX、MITS Altair 8800(with 8080/Z80)など、いろいろなシステムが含まれます。
ソフトウェア技術者にとって触れたことも無いシステムの体験や、懐かしいシステムを利用できます。とてもすばらしいプロジェクトです。
現在の最新リリースは、SIMH (V3.10-0 RC1)updated 01-Jun-2018です。
SIMH(Altair 8800 simulator)インストール
Raspberry Pi2のOSはRaspbianです。システム情報とバージョンを下記に示します。
$ uname -a Linux pi2 4.14.62-v7+ #1134 SMP Tue Aug 14 17:10:10 BST 2018 armv7l GNU/Linux
$ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 9.4 (stretch) Release: 9.4 Codename: stretch
Raspberry Pi2にSIMH(Altair 8800 simulator)をインストールします。
ソースコードをダウンロードしてLinuxでビルドします。
ホームディレクトリーに~/MyHome/simh/ディレクトリーを作成して、ソースコードをダウンロードして展開します。
$ cd MyHome/simh/ $ wget -c https://github.com/simh/simh/archive/master.zip : `master.zip' に保存中 : YYYY-MM-DD hh:mm:ss (3.18 MB/s) - `master.zip' へ保存終了 [12828482] $ unzip master.zip Archive: master.zip 2d35feb973a6e174e6b6deff438cd534b9218bb7 creating: simh-master/ : creating: simh-master/ALTAIR/ inflating: simh-master/ALTAIR/altair.txt inflating: simh-master/ALTAIR/altair_cpu.c inflating: simh-master/ALTAIR/altair_defs.h inflating: simh-master/ALTAIR/altair_dsk.c inflating: simh-master/ALTAIR/altair_sio.c inflating: simh-master/ALTAIR/altair_sys.c creating: simh-master/AltairZ80/ inflating: simh-master/AltairZ80/altairz80_cpu.c inflating: simh-master/AltairZ80/altairz80_cpu_nommu.c inflating: simh-master/AltairZ80/altairz80_defs.h inflating: simh-master/AltairZ80/altairz80_doc.pdf inflating: simh-master/AltairZ80/altairz80_dsk.c inflating: simh-master/AltairZ80/altairz80_hdsk.c inflating: simh-master/AltairZ80/altairz80_mhdsk.c inflating: simh-master/AltairZ80/altairz80_net.c inflating: simh-master/AltairZ80/altairz80_sio.c inflating: simh-master/AltairZ80/altairz80_sys.c inflating: simh-master/AltairZ80/disasm.c inflating: simh-master/AltairZ80/flashwriter2.c inflating: simh-master/AltairZ80/i8272.c inflating: simh-master/AltairZ80/i8272.h inflating: simh-master/AltairZ80/i86.h inflating: simh-master/AltairZ80/i86_decode.c inflating: simh-master/AltairZ80/i86_ops.c inflating: simh-master/AltairZ80/i86_prim_ops.c inflating: simh-master/AltairZ80/insns.h inflating: simh-master/AltairZ80/insnsd.c inflating: simh-master/AltairZ80/m68k.h inflating: simh-master/AltairZ80/m68kconf.h inflating: simh-master/AltairZ80/m68kcpu.c inflating: simh-master/AltairZ80/m68kcpu.h inflating: simh-master/AltairZ80/m68kdasm.c inflating: simh-master/AltairZ80/m68kopac.c inflating: simh-master/AltairZ80/m68kopdm.c inflating: simh-master/AltairZ80/m68kopnz.c inflating: simh-master/AltairZ80/m68kops.c inflating: simh-master/AltairZ80/m68kops.h inflating: simh-master/AltairZ80/m68ksim.c inflating: simh-master/AltairZ80/m68ksim.h inflating: simh-master/AltairZ80/mfdc.c inflating: simh-master/AltairZ80/mfdc.h inflating: simh-master/AltairZ80/n8vem.c inflating: simh-master/AltairZ80/nasm.h inflating: simh-master/AltairZ80/s100_64fdc.c inflating: simh-master/AltairZ80/s100_adcs6.c inflating: simh-master/AltairZ80/s100_disk1a.c inflating: simh-master/AltairZ80/s100_disk2.c inflating: simh-master/AltairZ80/s100_disk3.c inflating: simh-master/AltairZ80/s100_fif.c inflating: simh-master/AltairZ80/s100_hdc1001.c inflating: simh-master/AltairZ80/s100_if3.c inflating: simh-master/AltairZ80/s100_mdriveh.c inflating: simh-master/AltairZ80/s100_mdsa.c inflating: simh-master/AltairZ80/s100_mdsad.c inflating: simh-master/AltairZ80/s100_scp300f.c inflating: simh-master/AltairZ80/s100_selchan.c inflating: simh-master/AltairZ80/s100_ss1.c inflating: simh-master/AltairZ80/vfdhd.c inflating: simh-master/AltairZ80/vfdhd.h inflating: simh-master/AltairZ80/wd179x.c inflating: simh-master/AltairZ80/wd179x.h : $
PDP11、VAX、Altairなどいろいろなプロセッサーのシミュレーターソースコードを展開しました。
展開したディレクトリーの中に、ネットワークに関するドキュメント(0readme_ethernet.txt)があります。
This file contains information about the SIMH Ethernet package.
このファイルには、SIMHイーサネットパッケージに関する情報が含まれています。
ドキュメントに従って前提条件パッケージを最初にインストールします。
$ sudo apt-get install make $ sudo apt-get install libpcap-dev $ sudo apt-get install bridge-utils $ sudo apt-get install uml-utilities
Altair用のシミュレーター(altairz80)をビルドします。
$ ls master.zip simh-master $ cd simh-master/ $ make clean lib paths are: /lib/ /lib/arm-linux-gnueabihf/ ... : : rm -f -r BIN/ $ make altairz80 lib paths are: /lib/ /lib/arm-linux-gnueabihf/ ... : : $ cd BIN $ ls altairz80 $
./BIN/altairz80を生成しました。
Altairシミュレーターを実行するターゲットディレクトリー(~/MyHome/exAltair/)をセットアップします。生成したaltairz80をターゲットディレクトリーにコピーします。
$ mkdir ~/MyHome/exAltair/ $ cp ./BIN/altairz80 ~/MyHome/exAltair/ $ cd ~/MyHome/exAltair/ $ chmod +x ./altairz80 $
Altairシミュレーターのバイナリーの準備ができました。
CP/Mの入手
AltairでCP/Mを実行するために、CP/Mを入手します。
SIMHを使用してCP/Mが動作する「Altair 8800 simulator」を公開しているWEBサイトがあります。
このサイトでは、Windows用/Macintosh (OS X)用/Linux (Intel x86)用などのAltairシミュレーターのバイナリーとCP/M2.2を公開しています。
以前にWindowsでCP/Mを実行したときに利用しました。今回は、CP/M2.2だけをダウンロードします。
ターゲットディレクトリーにCP/Mをインストールします。
$ cd ~/MyHome/exAltair/ $ wget -c https://schorn.ch/cpm/zip/cpm2.zip `cpm2.zip' に保存中 : : YYYY-MM-DD hh:mm:ss (386 KB/s) - `cpm2.zip' へ保存完了 [648142/648142] $ ls altairz80 cpm2.zip $ unzip cpm2.zip Archive: cpm2.zip inflating: 128sssd.imd inflating: app.dsk inflating: appleiicpm.dsk inflating: cpm2 inflating: cpm2.dsk inflating: cpm2_imd inflating: i.dsk $ ls 128sssd.imd app.dsk cpm2 cpm2.zip cpm2sio altairz80 appleiicpm.dsk cpm2.dsk cpm2_imd i.dsk $
Altair 8800 simulatorの実行
Altairシミュレーターを実行します。コマンドの引数にcpm2を指定します。
$ ./altairz80 cpm2
Altair 8800 (Z80) simulator V4.0-0 Currentが起動して、CP/M Version 2.2 が起動します。SIMHシミュレーターのバージョンは V3.10-0 RC1でしたが、V3.9の次なのでV4.0と表示されました。
カレントドライブは、Aドライブです。CP/Mのビルドインコマンドdirで、Jドライブのディレクトリーを見るとMBASICが入っています。
haltコマンドを入力すると、CP/Mの実行を終了してシミュレーターコマンドレベルになります。
A>halt HALT instruction, PC: 00100 (HALT) sim>
シミュレーターコマンドで 「quit」と入力するとシミュレーターを終了し、コマンドプロンプトレベルとなります。
sim> quit Goodbye pi@pi2:~/MyHome/exAltair $
CP/Mのhaltコマンドでシミュレーターを終了しましたが、CP/Mコマンド入力時にCTRL+Eを入力するとCP/Mを中断してシミュレーターコマンド待ちとなります。goコマンドでCP/Mを再開します。
引数で指定したcpm2は、シミュレーターコマンドにより実行環境を設定します。
例えば、attachコマンドでディスクを割り付けて、reset cpuコマンドでリセットし、boot dskコマンドでブートします。
d tracks[0-7] 254 attach dsk0 cpm2.dsk attach dsk1 app.dsk attach hdsk0 i.dsk ;;demo how to use other disk formats in CP/M 2 ;;it will mount as drive J: attach hdsk1 appleiicpm.dsk set hdsk1 format=apple-d2 set cpu 64k set cpu noitrap set cpu z80 set cpu altairrom set cpu nonbanked reset cpu set sio ansi set sio nosleep boot dsk
SIMHのコマンドの説明は、ここを参照してください。
ワードマスターを使う
Raspberry Pi2にTera Termからssh接続して、CP/Mを起動しています。Tera TermはVT100互換のターミナルなので、そのままワードマスターを使用できました。
ワードマスターのコマンドは、ここを参照してください。
A>wm MicroPro WORDMASTER release 5.55A serial # KF2222KF COPYRIGHT (C) 1978 MICROPRO INTERNATIONAL CORPORATION NO FILE NAME A>
CTRL+Jで、HELP画面を表示します。
WindowsでCP/Mを実行したときは、DOSコマンドプロンプトからCP/Mを起動していました。VT100互換のターミナルから接続するために、SIOの設定でコンソールIOをTelnet接続ポート23経由にしました。
今回はVT100互換のターミナルでLinuxに接続してCP/Mを実行したため、SIOの設定は不要となったわけです。
ネットワークからCP/Mを使う
SIOを設定して、コンソールIOをTelnet接続ポート23経由にします。シミュレーターコマンドcpm2sioを作成します。
$ cat cpm2sio d tracks[0-7] 254 attach dsk0 cpm2.dsk attach dsk1 app.dsk attach hdsk0 i.dsk ;demo how to use other disk formats in CP/M 2 ;it will mount as drive J: attach hdsk1 appleiicpm.dsk set hdsk1 format=apple-d2 set cpu 64k set cpu noitrap set cpu z80 set cpu altairrom set cpu nonbanked reset cpu set sio ansi set sio nosleep attach sio 23 boot dsk
cpm2sioを引数に与えてAltairシミュレーターを実行します。
$ ./altairz80 cpm2sio
$ ./altairz80 cpm2sio Altair 8800 (Z80) simulator V4.0-0 Current git commit id: 2d35feb9 Sockets: bind error 13 - Permission denied cpm2sio-17> attach sio 23 Can't open network port: 23 64K CP/M Version 2.2 (SIMH ALTAIR 8800, BIOS V1.27, 2 HD, 02-May-2009) A> ← CTRL+Eを押して中断 Simulation stopped, PC: 0F3FA (RRA) sim> quit Goodbye
コマンド「attach sio 23」でエラーが発生しました。アクセス権限(Permission denied)でエラーとなり、ネットワークOpenに失敗しました。
CP/Mがコンソールで起動したので、CTRL+Eで中断し、quitコマンドで終了します。
アクセス権限が無いというエラーなので、管理者権限で実行してみます。
$ sudo ./altairz80 cpm2sio Altair 8800 (Z80) simulator V4.0-0 Current git commit id: 2d35feb9 cpm2sio-17> attach sio 23 Listening on port 23
ネットワークのポート23待ちとなりました。
Tera TermからTelnet接続します。
接続先(IPアドレス)は、Raspberry Piのホスト名を指定します。
Connected to the Altair 8800 (Z80) simulator SIO device, line 0 64K CP/M Version 2.2 (SIMH ALTAIR 8800, BIOS V1.27, 2 HD, 02-May-2009) A>
ネットワークからCP/Mに接続しました。
CP/Mはhaltコマンドにより停止します。
A> halt
$ sudo ./altairz80 cpm2sio Altair 8800 (Z80) simulator V4.0-0 Current git commit id: 2d35feb9 cpm2sio-17> attach sio 23 Listening on port 23 → telnetでCP/M実行 HALT instruction, PC: 00100 (HALT) sim>
シミュレーターが停止しました。
この様子を下記に示します。
最後に
Raspberry Pi2にSIMH(Altair 8800 simulator)をインストールして、懐かしのCP/Mが動作しました。
昔CP/Mを使用したときは、RS-232CでターミナルとCP/M PCを接続していました。現在では、RS-232Cの代わりにtelnet接続してRaspberry Piで動作するCP/Mをネットワークから使用できるようになったわけです。
もう少し、遊んでみようと思います。
関連するブログ