V60ボード(ソフトウェア編 その1)

2025-08-17 13:37 — asano

テーマ

カテゴリー

前回書いたようにモニタ移植して例外処理を調べていたのですが、先日遂にコロナに罹ってしまいあまり進捗していません。

そこで現時点でのまとめを書いておこうと思います。

Universal Monitorの移植は基本MC68000用をベースにL(oad), P(unch)コマンドについてはH8/300H用を元にしています。この辺りの事情はNS32016のときと一緒です。早くMC68000用も長いアドレス対応しなくては。

いつものように移植にあたって気付いたV60の特徴を挙げてみます。

  1. 汎用レジスタ
    汎用レジスタは32ビット長のものがR0~R31まで32本もあります。レジスタの上下分割はできませんが数は十分なので困ることはありませんでした。モニタでは半分も使っていません。
  2. アドレッシングモード
    MC68020のものと同様のものは大体揃っている感じですが、ディスプレースメントもイミディエイトも32ビット対応で必要に応じて8ビットや16ビットのエンコードを用いて命令長を抑える仕組みです。イミディエイトにはさらに4ビットの形式もあります。
    これらのアドレッシングはほとんどの命令で使用できます。例えばMC68000のTRAP命令のベクタは定数のみですが、V60ではどのアドレッシングも使用可能です。
  3. サブルーチン命令
    サブルーチン呼び出しは2種類あります。
    一つはBSR, JSRRSRで、戻り番地をスタックに積んで飛んでいきます。モニタではこちらを使用しています。
    もう一つはCALLRET、戻り番地以外にAP(Argument Pointer)もスタックに積まれます。これはFP(Frame Pointer)とは別です。
  4. 文字列命令
    8ビットまたは16ビットの文字列を扱う命令があります。アドレスと長さで管理する形式なのがちょっと残念(コピーだけならMove Character with Stopper命令が使えそう)です。モニタでもSKIPSPに使えそう(現在使ってはいません)です。
  5. Processor ID
    PIR(Processor ID Register)を持っておりデコードするだけでプロセッサ判別が可能です。手持ちのものでは00006008Hが入っていました。上16ビットは将来の予約、次の8ビットの60HはV60を表し、下8ビットはNECの予約になっていますがリビジョンかな。

ハードウェアの確認で起動メッセージまで動いた後、D, S, G, L, Pとコマンドを実装していきましたが特にハマることもなくさくさく進みました。アセンブラの表記はMC68000系っぽさとIntelっぽさが混在した変な感じでしたがすぐに慣れます。

それでR(egister)コマンド実装の前に例外発生時の処理を書き始めたのですが……

デバッグしようとちょっと変更すると想定外の動作が変わってしまう現象が出てしまい、落ち着いて一歩ずつ追おうとしたところで停滞中といったところなのです。

参考文献・関連図書
”μPD70616 Programmer's Reference Manual", NEC Electronics.

>下8ビットはNECの予約になっていますがリビジョンかな。
おそらく(実際には作られなかった)派生品種用だと思います。

>デバッグしようとちょっと変更すると想定外の動作が変わってしまう現象
Z8000みたくワード境界にアドレスやデータ等を置かないと挙動がおかしくなるのかもしれません。他にも68000や64180のように未定義動作で例外が発生することなく、おかしな挙動のまま突き進む石だった気が。

V60はMMUやFPUが最初から備わっている代わりに、マイクロコードで実行するので命令サイクルが50~100サイクル掛かる上、マイクロコードの命令はパイプライン動作しないので、理論値3.5MIPSだけど実効値0.8MIPSぐらいだった。
ハードウェアのバス周りは内部も外部も極めて普通で、68000から十年近く遅れて登場した割には物足りない仕様だった。この点、80286の外部バス周りは洗練されていて高性能だった。

ソフトウェア的には、たしかFPUが汎用レジスタを共用していることと、超越関数をサポートしないことを当時叩かれていた記憶がある。
自分は当時の集積規模的に、後から使えるロジックが増えて命令を追加しても古いソフトウェアの性能向上はしないので、遅くなっても最初から命令を入れておくという判断は良い割り切りだったんじゃないか、と思います。

V80でマイクロコードをハードウェア化して高速化したと言われているけど、実際はハードウェア化したのは乗算器とぺージング機構だけで、その他はマイクロコードをパイプライン動作で実行できるようにして実行性能の向上をしたはず。

V60開発物語
https://www.shmj.or.jp/dev_story/pdf/nec/nec_e05.pdf
図2は知ってる人の字だ(笑) あと図5の写真に元上司や同僚がちらほら(笑) 
工場の青い制服を着た手前のお二人はおそらく品管部門の方ですね。設計部門の服装は自由なのですが品管部門は昔は工場の中にあったため、設計のマイルストンで実施される設計審査では品管部門の方はその頃の制服を着て出席し、設計部門では戦闘服や特攻服と呼んで恐れていました(笑)

おおっ、こういう舞台裏のお話は大変興味深いです。

命令長はバイト単位なのでアライメントは気にしなくてよいと思っていたらSystem Base Table(例外ベクタ)に登録するアドレスはワード(4バイト・MC68000に慣れていると最初は混乱した)境界にそろっている必要がありました。違反しても特に例外は発生しないようですが、何が起きるのかよくわからないですね。

データも86系同様パフォーマンスが落ちるだけで奇数でも問題ないようです。

FPUは…… 次の記事にも書きましたがあまり速くない印象ですね。
超越関数については非サポートの石も多かったですし、8087も核の部分のみでソフトウェアでいろいろ対応しなくてはいけなかったし、MC68881系はその辺楽だったけどMC68040に内蔵されたときに超越関数系はソフトウェアエミュレーションになってしまいました。

そういえばV80ってμPD70832なんですね。
V60がμPD70616で、V70がμPD70632だからV80はμPD70732だろうと思っていた時期がありました(^^)。

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。