CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

割込みテスト 続き

あとはプログラム内で
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){ /* 割込み待ち・何もしない */
}
}