レトロマイコンZ80ボードの構想(その12)CP/M80 BIOS検討4 [Z80]
前回の記事「レトロマイコンZ80ボードの構想(その11)CP/M80 BIOS検討3」でBUSACK/信号のチェックは省略可能なことが判り、Z80と接続する信号はほぼ決まったのでPICとZ80とのソフトインターフェースについて動作検証してみました。
PIC側で使用するI/O数を削減するため、Z80からのサービスコール時のHALTの脱出は NMI(またはINT)ではなく、RESETを使用することにします。
NMIを使う場合は66HのコードをRETNコードに書き換えてからHALTします。RESETの場合は0000Hから実行が開始するので0000HのコードをJP XXXXに書き換えてもいいのですが、処理簡略化(かつ高速化)のためにJP (HL):0E9H に書き換えます。
NMI方式と比較し、スタック操作がなく、書き換えが1バイト(NMI方式は2バイト)なので若干ですが処理が簡易かつ高速になります(NMIのための制御出力が不要であることが最大のメリット)。
ディメリットとしてはRESETにより割込み用FFと割り込みモードがクリアされるという点がありますが、今回のように割込みを使わない場合は問題ありません。
Z80がPIC側のサービスを受ける際の手順の概要としては次のようになります(下記のサンプルソースでは「PIC_SRV」部分)
PIC側の処理手順は次のようになります(下記のサンプルソースでは「 PicSrv()」部分)
動作検証としてCP/MのBIOSにもあるコンソール入出力関連の処理を実験した際の信号サンプルが下のキャプチャです。
キーセンスの繰り返し処理の部分を1周期分抜き出したものです。
Z80側はキー入力状態をチェックする短いループ処理であるということもありますが、PIC側の処理時間(BUSREQ/がLOWの期間)がZ80の3倍弱程度(PIC側の7割程度が外部メモリアクセスの処理)になっています。
Z80は16MHz、PICは32MHzで動作しています。PIC側はPMPを使っているものの内部のメモリに展開しながらの外部メモリアクセスなので時間がかかっていますが、PIC側もアセンブラで書けば外部メモリアクセス部を数倍程度高速化できると思います。
Z80側のソースは次のとおりです。
「Start」と表示後、キー入力状態をチェックし、キー入力があった場合には入力データを読込み16進で表示します。
RESETによるBIOS処理実験(Z80:アセンブラ)
PIC側では上記のZ80のアセンブル結果のバイナリファイルを MemWr() での書込み処理に変換するツールを作り、picleソース内に取り込んでいます。
PIC側でのリスト表示と実行結果を下記に示します。
末尾にある「pushed」の部分は '1'、'2'、'3'のキー入力をした結果です。
RESETによるBIOS処理実験(PIC側:picle言語)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
PIC側で使用するI/O数を削減するため、Z80からのサービスコール時のHALTの脱出は NMI(またはINT)ではなく、RESETを使用することにします。
NMIを使う場合は66HのコードをRETNコードに書き換えてからHALTします。RESETの場合は0000Hから実行が開始するので0000HのコードをJP XXXXに書き換えてもいいのですが、処理簡略化(かつ高速化)のためにJP (HL):0E9H に書き換えます。
NMI方式と比較し、スタック操作がなく、書き換えが1バイト(NMI方式は2バイト)なので若干ですが処理が簡易かつ高速になります(NMIのための制御出力が不要であることが最大のメリット)。
ディメリットとしてはRESETにより割込み用FFと割り込みモードがクリアされるという点がありますが、今回のように割込みを使わない場合は問題ありません。
Z80がPIC側のサービスを受ける際の手順の概要としては次のようになります(下記のサンプルソースでは「PIC_SRV」部分)
- ワークエリアにサービスIDとサービス処理に必要なパラメータを設定
- 0000Hのコード(多くの場合、0C3H(=JP XXXX)))を保存
- HLレジスタにHALTの次のアドレスを設定
- 0000Hに0E9H(=JP (HL))を設定
- HALT実行
- 0000Hを元のコードに戻す
- ワークエリアからPICが設定した処理結果を参照
PIC側の処理手順は次のようになります(下記のサンプルソースでは「 PicSrv()」部分)
- Z80がHALT状態になるまで待つ
- BUSREQ/をアクティブ(アサート)にしBUSの制御権を得る
- サービスIDとパラメータに従い処理し、結果をワークエリアに保存する
- RESETをアクティブにする
- BUSREQ/をインアクティブ(ディアサート)にする
- RESETをインアクティブにする
動作検証としてCP/MのBIOSにもあるコンソール入出力関連の処理を実験した際の信号サンプルが下のキャプチャです。
キーセンスの繰り返し処理の部分を1周期分抜き出したものです。
Z80側はキー入力状態をチェックする短いループ処理であるということもありますが、PIC側の処理時間(BUSREQ/がLOWの期間)がZ80の3倍弱程度(PIC側の7割程度が外部メモリアクセスの処理)になっています。
Z80は16MHz、PICは32MHzで動作しています。PIC側はPMPを使っているものの内部のメモリに展開しながらの外部メモリアクセスなので時間がかかっていますが、PIC側もアセンブラで書けば外部メモリアクセス部を数倍程度高速化できると思います。
Z80からPICへのサービス要求処理時の信号サンプル |
|
Z80側のソースは次のとおりです。
「Start」と表示後、キー入力状態をチェックし、キー入力があった場合には入力データを読込み16進で表示します。
|
PIC側では上記のZ80のアセンブル結果のバイナリファイルを MemWr() での書込み処理に変換するツールを作り、picleソース内に取り込んでいます。
PIC側でのリスト表示と実行結果を下記に示します。
末尾にある「pushed」の部分は '1'、'2'、'3'のキー入力をした結果です。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]