第 3 章 割り込み制御回路
3.5 割り込み処理
割り込み要求は、割り込みが受け付けられるか、リセット動作または命令によって、割り込みラッチ
が
“0”
にクリアされるまで保持されます。割り込み受け付け処理は、実行中の命令が終了したあと、8
マシンサイクルを要して実行されます。割り込みサービスタスクは、割り込みリターン命令
[RETI] (
マスカ ブル割り込みの場合)/[RETN] (ノンマスカブル割り込みの場合)を実行して終了します。3.5.1 初期設定
割り込みを利用するには、事前に
SP (スタックポインタ)の設定が必要です。SP
は、スタックの先 頭番地を指す16
ビットのレジスタです。SP
は、サブルーチンコール、プッシュ命令実行時、および 割り込み受け付け時にポストデクリメントされ、リターン、ポップ命令実行時にプリインクリメント されます。従って、スタックはアドレスの若い方に向かって深くなりますので、SPの設定値に対し 適切なサイズのスタック領域を確保してください。リセット後、SPは
0x00FF
に初期化されます。SPを変更する場合は、リセット直後か、割り込み マスタ許可フラグ(IMF)が"0"のときに行ってください。(プログラム例)SPの設定
LD SP, 0x023F ; SP = 0x023F
LD SP, SP+0x04 ; SP = SP + 0x04
ADD SP, 0x0010 ; SP = SP + 0x0010
3.5.2 割り込み受け付け処理
割り込み受け付け処理は、次の動作を自動的に行います。
1.
割り込みマスタ許可フラグ(IMF) を “0” にクリアし、そのあとのマスカブル割り込みの受け 付けを一時的に禁止します。2.
受け付けた割り込み要因の割り込みラッチを“0”
にクリアします。3.
プログラムカウンタ(PC) プログラム ステータス ワード(PSW) および割り込み受け付け前のIMF
の内容をスタックに退避します(PSW + IMF, PCH, PCL
の順にプッシュダウンされま す)
。スタックポインタ(SP)
は3
回デクリメントされます。4.
割り込み要因に応じたベクタテーブルアドレスから割り込みサービスルーチンのエントリー アドレス(
割り込みベクタ)
を読み出し、プログラムカウンタにセットします。5.
割り込みサービスルーチンのエントリーアドレスに格納されている命令の実行に移ります。注)
PSW
の内容がスタックに退避される際、同時にレジスタバンクおよびIMF
の状態も退避されます。例: INTTBTの受け付け処理におけるベクタテーブルアドレスと割り込みサービスルーチンのエン トリーアドレスの対応
0x03 0xFFF4
0xFFF5
ࡌࠢ࠲࠹ࡉ࡞ࠕ࠼ࠬ
0xD2
0x0F 0xD203
0xD204
ࡌࠢ࠲࠹ࡉ࡞ࠕ࠼ࠬ
0x06
図 3-2 ベクタテーブルアドレスとエントリーアドレス
割り込みサービス中にマスカブル割り込みが発生しても、割り込みマスタ許可フラグが “1” にセッ トされるまで受け付けられません。従って、多重割り込みを行う場合は、割り込みサービスルーチン の中で、割り込みマスタ許可フラグを “1” にセットします。その際、割り込み個別許可フラグによ り、受け付けてよい割り込み要因を選択的に許可します。過重なネスティングを防ぐため、現在受け 付けている割り込みの割り込み個別許可フラグは、割り込みマスタ許可フラグを
“1”
にセットする前 にクリアしてください。また、ノンマスカブル割り込みは、割り込み要求の間隔より割り込み処理時 間が短くなるようにしてください。3.5.3 汎用レジスタ退避/復帰処理
割り込み受け付け処理で、プログラムカウンタとプログラムステータスワードは自動的にスタック に退避されますが、汎用レジスタは自動的には退避されません。これらのレジスタ類の退避処理が必 要な場合は、プログラムで行います。また、多重割り込みを行う場合、退避用のデータメモリ領域が 重ならないようにする必要があります。
汎用レジスタの退避には、次の
3
つの方法があります。3.5.3.1
プッシュ/ポップ命令による汎用レジスタの退避/復帰特定のレジスタのみ退避する場合や同一の割り込み要因の多重化の場合には、プッシュ/ポップ 命令により汎用レジスタの退避
/
復帰を行います。(プログラム例)プッシュ/ポップによるレジスタの退避/復帰
PINTxx PUSH WA ; WAレジスタペアをスタックに退避
割り込み処理
POP WA ; WAレジスタペアをスタックから復帰
RETI ;リターン
ഀࠅㄟߺฃߌઃߌᓟ PSW SP
PCL PCH
ࠕ࠼ࠬ
b-4 b-3 b-2 b-1 b PSW
SP
PCL PCH
WAࠫࠬ࠲ࡍࠕߩ PUSHᓟ
WAࠫࠬ࠲ࡍࠕߩ POPᓟ
SP
࠲ࡦᓟ PSW
W A SP
PCL PCH
図 3-3 プッシュ/ポップ命令による汎用レジスタの退避/復帰処理
3.5.3.2
転送命令による汎用レジスタの退避/復帰多重割り込みを行わない割り込み処理において、特定のレジスタのみ退避する場合は、データ メモリとの転送命令により汎用レジスタの退避/復帰を行います。
(プログラム例)データメモリとの転送命令によるレジスタの退避/復帰
PINTxx: LD (GSAVA), A ; Aレジスタの退避
割り込み処理
LD A, (GSAVA) ; Aレジスタの復帰
RETI ;リターン
ࡔࠗࡦࠬ࠲࠶ࠢ
ഀࠅㄟߺฃߌઃߌ ഀࠅㄟߺࠨࡆࠬ
࡞࠴ࡦ
ࠫࠬ࠲
ᓙㆱಣℂ
ࠫࠬ࠲
ഀࠅㄟߺ࠲ࡦ ᓳᏫಣℂ
図 3-4 割り込み処理における汎用レジスタの退避/復帰処理
3.5.3.3
レジスタバンクによる汎用レジスタの退避/復帰多重割り込みを行わない割り込み処理において、汎用レジスタを一括して待避/復帰する場合 は、レジスタバンク機能を使用します。レジスタバンク機能によって汎用レジスタを待避
(
切り替 え)するには、割り込みサービスタスクの先頭でレジスタバンクの操作命令(LD RBS,1など)を実行 します。レジスタバンクは、RETI命令が実行されるとPSW
の内容に従ってメインタスクで使用 していたレジスタバンクに自動的に復帰しますので、割り込みサービスタスクの最後でレジスタ バンクの操作命令を再度実行する必要はありません。注) レジスタバンクは、2 BANK (BANK0と
1)内蔵しています。1
つのBANK
には、8ビット汎用レジスタW, A, B, C, D, E, H, L、16 ビット汎用レジスタ IX, IY
が含まれています。(プログラム例)データメモリとの転送命令によるレジスタの退避/復帰 (メインタスクでレジスタバンクの
BANK0
を使用している場合)
PINTxx: LD RBS, 1 ; レジスタバンクをBANK1に切り替え
割り込み処理
RETI ;リターン
(PSWのリストアによって自動的にメインタ スクで使用していたBANK0に戻る)
ࡔࠗࡦࠬ࠲࠶ࠢ
ഀࠅㄟߺฃߌઃߌ ഀࠅㄟߺࠨࡆࠬ
࡞࠴ࡦ
ࠫࠬ࠲ࡃࡦࠢࠍ
BANK1ߦಾࠅᦧ߃
ࠫࠬ࠲ࡃࡦࠢߪ⥄േ⊛ߦ BANK0ߦᚯࠆ
LD (RBS),1
ࠫࠬ࠲ࡃࡦࠢߩ BANK0ࠍ↪
ഀࠅㄟߺ࠲ࡦ
図 3-5 レジスタバンクによる汎用レジスタの待避/復帰
3.5.4 割り込みリターン
割り込みリターン命令は、次の動作を行います。
[RETI] / [RETN] 割り込みリターン
① プログラムカウンタ、プログラムステータスワード(レジスタバンク)お よびIMFの内容をスタックからそれぞれリストアします。
② スタックポインタを3回インクリメントします。