Appearance
GBA(Game Boy Advance)
是什么
Game Boy Advance(GBA)是任天堂于 2001 年发布的 32 位便携式游戏机。它是 Game Boy 系列的第三代产品,采用 ARM7TDMI 处理器(ARMv4T 架构),主频约 16.78 MHz,配备 240×160 像素的反射式彩色液晶屏,支持 15 位色深(32768 色)。GBA 是 Pokémon Emerald 的原始运行平台。
为什么需要
理解 GBA 硬件架构是在浏览器中准确模拟该平台运行环境的基础。pokeemerald-wasm 项目本质上是在 Web 环境中"模拟"GBA 的关键硬件行为——不是通过模拟器逐指令执行,而是将原始 C 代码重新编译为 WebAssembly,使其在现代浏览器中运行。为此,必须理解:
- 内存映射:GBA 的硬件寄存器、显存、工作内存各有固定地址。
- 图形管线:背景、精灵、调色板等图形资源的工作方式决定了渲染逻辑。
- CPU 架构:ARM7TDMI 的特性影响代码编译和内存对齐。
原理与实现
GBA 的主要硬件参数:
| 组件 | 规格 |
|---|---|
| CPU | ARM7TDMI(ARMv4T),16.78 MHz,支持 ARM 和 Thumb 指令集 |
| 屏幕 | 240×160 像素,15 位色深(BGR555) |
| 工作内存(WRAM) | 288KB(片上 32KB + 片外 256KB) |
| 显存(VRAM) | 96KB,地址 0x06000000 |
| 精灵属性内存(OAM) | 1KB,地址 0x07000000 |
| 调色板 | BG 256 色 + OBJ 256 色,地址 0x05000000 |
| 音频 | 6 个声道(4 个 PSG + 2 个直接音频) |
| 卡带 | 最大 32MB ROM,可选 SRAM/Flash/EEPROM 存档 |
GBA 的内存映射结构:
0x00000000–0x01FFFFFF:BIOS ROM0x02000000–0x02FFFFFF:片外工作内存(EWRAM,256KB)0x03000000–0x03FFFFFF:片内工作内存(IWRAM,32KB)0x04000000–0x04FFFFFF:I/O 寄存器0x05000000–0x05FFFFFF:调色板 RAM0x06000000–0x06FFFFFF:VRAM0x07000000–0x07FFFFFF:OAM0x08000000–0x0FFFFFFF:游戏卡带 ROM
在 pokeemerald-wasm 中的实现
在 pokeemerald-wasm 中,GBA 的硬件环境被重新映射到 WebAssembly 的线性内存空间中:
- 256MB Wasm 线性内存中保留了 GBA 原始的内存地址布局,VRAM、OAM、Palette 等仍位于各自的硬件地址上。
- 渲染管线由 JavaScript 侧的
app.js实现,它读取 Wasm 内存中的 VRAM 和 OAM 数据,使用 Canvas 2D API 将 240×160 的画面绘制到网页上。 - 输入处理将键盘/触摸事件映射为 GBA 的按键状态。
- 音频输出通过 Web Audio API 实现。
- 原本访问 GBA 硬件寄存器的代码通过编译适配,在 Wasm 环境中以内存操作的方式继续工作。