CPU実験室

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

TLCS900用モニタ

プログラムのダウンロードとその実行しかできない原始モニタのままだったTLCS-900ボードのモニタを拡張しました。Sコマンド:バイト単位のメモリセット、Dコマンド:メモリダンプ、Xコマンド:レジスタ表示です

このモニタはどこからか拾ってきたZ80用モニタのアセンブラソースコードを元にしていて、これをまずニーモニックの差替えのみでTLCS-90用に移植、その後TLCS-900用に、とやりかけたところでアドレス空間が24bit16Mbyteなので当りが大きいと気付いて移植を断念していたものでした。

ところが今になって見返してみるとモニタが使用するワークエリアやスタックアリアはCPUに内蔵されているSRAM領域2000H~9FFFHに割り当てたためZ80と互換性のある16bitアクセスでOK。64kbyteを超える高位空間にあるROMの固定データやユーザプログラムのアクセスの時だけ32bitレジスタXBC/XDE/XHLによる間接アドレッシングを考慮すればいいわけで思ったより簡単に移植できました。

各コマンドにはアドレス引数を持てますがこれも24bit(3byte)化。入力桁数が6桁になり煩雑なので右詰め置数処理を追加してリーディングゼロサプレス入力ができます。

 

ところでGコマンドもアドレス指定ができて任意のアドレスからの実行ができますが、ソースコードを見てみると面白いやり方をしていました。

まず、これから呼ぶユーザプログラムが終わったら戻ってきたいアドレス(CMD_G0)と、Gコマンドのアドレス引数で与える飛びたいアドレスを順にスタックにPUSHした後、なんとRETインストラクションで目的のプログラムを「CALL」してます。

これは考えれば合理的でRETというのはスタックからPOPしたアドレスにジャンプすることなのでこれで正しい動作をするわけです。ユーザプログラム側では最後にRETが実行されればスタックに積んであったCMD_G0に飛んできてモニタプロンプトに戻るという仕掛けです

Z80のジャンプ命令にはJP(HL),JP(IX),JP(IY)というように飛び先をレジスタで指定できるアドレッシングがあったので上記のような処理はもっと直感的な記述できますがTLCS-900のインストラクションセットを見てみるとJPのアドレス指定は即値だけになってしまったようです。そうなるとこのやり方が妥当でしょう