シリアルの入出力が大丈夫そうなのでモニタの作成に取り掛かりました。
先ずは
・プログラムのバイナリコードをメモリにロードする機能
・ロードしたプログラム先頭アドレスにジャンプし制御を移す機能
の2点だけ行える「原始モニタ」を作成し、高機能なモニタはこの環境で開発することにします。ひとまずSRAM上に転送して実行できるので、ROM焼き、抜き差しの手間が省けるのは助かります
ターミナル上で「L」(loadコマンド:バイナリコードの転送)と「E」(execコマンド:SRAMの先頭8000Hへジャンプ)
のキー入力を受け分岐する部分です
ちなみにTMS9995は内蔵の汎用レジスタが無いというのは云いましたが、スタックポインタもありません。それではサブルーチンコール/リタン、プッシュ/ポップはどうするのかというと、これは汎用レジスタをつかって仕組みを手作りしてやらなければなりません
たとえば1文字送信XMTLPはサブルーチン化していますが、それを呼ぶには「CALL」という命令は実装されてなく、かわりに「BL」(Branch&Link)という命令を使います。これはブランチするときプログラムカウンタを汎用レジスタR11に書き込むことまではやってくれます。
サブルーチンからのリタンには「B *R11」(R11の内容のアドレスにブランチ=「RT」というエイリアスがある)
を使えばいちおうサブルーチンは構成できます。
しかし容易に想像つきますがサブルーチンの中でサブルーチンを使用すると確実に暴走します。退避するメモリをFILOのスタック構造にすることはユーザ側に任されているということです。
いまのところはサブルーチンは1段だけで設計しておきます。
受信したキャラクタをメモリに収納するLOADコマンドの核部分です
要注意なのは送受信のI/Fに使用する16ビットレジスタには上位8ビット部分に有効なデータが載っていることです。シフトしてデータ部分の取り出し、引き渡しを行っています。
コード転送終了のチェックを行っていないので、終わったと思ったらハードリセットをかけるとコマンドプロンプ「>」に戻ります