1/19GAMEBOY エミュレータ
View Slide
2/19エミュレータ● ハードウェアの動作を模倣するソフトウェアのこと● GAMEBOY のエミュレータを作った– PC 上で GAMEBOY のソフトを遊べる– C 言語で書いた– SDL( マルチメディアライブラリ ) を使った
3/19何をエミュレーションすればいい?カートリッジカートリッジゲームパッドゲームパッドシリアル通信(通信ケーブル)シリアル通信(通信ケーブル)サウンドサウンドCPUCPULCDLCD内蔵メモリ内蔵メモリ
4/19CPU● CPU がないことにはどうにもならないので最初に実装● シャープ LR35902 というカスタム CPU– 8bit CPU– Clock Speed: 4.194304MHz– Intel8080 や Z80 に近い命令セット– GBA は ARM7 と LR35902 、 DS は ARM9 と ARM7● 命令を取り出し巨大 switch 文で命令によって分岐・実行、それを繰り返す– 割り込みチェックやクロック数のカウントも
5/19カートリッジ
6/19カートリッジ● ROM (ゲームのデータ)– 吸出し機を使うか、フリーの ROM を入手してくる● RAM (セーブデータ)– エミュレータでは、ファイルに書き出す● MBC (メモリバンクコントローラ)– カートリッジメモリへのアクセスを制御する– 数種類あり、扱える最大メモリ容量やリアルタイムクロック対応、振動パック対応等の違いがある– カートリッジ側の回路だがこれもエミュレーションしないといけない
7/19メモリ● メモリがないことにはどうにもならない● 16bit アドレス空間 (64KB) に内蔵メモリ ,カートリッジ側メモリ ,I/O レジスタ等をマッピング– メモリアクセスのための関数を用意し、アドレスによってアクセス先を変える。– I/O レジスタへのアクセスならデバイスのエミュレーションを行う。● ドラクエの ROM は 2MB もある!– MBC により、アクセスする範囲を選択 ( バンク切り替え )
8/19カートリッジROM16bitメモリ空間VRAM カートリッジRAMWRAM OAM I/O レジスタスタック領域MBC が制御0000 FFFF0000
9/19LCD● LCD がないと動いているのか分からない● モノクロ(4階調)● 背景・ウィンドウ・スプライトが順に重なる● VRAM 上に 8 x 8dot のタイルデータ● VRAM 上のマップデータを見ながら、タイルを敷き詰める● OAM にはスプライトの位置や向きの情報● 60fps になるよう時間調整– CPU の速度調節になる
10/19LCD を実装した
11/19ゲームパッド● ゲームパッドがないと START ボタンを押せない● ジョイスティックにも対応( SDL を使うと超簡単)
12/19遊べる
13/19サウンド● GB 音源は、矩形波 2ch と波形メモリ 1ch とノイズ 1ch● 主な機能– 波の周波数 , 長さ , 音量 , デューティ比の変更– 音量増減 ( エンベロープ )– 周波数増減 ( スイープ )– ノイズ : 線形帰還シフトレジスタによる擬似乱数● 様々なバリエーションの音が出せる● ニコニコ大百科『 GB 音源』が詳しい
14/19デバッグ
15/19シリアル通信(通信ケーブル)● 懐かしの通信ケーブル → ネットワーク対戦!● 現状 (T_T)
16/19ゲームボーイカラー対応● ゲームボーイ(モノクロ)からの主な変更点– カラー LCD– 内蔵メモリ (VRAM,WRAM) の増加– DMAC の追加– CPU 倍速モード– 赤外線通信
17/19カラー対応
18/19感想● 資料を読んでひたすら実装する、体力勝負。● プログラム自体は単純( GB 自体がそれほど複雑なハードでない。 CPU も遅いので普通に書いても 60fps 出る。)● バグ取りに苦労した。特に CPU にバグが残っているうちは大変。● CPU とメモリ周りの実装は量が多い割に結果が目に見えないので辛い。● タイトル画面が出ると嬉しい。音が鳴ると嬉しい。● 低レイヤも面白い。
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