Full picture
5

瓦片地图内存

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 瓦片的参考。

文本模式
文本模式下屏幕的左上部分

在 Zeal 8-bit Playground 上试试这个示例!

瓦片地图可以使用 SCROLL_XSCROLL_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 轴的独立滚动,具有像素级粒度。这允许精细控制屏幕显示瓦片地图的哪一部分。

有关详细信息和寄存器用法,请参阅视频配置中的屏幕滚动章节。

在 Zeal 8-bit Playground 上试试 8 位瓦片模式示例!

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 个调色板基址偏移量之一

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 可以自由访问它们。

EN | 中文Beta