CPU実験室

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

割込み処理(3)

これで下地ができたので割込み処理ルーチンを用意します。
これは画面に"#"を出すだけの単純な処理です。
最初のoutp文はタイムアウトでNMIに対して1を出力したフリップフロップを0にクリアするためです
void intr2(void)
{
 outp(TMR_LAT,0x00);	 /* End Of Interrupt  */
 putcom('#');
}

割込み処理では全レジスタを退避させ、終了後に復帰、IRETで終了させるためアセンブラでラップ関数を
用意します。
_int2:
  pusha
  call  _intr2
  popa
  iret

最後にアプリケーション側の対応です。
割込み待ちの無限ループ(「・」を連続出力)中にタイマ割り込みが発生して「#」が出力されるはずです
int main(void)
{
  tmr_start(3);	/* timer start 	*/
  while(1){          /* interrupt monitor  */
    putcom('.');
  }
}

実行させてみると割込み動作していることがわかります。
クロック20MHzを入力した16ビットタイマのタイムアウトで割込みがかかっているので
周期は約300Hzとなります。

イメージ 1

所々2発割込みが入ってるのが何か変。