概要
ESP32でエミュレータを動かすシリーズ第三弾。今度はGAME少年です。
良さげな元ネタを探して、比較的判り易かった下記を移植しました。
[Gambit] https://github.com/mattrubin/Gambit
これでハードを都合すればオレだけの携帯機が作れます。
第四弾をどうするかは、考えておりません。
やること、やった事
ハードは
[ESP32でGAMEエミュレーターを動かす]https://qiita.com/hi631/items/a0dfb6ee91b90c028445
を見てください。ピンの配置も全く一緒です。
ソフトは今回も変更が多いのでGitHubに上げました。
[esp32-gbemu]https://github.com/hi631/esp32-gbemu
元のソフトはios用に作られているようなので、これを一旦Windows上で動かし、動作確認の上でESP32に移植しました。
ダウンロードして、COMポートと通信速度をボードに合わせてコンパイルしてください。
make flash して、Resetすれば動くと思います。
動作確認用としてはこんなものが使えます。http://www.gambitstudios.com/FreeSoftware.asp
ファイルのフラッシュへの書き込みは下記のコマンドで行います。
esptool.py --chip esp32 --port "/dev/ttyxx" --baud $((921600)) write_flash -fs 4MB 0x140000 xxxx.gb(gbc)
"/dev/ttyxx"、xxxx.gbは自分の環境に合わせましょう。
一応2MBまでは動作するはずです。
今回苦労した所
今回もgbemuをnesemuのI/Oに接ぎ木して動かしています。
開発環境が全く違うので、コンパイルエラーの多さに一時は暗澹となりましたが、何とか持ち直しました。
取敢えず動けばいいという発想の元、下記のようになっています。
(1)パレットとして256KBもメモリーを使っており、ESP32では最初はコンパイルできませんでした。
64KBに圧縮しましたが、画面全てに対応していないので、妙な画面(主に背景)が出る場合が有ります。
LCD.Cの561行からの、パレットの反転処理を各画面に入れれば治ると思いますが、やってません。
(2)一応、ちゃんと画面も音も出てコントローラーで遊ぶことができますが、処理が不足気味で、画面が大きく動くと全体的に遅くなります。
(3)処理が遅くなり間に合わなくなると音が途切れます。その場合はspi_lcd.cの142行当たりの
.sample_rate=SNDRATE*166/(116*2),の116を大きくしてください。ただし音が伸びます。
(4)ノーマルではあまりに画面が小さかったので、ほぼLCD一杯に拡大しています。spi_lcd.cの322行当たりの
int x, y, xss, yss, widths, heights, mug=2;の2を1にして下さい。ノーマルサイズに戻ります。
(5)フレーム当たりの処理速度を確認可能です。spi_lcd.cの84行当たりの
//wccnt++; のコメントを外すと、シリアルに処理に要した時間が10us単位で表示されます。
Lp=(一周期時間) Fr=(フレーム処理) cpu=(CPU処理) Dsp=(LCD処理) Snd=(サウンド処理) Wt=(サウンド出力待ち)
1234と表示された場合は、12.34ms要した事になります。
なお、Wtが0になると音が途切れる可能性があります。
その他
上記記載のハード、ソフトは無保証であり、各自の責任においてご利用願います。
中身がよく判らないのに、動けばOKという勢いで改変していますので、何か傷を抱えているかもしれません。
また蛇足ですが、世の中にはフリーでないプログラムも存在しますので、注意の上で遊ばれることをお勧めします。