» 您尚未 登录   注册 | 社区银行 | 社区婚姻 | 社区成就 | 帮助 | 社区 | 无图版


火花天龙剑 -> 火炎之纹章 -> 火花学园 -> 文字处理相关
 XML   RSS 2.0   WAP 

本页主题: 文字处理相关 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
无聊之士

头衔:全控全控
该用户目前不在线
级别: 火花会员
编号: 49952
精华: 5
发帖: 432
威望: 25 点
配偶: 单身
火 花 币: 4092 HHB
注册时间:2006-02-10
最后登陆:2024-06-28
艾雷布的骑士(I)
查看作者资料 发送短消息 引用回复这个帖子
文字处理相关

以下分析基于火花狼组汉化的中文版圣魔。关于文字的霍夫曼压缩解压方式。



以地图画面物品整理画面为例:

首先分析部分程序,调色板使用暂时不考虑,目前知道的是字体用调色板是0号
--------------------
R0是武器数量以及武器代码,比如00001E01 ;1E=30 ,01是铁剑

0801729C   B500 push , lr
0801729E   21FF mov r1, FFh
080172A0   4008 and r0, r1<------屏蔽数量
080172A2   00C1 lsl r1, r0, 3h《----求偏移开始
080172A4   1809 add r1, r1, r0
080172A6   0089 lsl r1, r1, 2h
080172A8   4804 ldr r0, [pc, 10h]   ([000172BC]=0885E068)《----得到基地址
080172AA   1809 add r1, r1, r0《-------得到铁剑武器所在实际地址0885E068+0024=0885E08C
080172AC   8808 ldrh r0, [r1, 0h]<----得出:名称DB 02 ,RO实际数据是000002DB
080172AE FE7BF7F2 bl 8009FA8h《-----下面解释
080172B2 FF31F7F2 bl 800A118h《-----字解释,最好先看前面的查找程序后在看
080172B6   BC02 pop r1
080172B8   4708 bx r1
080172BA   0000
080172BC   E068
080172BE   0885
------------------------------
080172AE FE7BF7F2 bl 8009FA8h《-----下面解释,还是以铁剑为例

08009FA8   B570 push r4-r6, lr
08009FAA   1C05 mov r5, r0《--------R5=R0=000002DB
08009FAC   4E07 ldr r6, [pc, 1Ch]   ([00009FCC]=0202B6A8)
08009FAE   6830 ldr r0, [r6, 0h]<-----RO=060A
08009FB0   4285 cmp r5, r0
08009FB2   D011 beq 8009FD8h<----所以这里是检测和上面的武器、道具是否一样,是一样就省略不少处理的判定
08009FB4   4906 ldr r1, [pc, 18h]   ([00009FD0]=0814D08C)《----得到基地址,这里要注意了!
08009FB6   00A8 lsl r0, r5, 2h《----------4倍武器名称,也就是02DB*4=0B6C
08009FB8   1840 add r0, r0, r1<-----合成地址为814DBF8,也就是是说铁剑字库与该指针有关!
08009FBA   6800 ldr r0, [r0, 0h]<----读出【0814DBF8】=080FACE9
08009FBC   4C05 ldr r4, [pc, 14h]   ([00009FD4]=0202A6A8)
08009FBE   1C21 mov r1, r4
08009FC0 FD98F7F8 bl 8002AF4h<-------进入霍夫曼解压缩转移
08009FC4   6035 str r5, [r6, 0h]《----当前武器名称存入0202B6A8,不是0202A6A8哦!
08009FC6   1C20 mov r0, r4
08009FC8   E007 b 8009FDAh
08009FCA   0000 lsl r0, r0, 0
08009FCC   B6A8 ????
08009FCE   0202 lsl r2, r0, 8h
08009FD0   D08C beq 8009EECh
08009FD2   0814 lsr r4, r2, 0
08009FD4   A6A8 add r6, [pc, 2A0h]   (=0800A278h)
08009FD6   0202 lsl r2, r0, 8h
08009FD8   4801 ldr r0, [pc, 4h]   ([00009FE0]=0202A6A8)
08009FDA   BC70 pop r4-r6
08009FDC   BC02 pop r1
08009FDE   4708 bx r1
08009FE0   A6A8
08009FE2   0202
---------------------------------------
08009FC0 FD98F7F8 bl 8002AF4h<-------霍夫曼解压缩转移

08002AF4   B500 push , lr
08002AF6   4A03 ldr r2, [pc, Ch]   ([00002B04]=030040F0),这个指针下面的数据指针就是程序将去的地方
08002AF8   6812 ldr r2, [r2, 0h]
08002AFA FD63F0D3 bl 80D65C4h《-----这个是个转移,我直接到到达的程序去了
08002AFE   BC01 pop r0
08002B00   4700 bx r0
08002B02   0000
08002B04   40F0
08002B06   0300

---------------------------
08002AFA FD63F0D3 bl 80D65C4h《-----这个是个转移,我直接到到达的程序去了
这段程序在空栈区03003BAC......非常重要!!!直接关系到铁剑字指针的寻找

在rom中是没有空栈区的,但是有对应数据区,我直接抄了03003BAC对应080006E4,在03003BAC区有改变的我写在后面了

080006E4 E92D00F0 stmdb [sp]!, r4-r7
080006E8 E0433003 sub r3, r3, r3
080006EC E51F5014 ldr r5, [pc, -14h] 《-----ldr r5=814929ch 替换前面       8147ddc!!!
080006F0 E51F701C ldr r7, [pc, -1Ch] 《-----ldr r7=814d088h 替换前面       814d088!!!
080006F4 E5977000 ldr r7, [r7, 0h]
080006F8 E1A04007 mov r4, r7《-----R4由【814d088】得来,为814d084
080006FC E2533001 subs r3, r3, 1h《----7次检测内循环
08000700 5A000002 bpl 08000710h
08000704 E5D02000 ldrb r2, [r0, 0h]
08000708 E2800001 add r0, r0, 1h
0800070C E3A03007 mov r3, 7h《----7+1次检测内循环赋值
08000710 E3120001 tst r2, 1h
08000714 0A000001 beq 08000720h
08000718 E1D460B2 ldrh r6, [r4, 2h]
0800071C EA000000 b 08000724h
08000720 E1D460B0 ldrh r6, [r4, 0h]
08000724 E0854106 add r4, r5, r6, lsl 2h
08000728 E1A020A2 mov r2, r2, lsr 1h
0800072C E5946000 ldr r6, [r4, 0h]
08000730 E1160006 tst r6, r6《-----测试是否是负数,也就是字指针是否是FFFFxxxx,其中xxxx为字体指针
08000734 5AFFFFF0 bpl 080006FCh《-----不是要求格式的就不是字指针
08000738 E3160CFF tst r6, FF00h《----测试是否是FFFF0000
0800073C 0A000004 beq 08000754h《----是就要出程序了
08000740 E5C16000 strb r6, [r1, 0h]《-----每查到一个要求的字后该字存入[202A6A8+(N-1)*2],例如第1个字指针是90 ,BD 分别存入202A6A8,202A6A9
08000744 E1A06426 mov r6, r6, lsr 8h
08000748 E5C16001 strb r6, [r1, 1h]
0800074C E2811002 add r1, r1, 2h
08000750 EAFFFFE8 b 080006F8h《---继续外循环
08000754 E5C16000 strb r6, [r1, 0h]《----00保存
08000758 E31600FF tst r6, FFh《----测试是否是FFFF0000
0800075C 0A000001 beq 08000768h《-----是 就跳出该查字程序
08000760 E2811001 add r1, r1, 1h
08000764 EAFFFFE3 b 080006F8h《---不是继续外循环
08000768 E8BD00F0 ldmia [sp]!, r4-r7《----保护数据弹出
0800076C E12FFF1E bx lr《----程序返回入口地址

铁剑每个字指针如下:
202A6A8 202A6A9 90 BD R3=1
202A6AA 202A6AB 89 B8 R3=6
202A6AC 202A6AD 00

上面有3组数据,实际有效的只有2个,分别对应铁剑2个字。。。。。。
----------------------
在0801729C 0801729E两处设置BRK 画面中选物品整理,会在0801729C中断,,此时即时存档,然后可以反复读取,R0是武器数量以及武器代码,调试者可以自己改。

然后再以下3个地方设置断点

03003bcc 过一次读8bit

03003c08 存入解码数据第一位,此时记录下R3的值

03003c1c 存入解码数据第二位,当r6数据为00就结束解码

当在03003c1c停止时r6=0,重新读取存档,可继续返回跟踪解码

====================================


姓:郑
名:长春
号:无聊之士!
欢迎到网络U盘地址:http://zhengchangchun.ys168.com/ 来~
个人空间http://i.cn.yahoo.com/zhengchangchun2003
[楼 主] | Posted:2011-09-13 10:51| 顶端
无聊之士

头衔:全控全控
该用户目前不在线
级别: 火花会员
编号: 49952
精华: 5
发帖: 432
威望: 25 点
配偶: 单身
火 花 币: 4092 HHB
注册时间:2006-02-10
最后登陆:2024-06-28
艾雷布的骑士(I)
查看作者资料 发送短消息 引用回复这个帖子


====================================    
压缩字体格式原理破译

当前武器为 铁剑 代码DB02   反过来是02DB   乘以4加上0814D08C 合成指针读出指针为080FACE9
      细身剑 代码DC02   反过来是02DC 乘以4加上0814D08C 合成指针读出指针为080FACEE

080FACE9 db02铁剑   格式为13 97 93 bd 01
080FACEE dc02细身剑   格式为4A bb fd 93 bd 01
080FACF4 dd02钢剑   格式为62 c1 93 bd 01
080FACF9 de02银剑   格式为1e e4 c9 de 00
080FACFE df02铁之大剑 格式为13 97 99 e7 4f f6 06
080FAD05 e002钢之大剑 格式为62 c1 99 e7 4f f6 06
080FAD0C e102银之大剑 格式为1e e4 cc f3 27 7b 03
080FAD13 e202毒剑   格式为af ff 64 6f
080FAD17 e302突刺剑   格式为6a b6 8e 9d ec 0d
080FAD1D e402勇者之剑 格式为33 24 0b 33 4f f6 06
080FAD24


推论以上就是字体编码的一种方式,根据以上编码,解码后就得到对应参数字体 解出来的字代码放在 202a6a8 输出出去就可以用于显示


所以要想编新名字,就有必要把该编码方式搞清楚 改0814D08C 偏移地址的指针 然后在对应指针指向地方编辑字体编码即可出现新名字






以080FACE9处“铁剑”数据分拆

              13           97           93         bd     01

二进制   00010011 10010111 10010011 10111101 00000001
二进制位 01234567 01234567 01234567 01234567 01234567

8位一组,前后对调   11001000 11101001 11001001 10111101 10000000
                    76543210 76543210 76543210 76543210 76543210
                                  R3=1         R3=6

根据前面跟踪得出R3的值分断得出编码号

110010001110100   11100100110 1111011 0000000
            铁           剑             结束码   多余


以080FAD13处“毒剑”数据分拆
      af       ff             64         6f

10101111 11111111 01100100 01101111

11110101 11111111 00100110 11110110

1111010111111 11100100110 1111011   0
        毒           剑           结束码 多余


其他数据也是一样的,凡是得出相应代码后紧跟着是1111011得话,就是结束码,会退出判定的


如果没有码表 接下来就是巨大的工作量找了,那个是苦力活~


我举个例子,假设!现在我要做两个字“月领” 编码号分别是111100111 11110011111

那把这两个编码和在一起再加上结束码 就是11110011 11111001 11111111 011+00000

然后数据8位一组倒过来就是11001111 10011111 11111111 00000110

化成16进制就是对应的编码,假设的哦~~~~~~


[ 此贴被无聊之士在2011-09-13 10:58重新编辑 ]


姓:郑
名:长春
号:无聊之士!
欢迎到网络U盘地址:http://zhengchangchun.ys168.com/ 来~
个人空间http://i.cn.yahoo.com/zhengchangchun2003
[1 楼] | Posted:2011-09-13 10:51| 顶端
无聊之士

头衔:全控全控
该用户目前不在线
级别: 火花会员
编号: 49952
精华: 5
发帖: 432
威望: 25 点
配偶: 单身
火 花 币: 4092 HHB
注册时间:2006-02-10
最后登陆:2024-06-28
艾雷布的骑士(I)
查看作者资料 发送短消息 引用回复这个帖子


再给个最直观的

080FACE9处“铁剑
13     97     93     bd     01

110010001110100   11100100110 1111011 0000000
铁                 剑       结束码   多余

现在我要做“剑铁”

11100100110 110010001110100 1111011 0000000
剑         铁             结束码   多余

合并后8位一组
11100100 11011001 00011101 00111101 10000000

8位一组反向
00100111 10011011 10111000 10111100 00000001

化成16进制
27 9b b8 bc 01
写到080FACE9去,看看你的铁剑是不是变成了剑铁。,。。。。。


姓:郑
名:长春
号:无聊之士!
欢迎到网络U盘地址:http://zhengchangchun.ys168.com/ 来~
个人空间http://i.cn.yahoo.com/zhengchangchun2003
[2 楼] | Posted:2011-09-13 11:20| 顶端

火花天龙剑 -> 火花学园




Powered by PHPWind v3.0.1 Code © 2003-05 PHPWind
辽ICP备05016763号
Gzip enabled

You can contact us