📄 voice2k.asm
字号:
;===============================================
; Usages : r0 = NN (sentence index)
; V_Sentence2kIndex = r0
; call F_PlaySentence2k
; Function: play 2k sentence
; Input : V_Sentence2kIndex
; Output :
;===============================================
F_PlaySentence2k:
call F_StopAllVoice ;首先停止所有声音
r1 = V_Sentence2kIndex
r1 = sl r1
r0 = T_Sentence2k ;取Sentence的高低地址
r0 = r0+r1
ix0 = r0
r0 = T_Sentence2k$h
r1 = 0
r0 = r0+r1+c
ix0bk = r0
;= r0 = ROM(ix0,1)
r0 = ROM(ix0)
call SP_IncIX0Ptr
V_Sentence2kPtrLo = r0
r0 = ROM(ix0)
V_Sentence2kPtrHi = r0
r0 = V_SoundFlag ;置声音已播放标志
r0 = BSET.B_2kIsPlaying r0 ;;;;2k声音正在播放
r0 = BSET.B_VoicePlay r0 ;;;;有声音在播放
V_SoundFlag = r0
ret
;===============================================
; Function: Use in T1 irq
; Input :
; Output :
;===============================================
F_ContinueSentence2k:
r1 = V_SoundFlag
r0 = BTST.B_2kIsPlaying r1
jeq @@EndContinueSentence2k
cjp1 @@EndContinueSentence2k ;;;;;;if the ch-1(12Kbps)is playing jump to
cjp2k @@EndContinueSentence2k
r0 = BTST.B_MulteFlag r1 ;;;;;
jne @@CheckMulteEnd ;;;;判断静音完否 =1 跳到@@CheckMulteEnd
@ContinuePlay: ;一个Voice播完后及静音完后,播下个Voice
play_tail
resets
r0 = V_Sentence2kPtrLo ;;;;;;
ix0 = r0
r0 = V_Sentence2kPtrHi ;;;;;;
ix0bk = r0
;= r0 = ROM(ix0,1)
r0 = ROM(ix0) ;;;;;;取表格T_Sentence2k的值指向真正的句子组合
call SP_IncIX0Ptr
;= r1 = 0xffff
;= r1 = r1-r0
;= r1 = r0+1
r1 = NONE ;;;;;NONE = 0Xffff
r1 = r0-r1
jne @@NotReachSentenceEnd
call F_StopAllVoice ;;;;;;停止播放所有的声音
@@EndContinueSentence2k:
ret
@@NotReachSentenceEnd:
r1 = ix0 ; Sentence2kPtr++
V_Sentence2kPtrLo = r1 ;;;;ix0 存放的是表格低位地址
r1 = ix0bk
V_Sentence2kPtrHi = r1 ;;;;;ix0bk表格高位地址
r1 = BTST.B_MulteDataFlag r0
jne @@SetMulteStart
r0 = sl r0 ; r0*2
V_2kTemp0 = r0
r1 = T_VoiceIndex2k ;根据voice的索引,得到Voice的数据地址
x0 = r0+r1 ;;;;
ix0 = x0
r1 = T_VoiceIndex2k$h
r0 = 0
r1 = r0+r1+C
ix0bk = r1 ;;;;16位的高地址--》ix0bk
;= r0 = ROM(ix0,1)
r0 = ROM(ix0)
call SP_IncIX0Ptr
V_Voice2kPtrLo = r0
r0 = ROM(ix0)
V_Voice2kPtrHi = r0
play_head
freq 8000 ;set voice sample rate
push rambk
call @@_play_12kbps_call_1 ;播放声音程序
push rambk
r0 = 6
rambk = r0
x0 = V_Voice2kPtrHi
y0 = V_Voice2kPtrLo
pop rambk
speech_add_tb = x0
speech_add_t = y0
pop rambk
ret
@@SetMulteStart: ;播放静音
r0 = BCLR.B_MulteDataFlag r0
V_MulteTimeLength = r0
play_tail
resets
r0 = V_SoundFlag
r0 = BSET.B_MulteFlag r0
V_SoundFlag = r0
M_ResetDownTime B_DownTime7ms2 ;设置静音定时器
ret
@@CheckMulteEnd:
x0 = V_MulteTimeLength ;设置静音定时器的时间长度
call F_DownTime7ms2 ;;;;;7ms延时
M_TestDownTime B_DownTime7ms2
jeq @@ExitMulte
r0 = V_SoundFlag
r0 = BCLR.B_MulteFlag r0 ;;;;;
V_SoundFlag = r0
jmp @ContinuePlay
@@ExitMulte:
ret
;===============================================
; Function: Get the status of 2k
; Usages : call F_Sentence2kStatus
; jeq/jne Labelxx
;===============================================
F_Sentence2kStatus:
r0 = V_SoundFlag
r0 = BTST.B_2kIsPlaying r0
ret
;===============================================
; Function: To stop all voice, include 2k, 12k, dualtone, 4 channel
; Input :
; Output :
;===============================================
F_StopAllVoice:
r0 = 0
V_SoundFlag = r0
stop_v
play_tail
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -