割り込み

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