汉化日记(5)—-区别于LZ77的一种新的压缩方式 by funlove
汉化日记(5)
—-区别于LZ77的一种新的压缩方式
by funlove (funslove@163.com)
2004.08.26
为庆祝自己明天的生日而作:)
这种压缩方式原理类似LZ77,但具体压缩方法不同
具体的rom暂不透露,以下是源代码及详细的注释:
03000BA4>E92D47F0 stmfd [r13]!,r4-r10,r14 ;入口参数:r0=源地址,r1=目标地址,r2=字节数
03000BA8 E1A06000 mov r6,r0 ;r6=目标地址
03000BAC E2808001 add r8,r0,1h ;r8=目标地址+1
03000BB0 E1B07001 movs r7,r1 ;r7=源地址
03000BB4 E1A0A002 mov r10,r2 ;r10=r2=字节数
03000BB8 E4D79001 ldrb r9,[r7],1h ;读一个字节
;大循环
03000BBC E3520001 cmp r2,1h ;检查是否最后一个字节
03000BC0 3A000020 bcc 3000C48h ;解压结束的跳转接口
03000BC4 E4D70001 ldrb r0,[r7],1h ;读一个字节(标志字节)
03000BC8 E200403F and r4,r0,3Fh ;取标志字节的低6位
03000BCC E2844001 add r4,r4,1h ;加1
03000BD0 E1B00320 movs r0,r0,lsr 6h ;取标志字节的高两位(标志位)
03000BD4 1A000007 bne 3000BF8h ;非零的跳转(解压接口)
03000BD8 E0422004 sub r2,r2,r4 ;减去相应的字节数
;这个小循环简单地读取现有字节写到目标地址
03000BDC E4D70001 ldrb r0,[r7],1h ;读一个字节
03000BE0 E1B00000 movs r0,r0 ;检查是否为零
03000BE4 10800003 addne r0,r0,r3 ;非零,则加上r3 ???
03000BE8 E4C60001 strb r0,[r6],1h ;向目标地址写一个字节
03000BEC E2544001 subs r4,r4,1h ;计数器减一
03000BF0 1AFFFFF9 bne 3000BDCh ;小循环
03000BF4 EAFFFFF0 b 3000BBCh ;回到大循环
;标志位的判断
03000BF8 E2500002 subs r0,r0,2h ;判断标志位中的高位
03000BFC 5A000008 bpl 3000C24h ;设高位的跳转接口
03000C00 E0C22004 sbc r2,r2,r4 ;减去相应的字节数(要多减1)
03000C04 E4D70001 ldrb r0,[r7],1h ;读一个字节
03000C08 E0465000 sub r5,r6,r0
03000C0C E2455001 sub r5,r5,1h ;此字节加1为偏移
;未设标志高位
03000C10 E4D50001 ldrb r0,[r5],1h ;读一个字节
03000C14 E4C60001 strb r0,[r6],1h ;写一个字节
03000C18 E2544001 subs r4,r4,1h
03000C1C 5AFFFFFB bpl 3000C10h ;小循环
03000C20 EAFFFFE5 b 3000BBCh ;回到大循环
;设了标志高位
03000C24 E0465004 sub r5,r6,r4 ;偏移(不加1)
03000C28 1A000002 bne 3000C38h ;若标志低位也设上了,那么跳转
03000C2C E4D50001 ldrb r0,[r5],1h ;读一个字节
03000C30 E4C60001 strb r0,[r6],1h ;写一个字节
03000C34 E2422001 sub r2,r2,1h ;字节数减1
;同时设了标志高低位
03000C38 E5D50000 ldrb r0,[r5] ;读一个字节(指针不移动)
03000C3C E4C60001 strb r0,[r6],1h ;写一个字节
03000C40 E2522001 subs r2,r2,1h ;字节数减1
03000C44 EAFFFFDC b 3000BBCh ;回到大循环
;结束的跳转接口
……..
例子:
源数据流如下:
00 01 00 00 7F 00 BF FF …..
分析:
00 (第一个字节,无用)
01 (标志位00,字节数01h+1h=02h) 00 00 (对应的02h个字节)
7F (标志位01,字节数3Fh+2h=41h) 00 (偏移00h+1h=01h)
BF (标志位10,偏移3Fh+1h=40h,读两个字节)
FF (标志位11,偏移3Fh+1h=40h,读一个字节)


学习咯.汉化教程多多益善.