Appearance
pret 反编译项目
是什么
pret 是一个知名的逆向工程社区项目,致力于将经典 Pokémon 游戏的 ROM 完整反编译为可编译的 C 源代码。其中 pokeemerald 是 pret 项目针对 Pokémon Emerald(绿宝石版)的反编译成果,托管在 GitHub 上的 github.com/pret/pokeemerald 仓库。该项目的代码质量极高,编译产物与原始 ROM 逐字节一致。
为什么需要
pret/pokeemerald 是 pokeemerald-wasm 项目的代码基础。没有 pret 项目的反编译成果,将 Pokémon Emerald 移植到浏览器中运行几乎不可能实现:
- 完整源码:pret 提供了整个游戏的 C 源代码,包括游戏逻辑、图形渲染、音频处理、UI 系统等所有模块。
- 可编译验证:源码可以通过 devkitARM 编译为与原始 ROM 完全相同的
.gba文件,确保反编译的正确性。 - 代码注释:社区对代码进行了大量注释,帮助理解游戏内部的工作机制。
- 构建系统:提供了完整的 Makefile 和构建脚本,支持灵活的编译配置。
原理与实现
反编译过程
pret 项目的反编译是一个极其复杂的过程,大致包括:
- ROM 解析:使用工具(如
binutils、mGBA调试器)分析 ROM 的二进制结构。 - 反汇编:将 ARM/Thumb 机器码反汇编为汇编代码。
- 函数识别:识别每个函数的边界、参数和返回值。
- C 代码重构:将汇编代码手动重写为等效的 C 代码。
- 数据结构还原:还原游戏中的结构体、数组、常量等数据定义。
- 资源提取:将 ROM 中嵌入的图形、音频、地图数据等资源提取为独立的文件。
- 验证:编译 C 代码并与原始 ROM 进行二进制对比,确保逐字节一致。
代码结构
pret/pokeemerald 的代码库结构大致如下:
src/— 游戏 C 源代码(主逻辑、战斗系统、地图系统等)data/— 游戏数据(地图、精灵、技能等配置)graphics/— 图形资源(精灵图、背景图、UI 等)sound/— 音频资源include/— 头文件tools/— 构建辅助工具Makefile— 构建脚本
匹配验证
pret 项目的一个核心原则是"匹配"(matching)——编译产物必须与原始 ROM 完全一致。这通过在 Makefile 中使用 COMPARE=1 选项来验证,构建系统会自动对比编译输出和原始 ROM 的哈希值。
在 pokeemerald-wasm 中的实现
pokeemerald-wasm 基于 pret/pokeemerald 的代码库,在其基础上添加了 WebAssembly 编译支持:
- 代码库分支:pokeemerald-wasm 是 pret/pokeemerald 的一个分支(fork),保留了原始代码结构。
- Wasm 适配:添加了 Wasm 编译所需的适配代码,包括:
- 硬件抽象层的替换(如 I/O 寄存器访问改为内存操作)。
AgbMain和WasmRunFrame等 Wasm 入口函数。- 音频输出的 Web Audio API 桥接。
- 构建系统扩展:在原始 Makefile 基础上添加了 Wasm 构建目标,支持使用 Clang + wasm-ld 编译。
- 资源处理:
generate_wasm_assets.py脚本处理原始构建路径中的 INCGFX/INCBIN 资源引用,将其转换为 Wasm 可用的格式。 - Web 前端:添加了
app.js等 Web 文件,负责渲染、输入处理和 Wasm 模块加载。