📄 cpt_generator.s
字号:
.global _CPT_Generator
.extern _TONES_TAB
// .extern TONES_TAB
.extern _offset_dial
.extern _offset_ringback
.extern _offset_busy_reorder
.text
_CPT_Generator:
lea -48(a7), a7
movem.l d1-d6/a0-a5, (a7)
move.l 52(a7), d1 //index
cmp_0:
cmpi.l #0, d1 //judge if it is dial tone
bne cmp_1
lea _offset_dial, a0
bra tone_judge
cmp_1:
cmpi.l #1, d1 //judge if it is ringback tone
bne cmp_2
lea _offset_ringback, a0
bra tone_judge
cmp_2: //it is busy tone or reorder tone
lea _offset_busy_reorder, a0
tone_judge:
move.l #0xA0, macsr
move.l #0, acc
move.l 56(a7), a4
move.l (a4), d1 //burst_duration
cmpi.l #0, d1
beq silence_judge
subi.l #1,d1
move.l d1, (a4)
bra tone_generation
silence_judge:
move.l 60(a7), a4
move.l (a4), d1 //silent_duration
subi.l #1,d1
move.l d1, (a4)
bra silence_generation
tone_generation:
lea _TONES_TAB, a1
low_tone:
move.w 10(a0), d1 //d1 contains the offset of
//low frequency in _TONES_TAB
ext.l d1
move.l a1, a2
add.l d1, a2
move.l (a2)+, d2 //d2 contains coswt
move.l (a2), d3 //d3 contains y[n-1]
move.l 4(a2), d4 //d4 contains y[n-2]
mac.l d3, d2, acc //calculate coswt*y[n-1]
move.l acc, d5
move.l #0, acc
move.l (a2)+, (a2) //store y[n-1] in y[n-2]
asr.l #1, d4 //d4=1/2y[n-2]
sub.l d4, d5 //d5=coswt*y[n-1]-1/2y[n-2]
asl.l #1, d5 //d5=2coswt*y[n-1]-y[n-2]
move.l d5, -(a2)
high_tone:
move.w 12(a0), d1 //d1 contains the offset of
//high frequency in _TONES_TAB
ext.l d1
move.l a1, a2
add.l d1, a2
move.l (a2)+, d2 //d2 contains coswt
move.l (a2), d3 //d3 contains y[n-1]
move.l 4(a2), d4 //d4 contains y[n-2]
mac.l d3, d2, acc //calculate coswt*y[n-1]
move.l acc, d6
move.l #0, acc
move.l (a2)+, (a2) //store y[n-1] in y[n-2]
asr.l #1, d4 //d4=1/2y[n-2]
sub.l d4, d6 //d6=coswt*y[n-1]-1/2y[n-2]
asl.l #1, d6 //d6=2coswt*y[n-1]-y[n-2]
move.l d6, -(a2)
add_twotones:
add.l d5, d6
swap.w d6
ext.l d6
move.l d6, d0
bra restore
silence_generation:
nop
nop
nop //add 3 nop instruction
move.l #0, d0 //to possess cpu clock
restore:
movem.l (a7), d1-d6/a0-a5
lea 48(a7), a7
rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -