レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

MSXのBASICコマンドのフックを書き換える

2022年08月12日 | MSX関連

ついに来ました。来月の9月3日にMSX3の正式発表があるようです。1chip MSX 3とかMSX IoT、MSX 0、MSX3 Turboなどの詳細がわかりそうですね。プロジェクトEGGとの連携もあるようなので、レトロゲームで遊ぶことが出来るのでしょう。実に楽しみです。

そんなわけで今更MSX1とArduinoを接続することにあまり意味がないような気がしますが、せっかく前回までにデータ送受信を行えるようになったので、Arduinoを使ってSDカードの読み書きを行ところまでは作ろうかなと思います。

これまで作成したMSXのプログラムはDEFUSRコマンドを使って実行していましたが、SDカードを読み書きするたびにこのコマンドを利用するのは使い勝手が悪すぎます。
こんなときはBASICコマンドの処理を書き換えて、自作のプログラムを起動するといった手段があるようです。

BASICコマンドを入力すると、そのコマンドの処理を行う前にマシン語のリターン命令だけが書き込まれているアドレス(書き換え可能なRAM領域にある)がコールされますので、このリターン命令を自作のプログラムの先頭アドレスにジャンプするように書き換えれば、BASICコマンドの入力でプログラムを実行させることが出来るようになります。

ただしBASICで使用しているコマンドを書き換えてしまうと不都合なこともあるので、使用していないコマンドを使うことにします。MSX BASICの未使用コマンドにはCMDとIPLの2つがあるようです。ただ、デバッグで使用しているモニタアセンブラがCMDコマンドを使用していたので、今回はIPLコマンドを使うことにしました。

そこでまずはSDにアクセスするために最低限必要なコマンドを考えてみました。

ファイル一覧表示
IPL F

ファイル読み込み
IPL L "ファイル名"

ファイル書き込み
IPL S "ファイル名",開始アドレス,終了アドレス

ファイル名変更
IPL R "旧ファイル名","新ファイル名"

ファイル削除
IPL K "ファル名"

必要になったら後で追加するとして、とりあえずはこれだけあればなんとかなるでしょう。また、BASICファイルの読み書きは今のところ考えません。

それでは実際にプログラムを作成します。まずはMSX単体で動作させてテストします。具体的には入力されたコマンドを解釈して、引数を取り出して収納するところまでを実装してみます。プログラムはアセンブラで書きますが、今回は前にも紹介したz88dkのアセンブラを使ってみました。アセンブルはUbuntu上で行っています。

作成したプログラムは以下のようになりました。

Makefile
command.asm

(ファイルはマウスの右クリックで保存してください)

これらのファイルを適当なフォルダに置いて(z88dkをインストール後に)makeと入力すればcommand.casとcommand.wavが出来上がります。
プログラムの開始アドレスはD000番地です。openmsxで実行するときはclear 200,&hd000と入力後、command.casをドラッグドロップすれば自動的にカセットファイルが読み込まれて実行され、IPLコマンドの飛び先を書き換え(フックの書き換え)ます。実機の場合はclear 200,&hd000と入力後bload"cas:",rと入力してPCなどからwavファイルを音声として読み込ませ実行させます。

プログラムを実行してIPLのフックが書き換わったら、BASICのコマンドラインで上記のIPLコマンドを入力するとコマンドと引数を切り出してメモリ上に収納し、その内容を表示します。引数の開始アドレスと終了アドレスは2バイトの数値として扱いますが、Z80CPUの決まりで、アドレス値の上位と下位は反転して収納されています。
また、現時点ではエラーチェックはほとんど行っていないので、いいかげんなコマンド入力でも通ってしまうことがあります。

実機で試してみるとちゃんと動作しているようです。



あとは各コマンドの処理を実装するためにArduinoとの送受信ルーチンを組み込んでいくのですが、まだまだ大変なのでまた後で作業しようと思います。



最新の画像もっと見る

コメントを投稿