//小字体判断是否双码地方,并跳过偏移量(范围?)
081BDC00 4645 mov r5, r8
081BDC02 782D ldrb r5, [r5, 0h]
081BDC04 1E68 sub r0, r5, 1h
081BDC06 4488 add r8, r1
081BDC08 0400 lsl r0, r0, 10h
081BDC0A 0C00 lsr r0, r0, 10h
081BDC0C 285B cmp r0, 5Bh
081BDC0E D0F7 beq 81BDC00h ;前面到这里是否是无用段呢?
081BDC10 0400 lsl r0, r0, 10h ;入口,先把改动前占用的指令还原
081BDC12 0C00 lsr r0, r0, 10h
081BDC14 28F5 cmp r0, F5h ;r0-1为编码变量
081BDC16 D908 bls 81BDC2Ah ;如果不是FX双码则跳转判断是否8X双码
081BDC18 072D lsl r5, r5, 1Ch
081BDC1A 0D2D lsr r5, r5, 14h ;r5 << 8 r5作用???
081BDC1C 4641 mov r1, r8 ;r8作用???
081BDC1E 7808 ldrb r0, [r1, 0h] ;读取下一码????
081BDC20 4305 orr r5, r0
081BDC22 2001 mov r0, 1h
081BDC24 4480 add r8, r0
081BDC26 FCDCF65E bl 801C5E2h ;看不懂....
081BDC2A 2889 cmp r0, 89h ;再判断是否8B ~ 8D区
081BDC2C D905 bls 81BDC3Ah ;如果不是,跳转去原样返回
081BDC2E 288C cmp r0, 8Ch ;再判断是否8B ~ 8D区
081BDC30 D803 bhi 81BDC3Ah ;如果不是,跳转去原样返回
081BDC32 3505 add r5, 5h ;如果是双码区,则
081BDC34 06ED lsl r5, r5, 1Bh
081BDC36 0CED lsr r5, r5, 13h ;r5 = 0x500
081BDC38 E7F0 b 81BDC1Ch
081BDC3A 46F7 mov pc, lr //无用段,保留的
081BDC40 3601 add r6, 1h ;无用段
081BDC42 3C03 sub r4, 3h
081BDC44 0724 lsl r4, r4, 1Ch
081BDC46 0D24 lsr r4, r4, 14h
081BDC48 1824 add r4, r4, r0
081BDC4A 0064 lsl r4, r4, 1h
081BDC4C 205C mov r0, 5Ch
081BDC4E 7070 strb r0, [r6, 1h]
081BDC50 2000 mov r0, 0h
081BDC52 46F7 mov pc, lr
081BDC54 0724 lsl r4, r4, 1Ch
081BDC56 0D24 lsr r4, r4, 14h
081BDC58 7830 ldrb r0, [r6, 0h]
081BDC5A 46F7 mov pc, lr
081BDC5C 0000 lsl r0, r0, 0
081BDC5E 285B cmp r0, 5Bh
081BDC60 D1D6 bne 81BDC10h
081BDC62 2520 mov r5, 20h
081BDC64 E7D4 b 81BDC10h
//传送剩下的2/3部分字模的上部分,下半部分就把字模地址改变后,让程序自己传送
081BDC70 0C09 lsr r1, r1, 10h ;入口,r1 = ???,移位得出单码后
081BDC72 295C cmp r1, 5Ch ;判断第二码是否改动过的5C
081BDC74 D11C bne 81BDCB0h ;如果不是则跳转到...
081BDC76 6852 ldr r2, [r2, 4h]
081BDC78 3E03 sub r6, 3h
081BDC7A 7831 ldrb r1, [r6, 0h] ;取第一码
081BDC7C 298A cmp r1, 8Ah ;判断是否8B ~ 8D区
081BDC7E D903 bls 81BDC88h
081BDC80 298D cmp r1, 8Dh
081BDC82 D801 bhi 81BDC88h ;不是8B ~ 8D区的,偏移计算不一样,跳转
081BDC84 3102 add r1, 2h
081BDC86 E000 b 81BDC8Ah
081BDC88 3903 sub r1, 3h ;可惜字模地址是定死01 ~ 05,F6~FF,8B~8D的
081BDC8A 7873 ldrb r3, [r6, 1h] ;取第二码
081BDC8C 0209 lsl r1, r1, 8h
081BDC8E 18C9 add r1, r1, r3
081BDC90 2300 mov r3, 0h
081BDC92 E000 b 81BDC96h ;这里应该可以去掉
081BDC94 46C0 nop
081BDC96 7033 strb r3, [r6, 0h] ;但是想不明白就是为什么存0进去
081BDC98 3603 add r6, 3h ;,难道是用了前一字节?
081BDC9A 3808 sub r0, 8h ;显存位置回退到字模上半部分
081BDC9C 0509 lsl r1, r1, 14h ;去掉编码最高4bit
081BDC9E 0BC9 lsr r1, r1, Fh ;然后*2
081BDCA0 1889 add r1, r1, r2 ;加上指针偏移地址
081BDCA2 3110 add r1, 10h ;偏移修正
081BDCA4 C908 ldmia [r1]!, r3 ;传送字模的,不多说了
081BDCA6 C008 stmia [r0]!, r3
081BDCA8 C908 ldmia [r1]!, r3
081BDCAA C008 stmia [r0]!, r3
081BDCAC 2200 mov r2, 0h ;不明白这里为什么赋值0,结束符意思?
081BDCAE 46F7 mov pc, lr
081BDCB0 6812 ldr r2, [r2, 0h] ;原样转处代码还原
081BDCB2 00C9 lsl r1, r1, 3h ;lsl 3原因是0x10 - 3 = D
081BDCB4 46F7 mov pc, lr
081BDCB6 46F7 mov pc, lr //大字字码后面加5C
081BDCC0 3D02 sub r5, 2h ;入口
081BDCC2 7828 ldrb r0, [r5, 0h] ;先读取第一码
081BDCC4 288A cmp r0, 8Ah
081BDCC6 D901 bls 81BDCCCh
081BDCC8 288D cmp r0, 8Dh ;判断是否8B ~ 8D区
081BDCCA D901 bls 81BDCD0h
081BDCCC 28F6 cmp r0, F6h ;判断是否FX区双码
081BDCCE D902 bls 81BDCD6h ;如果不是,则原样跳转回去
081BDCD0 205C mov r0, 5Ch
081BDCD2 70A8 strb r0, [r5, 2h] ;大字双码后面添加一个5C
081BDCD4 3501 add r5, 1h ;并且把存编码的内存地址也+1
081BDCD6 2000 mov r0, 0h ;后面是原样返回
081BDCD8 3502 add r5, 2h ;还原r5
081BDCDA 7028 strb r0, [r5, 0h]
081BDCDC 46F7 mov pc, lr //大字字模偏址调整,及非剧情字码后接5C(非剧情???)
081BDCE0 2C8A cmp r4, 8Ah ;入口
081BDCE2 D903 bls 81BDCECh
081BDCE4 2C8D cmp r4, 8Dh ;先判断是否8X区
081BDCE6 D801 bhi 81BDCECh ;不是则认为是0X,FX的双码区
081BDCE8 3405 add r4, 5h ;不是则添加偏移实质接在FX区后面,8B+5 = 90
081BDCEA E002 b 81BDCF2h
081BDCEC 20F6 mov r0, F6h
081BDCEE 4284 cmp r4, r0 ;和F6比较,
081BDCF0 D918 bls 81BDD24h ;不是FX区双码
081BDCF2 7870 ldrb r0, [r6, 1h] ;读第二码
081BDCF4 285C cmp r0, 5Ch
081BDCF6 D00D beq 81BDD14h ;如果=5C就???
081BDCF8 480D ldr r0, [pc, 34h] ;=0x200B99E(33601950) )h
081BDCFA 4286 cmp r6, r0 ;
081BDCFC D90A bls 81BDD14h
081BDCFE 480D ldr r0, [pc, 34h] ;=0x200BAFF(33602303) ? "???
081BDD00 4286 cmp r6, r0
081BDD02 D807 bhi 81BDD14h ;如果不在,则???
081BDD04 3E02 sub r6, 2h ;如果是目标区域,则存放字符的内先后退2Byte
081BDD06 7870 ldrb r0, [r6, 1h]
081BDD08 7030 strb r0, [r6, 0h]
081BDD0A 78B0 ldrb r0, [r6, 2h]
081BDD0C 7070 strb r0, [r6, 1h] ;把后续的两字节编码前移一个字节
081BDD0E 3601 add r6, 1h
081BDD10 205C mov r0, 5Ch
081BDD12 7070 strb r0, [r6, 1h] ;此时存放5C到[r6_orig]
081BDD14 7830 ldrb r0, [r6, 0h] ;读取第二码,如果存在5C则这么做了
081BDD16 3C03 sub r4, 3h ;可惜字模地址是定死01 ~ 05,F6~FF,8B~8D的
081BDD18 0724 lsl r4, r4, 1Ch
081BDD1A 0D24 lsr r4, r4, 14h ;算字模偏移地址
081BDD1C 1824 add r4, r4, r0
081BDD1E 0064 lsl r4, r4, 1h ;字符宽度*2
081BDD20 2000 mov r0, 0h ;为啥要赋值为0
081BDD22 46F7 mov pc, lr
081BDD24 0724 lsl r4, r4, 1Ch ;0X双码处理,照搬原来代码
081BDD26 0D24 lsr r4, r4, 14h ;(code & 0xF) * 0x100
081BDD28 7830 ldrb r0, [r6, 0h]
081BDD2A 46F7 mov pc, lr 081BDD30 0200B99E ;常量,判断非剧情的内存地址
081BDD34 0200BAFF ;常量,判断非剧情 //小字体导入地方,双码后加5C
081BDD40 3801 sub r0, 1h ;
081BDD42 4D0F ldr r5, [pc, 3Ch] ;=0x8FC5980(150755712) """
081BDD44 42AC cmp r4, r5 ;是否是M30之后偏移
081BDD46 D910 bls 81BDD6Ah ;不是,则原样返回
081BDD48 4D0E ldr r5, [pc, 38h] ;=0x8FDB570(150844784)
081BDD4A 42AC cmp r4, r5 ;是否是M50之前偏移?
081BDD4C D80D bhi 81BDD6Ah ;不是,则原样返回
081BDD4E E002 b 81BDD56h
081BDD50 0000 lsl r0, r0, 0
081BDD52 0000 lsl r0, r0, 0
081BDD54 0000 lsl r0, r0, 0
081BDD56 7805 ldrb r5, [r0, 0h] ;读取上一字节
081BDD58 2D8A cmp r5, 8Ah
081BDD5A D901 bls 81BDD60h
081BDD5C 2D8D cmp r5, 8Dh
081BDD5E D901 bls 81BDD64h
081BDD60 2DF6 cmp r5, F6h
081BDD62 D902 bls 81BDD6Ah ;如果不是8X,FX双码,则原样返回
081BDD64 7041 strb r1, [r0, 1h] ;存r1到[r0_orig]
081BDD66 215C mov r1, 5Ch ;把当前码变为5C
081BDD68 3001 add r0, 1h ;存5C到[r0_orig+1]
081BDD6A 7041 strb r1, [r0, 1h] ;原样返回
081BDD6C 3002 add r0, 2h ;因为-1了,所以+2,还原原来的+1
081BDD6E 46F7 mov pc, lr
[081BDD80]=M30首,[081BDD84]=M50末
//小字体相关
081BDDC0 285B cmp r0, 5Bh ;入口,r0+1为编码
081BDDC2 D101 bne 81BDDC8h
081BDDC4 3301 add r3, 1h ;r3=??? 非剧情文本有部分是5C接在双码两字节之间
081BDDC6 7819 ldrb r1, [r3, 0h] ;所以读取下字节
081BDDC8 46F7 mov pc, lr
081BDDCA 0000 lsl r0, r0, 0
081BDDCC 0000 lsl r0, r0, 0
081BDDCE 0000 lsl r0, r0, 0
081BDDD0 285B cmp r0, 5Bh ;无用段?
081BDDD2 D100 bne 81BDDD6h
081BDDD4 3201 add r2, 1h
081BDDD6 0600 lsl r0, r0, 18h
081BDDD8 0E00 lsr r0, r0, 18h
081BDDDA 28F5 cmp r0, F5h
081BDDDC D901 bls 81BDDE2h
081BDDDE 28FF cmp r0, FFh
081BDDE0 46F7 mov pc, lr
081BDDE2 2889 cmp r0, 89h
081BDDE4 D901 bls 81BDDEAh
081BDDE6 288C cmp r0, 8Ch
081BDDE8 D9F9 bls 81BDDDEh
081BDDEA 2804 cmp r0, 4h
081BDDEC 46F7 mov pc, lr