CPU実験室

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

浮動小数点演算

NS32032ボードでマンデルブロ集合の計算をやってみました。NS32k用のCコンパイラGCCがあるようですがコンパイラ自体をビルドする準備か大変そうなのでまずアセンブラで書いてみます。

前にi386ボードでも動かしたプログラムですが複素数c=a+biマンデルブロ集合に含まれるかどうかを判定する関数mandel_chk()をもう一度示します

 

f:id:O3I:20200503144949j:plain

この浮動小数点演算をアセンブラで記述する、というと気が遠くなります。やったとしても演算サブルーチンへのコールの嵐になりそうですが、このボード上のコプロセッサNS32081で拡張された命令を使えば非常にシンプルに記述できます。数値のオーバーフローや桁落ちを気にすることなくC言語で記述してある通りに命令を並べていくだけでできてしまいます。

アセンブラmandel_chk

f:id:O3I:20200503145018j:plain

計算途中の値も内蔵されたレジスタに保持していて高速で処理できます。NS32kシリーズにはPUSH/POPに相当する命令がないのですが代わりにTOS(Top Of Stack)というアドレッシングがありこれをつかった書込み、読出しを行うと自動的にFILO処理をしてくれます。

 

これを呼ぶ側のメインルーチンの例です。ここではマンデルブロ全体像が見えるように実軸-2~+1、虚軸-1.5~+1.5の範囲をそれぞれXDIV、YDIVに分割して各座標でのmandel_chkの値を求めています

 

f:id:O3I:20200503175311j:plain


最初は動作確認だけなのでメッシュを80×40と荒くしてキャラクタ座標にASCII文字を置くという処理にしています。その点がマンデルブロ集合に含まれれば” ”(スペース)、発散したら発散した時のループ回数にしたがってそれ以降のASCIIコードを出力しました。

 

以下は実行例でそれらしい形になっていてうまくいっています。この出力時間は約30秒でした。

実軸のインデックス変数がデクリメントなので左右ひっくり返っているのと、出力したキャラクタコードが何かの制御コードと一致してズレてしまっている行があるのはご愛嬌です

 

f:id:O3I:20200503145202j:plain