CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

モニタ改造

ワークスペースの確保ができCALL/RETによるサブルーチンが使えるはずなので、原始モニタ環境でもう少し実用性のあるモニタを作ってみました。

修正したいのは

1.汎用ルーチンをサブルーチン化

2.「L」ロードコマンドでバイナリ転送終了したらコマンドプロンプトに戻りたい

3.ユーザプログラムのローディング先を外付けSRAM、開始番地0x00000000にする

4.「D」ダンプコマンド実装

5.起動時にオープニングメッセージを出す

といったところです。先ずは5、お約束のオープニングメッセージです。文字列データを格納している先頭アドレスOPENMSGを引数として文字列表示ルーチンSTROUTを呼び出すことを想定します。

文字列表示ルーチンSTROUTはいままでにいろいろなCPUボードのモニタでもやってきたのと同じ処理です。文字列データのアドレスを保持するポインタADRS_PTRをインクリメントしながら取り出したデータをシリアルから送信。文字列データの終端を示すNULL文字が出るまで繰り返します。1文字出力ルーチンTXもサブルーチン化してあります

さて、この処理は見た目簡単ですが最初は案の定というか全く動かず。変なゴミを出力してすぐにリタンしてしまいます。

1行づつプログラムにスタブを挿入してAレジスタの変化を追ったら原因がわかりました。0x8000043B番地にある終端NULL文字かをチェックしているコンディションジャンプCJですがNULL文字でない(ジャンプしない)時、Aレジスタの値を破壊(popして破棄)していました。これはCJの仕様なんですが、見ただけで壊れる・・なんとも脆弱、破壊読出しの磁気コアメモリ並みです

仕方がないので現在のポインタでもう一度データを拾ってくるようにしました(赤枠部分)。このように変数は常にメモリとレジスタ間のコピーが必要ということです。

 

これで原始モニタで修正モニタをロード実行。とりあえず無事文字列表示成功しました。入力待ちプロンプトが「>」から「」に変わっていてオーバーライドした新しいモニタに制御が移っているのがわかります。ダンプコマンドも今までの気づきに注意しつつコーディングしさらっと実装できました