返回

文章详情

展示 HN:宝可梦翡翠移植到树莓派 Pico 2

Hacker News2026年8月6日 21:49

宝可梦翡翠在 $6 微控制器上本地运行——完整游戏,60 fps,HDMI 输出,真实按钮,保存可以在断电后存活。无需模拟器:預编译的代码已从 ARMv4T 重新编译为 Cortex-M33,并且 Game Boy Advance 的视频硬件已在第二核心上以软件实现。目标板为 WeAct Studio Core2350B(RP2350B,16 MB QSPI 闪存)。整个游戏——代码、图形、地图、音乐——是一个 11.7 MB 的镜像,从闪存中就地执行。RP2350B @ 252 MHz ┌──────────────┬──────────────┐ │ 核心 0 │ 核心 1 │ │ 游戏逻辑 │ PPU 渲染 │──▶ 240×160 RGB565 帧缓冲 │ ~0.3 ms/f │ ~12 ms/f │ │ └──────────────┴──────────────┘ ▼ ▲ HSTX ──▶ DVI/HDMI 640×480p60 GP0–GP9 按钮(2× 放大,DMA 控制块环)状态 从始至终可玩,经过测试——启动、播放引导、开始新游戏、走动、战斗和保存。每个场景保持锁定的 60 fps,除了 OBJ 窗口引导动画。它还不是成品;请参见局限性。视频 ✅ 完整 PPU:模式 0–4、仿射、精灵、窗口、混合。字节精确 vs. 参考。帧速率 ✅ 锁定 60 fps,无撕裂,vsync 锁定到扫描束 输入 ✅ 10 个 GPIO 按钮 保存 ✅ 持久保存至 QSPI 闪存,重启和重写后依然有效 音频 ⚠️ 音乐播放;某些乐器类静音(见下文)连线电缆 / RFU ❌ 未实现 硬件 请参见 docs/HARDWARE.md 获取完整引脚图、材料清单和接线说明。简而言之:一个 RP2350B 板,一个 HSTX-to-HDMI 突出板,按 Pico DVI 插槽引脚顺序接线,十个按钮接地,另外可选 PCM5102A I²S DAC 用于音频。构建 请参见 docs/BUILD.md 获取先决条件和完整过程。简短版,从 repo 根目录开始:make tools && make modern # 首先:解编译工具 + 生成的资产 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 已经将对真实 GBA 硬件的每个依赖隔离到了 #if WASM 之后。将这些接缝重用为 #if WASM || RP2350 意味着硬件去除的工作已经完成;这个移植只需添加 MCU 特定内容。GBA 内存映射依旧有效。游戏仍然在其原始地址上写入 DISPCNT、VRAM、OAM 和调色板 RAM——这些现在只是普通的 SRAM。实时 RAM 大约为 RP2350 的 520 KB 中的 378 KB。ROM 存储在 QSPI 闪存中,通过 XIP,游戏的 0x08000000 基址被重新映射到 0x10000000。PPU 是核心 1 上的软件光栅化器。从 WASM 主机的 web/app.js 移植并将字节逐一进行验证。第一个可用的版本以 909 ms/帧 的速度运行;每帧调色板 LUT、每扫描线窗口掩码、8 像素瓷砖跨度和增量仿射步进将其提升到 60 fps——约 45 倍更快。专门的内部循环随后将典型场景剪切到约 12 ms。扫描输出根本不需要 CPU。DMA 控制块环给 HSTX 序列化器提供完整的 525 行帧,CPU 完全不干预重新装载路径。中断是建议性的。这使得显示免受保存时闪存写入所导致的多毫秒停顿的影响——而且这花费了大约 0.8 次每分钟的 HDMI 中断才能达到这一点。局限性 诚实列出当前为止缺失或错误的内容:音频不完整。m4a 引擎已移植且音乐播放,但 DPCM(压缩)和反向播放乐器是静默的占位符。混音与帧速率相关,因此任何低于 60 fps 的场景都会出现音频不足。尚未进行细致的耳听准确性验证。没有连线电缆或无线连接。RFU 和多重启动路径是占位符。交易、战斗和神秘礼物下载代码路径无效。(神秘礼物的运行下载代码路径将数据重定位为 Thumb 代码,这在 M33 上是不可行的。)RTC 是无效的卡带时钟。真实的翡翠通过卡带 GPIO 进行 RTC 的 bit-banging,而这里并不存在。时间读取为零,游戏内的时钟设置屏幕报告“时钟停止”。浆果生长和其他时间事件受到影响。OBJ 窗口引导动画以 20–25 ms/帧 运行,低于 60 fps。这是唯一没有快速路径的场景。音频硬件是可选的,但不够完善。如果未接线 I²S DAC,游戏将静默且正确地运行。代码库布局 这是 pokeemerald-wasm 的一个分支,而 pokeemerald-wasm 又是 pret/pokeemerald 的一个分支。这几乎所有内容都是上游的;这个移植是...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡