F8へUniversal Monitorを移植(その3)
2回にわたりサブルーチンについて書きましたが、他にもプログラミング上厄介な点はあります。
まず特定のレジスタ・スクラッチパッドを要求されることが多い点です。
2回にわたりサブルーチンについて書きましたが、他にもプログラミング上厄介な点はあります。
まず特定のレジスタ・スクラッチパッドを要求されることが多い点です。
前回サブルーチン呼び出しの方法で終わってしまったので、今回は実際にUniversal Monitorでどうしたか書いていきたいと思います。
前回書いたようにサブルーチン呼び出しが2段を超えると一気に大変になります。
それではUniversal Monitorで呼び出しが深い箇所をどう対処したか、いくつかの例を見てみます。
SBCF8が動きましたので早速Universal Monitorを移植してみます。
以前のSC/MPも癖が強かったですが、このF8もそれに劣らず癖の強いプロセッサです。
DC0
レジスタ間接でなくてはならず、常にポストインクリメントされます。もう一つあるDC1
(アクセスには使えない)との間で値の交換が出来るのがせめてもの救いです。PC1
に退避されます。ちょうどTMP90C840用にUniversal Monitorの修正をしている最中、F3850+F3853用の試作基板を貰えることになり組み立て・動作確認をしていたため、予想以上に遅くなってしまいました。
TMP90C840ボードは以前のTMP90P802ボード用に書かれているUniversal Monitor TLCS-90そのままでも動作し0000H~0FFFFHまでの64kBのメモリ空間が使えますが、TMP90C840は最大1MBまでのメモリ空間をサポートしていますのでそれを使えるように拡張します。
前回は8080とZ80への実装について書きました。他のプロセッサへの展開についてとりあえず思いつくところを書いてみます。
以前[UniMon] 固定エントリポイントで機能ごとに固定したエントリポイントを用意することでユーザプログラムから内部ルーチンを使えるようにする方法を用意しました。
でもよく考えるとこれはあまりよい方法ではなかった気がしてきました。
MC68000を考えるとサブルーチンコールではなくTRAP
を使いたいですし、MC68000のTRAP
命令は16通りしかありません。今のところ足りるとはいえ、できればエントリポイントは1つにしたいところです。
先日のRP2A03ボードによってRP2A03判別ルーチンの確認ができたのでここに記しておきます。
まず判別するためには両者の違いを利用することになりますが、簡単なのはRP2A03で削除されている10進演算機能の有無を使う方法です。
他にも内蔵のAudio Processing Unit(APU)などのレジスタを参照する方法も考えられなくは無いですが、RP2A03以外では何がつながっているかわからず、誤判別や思わぬ副作用の原因になるかもしれません。
それではソースコードです。
Universal Monitorを移植しようと組み立てたMUTIF09、他の石も載せてからと思っていましたが時間かかりそうなのでとりあえず現状です。
MUTIF09はKasumi YOSHINO(JA1UMI)氏のシングルボードコンピュータボードで、資料はBOOTH・プリント基板はオレンジピコショップにて入手可能です。Universal Monitor移植に最低限必要なもの(と手持ちがあって迷いのないものの一部)を搭載しています。
それでは基板上の部品を見ていきます。
最後となる今回は「3. メモリに退避されている内容をレジスタに戻しユーザプログラムに制御を渡す」です。
コマンドで値を変更したらその状態でユーザプログラムを実行できなくては意味がありません。
要はレジスタに値を設定して目的の番地にブランチすれば良いだけなのですが、すでに設定済みのレジスタを壊さないようにしなくてはいけないので進むにつれ制約が増えていきます。
比較的多くのプロセッサで使える手は、「スタックに積んでおいてPOP
,...,POP
,RET
」です。ちょうど1回目の逆です。
スタックを使った割り込みに対応しているプロセッサなら大抵これが使えます。
MC6800を例に見てみましょう。
前回は「ユーザプログラムからモニタに制御が渡ったときにレジスタ内容をメモリに退避する」でしたので、今回は「2. メモリに退避されている値を表示・変更する」についてです。
レジスタ内容をメモリに退避するのはプロセッサ固有の書き方が必要でしたが、すでにメモリ上にある値を表示・変更するだけであれば特殊なプログラミングは必要ありません。とはいえレジスタの名称や個数はプロセッサ毎に異なりますからそれなりの工夫は要ります。
まず全レジスタの一覧表示は簡単です。ループとテーブルで書いてもいいのですが、レジスタ数が少ないうちは「レジスタ名を表示・メモリから値をロード・16進表示」を必要数分並べてしまっても大したことはありません。
レジスタの変更はそうはいきませんので、以下のようなテーブルを用意しました。