Full picture
6

图块集内存

6.1 概述

图块集内存是视频 RAM 中最大的连续部分,横跨 64KB,位于 Zeal Video Board 映射的总共 128KB 内存的后半部分。

它存储用于图形模式的 16x16 瓦片或像素,在文本模式中未使用,但仍可读写。因此,可以在文本模式中预先准备好在图形模式下显示的图块集。这在切换模式前准备图块集非常方便。

该内存可以随时写入,即使视频控制器不在 H-blank 或 V-blank 周期内。

在固件 v0.1.0 中,该内存是只读的。建议将固件更新到 1.0.0 或更高版本,以获得对此部分 VRAM 的完全读写访问权限。

6.2 8 位瓦片模式

在 8 位瓦片模式下,每个 16x16px 的瓦片大小为 256 字节,每个字节代表一个像素。这样总共最多有 64 KB / 256 = 256 个瓦片。这些瓦片同时被两个瓦片地图(_layer0_ 和 _layer1_)以及 sprites 使用。

像素值的范围从 0 到 255,作为调色板内存的索引。这意味着可以通过修改瓦片引用的调色板条目来改变其外观,而无需更改瓦片数据本身。但请注意,这将影响所有使用相同颜色索引的瓦片。在此模式下,所有瓦片共享相同的 256 色调色板内存

颜色索引 0 在由瓦片地图 _layer1_ 渲染时被特殊处理:它被视为透明,允许来自 layer0 的像素显示出来。同样的规则适用于 sprites,颜色索引为 0 的像素将是透明的。如果给定位置上的 sprite 和 _layer1_ 像素都是透明的,则显示来自 layer0 的对应像素。

瓦片在内存中线性存储:第一个瓦片(瓦片 0),16x16 像素,占用前 256 个字节;第二个瓦片(瓦片 1)存储在接下来的 256 个字节中,依此类推。

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

6.3 4 位瓦片模式

在 4 位瓦片模式下,每个 16x16px 的瓦片现在大小为 128 字节,每个半字节(4 位)代表一个像素,因此一个字节代表两个相邻像素。这样总共最多有 64 KB / 128 = 512 个瓦片。这些瓦片同时被瓦片地图 layer0 和 sprites 使用。请注意,此内存的粒度仍然是 8 位,这意味着主机 CPU 可以写入的最小值是 8 位,因此一次写入将影响两个像素。

像素值的范围从 0 到 15,作为调色板内存索引的最低 4 位。调色板索引的高 4 位对于瓦片存储在瓦片地图 layer1 中,对于 sprites 存储在 sprites 属性中。这两个值共同构成调色板内存中的一个 8 位索引。这意味着单个瓦片可以在屏幕上以不同颜色显示,因为它可以使用两种不同的调色板。

换句话说,在此模式下,调色板可以看作是 16 个独立的调色板,每个有 16 种颜色,每个 sprite 和瓦片可以选择这 16 个调色板中的任意一个。

在 4 位瓦片模式下,颜色索引 0 仍然被视为透明,但此规则现在仅适用于 sprites,因为在此模式下 _layer1_ 不使用瓦片,请查看瓦片地图内存以获取更多详细信息。因此,颜色索引为 0 的 sprite 像素是透明的,允许底层的 layer0 像素被渲染。

瓦片仍然线性组织:第一个瓦片(瓦片 0),16x16 像素,占用前 128 个字节;第二个瓦片(瓦片 1)存储在接下来的 128 个字节中,依此类推。

6.4 位图模式

在两种位图模式下,图块集内存被重新用作线性帧缓冲区,其中每个字节代表一个像素。像素在内存中逐行组织,不涉及瓦片化。像素值是 8 位颜色索引,引用调色板内存中的条目,与 8 位瓦片模式相同。

根据分辨率的不同,内存使用情况如下:

  • 320×200 = 64,000 字节
  • 256×240 = 61,440 字节

这意味着第一个扫描行占用前 320 或 256 个字节,第二行紧随其后,依此类推。即使在 320x200 模式下,也留有少量未使用空间,如果需要,可以用于其他目的。

调色板行为与瓦片模式相同:由于每个像素只是对调色板条目的引用,因此可以通过修改调色板条目来改变渲染图像的外观,例如应用颜色偏移或光照效果,而无需触碰帧缓冲区本身。

由于这些位图分辨率不匹配 4:3 屏幕比例,因此会添加边框以使图像居中:

  • 320x200 在顶部和底部显示边框
  • 256x240 在左侧和右侧显示边框

您可以通过写入图块集内存最后一个字节(偏移量 0xffff)来更改这些边框的颜色。该值在边框渲染期间仍用作颜色索引,因此您可以自定义边框颜色,甚至在屏幕绘制时更新它。

EN | 中文Beta