大富翁 3 游戏文件分析(九)

有了前面的调试器的初步使用,我们可以继续看一下最简单的 ACA.PVS 是个什么样子

目录

本系列已完结,以下为整理目录方便查阅

前言

我们备份原来的 SS16.PVS,然后复制一份 ACA.PVS,并重命名为 SS16.PVS,接下来打开 调试器,使用 debug ss 来启动 SS.EXE,接下来设定 bpint 21 3f,在读取文件时 中断,根据上一篇文的实验我们可以知道,第二次进入断点的时候就是读取 SS16.PVS 的 时机

DS:DX

int 21 3f 会把文件内容放在 ds:dx 开始的内存中,这时我们按 F10 执行 int 21, 进入下一步,这时可以使用 d ds:dx 来查看加载后的内容:

对应一下 ACA.PVS 的内容:

完全相同,我们按 F5 执行程序,再次进入断点暂停后,F10 进入下一步,这时 ds:dx 发生了变化:

同样我们也可以在 ACA.PVS 中找到:

所以基本上我们可以推测,ds:dx 这段内存可以基本确定是一段 buffer,文件内容先被 搬运到这里,然后被搬运到某处。

我们使用 bpma 断点放在 ds:dx,还会有一些有意思的发现,注意 bpma 断点需要用青衫 版 debugger,我们会进入 bpma 断点 8 次:

索引 开头字节 文件位置
0 30 00 00 80 00 00 00 1C 06 01 2B 16 10 3C 26 21 0000
1 05 0D AA AB 2E 2E 6E EA A3 6E EE E8 EE EE CE 55 0038
2 03 C0 28 04 80 40 C0 00 07 00 02 04 0A 15 1F 00 44e0
3 03 C0 28 0F 04 04 02 4B 09 01 04 D0 20 F0 00 07 4ab4
4 03 C0 28 04 80 40 C0 00 07 00 02 04 0A 15 1F 00 4fa0
5 03 C0 28 0F 04 04 02 4B 09 01 04 D0 20 F0 00 07 5574
6 03 C0 28 04 80 40 C0 00 07 00 02 04 0A 15 1F 00 5a60
7 03 C0 28 0F 04 04 02 4B 09 01 04 D0 20 F0 00 07 6034

同时我们可以观察到 dosbox 主画面的图像变化

只有两个画面,这个也可以对应到文件分段,因为文件 2、4、6 相同,3、5、7 相同。

A000:0000

在查了一些资料后,我们可以知道,显示存储的内容是从 A000:0000 开始的,在显示法 官画面的时候,我检查了下这段内存,真的有数据,这段内存从 A000:0000 开始到 A000:7CFF,长度 0x7d00 = 3200032000 / 400(屏幕高度) = 80,这时候可以发 觉,7d00 正好是一个 plane 的大小,关于 plane,可以看之前的文章。

既然这是一个 plane,那其他 plane 在哪里呢,很遗憾没有找到,不过,我们可以用黑白 色画一下这个 plane,看看是什么,比如我们把 1 当做白色,0 当做黑色:

所以 a000:0000 保存的是图像信息,但是我们还不知道图像信息是如何映射到四个平面 上的

总结

现在我们知道,pvs 文件大致可以分为三段,一段头,一段图像的基础信息,接下来是每帧 动画的变化量,文件内容先读入缓冲区 ds:dx,然后输出到 a000:0000,但是由于 a000:0000 这段内存长度只有一个 plane 的大小,所以这段内容是如何映射到四个平面 上,我们还不得而知。