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
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GAMEBOYエミュレータ
Daiki Matsunaga
December 10, 2017
More Decks by Daiki Matsunaga
See All by Daiki Matsunaga
8日で作るオレオレRISC-V CPU
matsud224
3
2.3k
Satyrographos Package Indexの宣伝
matsud224
0
240
Prolog
matsud224
1
190
オレオレ言語 soramame の紹介
matsud224
0
140
Other Decks in Programming
See All in Programming
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
170
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
390
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
280
ソフトウェアラスタライザ
fadis
1
720
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
180
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
660
プロポーザルを書いてもらう
pvcresin
0
590
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
170
Flow は今どうなっているか
mizdra
PRO
0
760
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
230
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
450
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
260
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
BBQ
matthewcrist
89
10k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
エンジニアに許された特別な時間の終わり
watany
108
250k
Odyssey Design
rkendrick25
PRO
2
780
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Product Roadmaps are Hard
iamctodd
55
12k
Designing for humans not robots
tammielis
254
26k
HDC tutorial
michielstock
2
820
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
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