だいぶ間が開いてしまいましたがV60版Universal MonitorでもR(egister)コマンドを使用できるようにしました。
基本的に他のアーキテクチャと同様ですが、気になる点を何点か記しておきます。
一点目はレジスタ名のテーブルです。
Universal MonitorではRコマンドでレジスタ名を認識するためツリー構造のテーブルを使用しています。今回もそれを踏襲していますがr0
~r31
をそのまま持つと無駄にテーブルが大きくなるので、プレフィックス部分(個々の例では「r」)のみを登録して後ろの数字によって切り替える仕組みを導入しました。
二つ目はr31
(SP)の扱いです。
例えば実行レベル3(EL=3)でユーザプログラム実行中にBRK
を実行したとします。例外の発生により実行レベルが0に切り替わるのでr31
の内容はL3SPに保存され、L0SPの内容が新たにr31
にロードされます。
その後、例外ハンドラ内でr0
~r31
を保存しますが、ここで保存される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バイトなので目を瞑ります。
とはいえこれ以外にスタックやワークも必要なのでユーザプログラムが使えるのは2kBとちょっとしか残りません。これではTiny BASICすら動かせないでしょう。
もっとメモリ積んだボードを作り直すしかないか……
でもそれならV70にしたいし……
eBayに出たの買っておけば良かったなぁ……
国内ショップにもあるけど高いし……
その前にデータシート類を入手しなくちゃいけないし……
コメントを追加