M5Stackでのプログラミングを楽しんでいる!!
今回は、ここ1〜2日で取り組んだことを記してみる。
MZ-80Bエミュレータ
これは気合を入れて開発したものでも無かったので「自分で開発したエミュレータ」からの候補から外していたんだけど、画像ピクセル数が320x200とM5Stackのサイズとぴったりだったため、どうしても絵面を見たくなって移植した!
このMZ-80Bエミュレータを開発した当時の記録が残っていたので、一部分を引用してみたい。人に見せるために書いていた記録だったので、なんとなくブログの書き方に似てる(^^;
■2017.11.13
○○○さんと△△△(私)の共通の知り合いに、「ぱっくまん」さんという方がいる。お会いするタイミングで、過去に氏が発表していたゲームを動かしてみよう!的な流れとなり、まずはMZ-80Bのエミュレータを作る必要があるねって事になった。
話し合いの結果、オールマシン語の「肉シャツのxxx」というゲームを動かしてみる事に!
私はMZ-80Bのユーザーでは無いのでIPLなどの権利モノは使わないように動かす必要がありそう。
昨晩から今日の朝に掛けて、ダンプリストをOCRした!まだ修正は出来ていないけれど、バイナリの体裁を整えてコンバート出来るようにまで持ってった。あとはチェックサム合わせるだけなので、そんなに苦労はしないはず。
今日の晩には正確なバイナリが出来上がるといいなぁ。ちなみにサイズは約7KB。
エミュレータを作る上で、グラフィックVRAMアドレスは決め打ち、TEXT-VRAMも決め打ち、I/Oは最低限(キー入力だけ?)、これだけでMZ-80B動くかな…。
■2017.11.14
朝から「肉シャツ」のダンプリストのチェックサム合わせ!ブロックによって正解率が高かったり低かったりするのはいつもの事だけど、今回は8とBの間違いよりも5と3とか、とんでもないものが違っていたりして予測が難しい…。
眠い目ではBと8の区別が着かない!!
午前中のうちに正確なバイナリが手に入った!
さて、これからMZ-80Bエミュレータならぬ、肉シャツエミュレータを作っていきます!
で!最初からつまづいた!何かのルーチン呼んでる!!MZ-80Bって何かROMとか積んでるんだっけ?それともBASIC起動後??今は面倒なので後回しにする事に決めて、中身をC9[RET]にしまくる!まずはグラフィック画面にデータが出ることを確認したい!
VRAMのバンク構成は$D000からがテキスト、$E000からがグラフィックになっているようだ。面倒なのでバンク切り替え機構は作らない!VRAMメモリは直出し状態!(^^;
しばらく動かしていると、ループ(おそらくキー入力待ち)に入った。
GVRAMのデータを見てみると、なんだかちょっとだけアクセスがあったっぽい!
よーし、これでグラフィックを表示してみる!
VRAMの情報を元に画面へ表示してみる…と、あれれ?なんかビット情報が逆??
調べてみると、どうやらドットのMSBが逆っぽい。PC-8801やFM-7とは違うのね…。
問題なくグラフィック画面が表示されてきたので、今度はテキスト画面だ!
PC-8801よろしく、MZ-80Bもテキストとグラフィックが合成されて表示される。
でもその前に、あの不明なルーチンを解決せねばならない。
調べてみると、どうやらSP-1520というモニタ?がロードされるっぽい。
これが、いわゆるMZ-80Bのモニタ??
工学社の「MZ-80B活用研究」にエントリアドレスが載ってたので、そこから機能を推測。
文字列表示ルーチンは良いんだけど、画面座標はどこで指定しているのさ…とか、重要な情報が無いので、ゲームの逆アセンブラを見ながら最低限の解析を行う。
なるほど、とあるメモリに先に情報を入れておいて、この関数を呼び出すのね。
バイナリもソースもないので、想像でルーチンを(Z80で)組んでいく。
1文字出力については、画面消去と1文字表示の機能を持っているらしい。
1文字表示については、メモリに入っている座標情報を更新していく必要があった。
これらを対応してみたところ、画面がちゃんと表示されるようになってきた。
こういうのは逆アセンブラを見ながらひとつずつ対応していくしか無いなー。
モニタROMルーチンを4つほど自前で用意したところで、ゲームが動くようになってきた。
意外に簡単に起動してしまいました、肉シャツ。
■2017.11.15
無事、MZ-80Bエミュレータをお披露目することが出来た!
これは一瞬だけ見せることが出来れば良かったので、もう心残りは無いw
という感じだった。ホントに一瞬のためだけに開発されたMZ-80Bエミュレータ(^^;
このDot by Dotの画面を見たいがためだけにM5Stackに移植w
うん、ラインが映えるね!
twitterで公開したところ「グリーンじゃないの?」という話をいただいた。
言われてみれば!!!!ということで…
グリーンモニタっぽくした!
毎回モザイクを掛けるのが面倒だったので、ゲームのバイナリにパッチを当てたw
オリジナルのバイナリを改造するのは忍びなかったので、M5Stackのメモリに読み込んだ後、実行前にパッチを当てている。著作物でもあるので扱いは丁寧に(^^)
PC-8801アルフォス高速化
最初の頃に移植したアルフォス on PC-8801、プログラム的な工夫も少なく実行速度が実機よりも遅い感じだった。別にゲームで遊ぶわけじゃないんだからいいやん…と思ったが、デュアルCPUのFM-7がそれっぽく動き、PC-8001に至っては余裕をかましてる状態だったので、PC-8801もちゃんとせねばなるまい…。
このアルフォスの遅い理由は、全てのメモリをPSRAM領域に載せている事だと思われる。RAMもROMも、VRAMですらPSRAMに載せている。この当時はメモリの速度も理解していなかったので仕方ない…。
ただ…ここでひとつ問題がある。PC-8001やFM-7に比べ、PC-8801はメモリアクセスが実に複雑なのだ(T-T) 複数のバンク切り替えに加え、テキストウィンドウという面倒な機構もある。特にバンク切り替えは「こっちを切り替えたとしても、こっちの機能が優先」とか、テクニカルマニュアルを見てもぱっと分からないモノもある。とにかくメモリアクセスをシンプルに実現する事が大事だ。
というわけで、メインメモリ64KBとVRAM48KBを内部メモリに置く事にした!ただでさえ複雑なメモリアクセスのプログラムに手を入れる事になったため、作業は想像以上に大変だった(T-T)
CPUがハングアップするとシリアル側にexceptionが表示されるんだけど、この表示されてるメモリアドレスがどこなのかを知る方法はないんだろうか…(-_-; せめてmapファイルがないと見当が付かない…。また調べることが増えてしまった(^-^)
アルフォス実行中はROMプログラムをアクセスする事はないので、BASIC-ROMは従来通りのPSRAMに置いたままにした。
そしたら…これだけの変更で、CPUエミュレーション速度が3割以上も速くなった!いや、もっとかも? ノーウェイトで動かすと、画面更新が追いつかずにコマ落ちした状態になる(^^;
結局、1/60秒単位で動かしているCPUエミュレーションにウェイトを入れる事になった。1000ms / 60 = 16.666....msのうち、7msほどウェイトを入れた。
やっぱ速いよ、M5Stack!!(^^)
スクリーンショットが撮りたい!
いつもM5Stackの画面写真を撮影する際に、どうしてもカメラ(iPhone)が写り込んでしまうのが気になっていた!スクリーンショットが撮れればなぁ…とふと頭をよぎったのが運の尽き(^^; じゃあ作ってみようという気になった。
このブログを書いてる最中に、LovyanGFXにreadRectというドットデータ読み出し関数がある事を知ったw 今回作ったスクリーンショットは、この機能を使っていない(T-T)
画像を表示する際に生成するデータを横取りする形でスクリーンショットを作った。出力する先はSDカード、画像フォーマットはbmpとした。普通にbmpファイルを作ろうとすると上下が逆転するので、データ生成時に下から作っている。
アルフォス専用のスクリーンショットなので、サイズは320x200ドット、ファイルサイズは約125KB。このデータをSDカードに書き込むのに掛かる時間は2秒以下だった。
ちょっと色がギトギトしてるので、明度を半分にしても良いかもね…。
上にも書いた通り、今の時点ではアルフォス専用になっちゃってるので汎用プログラムを作りたいかな……。たまにはM5Stack業界に貢献しないと(^^;;
もっと無茶するところが見てみたい!
M5Stackを使い慣れてくると、今まで「これは無理かも?」と思っていたことが、実は割とたやすく実現できる事が分かってきた。そりゃ240MHz駆動のデュアルCPUならば、出来ることは多いはずだ。
もっとM5Stackがひーひー言いそうな事をやってみたいなぁ…という気になってきたw でもそういうプログラムを過去に作ったことがないんだよね。PC-9801エミュレータとか無茶そうで面白いけど、GDCのエミュレータとか書く気がしないし(^^;;
以前作っていたCP/M-86エミュレータでも移植してみようかしらん…汗
ではまた次回!(^-^)ノ