内容提要
本文介绍世嘉土星VDP2图形芯片的2D背景渲染机制,重点解析NBG0层。内容涵盖单元格式的五级层级(单元、字符、页、平面、地图)、寄存器配置(如CHCTLA、PNCN)及数据寻址流程。通过分析寄存器值,推导出从PNT条目提取调色板和字符号,再定位VRAM像素数据,结合CRAM调色板解码RGB,最终还原640×224背景图像的方法。
延伸解读
理解五级层级是解析关键
本文详细拆解了VDP2单元格式的五级层级:单元、字符、页、平面、地图。理解这一层级关系是解析背景图像的基础。例如,NBG0的字符由2×2个8×8单元组成,因此每个字符为16×16像素,这直接决定了屏幕划分和PNT寻址的计算方式。掌握这种从底层单元到顶层地图的构建逻辑,有助于逆向分析其他图层或游戏。
寄存器配置决定渲染路径
VDP2的渲染行为由一系列寄存器控制,如CHCTLA定义字符尺寸和色彩模式,PNCN定义PNT条目格式,PLSZ和MPOFN等则决定平面布局和地图基址。本文通过解析CHCTLA=0x1111等寄存器值,推导出NBG0使用16×16像素字符和256色模式。这表明,寄存器快照是逆向工程的关键入口,不同配置会显著影响数据解析方式。
PNT条目是图块实例化指令
PNT中的每个条目相当于一个“图块实例化指令”,包含字符号、调色板bank、翻转位和优先级等属性。本文展示了如何从16位条目中提取调色板bank(高3位)和字符号(低12位),进而定位VRAM中的像素数据。理解PNT条目的位域结构,是正确解码背景地图的核心步骤。
调色板与像素索引的映射关系
在256色模式下,每个像素字节是CRAM调色板的索引,但实际颜色由调色板bank和索引共同决定。本文通过公式abs_color_idx = pal_bank * 256 + color_idx,将像素索引映射到CRAM中的具体颜色。同时,土星RGB555格式需要转换为8位RGB,转换时需注意位扩展方法,否则颜色会失真。
Q&A
世嘉土星VDP2的单元格式(Cell format)中,数据层级从下到上是如何组织的?
单元格式的数据层级从下到上依次为:单元(Cell,8×8像素)、字符图案(Character,由1×1或2×2个Cell组成)、页(Page,由字符图案按32×32或64×64排列)、平面(Plane,由页按1×1、2×1或2×2排列)、地图(Map,最终寻址的卷轴全景图)。
在解析NBG0背景时,如何从PNT条目中提取调色板号和字符号?
PNT条目为16位数据,其中高3位(bit 12-14)表示调色板bank(pal_bank),低12位(bit 0-11)表示字符号(char_num)。提取方法:pal_bank = (map_val >> 12) & 0x7,char_num = map_val & 0x0FFF。
在8bpp(256色)模式下,如何根据字符号计算字符图案在VRAM中的基地址?
在8bpp模式下,一个16×16像素的Character占用256字节(0x100)。基地址计算公式为:base_addr = char_num * 0x80(等价于(char_num << 2) * 0x20)。该图案由4个8×8的Cell组成,偏移分别为:左上0x000,右上0x040,左下0x080,右下0x0C0。
世嘉土星VDP2的CRAM中,RGB555颜色如何转换为8位RGB值?
CRAM中每个颜色值为16位,按RGB555格式存储:低5位为红色,中间5位为绿色,高5位为蓝色。转换时,将5位值扩展为8位:r = (r_5bit << 3) | (r_5bit >> 2),g和b同理。
在解析NBG0背景时,如何计算屏幕上任意位置对应的PNT地址?
对于屏幕坐标(tx, ty),先计算所在Page编号:page_x = tx // 32,page_y = ty // 32,page_index = page_y * 2 + page_x(因为Plane为2×2 Page)。然后计算Page内局部坐标:local_x = tx % 32,local_y = ty % 32。最后PNT地址 = map_base + page_index * 0x800 + (local_y * 32 + local_x) * 2。
世嘉土星VDP2的NBG0层在解析时,为什么最终能还原出640×224的背景图像?
因为屏幕分辨率为640×224,每个Character为16×16像素,所以画面包含40列×14行个Character。每个Character对应一个PNT条目,通过解析PNT条目得到字符号和调色板号,再读取VRAM中的像素点阵和CRAM中的调色板,最终填充像素即可还原出640×224的图像。