开发者生态
morning
Show HN:神奇宝贝翡翠移植到 Raspberry Pi Pico 2
2026-08-07
1 阅读
约8分钟阅读
mdeeds
字号:
Pokémon Emerald 在 6 美元的微控制器上本地运行 — 完整游戏、60 fps、HDMI 输出、真正的按钮、可在电源循环后保存。无模拟器:预反编译从 ARMv4T 重新编译为 Cortex-M33,并且 Game Boy Advance 的视频硬件在第二个内核上的软件中重新实现。目标板是 WeAct Studio Core2350B(RP2350B,16 MB QSPI 闪存)。整个游戏——代码、图形、地图、音乐——是一个从闪存执行的 11.7 MB 图像。 RP2350B @ 252 MHz ┌────────────┬────────────┐ │ core 0 │ core 1 │ │ 游戏逻辑 │ PPU 渲染 │──▶ 240×160 RGB565 帧缓冲 │ ~0.3 ms/f │ ~12 ms/f │ │ └──────────────┴────────────┘ ▼ ▲ HSTX ──▶ DVI/HDMI 640×480p60 GP0–GP9 按钮(2 个高档、DMA 控制块环) 据测试,可从头到尾播放 — 启动、玩介绍、开始新游戏、行走主世界、战斗和保存。除 OBJ 窗口介绍动画外,每个场景都保持锁定的 60 fps。它不是成品;请参阅限制。视频 ✅ 完整 PPU:模式 0-4、仿射、精灵、窗口、混合。字节精确与参考。帧速率 ✅ 锁定 60 fps、无撕裂、垂直同步锁定到扫描输出光束 输入 ✅ 10 个 GPIO 按钮 保存 ✅ 保留到 QSPI 闪存,在重新启动和重新刷新后仍能正常工作 音频 ⚠️ 音乐播放;某些仪器类别静音(见下文) 连接电缆/RFU ❌ 未实施 请参阅 docs/HARDWARE.md 了解完整的引脚排列、物料清单和接线说明。简而言之:一块 RP2350B 板、一个按 Pico DVI Sock 引脚顺序接线的 HSTX 至 HDMI 分线器、十个接地按钮,以及可选的用于声音的 PCM5102A I²S DAC。请参阅 docs/BUILD.md 了解先决条件和完整过程。简短版本,来自仓库根目录: make tools && make Modern # 第一个:decomp 工具 + 生成的资源 rp2350/gen_sound_assets.sh # 一次性:wav→bin, mid→song .s rp2350/build_objs.sh # 游戏源 → rp2350/build/libpokeemerald.a cmake -B rp2350/hw/build -S rp2350/hw -G Ninja # PICO_SDK_PATH 必须设置 ninja -C rp2350/hw/build emerald picotool load -f rp2350/hw/build/emerald.uf2 rp2350/hw/CMakeLists.txt 还构建独立的启动目标,用于在集成之前验证芯片上的每个子系统,这是调试新板的最快方法: hstx_test (彩条)、 psram_test 、 i2s_test (440 Hz 正弦)、 display_test 、 ppu_display_test 、 emerald_hwtest 。完整的工程日志(每个阶段、进行执行/不执行调用的测量以及花费最多时间的错误)位于 docs/PORTING.md 中。简短的故事:它搭载在 WASM 端口上。 tripplyons/pokeemerald-wasm 已经在 #if WASM 后面隔离了对真实 GBA 硬件的所有依赖。将这些接缝重新用作 #if WASM || RP2350意味着去硬件工作已经完成;该端口只需添加 MCU 特定的一半。 GBA内存映射仍然存在。游戏仍然在其原始地址写入 DISPCNT、VRAM、OAM 和调色板 RAM——现在这些只是普通的 SRAM。 RP2350 的实时 RAM 约为 378 KB(520 KB)。 ROM 通过 XIP 存在于 QSPI 闪存中,游戏的 0x08000000 基址重新映射到 0x10000000 。 PPU 是核心 1 上的软件光栅化器。从 WASM 主机的 web/app.js 移植并针对它进行了字节精确验证。第一个工作版本的运行速度为 909 毫秒/帧;每帧调色板 LUT、每扫描线窗口蒙版、8 像素图块跨度和增量仿射步进将速度提高到 60 fps — 大约快 45 倍。然后,专门的内部循环将典型场景削减至约 12 毫秒。 Scanout 根本不需要CPU。 DMA 控制块环向 HSTX 串行器提供完整的 525 行帧,而 CPU 永远不会触及重新准备路径。中断是建议性的。这就是使显示器免受闪存写入在保存过程中引起的多毫秒停顿的影响,并且需要消除每分钟大约 0.8 次闪烁的 HDMI 丢失才能达到这一目的。诚实的列表,列出了被删除、丢失或错误的内容:音频不完整。 m4a 引擎已移植并可播放音乐,但 DPCM(压缩)和反向播放乐器是无声存根。混合与帧速率相关,因此任何低于 60 fps 的场景都会出现欠载。它没有经过仔细的耳朵正确性检查。没有连接电缆或无线。 RFU 和多重引导路径已被存根。交易、战斗和神秘礼物下载代码路径不起作用。 (Mystery Gift 的运行下载代码路径将数据重新定位为 Thumb 代码,该代码无法在写入的 M33 上工作。) RTC 是死盒时钟。 Real Emerald 通过墨盒 GPIO 对 RTC 进行位敲击,而此处不存在。时间读数为零,游戏中的时钟设置屏幕报告“时钟已停止”。浆果生长和一天中的其他事件都会受到影响。 OBJ 窗口介绍动画以 20–25 毫秒/帧运行,低于 60 fps。这是唯一一个没有快速路径的场景。音频硬件是可选的,但未经打磨。如果没有连接 I²S DAC,游戏可以安静且正确地运行。这是 pokeemerald-wasm 的叉子,也就是 pret/pokeemerald 的叉子。这里几乎所有的东西都在上游;该端口仅限于一个目录。路径 它是什么 rp2350/ 端口。 PPU、HS
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱