Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GAMEBOYエミュレータ
Search
Daiki Matsunaga
December 10, 2017
Programming
0
89
GAMEBOYエミュレータ
Daiki Matsunaga
December 10, 2017
Tweet
Share
More Decks by Daiki Matsunaga
See All by Daiki Matsunaga
8日で作るオレオレRISC-V CPU
matsud224
3
2.1k
Satyrographos Package Indexの宣伝
matsud224
0
190
Prolog
matsud224
1
120
オレオレ言語 soramame の紹介
matsud224
0
62
Other Decks in Programming
See All in Programming
開発者フレンドリーで顧客も満足?Platformの秘密
algoartis
0
210
ComposeでWebアプリを作る技術
tbsten
0
130
In geheimer Mission: AI Agents entwickeln
joergneumann
0
110
オープンソースコントリビュート入門
_katsuma
0
130
VibeCoding時代のエンジニアリング
daisuketakeda
0
160
カウシェで Four Keys の改善を試みた理由
ike002jp
1
130
CursorとDevinが仲間!?AI駆動で新規プロダクト開発に挑んだ3ヶ月を振り返る / A Story of New Product Development with Cursor and Devin
rkaga
1
410
AIコーディングの本質は“コード“ではなく“構造“だった / The essence of AI coding is not “code” but "structure
seike460
PRO
1
240
データベースの技術選定を突き詰める ~複数事例から考える最適なデータベースの選び方~
nnaka2992
0
240
By the way Google Cloud Next 2025に行ってみてどうだった
ymd65536
0
130
AIコーディングエージェントを 「使いこなす」ための実践知と現在地 in ログラス / How to Use AI Coding Agent in Loglass
rkaga
4
1.3k
ぽちぽち選択するだけでOSSを読めるVSCode拡張機能
ymbigo
14
6.2k
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
105
19k
Practical Orchestrator
shlominoach
187
11k
Scaling GitHub
holman
459
140k
The Pragmatic Product Professional
lauravandoore
33
6.6k
The Cult of Friendly URLs
andyhume
78
6.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
A better future with KSS
kneath
239
17k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
600
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Transcript
1/19 GAMEBOY エミュレータ
2/19 エミュレータ • ハードウェアの動作を模倣するソフトウェアのこと • GAMEBOY のエミュレータを作った – PC 上で
GAMEBOY のソフトを遊べる – C 言語で書いた – SDL( マルチメディアライブラリ ) を使った
3/19 何をエミュレーションすればいい? カートリッジ カートリッジ ゲームパッド ゲームパッド シリアル通信 (通信ケーブル) シリアル通信 (通信ケーブル)
サウンド サウンド CPU CPU LCD LCD 内蔵メモリ 内蔵メモリ
4/19 CPU • 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 カートリッジ ROM 16bit メモリ空間 VRAM カートリッジ RAM WRAM OAM
I/O レジスタ スタック領域 MBC が制御 0000 FFFF 0000
9/19 LCD • LCD がないと動いているのか分からない • モノクロ(4階調) • 背景・ウィンドウ・スプライトが順に重なる •
VRAM 上に 8 x 8dot のタイルデータ • VRAM 上のマップデータを見ながら、タイルを敷き詰める • OAM にはスプライトの位置や向きの情報 • 60fps になるよう時間調整 – CPU の速度調節になる
10/19 LCD を実装した
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