私は楽しみのために、多くの周辺機器を備えたより複雑な Z80 CP/M システムを設計しようとしています。ドキュメントを読んでいるときに、IM0 で割り込みを受け入れるときの Z80 CPU の (ドキュメント化されていない?) 動作に出くわしました。
割り込みが発生すると、Z80 は M1 と IORQ をアクティブにして、外部デバイスに「オペコードをくれ」という信号を送ります。オペコードが rst 00 またはこのようなものであれば、すべて問題ありません。ドキュメンテーションによると、CALL など、任意のコマンドの任意のオペコードを CPU に与えることができます。
しかし、文書化されていない部分があります。「マルチバイト命令の最初のバイトは、割り込み応答サイクル中に読み取られます。後続のバイトは、通常のメモリ読み取りシーケンスによって読み取られます。」
「通常のメモリ読み取りシーケンス」。CPU がメモリからバイトを取得したいのか、デバイスから次のバイトを取得したいのかを判断するにはどうすればよいですか?
編集:私は、(良い?) 解決策を見つけたと思います: IORQ と M1 を分析することで、割り込み確認サイクルの開始を検出できます。また、MREQ と M1 を分析することで、次の「通常の」オペコード フェッチを検出できます。このようにして、これら 2 つの AND 信号によってトリガーされるフリップフロップをインストールできます。つまり、CPU が io デバイスからデータを読み取る限り、フリップフロップは 1 です。この 1 を使用して、メモリとの間でバス ドライバを禁止できます。
私の意図?CPLD で 8 つの優先入力を備えた割り込みコントローラーを設計しています。そのレジスタは、各割り込みピンの 16 ビット アドレスを保持します。楽しみのためだけに:-)