MrJewes 发表于 2005-8-10 00:00:00

【补丁源码交流】拨号显示号码+接通振动提示

过几天要出去做事,所以抽空把这个东东发了,本来早就该发的,可是以前的版本一直都有些问题,现在的基本上稳定了。所以,发出来,希望能起到抛砖引玉的作用


$Segmented
$Mod167

;Some Function
DrawImagebyIndex EQU 0xB3DF04
GetVibraStatByProfile EQU 0xB5D570
pSendMessage        EQU 0xB4724C

;SOme Address
PatchBeginEQU 0x1F2000

;原理,先把拨号中的号码提取出来按一定格式放在一个buffer中,然后在对这个buffer中的数据进行显示,buffer选的是0c:23c8
;比如拨1861,本来的存储是8116,提取出来就是01 08 06 01。
;--拨号显示拨号号码和振动提示---FOR 6688v55-------Jewes----------------------------------;

patch section code word AT PatchBegin

main proc far
               extp   r15, #1
             mov    r14,
               cmp        r14,#0C6h
               jmp        cc_z,begin_vibra
               cmp        r14,#0c2h
               jmp        cc_z,Numberinphone
               cmp        r14,#0c3h
               jmp        cc_z,Numberinphone
               cmp        r14,#0CAH
               jmp        cc_c,clear
               cmp        r14,#0CDh
               jmp        cc_UGT,clear
               ;判断是否在电话本中有,如果存在了电话本中则显示号码
                  extp        #0Ch,#1
               movb        rl4,2b84h
               cmpb        rl4,#0
               jmp        cc_z,Numberinphone
               callr        showdialnumber
Numberinphone:       
               mov        r4,#1
               jmp        cc_uc,out
               
begin_vibra:
        extp         #0ch,#1
        mov        r4,23c6h
        cmp        r4,#0
        jmp        cc_z,out
        mov   [-r0],r12
        mov   [-r0],r13
        mov   [-r0],r14
        mov   [-r0],r15       
        calls        seg(Vibra+0xA00000),SOF(Vibra+0xA00000)
        mov   r15,
      mov   r14,
      mov   r13,
      mov   r12,
clear:        mov        r4,#0
out:       
        extp        #0ch,#1
        mov        23c6h,r4
        rets
main endp
;用与来电时清除标志的,不然来电接电话也要振动
ClearVibraFlagproc far
mov        r12,r9
mov        r13,r6
MOV        R4,#0
extp        #0ch,#1
mov        23c6h,r4
RETS
ClearVibraFlagendp


        showdialnumber proc near
               mov    [-r0], r1
               mov    [-r0], r4
               mov    [-r0], r12
               mov    [-r0], r13
               mov    [-r0], r14
               mov    [-r0], r15
               mov        r14,#23c8h
               mov         r15,#2b85h
               ;用1861来测试的
               ;把8116格式的内容转换成01 08 06 01 0F格式的放在0c:23c8h
loop:               extp        #0ch,#1
               movb        rl1,
               movb        rh1,rl1
               
               cmpb        rl1,#0FFh
               jmp         cc_z,wordend;如果是偶数
               
               cmpb        rl1,#0
               jmp           cc_z,doublezero
               
               addb        rl1,#0F0H;如果是奇数
               cmpb        rl1,#0F0h
               jmp        cc_z,wordnearend
               mov        rl1,rh1
               mov        rh1,#0
               shl        r1,#4
               mov        r4,r1
               and        r4,#0FFh
               shr        r4,#4
               mov        rl1,rl4;r1=0801
               callrsave
               jmp        cc_uc,loop
wordnearend:
               movb        rl1,rh1
               andb        rl1,#0fh
               movb        rh1,#0FFh
               callrsave
               jmp        cc_uc,begintoshow
               
wordend:       
               movb        rl1,#0Fh
               extp        #0ch,#1
               movb        ,rl1
               jmp        cc_uc,begintoshow
doublezero:               
               mov        r1,#0
               callr        save
               jmp        cc_uc,loop
               ;开始显示,上面的已验证正确!
begintoshow:       
               callr        getlen
               cmp        r4,#0bh;判断号码长度是否大于11位,因为一般手机和长途电话都是11位
               jmp        cc_ULT,small
               sub        r4,#0bh
               mov        r12,#11h
               jmp        cc_uc,start
               
small:               mov        r12,r4;自动居中
               shl        r12,#2
               shl        r4,#1
               add        r12,r4
               neg        r12
               add        r12,#100
               shr        r12,#1
               mov        r4,#0
               
start:                              
               add        r4,#23c8H
loop2:               
               
               extp        #0ch,#1
               movb        rl1,
               cmpb        rl1,#0Fh
               jmp        cc_z,showover
               movbz        r14,rl1
               callr showpic
               jmp        cc_uc,loop2

showover:               
              mov    r15,
               mov    r14,
               mov    r13,
               mov    r12,
               mov    r4,
               mov    r1,
               ret
        showdialnumber endp
        ;把r1中的数放在buffer中
        save proc near
        extp        #0ch,#1
        mov        ,r1
        add        r14,#2
        ret
        save endp
        ;返回号码的长度
        getlen proc near
        mov        r14,#23c8h
        mov        r4,#0
loop1:       
        extp        #0ch,#1
        movb        rl1,
        cmpb        rl1,#0FFH
        jmp        cc_z,exitwith0
        cmpb        rl1,#0FH
        jmp        cc_z,endofnumber
        add        r4,#1
        jmp        cc_uc,loop1
exitwith0:
        mov        r4,#0
endofnumber:       
        ret       
        getlen endp
       
        showpic proc near
               
               mov        [-r0],r4
               mov        [-r0],r12
               add        r14,#20dh
               mov        r13,#0Ah
               calls        seg(DrawImagebyIndex),sof(DrawImagebyIndex)
               mov        r12,
               mov        r4,
               add        r12,#6
               ret
        showpic endp
        ;自定义的振动函数,使得振动时间可以变短,振动可选以及声音提示可以修改这个函数
        Vibraproc far
        calls         seg(GetVibraStatByProfile),sof(GetVibraStatByProfile)
        cmp        r4,#0
        jmp        cc_nz,V_out
        mov r12, #1                     
        mov [-r0], r12
        mov r13, #2
        mov [-r0], r13
        mov r12, #34C0h                  
        mov r13, #0Eh
        mov r14, #2   
        mov r15, #2FH
        calls seg(pSendMessage), sof(pSendMessage) ;发送消息
        add r0, #4
V_out:
        rets
        Vibraendp
patch ends
End


批评派 发表于 2005-8-10 00:01:00

谢谢/

tianmr 发表于 2005-8-10 00:02:00

请问jewes 用的什么汇编器将源代码汇编成机器代码?能否提供下载?
我用sfe等工具汇编时,有许多指令都不认。

sOLO 发表于 2005-8-10 00:03:00

正好需要震动函数的那一块~~谢了,收下~~
页: [1]
查看完整版本: 【补丁源码交流】拨号显示号码+接通振动提示