- 积分
- 211
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
发表于 2005-8-20 19:52:44
|
显示全部楼层
$Segmented
$Mod167 ;努力向3618自动应答奋斗
;一些函数
PlayVMO EQU 0E8B2D6h ;r12=offset,r13=page
;SwitchMic EQU 0EF84C6h ;not test(录音或开始录音的时候会自动打开麦克风,所以无用)
CloseMic EQU 0AFF58Ah ;关闭话筒,并置FD02.1=1
RecordVMO EQU 0E8D68Ch ;可直接录音,不需确认,对方挂断时刻自动保存录音文件
GetTheCall EQU 0AFB6CEh ;接听函数
GetCallingTotleTime EQU 8834E6h ;得到当前通话总时间(秒)
IsCallInProgress EQU 0xDC2A14
DrawImageByIndex EQU 0xC3896C
;系统变量
VMONumbers EQU 16DF6Eh ;留言条数
CounterFlag EQU 16DF6Ch ; bit0:等于1表示有来电(不是去电),bit1表示计数器是否到时间,bit2控制录音
CounterTemp EQU 16DF6Dh ;存计数器值
CustomMenuStatus EQU 10BEFCh ;使用功能12
;一些地址
PatchBegin EQU 07D7720h
;****************************************
;* 自动留言机 *
;* 适用机型:x618 *
;* 版本:V1正式版 *
;* 作者:llhn *
;****************************************
;***************************************************************
Patch section code word AT PatchBegin
;---------------------------------
; 按下左导航建,直接进入录音器,并置零 留言个数
;breakpoint:
;6FD87C: DAEE86F6 ---> Calls Seg(ClearVMONumbers), Sof(ClearVMONumbers)
ClearVMONumbers proc far
extp #Pag(VMONumbers), #1
mov r4, Pof(VMONumbers)
cmp r4, #0
jmpr cc_Z, ExeOrignal
mov r4, #0
extp #Pag(VMONumbers), #1
mov Pof(VMONumbers), r4
calls 0E8h, 0CAB8h ;进入录音菜单
jmpr ClearVMONumbersReturn
ExeOrignal:
calls 0EFh, 0BB9Ch ;写短信
ClearVMONumbersReturn:
rets
ClearVMONumbers endp
;---------------------------------
;待机显示留言提醒数目, 留言:2 ,并且始终置位CounterFlag和CounterTemp
;605-614号图片,0-9, 615号:空白,6*9; 10号:小人说话12*12
;Breakpoint
;F0416C: E6 F6 FF FF mov r6, #0FFFFh --> calls Seg(ShowVMONumbers)
ShowVMONumbers proc far
calls seg(IsCallInProgress),sof(IsCallInProgress)
cmp r4, #0
jmpr cc_NZ, ShowVMONumbersReturn ;通话期间不显示
mov r4, #0 ;待机时始终置位counterflag和countertemp
extp #Pag(CounterFlag), #1
mov Pof(CounterFlag), r4
extp #5Bh, #1
mov r4, 14D2h
jmpr cc_Z, ShowVMONumbersReturn ;有号码按下,不显示(这也是引起关闭屏保无显示的bug)
extp #Pag(VMONumbers), #1
mov r4, Pof(VMONumbers)
cmp r4, #0
jmpr cc_Z, ShowVMONumbersReturn
BeginShow:
add r4, #604D
mov [-r0], r4
extp #Pag(RemainderPosition+0x800000), #2
movbz r12, Pof(RemainderPosition)
movbz r13, Pof(RemainderPosition+1)
mov r14, #9D
mov [-r0], r12
mov [-r0], r13
calls Seg(DrawImageByIndex), Sof(DrawImageByIndex)
mov r13, [r0+]
mov r12, [r0+]
add r12, #12D
add r13, #2D
mov r4, [r0+]
mov r14, r4
calls Seg(DrawImageByIndex), Sof(DrawImageByIndex)
ShowVMONumbersReturn:
mov r6, #0FFFFh ;补原指令
rets
ShowVMONumbers endp
;---------------------------------
;来电等待时不考虑在内
;BreakPoint:若待机时来电的处理部分, 等待时间到,开始接听并放音
;F9AFDA 06 F0 08 00 add r0, #8 -->calls Seg(MainFunction),Sof(MainFunction)
MainFunction proc far
extp #Pag(CustomMenuStatus), #1
mov r5, Pof(CustomMenuStatus)
jnb r5.11, MainFunctionReturn ;个人设置菜单状态, 使用功能11
extp #Pag(VMONumbers), #1
mov r5, Pof(VMONumbers)
extp #Pag(VMOs+0x800000), #1
movbz r4, Pof(VMOs)
cmp r5, r4 ;留言条目
jmpr cc_UGE, MainFunctionReturn
extp #Pag(CounterFlag), #1
mov r4, Pof(CounterFlag)
jnb r4.0, MainFunctionReturn ;status.0=1?是否有来电?
jb r4.1, BeginGetCall ;计时器是否到时间?
subb rh4, #1
cmpb rh4, #0
jmpr cc_NZ, SetFlag1_0
bset r4.1
SetFlag1_0:
bclr r4.2
jmpr cc_UC,UpdateFlag
BeginGetCall:
calls Seg(GetTheCall), Sof(GetTheCall)
; mov r12, #3 ;测试时使用的,响铃提示。
; calls 0C7h, 55BCh
mov r4, #0
bset r4.2
UpdateFlag:
extp #Pag(CounterFlag), #1
mov Pof(CounterFlag), r4
MainFunctionReturn:
add r0, #8 ;补原指令
rets
MainFunction endp
;---------------------------------------------------
;---------------------------------------------------
;待机时来电,则记录当前系统计数器的值,并初始化counterflag: 有来电,计数器未到时间,录音禁能
;BreakPoint:
;AFC144 DA DC D0 28 calls 0DCh, sub_DC28D0 ----> calls
StoreTheCounterValue proc far
extp #Pag(DelayTime+0x800000), #1
movb rh4, Pof(DelayTime)
movb rl4, #1
extp #Pag(CounterFlag), #1
mov Pof(CounterFlag), r4
calls 0DCh, 28D0h ;补原指令
rets
StoreTheCounterValue endp
;---------------------------------------------------
;---------------------------------------------------
;通话时,到了开始录音的时候,录音
;8821EE DA DC B8 27 calls 0DCh, sub_DC27B8
RecordWhileCalling proc far
extp #Pag(CounterFlag), #1
movb rl4, Pof(CounterFlag)
jnb r4.2, RecordWhileCallingReturn
calls Seg(GetCallingTotleTime), Sof(GetCallingTotleTime)
cmp r4, #1
jmpr cc_Z, BeginPlayVMO
extp #Pag(DelayTime+1+0x800000), #1
movbz r5, Pof(DelayTime+1)
cmp r4, r5
jmpr cc_Z, BeginRecordVMO ;是否到时间开始录音?
jmpr cc_UC, RecordWhileCallingReturn
BeginPlayVMO:
callr PlayAnswerVMO
jmpr cc_UC, RecordWhileCallingReturn
BeginRecordVMO:
movb rl4, #0
extp #Pag(CounterFlag), #1
movb Pof(CounterFlag), rl4 ;更新状态寄存器
extp #Pag(VMONumbers), #1 ;留言数目 加1
mov r4, Pof(VMONumbers)
add r4, #1
extp #Pag(VMONumbers), #1
mov Pof(VMONumbers), r4
calls Seg(CloseMic), Sof(CloseMic)
calls Seg(RecordVMO), Sof(RecordVMO)
RecordWhileCallingReturn:
calls 0DCh, 27B8h ;补全原代码
rets
RecordWhileCalling endp
;----------------------------------------------------
;接通之后的寄存器处理,避免手动接通时仍然自行接通....
;接通之后,Flag.0=0, Flag.1=0
;ROM:AFBF74 DA C5 DC DB calls 0C5h, sub_C5DBDC -->calls
;此处断点,播出接入均执行
Access proc far
extp #Pag(CounterFlag), #1
mov r4, Pof(CounterFlag)
bclr r4.0
bclr r4.1
extp #Pag(CounterFlag), #1
mov Pof(CounterFlag), r4
calls 0C5h, 0DBDCh ;补原断点
rets
Access endp
;播放应答录音
PlayAnswerVMO proc near
calls Seg(CloseMic), Sof(CloseMic)
mov r12, #Pof(AnswerFileName)
mov r13, #Pag(AnswerFileName+0x800000)
calls Seg(PlayVMO), Sof(PlayVMO)
ret
PlayAnswerVMO Endp
AnswerFileName:
db 'a:\Voice memo\Answer.vmo',00,0FFh
DelayTime:
db 30D ;接通时间
dB 10D ;自动应答文件的长度
RemainderPosition:
db 78D ;x 坐标
dB 43D ;y 坐标
VMOs:
db 03D ;留言条目数量
;---------------------------------------------------
Patch Ends
End |
|