平成26年4月 10日
割り込み処理部分の検証
xprintf()関数の説明の前にモニタプログラムの割り込み処理部分の動作が正しく行えることを確認してみます。確実な方法は実際に割り込みを入力することですが、実験装置はSuperAKI-80のみで基板内部からCPUに割り込みを発生させるには、それなりの準備が必要です。80系のいい所は割り込み動作が事実上CPUの特定命令によって実現されている点です。つまり、実際に割り込み処理を行うのに割り込み信号を入力しなくても、特定命令を実行することで同じ動作が行えます。
先のターゲットプログラムtest.cのリストの内、main関数より下部分を下記のように変更します。注意箇所は青色太文字にしてあります。従来は”hello waorld”と表示して終わりでしたが、その直後にRST命令と”From main”表示を追加します。
RST命令はINT割り込みが発生したときの割り込みと同じ動作をします。このときのジャンプ先アドレスは08番地です。
割り込み処理ルーチン処理部では新たに_rst8()関数を定義し、未使用な割り込みアドレス用に定義していたdefaultInterrupt()関数のリストから08番地を削除(コメントアウト)しています(以前の説明では定義部の一行だけを削除すればいいと書いたのですが、これは誤りでした。一緒にglobal宣言部の関数名も削除が必要です。訂正します)。
{
initCTC3();
initSIOA();
SIOA_puts("hello world");
#asm
RST 08h
#endasm
SIOA_puts("From main");
while(SIOA_transmitNow())
;
#asm
DI
JP 0
#endasm
}
#pragma int_reti_n
void defaultInterrupt(void)
{
}
void _rst8(void)
{
SIOA_puts("From rst8 interrupt");
}
#pragma noint_reti_n
#asm
;global __rst8
;__rst8 EQU _defaultInterrupt
global __rst10
__rst10 EQU _defaultInterrupt
global __rst18
__rst18 EQU _defaultInterrupt
global __rst20
__rst20 EQU _defaultInterrupt
global __rst28
__rst28 EQU _defaultInterrupt
global __rst30
__rst30 EQU _defaultInterrupt
global __rst38
__rst38 EQU _defaultInterrupt
#endasm
#pragma int_retn_n
void _NMI(void)
{
}
#pragma noint_retn_n
割り込み処理関数内では”From rst8 interrupt”と表示しますので、実行結果は
”hello world”
”From rst8 interrupt”
”From main”
の順に表示されることになります。
実行結果を下記に示します。モニタプログラムが動作するようになったことでプログラムの確認作業は非常に簡単に行えるようになりました。