動かなくて悩んでいた例外処理ですが、わかってみれば簡単なことでした。
例外関係をもう一度始めから実装しなおしてみました。今度は一歩ずつ確認しながら進めていったのですが、やはり変です。デバッグ用にストア命令を追加したりするととたんに動作が変わってしまいます。
広義の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.
関係者から聞いた話2
>なぜか浮動小数点数はイミディエイトが使えない
V60開発終盤になってマイクロコードROMの容量が足りなくなって8080モードなどと一緒に削られたそうです。シミュレーションではZ80モードも動いていたとか。余裕があれば68000モードも作れるとか。V70ではマイクロコードROMを増量しカスタム命令を突っ込めるようにしたとか。
>やはり性能を求めるならμPD72691を付けろということなのかな。
登場が遅れたためにV80の内蔵FPUより遅いという存在意義が問われる石でした。一応、FPUレジスタと80bit演算とベクトル行列関数サポートなどが追加されたため、価値がないわけではないのですが。
遅れの理由は、8087上位互換のuPD72191の不具合(プロセス変更1回、全層改版6回、メタル改版20回ぐらいとか)が取り切れず、開発中止からのuPD72291に仕様毎最初から作り直しになったから。
8087完全互換のuPD72091は企画のみと聞きます。uPD72191は特定顧客向けにuPD9008として出回ったと言われていますが、それについては知らないとのことでした。
>アセンブラの表記はMC68000系っぽさとIntelっぽさが混在した変な感じ
純正アセンブラはV30のニモニックに寄せていたため、Intelぽさはそのせいかもしれません。
Re: 関係者から聞いた話2
ということはV60でV30をエミュレーションして、さらにその中で8080エミュレーションが動いていたということですか? さらにZ80モードも。
そういえばV30にZ80エミュレーション積んだ石は自社パソコンに使用例がありました。
μPD72091は初耳です。μPD72191は難産の上に結局中止ですか。
やはりFPUは難しいのでしょうね。ZilogのZ8070も中止になっています。
コメントを追加