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. 1/19
    GAMEBOY エミュレータ

    View Slide

  2. 2/19
    エミュレータ
    ● ハードウェアの動作を模倣するソフトウェアのこと
    ● GAMEBOY のエミュレータを作った
    – PC 上で GAMEBOY のソフトを遊べる
    – C 言語で書いた
    – SDL( マルチメディアライブラリ ) を使った

    View Slide

  3. 3/19
    何をエミュレーションすればいい?
    カートリッジ
    カートリッジ
    ゲームパッド
    ゲームパッド
    シリアル通信
    (通信ケーブル)
    シリアル通信
    (通信ケーブル)
    サウンド
    サウンド
    CPU
    CPU
    LCD
    LCD
    内蔵メモリ
    内蔵メモリ

    View Slide

  4. 4/19
    CPU
    ● CPU がないことにはどうにもならないので最初に実装
    ● シャープ LR35902 というカスタム CPU
    – 8bit CPU
    – Clock Speed: 4.194304MHz
    – Intel8080 や Z80 に近い命令セット
    – GBA は ARM7 と LR35902 、 DS は ARM9 と ARM7
    ● 命令を取り出し巨大 switch 文で命令によって分岐・実行、
    それを繰り返す
    – 割り込みチェックやクロック数のカウントも

    View Slide

  5. 5/19
    カートリッジ

    View Slide

  6. 6/19
    カートリッジ
    ● ROM (ゲームのデータ)
    – 吸出し機を使うか、フリーの ROM を入手してくる
    ● RAM (セーブデータ)
    – エミュレータでは、ファイルに書き出す
    ● MBC (メモリバンクコントローラ)
    – カートリッジメモリへのアクセスを制御する
    – 数種類あり、扱える最大メモリ容量やリアルタイムクロック対
    応、振動パック対応等の違いがある
    – カートリッジ側の回路だがこれもエミュレーションしないといけ
    ない

    View Slide

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

    View Slide

  8. 8/19
    カートリッジ
    ROM
    16bit
    メモリ空間
    VRAM カートリッジ
    RAM
    WRAM OAM I/O レジスタ
    スタック領域
    MBC が制御
    0000 FFFF
    0000

    View Slide

  9. 9/19
    LCD
    ● LCD がないと動いているのか分からない
    ● モノクロ(4階調)
    ● 背景・ウィンドウ・スプライトが順に重なる
    ● VRAM 上に 8 x 8dot のタイルデータ
    ● VRAM 上のマップデータを見ながら、タイルを敷き詰める
    ● OAM にはスプライトの位置や向きの情報
    ● 60fps になるよう時間調整
    – CPU の速度調節になる

    View Slide

  10. 10/19
    LCD を実装した

    View Slide

  11. 11/19
    ゲームパッド
    ● ゲームパッドがないと START ボタンを押せない
    ● ジョイスティックにも対応( SDL を使うと超簡単)

    View Slide

  12. 12/19
    遊べる

    View Slide

  13. 13/19
    サウンド
    ● GB 音源は、矩形波 2ch と波形メモリ 1ch とノイズ 1ch
    ● 主な機能
    – 波の周波数 , 長さ , 音量 , デューティ比の変更
    – 音量増減 ( エンベロープ )
    – 周波数増減 ( スイープ )
    – ノイズ : 線形帰還シフトレジスタによる擬似乱数
    ● 様々なバリエーションの音が出せる
    ● ニコニコ大百科『 GB 音源』が詳しい

    View Slide

  14. 14/19
    デバッグ

    View Slide

  15. 15/19
    シリアル通信(通信ケーブル)
    ● 懐かしの通信ケーブル → ネットワーク対戦!
    ● 現状 (T_T)

    View Slide

  16. 16/19
    ゲームボーイカラー対応
    ● ゲームボーイ(モノクロ)からの主な変更点
    – カラー LCD
    – 内蔵メモリ (VRAM,WRAM) の増加
    – DMAC の追加
    – CPU 倍速モード
    – 赤外線通信

    View Slide

  17. 17/19
    カラー対応

    View Slide

  18. 18/19
    感想
    ● 資料を読んでひたすら実装する、体力勝負。
    ● プログラム自体は単純( GB 自体がそれほど複雑なハード
    でない。 CPU も遅いので普通に書いても 60fps 出る。)
    ● バグ取りに苦労した。特に CPU にバグが残っているうちは
    大変。
    ● CPU とメモリ周りの実装は量が多い割に結果が目に見えな
    いので辛い。
    ● タイトル画面が出ると嬉しい。音が鳴ると嬉しい。
    ● 低レイヤも面白い。

    View Slide

  19. 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

    View Slide