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 + -
显示快捷键?