現在地

NS32081を追加してみた


テーマ:

カテゴリー:

NS32016ボードのコメントにちょっと書いたようにNS32081 FPUを搭載してみました。


空きエリアに24ピンソケットを置いてNS32081D-10を載せます。

このFPUはたったの24ピンしかないのにバスは16ビットあります。接続は簡単でデータシートの通りにNS32016の同名の信号と接続するのみ、CPU空間のデコードを必要とするMC68881などよりシンプルです。あ、クロックだけはNS32201から引っ張ってきます。

MC68881/68882と異なり複数搭載はできません。いや、外部にセレクタ置けば出来なくはないのかな?

ハードウェア的に接続出来たら次はソフトウェアですが......

試しにSETCFGで"F"ビットを立てておいてゼロ除算を実行してみたところSlave Processor Trapが無事発生して動いている(石が生きていて、正しく接続されている)らしいことが確認できました。

これだけでは何なのでMN1613のときと同様にマンデルブロ集合を試すことにします。

単精度(32ビット)ならレジスタが8つ使えるのでワークエリアを使わずレジスタのみでサラサラと書けます。それで一気に書き上げて実行してみたところ......

Slave Processor Trapが発生してしまいました。アドレスから終了判定の乗算命令であることまではわかりましたが、それ以上の情報が全くありません。念のためFSRのIEN, UENビットを落とすようにしてみましたが変化ありません。(両ビットは初期状態で0だったようです)

このままでは埒が明かないのでトラップ時にCPUレジスタだけでなくFPUレジスタも表示するようにUniversal Monitorを変更します。

まだ表示のみで実行時に任意の値をセットする機能はありません。この変更についてはある程度まとまったところで書くつもりです。

再度実行するとトラップ時のFSRの値は00000042HでこれはOverflowを表しています。問題の命令はMULF F4,F4なのでF4の値はというと0EEF2B582H、これではさっぱりなのでネットの変換ツールで10進にしたところ-3.75574...e+28で確かにこれを2乗したらオーバフローすることがわかります。

同様に他のレジスタの値も確認し、コードも見直していったところ......

終了判定のBcond命令を誤って終了せずに発散してしまっていたのでした。

NS32000ファミリには大小判定のフラグがL(符号無し)とN(符号付き)の2種あり、浮動小数点の比較ではNのみ変化するのに対してLを参照してしまっていたのでした。

これを修正したところ動作しました。


実行時間は約5秒ほどで約7秒だったMN1613よりも少し速いですね。こちらはまだ暫定のクロック発振器のままで2.5MHz動作なので、CPU, FPUの定格である10MHzまで上げればMN1613の約5倍くらいの速度となるでしょう。

あとNS32082 MMUもあるのですが、もう載せる場所がありません。

載せるなら下駄対応かなぁ。

添付ファイル: 
参考文献・関連図書: 
NS32081-10/NS32081-15データシート, National Semiconductor.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。