mr10aic.asm

来自「"DIGITAL SIGNAL PROCESSING WITH C AND TH」· 汇编 代码 · 共 830 行 · 第 1/4 页

ASM
830
字号
          LDI     63, RC              ;63 -> RC
          RPTB    RPTB13_E            ;REPEAT BLOCK
            LDI     @IC_ADDR, AR1       ;INTRPLTR COEFF ADDRESS  -> AR1
            LDF     *AR7++, R3          ;SUMMED SAMPLE -> R3
            STF     R3, *AR2++%         ;STORE SMPL IN INTRPLTR 7'S INPUT BFFR
            CALL    INTRPLTR            ;RUN 2:1 INTERPOLATION -> R3
            STF     R3, *AR6++          ;STORE OUTPUT TO BUFFER
            CALL    INTRPLTR            ;RUN 2:1 INTERPOLATION -> R3
RPTB13_E    STF     R3, *AR6++          ;STORE OUTPUT TO BUFFER
          LDI     @I7P_ADDR, AR3      ;INTRPLTR 7'S PNTR ADDRESS -> AR3
          STI     AR2, *AR3           ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 8
          LDI     8, IR1              ;BAND # -> IR1            ==DEBUG==
          CALL    RST_WBFR            ;RESET BUFFERS TO TOP
          LDI     F_LENGTH, BK        ;FILTER LENGTH -> BK
          LDI     @PNTR_F8, AR2       ;FILTER 8'S LAST DATA ADDR -> AR2
          LDI     127, RC             ;127 -> RC
          RPTB    RPTB14_E            ;REPEAT BLOCK
            LDI     @F8C_ADDR, AR1      ;FILTER 8'S COEFF ADDRESS -> AR1
            CALL    FILTER              ;RUN FIR FILTER SUBROUTINE -> R3
            ADDF    *AR6, R3            ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB14_E    STF     R3, *AR6++          ;STORE SUMMED SAMPLE BACK IN BUFFER
          LDI     @F8P_ADDR, AR3      ;FILTER 8'S POINTER ADDRESS -> AR3
          STI     AR2, *AR3           ;STORE FILTER 8'S CURRENT DATA ADDRESS
          CALL    RST_WBFR            ;RESET BUFFER TO TOP
          LDI     I_LENGTH, BK        ;INTRPLTR LENGTH -> BK
          LDI     @PNTR_I8, AR2       ;INTRPLTR 8'S LAST DATA ADDR -> AR2
          LDI     127, RC             ;127 -> RC
          RPTB    RPTB15_E            ;REPEAT BLOCK
            LDI     @IC_ADDR, AR1       ;INTRPLTR COEFF ADDRESS  -> AR1
            LDF     *AR6++, R3          ;SUMMED SAMPLE -> R3
            STF     R3, *AR2++%         ;STORE SMPL IN INTRPLTR 8'S INPUT BFFR
            CALL    INTRPLTR            ;RUN 2:1 INTERPOLATION -> R3
            STF     R3, *AR7++          ;STORE OUTPUT TO BUFFER
            CALL    INTRPLTR            ;RUN 2:1 INTERPOLATION -> R3
RPTB15_E    STF     R3, *AR7++          ;STORE OUTPUT TO BUFFER
          LDI     @I8P_ADDR, AR3      ;INTRPLTR 8'S PNTR ADDRESS -> AR3
          STI     AR2, *AR3           ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 9
          LDI     9, IR1              ;BAND # -> IR1            ==DEBUG==
          CALL    RST_WBFR            ;RESET BUFFERS TO TOP
          LDI     F_LENGTH, BK        ;FILTER LENGTH -> BK
          LDI     @PNTR_F9, AR2       ;FILTER 9'S LAST DATA ADDR -> AR2
          LDI     255, RC             ;255 -> RC
          RPTB    RPTB16_E            ;REPEAT BLOCK
            LDI     @F9C_ADDR, AR1      ;FILTER 9'S COEFF ADDRESS -> AR1
            CALL    FILTER              ;RUN FIR FILTER SUBROUTINE -> R3
            ADDF    *AR7, R3            ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB16_E    STF     R3, *AR7++          ;STORE SUMMED SAMPLE BACK IN BUFFER
          LDI     @F9P_ADDR, AR3      ;FILTER 9'S POINTER ADDRESS -> AR3
          STI     AR2, *AR3           ;STORE FILTER 9'S CURRENT DATA ADDRESS
          CALL    RST_WBFR            ;RESET BUFFER TO TOP
          LDI     I_LENGTH, BK        ;INTRPLTR LENGTH -> BK
          LDI     @PNTR_I9, AR2       ;INTRPLTR 9'S LAST DATA ADDR -> AR2
          LDI     255, RC             ;255 -> RC
          RPTB    RPTB17_E            ;REPEAT BLOCK
            LDI     @IC_ADDR, AR1       ;INTRPLTR COEFF ADDRESS  -> AR1
            LDF     *AR7++, R3          ;SUMMED SAMPLE -> R3
            STF     R3, *AR2++%         ;STORE SMPL IN INTRPLTR 8'S INPUT BFFR
            CALL    INTRPLTR            ;RUN 2:1 INTERPOLATION -> R3
            STF     R3, *AR6++          ;STORE OUTPUT TO BUFFER
            CALL    INTRPLTR            ;RUN 2:1 INTERPOLATION -> R3
RPTB17_E    STF     R3, *AR6++          ;STORE OUTPUT TO BUFFER
          LDI     @I9P_ADDR, AR3      ;INTRPLTR 9'S PNTR ADDRESS -> AR3
          STI     AR2, *AR3           ;STORE CURRENT INTRPLTR DATA ADDRESS
;band 10
          LDI     10, IR1             ;BAND # -> IR1            ==DEBUG==
          CALL    RST_WBFR            ;RESET BUFFERS TO TOP
          LDI     F_LENGTH, BK        ;FILTER LENGTH -> BK
          LDI     @PNTR_F0, AR2       ;FILTER 10'S LAST DATA ADDR -> AR2
          LDI     511, RC             ;511 -> RC
          RPTB    RPTB18_E            ;REPEAT BLOCK
            LDI     @F0C_ADDR, AR1      ;FILTER 10'S COEFF ADDRESS -> AR1
            CALL    FILTER              ;RUN FIR FILTER SUBROUTINE -> R3
            ADDF    *AR6, R3            ;ADD LAST BAND'S SMPL TO LATEST SMPL
RPTB18_E    STF     R3, *AR6++          ;STORE SUMMED SAMPLE BACK IN BUFFER
          LDI     @F0P_ADDR, AR3      ;FILTER 10'S POINTER ADDRESS -> AR3
          STI     AR2, *AR3           ;STORE FILTER 10'S CURRENT DATA ADDRESS
;finished filling up next output buffer
;wait for current output buffer to empty
          LDF     0.0, R1             ;CLEAR REG                ==DEBUG==
          LDF     0.0, R2             ;CLEAR REG                ==DEBUG==
          LDF     0.0, R3             ;CLEAR REG                ==DEBUG==
          LDF     0.0, R4             ;CLEAR REG                ==DEBUG==
          LDI     512, R5             ;LOAD REG                 ==DEBUG==
          LDI     15, IR1             ;INDICATES FINISHED       ==DEBUG==
WAIT      IDLE                        ;WAIT FOR INTERRUPT
          SUBI3   R5, IR0, R7         ;CHECK IF OUTPUT CNTR = 256
          BNZ     WAIT                ;IF NOT GOTO WAIT
;current output buffer empty,
;switch output sample pointer to new output buffer
          LDI     0, IR0              ;RESET OUTPUT COUNTER
          LDI     1, R5               ;1 --> R5
          AND     R6, R5              ;MASK BIT 1 OF R6 (NONDESTRUCTIVE)
          BZ      SWITCH              ;IF ZERO BRANCH TO SWITCH
          ADDI    1, R6               ;INCREMENT BUFFER STATUS REG
          BRD     PROCESS             ;DELAYED BRANCH BACK TO PROCESS
          LDI     @B1_ADDR, AR5       ;BUFFER #1 STARTING ADDR -> AR5
          LDI     @B2_ADDR, AR6       ;BUFFER #2 STARTING ADDR -> AR6
          LDI     @B3_ADDR, AR7       ;BUFFER #3 STARTING ADDR -> AR7
SWITCH    ADDI    1, R6               ;INCREMENT BUFFER STATUS REG
          BRD     PROCESS             ;DELAYED BRANCH BACK TO PROCESS
          LDI     @B2_ADDR, AR5       ;BUFFER #2 STARTING ADDR -> AR5
          LDI     @B1_ADDR, AR6       ;BUFFER #1 STARTING ADDR -> AR6
          LDI     @B3_ADDR, AR7       ;BUFFER #3 STARTING ADDR -> AR7
;*****************************************************************************
;*                                SUBROUTINES                                *
;*****************************************************************************

;*****************************************************************************
;*      RST_WBFR               RESETS BUFFERS TO TOP ADDRESSES               *
;*****************************************************************************
;reset working buffers
RST_WBFR  PUSH    ST                  ;PUSH ST REG TO TOP OF STACK
          LDI     1, R5               ;1 --> R5
          AND     R6, R5              ;MASK BIT 1 OF R6 (NONDESTRUCTIVE)
          BNZ     CHANGE              ;IF NOT ZERO BRANCH TO CHANGE
          BRD     RETURN              ;DELAYED BRANCH TO RETURN
          LDI     @B2_ADDR, AR6       ;BUFFER #2 STARTING ADDR -> AR6
          LDI     @B3_ADDR, AR7       ;BUFFER #3 STARTING ADDR -> AR7
          POP     ST                  ;POP LAST ST REG FROM STACK
CHANGE    LDI     @B1_ADDR, AR6       ;BUFFER #1 STARTING ADDR -> AR6
          LDI     @B3_ADDR, AR7       ;BUFFER #3 STARTING ADDR -> AR7
          POP     ST                  ;POP LAST ST REG FROM STACK
RETURN    OR      2000h, ST           ;MAKE SURE GIE BIT REMAINS SET
          RETS
;*****************************************************************************
;*      FILTER                 GENERATES RANDOM NOISE --> FIR FILTER --> R3  *
;*****************************************************************************
;generate noise sample, store into filter's input buffer, run fir filter
FILTER    PUSH    ST                  ;PUSH CURRENT ST REG TO TOP OF STACK
          PUSH    RC                  ;PUSH CURRENT RC REG TO TOP OF STACK
          PUSH    RS                  ;PUSH CURRENT RS REG TO TOP OF STACK
          PUSH    RE                  ;PUSH CURRENT RE REG TO TOP OF STACK
;generate noise sample
          LDI     0, R1               ;INIT R1=0
          LDI     R0, R2              ;PUT SEED IN R2
          LSH     -17, R2             ;MOVE BIT 17 TO LSB     ->R2
          ADDI    R2, R1              ;ADD BIT (17)           ->R1
          LSH     -11, R2             ;MOVE BIT 28 TO LSB     ->R2
          ADDI    R2, R1              ;ADD BITS (28+17)       ->R1
          LSH     -2, R2              ;MOVE BIT 30 TO LSB     ->R2
          ADDI    R2, R1              ;ADD BITS (30+28+17)    ->R1
          LSH     -1, R2              ;MOVE BIT 31 TO LSB     ->R2
          ADDI    R2, R1              ;ADD BITS (31+30+28+17) ->R1
          AND     1, R1               ;MASK LSB OF R1
          LDIZ    @MINUS, R2          ;IF R1 = 0, R2 = @MINUS
          LDINZ   @PLUS, R2           ;IF R1 = 1, R2 = @PLUS
          LSH     1, R0               ;SHIFT SEED LEFT BY 1
          OR      R1, R0              ;R1 (FEEDBACK BIT) --> LSB OF R0 (SEED)
;store noise sample into filter's input buffer
          FLOAT   R2, R1              ;FLOAT R2 -> R1
          STF     R1, *AR2++%         ;STORE R1 INTO FILTER'S INPUT BUFFER
;run fir filter
          LDF     0.0, R1             ;INIT R1=0
          LDF     0.0, R3             ;INIT R3=0
          LDI     F_LENGTH-1, RC      ;LOAD FILTER LENGTH INTO REPEAT COUNTER
          RPTB    RPT_END1            ;NEXT 2 INSTRUCTIONS F_LENGTH TIMES
RPT_END1    MPYF3   *AR1++, *AR2++%, R1 ;H(N-1-i)*x(n-(N-1-i))),i=0..N-1
||          ADDF3   R1, R3, R3          ;IN // WITH ACC -> R3
          ADDF3   R1, R3, R3          ;ADD LAST PRODUCT = Y(n) -> R3
          POP     RE                  ;POP LAST RE REG FROM STACK
          POP     RS                  ;POP LAST RS REG FROM STACK
          POP     RC                  ;POP LAST RC REG FROM STACK
          POP     ST                  ;POP LAST ST REG FROM STACK
          OR      2000h, ST           ;MAKE SURE GIE BIT REMAINS SET
          RETS
;*****************************************************************************
;*      INTRPLTR               INTERPOLATOR FIR FILTER --> R3                *
;*****************************************************************************
INTRPLTR  PUSH    ST                  ;PUSH CURRENT ST REG TO TOP OF STACK
          PUSH    RC                  ;PUSH CURRENT RC REG TO TOP OF STACK
          PUSH    RS                  ;PUSH CURRENT RS REG TO TOP OF STACK
          PUSH    RE                  ;PUSH CURRENT RE REG TO TOP OF STACK
          LDF     0.0, R1             ;INIT R1=0
          LDF     0.0, R3             ;INIT R3=0
          LDI     I_LENGTH-1, RC      ;LOAD INTRPLTR LENGTH INTO REPEAT COUNTER
          RPTB    RPT_END2            ;NEXT 2 INSTRUCTIONS I_LENGTH TIMES
RPT_END2    MPYF3   *AR1++, *AR2++%, R1 ;H(N-1-i)*x(n-(N-1-i))),i=0..N-1
||          ADDF3   R1, R3, R3          ;IN // WITH ACC -> R3
          ADDF3   R1, R3, R3          ;ADD LAST PRODUCT = Y(n) -> R3
          POP     RE                  ;POP LAST RE REG FROM STACK
          POP     RS                  ;POP LAST RS REG FROM STACK
          POP     RC                  ;POP LAST RC REG FROM STACK
          POP     ST                  ;POP LAST ST REG FROM STACK
          OR      2000h, ST           ;MAKE SURE GIE BIT REMAINS SET
          RETS
;*****************************************************************************
;*      ISR                    INTERRUPT SERVICE ROUTINE - OUTPUTS SAMPLE    *
;*****************************************************************************
ISR       PUSH    ST                  ;PUSH ST REG TO STACK
          PUSH    IE                  ;PUSH IE REG TO STACK
          LDF     *AR5++, R4          ;GET SAMPLE FROM OUTPUT BUFFER
          FIX     R4, R7              ;R7=INTEGER(R4)
          PUSH    R6                  ;SAVE R6 (AICIO_I CHANGES R6)
          CALL    AICIO_I             ;OUTPUT R7 AND INPUT R6 (AIC)
          POP     R6                  ;RESTORE R6
          ADDI    1, IR0              ;INCREMENT OUTPUT COUNTER
          POP     IE                  ;POP LAST IE REG FROM STACK
          POP     ST                  ;POP LAST ST REG FROM STACK
          OR      2000h, ST           ;MAKE SURE GIE BIT REMAINS SET
          RETI                        ;RETURN FROM INTERRUPT
          .end                        ;END


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?