あとはプログラム内で
ICUに割込みベクタ番号を設定
outp(IIW2,0x80); /* int no base:x80 */
割込みベクタに割込みルーチンのアドレスをセット
void set_vect(int no, void (far *func)())
{
long far *vector;
vector=(long far *)0x00000000+no;
*vector=(long)func;
}
3箙?潺襦璽船鵑竜述(入口と出口のインライン文をマクロ定義した)
void far func(void)
{
_INT_ENTR();
/*処理の本体*/
_INT_RET();
}
ですっきり割込みが記述できました。
INTP0にタイマ0で作った1kHzを接続して1ms割込みを発生させる例です
void far int1ms(void)
{
_INT_ENTR();
outp(IPFW,0x20); /* finish interrupt command */
count++;
if(count==1000){
count=0;
led(c++); /* 1秒ごとにLED点滅 */
}
_INT_RET();
}
void main()
{
devini();
/*割込みコントローラ初期化*/
outp(IIW1,0x13); /* edge mode,SNGL,II4 */
outp(IIW2,0x80); /* int no base:0x80 */
outp(IIW4,0x01); /* normal nest mpde */
/*タイマコントローラ初期化*/
outp(TCKS,0x18); /* TM0:Fxx clk/4 =6MHz TM1,TM2:1kHz*/
outp(TMD,0x34); /* TM0:mode2 */
outp(TCT0,6000%256);/* TCT0=6000; Fout=1kHz */
outp(TCT0,6000/256);
set_vect(0x80,int1ms);/* 割込みベクタ設定 */
ei();
outp(IMKW,0xfe); /* MASK解除 */
while(1){ /* 割込み待ち・何もしない */
}
}