Appearance
GBA 硬件模拟
GBA 的完整硬件地址空间被映射进 WASM 模块的线性内存,让编译为 WebAssembly 的游戏代码像在真实硬件上一样按地址读写。
app.js负责建立内存视图、处理输入与 Flash 存档;图形渲染则由 WASM 内的src/wasm_display.c直接读取这片内存完成。
涵盖内容
| 模块 | 说明 |
|---|---|
| 硬件概念 | GBA 内存映射、I/O 寄存器、VRAM、OAM、Palette 结构 |
| 练习 | 地址映射分析、像素渲染追踪、寄存器位域解析 |
| 代码走读 | 逐段解读 app.js 中的内存视图/输入/Flash 实现(渲染见渲染主题) |
核心概念
GBA(Game Boy Advance)的内存地址空间通过 WASM 线性内存进行模拟。游戏代码直接读写这些固定地址,以下关键硬件区域都位于 WASM 的 256MB 线性内存中:
| 地址范围 | 硬件区域 | 大小 | 说明 |
|---|---|---|---|
0x04000000 | I/O 寄存器 | ~1KB | 显示控制、定时器、DMA、按键输入 |
0x05000000 | Palette RAM | 1KB | 256 色调色板(BG + OBJ 各 256 色) |
0x06000000 | VRAM | 96KB | 背景和精灵图块数据 |
0x07000000 | OAM | 1KB | 128 个精灵属性数据 |
0x0E000000 | Flash | 128KB | 游戏存档存储 |
游戏代码使用与原版 GBA 相同的地址进行读写操作。普通读写(I/O 寄存器、VRAM、OAM、调色板)直接落在 WASM 线性内存里,渲染器(wasm_display.c)每帧再从这片内存读取数据合成画面;Flash 存档写入则由 app.js 的命令状态机拦截处理(见 存档系统)。
前置知识
| 知识点 | 说明 |
|---|---|
| 十六进制地址 | 能够理解 0x04000000 这样的内存地址表示 |
| 位运算 | 了解与、或、移位等位操作(寄存器操作的基础) |
| WebAssembly 线性内存 | 了解 WASM 模块的内存模型 |
| WASM 编译管线 | 了解游戏代码如何编译为 WASM |
学习路径
下一步:资源转换管线 — 了解 GBA 图形资源如何转换为 WASM 可用的数据格式。