割込みに入って戻るまでの内容を以下に示します。
①割込み発生。
②CPUが割込みを通知される。
③CPUはプログラム・カウンタとモード・レジスタの値をアトミックにスタックに格納(退避)する。(CPUの回路が複雑になるのを避けるためにたいてい一部のレジスタに限られる)
④CPUは割込み要因に応じて割込みベクタに設定してあるアドレスをプログラム・カウンタに強制的に書き換える。
⑤CPUはモード・レジスタを割込み無効に書き換える。
⑥割込みハンドラで汎用レジスタをスタックに格納(退避)する。
⑦割込みハンドラで引数の準備をするためにレジスタを変更する。
⑧割込みハンドラで関数を呼び出し、割込み要因のクリアを実行しつつ割込み処理を実施する。
⑨割込みハンドラで⑥で格納したスタックの値を汎用レジスタに値を格納(戻し)する。
⑩割込みハンドラでrteを実行し、③でスタックに格納した値をプログラム・カウンタとモード・レジスタにアトミックに格納(戻し)する。
ここでのポイントは割込みハンドラの記述である。
アセンブラで書く必要がります。
#include "intr.h"
.h8300h
.section .text
.global _intr_softerr
# .type _intr_softerr,@function
_intr_softerr:
mov.l er6,@-er7
mov.l er5,@-er7
mov.l er4,@-er7
mov.l er3,@-er7
mov.l er2,@-er7
mov.l er1,@-er7
mov.l er0,@-er7
mov.l er7,er1
mov.w #SOFTVEC_TYPE_SOFTERR,r0
jsr @_interrupt
mov.l @er7+,er0
mov.l @er7+,er1
mov.l @er7+,er2
mov.l @er7+,er3
mov.l @er7+,er4
mov.l @er7+,er5
mov.l @er7+,er6
rte
.global _intr_syscall
# .type _intr_syscall,@function
_intr_syscall:
mov.l er6,@-er7
mov.l er5,@-er7
mov.l er4,@-er7
mov.l er3,@-er7
mov.l er2,@-er7
mov.l er1,@-er7
mov.l er0,@-er7
mov.l er7,er1
mov.w #SOFTVEC_TYPE_SYSCALL,r0
jsr @_interrupt
mov.l @er7+,er0
mov.l @er7+,er1
mov.l @er7+,er2
mov.l @er7+,er3
mov.l @er7+,er4
mov.l @er7+,er5
mov.l @er7+,er6
rte
.global _intr_serintr
# .type _intr_serintr,@function
_intr_serintr:
mov.l er6,@-er7
mov.l er5,@-er7
mov.l er4,@-er7
mov.l er3,@-er7
mov.l er2,@-er7
mov.l er1,@-er7
mov.l er0,@-er7
mov.l er7,er1
mov.w #SOFTVEC_TYPE_SERINTR,r0
jsr @_interrupt
mov.l @er7+,er0
mov.l @er7+,er1
mov.l @er7+,er2
mov.l @er7+,er3
mov.l @er7+,er4
mov.l @er7+,er5
mov.l @er7+,er6
rte
①割込み発生。
②CPUが割込みを通知される。
③CPUはプログラム・カウンタとモード・レジスタの値をアトミックにスタックに格納(退避)する。(CPUの回路が複雑になるのを避けるためにたいてい一部のレジスタに限られる)
④CPUは割込み要因に応じて割込みベクタに設定してあるアドレスをプログラム・カウンタに強制的に書き換える。
⑤CPUはモード・レジスタを割込み無効に書き換える。
⑥割込みハンドラで汎用レジスタをスタックに格納(退避)する。
⑦割込みハンドラで引数の準備をするためにレジスタを変更する。
⑧割込みハンドラで関数を呼び出し、割込み要因のクリアを実行しつつ割込み処理を実施する。
⑨割込みハンドラで⑥で格納したスタックの値を汎用レジスタに値を格納(戻し)する。
⑩割込みハンドラでrteを実行し、③でスタックに格納した値をプログラム・カウンタとモード・レジスタにアトミックに格納(戻し)する。
ここでのポイントは割込みハンドラの記述である。
アセンブラで書く必要がります。
#include "intr.h"
.h8300h
.section .text
.global _intr_softerr
# .type _intr_softerr,@function
_intr_softerr:
mov.l er6,@-er7
mov.l er5,@-er7
mov.l er4,@-er7
mov.l er3,@-er7
mov.l er2,@-er7
mov.l er1,@-er7
mov.l er0,@-er7
mov.l er7,er1
mov.w #SOFTVEC_TYPE_SOFTERR,r0
jsr @_interrupt
mov.l @er7+,er0
mov.l @er7+,er1
mov.l @er7+,er2
mov.l @er7+,er3
mov.l @er7+,er4
mov.l @er7+,er5
mov.l @er7+,er6
rte
.global _intr_syscall
# .type _intr_syscall,@function
_intr_syscall:
mov.l er6,@-er7
mov.l er5,@-er7
mov.l er4,@-er7
mov.l er3,@-er7
mov.l er2,@-er7
mov.l er1,@-er7
mov.l er0,@-er7
mov.l er7,er1
mov.w #SOFTVEC_TYPE_SYSCALL,r0
jsr @_interrupt
mov.l @er7+,er0
mov.l @er7+,er1
mov.l @er7+,er2
mov.l @er7+,er3
mov.l @er7+,er4
mov.l @er7+,er5
mov.l @er7+,er6
rte
.global _intr_serintr
# .type _intr_serintr,@function
_intr_serintr:
mov.l er6,@-er7
mov.l er5,@-er7
mov.l er4,@-er7
mov.l er3,@-er7
mov.l er2,@-er7
mov.l er1,@-er7
mov.l er0,@-er7
mov.l er7,er1
mov.w #SOFTVEC_TYPE_SERINTR,r0
jsr @_interrupt
mov.l @er7+,er0
mov.l @er7+,er1
mov.l @er7+,er2
mov.l @er7+,er3
mov.l @er7+,er4
mov.l @er7+,er5
mov.l @er7+,er6
rte