前回ROMファイル化したBASICプログラムを読み込んで実行できるようにしたので、今度は普通にRAM上にあるBASICプログラムも読み書きできるようにしてみます。
BASICプログラムのROMは8000H〜BFFFに置かれるのでシステムのワークエリアはC000H〜に固定となっていましたが、普通のBASICプログラムでは、BASICプログラムのすぐ後ろのメモリ領域からワークエリアになります。BASICプログラムを一行入力するたびに、このワークエリアの位置も変化するようです。
BASICプログラムをSDカードに書き込むのはワークエリアの値を見ればプログラムが書き込まれている範囲が分かるので難しくはないのですが、読み込むときはプログラムのサイズからワークエリアの位置を計算して、必要な値すべてを初期化しなくてはなりませんのでちょっとやっかいです。
ただROM化BASICの読み込み手順とそれほど違いはないと思われるので、実際にプログラムを組みながら検証することにしました。
作業中はBASICプロンプトに戻る方法とかスタックの処理など細かい点で悩みましたが、結果BASICプログラムを読み込むことが出来るようになりました。いまのところ問題なく動作しているようなのでプログラムを公開します。
・MSXのプログラム(マウスの右クリックで保存してください)
Makefile
sddrive.asm
IPLコマンド仕様.txt
・ATmega328Pのスケッチ(マウスの右クリックで保存してください)
ATmega328MSX_SD_DRIVE.ino
使い方ですが、アセンブラソースをz88dkでコンパイルして出来たwavファイルを、MSXのカセットインターフェイスから読み込んで実行(初期化)するとIPLコマンドが使用できるようになります。
clear xxx,&heef0 (xxxは任意の値 : BASIC文字領域の大きさ)
bload"cas:",r
BASICプログラムのロード・セーブが出来るようになったのでIPLコマンドも一部変更しました。
・casファイルの読み込み・実行
マシン語またはBASICプログラムのcas形式のファイルをSDカードから読み込みます。ファイル名の後に1以上の数値をつけると読み込んだ後にプログラムを実行します。
IPL L "ファイル名"[,1]
・BASICプログラムの書き込み
BASICプログラムをcas形式でSDカードに書き込みます。
IPL B "ファイル名"
cas形式のファイルは一つのファイルに複数のBASICまたはマシン語プログラムを収納できますが、このプログラムではcasファイルに一つのプログラムを入れたものしか扱えません。プログラムサイズを大きくしてメモリ使用領域を増やしたくないというのもありますが、単なる手抜きです。
動作確認に前回ROM化したゲームのBASICプログラムを読み書きしてみましたが、問題なく動作しました。
SDカード読み書きプログラムで保存したcasファイルがエミュレータでも使えるか、エミュレータで作成したcasファイルがこのプログラムで読めるのかWebMSXやopenMSXで試してみました。
簡単なBASICプログラムを作ってファイルのやり取りを行ってみましたが、とくに問題なく使えていました。
これでSDカードに関してやりたいことは全て終わった感じです。もともとMSX3が発売されるまでのつなぎのつもりでMSX1で遊んでいようと思っていたのが、けっこう深くまでのめり込んでしまいました。発売の日程がまだ不明なのでしばらくは遊んでいられそうです。
と、思っていたら今度はX68000 Zが発売されるとのこと。発売が延期されスペックも不明ですが、実機の完全な復刻なら購入してしまうかもしれません。
MSX3とX68000 Zどちらも詳細は不明のままですが、発売されたらどちらを買うかそれとも両方買うか悩みます。
さらに西さんがツイッターでMSX3のFPGAでSinclair ZX-81を作って動かしたとおっしゃっていました。Comodore64やAMIGA、PC8001やPC8801やPC9801も動かすとのこと。しばらくは嬉しい悲鳴が続きそうです。
最新の画像[もっと見る]
※コメント投稿者のブログIDはブログ作成者のみに通知されます