ポケモンエメラルドが6ドルのRP2350マイコンでネイティブ動作—エミュレータ不要
開発者がポケモンエメラルドの逆コンパイルをARMv4TからCortex-M33に再コンパイルし、RP2350の2番目のコアでGBAのビデオハードウェアをソフトウェアで再実装。フルゲーム、60fpsのHDMI出力、フラッシュへのセーブ。

エミュレータなしで6ドルのマイコンでフルGBAゲームを動かすのは、手品のように聞こえる。Matt Deedsのpokeemerald-rp2350はそれを現実にする:ポケモンエメラルドは、pret逆コンパイルのARMv4TからCortex-M33に再コンパイルされ、WeAct Studio Core2350B(RP2350B、16MB QSPIフラッシュ)上でネイティブ動作する。ゲーム全体—コード、グラフィック、マップ、音楽—は11.7MBのイメージとしてフラッシュからインプレース実行される。
仕組み
この移植はtripplyons/pokeemerald-wasmを基にしており、そこでは既にGBAハードウェアへの依存がすべて#if WASMで囲まれていた。それらの継ぎ目を#if WASM || RP2350として再利用することで、ハードウェア非依存化の作業は完了済みで、この移植はMCU固有の部分を追加するだけでよかった。
GBAのメモリマップは生き残っている。ゲームは依然としてDISPCNT、VRAM、OAM、パレットRAMを元のアドレスに書き込む—それらは今や単なるSRAMだ。ライブRAMはRP2350の520KBのうち約378KBを使用。ROMはXIP経由でQSPIフラッシュにあり、ゲームの0x08000000ベースは0x10000000に再マップされている。
PPUはコア1上のソフトウェアラスタライザで、WASMホストのweb/app.jsから移植され、それに対してバイト単位で検証されている。最初の動作バージョンは909ms/フレームだったが、フレームごとのパレットLUT、スキャンラインごとのウィンドウマスク、8ピクセルのタイルスパン、インクリメンタルなアフィンステッピングにより60fps—約45倍の高速化—を達成。その後、特化した内側ループで典型的なシーンを約12msに短縮した。
スキャンアウトはCPUを一切使わない。DMAコントロールブロックリングがHSTXシリアライザに525ラインのフルフレームを供給し、CPUは再アームパスに触れない。割り込みは参考用だ。これにより、セーブ中のフラッシュ書き込みによる数ミリ秒のストールがディスプレイに影響しない—そのために約0.8回/分のHDMIドロップアウトを排除する必要があった。
現状と制限
テストされた範囲では最初から最後までプレイ可能:起動、イントロ再生、新規ゲーム開始、オーバーワールド歩行、バトル、セーブ。OBJウィンドウのイントロカットシーン以外はすべてのシーンでロック60fpsを維持。正直な欠点リスト:
- オーディオは不完全。m4aエンジンは移植され音楽は再生されるが、DPCMと逆再生楽器は無音のスタブ。ミキシングはフレームレートに依存しているため、60fps未満のシーンではアンダーランが発生する。
- リンクケーブルやワイヤレスなし。RFUとマルチブートパスはスタブ。交換、バトル、ミステリーギフトのダウンロードコードパスは動作しない。
- RTCは死んだカートリッジ時計。時間はゼロと読み取られ、ゲーム内の時計設定画面は「時計が停止しています」と表示。きのみの成長や時間帯イベントに影響。
- OBJウィンドウのイントロカットシーンは20〜25ms/フレームで、60fps未満。高速パスがない唯一のシーン。
ビルドと検証
ビルドは簡単:make tools && make modern、その後いくつかのスクリプトでサウンドアセットを生成しゲームをビルド、そしてPico SDKプロジェクト用にCMake/Ninja。リポジトリには、統合前に各サブシステムをシリコン上で検証するためのスタンドアロンのブリングアップターゲット(hstx_test、psram_test、i2s_test、display_test、ppu_display_test、emerald_hwtest)も含まれる。
WASMビルドは意図的にPPUのリファレンスとして保持されている。rp2350/ppu_validate.shはブラウザでゲームを実行し、GBAメモリとJavaScriptラスタライザからのリファレンスフレームをダンプし、rp2350/ppu.cで同じ状態をレンダリングし、ピクセル差分を取る。このハーネスがPPUをバイト単位で正確と呼べる唯一の理由であり、各最適化パスで実際のバグを検出した。
rp2350/ディレクトリはMITライセンスのオリジナル作品で、残りはpret逆コンパイルでこのプロジェクトからのライセンスはない。ROMは不要で、含まれていない。
GBAのメモリマップは生き残っている。ゲームは依然としてDISPCNT、VRAM、OAM、パレットRAMを元のアドレスに書き込む—それらは今や単なるSRAMだ。