CPU実験室

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

FPUテスト

最後まで残っていたFPU:NS32081をソケットに挿入しました

 

f:id:O3I:20200202113726j:plain

モニタも起動するのでデバッグは容易です。まず単純にFPUのレジスタに値が代入できること、簡単な演算ができるかテストプログラムで確認しました

 

f:id:O3I:20200202124037j:plain

 

1行目のsetcfg [F]はCPU内のCFGレジスタにFPUが存在することを示すフラグを立てます。これが無いとFPU命令をフェッチしたときに不正命令としてトラップしてしまいます。次いでFPU内のレジスタF0,F1に実数を即値で代入、加算します。

演算自体はこれで終了なのですが浮動小数点フォーマットは目で見ても読めないので一気に1000000倍してから整数に丸めてレジスタ内容を読んでみます

 

f:id:O3I:20200202113953j:plain

最終的にR0レジスタに残った値は0x00596A22でした。これは10進では5859874。

電卓による計算だと(3.1415926+2.7182818)=5.8598744なので合っています。最後の1桁が桁落ちしてますが32ビット単精度浮動小数点フォーマットの10進での有効桁数は7桁程度なのでこんなもので良いでしょう。ほんとうは浮動小数レジスタを直で10進表記に変換したいのですがアセンブラでやろうとするとそうとう面倒です。Cが使えればprintf系の関数の%f,%g書式制御で一発で済むところなんですけど。

NS32081浮動小数点コプロとしては機能が限定的で単精度、倍精度での四則演算と各種丸めしかサポートしていません。もっとも内部処理だけ実数演算を行い結果が0/1のように整数に丸められるならば十分でしょう。マンデルブロ集合計算はまさにそれであとでやってみようと思います。

一方MC68020コプロセッサMC68881/2は80ビット拡張倍精度で四則演算のほか各種の超越関数、数学定数発生もできるスグレモノなんですが、その中でも便利なのがパックドBCD実数が扱えることです。FMOVEP命令でレジスタ内容をメモリ上に転送し、1文字づつASCIIコードに変換すればすぐに可読な10進文字列表記になります。MC68020ボードのモニタでFPUレジスタダンプにこれを使っています。

f:id:O3I:20200202121236j:plain