Rustでゲームボーイエミュレータを自作してみました。
なかなか面白くCPUを中心に知識を深めるのにも役立ったので内容と共に紹介したいと思います。ソースコードは
こちらにあります。
まずはじめに
実際のところ執筆時点ではゲームボーイエミュレータを自作する為に必要な資料は豊富に揃っている為に比較的容易に作ることが出来ます。ただそれらの資料は一部不完全であったりするので突き合わせて正しい方を選んでいく必要があります。その際に役立つのがGitHubに公開されている完成品のエミュレータで動作させるのもソースコードを見るのも役に立ちます。
完成品と同じ処理を実装していくことで確実に作れる点は大きいです。
概要を把握
エミュレータを作る前にGAME BOYが、どんな機能で、どんな動きをするのか概要を把握しておくと楽になります。CPU、RAM、割り込み、時計、画面、サウンド、ゲームパッド、ゲームカートリッジなどが主たる物としてあげられますが、ざっくらばんでも絵にしておくと把握が楽になります。
その他にROMデータが必要になりますが、これはオープンソースのROMがお手軽に利用できます。なかには
テスト用ROMなどもあり使うと確認が楽になります。またデバッグ機能の充実しているエミュレータ
BGBや、必要な物がまとめられているGitHubの
awesome-gbdevなどもあります。
実装
私の場合は概要把握の後は仕様書と完成品のソースコードを相互参照しながら実装していきました。ソースコードに不明点があれば仕様書を参照、テストROMで不具合があればソースコードの見直し、それでも不明なら仕様書を参照、それでも不明なら完成品のソースコードを修正してレジスタの内容を出力して開発品とdiffなど。ドキュメントには不備が所々ある様で基本的にはテストROMに合わせるのが良いようです。
終わりに
結果として部分的ですがサウンドの再生も可能になり比較的まともにプレイ可能になりましたので今後は吸い出し機を使って購入したカートリッジのデータをプレイしてみる予定です。
自作したエミュレータでマリオやポケモンが動くのは感慨深いかもしれません。