Appearance
GBA 硬件模拟 — 概念
GBA 内存映射总览
I/O 寄存器
I/O 寄存器从地址 0x04000000 开始,控制 GBA 的所有硬件功能。以下是 WASM 版本中最关键的寄存器。
显示控制寄存器
| 寄存器 | 地址 | 说明 |
|---|---|---|
| DISPCNT | 0x04000000 | 显示控制 — 模式、背景使能、精灵使能 |
| DISPSTAT | 0x04000004 | 显示状态 — V-Blank 标志、H-Blank 标志 |
| VCOUNT | 0x04000006 | 当前扫描行号 |
DISPCNT 位域结构:
- 显示模式:Mode 0(文本背景)、Mode 3(位图)、Mode 4(位图双缓冲)等
- BG 使能:控制 4 个背景层中哪些可见
- OBJ 使能:控制 Sprite 精灵层是否可见
背景控制寄存器
| 寄存器 | 地址 | 说明 |
|---|---|---|
| BG0CNT | 0x04000008 | 背景 0 控制 |
| BG1CNT | 0x0400000A | 背景 1 控制 |
| BG2CNT | 0x0400000C | 背景 2 控制 |
| BG3CNT | 0x0400000E | 背景 3 控制 |
每个 BGxCNT 寄存器包含:
- 优先级(Bit 0-1):0 最高,3 最低
- 字符基地址(Bit 2-3):Tile 数据在 VRAM 中的起始位置
- 颜色模式(Bit 7):0 = 16 色,1 = 256 色
- 屏幕基地址(Bit 8-12):图块映射表在 VRAM 中的位置
- 尺寸(Bit 14-15):背景大小(256x256 到 512x512)
定时器寄存器
| 寄存器 | 地址 | 说明 |
|---|---|---|
| TM0CNT_L | 0x04000100 | 定时器 0 计数值 |
| TM0CNT_H | 0x04000102 | 定时器 0 控制 |
| TM1CNT_L | 0x04000104 | 定时器 1 计数值 |
| TM2CNT_L | 0x04000108 | 定时器 2 计数值 |
| TM3CNT_L | 0x0400010C | 定时器 3 计数值 |
定时器控制位域(TMxCNT_H):
- Bits 0-1:预分频器(0=1周期, 1=64周期, 2=256周期, 3=1024周期)
- Bit 2:计数溢出中断使能
- Bit 7:定时器使能
DMA 通道
| 寄存器 | 地址 | 说明 |
|---|---|---|
| DMA0SAD | 0x040000B0 | DMA 0 源地址 |
| DMA0DAD | 0x040000B4 | DMA 0 目标地址 |
| DMA0CNT | 0x040000B8 | DMA 0 控制 |
DMA 用于高速内存拷贝,在 WASM 版本中由 JavaScript 模拟实现。游戏代码通过设置 DMA 寄存器触发大块数据传输(如加载 Tile 数据到 VRAM)。
按键输入寄存器
| 寄存器 | 地址 | 说明 |
|---|---|---|
| KEYINPUT | 0x04000130 | 按键状态(低电平有效) |
| KEYCNT | 0x04000132 | 按键中断控制 |
在 WASM 版本中,JavaScript 将键盘/触摸输入转换为 GBA 按键状态写入此地址。
Palette RAM 结构
地址 0x05000000 处的调色板存储区分为两个 256 色调色板组。
调色板格式:每个颜色为 15 位(BGR555):
Bit 0-4: 红色 (R), 0-31
Bit 5-9: 绿色 (G), 0-31
Bit 10-14: 蓝色 (B), 0-31
Bit 15: 未使用- BG 调色板:背景图块使用的颜色。索引 0 为透明色
- OBJ 调色板:精灵图块使用的颜色。索引 0 同样为透明色
VRAM 布局
VRAM 从地址 0x06000000 开始,总计 96KB,用于存储图块数据和图块映射表。
VRAM 使用方式:
- 图块数据区:存储 8x8 像素的 Tile 图块图案
- 4bpp 模式:每图块 32 字节(16 色,每像素 4 位)
- 8bpp 模式:每图块 64 字节(256 色,每像素 8 位)
- 图块映射表:存储背景的图块排列索引
- 每条目 2 字节:图块编号 + 水平翻转 + 垂直翻转 + 调色板号
OAM 结构
OAM 从地址 0x07000000 开始,存储 128 个精灵的属性数据。
每个 Sprite 的 3 个属性:
| 属性 | 位域 | 说明 |
|---|---|---|
| ATTR0 | Y 坐标 + 形状 | Bit 0-7: Y 坐标, Bit 14-15: 形状 (正方/横长/竖长) |
| ATTR1 | X 坐标 + 尺寸 | Bit 0-8: X 坐标, Bit 14-15: 尺寸 (8/16/32/64) |
| ATTR2 | 图块 + 调色板 | Bit 0-9: 图块编号, Bit 12-15: 调色板号 |
精灵优先级与绘制顺序:
- OAM 中编号越小的精灵优先级越高(绘制在上层)
- 同一优先级的精灵按 OAM 编号排序
Flash 存储模拟
地址 0x0E000000 处模拟了 GBA 的 Flash 存储芯片,用于游戏存档。