瓦片地图内存
5.1 概述
Zeal Video Board 上的主要渲染区域是瓦片地图。它由两个连续的 RAM 块组成,每个块大小为 3,200 字节:_layer0_ 和 _layer1_。
- _layer0_ 从视频内存中的偏移量
0x0000开始 - _layer1_ 从偏移量
0x1000开始
由于这些偏移量,切换单个位就足以在任一层中的同一瓦片位置之间进行切换。
这些层将屏幕划分为一个 80x40 的瓦片网格。每个瓦片由一个字节表示,因此每层正好占用 80 x 40 = 3200 字节。
每个字节指向字体内存或图块集内存中的一个瓦片。
位置 (x, y) 处的瓦片偏移量计算如下:
offset = y * 80 + x
该公式无论当前屏幕模式如何都保持不变。例如,在 320x240 分辨率下,第二行的第一个字符仍然位于偏移量 80 处。
瓦片的大小取决于模式:
- 文本模式:瓦片为
8x12像素 - 图形模式:瓦片为
16x16像素
_layer0_ 始终是主绘制区域(背景)。 _layer1_ 可以根据当前模式充当前景层(位于 _layer0_ 之上)或属性层(为 _layer0_ 瓦片添加额外信息)。
⚠️ 在固件 v0.1.0 中,两个存储器均为只读。 建议升级到固件 v1.0.0 或更高版本以获得完全读写访问权限。
5.2 瓦片渲染基础
假设我们处于图形模式(瓦片为 16x16)。640x480 的屏幕被划分为 40x30 的瓦片网格。瓦片地图中的每个条目都包含一个 8 位值。
要获取第 i 行、第 j 列处的瓦片:
layer0[i * 80 + j]→ 背景瓦片layer1[i * 80 + j]→ 前景瓦片
5.3 文本模式
在 640x480 和 320x240 文本模式中,各层的作用方式相同:_layer0_ 用于存储要在屏幕上显示的字符(瓦片),这些字符来自字体内存;而 _layer1_ 则描述每个字符使用的背景色和前景色。
_layer1_ 中的每个条目都是一个字节的值:
layer1 中的每个条目为 1 字节:
- 高半字节(位 7-4):背景色
- 低半字节(位 3-0):前景色
这些是来自调色板内存中前 16 个条目的索引。
示例
layer0[0] = 'H'; layer0[1] = 'e'; layer0[2] = 'l'; layer0[3] = 'l'; layer0[4] = 'o'; layer1[0] = 0xf1; // 0xf 为背景色,0x1 为前景色 layer1[1] = 0xf2; // 0xf 为背景色,0x2 为前景色 layer1[2] = 0xf3; // 0xf 为背景色,0x3 为前景色 layer1[3] = 0xf4; // 0xf 为背景色,0x4 为前景色 layer1[4] = 0xf5; // 0xf 为背景色,0x5 为前景色
屏幕的左上角将如下所示。红色网格仅作为显示 8x12 瓦片的参考。
瓦片地图可以使用 SCROLL_X 和 SCROLL_Y 寄存器进行水平和垂直滚动(以字符为粒度):
- 在 640x480 模式下:滚动环绕屏幕
- 在 320x240 模式下:滚动可以显示隐藏的字符
5.4 8 位瓦片模式
在此模式下,_layer0_ 和 _layer1_ 都用于在屏幕上渲染瓦片:
- _layer0_ 为背景
- _layer1_ 为前景
与 sprites 类似,_layer1_ 支持透明,瓦片中值为 0 的任何条目都将被视为透明,并转而显示来自 _layer0_ 的底层像素。有关透明的更多信息,请查看8 位瓦片模式下的图块集内存
瓦片地图表示 80*16 x 40*16 = 1280 x 640 像素的区域,这超出了屏幕的可见分辨率。在 640x480 模式下,视口一次显示 40x30 个瓦片。在 320x240 模式下,只有 20x15 个瓦片可见,实际上提供了同一瓦片地图的放大视图。
| 模式 | 可见瓦片数 |
|---|---|
| 640x480 | 40x30 |
| 320x240 | 20x15(放大视图) |
滚动可用于调整瓦片地图的可见部分,从而有效地在更大的虚拟区域上移动视口。每层支持沿 X 和 Y 轴的独立滚动,具有像素级粒度。这允许精细控制屏幕显示瓦片地图的哪一部分。
有关详细信息和寄存器用法,请参阅视频配置中的屏幕滚动章节。
5.5 4 位瓦片模式
在此模式下,_layer0_ 保留其作为背景瓦片层的角色。图块集现在支持最多 512 个唯一瓦片,但由于瓦片地图条目仍然是 8 位值,因此只能直接寻址 256 个瓦片。
为了克服此限制,_layer1_ 被重新用作属性层,而不是第二个瓦片层。它存储与 _layer0_ 中每个瓦片关联的附加元数据。
瓦片数据编码
对于索引为 n 的每个瓦片,瓦片信息由以下部分组成:
layer0[n]:瓦片索引的低 8 位(0–255)layer1[n]:8 位属性字段- 位 0 – 瓦片索引 MSB:添加第 8 位(值
0x100)0:瓦片索引 =layer0[n]1:瓦片索引 =0x100 | layer0[n]
- 位 1 – 保留(未使用)
- 位 2 – Y 轴翻转:设置后垂直翻转瓦片
- 位 3 – X 轴翻转:设置后水平翻转瓦片
- 位 7–4 – 调色板组(4 位索引):选择 16 个调色板基址偏移量之一
- 位 0 – 瓦片索引 MSB:添加第 8 位(值
X 轴和 Y 轴翻转功能在渲染瓦片地图时_仅在此模式下可用_。
调色板行为
在此模式下,瓦片使用每像素 4 位 (4bpp)。每个像素的颜色计算如下:
color = (layer1[n] & 0xF0) | pixel_value
其中:
layer1[n]的高半字节选择基础调色板(例如0x50)- 像素值来自瓦片图形数据(图块集),采用 4 位格式
示例
假设瓦片 n 包含以下 4 个字节(8 个像素):
0x12, 0x23, 0x34, 0x45
如果 layer1[n] 的高 4 位设置为 0x5(调色板索引),则每个像素的最终渲染颜色将为:
0x51 0x52 0x52 0x53 0x53 0x54 0x54 0x55
⚠️ 在此模式下,_layer1_ _不支持_滚动,因为属性值与 _layer0_ 中对应的瓦片紧密耦合。 应用于 _layer1_ 的任何与滚动相关的寄存器都将被忽略。
5.6 位图模式
在两种位图模式下,_layer0_ 和 _layer1_ 均不使用,主机 CPU 可以自由访问它们。