📄 spk208.s
字号:
xld.w %r10, TMCTRL16_1
ld.b [%r10],%r11 // Timer16_1 stop
xld.w %r10, PRESC16_1
ld.b [%r10],%r11 // stop prescaler
xld.w %r10,TIMER16_1_IMASK
bclr [%r10],0x06 // disable comparison B intr.
bclr [%r10],0x07 // disable comparison A intr.
xld.w %r11, PWM_DUTY_9BIT // for 9bit PWM
xld.w %r10,COMPARE_B16_1
ld.h [%r10],%r11 // Reload value for timer fine mode
xld.w %r11,0x0
xld.w %r10,COMPARE_A16_1
ld.h [%r10],%r11 // first PWM output data
xld.w %r11,0x8
xld.w %r10,PRESC16_1
ld.b [%r10],%r11 // prescaler clock on, 1/1
xld.w %r10,TMCTRL16_1 // set Timer16
bset [%r10],6 // fine mode on
bset [%r10],5 // comparison buffer on
bset [%r10],4 // output invert
bset [%r10],2 // output
bset [%r10],1 // reset
bset [%r10],0 // run
xld.w %r10,P2_FUNCTION_SELECT
bset [%r10],0x3 // P port change to timer output
//
// PWM start TM0 Sub
//
ld.w %r11,0x00
xld.w %r10, TMCTRL16_0
ld.b [%r10],%r11 // Timer16_0 stop
xld.w %r10, PRESC16_0
ld.b [%r10],%r11 // stop prescaler
xld.w %r10,TIMER16_0_IMASK
bclr [%r10],0x02 // disable comparison B intr.
bclr [%r10],0x03 // disable comparison A intr.
xld.w %r11, PWM_DUTY_9BIT // for 9bit PWM
xld.w %r10,COMPARE_B16_0
ld.h [%r10],%r11 // Reload value 0x101 for timer fine mode
xld.w %r11,0x0
xld.w %r10,COMPARE_A16_0
ld.h [%r10],%r11 // first PWM output data
xld.w %r11,0x8
xld.w %r10,PRESC16_0
ld.b [%r10],%r11 // prescaler clock on, 1/1
xld.w %r10,TMCTRL16_0 // set Timer16
bset [%r10],6 // fine mode on
bset [%r10],5 // comparison buffer on
bset [%r10],4 // output invert
bset [%r10],2 // output
bset [%r10],1 // reset
bset [%r10],0 // run
xld.w %r10,P2_FUNCTION_SELECT
bset [%r10],0x2 // P port change to timer output
xld.h [SPK_SAMPLERATE],%r7
xld.w [SPK_SAMPLE_CHANGE_BUF],%r6 // buffer init SpkParams
xld.w %r12,COMPARE_A16_1 // set argument
xld.w %r13,PWM_DUTY_9BIT
xcall SpkSoftOpen
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// void SpkOpen_2(BYTE *SpkParams, int ReloadValue)
////// dose not destroy r6 - r9
////// for 15bit PWM stereo
//////
SpkOpen_2:
xcall SpkOpen_1
//
// PWM start TM3
//
ld.w %r11,0x00
xld.w %r10, TMCTRL16_3
ld.b [%r10],%r11 // Timer16_2 stop
xld.w %r10, PRESC16_3
ld.b [%r10],%r11 // stop prescaler
xld.w %r11, PWM_DUTY_9BIT // for 9bit PWM
xld.w %r10,COMPARE_B16_3
ld.h [%r10],%r11 // Reload value 0x101 for timer fine mode
xld.w %r11,0x0
xld.w %r10,COMPARE_A16_3
ld.h [%r10],%r11 // first PWM output data
xld.w %r11,0x8
xld.w %r10,PRESC16_3
ld.b [%r10],%r11 // prescaler clock on, 1/1
xld.w %r10,TMCTRL16_3 // set Timer16
bset [%r10],6 // fine mode on
bset [%r10],5 // comparison buffer on
bset [%r10],4 // output invert
bset [%r10],2 // output
bset [%r10],1 // reset
bset [%r10],0 // run
xld.w %r10,P2_FUNCTION_SELECT
bset [%r10],0x5 // P port change to timer output
//
// PWM start TM4
//
ld.w %r11,0x00
xld.w %r10, TMCTRL16_4
ld.b [%r10],%r11 // Timer16_4 stop
xld.w %r10, PRESC16_4
ld.b [%r10],%r11 // stop prescaler
xld.w %r11, PWM_DUTY_9BIT // for 9bit PWM
xld.w %r10,COMPARE_B16_4
ld.h [%r10],%r11 // Reload value 0x101 for timer fine mode
xld.w %r11,0x0
xld.w %r10,COMPARE_A16_4
ld.h [%r10],%r11 // first PWM output data
xld.w %r11,0x8
xld.w %r10,PRESC16_4
ld.b [%r10],%r11 // prescaler clock on, 1/1
xld.w %r10,TMCTRL16_4 // set Timer16
bset [%r10],6 // fine mode on
bset [%r10],5 // comparison buffer on
bset [%r10],4 // output invert
bset [%r10],2 // output
bset [%r10],1 // reset
bset [%r10],0 // run
xld.w %r10,P2_FUNCTION_SELECT
bset [%r10],0x6 // P port change to timer output
xld.h [SPK_SAMPLERATE],%r7
xld.w [SPK_SAMPLE_CHANGE_BUF],%r6 // buffer init SpkParams
xld.w %r12,COMPARE_A16_3 // set argument
xld.w %r13,PWM_DUTY_9BIT
xcall SpkSoftOpen
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// void SpkOpen_0(BYTE *SpkParams, int ReloadValue)
////// dose not destroy r6 - r9
////// for 9bit PWM
SpkOpen_4:
xcall SpkSetTimer5 // set trigger timer
//
// PWM start TM1
//
ld.w %r11,0x00
xld.w %r10, TMCTRL16_1
ld.b [%r10],%r11 // Timer16_1 stop
xld.w %r10, PRESC16_1
ld.b [%r10],%r11 // stop prescaler
xld.w %r10,TIMER16_1_IMASK
bclr [%r10],0x06 // disable comparison B intr.
bclr [%r10],0x07 // disable comparison A intr.
xld.w %r11, PWM_DUTY_9BIT // for 9bit PWM
xld.w %r10,COMPARE_B16_1
ld.h [%r10],%r11 // Reload value for timer fine mode
xld.w %r11,0x0
xld.w %r10,COMPARE_A16_1
ld.h [%r10],%r11 // first PWM output data
xld.w %r11,0x8
xld.w %r10,PRESC16_1
ld.b [%r10],%r11 // prescaler clock on, 1/1
xld.w %r10,TMCTRL16_1 // set Timer16
bset [%r10],6 // fine mode on
bset [%r10],5 // comparison buffer on
bset [%r10],4 // output invert
bset [%r10],2 // output
bset [%r10],1 // reset
bset [%r10],0 // run
xld.w %r10,P2_FUNCTION_SELECT
bset [%r10],0x3 // P port change to timer output
xld.h [SPK_SAMPLERATE],%r7
xld.w [SPK_SAMPLE_CHANGE_BUF],%r6 // buffer init SpkParams
xld.w %r12,COMPARE_A16_1 // set argument
xld.w %r13,PWM_DUTY_9BIT
xcall SpkSoftOpen
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkClose_0
//////
SpkClose_0:
xld.w %r12,COMPARE_A16_1 // set argument
xcall SpkSoftClose
// Stop PWM output TM1
ld.w %r11,0x0
xld.w %r10,TMCTRL16_1
ld.b [%r10],%r11 // stop Timer
xld.w %r10,PRESC16_1
ld.b [%r10],%r11 // stop Prescaler
xld.w %r10,P2_FUNCTION_SELECT
xbclr [%r10],0x3 // P port change to P23 output
ret.d
ld.w %r4,BOOL_SUCCESS
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkClose_1
//////
SpkClose_1:
xld.w %r12,COMPARE_A16_1 // set argument
xcall SpkSoftClose
// Stop PWM output TM1
ld.w %r11,0x0
xld.w %r10,TMCTRL16_1
ld.b [%r10],%r11 // stop Timer
xld.w %r10,PRESC16_1
ld.b [%r10],%r11 // stop Prescaler
xld.w %r10,P2_FUNCTION_SELECT
xbclr [%r10],0x3 // P port change to P23 output
// Stop PWM output TM0
xld.w %r10,TMCTRL16_0
ld.b [%r10],%r11 // stop Timer
xld.w %r10,PRESC16_0
ld.b [%r10],%r11 // stop Prescaler
xld.w %r10,P2_FUNCTION_SELECT
xbclr [%r10],0x2 // P port change to outputt
ret.d
ld.w %r4,BOOL_SUCCESS
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkClose_2
//////
SpkClose_2:
xcall SpkClose_1
xld.w %r12,COMPARE_A16_3 // set argument
xcall SpkSoftClose
// Stop PWM output TM3
ld.w %r11,0x0
xld.w %r10,TMCTRL16_3
ld.b [%r10],%r11 // stop Timer
xld.w %r10,PRESC16_3
ld.b [%r10],%r11 // stop Prescaler
xld.w %r10,P2_FUNCTION_SELECT
xbclr [%r10],0x5 // P port change to output
// Stop PWM output TM4
xld.w %r10,TMCTRL16_4
ld.b [%r10],%r11 // stop Timer
xld.w %r10,PRESC16_4
ld.b [%r10],%r11 // stop Prescaler
xld.w %r10,P2_FUNCTION_SELECT
xbclr [%r10],0x6 // P port change to output
ret.d
ld.w %r4,BOOL_SUCCESS
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkSoftening, SpkSoftOpen, SpkSoftClose
////// Set speak soft start and end time.
////// Speaker on and off delay time is following.
////// Delay time is (1/sampling_rate*2) * SPK_SOFTENING * (output_bit / 2) msec
//////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.section .bss
.align 2
SPK_SOFTENING:
.zero 2
.text
SpkSoftening:
xld.h [SPK_SOFTENING],%r6
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SpkTimerStart:
xld.w %r11,0x09
xld.w %r10,PRESC16_5
ld.b [%r10],%r11 // Run prescaler 1/2
xld.w %r10,TMCTRL16_5
bset [%r10],1 // timer reset
bset [%r10],0 // timer run
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SpkTimerEnd:
ld.w %r11,0x0
xld.w %r10,TMCTRL16_5
ld.b [%r10],%r11 // stop Timer
xld.w %r10,PRESC16_5
ld.b [%r10],%r11 // stop Prescaler
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// argument
// %r12 = PWM output port address TMx
// %r13 = CENTER_DATA of output bit
SpkSoftOpen:
xld.h %r4,[SPK_SOFTENING]
cmp %r4,0x00
jreq SpkSoftStartEnd
xcall SpkTimerStart
ld.w %r11,0x00 // %r5 is counter
xld.w %r10,TIMER16_5_IFLAG
xld.w %r5,0xf0
ld.b [%r10],%r5 // clear Underflow
SpkSoftStart:
ld.h [%r12],%r11 // output data
xld.h %r4,[SPK_SOFTENING]
SpkSoftStartLoop:
btst [%r10],0x06
jreq SpkSoftStartLoop
ld.b [%r10],%r5 // clear Underflow
sub %r4,0x01
jrgt SpkSoftStartLoop
cmp %r11,%r13
jrlt.d SpkSoftStart
add %r11,0x01
xcall SpkTimerEnd
SpkSoftStartEnd:
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// argument
// %r12 = PWM output port address TMx
SpkSoftClose:
xcall SpkTimerStart
ld.uh %r13,[%r12]
cmp %r13,0x00
jreq.d SpkSoftShutdownEnd
xld.w %r10,TIMER16_5_IFLAG
xld.w %r5,0xf0
ld.b [%r10],%r5 // clear Underflow
SpkSoftShutdown:
ld.h [%r12],%r13 // output data
xld.h %r4,[SPK_SOFTENING]
SpkSoftShutdownLoop:
btst [%r10],0x06
jreq SpkSoftShutdownLoop
ld.b [%r10],%r5 // clear Underflow
sub %r4,0x01
jrgt SpkSoftShutdownLoop
//
sub %r13,0x01
jrge SpkSoftShutdown
SpkSoftShutdownEnd:
xcall SpkTimerEnd
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -