レトロマイコンZ80ボードの構想(その17)HALT以外の方法 [Z80]
「レトロマイコンZ80ボードの構想(その12)CP/M80 BIOS検討4」の記事に書いたようにPICとZ80のインターフェースとしてHALTを使用しています。
HALT脱出のためにRESETを使っていますがこの場合、割込み用FFと割り込みモードがクリアされるのでZ80側で割込み処理を使いたい場合には今回のHALT+RESET方式は使えません。
簡単な回路でZ80側で割込みも使用できる方法を思いついたので実験してみました。
PICとZ80のインターフェースにIORQ/とWAIT/を使う方法です。まずはZ80のIO Input/Outputサイクルのタイミングが下図です。
TWの立下りでWAIT/がサンプリングされます。
そこで、IORQ/を抵抗を介してWAIT/に接続し、PIC側ではWAIT/の状態を監視します(下図の接続、RA1は1例であり他のポートでも可)。
PIC側はWAIT/がlowになったら、BUSREQ/をアクティブにしてからWAIT/を監視していたポートを出力に切替でhighを出力しZ80のWAIT状態を解除します。
Z80側はWAIT/が解除されるのでT3サイクルの立上りでBUSREQ/を検出してBUSACK/をアクティブにしてバスを開放します。
Z80側は単純にI/O命令(InputでもOutputでも可、Outputの場合はデータバスにPIC側に渡したい情報を載せることも可能)を実行するだけです。
処理手順は次のようになります(下記のサンプルソースでは「PIC_SRV」部分)
PIC側の処理手順は次のようになります(下記のサンプルソースでは「 PicSrv()」部分)
「レトロマイコンZ80ボードの構想(その12)CP/M80 BIOS検討4」の記事に書いたHALT+RESETを使った場合に比べてZ80/PIC双方の処理が簡単になります。(但し、WAIT/制御用のポートが余分に必要になるので今回はHALT/RESET方式を採用しています)
上記の記事と同様にCP/MのBIOSでのコンソール入出力関連の機能で実験してみました。
Z80のキーセンス処理のループ部分を抜き取ったロジアナ画面も貼っておきます。
Z80側の実験用ソースは次のとおりです。
「Start」と表示後、キー入力状態をチェックし、キー入力があった場合には入力データを読込み16進で表示します。
PIC-Z80間I/FにWAITを使用した実験(Z80:アセンブラ)
PIC側では上記のZ80のアセンブル結果のバイナリファイルを MemWr() での書込み処理に変換するツールを作り、picleソース内に取り込んでいます。
PIC側でのリスト表示と実行結果を下記に示します。
末尾にある「pushed」の部分は '1'、'2'、'3'のキー入力をした結果です。
PIC-Z80間I/FにWAITを使用した実験(PIC側:picle言語)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
HALT脱出のためにRESETを使っていますがこの場合、割込み用FFと割り込みモードがクリアされるのでZ80側で割込み処理を使いたい場合には今回のHALT+RESET方式は使えません。
簡単な回路でZ80側で割込みも使用できる方法を思いついたので実験してみました。
PICとZ80のインターフェースにIORQ/とWAIT/を使う方法です。まずはZ80のIO Input/Outputサイクルのタイミングが下図です。
Z80 Input or Output Cycles |
|
TWの立下りでWAIT/がサンプリングされます。
そこで、IORQ/を抵抗を介してWAIT/に接続し、PIC側ではWAIT/の状態を監視します(下図の接続、RA1は1例であり他のポートでも可)。
PIC側はWAIT/がlowになったら、BUSREQ/をアクティブにしてからWAIT/を監視していたポートを出力に切替でhighを出力しZ80のWAIT状態を解除します。
Z80側はWAIT/が解除されるのでT3サイクルの立上りでBUSREQ/を検出してBUSACK/をアクティブにしてバスを開放します。
Z80側は単純にI/O命令(InputでもOutputでも可、Outputの場合はデータバスにPIC側に渡したい情報を載せることも可能)を実行するだけです。
処理手順は次のようになります(下記のサンプルソースでは「PIC_SRV」部分)
- ワークエリアにサービスIDとサービス処理に必要なパラメータを設定
- I/O命令を実行
- PICがワークエリアに設定した処理結果を参照
PIC側の処理手順は次のようになります(下記のサンプルソースでは「 PicSrv()」部分)
- WAIT/がアクティブになるまで待つ(入力ポートでWAIT/信号を監視)
- BUSREQ/をアクティブにする
- 上記のWAIT/監視ポートを出力に切替えhighを出力後、ポートを入力状態に戻す
- サービスIDとパラメータに従い処理し、結果をワークエリアに保存する
- BUSREQ/をインアクティブにする
「レトロマイコンZ80ボードの構想(その12)CP/M80 BIOS検討4」の記事に書いたHALT+RESETを使った場合に比べてZ80/PIC双方の処理が簡単になります。(但し、WAIT/制御用のポートが余分に必要になるので今回はHALT/RESET方式を採用しています)
上記の記事と同様にCP/MのBIOSでのコンソール入出力関連の機能で実験してみました。
Z80のキーセンス処理のループ部分を抜き取ったロジアナ画面も貼っておきます。
Z80からPICへのサービス要求処理時の信号サンプル(WAIT方式) |
|
Z80側の実験用ソースは次のとおりです。
「Start」と表示後、キー入力状態をチェックし、キー入力があった場合には入力データを読込み16進で表示します。
|
PIC側では上記のZ80のアセンブル結果のバイナリファイルを MemWr() での書込み処理に変換するツールを作り、picleソース内に取り込んでいます。
PIC側でのリスト表示と実行結果を下記に示します。
末尾にある「pushed」の部分は '1'、'2'、'3'のキー入力をした結果です。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]