レトロでハードな物語

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

SDカードからMSXのROMファイルを読み込んで実行する

2022年10月06日 | 電子工作

前回、ATmega328Pを使ったSDカード読み書きデバイスのソフトウェアが完成しました。作った目的はz88dkでコンパイル後に作られるcas形式のファイルを手早く実行したかったからです。

z88dkは多機能でMSXの場合、カセットやフロッピー以外にROMカートリッジを作るためのromファイルも出力できます。このromファイル、MSXのフラッシュカートリッジなどを持ってなければ利用価値はないと思っていたのですが仕様を見ると、

4000H z88dkのライブラリとプログラムエリア
8000H バンク切り替え可能なプログラムエリア
C000H RAM領域

となっていました。

カセットテープ形式のファイルだとプログラムエリアが9C40Hからなので、どう考えてもromファイルにしたほうがプログラムエリアを大きく取れます。メモリが32KしかないMSX1だと4000H〜7FFFHにはROMしかないのでどうにもなりませんが、手持ちのMSX1はメモリが64Kありますので、4000H〜7FFFHを裏RAMに切り替えればromファイルを配置して実行することができそうです。

調べてみると市販のカートリッジのROMも4000H(8000Hの場合もある)に割り当てられているものが多いようなので、カートリッジから吸い出したROMのファイルもこの方法で実行できそうです。

メモリのフリーエリアも広がるうえに普段使用しない裏RAMも使えるならこんな良いことはありません。さっそく前回作成したプログラムにromファイルの読み込み・実行機能を追加してみます。

MSXのカートリッジの仕様はここにあります。z88dkが吐き出したromファイル(コンパイルオプションに-subtype=romを追加する)もこの仕様に沿ったものでした。これによるとBASICプログラムをROM化したカートリッジも存在するようです。ただ、BASICプログラムの実行はワークエリアの設定が必要になり、アセンブラで書かれたプログラムの実行ほど簡単ではないので今回は実装しません。

これらのことを踏まえて作成したプログラムは次のようになりました。

・MSXのプログラム(マウスの右クリックで保存してください)

Makefile
romreader.asm
IPLコマンド仕様.txt

・ATmega328Pのスケッチ(マウスの右クリックで保存してください)

ATmega328MSX_SD_ROM.ino

使い方は、上記のromreader.asmをz88dkでコンパイルしたら、以下のコマンドでMSXに読み込み実行させます。

clear 0,&hef5f (最初の引数はBASICの文字領域サイズ)
bload"cas:",r

romファイルの読み込み・実行は次のコマンドで行います。

IPL C "romファイル名"

z88dkはバンク切り替えもサポートしていますが、バンク切り替えをしないromファイルのみ実行可能です。市販のカートリッジは持っていないので検証していませんが、バンク切り替えがなく(ROMサイズが16Kまたは32K)、ROM以外のデバイスを搭載していないカートリッジから吸い出した物なら多分実行できると思います。

64KのRAMを持っているMSXでも、機種によってRAMのスロットの位置が異なります。もしこのプログラムを利用するのであれば、自分の機種に合わせてアセンブラソースの345行と346行目を書き換えてください。詳細についてはここにあります。

ちなみに、ゲームなどで汎用入出力インターフェイス2のコネクタを利用するものを実行した場合、ジョイスティック操作に関して誤動作するものがあるかもしれません。その時はゲーム起動後にSDカード読み書きデバイスをコネクタから抜いてしまえば正常に動作すると思います。

実際にz88dkで作成したromプログラムを読み込んで動作確認したところ、ちゃんと動いてくれました。


(z88dkのベクター画像表示ライブラリでsvgグラフィックを表示したところ)

ROM化して良かったのはz88dkサンプルのex5です。このサンプルはメモリの使用量が大きかったのかcas形式のときは動いたり動かなかったりしていましたが、rom形式にして実行すると問題なく動作するようになりました。フリーエリアが増えた効果はあったようです。



一般的にromプログラムは電源を切るまでプログラムを実行し続けます。z88dkはどうなるのかメインループを抜けて終了するプログラムを書いて実行してみたところ、Z80のHALT命令で停止するようになっていました。

ところで上記のサイトにBASICプログラムをROM化する方法が書かれているので、これを実行できればいいなと考えています。ただ、BASICプログラムをちゃんと実行させるには詳細な資料が少なく、自分である程度はROM解析する必要がありそうです。でも、そこまでするのはかなり面倒なので…。
今のところ、コマンドラインのBASICを実行する方法は分かっているので、それを使ってなんとかならないか検証してみようと思います。



最新の画像もっと見る

コメントを投稿