M5Stack:エミュレータでWAVファイル読み込み

Common Source Code Project  のMZ-80BエミュレータをM5Stackに移植しました。

移植元のMZ-80Bエミュレータでは「MZTテープイメージファイル」で「0番地からロード」かつ「0番地からスタート」の場合、MZTイメージ→メモリに直接データ転送する仕掛けになっていました。なので1段ロードのマシン語プログラムであれば、メモリ転送で読み込み可能です。しかも速い!

でも、これだとBASICプログラムのロードができないのですよね。MZ-80BのイメージファイルはWAVファイル形式(拡張子はmti)で扱われていることが多いので、こちらに対応してみることにしました。

元プログラムでは、WAVファイルをすべてメモリに読み込んだ後、信号調整を行っていたのですが、M5Stackはそんなにメモリ多くないので、読み込みつつデータをエミュレータプログラムに渡していく感じです。WAVデータはそこそこノイズ入ってるので、そのまま渡してしまうとうまく読めないことが多いです。少しだけ、ノイズ対策入れることにしました。

「データが1回だけ急に変化することはないだろう」という想定のもと

HIGH → [LOW] → HIGH の場合は HIGH → [HIGH] → HIGH として扱う。

同様に

LOW → [HIGH] → LOW の場合は LOW → [LOW] → LOW として扱う。

これだけです。簡単な方法ですが、割といい感じに読んでくれるようになりました。読み込みは実機の数倍(もっと?)かかりますので、じっくり待ちましょう。

BASIC読み込み後、複数段ロードになっているミステリーハウス2で読み込み成功!無事、家の前までたどり着けました。かなり時間かかりましたがw

全部がうまくいったわけではなく、読み込み失敗するテープデータもあるので、いろいろまだ調整の余地ありそうです…。


WAVファイル読み込めると他機種エミュレータでも汎用的に使えますね。良い感じです。


MZTファイルのメモリ直転送ではない方式での読み込みにも挑戦してみました。MZTファイルを逐次WAVイメージに変換して、そのデータをエミュレータに渡す方式です。
MZ-1200エミュレータでは成功してたので、読み込みパラメータを変更すれば行ける…!と思っていたのですが…。
ヘッダまでは読み込めるのですが、その後のデータ読み込み終了で、読み込み終了にならず…。データ部分を読み込めてるかどうかちょっと怪しいですね。パラメータちょっとずつ変えたりしてみたのですが、今のところうまくいかなかったです。残念。もしかして、読み込み自体はできてるのだけど、カセット制御部分で失敗してる可能性もありそう。

MZT+WAVの MTWファイルも、2段目読み込みが完了しないです。このへんは今後の課題ということで…。


せっかくなので、Common Source Code Project 標準テープフォーマットの読み込みも実装しました。テープフォーマットはWAVデータを符号化したデータで、それをそのままエミュレータに渡す処理になってましたので、少しずつデータ読み込んで逐次渡す処理を追加実装しました。
これで、PC版のCommon Source Code Projectエミュレータでセーブしたデータを、M5Stack移植版で読み込むことが可能です!


↑ PC版でBASICプログラムを作成、セーブしたものを、M5Stackで読み込んでLIST表示した様子。

M5Stackでのセーブはまだ対応してないです。UIも複雑になりそうだし、そこまでは必要ないかな…という気もします。


MZ-2000もソースほぼ同等なので、あわせて移植しました!

こちらもMZ-80Bと同様に、読めるテープデータもあれば、読めないテープデータもある感じでした。


なんか勢いがついたので、FP-1100 / SMC-777 / PASOPIA7 も移植!このあたりのホビーPC、ハードウェアまわりのソースは、すでにほぼ移植済みなので、あとは各機種メインルーチンのみ移植すればOKなのです。

ほぼ、動作確認しただけではありますが…。

PASOPIAも移植しました。BINファイルをRAMパックにセット可能です。


それぞれのソースはこちら。SRAMを用いるため、M5Stack FIRE 専用です。SRAMが付いていない M5Stack Basic / Gray 等では動作しません。

また、動作させるためには、実機のROMおよびアプリケーションのデータが必要となります。

MZ-80B
https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/src/mz80b

MZ-2000
https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/src/mz2000

FP-1100
https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/src/fp1100

SMC-777
https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/src/smc777

PASOPIA7
https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/src/pasopia7

PASOPIA
https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/src/pasopia

コンパイル済みのバイナリはこちら。

https://github.com/shikarunochi/CommonSourceCodeProjectM5Stack/tree/master/bin

コンパイル方法は M5Stack:エミュレータのビルド方法 を参照してください。