mr10mcr.asm

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

ASM
407
字号
          LDI     F_LENGTH-1, RC      ;LENGTH-1 -> RC
          RPTB    RPTB1_E             ;REPEAT BLOCK ("LENGTH" TIMES)
            LDF     0.0, R6             ;CLEAR R6
            LDF     *AR1++(1), R3       ;LOW 1/3 FLTR COEFF -> R3
            MPYF    R0, R3              ;COEFF * SCALE VALUE -> R3
            LDF     *AR2++(1), R4       ;MID 1/3 FLTR COEFF -> R4
            MPYF    R1, R4              ;COEFF * SCALE VALUE -> R4
            LDF     *AR3++(1), R5       ;UPR 1/3 FLTR COEFF -> R5
            MPYF    R2, R5              ;COEFF * SCALE VALUE -> R5
            ADDF3   R3, R4, R6          ;ADD R3 + R4 -> R6
            ADDF    R5, R6              ;ADD R5 + R6 -> R6
RPTB1_E     STF     R6, *AR4++(1)       ;STORE RESULTS
          SUBI    1, R7               ;DECREMENT LOOP COUNTER (R7-1)
          BNZ     LOOP                ;BRANCH ON NOT ZERO TO LOOP

                                      ;MOVE INTRPLTR COEFFS FROM
                                      ;SRAM TO INTERNAL RAM
          LDI     INTR_01, AR0        ;AR0=ADDR OF INTR COEFF IN SRAM
          LDI     @INTC_ADR, AR1      ;AR1=ADDR OF INTR COEFF IN RAM
          LDF     *AR0, R0
          RPTS    I_LENGTH+I_LENGTH-2
            LDF     *++AR0, R0
||          STF     R0, *AR1++
          STF     R0, *AR1
;*****************************************************************************
;*                  CLEAR INPUTS FOR ALL FILTERS AND INTRPLTRS               *
;*    AR0 = FILTER & INTRPLTR INPUT ADDRESS           R0 = 0                 *
;*    NOTE: CLEAR ALL INPUT DATA LOCATIONS FOR EACH FILTER/INTRPLTR          *
;*          (10 FLTRS x 64 LOCATIONS) + (9 INTPLTRS x 16 LOCATIONS)          *
;*****************************************************************************
          LDF     0.0, R0             ;CLEAR R0
          LDI     @FLTI_ADR, AR0      ;ADDR OF FLTRS INPUT DATA -> AR0
          RPTS    10*64+9*16          ;REPEAT CNTR = SIZE OF ALL INPUT BUFFERS
            STF     R0, *AR0++(1)        ;STORE R0 INTO CURRENT ADDRESS
;*****************************************************************************
;*     STORE STARTING DATA ADDRS INTO POINTER ADDR FOR ALL FLTRS/INTPLTRS    *
;*   AR0 = FILTER AND INTRPLTR INPUT DATA AND COEFFS ADDRESSES               *
;*   AR1 = FILTER AND INTRPLTR POINTER STORAGE ADDRESSES                     *
;*****************************************************************************
          LDI     @FC_PNTR, AR1       ;PNTR STORAGE ADDRESS
          LDI     @FLTC_ADR, AR0      ;FILTER COEFF ADDRESS
          LDI     9, RC
          RPTB    RPTB2_E
            STI     AR0, *AR1++
RPTB2_E     ADDI    41, AR0
          LDI     @FLTI_ADR, AR0      ;FILTER INPUT ADDRESS
          LDI     9, RC
          RPTB    RPTB3_E
            STI     AR0, *AR1++
RPTB3_E     ADDI    64, AR0
          LDI     @INTC_ADR, AR0      ;INTRPLTR COEFF ADDRESS
          STI     AR0, *AR1++
          LDI     @INTI_ADR, AR0      ;INTRPLTR INPUT ADDRESS
          LDI     8, RC
          RPTB    RPTB3
            STI     AR0, *AR1++
RPTB3       ADDI    16, AR0
;*****************************************************************************
;*                      MAIN PROCESSING INITIALIZATION                       *
;*****************************************************************************
SET_UP    LDI     @SEED, R0           ;NOISE SEED VALUE -> R0
          LDI     0,R6                ;CLEAR BUFFER
          CALL    AICSET_I            ;INIT AIC
                                      ;NOTE: 1st time thru output buffer => 0
;*****************************************************************************
;*                              MAIN PROCESSING                              *
;*    AR0 = D/A OUTPUT ADDRESS           R0 = SEED FOR RND NOISE GENERATOR   *
;*    AR1 = FLTR & INTRP INPUT DATA PNTR R1 = WORKING REG (USED IN FLTR SUB) *
;*    AR2 = FLTR & INTRP COEFF PNTR      R2 = WORKING REG (USED IN FLTR SUB) *
;*    AR3 = STORAGE PNTR                 R3 = OUTPUT SMPL FROM FILT/INTRPLTR *
;*    AR4 = USED FOR REPEAT LOOPS        R4 = NOT USED                       *
;*    AR5 = WORKING BUFFER POINTER       R5 = WORKING REG                    *
;*    AR6 = WORKING BUFFER POINTER       R6 = BUFFER STATUS REG              *
;*    AR7 = OUTPUT BUFFER POINTER        R7 = OUTPUT SAMPLE                  *
;*                                      IR0 = OUTPUT CNTR (0-512)            *
;*                                      IR1 = INDICATES LAST BAND# COMPLETED *
;*****************************************************************************
PROCESS   LDI     0, IR0              ;****BEGIN PROCESSING****
          LDI     0, IR1              ;SET REGS TO DEFAULT VALUES
          LDI     1, AR4
          LDI     0, RC
	  RST_WBFR
	  LDF     0.0, R5
	  STF     R5, *AR5
          LDI     1, R5
          AND     R6, R5
          BNZ     SETAR7_2
SETAR7_1  LDI     @B1_ADR, AR7
          BR      PROCLOOP
SETAR7_2  LDI     @B2_ADR, AR7

PROCLOOP  RST_WBFR                    ;BEGIN PROCESSING LOOP
          LDI     @FI_PNTR, AR3
          LDI     *+AR3(IR1), AR1
          LDI     F_LENGTH, BK
          LDI     1, R4
          SUBI3   R4, AR4, RC
F_REPEAT  RPTB    RPTB_E1
            LDI     @FC_PNTR, AR3
            LDI     *+AR3(IR1), AR2
            NOISE                       ;RETURNS NOISE SAMPLE IN R2
            FLOAT   R2, R1
            STF     R1, *AR1++%         ;STORE NOISE SAMPLE IN FILTER INPUT
            CALL    FILTER              ;RETURNS FILTERED DATA IN R3
            ADDF    *AR5, R3            ;SUM PREVIOUS BAND'S SAMPLE
RPTB_E1     STF     R3, *AR5++          ;STORE RESULTS
          LDI     @FI_PNTR, AR3
          STI     AR1, *+AR3(IR1) 
          RST_WBFR
          CMPI    9, IR1                ;IF THIS IS BAND 10 THEN BRANCH TO EXIT
          BZ      EXIT                  ;     (INTERPOLATION NOT NEEDED)
          LDI     @II_PNTR, AR3
          LDI     *+AR3(IR1), AR1
          LDI     I_LENGTH, BK
          LDI     1, R4
          SUBI3   R4, AR4, RC
I_REPEAT  RPTB    RPTB_E2
            LDI     @IC_PNTR, AR3
            LDI     *AR3, AR2
            LDF     *AR5++, R3
            STF     R3, *AR1++%
            CALL    INTRPLTR
            STF     R3, *AR6++
            CALL    INTRPLTR
RPTB_E2     STF     R3, *AR6++
          LDI     @II_PNTR, AR3
          BD      PROCLOOP
          STI     AR1, *+AR3(IR1) 
          ADDI    1, IR1
          LSH     1, AR4

EXIT      ADDI    1, IR1
          LDI     512, R5
                                     ;finished filling up next output buffer
                                     ;wait for current output buffer to empty
WAIT      IDLE
          CMPI    R5, IR0
          BNZ     WAIT
          ADDI    1, R6
          B       PROCESS
;*****************************************************************************
;*                        SUBROUTINES DEFINED BELOW                          *
;*****************************************************************************
FILTER    PUSH    ST
	  PUSH    RC
	  PUSH    RS
	  PUSH    RE
          LDF     0.0,R1
          LDF     0.0,R3
          LDI     F_LENGTH-1, RC
          RPTB    RPT_FLT
RPT_FLT     MPYF3   *AR1++%,*AR2++,R1
||          ADDF3   R1,R3,R3
          ADDF3   R1,R3,R3
	  POP     RE
	  POP     RS
	  POP     RC
	  POP     ST
	  OR      2000h, ST
          RETS

INTRPLTR  PUSH    ST
	  PUSH    RC
	  PUSH    RS
	  PUSH    RE
          LDF     0.0, R1
          LDF     0.0, R3
          LDI     I_LENGTH-1, RC
          RPTB    RPTB_I?
RPTB_I?     MPYF3   *AR1++%, *AR2++, R1
       ||   ADDF3   R1, R3, R3
          ADDF3   R1, R3, R3
	  POP     RE
	  POP     RS
	  POP     RC
	  POP     ST
          OR      2000h, ST
          RETS
;*****************************************************************************
;*      ISR                    INTERRUPT SERVICE ROUTINE - OUTPUTS SAMPLE    *
;*****************************************************************************
ISR       PUSH    ST                  ;PUSH ST REG TO STACK
          PUSH    IE                  ;PUSH IE REG TO STACK
          PUSH    R4                  ;PUSH R4 REG TO STACK
          LDF     *AR7++, R4          ;GET SAMPLE FROM OUTPUT BUFFER
          MPYF    @SCALER,R4          ;SCALE OUTPUT SAMPLE
          FIX     R4, R7              ;R7=INTEGER(R4)
          PUSH    R6                  ;SAVE R6
          CALL    AICIO_I             ;CALL AIC I/O ROUTINE
          POP     R6                  ;RESTORE R6
          ADDI    1, IR0              ;INCREMENT OUTPUT COUNTER
          POP     R4                  ;POP LAST R4 REG FROM STACK
          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





⌨️ 快捷键说明

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