Full picture
7

Sprites 内存

7.1 概述

Zeal Video Board 支持在瓦片图形模式下同时渲染多达 128 个 sprites。 与固定在屏幕瓦片网格上的瓦片不同,sprites 可以自由定位:它们可以以像素级粒度放置,并在屏幕上独立移动。Sprites 通常用于表示动态游戏元素,例如角色、弹射物或交互式 UI 元素。

所有 sprites 都使用与瓦片地图相同的全局图块集。没有单独或专用的 sprite 图块集;sprite 图形资源来自瓦片地图层使用的同一瓦片内存区域。

7.2 Sprite 分层

  • 在 8 位瓦片模式 (8bpp) 下:sprites 始终在背景层(_layer0_)之上渲染。但是,它们相对于前景层(_layer1_)的位置可以使用 BEHIND_FG 标志进行配置。如果设置此位,sprite 将出现在前景层之后,否则将出现在其之前。
  • 在 4 位瓦片模式 (4bpp) 下:由于仅使用单个瓦片地图层(_layer0_)进行背景渲染,因此 sprites 始终在其之上渲染。在此模式下,BEHIND_FG 位被忽略。此外,与瓦片地图条目一样,通过设置扩展的 TILE_BIT9 标志,sprites 可以访问图块集中的所有 512 个瓦片索引

无论何种模式,硬件都会按顺序从 sprite 0 到 sprite 127 渲染 sprites。这意味着 sprite 1 绘制在 sprite 0 之上,但在 sprite 2 之下。为了实现正确的视觉叠放 — 例如创建 3D 透视效果或深度感 — 建议将 sprite 0 分配给背景对象,然后使用 sprite 1、2、3 等来处理逐渐靠近观察者的对象。

7.3 组织方式

Sprite RAM 总共 1024 字节,最多支持 128 个 sprites,每个 sprite 由 8 个字节定义。每个 sprite 条目的组织方式如下:

  • 字节 0-1(16 位,小端序)— sprite 的 Y 位置。Y 坐标偏移 -16 像素。这意味着值为 16 时将 sprite 放置在屏幕顶部。值为 8 时 sprite 部分移出屏幕(半隐藏),值为 0 时使其完全不可见。
  • 字节 2-3(16 位,小端序)— sprite 的 X 位置 与 Y 坐标类似,它也偏移 -16 像素。写入 0 会导致 sprite 在水平方向上完全移出屏幕。
  • 字节 4 — FLAGS 寄存器,编码各种 sprite 属性,请参阅 FLAGS 部分了解所有详细信息。
  • 字节 5 — TILE 索引 指定瓦片索引的低 8 位。在 4 位模式下,必须通过 FLAGS 字节中的 TILE_BIT9 标志设置第 9 位。
  • 字节 6 — OPTIONS 用于配置 sprite 的高度。如果设置了 HEIGHT_32PX 位,则 sprite 变为 32 像素高。在这种情况下,TILE 寄存器引用的瓦片和下一个瓦片TILE + 1)将一起用于渲染完整的 sprite。
  • 字节 7 — 未使用 / 写入锁存刷新 尽管此字节未使用,但必须写入以应用对 OPTIONS 寄存器所做的更改。请参阅下面关于锁存行为的说明。

Sprite RAM 访问与锁存

在内部,sprite RAM 组织为 512 个 16 位条目。因此,所有内存访问在字级别都是锁存的。主机 CPU 必须始终先写入低字节(LSB),然后写入高字节(MSB)。

在没有先写入低字节(LSB)的情况下写入高字节(MSB)会导致未定义行为。写入可能被忽略或导致锁存错误的数据。

但是,在读取时,可以按任意顺序访问字节。这允许更新单个字节(例如 TILE 索引),而无需缓存或重写同一字中的另一个字节。

示例:更新 TILE 索引(Z80 主机)

例如,在基于 Z80 的主机上,更新 sprite 的 TILE 索引可以按如下方式完成:

    ; 假设 VRAM 的前 16KB 映射到 0x8000
    ; Sprite 3 起始于:0x8000 + 0x2800 + 3 * 8 = 0xA818
    ; TILE 偏移量 = 0x4

    ld hl, 0xA818 + 0x4     ; HL 指向 sprite 3 的 TILE 寄存器
    ld (hl), 12             ; 设置 TILE 使用瓦片索引 12

    ; 通过写入 16 位字的高字节来刷新更新
    inc hl
    ld a, (hl)
    ld (hl), a              ; 写回相同的值以触发锁存

⚠️ Sprites 仅在瓦片图形模式下激活。它们在文本模式或位图模式下不被渲染,也不受屏幕滚动的影响。

示例:创建并动画化一个 sprite

在 Zeal 8-bit Playground 上试试动画 sprite 示例!

7.4 寄存器总览

Name Description Base-relative address Access
POS_Y_LOW 精灵的Y位置最低字节 0x00 R/W
POS_Y_HIGH 精灵的Y位置最高字节 0x01 R/W
POS_X_LOW 精灵的X位置最低字节 0x02 R/W
POS_X_HIGH 精灵的X位置最高字节 0x03 R/W
TILE 要使用的瓦片低8位索引 0x04 R/W
FLAGS 精灵的标志位 0x05 R/W
OPTIONS_LOW 精灵的选项最低字节 0x06 R/W
OPTIONS_HIGH 精灵的选项高字节,必须在LSB之后写入! 0x07 WO

7.5 寄存器

POS_Y_LOW (0x00)
精灵的Y位置最低字节
POS_Y_LOW
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
POS_Y_LOW
精灵Y位置减16的最低字节。 (R/W)
POS_Y_HIGH (0x01)
精灵的Y位置最高字节
(reserved)
POS_Y_HIGH
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
POS_Y_HIGH
精灵Y位置减16的最高字节。最大值为495。 (R/W)
POS_X_LOW (0x02)
精灵的X位置最低字节
POS_X_LOW
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
POS_X_LOW
精灵X位置减16的最低字节。 (R/W)
POS_X_HIGH (0x03)
精灵的X位置最高字节
(reserved)
POS_X_HIGH
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
POS_X_HIGH
精灵X位置减16的最高字节。最大值为655。 (R/W)
TILE (0x04)
要使用的瓦片低8位索引
TILE_IDX
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
TILE_IDX
从图块集中使用的瓦片索引。 (R/W)
FLAGS (0x05)
精灵的标志位
PALETTE
FLIP_X
FLIP_Y
BEHIND_FG
TILE_BIT9
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
PALETTE
4位模式下使用的调色板索引。表示显示精灵所用的颜色的高4位。 (R/W)
FLIP_X
在X轴上翻转精灵。 (R/W)
FLIP_Y
在Y轴上翻转精灵。 (R/W)
BEHIND_FG
置位时,在前景后面渲染精灵,4位模式下忽略。 (R/W)
TILE_BIT9
瓦片索引的第9位,8位模式下忽略。 (R/W)
OPTIONS_LOW (0x06)
精灵的选项最低字节
(reserved)
HEIGHT_32PX
(reserved)
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
HEIGHT_32PX
将精灵高度设为32像素,将使用两个连续的瓦片进行渲染。 (R/W)
OPTIONS_HIGH (0x07)
精灵的选项高字节,必须在LSB之后写入!
FLUSH
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
FLUSH
空区域,必须在写入`OPTIONS_LOW`后写入以刷新值。 (WO)
EN | 中文Beta