ソフトウェア割り込みハンドラ(#pragma interrupt_brk)


ソフトウェア割り込みに対応したオブジェクト・コードを出力します。

[機能]

-

割り込みベクタが生成されます。

-

対象の関数定義をソフトウェア割り込みハンドラとして,RETBによる復帰コードが生成されます。

-

割り込みハンドラ定義は通常関数同様に,.textセクションに出力されます。セクション名は,#pragma sectionにより変更可能です。
ただし,割り込みハンドラの先頭アドレスは16ビットでアドレッシングできなければなりません。

-

明示的,暗黙問わず__farを指定しても強制的に__near指定となります。
警告は出力しません。

[効果]

-

Cソース・レベルで割り込みハンドラの記述が可能となります。

[方法]

-

#pragma指令に関数名,割り込み仕様を指定します。

-

#pragma指令は関数定義の前に書きます。

#pragma interrupt_brk   [(]割り込みハンドラ名[(割り込み仕様 [,...])][)]

 

割り込み仕様には,以下のものを指定できます。

項目

形式

内容

レジスタ・バンク指定

bank={RB0|RB1|RB2|RB3}

割り込みハンドラ内で使用するレジスタ・バンク。

レジスタ・バンクを変更し,汎用レジスタをスタックに退避しません。

ただし,ESとCSはスタックに退避します。

本指定を省略した場合,汎用レジスタはスタックに退避します。

多重割り込み許可指定

enable={true|false}

true: 関数入口での多重割り込みを可能とします。

つまり,コンパイラが生成する割り込みハンドラの先頭にEIを生成します。

false: EIを生成しません。enableを省略した場合は,EIを生成しません。

割り込み時のレジスタ退避やスタックフレームの詳細は「9.1関数呼び出しインタフェース」を参照してください。

 

同一の項目を,同時に複数回書く場合はコンパイル・エラーとなります。

#pragma interrupt_brk func(bank=RB0, bank=RB1) // エラー

 

本#pragmaはベクタテーブルを生成します。このため,スタートアップ・ルーチンなどにアセンブリ言語のセクション定義疑似命令でベクタテーブルを定義していると,リンク時にエラーとなります。

アセンブリ言語でもベクタテーブルを記述するには,セクション定義疑似命令ではなく.VECTOR疑似命令で記述してください。

[制限]

-

割り込みハンドラを通常関数のように呼び出すと,コンパイル・エラーとなります。

-

__inline,__callt,および他の#pragma を指定すると,コンパイル・エラーとなります。

-

割り込みハンドラは,引数,戻り型ともにvoid型で宣言しなければなりません(例:void func (void);)。
void型でない場合はコンパイル・エラーとなります。

-

割り込みハンドラ中にレジスタ利用や関数呼び出しがない場合,#pragma interruptでレジスタ・バンク切り替え指定をしてもレジスタ・バンク切り替え命令は出力しません。

[使用例]

割り込み要因がBRKであり,復帰コードにRETBを使うことを除けば,出力プログラムは#pragma interruptと同じとします。

よって,割り込みハンドラ中に関数呼び出しがない場合の使用例を示します。

 

【入力プログラム】

#pragma interrupt_brk   inter
 
void __near inter ( void ) {
        /*割り込み処理(AX,HL,ESのみ使用)*/
}

 

【出力プログラム】

_inter  .vector 0x007E          ;BRK
        .SECTION    .text, TEXT
_inter:
        push    AX              ;使用する汎用レジスタの,スタックへの退避コード
        push    HL
        mov     A, ES
        push    AX
 
        ;BRK命令に対する割り込み処理(関数本体。AX,HL,ESのみ使用)
 
        pop     AX              ;使用する汎用レジスタの,スタックからの復帰コード
        mov     ES, A
        pop     HL
        pop     AX
        retb