Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GAMEBOYエミュレータ

 GAMEBOYエミュレータ

Daiki Matsunaga

December 10, 2017
Tweet

More Decks by Daiki Matsunaga

Other Decks in Programming

Transcript

  1. 2/19 エミュレータ • ハードウェアの動作を模倣するソフトウェアのこと • GAMEBOY のエミュレータを作った – PC 上で

    GAMEBOY のソフトを遊べる – C 言語で書いた – SDL( マルチメディアライブラリ ) を使った
  2. 4/19 CPU • CPU がないことにはどうにもならないので最初に実装 • シャープ LR35902 というカスタム CPU

    – 8bit CPU – Clock Speed: 4.194304MHz – Intel8080 や Z80 に近い命令セット – GBA は ARM7 と LR35902 、 DS は ARM9 と ARM7 • 命令を取り出し巨大 switch 文で命令によって分岐・実行、 それを繰り返す – 割り込みチェックやクロック数のカウントも
  3. 6/19 カートリッジ • ROM (ゲームのデータ) – 吸出し機を使うか、フリーの ROM を入手してくる •

    RAM (セーブデータ) – エミュレータでは、ファイルに書き出す • MBC (メモリバンクコントローラ) – カートリッジメモリへのアクセスを制御する – 数種類あり、扱える最大メモリ容量やリアルタイムクロック対 応、振動パック対応等の違いがある – カートリッジ側の回路だがこれもエミュレーションしないといけ ない
  4. 7/19 メモリ • メモリがないことにはどうにもならない • 16bit アドレス空間 (64KB) に内蔵メモリ ,

    カートリッジ側メモリ ,I/O レジスタ等をマッピング – メモリアクセスのための関数を用意し、アドレスによってアクセ ス先を変える。 – I/O レジスタへのアクセスならデバイスのエミュレーションを行 う。 • ドラクエの ROM は 2MB もある! – MBC により、アクセスする範囲を選択 ( バンク切り替え )
  5. 8/19 カートリッジ ROM 16bit メモリ空間 VRAM カートリッジ RAM WRAM OAM

    I/O レジスタ スタック領域 MBC が制御 0000 FFFF 0000
  6. 9/19 LCD • LCD がないと動いているのか分からない • モノクロ(4階調) • 背景・ウィンドウ・スプライトが順に重なる •

    VRAM 上に 8 x 8dot のタイルデータ • VRAM 上のマップデータを見ながら、タイルを敷き詰める • OAM にはスプライトの位置や向きの情報 • 60fps になるよう時間調整 – CPU の速度調節になる
  7. 13/19 サウンド • GB 音源は、矩形波 2ch と波形メモリ 1ch とノイズ 1ch

    • 主な機能 – 波の周波数 , 長さ , 音量 , デューティ比の変更 – 音量増減 ( エンベロープ ) – 周波数増減 ( スイープ ) – ノイズ : 線形帰還シフトレジスタによる擬似乱数 • 様々なバリエーションの音が出せる • ニコニコ大百科『 GB 音源』が詳しい
  8. 18/19 感想 • 資料を読んでひたすら実装する、体力勝負。 • プログラム自体は単純( GB 自体がそれほど複雑なハード でない。 CPU

    も遅いので普通に書いても 60fps 出る。) • バグ取りに苦労した。特に CPU にバグが残っているうちは 大変。 • CPU とメモリ周りの実装は量が多い割に結果が目に見えな いので辛い。 • タイトル画面が出ると嬉しい。音が鳴ると嬉しい。 • 低レイヤも面白い。
  9. 19/19 参考資料 • Pan Docs (http://gbdev.gg8.se/wiki/articles/Pan_Docs) • いまさら聞けないゲームボーイ (Internet Archive)

    • Gameboy Programming Manual Ver 1.1 • Gameboy™ CPU Manual • ソースコードは Github で公開しています – https://github.com/matsud224/gb_emu