(PS)かまいたちの夜•特別篇 汉化笔记 三

3.           字库分析

字库首先要知道是自带字库还是bios字库,这个一看就知道不是bios字库了。

 

Agemodebugger载入游戏,以前一载入就死掉,最后发现是一定要载入bios。吓死,还以为要改代码了。

载入后进入说明页面,随便找个人的说明,pause后,dump,打开ram找文本,这些文本是在程序中的,圈一块文本,下内存访问断点。

然后离开这个页面,此时断下,在ram中看看断在登场人物绍介字上,点中asm log,打开ida参照。一直点resume,直到访问下一个字为止。

再次dump,看看vram,如下:

 

 

其实vram我也看不出多大的门道,这里也就参考参考,登这个字已经写入vram了,只是还没有写入显示区域。

这个字的位置看上面标题栏,(375,11),这是大概的位置,可供参考。

 

接下来就是看代码了。代码这边基本上没有碰到什么问题,算是幸运。

 

大概情况是首先读取一个SJIS code,比如936F,先看是不是8140,是8140的话单独处理,估计也就是跳过这块空间。

然后要处理一下,代码如下:

        v1 = code + 0x7ec0; // 7ec0 + 8140 = 10000

        a0 = v1 - ((v1 & 0xff00) >> 2); // 相当于减掉40个低位编码空间,SJIS编码从40开始

        v0 = (a0 & 0xffff) * 5;

        v0 = 0x8006b754 + ((v0 & 0x0fff) << 2);

 

可见0x8006b754是一张表的起点,每个表项4byte

从最后一步处理可以看到,总共只有0 – fff共计1000个编码,那么表的大小应该是0x1000 * 4 = 0x4000

 

内存中的8006b754,对应程序Slps_017.94中的0005BF54

 

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

 

0005BF50   CC 92 07 80 40 81 4E 00  FF FF 00 00 FF FF 00 00   Ì’.€@N.ÿÿ..ÿÿ..

0005BF60   FF FF 00 00 FF FF 00 00  41 81 04 00 4E 92 2E 01   ÿÿ..ÿÿ..A..N’..

0005BF70   DB 8D FB 02 81 96 55 06  FF FF 00 00 42 81 01 00   ۍû.–U.ÿÿ..B..

0005BF80   82 96 AD 02 DC 8D 9B 05  A9 89 00 07 FF FF 00 00   ‚–­.܍›.©‰..ÿÿ..

0005BF90   83 96 6C 05 50 92 28 02  DD 8D 04 03 FF FF 00 00   ƒ–l.P’(.ݍ..ÿÿ..

0005BFA0   FF FF 00 00 84 96 0A 03  FF FF 00 00 DE 8D 05 06   ÿÿ..„–..ÿÿ..ލ..

 

前两个bytes就是编码,后两个bytes是字模的入口,FFFF0000,表示没有被占用。

顺序的编码应该隔5组数据排列,81 4081 41,81 42都是如此,但是81 43之后就没有了,可见没有这个编码。

81438144是“,”和“.”。看来是没有用到。

 

程序中如果计算code后发现并不相等(显然会出现一对多的情况),就一直向后寻找0x1000个(- -b),直到相等为止。

如果最终都没有相等,那么就设成8140

 

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

 

0005FF10   A3 89 45 02 FF FF 00 00  FF FF 00 00 4A 92 64 04   £‰E.ÿÿ..ÿÿ..J’d.

0005FF20   D7 8D 82 03 FF FF 00 00  FF FF 00 00 7E 96 1B 05   ׍‚.ÿÿ..ÿÿ..~–..

0005FF30   FF FF 00 00 D8 8D 41 05  FF FF 00 00 FF FF 00 00   ÿÿ..؍A.ÿÿ..ÿÿ..

0005FF40   FF FF 00 00 FF FF 00 00  D9 8D 01 04 FF FF 00 00   ÿÿ..ÿÿ..ٍ..ÿÿ..

0005FF50   FF FF 00 00 02 00 FF FF  02 00 00 00 03 00 01 00   ÿÿ....ÿÿ........

 

数据看起来是到5FF54结束的。正好4000个。

 

下面将SJIS code之后的2bytes左移1位,也就是乘2,到[80079490] + 这个偏移处读取2byte

再将这2bytes左移2位,也就是乘4,还是到[80079490] + 这个偏移处,这就是字模的入口。

[80079490] = 800d39bc

 

这个地址装载了bin.pac的第一段数据,我称之为bin_0000.bin

该数据的结构也很简单,头部是入口,2byte一项,入口乘4就到字模。入口和字模是紧挨的。

第一个入口是03 F5(注意这个数据是大尾的),所以总共3F5 * 4 / 2 = 7EA(约2000项)

字模格式如下:

第一个字节是宽度,第二个字节是高度。宽度不定,高度总为0x1319),宽度最大到(0x39

之后的数据是4bits一组,字节内是小尾,字节间是大尾的。也就是 AB CD EF GH,就按照这个顺序读取。

如果不是F,直接输出,如果是F,那么后面读2个,分别是输出O,和长度LL要加4。显然够4个才能赚半个字节。

 

显示的时候会从gp[1A0]读取一个4bits值,放到高位和输出组合成一个byte,为啥还不清楚。

gp[1A0]和控制符cx有关,应该是控制颜色。

 

导出全部字模的程序是FuckFont,可以看到有部分特殊符号,编码和图像如下:

 

要看具体的代码可以打开idb文件,到functions中搜索display_char

一般来说,参数总是放在a0a1…之中,返回值放在v0之中。我习惯把参数当成注释写在函数那里。

 

关于IDA的操作我这里不会多说什么了,以后可能会在其他地方提一些相关要点。这里默认本文读者熟悉IDA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值