open_agb_firm:如何在 3DS 上原生运行 GBA 游戏,从安装到避坑
【免费下载链接】open_agb_firmopen_agb_firm is a bare metal app for running GBA homebrew/games using the 3DS builtin GBA hardware.项目地址: https://gitcode.com/gh_mirrors/op/open_agb_firm
在 3DS 上运行 GBA 游戏,模拟器是常规选择,但你要接受核心兼容性问题和偶发的卡顿。open_agb_firm 让 3DS 运行 GBA 游戏的方式不同:它调用 3DS 内置的 GBA 硬件模块直接运行游戏,3DS 在这里相当于另一台 GBA 外壳。如果你的机器已经刷好自定义固件,下面这些内容大约十分钟可以走完。
一句话讲清原理:它为什么没有模拟层
结论:3DS 的 SoC 里本来就带了一块 GBA 模块,3DS 系统软件运行 GBA 虚拟主机游戏用的就是它;open_agb_firm 以拥有完整硬件访问权限的 FIRM 身份启动,把 SD 卡上的 ROM 直接交给这块模块,全程没有软件模拟环节。
换个说法:模拟器是软件模仿乐器,open_agb_firm 是演奏房间里真实存在的那台。但硬件也自带边界,和模拟器的差异值得先扫一眼:
| 维度 | GBA 模拟器自制软件 | open_agb_firm |
|---|---|---|
| 运行方式 | CPU 模拟 | 3DS 内置 GBA 硬件 |
| 画面与声音 | 取决于核心,参数可调 | 硬件直出,音频存在固定混叠 |
| 存档格式 | 模拟器格式,可能需转换 | 直接写入 SD 卡,EEPROM 与多数模拟器不通用 |
| 存档状态 | 通常支持 | 无法实现 |
| 切换游戏 | 退出重进 | 需要重启机器 |
后两行就是它和模拟器的实际分界线:没有存档状态,切游戏要重启。能接受这两点,其余都是加分项。
克隆、编译、上机:把 open_agb_firm 装到 3DS
前提是一台已刷自定义固件的 3DS(以 Luma3DS 为例)。想从源码编译的话,先装好 devkitARM,把 firmtool 或 ctr_firm_builder 放进 PATH,release 构建还需要 7z 负责打包。
git clone --recurse-submodules https://gitcode.com/gh_mirrors/op/open_agb_firm cd open_agb_firm && make release构建完成后,剩下的都是文件搬运:
- 把生成的
open_agb_firm.firm拷到 SD 卡的/luma/payloads;使用 fastboot3DS 的话按它的槽位规则放置。 - 把
3ds文件夹拷到 SD 卡根目录,提示目录合并时选择合并。 - 开机时按住 START,在 payload 菜单里选中它,进文件浏览器找到
.gba就能开玩。
装完之后,拉开差距的是下面这些能力。
核心能力拆解:存档识别与自动补丁
存档类型自动识别
GBA 游戏的存档芯片五花八门,类型选错直接无法保存。open_agb_firm 自带一份游戏数据库gba_db.bin(release 包中位于/3ds/open_agb_firm/gba_db.bin),会根据 ROM 特征自动匹配存档类型;数据由仓库里的数据库脚本和游戏清单维护。没收录的游戏或 ROM hack,可以在/3ds/open_agb_firm/saves下对应的单游戏 ini 里写saveType强制指定芯片,或开启saveOverride,进游戏前弹菜单手动选。
IPS/UPS 补丁自动应用
补丁文件和 ROM 放同一目录,并把补丁重命名为与 ROM 同名(例如example.ips对应example.gba),启动时自动应用;选游戏时按住 X 则本次跳过补丁。试汉化、试修改版时这一步很省心,补丁的格式处理逻辑在补丁模块里。
另外两个小功能值得一试:游戏内按 SELECT+Y 可把当前画面存成 BMP,落在/3ds/open_agb_firm/screenshots,文件名取实时时钟;X+上/下调节亮度,X+左/右开关背光。Circle Pad 也可以映射成 GBA 方向键:
[input] RIGHT=RIGHT,CP_RIGHT LEFT=LEFT,CP_LEFT UP=UP,CP_UP DOWN=DOWN,CP_DOWN注意一点:按键映射最多可能引入一帧输入延迟,所以默认并没有把 Circle Pad 映射到方向键。
避坑与进阶:config.ini 的高频问题
所有设置都写在/3ds/open_agb_firm/config.ini,下面几个高频问题,先给结论再说修法。
FAQ:存档与颜色出问题时
- 游戏无法保存:按顺序查三件事。ROM 是否原版(未修改、校验值一致);
gba_db.bin是否版本够新;是否在复用旧的.SAV——模拟器存的 EEPROM 档格式与 open_agb_firm 预期不同,不能直接用,网上有专门的转换工具。都不适用时,手动指定saveType。 - 颜色看着不对:把
colorProfile设成gba或identity,后者不做色彩空间转换,只调对比度和亮度。非none的配色每帧要多访问 RAM 和 CPU,续航消耗明显更高。 - 声音有杂音:硬件音频通路的混叠问题,目前没有软件解法,把
volume调小(有效区间 -128 到 -20)或改接耳机。
先接受硬件边界
以下几点是 3DS 内置 GBA 硬件的硬限制,不是项目 bug:大于 32 MiB 的游戏无法运行、不支持串行口(联机线)、没有存档状态、切换游戏必须重启。入坑前对照一下自己的游戏库,比遇到问题再查要省事。
资源与社区:如何保持更新
open_agb_firm 采用 GPL v3 许可,代码是 ARM9/ARM11 双核结构,大部分逻辑跑在 ARM11 侧。遇到 bug 时,先翻 README 的 Known Issues 和 FAQ 两节,本文大部分问题在那里都有原始出处。
下一步行动:如果还没动手,先克隆仓库并构建一次 release,产物里已包含上机即用的gba_db.bin。
git clone --recurse-submodules https://gitcode.com/gh_mirrors/op/open_agb_firm【免费下载链接】open_agb_firmopen_agb_firm is a bare metal app for running GBA homebrew/games using the 3DS builtin GBA hardware.项目地址: https://gitcode.com/gh_mirrors/op/open_agb_firm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考