CPU実験室

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

割込みプログラム

LSIC-86で記述したモニタが動作しているので、ユーザプログラムもCで書いてデバッグを進めていきます
 
8259による割込み動作の確認をおこないますが、既に他の86系ボードや8085ボードでも試しているので同様に記述していきます。
 
先ずは割込みハンドラの本体。
あまり複雑なことはせずに大域変数cntをカウントアップするだけにしておきます。
LSIC-86では関数に対して割込み処理であるということを宣言できないので、内部で使うレジスタの退避復元、関数を「IRET」で終わらすためにインラインアセンブラで記述する必要があります。
ここでは_INT_ENTR()、_INT_RET()という自作マクロで見た目きれいにしています。
 
 
イメージ 1
次に割込みベクタのセットですが、8086CPUではアドレス先頭0番地から割込みタイプ00~FF、256個の飛び先をオフセット+セグメントの4バイトづつセットするベクタテーブルが確保されています。
 
この即値アドレスへ割込みハンドラの実アドレスをセットする処理です。
モニタ内の8259初期化処理で割込みタイプのベースを0x20としているので、IRQ0~7に対応する割込みタイプは0x20~0x27となります。
変数vectorに対応するアドレスをセットして、そのアドレスへ割込みハンドラのアドレスをセット。
 
ついでに8259に対して受け付けたいIRQのマスクを外しています。
イメージ 2
いままでのボードでも確かにこのような記述でちゃんと動いていて間違いは無いと思うのですがアドレスを無理やりlongでキャストしているのがどうも気持ちが悪いのです。
コンパイラの中では論理アドレスもlong型も同じ4バイトの内部表現で互換なのでしょうが、正しくは関数へのポインタなので本来はキャストせずにこう書きたいのですが、どうしても代入ができません。
 
イメージ 3

「関数へのポインタ」というのは途中に空のカッコが入ったり、関数名自体が既に関数へのポインタであったり
するわけでいつも頭がこんがらがります。
上の記述もたぶん何か勘違いしてるのですけど解決してません。