割込みサービスルーチンは書けたので改めてお膳立ての部分を見直しています。しばらくぶりに29kのアセンブラをやってみるとやはりそれぞれの個性で気になる部分もでてきて、すこしでも使いやすくなるよう工夫してみました。
まず32ビット即値代入というのはあちこちで必要になりますが1命令ではできません。そのためCONSTD(ダブルワード定数代入)というのをマクロで記述しました。そのほか32ビット値の上位下位ワード取り出し(loword/hiword)や、29kではビットオリエンテッドな命令が無いため特定ビットをマスクする定数を発生させる関数(setbit/rstbit)も定義しています
これらを使い、設定値等も見直したメインルーチンがこうなりました。
・メッセージ出力
・8255設定
・タイマ値TMC設定
・タイマリロード値TMR設定
・割込みベクタテーブルVAB設定
・カレントプロセッサステータスCPS設定
・割込み待ち永久ループ
の順となります
この中で悩んだのがCPSの設定値です。この制御レジスタにはいろいろなコントロールが寄せ集めになっていて、弄りたいビット以外をうっかり触ると訳の分からない動きになります(特にSM(スーパバイザモード)、WM(ウェイトモード)とか)
ここではリセット時の値(0x00000473)から必要なビットのみ変更して書き戻すことにします
まずクリアしたいのは全ての割込みを禁止しているDA(Disable All interrupt)ビットでこれは明解です。よくわからないのがFZ(freeze)ビットでプログラムカウンタをロックする機能らしいのですがどうすればよいのか。。ただこれが立っていると割込み時に不可解な動きをするのでクリアし、結果CPSには0x00000072を書き込むことになります。
あとCPSを操作して割込み許可にするのは割込みを待つ直前でなければなりません。意図しないタイミングで勝手に割込みがかかると暴走します、というのは当たり前なことで、しかも今回サービスルーチンは手抜きしてレジスタの退避をしてないから、というのもあります。
ともあれ、これで割込みによるLEDチカチカが正常動作しました。準備が大変な割に見た目の結果は地味です。