PC-6000 シリーズで CP/M を


img
後追い記事です。
詳しい解説が他所にあるので「実際にやってみた」程度のレポートとしてご覧ください。



■ I/O 版 CP/M をつくる

何はともあれ、下記のサイトを一通り読まれることをお勧めします。
http://homepage2.nifty.com/akikawa/cpm.html (PC-6001mkII/6601 CP/M導入メモ)

アセンブラで AS をお使いの方、80x25 スクリーン版作成を目指す方はこちらのレポートも。
http://sbeach.seesaa.net/category/22105334-1.html (CPMの話(2))

とりあえず、I/O版を作るのに必要なものとしては以下の2点。

・I/O 誌 (工学社) 1984 年 2 月号
・CP/M 2.2 アセンブラソースファイル http://www.cpm.z80.de/source.htmlより、CP/M 2.2 ASM SOURCE 60K からダウンロード。

後者はいいとして前者ですが、筆者はネットで蔵書検索して運よく見つかったので実際に図書館で借りてきました。
検索する場合は全国的な検索よりも地域の図書館の蔵書検索の方が詳しく出るような気がします。(検索の仕方にもよるのかもしれませんが)
また、公共図書館と大学図書館などで検索対象が別になっている場合もあるので、根気よく調べると見つかるかも。
必要なページは 4 ページです。ダンプリストだけなら 2 ページ。

I/Oもスラッシュ「/」が中黒「・」になっていたり「アイオー」とカタカナだったり、「工学社」が著者なのか出版者なのか
よくわからないので、色々なパターンを試してみましょう。


で、借りてきたはいいものの…。
非常に見にくい、です。チェックサムがついているのですが、そのチェックサムが見えない。
まあそれでも縦横チェックサムがあるのと、リストが比較的短いので我慢しながら打ち込みます。
上に挙げた秋川さんのサイトにチェックサム表示ツール checksum.exe があるので、有難く使わせていただきます。

一応、CRC 等を記しておきます。

boot.bin ( 256bytes) CRC32 : B631407C  MD5 : 4ABC0547F98F09B5CFF2320BDB117E4C 
bios.bin (1,280bytes) CRC32 : FA203711  MD5 : 53325E0BA7115D045F3FCF1F1A33521B


さて、もう一つの CP/M ソースのコンパイルですが、アセンブラ AS を使っているので
上に挙げたえすびさんのサイトの注意事項を見ながらソースを修正します。ただし、80x25にはしないので MEM EQU の所は 49 にします。
('84/2月号しか見つけられなかったので、80x25化の記事は未入手なのです。)
この修正作業が結構面倒なので、差分ファイルを作ってみました。

cpmsrc_diff.zip 修正差分です。gnu-patch で元のソースから修正後のソースを生成できます。

http://gnuwin32.sourceforge.net/packages/patch.htm Patch for Windows

Binaries から zip をダウンロードします。zip から patch.exe を取り出し、CPM22.Z80 / cpmsrc.diff を同じフォルダに置きます。
続いて、コマンドラインから "patch < cpmsrc.diff" と入力します。

d:\>patch < cpmsrc.diff
can't find file to patch at input line 1
Perhaps you should have used the -p or --strp option? 
File to patch : cpm22.z80

パッチ対象のファイルを教えて、と言われるので"cpm22.z80"と入力します。成功すれば cpm22.z80 が修正されます。


AS でのアセンブル方法はえすびさんの所に書いてある通りです。

http://john.ccac.rwth-aachen.de:8000/as/ AS はこちら。

D:\>asw -cpu z80 cpm22.z80
macro assembler 1.42 Beta [Bld 87]
(i386-unknown-win32)
(C) 1992,2013 Alfred Arnold
Motorola MPC821 Additions (C) 2012 Marcin Cieslak
68RS08-Generator (C) 2006 Andreas Bolsch
Mitsubishi M16C-Generator also (C) 1999 RMS
XILINX KCPSM(Picoblaze)-Generator (C) 2003 Andreas Wassatsch 
TMS320C2x-Generator (C) 1994/96 Thomas Sailer
TMS320C5x-Generator (C) 1995/96 Thomas Sailer

assembling cpm22.z80
PASS 1[K
cpm22.z80(3746)[K
PASS 2[K
cpm22.z80(3746)[K

0.06 seconds assembly time[K

   3746 lines source file[K
      2 passes[K
      0 errors[K
      0 warnings[K

D:\>p2bin cpm22.p -l 0 -r $-$
P2BIN/C V1.42 Beta [Bld 87]
(C) 1992,2013 Alfred Arnold
cpm22.p==>>cpm22.bin  (5683 Bytes)


こんな感じでアセンブルが完了します。
5683 バイトのバイナリ cpm22.bin が出来たか確認しましょう。
cpm22.bin は cpm.bin にリネームしておきましょう。

cpm.bin / boot.bin / bios.bin の 3 つが揃ったら、秋川さんのサイトにある cpmdisk.exe を実行します。
成功すれば cpm.d88 が出来て完成!


■ 独自BIOS版 CP/M をつくる

秋川さん作の BIOS を使うと、I/O誌を探す必要も無くなります。
例として、スクリーン4版を作ってみます。

まず、AS でアセンブルするソースを少し手直しします。 拙作の diff でパッチをあてた状態ならエディタで開いたとき、15行は以下のようになっているはずです。

MEM EQU 49      ;modified for PC-6000 series 

この 49 を 43 にします。その後、アセンブルして cpm22.bin を cpm.bin にリネームするところまでは同じ。

秋川さんのサイトから入手した cpm-p6-20121124.zip の中から myboot4.bin / mybios4.bin / cpmdisk-sc4.exe を取り出し、
cpm.bin と同じ場所に配置。その後 cpmdisk-sc4 を実行すると、スクリーン4 対応版 cpm.d88 が出来上がります。

d:\>cpmdisk-sc4 

なんという簡単さ。1.5KB程度とはいえI/Oのダンプリストを眺めて老眼を進行させずに済みます。
環境を整えるのに時間をかけていたら本来やりたいことをなすべき時間もモチベーションも削がれますからね。
感謝しつつ使わせていただきたいと思います。

■ アプリケーションを作ってみる

CP/M のテキストベースのアプリケーションを使うのもいいのですが、せっかく近代的な(?)DOSが導入されたわけですから
P6 っぽいことをやってみたいですよね。
というわけで、よくある感じのミュージックプレイヤーを作ってみました。

mp_20201129.zip



別ページの自作音源ドライバ TMC とよっしゅさん作のFM音源ドライバー(以下、FMDRV)に対応しています。
TMC の曲オブジェクトの場合は拡張子を「.MUS」、FMDRV の場合は拡張子を「.MUX」にしてください。
ここでは曲ファイルを song.mus とします。

秋川さんの CP/M 作成セットの中にある cpmadd.exe を使ってディスクに書き込みます。
対応しているのは『拡張RAMなしスクリーン4版』です。CP/M システムのディスク名は cpm.d88 とします。

D:\cpmadd cpm.d88 mp.com song.mus sdrvp6.bin fmdrv.bin song.d88         

とすることで新たに song.d88 というディスクイメージが作成されます。

song.d88 は CP/M システムもコピーされているので(というか追記したものが新たに作成される)
そのまま song.d88 で CP/M を立ち上げて…

43K CP/M 2.2               
a>mp song.mus

で演奏開始します。ドライバーの区別は拡張子でつけていますが、整合性は全くチェックしていないので
間違ったままロードすると死にます。手抜き。
曲ファイルはディスクに入る限り複数でもかまいません。が、プレイヤーは曲ファイル選択機能を持っていないので
上記の通り1曲ずつロードする必要があります。

以下、仕様とか不具合とか。

・FMDRV の方はミュートや表示トラック変更は効きません。あと、あまりテストしていません。
・同じトラックを2つ以上同時に表示すると表示がおかしくなります。
・PSGはミュートしてもキーオンを拾ってしまうのでレベルメータだけは動きます。
・あるトラックをミュートしたまま表示を別トラックに変更すると、ミュート表示が正しく反映されない(はず)。
・曲オブジェクトファイルは 16KB までです。OS を壊しても良ければ +12KB、FMDRV の方はさらに上乗せ可。
・曲オブジェクトファイルは 0x6000 以降にロードします。FMDRV はデフォルトの 0xB000 前提のドライバを使っているので細工しています。
・よっしゅさんの PSG ドライバーは未対応ですが、対応させることは可能。
・たまに取りこぼしが起きます。FMDRVは割り込み間隔が短いのでたまにでは済まないかも。
・サンプルのもじぴったんは FM3+PSG3+FMex という構成です。12トラック目を使ったり使わなかったりします。
・CP/M の機能はファイルのロードとメッセージ表示くらいしか使っていません。
・SR世代はI/Oポートに自動でパッチをあてています。でも試していないので機能するかは不明。
・PAUSEをするとLOOP表示がクリアされてしまいます。高速化のための副作用ということで。


■ その他

CP/M はソースが公開されていますが、個人利用・非商用利用に限るということのようです。

フリーエリアが手狭だったりディスクが遅かったり色々ありますが、6001 の環境で ディスクベースの OS が走るのは感慨深いですね。
MSX-DOS あるいは C-DOS2(+Keysys) が走ると機能的には最高かなぁ。

▲ TOP