
2026/08/07 6:49
Show HN: ポケットモンスターエメラルドをRaspberry Pi Pico 2 に移植しました
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
報告される最も大きな成果は、252 MHz で動作し、1 秒間に 60 フレームの画率を実現することで、Pokémon Emerald が WeAct Studio Core2350B マイクロコントローラー (RP2350B) にてネイティブに正常に動作することに成功した点である。本システムは、オンボードフラッシュストレージから直接フルゲームプレイ、電源サイクルを超えた持続的なセーブデータの保存、ハイクオリティな HD 対応 HDMI 出力を提供し、従来のエミュレーションオーバーヘッドを排除している。本プロジェクトでは、元のアーム v4T コードを現代的な Cortex-M33 コアに書き直し、コア 1 上でソフトウェア的にゲームボーイアドバンスのビデオハードウェアを実装し、コア 0 でゲームロジックを担当させることでこの成果を実現した。また、既存のオープンソースエコシステムを活用し、pokeemerald-wasm のハードウェア抽象化層と参照ラスタライザーを用いてバイト単位正確な PPU 検証を確保している。
しかし、ハードウェアおよび実装上の制約により、高度な機能は未完了の状態である。オンライン取引、対戦、ミステリーギフト、リンクケーブルサポート、RFU は利用できない。これは、Emerald が要求する特定の RTC ビットバンギング機能が不足している(カートリッジ GPIO の読み取り値がゼロ)ためである。音響システムは m4a エンジンを使って音楽を再生するが、DPCM および逆再生楽器については無音のスタブが含まれており、フレームレート連動型のミキシングにより 60 fps 未満でアンダーランが発生する可能性もある。さらに、シネマティックなイントロは最適化された高速パスの欠如によりメインループよりも若干遅く実行される。ビルドプロセスには、標準形式からアセットを生成し、ソースコードを単一のイメージにコンパイルして 16 MB の QSPI フラッシュから実行し、読み込み用の
.uf2 ファイルを作成することを含んでいる。このマイルストーンにより、複雑なゲームボーイアドバンスタイトルが極めて低コストのマイクロコントローラー上で効率的に実行できることが証明され、レトロゲーミング愛好家向けに新たな予算フレンドリーなプラットフォームを提供するとともに、コアとなる作業は MIT ライセンスの下で公開される(上流のアセットおよび ROM は除く)。本文
Pokémon Emerald の RISC-V マイクロコントローラ搭載基板でのネイティブ実行プロジェクト
WeAct Studio Core2350B 上で、Pokémon Emerald をエミュレータなしにネイティブに動作させたプロジェクトの詳細です。 フルゲームの再生、60fpsの実行、HDMI出力、実在するボタン操作、電源切断時のセーブデータ保持を達成しました。
技術的特徴とアーキテクチャ
- エミュレータ不使用:
によるデコンパイルコードを ARMv4T から Cortex-M33 へ再コンパイルし、GBA の動画ハードウェアを第 2 コアでソフトウェア実装。prett - 対象ボード: WeAct Studio Core2350B(RP2350B、16MB QSPI フラッシュ)。
- コード・グラフィック・マップ・音楽を含む全イメージはフラッシュからインプレックス実行(11.7 MB)。
ハードウェア構成とコア役割分担
- CPU: RP2350B @ 252 MHz
- 出力解像度: 240×160 RGB565 (PPU) → HSTX シリアルライザー経由で DVI/HDMI 640×480p60 (2 倍アップスケーリング)。
- コア 0 (ゲームロジック):
- 処理速度: 〜0.3 ms/フレーム。
- GP0–GP9 ポートを通じてボタン入力制御。
- コア 1 (PPU レンダリング):
- 処理速度: 〜12 ms/フレーム。
- DMA コントロールブロックリングを使用。
現在の動作状況と機能
✅ 稼働している機能
- フルプレイ可能: 起動から終了まで全てのフローが動作。
- イントロ、新規ゲーム開始、ワールド移動、バトル、セーブ機能が正常。
- 映像 (PPU): モード 0–4、アフィン変換、スプライト、ウィンドウ、ブレンド機能全対応。参照データに対してバイト単位の正確性を確認済み。
- フレームレート: ロックされた 60fps(ティアフリー)。スキャンアウトビームに同期した垂直同期(vsync)対応。
- 入力操作: GPIO ポート 10 を使用したボタン入力に対応。
- セーブ機能: QSPI フラッシュへの永続的保存を実現。再起動や再フラッシュ後もデータ保持可能。
⚠️ 制限事項と未実装機能
- 音響:
- 音楽再生は実装済みだが、一部の楽器クラスは音声出力なし(スチュブ)。
- m4a エンジン移植済みだが、DPCM(圧縮音声)およびリバース再生楽器は動作しない。
- ミキシングはフレームレートに依存しており、60fps 未満のシーンではアンダーランする可能性がある。
- リンクケーブル / RFU (Random Function Unit): 未実装。取引、バトル、ミステリーギフトのダウンロードコード経路は動作せず(M33 アーキテクチャ上の仕様制限のため)。
- RTC (リアルタイムクロック): カートリッジ時計機能は非活性。「時計は停止しています」と表示されます。ベリーの成長や時間帯依存イベントに響きます。
- OBJ ウィンドウイントロ映画: 20–25 ms/フレームで動作し、60fps より低速な唯一のシーン。
- 音響ハードウェア: オプション接続だが、未整備の状態です(I²S DAC 接続なしでも無音での動作は可能)。
ビルド手順
詳細は
docs/BUILD.md を参照ください。ルートディレクトリからの簡易コマンドライン操作は以下の通りです。
# 1. ツールとアセットの準備 make tools && make modern # 2. サウンドアセットの生成(一度のみ実行):wav->bin、mid->s (song) rp2350/gen_sound_assets.sh # 3. ゲームソースコードのコンパイル rp2350/build_objs.sh # 4. ビルド(環境変数 PICO_SDK_PATH が必要) cmake -B rp2350/hw/build -S rp2350/hw -G Ninja ninja -C rp2350/hw/build emerald # 5. ファイルの書き出し picotool load -f rp2350/hw/build/emerald.uf2
デバッグ用テストターゲット
rp2350/hw/CMakeLists.txt は、統合前の各サブシステムの検証のために以下のスタンドアローンターゲットもビルドします。これらは新しいボードのデバッグに有用です。
: カラーバー出力hstx_testpsram_test
: 440 Hz 正弦波生成i2s_testdisplay_testppu_display_testemerald_hwtest
動作原理と設計思想
開発ログや測定値の詳細は
を参照してください。docs/PORTING.md
アーキテクチャの継承と適応
- WASM ポートとの互換性:
において既に WASM 依存関係を囲んでいたコードを、tripplyons/pokeemerald-wasm
により再利用し、ハードウェア依存からの脱却を完了。#if WASM || RP2350 - メモリマップ: GBA メモリマップはそのまま維持(DISPCNT, VRAM, OAM, パレット RAM を元アドレスへ書き込み)。
- ライブ RAM: RP2350 の 520 KB 中約 378 KB を使用。
- ROM: QSPI フラッシュ上の XIP (Execute In Place)。ベースアドレス
→0x08000000
にマッピング。0x10000000
PPU と描画最適化
- PPU: 第 1 コア上で動作するソフトウェアレンダライザー(WASM ホスト側のコード移植)。
- 初期性能: 909 ms/フレーム → 現在:〜12 ms/フレーム(約 75 倍高速化)。
- 最適化手法: フレーム毎のパレット LUT 更新、スキャンラインごとのウィンドウマスク、8 ピクセルタイルスパン処理、増分アフィンステップ化。
- 描画パイプライン: CPU はスキャンアウト(画面描画)時に不要。
- DMA コントロールブロックリングが HSTX シリアルライザーにフルな 525 ラインのフレームを供給するため、CPU は中断処理のみを担当。
- これにより、フラッシュ書き込み時のミリ秒単位の停止(ストール)でも画面描画は継続し、HDMI ドロップアウトを回避。
リポジトリ構成
pokeemerald-wasm のフォークであり、アップストリームからの継承がほぼ全てです。
| パス | 内容 |
|---|---|
| ポート部分:PPU ドライバー、HSTX ディスプレイ、BIOS コール、m4a エンジン、ビルドスクリプト。 |
| Pico SDK プロジェクト(ゲームメイン、リンカースクリプト、フラッシュセーブ、I²S、テストターゲット)。 |
| ハードウェア構成、ビルド手順、ポートに関するドキュメント。 |
, , , | アップストリームの pokeemerald ゲームソースとアセット。 |
, | WASM ビルド(PPU の参照実装として保持;参照用)。 |
PPU の検証ハネス
WASM ビルドは意図的に維持されています。
- 検証方法:
を実行すると、ブラウザ内での JavaScript レンダライザ出力と C ライブラリ (rp2350/ppu_validate.sh
) のレンダリング結果をピクセル単位で比較・差分表示します。rp2350/ppu.c - 役割: これにより PPU がバイト単位の正確性を保つことが保証され、各最適化パスでのバグ検出に寄与しました。
ライセンスとクレジット
ライセンス情報
ディレクトリ: オリジナル開発分。MIT ライセンス (rp2350/
) で公開。rp2350/LICENSE- 他のディレクトリ:
のデコンパイルコード使用分。独自のライセンスを伴わない。ROM は含まれません(コミット済みソースからビルド)。pre- 注記: ポケモン関連名称は任天堂、Creatures Inc.、GAME FREAK Inc. の商標です。
クレジット
- pret/pokeemerald: デコンパイル作業の実施者。
- tripplyons/pokeemerald-wasm: WebAssembly ポートおよび参照レンダライザーの提供。