CPU実験室

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

こちらも割込みテスト

最近の開発モノではNS32kボードでも実は割込みを確認していませんでした。このボードではCPUそのものの機能というよりは外付けのNS32202 Interrupt Control Unitのプログラミングに拠るところが大にはなりますが。

 

f:id:O3I:20210811170654j:plain

 

このチップに関しては機能のごく一部であるパラレル出力だけ確認して放置していましたが今度はちゃんとみてみます。構成はなかなか複雑でパラレル入出力の他、本来の割込みコントローラ、タイマが内蔵されています。

f:id:O3I:20210811172935j:plain

 

まずはソースコードに全ての内部レジスタのアドレスを定義しておきます。

f:id:O3I:20210811170800j:plain

 

この内部タイマでタイムアウト割込みを掛けてみようと思いますが、割込みの設定がかなり複雑でマニュアルの読み解きがかなり大変そう。取り急ぎタイマをフリーランさせるだけのコーディングをしてみました。

NS32202に内蔵されたタイマ(マニュアル文中では一貫してCOUNTERと呼んでいる)は16ビット長が2本。内部で連結させると32ビット長になり周辺デバイスのハードタイマとしては最長ではないでしょうか

ここでは32ビット長に設定したカウンタに初期値0x12345678、リロード値0x12345678を設定してカウントダウンの様子をHEX8桁表示しています。

カウンタレジスタなどはレジスタ2本を連結して16ビットレジスタになっているのもあり最初16ビット転送:movw imm16,@REGとやったのですがうまくいかずしばらく悩みました。考えればこれは当たり前で32ビット幅バスの最下位8ビット幅に割り付けたI/Oなので16ビット転送できるはずがありません。

地道に8ビット転送:movb imm8,@REGしています

f:id:O3I:20210811170817j:plain

カウンタのクロック入力はCPUクロックと同じ8MHzで順調にカウントダウンしているのが判ります。

リロード値を最大の0xFFFFFFFFにすると8MHzでカウントしても一周4294967295 / 8000000 =536秒で10分弱かかることになります。通常の応用では32ビットあれば十分ということでしょう

f:id:O3I:20210811170741j:plain