Skip to content

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 的主要硬件参数:

组件规格
CPUARM7TDMI(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 ROM
  • 0x02000000–0x02FFFFFF:片外工作内存(EWRAM,256KB)
  • 0x03000000–0x03FFFFFF:片内工作内存(IWRAM,32KB)
  • 0x04000000–0x04FFFFFF:I/O 寄存器
  • 0x05000000–0x05FFFFFF:调色板 RAM
  • 0x06000000–0x06FFFFFF:VRAM
  • 0x07000000–0x07FFFFFF:OAM
  • 0x08000000–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 环境中以内存操作的方式继续工作。

相关概念

  • VRAM — 96KB 显存,存储背景和精灵的图块数据
  • OAM — 1KB 精灵属性内存,存储 128 个精灵的属性
  • Tile — GBA 的基本图形单元,8×8 像素
  • Sprite — 硬件加速的可移动图形对象
  • Palette — BGR555 格式的颜色查找表