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

2025-09-25 22:23 — asano

だいぶ間が開いてしまいましたがV60版Universal MonitorでもR(egister)コマンドを使用できるようにしました。

基本的に他のアーキテクチャと同様ですが、気になる点を何点か記しておきます。

一点目はレジスタ名のテーブルです。

Universal MonitorではRコマンドでレジスタ名を認識するためツリー構造のテーブルを使用しています。今回もそれを踏襲していますがr0r31をそのまま持つと無駄にテーブルが大きくなるので、プレフィックス部分(個々の例では「r」)のみを登録して後ろの数字によって切り替える仕組みを導入しました。

同様に番号で多くのレジスタを持つNS32000やMC68000などもこれを使って書き換えれば小さくなるかもしれません。優先順位は低いですが。

二つ目はr31(SP)の扱いです。

例えば実行レベル3(EL=3)でユーザプログラム実行中にBRKを実行したとします。例外の発生により実行レベルが0に切り替わるのでr31の内容はL3SPに保存され、L0SPの内容が新たにr31にロードされます。

その後、例外ハンドラ内でr0r31を保存しますが、ここで保存されるr31の値はユーザプログラムのr31ではなくモニタのためのr31です。

ならr31としてL3SPを表示すればいいのかというとそうもいかず、スタックに保存されたPSW内のELフィールドを参照する必要があるでしょう。

さらに元々実行レベル0だったらどうなるのか、さらにはISPビットが立っていた場合はどうなるのか、いろいろ考えると頭が混乱してきます。

現状は特に何もせずモニタ用のr31を表示しています。L0SP~L3SP, ISPも表示しているので解釈をユーザに委ねた形です。

三つ目はメモリマップの問題です。

今回16ビットバスのEMILY Board対応なので実装メモリは8kBしかありません。便宜上前4kBをRAMエリア・後4kBをROMエリアとしていましたが、モニタが4kBに収まらなくなってしまいました。

やむなく4kB+4kBから3kB+5kBに変更しましたが、困ったのはSystem Base Table(いわゆる例外ベクタ)です。

これは4kB境界にしか置けないのでROMエリアの先頭に置いていたのですが、コードの途中になると追加・修正のたびに位置調整が必要になってしまいます。やむなく初期化時にRAMエリア先頭にコピーすることにしました。ただでさえ少ないメモリを無駄にしてしまいますが256バイトなので目を瞑ります。

MC68000版も別な理由で例外ベクタをコピーするようになっています。

とはいえこれ以外にスタックやワークも必要なのでユーザプログラムが使えるのは2kBとちょっとしか残りません。これではTiny BASICすら動かせないでしょう。

もっとメモリ積んだボードを作り直すしかないか……

でもそれならV70にしたいし……

eBayに出たの買っておけば良かったなぁ……

国内ショップにもあるけど高いし……

その前にデータシート類を入手しなくちゃいけないし……

コメントを追加

Plain text

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