- 积分
- 90
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
发表于 2006-2-9 23:42:46
|
显示全部楼层
回复 #76 fukandahai 的帖子
呵呵
兄弟好快
以我理解从汇编角度解释下
seg0CA:1B62 MP3_SaveVolumeSetting: ; CODE XREF: seg0D6:C164P
seg0CA:1B62 mov r1, r12
seg0CA:1B64 cmpb rl1, #9
seg0CA:1B68 jmpr cc_ULE, loc_CA1B6C 小于9就跳
seg0CA:1B6A movb rl1, #9 否则向r1的低位写入09,也就是说最大只为09
seg0CA:1B6C
seg0CA:1B6C loc_CA1B6C:
seg0CA:1B6C mov DPP0, #32h ; '2' 当前页是32h
seg0CA:1B70 nop
seg0CA:1B72 movb VolValue, rl1 把rl1的数写入系统mp3音量ram
seg0CA:1B76 calls 0CAh, Get_Vol_Value 得到音量值,也就是下面的程序
seg0CA:1BE4 mov DPP0, #32h ; '2' DPP0,当前页
seg0CA:1BE8 nop
seg0CA:1BEA movbz r12, VolValue 同上,由volvalue字节扩展到 r12
seg0CA:1BEE shl r12, #1 r12的数左移1位
seg0CA:1BF0 extp #328h, #1 临时切换到328页,有效指令1条
seg0CA:1BF4 mov r4, [r12+VolTable] 音量表地址处的数据加r12,复制到r4,注意这里,[r12+VolTable] ,带中括号表示数据地址
seg0CA:1BF8 rets 返回
再看修改
seg0CA:1B62 mov r1, r12 r12到r1
seg0CA:1B64 cmpb rl1, #12h 比较r1的低位是否是12
seg0CA:1B68 jmpr cc_ULE, loc_CA1B6E 小于就跳
seg0CA:1B6A movb rl1, #12h 否则将12写入rl1
seg0CA:1B6E
seg0CA:1B6E loc_CA1B6E:
seg0CA:1B6E extp #32h, #1 ; '2' 切换到32页,指令一条
seg0CA:1B72 movb VolValue, rl1 将rl1写入当前音量值
seg0CA:1B76 calls 0CAh, Get_Vol_Value 取得音量值函数,如下
seg0CA:1BE4 mov DPP0, #32h ; '2' 定义 当前页为32
seg0CA:1BE8 nop
seg0CA:1BEA movbz r12, VolValue 当前音量值(字节)复制到r12
seg0CA:1BEE mov r4, r12 r12到r4
seg0CA:1BF0 shl r12, #1 r12数左移1位
seg0CA:1BF2 add r4, r12 r12加r4
seg0CA:1BF4 movb rh4, rl4 rl4复制到rh4(字节),也就是形如我们mp3音量补丁的1e1e,1f1f,2323
seg0CA:1BF6 rets
至于0x36C11C: 47FC0900 47FC1200这句意思也是限制最大音量
由上可知,此补丁修改了取得音量的方式,音量数据直接在运行中动态生成,而不是由音量表读取。。。。。
所以可以改成很多级。。。。
呵呵,不过不说了,想看的自己用ida学习。。。。
sfe,ida是flash修改之两大利器,有意者必备
是不是很简单?一般的补丁移植。。。。 |
|