- 积分
- 247
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
发表于 2005-10-19 11:16:43
|
显示全部楼层
很高兴看到有人喜欢去研究补丁的写法。
这方面可以到SPGC版块去看看以前COOLLANG老大的新手入门文章,
你所说的那些我来对付着先解答一下吧。
是的,补丁是用汇编来写的,是基于C166的汇编,不过和8086/8088的汇编很接近,如果你有汇编的基础是很容易看得懂的。而补丁是由汇编再转成C166CPU所能识别的机器码(也许还要再经VK转一下)。这和8086上转成了BIN是有点类似的。
对于开发补丁的工具,你可以到SPGC那里去找找COOLLANG给出的SFE使用教程。当然还有别的工具,但我个人觉得还是SFE好用,小而精。
一般来说写补丁都是有汇编写好,然后用SFE汇编后就生成补丁的形式了,然后再刷到机子上就OK了。这其中的关键是:1。入口得自己找或是别人补丁中有用到的。2。有个好点子,好的想法,然后用汇编实现一下。其实难点是在于在了解入口的基础上有个好的点子。
以我开发的来电49/50/60秒提示为例。
首先,我知道了来电会经过的一些地址,其实这是因为当时我搞接通振动不小心发现的。这样我就得到了入口地址,然后在发现了我们X55在来电时是不会有提示音的。那么这个补丁有就开发的必要了。
那么我在我的代码中当然是会有如下的流程:判断是否来电?如果不是就放行,如果是就判断是否是在所需要的时间点上?这一步是有个算法的,其实我是照抄了原机上去电的算法,然后就是在时间点上发音,这个在之前的一个补丁中(应当是去掉提示框那个补丁中有用到),这样很容易一个补丁就开发完了。看看当时我的源代码吧。如下:
;MC60 来电提示音源代码.
;飞飞猪
;mc60 v07
;05.5.27
#define Patch_org_addr 0x552910h ;补丁开始地址
#define Md 00fe0eh ;乘法寄存器.
#define MdL 00fe0ch ;低位.
#define Dididi 0a1ec94h ;发音CALL
#define de_CA 0B56Ee0h ;原位置的CALL,也就是入口所在.
org Patch_org_addr
;calls patchbegin ;只是处理一下,恢复入口.
;calls de_CA
;rets
;patchbegin:
mov [-r0],r12
mov [-r0],r4
extp #7,#1
mov r12,003c02H ;如果此地址如[非6]就是打进.
cmp r12,#6
jmpr cc_Nz,Aaaaa ;否--跳去处理.
mov r4,[r0+]
mov r12,[r0+]
rets
Aaaaa:
extp #7, #1
mov r4,33deh ;取得通话时长
;分离出秒.
mov r12,#3ch ;60
mov Md,r4
atomic #2
divu r12
nop
calls Bbbb ;处理秒值在49/50/60的情况.
jmpr cc_Z Cccc
mov r4,[r0+]
mov r12,[r0+] ;如果不是指定时间点时什么也不做.
rets
Cccc: ;如果是指定的时间点,那么跳到这里来发声.
mov r12,#13h ;R12的值决定声音.可修改.
calls Dididi ;DAa194ec
mov r4,[r0+]
mov r12,[r0+]
rets
Bbbb: ;是否是在49/50/60秒?
mov r4,MdL
cmp r4,#30h
jmpr cc_z Ddd
cmp r4,#31h
jmpr cc_z Ddd
cmp r4,#3bh
Ddd:
rets
然后用SFE来汇编一下,再加上入口一个补丁就出来了。而关于一些其它的补丁中入口如何找到,COOLANG有个帖子说到,但是对于我来说似乎是太难了点。也就是说真正做一个从无到有完全是自己搞出来的东西,由于我们对机子的了解并不太多,我个人觉得真是太难了。 |
|