前回64KBのSRAMボードを作りましたが、このボードによってRAMにROMのヘッダを書き込むとROMのように使えることが分かりました。この辺をもう少し詳しく調べてみようと思います。
まず、SRAMボードを増設したMSXのスロット構成についておさらいしておくと、
スロット0はMSX-BASICのROM、スロット1にはμP-1 ユニバーサル テストボードの8255が接続され、スロット2は前回作成した64KBのSRAMボード、スロット3は拡張スロット3-2にMSX内蔵の64KB RAMがつながっています。
スロット2のSRAMボードはMSX本体の電源でも使えますが、スイッチを切り替えて外部の電源につなげられます。このMSXにはリセットスイッチがついていないので、リセットの必要が生じたときには一度電源を落とす必要があり、そのときRAMの内容は全て消えてしまいます。しかしSRAMボードに外部電源電源をつないでおけば、MSXの電源を落としてもRAMの中身は消えずに残ります。
また、SRAMに書き込みを行うときの信号線もスイッチで切り離せるようになっているので、強制的に書き込みを禁止できます。
では、色々調べてみましょう。SRAMボードの電源を外部に切り替えて、ライトプロテクトのスイッチはOFFのままMSXの電源を入れます。以後、SRAMボードは外部電源でのみ動作させます。
MSXは起動時にスロットを調べROMやRAMの状態を確認します。このMSXのスロット構成の場合、SLOT3-2の内蔵RAMより前のSLOT2のSRAMがシステムRAMに設定されます。MSX-BASICはSLOT2のPAGE2とPAGE3を使用し、PAGE0とPAGE1は使用しません。また、SLOT3-2のRAMも使用しません。未使用RAMを使うにはマシン語を使って自分でプログラムを組む必要があります。
MSX起動後は普通にMSX-BASICのプロンプトが表示され、見た目ではRAMが増設されていることは分かりません。
ここでBASICのプログラムを作成しておき、MSXの電源を切るとBASICプログラムは残ったままになりますが、MSXを起動したときにBASICの作業領域はクリアされ初期データで上書きされてしまうのでBASICプログラムを再利用するといったことはできません。
次にSRAMボードのライトプロテクトのスイッチをONにしてから電源を入れます。
MSX起動時にSLOT2はRAMとして認識されなくなるので、SLOT3-2の内蔵RAMがシステムRAMになります。SLOT3-2のPAGE0、1は使用されずPAGE2、3がMSX-BASICで使用されます。SLOT2は書き込みが出来ませんので使われません。
このようにBASICだけを使う場合にはSRAMボード増設のメリットは無いですね。
メリットがあるのはSRAMボードにROMのヘッダを書き込んだときです。
普通、MSXのROMカートリッジはアドレス4000(ページ1)または8000(ページ2)から割り当てられます。このROMの先頭には16バイトのヘッダがついていて、MSXは起動時にこのヘッダを読んでROMの種類を判別し、様々な初期設定を行います。
幾つかあるROMの種類のうち、まずは拡張ステートメントのヘッダ情報を書き込んで動作を確認してみようと思います。拡張ステートメントはBASICのコマンドを拡張する機能で、CALLコマンドの後につけた任意のコマンド名で4000から7FFFの16KバイトのROMに書き込んだプログラムを呼び出せます。前回にちょっと試していて、画面に文字を表示するだけのCALL HELLOコマンドを追加していました。
今回は実用的に使えるコマンドを登録します。それは以前に作成したSDドライブの操作コマンドです。
当然ですが、SDドライブのプログラムはRAMに置いているのでMSXのリセットが必要になったときに電源を落とすと消えてしまいます。そのたびにカセットインターフェースからプログラムをロードし直す必要があったのです。このプログラムをSRAMボードに拡張ステートメントとして書き込んでおけば、MSXの電源を入れ直しても消えずに残っているのでロードの手間がなくなり便利です。
と、簡単に使えそうに書いていますが、SDドライブのプログラムに限ってはそう簡単ではありません。ここからはややこしい話になるので読み飛ばしてもらってもかまいません。
----------
拡張ステートメントを使ってSDカードからBASICやマシン語のプログラムを読み込むのは全く問題ありません。問題は読み込んだプログラムをそのまま実行する機能があることです。このSRAMボードの場合、拡張ステートメントが実行されているときアドレス4000~7FFF(ページ1)はRAMに切り替わっています。このページ1にはMSX-BASIのROMも割り当てられていて、BASICプログラムを実行するときにはROMになってなければいけないのです。無理にROMに切り替えたとしても、拡張ステートメントのプログラムがROMのルーチンに代わってしまうので100パーセント暴走します。
マシン語のプログラムをロード&実行するときは拡張ステートメント処理中に呼び出すことになり、プログラム終了後にさらに拡張ステートメント終了処理に戻ることになります。これはあまり好ましい実行方法ではありませんし、スタックも余計に消費したままマシン語プログラムを実行していることにもなります。
そこでページ1にはSDドライブのプログラム本体とそれをページ3(C000~FFFF)に転送するローダープログラムを置くことにしました。具体的にはBASICのワークエリア開始アドレスF380のすぐ前の領域に転送して、BASICコマンドIPLのフックを書き換えてSDドライブコマンドを使えるようにします。
ところがロード先の領域は、BASICのCLEAR命令でマシン語プログラム用のスペースを開けておかないとBASIC実行中に書き換えられてしまう場所なのです。そのため拡張ステートメントの処理中にCLEARルーチンを呼び出したいのですが、これもページ1のBASIC ROMにあるので呼び出せません。どうしても呼び出したいならBASIC ROMに切り替えてCLAERルーチンを呼び出しからRAMに戻すプログラムを、ローダーでページ2か3に転送&実行させてからSDドライブのプログラムを転送する必要があり、かなりややこしくなってしまいます。
そこで苦肉の策なのですが、拡張ステートメント初期化のルーチンで、BASICのCLEARコマンドとSDドライブプログラムを転送するCALLコマンドを実行するBASIC文をファンクションキーに登録するようにしました。
MSX電源投入後ファンクションキーを押すとCLEARコマンドが実行され、さらに拡張ステートメントのCALLコマンドが実行されてSDドライブのプログラムが所定の位置にロードされます。現時点ではこれがプログラム的に一番簡単な方法ではないかなと思います。
----------
それでは、拡張ステートメントのプログラムを書き込んで、ライトプロテクトのスイッチをOFFにしたときのMSXの動作を確認してみます。
まず、拡張ステートメントのプログラムを、別途作成したローダーでアドレス4000(ページ1)に書き込みます。MSXの電源をオフにして再度オンにすると、拡張ステートメントの初期化ルーチンが実行されて拡張ステートメントコマンドが使えるようになりました。
したがってROMのヘッダがあれば、MSXはROM・RAM関係なしに扱ってくれます。
このときSLOT2がシステムRAMとして使われているので、SDカードからのファイル読み込みもSLOT2のSRAMに対して行うようにしてあります。
SLOT2のページ0と1はBASICで使われませんので、ページ1にある拡張ステートメントはMSX本体の電源を切っても残っており、電源投入後にすぐSDドライブが使えるようになります。
次は拡張ステートメントのプログラムをアドレス4000(ページ1)に書き込んでMSXの電源を切った後、ライトプロテクトのスイッチをONにしてからMSXの電源を入れてみます。
MSXの起動後、やはり拡張ステートメントは正しく処理されてSDカードの読み書きが行えるようになります。ただしSLOT2は書き込めないのでMSXにRAMとしては認識されなくなり、SLOT3の拡張スロット2のRAMがシステムRAMとして使われるようになります。
なので、SLOT2のPAGE1にあるSDドライブのプログラムはファイル読み込みをSLOT3のRAMに対して行うように変更してあります。
このときSLOT2はROMとほぼ同じです。
したがって拡張ステートメントとしてSRAMボードを使うときは、ライトプロテクトがONでもOFFでも見た目の違いはありません。違うのはシステムRAMとしてSLOT2とSLOT3のどちらを使っているかということだけです。
ライトプロテクトがONのときはSLOT2には書き込めませんが、SLOT2のページ0,2,3にあらかじめプログラムやデータを書き込んでおけば利用は可能なので、この領域が無駄になるというわけではありません。
ここまでの検証では、拡張ステートメントにおいてライトプロテクトのスイッチは必要ないように思われます。でも、SRAMボードにROMカートリッジのヘッダを書き込んだときに違いがでてきます。
SDドライブのプログラムはROMから吸い出したファイルをメモリに読み込んで実行する機能も付けてあるのですが、ROMの読み込み後にMSXの電源を入れ直すとライトプロテクトスイッチの状態で挙動が変わってきます。
ちなみに扱えるROMは特殊なチップを積んでなくBANK切り替えの無い容量8~32KBのものに限ります。
検証は色々な市販ROMで行ってみたかったので、「MSX MAGAZINE 永久保存版」1~3のMSXPLYerから吸い出したものを利用しました。吸出し方法についてはネットを検索すると見つかると思います。(吸い出したのはずいぶん前のことなので参考にしたサイトがどこにあるかはもう思い出せません)
ちなみにMSXのBIOSも吸い出せるのですが、どこかの記事でMSXPLYerの開発関係者(だったと思う)がMSXPLYerのBIOSは正式にライセンスを受けたものだから吸い出して他のエミュレータでも使えますよとかなんとかおっしゃっていた記憶があります。実際にこのBIOSを別のエミュレータで使用した例がどこかのサイトにありました。MSXPLYerを持っている人は試してみるのもいいかもしれません。
さらに言えばMSXのプログラムをMSXPLYerに読み込むフリーソフトもあります。自作プログラムの動作確認に公式エミュレータが使えるのはありがたいですね。
それでは吸い出したゲームROMを使って動作確認してみます。が、結構長くなってしまったのでまた次回に。
※コメント投稿者のブログIDはブログ作成者のみに通知されます