- 积分
- 51
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
发表于 2005-8-10 00:50:00
|
显示全部楼层
我再结合实际地补丁来简单的注解下MrJewes所举的整点报时的例子:
整点报时功能
;适用版本: 6688 v55
;作者:RizaPN
;移植:huajia
;此修改将提供整点报时的功能。
;注意:此修改和coollang的在12/24时制间选择的功能有冲突,不可同时刷。
0x3637CC: 26F00C00 DABFC00B
0x1F0BC0: FFFFFFFFFFFFFFFF D7500D00F3F8A424
0x1F0BC8: FFFFFFFFFFFFFFFF F2F2DC258AF41240
0x1F0BD0: FFFFFFFFFFFFFFFF 48203D0BD7401100
0x1F0BD8: FFFFFFFFFFFFFFFF F3F8403849813D0A
0x1F0BE0: FFFFFFFFFFFFFFFF E01CDAB5A4D2E004
0x1F0BE8: FFFFFFFFFFFFFFFF 0D01E014D7401100
0x1F0BF0: FFFFFFFFFFFFFFFF F7F8403826F00C00
0x1F0BF8: FFFF DB00
;通过设置情景模式配置文件 3(倒数第二项)的震动器来控制整点报时的开关。
;震动器->关,则报时功能打开。
;报时声音可通过修改地址0x1F0BE1来实现。
;方式如下:
;0x1F0BE1: FF 1C (tut-tut-tut声)
;0x1F0BE1: FF 2C (高的titi声)
;0x1F0BE1: FF 3C (电池无电关机警告声)
其实这个例子的实现原理是,在小8待机时和通话状态处理图标时,顺便处理下自己新加入的部分功能。
实现方法是:
一、先要知道处理图标函数的入口,也就是地址D637C8(换成我们常用的格式就是D637C8-
A00000=3637C8)处的代码。其实D637CC和3637CC是等价的,只不过对应的对象不同才有
不同的表现,可看相关资料。
二、修改D637C8(3637C8)处开始的代码为一个跳转功能,这样当小8执行到处理图标函数时
会被我们加入的跳转代码引到我们新加的代码处执行。
实际上的补丁是把这个跳转加在(D637CC)3637CC处,为什么不是D637C8(3637C8)处
呢?其实要是你接触过用汇编编地函数就会明白,一般来说,在一个函数地刚开始部分都是入
栈指令用以保护即将被函数使用地寄存器地内容或是给函数地临时变量留点地方,
如类似这样的代码(注意是类似,我没实际研究过):
mov [-r0], r9
mov [-r0], r8 //保存寄存器
这样我们的跳转代码就可以适当的插在这些代码的后面点以免作重复的工作,至于插在后面多
少的位子,那就要看这些入栈指令代码的实际长度了,一般来说当你能动手写代码时,你也应
该能知道什么是适当的插入点啦,如例子中的(D637CC)3637CC。知道这个插入点后,在这
个位子直接加入我们要的跳转代码:CALL XXXXX,CALL的原代码是DA,XXXXX就是我们找到的
没有用的空间的地址(0x1F0BC0)你也可以改到你认为合适的FREE空间地址,这样代码的最
后表现形式就是 0x3637CC: 26F00C00 DA (这里使用地址0x1F0BC0时要转换一
下),注意这里我们破坏了他的原有的代码26F00C00,后面在我们自己加的代码里面要记得补
回也就是,MrJewes所举的整点报时的例子里的:
sub r0, #0Ch//因为我们占用了刚才那条指令,所以要补回来
当调到我们自己加的代码地址时,我们下面再该作什么呢?
MrJewes已经注解的很清楚了,要是你还是不懂,那我就再罗嗦下:
先取得情景模式配置文件3里的数据,看是否震动器被选中,如果没有选中则直接跳到出口loc_BF0BF4处:
ROM:BF0BF4 loc_BF0BF4:
ROM:BF0BF4 sub r0, #0Ch//因为我们占用了刚才那条指令,所以要补回来
ROM:BF0BF8 rets
反之,就是具体的实现整点报时的功能了。
要完成实际可用的补丁时注意几点的是:
一、我们加的代码必须要放在FREE地址处。
二、地址的转换,如D637CC转换为3637CC,1F0BC0转换为BFC00B(如果手工改动的话)
三、入口保护,如:
mov [-r0], r9
mov [-r0], r8 //保存寄存器
四、功能实现:
ROM:BF0BC0 extp #0Dh, #2
..................................................
.....
ROM:BF0BEC extp #11h, #1
ROM:BF0BF0 movb byte_47840, rl4
......
五、恢复现场并返回:
ROM:BF0BF4 loc_BF0BF4:
ROM:BF0BF4 sub r0, #0Ch//因为我们占用了刚才那条指令,所以要补回来
ROM:BF0BF8 rets
说这么多,其实我还没实际写过小8补丁,主要是以前写汇编留下的点经验,不对之处,见谅。
|
|