2023-12-21 14:01 — asano
カテゴリー:
NS32081を追加してみたで書いたように、マンデルブロのデバッグ中に必要に迫られてモニタのFPU対応を書き始めたわけですが、一段落したのでここで簡単にまとめておきたいと思います。
トラップとダンプ
最初は当面のデバッグに必要な、トラップが発生したらレジスタを保存し、その内容をダンプする、機能を作りました。
NS32000ファミリはFPUのレジスタを直接メモリに書き込む命令が存在するので保存は簡単です。CPUのレジスタを保存した後にFPUレジスタも保存します。
ダンプも16進で表示するだけなら特に難しいことはありません。NS32081にはステータスのFSRレジスタの他に単精度の浮動小数点数を格納できる32ビットのレジスタがF0~F7の8本あります。これはF0とF1を連結して倍精度の64ビットのL0として使用することもでき、同様にL2, L4, L6と合計4本の64ビットレジスタとしても使用可能です。ダンプ時はF0~F7として表示します。
変更と実行
上記のダンプで当面の目的だったマンデルブロのプログラムは動作するようになりましたが、一通りの機能は実装しておこうということでFPUレジスタを変更して実行する機能を追加しました。
変更は16進で入力するならR0~R7と同様に処理するだけです。
実行時のレジスタ設定もトラップ時の逆を行なうだけです。
10進対応
利便性を考えると表示・入力共に10進対応を考えたいところですが......
これは結構処理が大変(私の経験があまりないこともあり)なこともあって当面実装する予定はありません。整数レジスタも16進以外を使いたい場合は別途変換しているわけですから。
単精度と倍精度を別処理しなくてはならないという理由もあります。
さらに、現時点でバイナリサイズが4kBに迫っているということもあります。16ビットでEMILY Boardを使う場合はメモリ容量が8kBなのでこれ以上大きくしたくないということもあります。
NS32181対応
NS32181(とNS32381)では64ビットのL1, L3, L5, L7レジスタが追加されて倍精度でも8本のレジスタが使用可能になります。この追加された4本は32ビット2つに分割使用はできないので32ビットレジスタは8本のままです。
これは気が向いたら対応するかもしれません。
が、NS32181は入手難ですし、NS32381は高価なので......
FPU存在判定
現在FPU対応はビルド時のオプションになっていますが、できれば同一バイナリでFPU有り無し両方に対応したいところです。
というわけでFPUの有無を判定できないか試してみました。
FSR(他のレジスタでもいいですが)を書き換えられるか判定すればいいと思ったのですが......
まずNS32000ファミリでは、CFGレジスタのFビットがFPUを使用する命令の動作を切り替えています。Fビットが"0"でFPU命令を実行しようとするとトラップが発生し、必要ならソフトウェアでエミュレーションすることができます。Fビットが"1"の場合はFPUで実行されます。
このFビットはFPUの有無に合わせてSETCFG
命令でセットしなくてはなりません。
FSRにアクセスするためには"1"にしなくてはならないのですが、もしFPUが無いのにFビットを"1"にしたら何が起こるでしょう?
ということで一時FPUを外して試してみたところ...... 何とハングアップしてしまいました。
手動(何らかのコマンド)で切り替えるしかないのかな。
幸いモニタはG(o)コマンド実行まではFPU命令を実行する必要は無いのでコマンドからでも特に支障は無いはず。
手動切り替えは現状のハードウェアで確認可能なのでそのうち対応するつもりです。
コメントを追加