戻る

NESエミュ開発

Oct 2, 2020

ゲームの解析をよく理解している人がどれぐらいなのかは予想がつかないが, 最低限CPUの命令は理解しているとしてAPU, PPUなどとの連携をどのように行っているかを理解するのは難しい. PSや64レベルのハードでは処理の量が多く解析が難しいが, SNESも独自のチップ搭載カートリッジが多く難しい. NESやGB, GBAはこれらに比べて比較的簡単なのでこれらのハードの動作を理解することで好きなハードの動作の理解につながるだろう.

https://yizhang82.dev/nes-emu-overview を参考.

NESのスペック

8bit 6502 CPU 1.79MHZ, A,X,Yレジスタ, P(ステータス), SP(Stack Pointer), PC(Program Counter)レジスタを持つ. 16bitのPCレジスタ以外は8bitだ.

PPU (Picture Processing Unit)は256x240ピクセル. 背景8x8のタイル, 最大64個の8x8, 8x16スプライトを使って描画される. ピクセル単位のスクロール機能

APU (Audio Processing Unit) はパルスチャンネル2つ, 三角波1つ, ノイズ1つ, DMC(delta modulation)1つからなる.

コントローラー

カートリッジ(and Mapper) http://wiki.nesdev.com/w/index.php/Cartridge_board_reference を見ればわかるとおりカートリッジには多くのタイプがある. セーブができるROMはバッテリー付きのRAM, 拡張APU, Mapperはカートリッジの拡張された部分にアクセスするためのアドレス空間の割り当てを制御する. http://wiki.nesdev.com/w/index.php/Mapper

注意することは, romファイルはカートリッジの一部の情報に過ぎない. そのほかの機能はエミュレーター側が実装する必要がある. 具体的にはカートリッジが用意するMapperにしたがってカートリッジ専用の処理ルートを構築する. もちろん, Mapperはromではなく別のハードだ.

実装の流れ

いきなり全てを実装するのは破綻するので, 次のような計画を考える.

1. まずCPUの実装

2. mapper0のNESに向けた実装. http://wiki.nesdev.com/w/index.php/Emulator_tests のテストを活用してバグを修正.

3. PPU実装.

4. mapper 0のゲームでテストする. ドンキーコングなどが良い.

5. スクロール実装. http://wiki.nesdev.com/w/index.php/PPU_scrolling を読む.

6. スクロールテスト. まずYスクロールでテスト, アイスクライマーがよい.

7. マリオブラザーズテスト.

8. APU実装.

9. 他のmapper(MMC1, MMC3など)を実装.

10. ゲーム独自の実装が必要になるものもある: http://wiki.nesdev.com/w/index.php/Tricky-to-emulate_games

11. エミュレーターの機能を実装. デバッグ, ロード/セーブ, 巻き戻し/早送り, チートなど.

開発の助けになるもの

ログ機能は必ず実装する.

Mesenというデバッガーを使う. https://www.mesen.ca/

http://visual6502.org/

I made an NES emulator. Here’s what I learned about the original Nintendo.

http://nesdev.com/NESDoc.pdf