続いて同じ MUTIF09 シリーズの Am9511A 算術演算プロセッサボードを作成します。
設計者様が頒布されているドキュメントによると Am9511A は 6809 に接続するにはタイミングが厳しいチップのようですが、このボードではすでに様々な対策が施されています。基本このドキュメントの説明通りに作っていけばいいはずです。
しかしそそっかしい私は上図のジャンパを内部断線させてしまい、なかなか安定動作させることができませんでした。いくつか問題点を潰していき、最後に残ったトラブルが Am9511A のデータスタック読み出しが 1 バイトずれる問題。正確には、最後に書き込んだ 1 バイトがスタックトップを読み出す前に挿入されてしまいます。
幸いにもこれが MRDY 絡みの問題であることがドキュメントに明記されていたので、関係する箇所を順にあたっていき、断線を発見。再発防止のためポリウレタン線を直接はんだ付けする方法でジャンパをやり直しました。
これで大方の問題は解決したので、sqrt(2) を求めるサンプルプログラムを実行します。
スタックトップに整数値 2 を積んで SQRT 演算命令を発行するサンプルプログラムを実行。計算結果は 32 ビット浮動小数点データとしてメモリに読み出されます。この値を読みやすい 10 進数に変換して結果を確認したいところ。設計者の @yKasumi 様はこのための変換ツールまで提供されています。ありがたや…
計算結果は正しいようです。下の方の桁が「…ひとみごろ」からずれていますが、32 ビット浮動小数点値は元々これくらいの精度なので問題ありません。
ちなみに 6809 Basic の浮動小数点値は 40 ビットの「拡張単精度」なので、こちらで計算するともう少し精度が上がります。
ただし完全にソフトウェア演算であるため速度は落ちます。
計算速度の差を体感できるのが asciiart デモです。これも Github リポジトリにサンプルプログラムが用意されていますが、私のソフトウェア環境に合わせて若干手を入れました。ここでも設計者様提供のツール hex2data.py が役に立ちます。(変更したプログラムはこちら)
実行速度データは次の通りです。
MUTIF09 6809SBC | MC68B09 2MHz / Am9511A-4DC 2.048MHz |
Basic+ ハードウェア FP |
1′ 49″ (うちマシン語展開時間が 0′ 03″) |
さすがに速い。ちなみに以前アセンブラで高速化しようとした結果は次の通りです。
SBC6809 | MC68B09 1MHz | アセンブラ+ Basic FP ルーチン |
3′ 29″ |
特に工夫せず Basic だけで計算すると次の通りでした。
SBC6809 | MC68B09 1MHz | Extended Basic | 9’12” |
6809 のクロックスピードが違うため正確な比較はできません。参考程度に見てください。
ところで Am9511A が極端に発熱することは MUTIF09 Am9511A ボードドキュメントにも説明されているのですが、asciiart デモは反復計算中に浮動小数点演算が多数含まれるので、あっという間にチップが加熱します。この影響で、チップの動作が計算途中で止まってしまいます。下図の例では、熱暴走後は何を計算しても “0” が印字されます。
チップに取り付けるヒートシンクや冷却ファンが手元になかったので、はんだ作業用に使っている卓上ファンを回しつつプログラムを実行させることでしのぎました。「もしかして放熱フィンの代わりになるかも?」と Am9511A の上にビールの空き缶を乗せてみましたが(乱暴)、こちらは目立った効果がなかったようです。