M5Stack:MZ-1200エミュレータでテープデータ読み込み

PC-6001エミュレータ移植時には、割と簡単にテープデータが読めたので、MSXでも簡単にできるかな?と思ったら、そんな甘くありませんでした。

PC-6001エミュレータには、疑似サブCPUロジックが実装されていて、テープデータの内容をうまいこと処理してくれてたのでした。テープデータのバッファ展開はせずに、省メモリで動作できる処理になってました。

MSXでのテープ読み込み処理は、いったんテープデータを巨大なバッファに展開してから行う形式でした。
テープファイルのバイナリデータを、時系列での 0 / 1列 のバッファ配列に展開して、それを順に読み込んでいく、みたいなロジック。
元テープのデータは、多くとも数百KB程度なんですけども、この方式でバッファ配列に展開するためのメモリが数十MB必要になるんですよね。M5Stack のPSRAM 4MBではとても足りません…。

M5Stackで動作させるためには、バッファに事前に展開せずに、読み込みの都度、計算してビットを返す処理を作らないといけないです。

せっかくの機会なので、テープへのデータ記録の仕組みも確認しつつ、実装してみることにします!


MSXのソースには、MSX2のロジックも入ってて結構複雑なので、比較的シンプルなMZ-1200のソースを使って、MZTファイルの読み込みに挑戦します。

Z80などのロジックはすでにバッチリなので、モニタ表示まではサックリと動作完了。


MZのテープフォーマットの形式はこういう感じです。


(試験に出るX1より)

テープへの書き込みは、バイナリデータをビット列に直して書き込みます。
0 = 音無し、1 = 音あり、みたいな単純なものかと思ったら、そうではありませんでした。(あたりまえだ。)

MZのテープファイルでは、
・ビット0の場合には HIGHを125μs、LOWを125μs
・ビット1の場合には HIGHを250μs、LOWを250μs
と、テープに書き込みます。


(試験に出るX1より)

PWM(パルス幅変調)方式というそうです。

MZTファイルのデータをもとにして、上記の信号を生成し、エミュレータ側に渡す必要があります。
ファイルのフォーマットはこちら参照。(Geocities 消えてしまって悲しい。)

MZ シリーズエミュレータ用テープイメージファイル「MZT」
https://web.archive.org/web/20190328121927/http://www.geocities.co.jp/SiliconValley-Sunnyvale/2521/mztapeall.html#mzt


移植元の実装では、
・ビット0の場合には HIGHを11回、LOWを15回
・ビット1の場合には HIGHを24回、LOWを29回
返しています。これのテープデータ全体の分をバッファとして事前作成してる感じですね。

ということで、僕が実装する必要があるのは、上記バッファ内容を、事前ではなくて逐次に作成する処理。
読み込み要求が来るごとに、ビットデータが0ならHIGHを11回、LOWを15回、1ならHIGHを24回、LOWを29回返すようにします。
これ、While一発で順に処理してそれだけで終了ならいいのですが、そうもいかず、処理が呼ばれるたびに、そのときの状態によって動作が変わるようにしとかないといけないです。なかなかしんどそう。


ひとまずフォーマットに従って実装してみたところ、LOADしても何も反応なし。これは辛い。正解か間違いかわからない。ほんとにデータがエミュレータ側に渡せているのか…。

確認したところ、データをエミュレータに渡す処理のところで失敗していました。そこを修正すると…

チェックサムエラーが出た!データは間違っているにしても、なにかしらのデータがエミュレータ側に渡せているということ!

エミュレータ側で読み込んだデータのエリアを表示してみると…

おしい!最初に”0″が入って、かわりに最後の1ビットが落ちている…。

あらためて、フォーマット再確認してみると、抜けている処理がありました。そこを修正すると…

ファイル名が出た!つまりヘッダが正しく読めた!

読み方さえ合っていれば後はそれに従い実装するのみ…。

できた!BASICのテープイメージ読んで起動した!


実装はイマイチですが、ひとまず動くところまで持っていけたので、いったんここまでとします。

今回は、テストの意味合いが大きいので、ソースのみコミットとしておきます。

MZ-80K/C/1200のエミュレータはm5z700を使ってくださーい。

ということで、次はMSXのテープ読み込みにも対応してみたいところなんですが、MSXのテープフォーマットはMZTとは全く異なっていて、かつ、現状のMZT用の処理はフォーマットに合わせたハードコーディングガチガチ状態なので、チョイチョイっと対応するのは無理そうですね。またいずれ…。



このエミュレータが実行可能なのは、2019/04/20 時点では M5Stack FIRE のみです!


Amazonリンク貼りつつ、なんですけど、海外からの通販に抵抗が無い場合は、本家M5Stack の AliExpress で購入してみるのもいいかと思います。販売されている商品の種類も多くて、価格も少し安めです。ただし、到着まで半月~1ヶ月ぐらいかかります。