世嘉土星(Sega Saturn)的图形架构由两块分工明确的专用图形芯片构成:负责 3D 多边形与动态精灵绘制的 VDP1,以及负责多层 2D 背景、仿射变换与最终图像合成的 VDP2。本次实验使用 Data East 于 98 年出品的游戏《慟哭 そして…》进行测试,目标是提取游戏中精美的 CG 图片。
我会使用两个土星模拟器进行数据提取操作 —— Ymir 和 Yabause。这是个人偏好,你完全可以仅使用Yabause操作。
提取原始数据
首先进入游戏,来到第一处静态界面。

点击Ymir菜单Debug下的Dump all memory。

找到Ymir安装目录下的dumps文件夹,在其中找到vdp1-vram.bin、vdp2-cram.bin和vdp2-vram.bin。
点击Ymir菜单Debug下的Open memory viewer。

点击Main address space边上的三角图标。

找到VDP2 registers。

点击左侧Dump按钮。

在Ymir安装目录下的dumps文件夹内找到刚刚 dump 下来的文件,改名为vdp2-registers.bin。
至此所有原始数据抓取完毕,将它们保存到同一个目录下。
提取配置数据
运行Yabause至相同页面,点击View - Layer,逐个勾选Vdp1、NBGx等按钮进行观察。在这一步你可以确认每个图层显示的内容,比如最大的那张背景图会显示在NBG0。

接下来提取VDP1和VDP2的配置数据。依次点击Debug - VDP1 和 VDP2。

在VDP1的Debug页面,你可以看到三个Scaled Sprite,这三个精灵图组合成了游戏中文字的背景图和光标。记下每个精灵图的Command Info。

在VDP2的Debug页面,你看到的是背景图图层的配置数据,由前面观察可知,NBG0是背景大图图层,NBG3是字幕图层,记下每个图层的配置。

稍作整理
目前我们得到了:
vdp1-vram.bin(对话框背景、对话光标)vdp2-cram.bin(血腥的背景CG、文字图块)vdp2-vram.bin(调色板 Palette)vdp2-registers.bin(解码关键指令)
解码 VDP1
VDP1中有三个缩放精灵:
| |
- 左半边对话框底图:
- 数据位置:vdp1-vram.bin 的偏移量 0x10B40
- 格式:8 BPP (256色)
- 尺寸:宽 320,高 64
| |
- 右半边对话框底图:
- 数据位置:vdp1-vram.bin 的偏移量 0x15B40
- 格式:8 BPP (256色)
- 尺寸:宽 320,高 64
- 验证计算: 左半张图大小 = 320 * 64 * 1 byte (8BPP) = 20,480 字节 = 十六进制的 0x5000。而 0x10B40 + 0x5000 = 0x15B40。完美吻合!
| |
- 跳动的光标 (倒三角):
- 数据位置:vdp1-vram.bin 的偏移量 0x10000
- 格式:4 BPP (16色)
- 尺寸:宽 32,高 16
这三个缩放精灵会交由 VDP1 在硬件内部渲染为四边形。由于其中直接显示了纹理的宽和高,我们大胆猜测这三个纹理各自是一张连续的矩形位图(bitmap),像素数据按行连续存储(从左到右、从上到下)。只需写一个脚本,从vdp1-vram.bin的偏移0x10B40处,提取8 BPP的320 x 64字节数据即可还原,当然别忘了去vdp2-vram.bin查找调色板。其左右半边对话框底图,如下:

未完待续。
欢迎关注我的公众号,第一时间获取最新文章。
