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
55
GAMEBOYエミュレータ
Daiki Matsunaga
December 10, 2017
Tweet
Share
More Decks by Daiki Matsunaga
See All by Daiki Matsunaga
8日で作るオレオレRISC-V CPU
matsud224
3
1.8k
Satyrographos Package Indexの宣伝
matsud224
0
160
Prolog
matsud224
1
80
オレオレ言語 soramame の紹介
matsud224
0
44
Other Decks in Programming
See All in Programming
Introduction to GitOps
hwchiu
0
110
CSC307 Lecture 10
javiergs
PRO
0
310
Activities at Cairo Library
cairolibrary720
0
1.2k
AWS CDKにおける「再利用性」を考える / aws-cdk-reusability
gotok365
6
1.3k
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
1
410
Clean Architecture by TypeScript & NestJS
ryounasso
0
150
DDDを志して3年経ったら「DDDの皮を被ったクリーンアーキテクチャ」になった話【デブサミ2024夏】
texmeijin
1
620
[After Kotlin Fest 2024 LT Night @ Sansan] もっともっとKotlinを好きになる!K2 Compiler Pluginで遊んでみよう!
kitakkun
2
260
APIのない大学ログインWebサービスをWKWebViewとJavaScriptでアプリ化した話
akidon0000
1
330
Microservices rules (July 2024) : what good looks like
cer
PRO
0
1.6k
Terraformテスト入門
msato
0
540
「2024年版 Kotlin サーバーサイドプログラミング実践開発」の補講 〜O/Rマッパー編〜
n_takehata
2
260
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
42
2.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
19k
Facilitating Awesome Meetings
lara
46
5.8k
Practical Orchestrator
shlominoach
185
10k
Building Effective Engineering Teams - LeadDev
addyosmani
47
2.2k
Statistics for Hackers
jakevdp
792
220k
Testing 201, or: Great Expectations
jmmastey
33
6.9k
Docker and Python
trallard
37
2.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
34
1.9k
BBQ
matthewcrist
82
9k
The Brand Is Dead. Long Live the Brand.
mthomps
52
36k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.4k
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