割り込み(interrupt)はCPU外部あるいは内部で起こる「割り込み要因」によって実行しているプログラムを一時停止し、あらかじめ用意してある「割り込みハンドラ」プログラムに実行を移し、それが終了したところで元のプログラムの実行を再開するというものです。DeMでの割り込みの概要は以下の通りです。
Operation | Mnemonic | inCode | Opr2 | Opr3 | Opr4 | Opr5 | #bytes | Opcode | Ie | Cy | Cd |
---|---|---|---|---|---|---|---|---|---|---|---|
push SR:PC then PC <- (INTR Vector) | (interrupt) | ||||||||||
pop SR:PC | RETI | 1 | 66 | Y |
割り込みがかかると下記の一連の動作が自動的に行われます。
- プログラムカウンタ(PC)を含めたいくつかのレジスタがスタックに自動退避される。
- ステータスレジスタ(SR)の「Ie」桁がクリアされ、この先での割り込みが禁止となる。(多重割り込みの禁止)
- あらかじめ決められたアドレスー割り込みハンドラ(割り込み処理ルーチンともいう)の先頭アドレスーをPCにロードすることによってジャンプする。
割り込みハンドラ内では、割り込み処理が終わる場所にRETI命令が必要になります。RETI命令は割り込みによって自動退避されたレジスタおよびPCの値を復元することで元のプログラムに復帰します。
補足
- 割り込み要因は現バージョンではタイマー関係のみ実装しています。
- 割り込み時に自動退避されるレジスタはPC、SR、Aです。SR+PCが先、Aが後からプッシュされます。(Aを含めたのは、割り込みハンドラ内でほぼ確実にAを使う処理が発生するから。)
- 割り込みハンドラの先頭アドレス(ジャンプ先)は特定のシステムコールを使うことによって設定します。
- “RETI”は”Return from Interrupt”の略です。