CPU実験室

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

浮動小数点演算

time_t型のUNIX時刻表示は実はズルをしていて、本来は日本時間より9時間前の標準時UTCで読取ってlocaltime()で日本時間のtm構造体にするのが正解です。
RTCからは直接tm構造体で日本時間が読取れるのでこれをmktime()でわざわざtime_t型にする必要がないし、変換しても正しいUNIX時刻ではなかったですね。
 
ということで別のお題。
68040が68000と違うところはFPUのサブセットが内蔵されていることです。
こんな実数計算を含むプログラムを実行させてみます
 
イメージ 1
 
68040のFPUはsin,cosなどの超越関数はバッサリ割愛され四則演算と平方根しかありませんがsqrt()だけならコプロセッサ命令で演算できます。
 
コンパイル結果がこれ。
たしかにFDSQRTX命令をインラインで生成しています。
18~22行目は68LC040のようなFPUが無いチップで実行されたときの代替ソフト処理ルーチンのようです

イメージ 2
 
コンパイルが通ったのでボードに転送して実行させると・・・
いきなり原因不明の例外が発生して動きません。
ソースをコメントアウトしながら確認していくとsprintfの書式指定子%e(浮動小数点形式表示)の処理でトラップしています。
なにかリンクの仕方が悪いのか、ライブラリ側がおかしいのか全く分からず・・・
 
整数表示%ldなら大丈夫なので1000,000倍して小数点以下6桁までlong型として表示させました。実数演算そのものはちゃんと実行されています
 
イメージ 3
 
実行後にまた変な例外が発生していますが。