前回にもちょっとふれましたが、BASICプログラムをROM化できるのを知ったのでSDカードからの起動にチャレンジしたくなりました。
BASICプログラムは様々なワークエリアの書き換えを行いながら実行されるので、マシン語のように単純にロードして実行というわけにはいきません。ワークエリアに正しい値を入れてから、BASICの実行エントリへ飛ぶ必要があります。
BASICの内部動作に関してはあまり詳細な情報がなく、限られた知識をもとに色々検証してみました。単純にワークエリアを書き換えただけではうまく行かずかなり苦労しましたが、なんとかBASICプログラムを起動するところまではたどり着きました。あとは前回までに作成したプログラムに組み込んで動作するかどうかです。
動作確認のために市販のBASICプログラムを搭載しているカートリッジがあるといいのですが、すぐに入手できるものでもないので自分でBASICのROMファイルを作ることにしました。使用するプログラムは以前雑誌からOCRで入力したこのゲームと別途入力していたマシン語モニタにします。
ROMファイル作成の手順はここにある通りなのですが、メモリイメージをcas形式で保存すればROMファイルの作成が容易になります。今回はエミュレータを使って作業してみました。エミュレータはこのWebMSXがcas形式のファイルを直接読み書きできて便利です。(機種選択はMSX JAPANにする)
上記の手順でROMヘッダを設定し8000H〜BFFFHをcasファイルとして保存したら、バイナリエディタで先頭から22バイトを削除します。これを保存したものがROMファイルになります。(ファイルサイズは16384バイト)
出来上がったファイルをWebMSXに読み込んで起動できれば、正しく作成できたことが確認できます。
準備が整ったのでさっそくプログラムを組んでみました。しかしBASICプログラムの起動までは出来てもエラー頻発でなかなか完動しません。BIOSのリストにはないBASICの内部ルーチンをコールしてみたり、ワークエリアの設定値を様々な値にして試行錯誤したところ、最終的になんとか動作させることに成功しました。
作成したプログラムはこちらになります。
・MSXのプログラム(マウスの右クリックで保存してください)
Makefile
rombasic.asm
IPLコマンド仕様.txt
・ATmega328Pのスケッチ(マウスの右クリックで保存してください)
ATmega328MSX_SD_BASIC.ino
使い方は、これまでと同様です。開始アドレスはEF40Hになりました。
clear 0,&hef3f (最初の引数はBASICの文字領域サイズ)
bload"cas:",r
・romファイルの読み込み・実行
IPL C "romファイル名"
BASICおよびマシン語どちらのROMファイルを選択しても自動判別して実行します。
MSXカートリッジのROMには8Kバイトの物もあるようなので8K〜32KのROMファイルに対応しました。ただし、ページ0(0000H〜3FFFH)をバンク切替する物は処理が面倒なのでサポートしません。ちなみにBASICのROMはページ2(8000H〜BFFF)固定になっています。
普通、BASICのROMを実行するときには途中で中断されないようにCTRL+STOPを無効にするようです。デバッグなどでBASICを中断させたいならば、アセンブラソースの387〜388行をコメントアウトしておいてください。
その他の内容についてはこれまでと一緒です。
完成したプログラムを使って上記で作成したBASICプログラムのROMを実行してみました。
ゲームプログラムはちゃんと動作しました。
次にマシン語モニタを起動してメモリダンプをとろうとしたら、エラーが発生してしまいました。
文字列のメモリ領域が足りないと言っているようです。そこで次のようにclear文で文字領域を確保したところ、正常に動作しました。
clear 200,&hef3f (200はデフォルト値)
このように、BASICは必要なら文字領域の確保をしておかなければなりませんでした。
他にもROMファイルを作って試してみましたが、ちゃんと動作しました。ROMカートリッジを使うのとは違ってCTRL+STOPを有効にしておけば、BASICプログラムを停止して書き換えたりできるのも利点ですね。
でも、そこまでするなら普通にBASICプログラムの読み書きが出来ればいいという話になってしまいます。
そうなるとcas形式のBASICプログラムの読み書きも行えるようにしたくなります。RAM上のBASICプログラムの読み書きはROMの場合よりもワークエリアの値が動的なので難易度は上がるのですが、頑張ればなんとかなるかもしれません。試す価値はあるかも。
※コメント投稿者のブログIDはブログ作成者のみに通知されます