有了前面的调试器的初步使用,我们可以继续看一下最简单的 ACA.PVS 是个什么样子
本系列已完结,以下为整理目录方便查阅
我们备份原来的 SS16.PVS,然后复制一份 ACA.PVS,并重命名为 SS16.PVS,接下来打开
调试器,使用 debug ss
来启动 SS.EXE,接下来设定 bpint 21 3f
,在读取文件时
中断,根据上一篇文的实验我们可以知道,第二次进入断点的时候就是读取 SS16.PVS 的
时机
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:7CFF
,长度 0x7d00 = 32000
,32000 / 400(屏幕高度) = 80
,这时候可以发
觉,7d00
正好是一个 plane 的大小,关于 plane,可以看之前的文章。
既然这是一个 plane,那其他 plane 在哪里呢,很遗憾没有找到,不过,我们可以用黑白 色画一下这个 plane,看看是什么,比如我们把 1 当做白色,0 当做黑色:
所以 a000:0000
保存的是图像信息,但是我们还不知道图像信息是如何映射到四个平面
上的
现在我们知道,pvs 文件大致可以分为三段,一段头,一段图像的基础信息,接下来是每帧
动画的变化量,文件内容先读入缓冲区 ds:dx
,然后输出到 a000:0000
,但是由于
a000:0000
这段内存长度只有一个 plane 的大小,所以这段内容是如何映射到四个平面
上,我们还不得而知。