動かなくて悩んでいた例外処理ですが、わかってみれば簡単なことでした。
例外関係をもう一度始めから実装しなおしてみました。今度は一歩ずつ確認しながら進めていったのですが、やはり変です。デバッグ用にストア命令を追加したりするととたんに動作が変わってしまいます。
広義のprintfデバッグです。HEXOUT8ルーティンなどを使ってコンソール出力するのも手ですがそれだとスタックを消費するので
MOV R0,/0F80H
などとしてメモリに書きます。EMILY Boardではプロセッサの状態にかかわらずメモリを読めますのでこれで十分です。
どう考えても関係なさそうなところを変更しても影響が出ます。
なにか重大な勘違いをしているのではとリファレンスマニュアルを読み直していると……
割込・例外のハンドラはワード境界になければならないと書かれているではないですか。
ハンドラは後ろの方にあるので変更のたびにアドレスがずれてこの条件を満たしたり満たさなかったりしたようです。各ハンドラの前にALIGN 4
を追加したところ安定して動作するようになりました。
TRAP命令によるAPIが使えるようになったので恒例のマンデルブロ集合を描かせてみました。
NS32016+NS32081のものをそのまま移植することにします。汎用レジスタがそのまま浮動小数点レジスタとして使えるので数は十分あり、F0→R8, F1→R9,...と対応させました。なぜか浮動小数点数はイミディエイトが使えないので定数はメモリに置いています。Bcc命令の条件にちょっと手こずった以外は特に問題はありませんでした。
他のFPUありでの結果は、MN1613で約7sec@12MHz、NS32016+NS32081で約5sec@2.5MHzでしたから、思ったほど速くないなというのが第一印象です。MN1613はともかくNS32016+NS32081を10MHzで動作させれば同じくらいになりそうです。登場時期を考えるともう少し速くてもいいのになぁ、と思ってしまいます。
やはり性能を求めるならμPD72691を付けろということなのかな。
添付ファイル
参考文献・関連図書
”μPD70616 Programmer's Reference Manual", NEC Electronics.
コメントを追加