mr10aic.asm
来自「"DIGITAL SIGNAL PROCESSING WITH C AND TH」· 汇编 代码 · 共 830 行 · 第 1/4 页
ASM
830 行
LDI @I3D_ADDR, AR1 ;INTRPLTR 3 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
LDI @I4D_ADDR, AR1 ;INTRPLTR 4 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
LDI @I5D_ADDR, AR1 ;INTRPLTR 5 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
LDI @I6D_ADDR, AR1 ;INTRPLTR 6 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
LDI @I7D_ADDR, AR1 ;INTRPLTR 7 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
LDI @I8D_ADDR, AR1 ;INTRPLTR 8 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
LDI @I9D_ADDR, AR1 ;INTRPLTR 9 DATA ADDRESS -> AR1
STI AR1, *AR0++ ;STORE AR1 -> AR0++
;*****************************************************************************
;* MAIN PROCESSING INITIALIZATION *
;*****************************************************************************
SET_UP LDI @SEED, R0 ;NOISE SEED VALUE -> R0
LDI @B1_ADDR, AR5 ;BUFFER #1 STARTING ADDR -> AR5
LDI 0, R6 ;CLEAR BUFFER STATUS REG
LDI 0, IR0 ;CLEAR OUTPUT COUNTER
CALL AICSET ;SET UP AIC
LDI @IE_REG, IE ;ENABLE XINT0 INTERRUPT
OR @ST_REG, ST ;SET STATUS REG (ENABLE GIE BIT)
;NOTE: 1st time thru output buffer => 0
;*****************************************************************************
;* MAIN PROCESSING *
;* AR0 = OUTPUT ADDRESS R0 = SEED FOR RND NOISE GENERATOR *
;* AR1 = FLTR & INTRPLTR COEFF PNTR R1 = WORKING REG (USED IN FLTR SUB) *
;* AR2 = INPUT SMPL BUFFER PNTR R2 = WORKING REG (USED IN FLTR SUB) *
;* AR3 = STORAGE ADDR FOR SMPL PNTR R3 = OUTPUT SMPL FROM FILT/INTRPLTR *
;* AR4 = NOT USED R4 = OUTPUT SAMPLE (FP) USED IN ISR *
;* AR5 = BUFFER [1-2] POINTER (512) R5 = WORKING REG *
;* AR6 = BUFFER [1-2] POINTER (512) R6 = BUFFER STATUS REG *
;* AR7 = BUFFER 3 POINTER (256) R7 = OUTPUT SAMPLE (INT) USED IN ISR*
;* IR0 = OUTPUT CNTR (0-512) *
;* IR1 = INDICATES CURRENT BAND # *
;*****************************************************************************
;band 1
PROCESS LDI 1, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @F1C_ADDR, AR1 ;FILTER 1'S COEFF ADDRESS -> AR1
LDI @PNTR_F1, AR2 ;FILTER 1'S LAST DATA ADDR -> AR2
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
LDI @F1P_ADDR, AR3 ;FILTER 1'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 1'S CURRENT DATA ADDRESS
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @IC_ADDR, AR1 ;INTRPLTR COEFF ADDRESS -> AR1
LDI @PNTR_I1, AR2 ;INTRPLTR 1'S LAST DATA ADDR -> AR2
STF R3, *AR2++% ;STORE SAMPLE IN INTRPLTR 1'S INPUT BFFR
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR6++ ;STORE OUTPUT TO BUFFER
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR6++ ;STORE OUTPUT TO BUFFER
LDI @I1P_ADDR, AR3 ;INTRPLTR 1'S PNTR ADDRESS -> AR3
STI AR2, *AR3 ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 2
LDI 2, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @PNTR_F2, AR2 ;FILTER 2'S LAST DATA ADDR -> AR2
LDI 1, RC ;1 -> RC
RPTB RPTB2_E ;REPEAT BLOCK
LDI @F2C_ADDR, AR1 ;FILTER 2'S COEFF ADDRESS -> AR1
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
ADDF *AR6, R3 ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB2_E STF R3, *AR6++ ;STORE SUMMED SAMPLE BACK IN BUFFER
LDI @F2P_ADDR, AR3 ;FILTER 2'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 2'S CURRENT DATA ADDRESS
CALL RST_WBFR ;RESET BUFFER TO TOP
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @PNTR_I2, AR2 ;INTRPLTR 2'S LAST DATA ADDR -> AR2
LDI 1, RC ;1 -> RC
RPTB RPTB3_E ;REPEAT BLOCK
LDI @IC_ADDR, AR1 ;INTRPLTR COEFF ADDRESS -> AR1
LDF *AR6++, R3 ;SUMMED SAMPLE -> R3
STF R3, *AR2++% ;STORE SMPL IN INTRPLTR 2'S INPUT BFFR
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR7++ ;STORE OUTPUT TO BUFFER
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
RPTB3_E STF R3, *AR7++ ;STORE OUTPUT TO BUFFER
LDI @I2P_ADDR, AR3 ;INTRPLTR 2'S PNTR ADDRESS -> AR3
STI AR2, *AR3 ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 3
LDI 3, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @PNTR_F3, AR2 ;FILTER 3'S LAST DATA ADDR -> AR2
LDI 3, RC ;3 -> RC
RPTB RPTB4_E ;REPEAT BLOCK
LDI @F3C_ADDR, AR1 ;FILTER 3'S COEFF ADDRESS -> AR1
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
ADDF *AR7, R3 ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB4_E STF R3, *AR7++ ;STORE SUMMED SAMPLE BACK IN BUFFER
LDI @F3P_ADDR, AR3 ;FILTER 3'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 3'S CURRENT DATA ADDRESS
CALL RST_WBFR ;RESET BUFFER TO TOP
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @PNTR_I3, AR2 ;INTRPLTR 3'S LAST DATA ADDR -> AR2
LDI 3, RC ;3 -> RC
RPTB RPTB5_E ;REPEAT BLOCK
LDI @IC_ADDR, AR1 ;INTRPLTR COEFF ADDRESS -> AR1
LDF *AR7++, R3 ;SUMMED SAMPLE -> R3
STF R3, *AR2++% ;STORE SMPL IN INTRPLTR 3'S INPUT BFFR
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR6++ ;STORE OUTPUT TO BUFFER
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
RPTB5_E STF R3, *AR6++ ;STORE OUTPUT TO BUFFER
LDI @I3P_ADDR, AR3 ;INTRPLTR 3'S PNTR ADDRESS -> AR3
STI AR2, *AR3 ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 4
LDI 4, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @PNTR_F4, AR2 ;FILTER 4'S LAST DATA ADDR -> AR2
LDI 7, RC ;7 -> RC
RPTB RPTB6_E ;REPEAT BLOCK
LDI @F4C_ADDR, AR1 ;FILTER 4'S COEFF ADDRESS -> AR1
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
ADDF *AR6, R3 ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB6_E STF R3, *AR6++ ;STORE SUMMED SAMPLE BACK IN BUFFER
LDI @F4P_ADDR, AR3 ;FILTER 4'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 4'S CURRENT DATA ADDRESS
CALL RST_WBFR ;RESET BUFFER TO TOP
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @PNTR_I4, AR2 ;INTRPLTR 4'S LAST DATA ADDR -> AR2
LDI 7, RC ;7 -> RC
RPTB RPTB7_E ;REPEAT BLOCK
LDI @IC_ADDR, AR1 ;INTRPLTR COEFF ADDRESS -> AR1
LDF *AR6++, R3 ;SUMMED SAMPLE -> R3
STF R3, *AR2++% ;STORE SMPL IN INTRPLTR 4'S INPUT BFFR
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR7++ ;STORE OUTPUT TO BUFFER
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
RPTB7_E STF R3, *AR7++ ;STORE OUTPUT TO BUFFER
LDI @I4P_ADDR, AR3 ;INTRPLTR 4'S PNTR ADDRESS -> AR3
STI AR2, *AR3 ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 5
LDI 5, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @PNTR_F5, AR2 ;FILTER 5'S LAST DATA ADDR -> AR2
LDI 15, RC ;15 -> RC
RPTB RPTB8_E ;REPEAT BLOCK
LDI @F5C_ADDR, AR1 ;FILTER 5'S COEFF ADDRESS -> AR1
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
ADDF *AR7, R3 ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB8_E STF R3, *AR7++ ;STORE SUMMED SAMPLE BACK IN BUFFER
LDI @F5P_ADDR, AR3 ;FILTER 5'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 5'S CURRENT DATA ADDRESS
CALL RST_WBFR ;RESET BUFFER TO TOP
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @PNTR_I5, AR2 ;INTRPLTR 5'S LAST DATA ADDR -> AR2
LDI 15, RC ;15 -> RC
RPTB RPTB9_E ;REPEAT BLOCK
LDI @IC_ADDR, AR1 ;INTRPLTR COEFF ADDRESS -> AR1
LDF *AR7++, R3 ;SUMMED SAMPLE -> R3
STF R3, *AR2++% ;STORE SMPL IN INTRPLTR 5'S INPUT BFFR
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR6++ ;STORE OUTPUT TO BUFFER
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
RPTB9_E STF R3, *AR6++ ;STORE OUTPUT TO BUFFER
LDI @I5P_ADDR, AR3 ;INTRPLTR 5'S PNTR ADDRESS -> AR3
STI AR2, *AR3 ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 6
LDI 6, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @PNTR_F6, AR2 ;FILTER 6'S LAST DATA ADDR -> AR2
LDI 31, RC ;31 -> RC
RPTB RPTB10_E ;REPEAT BLOCK
LDI @F6C_ADDR, AR1 ;FILTER 6'S COEFF ADDRESS -> AR1
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
ADDF *AR6, R3 ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB10_E STF R3, *AR6++ ;STORE SUMMED SAMPLE BACK IN BUFFER
LDI @F6P_ADDR, AR3 ;FILTER 6'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 6'S CURRENT DATA ADDRESS
CALL RST_WBFR ;RESs4 BUFFER TO TOP
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @PNTR_I6, AR2 ;INTRPLTR 6'S LAST DATA ADDR -> AR2
LDI 31, RC ;31 -> RC
RPTB RPTB11_E ;REPEAT BLOCK
LDI @IC_ADDR, AR1 ;INTRPLTR COEFF ADDRESS -> AR1
LDF *AR6++, R3 ;SUMMED SAMPLE -> R3
STF R3, *AR2++% ;STORE SMPL IN INTRPLTR 6'S INPUT BFFR
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
STF R3, *AR7++ ;STORE OUTPUT TO BUFFER
CALL INTRPLTR ;RUN 2:1 INTERPOLATION -> R3
RPTB11_E STF R3, *AR7++ ;STORE OUTPUT TO BUFFER
LDI @I6P_ADDR, AR3 ;INTRPLTR 6'S PNTR ADDRESS -> AR3
STI AR2, *AR3 ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 7
LDI 7, IR1 ;BAND # -> IR1 ==DEBUG==
CALL RST_WBFR ;RESET BUFFERS TO TOP
LDI F_LENGTH, BK ;FILTER LENGTH -> BK
LDI @PNTR_F7, AR2 ;FILTER 7'S LAST DATA ADDR -> AR2
LDI 63, RC ;63 -> RC
RPTB RPTB12_E ;REPEAT BLOCK
LDI @F7C_ADDR, AR1 ;FILTER 7'S COEFF ADDRESS -> AR1
CALL FILTER ;RUN FIR FILTER SUBROUTINE -> R3
ADDF *AR7, R3 ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB12_E STF R3, *AR7++ ;STORE SUMMED SAMPLE BACK IN BUFFER
LDI @F7P_ADDR, AR3 ;FILTER 7'S POINTER ADDRESS -> AR3
STI AR2, *AR3 ;STORE FILTER 7'S CURRENT DATA ADDRESS
CALL RST_WBFR ;RESET BUFFER TO TOP
LDI I_LENGTH, BK ;INTRPLTR LENGTH -> BK
LDI @PNTR_I7, AR2 ;INTRPLTR 7'S LAST DATA ADDR -> AR2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?