Z80割り込み処理について

割り込みとはCPUが実行中に外部信号を受けて、実行中のプログラムから
一時的に割り込み処理プログラムを実行すること。

Z80の割り込み処理には大きく分けて2レベルの機能がある。
一つはソフトウエア的に割り込み処理を変更可能なINTと、
割り込みレベルが最も優先されるNMIである。

NMIは例えば電源が低下した時などあらゆる処理に優先されるような
イベントをキャッチする際に用いられる。
通常の割り込み処理にはINTを使う。

2レベルの割り込みに加えてZ80のINT割り込みモードはさらに3つある。
モード0と呼ばれる割り込みは8080互換で、8080用の割り込みコントローラ
接続を前提としている。
このモードは複数の割り込みレベルを持ち、複数の割り込み信号をキャッチ
できる。
割り込みされた場合、ジャンプ先は自動的にRST0h~RST38hなどのアドレスにジャンプする。

モード1は割り込みコントローラを使わずにソフトウエアで処理が可能なモードだ。
このモードは割り込み信号はたった一つのINTを使い、
複数のデバイスからの割り込みをキャッチし処理する。
特別な割り込みコントローラを必要としないので低コストで
異なるデバイスを接続可能だ。
どのデバイスから割り込み信号がスローされたかの判定はソフトウエアが
各デバイスをチェックして行なう。
モード1の割り込みは必ずRST38hだけが呼ばれる。

モード2はZ80周辺LSI専用の割り込みモード。
Z80周辺LSIは他のデバイスと異なり、各種LSIに割り込み処理機能を持っている。
多くのCPUは割り込みコントローラLSIを介して、割り込みレベルを
デバイス毎にキャッチするが、Z80ファミリー周辺LSIはそれ自身に
割り込み処理機能を持っているので、特別な割り込みコントローラを持たない。

NMI割り込みの際は必ず0x0066が呼ばれる。

MSXでは割り込みモード1を使用している。このモードではハードウエア
割り込みはソフトウエアによりイベントが発生したデバイスを判別し、
ソフトウエア処理を行なっている。
そのために割り込みを使うハードウエアは、割り込みのイベントをソフトウエアで
キャッチしなければならず、ソフトウエアのアップデートが必要となる。
BIOSはROMに記録されているので、書き換えが困難だ。
(通常はMSXではシステムワークエリアに書き換え可能なジャンプテーブル
があり、フックと呼ばれている領域を書き換えているようだ)


割り込みが発生すると、CPUは通常のプログラム実行をやめて
特定の番地にジャンプする。
このジャンプ先はメモリーアドレスの0x0-0xff間の割り込みベクターと呼ばれる領域にジャンプする。
この領域はさらに割り込み処理ルーチンへのジャンプ命令が置かれている。
このルーチンに割り込み時の処理が記述されている。

割り込みベクターは、ハードウエア的に割り込みが発生した時にコール
されるジャンプテーブルだが、ソフトウエア的にもジャンプする事が可能だ。
ジャンプテーブルや割り込みに関係するアドレスはゼロページ(0x0の先頭)
付近に存在することが多い。

割り込みベクトルへのジャンプアは以下のような命令でも可能だ。

JP 038h

しかし他にも似た命令が存在する。

RST 38h

RST38hなどの命令は直接コードに書くわけではなく割り込みコントローラが
8bitのデータバスに出力する際に利用する。ジャンプ命令としては重複している。
ソフトウエア的なジャンプ命令は、デバック用途やDOSのファンクションコール
として利用される。
前者のJP命令が3byteであるのに対し、RST38hは1byte命令なので短い。
短い命令は割り込み処理へのジャンプコストを小さくする事が可能だ。
またソフトウエア的な割り込みはファンクションコールなどOS機能を提供する際にもよく用いられる。



  • NMI

NMI割り込みはCPUのNMI端子がLレベルタイミングで割り込みが発生する。
このアドレスはソフトウエアにより変更できない(マスク不可)。
アドレスは必ず0x0066がコールされる。(このアドレスは別名でゼロページと呼ばれる事もある)
NMI割り込み発生時のリターンはRET命令ではなくRETN命令を使う。

(INT割り込みはソフトウエアマスカブル---ソフトウエア変更可能---な割り込み端子。INT割り込みはモード0,1,2がある。各モードの切替はアセンブラのIM0,IM1,IM2命令で行なう。)



  • MODE 0

モード0は8080互換性のため8080割り込みコントローラを接続する。
割り込みは8種類あり、8段階レベルの割り込みをキャッチすることができる。
この割り込みモードは外部に接続された割り込みコントローラが8レベルの割り込みシグナルを
キャッチし、そのイベントによりCPUのINT端子にシグナルを送信する。

モード0のときの割り込みコントローラはINT端子を有効化すると同時にデータバスに8レベルの
割り込みデータを同時に出力する。このデータをCPUが受け取って適切なアドレスにジャンプ
するわけである。
このときの8レベルの割り込みジャンプ先アドレスは以下となる。

Interrupt Level Address
0 0x0000
1 0x0008
2 0x0010
3 0x0018
4 0x0020
5 0x0028
6 0x0030
7 0x0038

モード0で割り込みが生じると、データバスに割り込みコントローラからデータが出力されるが、
この時のデータは、直接CPU命令のRST命令。
割り込みコントローラはCPUのRST命令をデータバスに出力していることになる。
割り込み発生時CPUはこのアドレス(命令)をデータバスから取り込んで割り込みアドレスへジャンプする。

プログラムカウンタのスタックへの退避は、モード0ではRST命令の実行のタイミングで行なわれる。
モード1では割り込みステート内でプログラムカウンタの値がスタックへ退避される。




  • MOOE 1

モード1は特別な割り込みコントローラやハードウエアを用いずにソフトウエアで割り込みを制御
するモード。割り込み端子はINTだけを使い特別なハードウエアは必要ない。
モード1割り込みシグナルが発生すると、キャッチしたイベントの区別に関わらずCPUは必ずアドレス
0x0038へジャンプする。
ハードウエア的には全ての割り込みイベントはINT端子で信号をキャッチする。

割り込みデバイスの判定と処理はソフトウエアによって判定し処理する。
モード1は割り込みレベルの詳細な設定はなく、ソフトウエアによって幾つもの割り込みレベルやイベントを
設定する事も可能。
ソフトウエアで割り込み処理を行なう場合は、割り込みシグナル発生後に対応するデバイスの割り込みフラグが
有効か無効かをソフトウエアでチェックする。

プログラムカウンタの退避は割り込みステート内で行なわれる。
割り込み処理から復帰する場合はRETではなくRETI命令を用いる。

モード1と同じような設計は現代でも受け継がれており、よく知られているMicrochip社のPICなどはハードウエア
割り込みレベルは一段階のみというシンプルさで、割り込みレベル処理はソフトウエア処理によって実装する。
PICマイクロコントローラはMODE1のようなソフトウエア割り込みでイベントや複数のデバイスを処理する。



  • MODE 2

モード2は割り込みベクターテーブル方式と呼ばれるもので、Z80周辺ペリフェラルに対応するモード。
予め決められた割り込みベクターテーブルを用いてアドレスを参照し処理ルーチンへとジャンプする。

モード2の動作は、割り込みベクターであるCPUのIレジスタと、割り込み時に割り込みコントローラからデータバスに出力されるデータを使う。


割り込みには予め定められた割り込みベクタージャンプテーブルを参照する。
ベクターテーブルにはジャンプ先のアドレスが記録されており、
モード2の割り込み発生時に、割り込みシグナルがキャッチされると、このアドレステーブルを参照して
プログラムカウンタにセットし、割り込み処理ルーチンへジャンプする。

割り込みベクターのベースアドレスはIレジスタを利用し、残りの1byteは外部割り込み
コントローラから出力される。
割り込みシグナルの発生は割り込みコントローラなど特別にハードウエアが必要となる。
モード2の割り込みコントローラは、割り込み発生時にINT端子にシグナルを発生させ、
同時にイベントごとに決められたベクターテーブル下位アドレスをデータバスに出力すればよい。
これらを実装したLSIはZ80周辺ペリフェラルの割り込みコントローラである。

割り込みベクターは256byteのアドレス範囲にテーブルが記録されるので最大で128レベルの割り込みを
サポートすることができる。この割り込みベクターテーブルはベースアドレスを用いる事で、
任意のアドレス位置にテーブルを配置することができる。

モード2では割り込みステート内でプログラムカウンタがスタックへ保存される。



  • 割り込みの有効化、無効化と内部ロジック

割り込み有効無効の切替を行なう場合は、DI/EI命令を使う。
CPUリセット直後は割り込みは無効に設定されているので、初期化時に割り込みを有効にセット
する必要がある。
また割り込み発生後割り込みモードがDisable状態で戻るかEnable状態で戻るか注意が必要。


CPU内部では割り込みレベル切替えは割り込み用フリップフロップ(IFF1,IFF2)でスイッチしている。
Z80の割り込み処理は、NMIとINTではNMIが優先される。この仕組みのためにCPU内部では
IFF1,IFF2というフリップフロップを用いた割り込みステート順序の制御が行なわれている。
NMIは割り込みとして優先レベルが高いので、NMI期間中にINTが発生するような場合、
割り込みを停止することができる。

IFF1は割り込み状態を保持するメモリ、IFF2はIFF1のバックアップとなる。
NMIが発生すると内部的には割り込み状態フラグはIFF2はIFF1へバックアップされ、
IFF1は割り込み禁止となる。
割り込みシグナルが発生すると自動的に割り込み停止となるのでIFF1は禁止状態となる。
RETN命令が実行されると、IFF2がIFF1に復帰されリターンする。

NMIとINTではIFF1,IFF2の動作に違いがある。この差で割り込みレベルを処理する。
INTではIFF1,IFF2の状態は変化せず割り込み禁止となるので、IFF1,IFF2でNMIとINTの割り込みレベルの
区別や制御が可能となる。

割り込み期間中、この内部の割り込み状態を示すIFF2の値は、LD A,I/LD A,R命令実行後、
パリティフラグに反映される。
割り込み内部ステートを表現するIFF1,IFF2というフリップフロップの状態はプログラムからは
見えないが、LD A,I/LD A,Rという命令を実行することで、フリップフロップの内部状態を
フラグに反映させることができる。



  • VSYNC割り込みとディスクドライブ

MSXディスク装置は当初から規格化内に存在するハードウエアではなく各社が設計製造し規格化された
という経緯があるので互換性という意味で問題がある。
特に割り込み処理の部分に問題がある。

タイマー割り込みは1/60ごとに発生するが、ディスクドライブを搭載している機種では、
割り込みフックと呼ばれるジャンプテーブルにディスク装置の割り込みが追加されている。
ディスク装置がない機種では、割り込み発生時のフックと呼ばれるジャンプテーブルは
空いている。

割り込みフック自体はユーザーが使う事を考慮した空のジャンプテーブルで、通常は単に
RETやJPが書かれている。ユーザーは必要であればこのジャンプテーブルに割り込みイベント
処理を追加し独自のルーチンをコールする。
ディスクドライブはシステムROM(例えばメインBIOS)内で割り込み処理を行なっておらず、
ユーザーに開放された割り込みフックジャンプテーブルを利用している。
この割り込みを消去すると、ディスクドライブは動作するが、ディスクのメディア交換などが
検出されなくなる。

(最善の設計は追加されたディスク装置のために割り込み処理ルーチンをメインBIOSに記述する
ことだが、ROMBIOSを厳密に互換性を維持しようとするとAPIアドレスに変更が生じる。ディスク装置は
外付けで規格化内になかったためか奇妙な拡張方法となっている。それらは特に割り込み処理に無理があるように思われた)

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2012年08月19日 19:54
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。