IME - 割り込み有効フラグ (Interrupt Master Enable Flag) (書き込み専用)
0 - 全ての割り込みを無効にする
1 - 全ての割り込みを有効にする (IE レジスタが FFFF の時)
IME フラグは全ての割り込みを無効にする等、 IE レジスタの値をオーバーライドする時に使用されます。
IME フラグは I/O アドレスからアクセスするのではなく、
CPU から専用の命令を使って直接アクセスします。
EI ;割り込み有効 (IME = 1)
DI ;割り込み無効 (IME = 0)
RETI ;割り込み有効 & リターン (EI、 RET と順番に実行した時と同じ)
<INT> ;割り込み無効 & 割り込みベクタの呼び出し
<INT> は、割り込み時に CPU によって自動的に呼び出される、割り込み処理を指しています。
FFFF - IE - 割り込み有効 (読み込み/書き込み可能)
Bit 0: V-Blank 割り込み有効 (INT 40h) (1 = 有効)
Bit 1: LCD STAT 割り込み有効 (INT 48h) (1 = 有効)
Bit 2: Timer 割り込み有効 (INT 50h) (1 = 有効)
Bit 3: Serial 割り込み有効 (INT 58h) (1 = 有効)
Bit 4: Joypad 割り込み有効 (INT 60h) (1 = 有効)
FF0F - IF - 割り込みフラグ (読み込み/書き込み可能)
Bit 0: V-Blank 割り込み要求 (INT 40h) (1 = 要求)
Bit 1: LCD STAT 割り込み要求 (INT 48h) (1 = 要求)
Bit 2: Timer 割り込み要求 (INT 50h) (1 = 要求)
Bit 3: Serial 割り込み要求 (INT 58h) (1 = 要求)
Bit 4: Joypad 割り込み要求 (INT 60h) (1 = 要求)
割り込み信号が Low から High に切り替わった時、 IF レジスタの対応するビットが 1 にセットされます。
例えば、 LCD
コントローラが V-Blank 期間に入った時、ビット 0 がセットされます。
割り込み要求
IF レジスタのビットは、割り込み要求中にのみセットされます。
IME フラグと対応する IE レジスタがセットされている場合にのみ、実際に割り込み処理が発生します。
IME フラグ、 IE レジスタがセットされていない場合、 IME と IE で実行の許可をするまで、割り込みは「待ち状態」になります。
割り込み処理
割り込み処理が実行される時、 IF レジスタの対応するビットは CPU によって自動でリセットされ、 IME フラグはクリアされます。
(プログラムで再度割り込み許可が実行されるまで、割り込みは禁止されます。通常、 RETI 命令で有効にします。)
その後、対応する割り込みベクタ (アドレス空間の 0040h-0060h にある) が呼び出されます。
手動での割り込み要求・破棄
通常、 CPU は IF レジスタの値を自動でセットまたはクリアするため、手動で IF レジスタに書き込むことはありません。
しかし、ユーザが手動で割り込み要求 (破棄) をすることもあります。
IME と IE で許可されるまで、手動での割り込み要求は実行されません。
割り込み優先度
次のように 3 つのケースで、 IF レジスタの値が 1 ビット以上同時にセットされ、割り込み要求が出されることがあります。
- 1 つ以上の割り込み信号が同時に Low から High に切り替わる
- IME/IE が割り込みを許可する前に、複数の割り込み要求が出される
- ユーザが IF レジスタに複数のビットを書き込む (例えば 1Fh)
IME と IE は 1 つ以上の割り込み要求を受け付けることができます。
最も優先度の高いものが最初に実行されます。
優先度は、 IE と IF のビットの並び順通りになっていて、
ビット 0 (V-Blank) か最高、ビット 4 (Joypad) が最低の優先度になっています。
割り込み処理のネスト
CPU は割り込み処理の開始時、 IME = 0 にセットし、他の全ての割り込みを禁止します。
IME の値は割り込み処理が復帰するまで 0 のままになっています (IME = 1 にする処理は RETI 命令で行う)。
割り込み処理中に、他の割り込み (または同じ割り込み) を許可したい場合は、
割り込み処理の中で EI 命令を実行することができます。
最終更新:2017年08月28日 14:27