KM-Z80 midi 進捗:CP/M
2019年9月25日
KM-Z80 midi 用のアプリケーション第二弾として、CP/KM midi (CP/M 2.2 実行環境)を製作している。特徴は、次の通り。
1)CP/M ver 2.2 (54k system) が走る
2)KM-Z80 midi 上で走る、スタンドアローン設計
3)ディスプレイは液晶表示(NTSCビデオは非対応)
4)RAM領域に56K bytesを割り当て
5)USBメモリー上のディスクイメージファイルを仮想ドライブとして使用
6)仮想ドライブは、1954K bytesの物を4つ割り当て
実行中の様子。MBASICから、STARTREKを起動した。
CP/M ver 2.2 のアセンブル
PIC32MX170F256B上でCP/Mが走るようにする場合、エミュレーターで使う作業領域を確保しないといけないので、64K bytesのRAMの全てをCP/Mに割り当てる事はできない。56K bytesをCP/Mに、残りの 8K bytes をエミュレーターに割り当てる事とした。CP/Mのメモリーマップは次のようになる。
これは、54K systemと呼ばれるCP/Mである。CP/Mの本家のバイナリーダウンロードのページから取得される物は、62K systemなので、そのままでは使えない。「PC-6001mkII/6601 CP/M導入メモ・その1」というwebページでソースコードからのアセンブルの方法を解説していたので、それに従い54K systemのCPM.SYSを作製した。
62K systemでアセンブルした結果と54K systemでアセンブルした結果を比較すると、変更点は純粋に幾つかのバイトデーターが同じ値だけずれている。変更箇所をピックアップして、様々なアドレス指定のCP/Mシステムが作製できるwebページを構築した。以下のアドレスでアクセスできる。
https://www.rad51.net/projects/cpm/convert.php
これを用いて作製した54K systemを使う事にした。使用するディスクイメージの取得の仕方は、後述する。
LCDを用いて、横80文字のディスプレイを実現
CP/Mのアプリケーションのほとんどは、横80文字のディスプレイを使う事を前提に作られているようで、「CP/Mが動いた!」という満足を得るだけであれば横40文字でも良いのであろうが、多少なりとも実用性を確保しようとすると、どうしても横80文字が必要なようである。始めNTSCのコンポジットビデオ出力で横80文字を表示させようとしたのであるが、次のような様々な問題に直面した。
1)細かな表示に不向き
2)文字数が多い分、スキャンデーターの構築に時間が掛かる
3)SPIでビデオ信号を作製するにしても、ビデオ信号にCPUリソースの多くを取られる
4)結果、Z80のエミュレーションが2 MHzの速度では行えない
そこで、NTSCでの表示は諦め、ILI9341液晶一本で行く事にした。この液晶ディスプレイは、横320ドット縦240ドットの表示が行える。横80文字表示するには、4x8ドットのフォントを使うしかない。ILI9486を用いた480x320ドットの液晶の利用(6x8ドットや6x12ドットのフォントが使える)も勧められたが、とりあえずCP/Mとして動作させる事を第一目標と決め、4x8ドットのフォントを使って、80x30文字のディスプレイを構築する事とした。
CP/Mにおいては、画面出力は単一のBIOS APIである「CONOUT」でのみ行なわれる。MZ-80Kと違い、仕様としては「CONOUT」の実行に一定以上の時間を費やして、その間Z80 CPUを待たせるというのは、全く問題ないと思われる。そこで、MZ-80Kのシミュレーションとは異なり、定期的に画面描画を行なうのではなく、文字表示をする時のみ(CONOUTの実行時のみ)ILI9341に指令を行なう形式とした。ただし、スクロールアップの際は一画面分描画するので、実行を完了するのに少し時間が掛かる。これは、40年前のCP/Mでも同様であったと思われる。
PIC32で、Z80を積んだPCをエミュレート
KM-Z80 midiと同様、PIC32MX170F256Bを使って、Z80 CPUを積んだPCをエミュレートする。概念図は、以下の通り。
MREQにはROMとRAMが接続されている。IORQには8255が接続されていて、Port C1の出力で、0000hからのメモリー領域にROMかRAMが選択される方式である。画面表示とキーボード入力も8255に行なわせる事になっているが、エミュレーターでは8255はつかわず、直接値をやりとりする事になっている。ひとまず、HTML5でエミュレーションし、実行を確認してから、KM-Z80 midiに移植した。ソースコードは、ここで管理している。
使い方
記事最後のリンク先からHEXファイルを取得し、KM-Z80 midiのアプリケーション変更機能を利用するか、もしくはPicKit等を用いてダウンロードして頂きたい。とりあえず実行すると、以下のようになる。これは、私の CP/KM の仕様である。
字が小さくて読みづらいが、次のように表示される。
指示に従ってリンク先に行くと、次のような画面になる。
使用するのは 54K system なので、「54K system is here」のリンクをクリックする。次のような画面になる。
さらに指示に従って、本家のバイナリーダウンロードのページに行く。半ば当りに「CP/M 2.2 BINARY」とあるのがそれなのでダウンロードし、先のページにこのファイル(cpm-22-b.zip)をアップロードする。「cpmdisks.zip」がダウンロードされるので、zipアーカイブを解凍し、「cpmdisks」というファイルをUSBメモリーのルートにコピーする。少し煩雑であるが、CP/Mの所有権・著作権の関連でどうしてもこうなってしまうので、ご了承頂きたい。
このUSBメモリーを挿入した状態でCP/KM midiを起動すれば、CP/M 2.2 (54K system)を走らせる事ができる。
なお、ここで使うディスクイメージファイルは、 CpmtoolsGUI というツールで編集することが出来る。CpmtoolsGUIをダウンロードした時に添付されているdiskdefsファイルが、そのまま使える。
20190929 追記
GitHubでver 0.2βをリリースしました。
CP-KM midi ver 0.1α は、GitHubでダウンロードできます。
CP-KM midi ver 0.2β は、GitHubでダウンロードできます。
1)CP/M ver 2.2 (54k system) が走る
2)KM-Z80 midi 上で走る、スタンドアローン設計
3)ディスプレイは液晶表示(NTSCビデオは非対応)
4)RAM領域に56K bytesを割り当て
5)USBメモリー上のディスクイメージファイルを仮想ドライブとして使用
6)仮想ドライブは、1954K bytesの物を4つ割り当て
実行中の様子。MBASICから、STARTREKを起動した。
CP/M ver 2.2 のアセンブル
PIC32MX170F256B上でCP/Mが走るようにする場合、エミュレーターで使う作業領域を確保しないといけないので、64K bytesのRAMの全てをCP/Mに割り当てる事はできない。56K bytesをCP/Mに、残りの 8K bytes をエミュレーターに割り当てる事とした。CP/Mのメモリーマップは次のようになる。
これは、54K systemと呼ばれるCP/Mである。CP/Mの本家のバイナリーダウンロードのページから取得される物は、62K systemなので、そのままでは使えない。「PC-6001mkII/6601 CP/M導入メモ・その1」というwebページでソースコードからのアセンブルの方法を解説していたので、それに従い54K systemのCPM.SYSを作製した。
62K systemでアセンブルした結果と54K systemでアセンブルした結果を比較すると、変更点は純粋に幾つかのバイトデーターが同じ値だけずれている。変更箇所をピックアップして、様々なアドレス指定のCP/Mシステムが作製できるwebページを構築した。以下のアドレスでアクセスできる。
https://www.rad51.net/projects/cpm/convert.php
これを用いて作製した54K systemを使う事にした。使用するディスクイメージの取得の仕方は、後述する。
LCDを用いて、横80文字のディスプレイを実現
CP/Mのアプリケーションのほとんどは、横80文字のディスプレイを使う事を前提に作られているようで、「CP/Mが動いた!」という満足を得るだけであれば横40文字でも良いのであろうが、多少なりとも実用性を確保しようとすると、どうしても横80文字が必要なようである。始めNTSCのコンポジットビデオ出力で横80文字を表示させようとしたのであるが、次のような様々な問題に直面した。
1)細かな表示に不向き
2)文字数が多い分、スキャンデーターの構築に時間が掛かる
3)SPIでビデオ信号を作製するにしても、ビデオ信号にCPUリソースの多くを取られる
4)結果、Z80のエミュレーションが2 MHzの速度では行えない
そこで、NTSCでの表示は諦め、ILI9341液晶一本で行く事にした。この液晶ディスプレイは、横320ドット縦240ドットの表示が行える。横80文字表示するには、4x8ドットのフォントを使うしかない。ILI9486を用いた480x320ドットの液晶の利用(6x8ドットや6x12ドットのフォントが使える)も勧められたが、とりあえずCP/Mとして動作させる事を第一目標と決め、4x8ドットのフォントを使って、80x30文字のディスプレイを構築する事とした。
CP/Mにおいては、画面出力は単一のBIOS APIである「CONOUT」でのみ行なわれる。MZ-80Kと違い、仕様としては「CONOUT」の実行に一定以上の時間を費やして、その間Z80 CPUを待たせるというのは、全く問題ないと思われる。そこで、MZ-80Kのシミュレーションとは異なり、定期的に画面描画を行なうのではなく、文字表示をする時のみ(CONOUTの実行時のみ)ILI9341に指令を行なう形式とした。ただし、スクロールアップの際は一画面分描画するので、実行を完了するのに少し時間が掛かる。これは、40年前のCP/Mでも同様であったと思われる。
PIC32で、Z80を積んだPCをエミュレート
KM-Z80 midiと同様、PIC32MX170F256Bを使って、Z80 CPUを積んだPCをエミュレートする。概念図は、以下の通り。
MREQにはROMとRAMが接続されている。IORQには8255が接続されていて、Port C1の出力で、0000hからのメモリー領域にROMかRAMが選択される方式である。画面表示とキーボード入力も8255に行なわせる事になっているが、エミュレーターでは8255はつかわず、直接値をやりとりする事になっている。ひとまず、HTML5でエミュレーションし、実行を確認してから、KM-Z80 midiに移植した。ソースコードは、ここで管理している。
使い方
記事最後のリンク先からHEXファイルを取得し、KM-Z80 midiのアプリケーション変更機能を利用するか、もしくはPicKit等を用いてダウンロードして頂きたい。とりあえず実行すると、以下のようになる。これは、私の CP/KM の仕様である。
字が小さくて読みづらいが、次のように表示される。
*** CP/KM BIOS KM-2010 1952K bytes x 4 Drives *** To start CP/M 2.2, a valid disk image containing CPM.SYS is required. To bobain the disk image, go to: http://www.rad51.net/projects/cpm/
指示に従ってリンク先に行くと、次のような画面になる。
使用するのは 54K system なので、「54K system is here」のリンクをクリックする。次のような画面になる。
さらに指示に従って、本家のバイナリーダウンロードのページに行く。半ば当りに「CP/M 2.2 BINARY」とあるのがそれなのでダウンロードし、先のページにこのファイル(cpm-22-b.zip)をアップロードする。「cpmdisks.zip」がダウンロードされるので、zipアーカイブを解凍し、「cpmdisks」というファイルをUSBメモリーのルートにコピーする。少し煩雑であるが、CP/Mの所有権・著作権の関連でどうしてもこうなってしまうので、ご了承頂きたい。
このUSBメモリーを挿入した状態でCP/KM midiを起動すれば、CP/M 2.2 (54K system)を走らせる事ができる。
なお、ここで使うディスクイメージファイルは、 CpmtoolsGUI というツールで編集することが出来る。CpmtoolsGUIをダウンロードした時に添付されているdiskdefsファイルが、そのまま使える。
20190929 追記
GitHubでver 0.2βをリリースしました。
CP-KM midi ver 0.2β は、GitHubでダウンロードできます。