レトロマイコン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] [ 前へ ] 連載記事 [ 次へ ]
外部割り込みしないならこれでいいかも。
私のはINTを気にしててRD/WRを取り込んだんですけどね。(M1ではじいてもよかったかも)
INTの応答でIOREQがLOWになるので。
PICのRA1を出力にするとIOREQも出力だからちょっと気持ち悪いんだけどプルアップと考えれば問題ないのかも。
1kだと3.3mA。
by neko Java (2018-04-09 00:16)
コメントありがとうございます。
上記記事のWAIT方式では外部割込みの時もIORQがLOWになるのでZ80がWAIT状態になってしまいますが、PIC側でWAIT監視しているのでWAIT解除すれば問題ないはずです。
サービス処理後サービスIDをクリアするようにすれば割込みの判別はできます。
また、抵抗値ですが、最初10Kで試してNGで2.2Kまで下げてもNG、1Kで動作OKでした。PIC側でポートをプルアップしていたのかもと思い確認しましたがPIC側でPullUp設定はしていませんでした。確かに電流値は気になりますが実機確認の結果です。
by skyriver (2018-04-09 01:24)
PICのポートが出力になったとき、IOREQがLOWのとき3.3mmAの吸い込みでたぶん問題ない。
(実際にそのような状態があるかどうか分からないが一瞬でも)IOREQがHIGHのときPICの出力に電源以上の+5Vが掛かるのでそれがどうなのか良くわからないですね。
PICのポートが入力のとき+5V(IOREQ HIGH)が掛かるのも問題ないんですかね(PICは良く知らない)
出力同士を繋ぐとわけが分からなくなるので私はやらないですw
ところで、スペシャルリセットは驚きました。これはそのうち試してみたいですね。
by neko Java (2018-04-09 03:03)