mr10mcr.asm

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

ASM
407
字号
;MR10MCR.ASM-10-BAND MULTIRATE FILTER USING THE AIC
          .title  "MR10MCR.ASM"       ;10-BAND WITH MACROS
          .option X                   ;FOR XREF
          .global NOISE, FILTER, INTRPLTR, RST_WBFR
          .global BEGIN, LOOP, SET_UP, PROCESS, SETAR7_1, SETAR7_2
          .global PROCLOOP, F_REPEAT, I_REPEAT, EXIT, WAIT
          .global AICSEC,AICSET_I,AICIO_I
          .sect   "VECTORS"           ;ASSEMBLE INTO VECTOR SECTION
RESET     .word   BEGIN               ;RESET VECTOR
          .space  4                   ;SKIP 4 WORDS
TIMER0    .word   ISR                 ;TINT0 VECTOR LOCATION @ 5h
          .space  58                  ;REMAINDER OF VECTOR SECTION
;*****************************************************************************
;*   MACRO DEFINITIONS BELOW                                                 *
;*****************************************************************************
RST_WBFR  $MACRO                      ;MACRO TO PING-PONG WORKING BUFFERS
          LDI     1, R5
          AND     R6, R5
          BNZ     SWITCH?
          LDI     1, R5
          AND     IR1, R5
          BNZ     CHNG_1?
          BD      CONT?
          LDI     @B3_ADR, AR5
          LDI     @B2_ADR, AR6
          NOP
CHNG_1?   BD      CONT?
          LDI     @B2_ADR, AR5
          LDI     @B3_ADR, AR6
          NOP
SWITCH?   LDI     1, R5
          AND     IR1, R5
          BNZ     CHNG_2?
          BD      CONT?
          LDI     @B3_ADR, AR5
          LDI     @B1_ADR, AR6
          NOP
CHNG_2?   BD      CONT?
          LDI     @B1_ADR, AR5
          LDI     @B3_ADR, AR6
          NOP
CONT?     NOP
          $ENDM

NOISE     $MACRO                      ;****RANDOM NOISE GENERATOR****
          LDI     0,R4                ;CLEAR R4
          LDI     R0,R2               ;PUT SEED IN R2
          LSH     -17,R2              ;MOVE BIT 17 TO LSB
          ADDI    R2,R4               ;ADD TO R4 (17)
          LSH     -11,R2              ;MOVE BIT 28 TO LSB
          ADDI    R2,R4               ;ADD TO R4 (28+17)
          LSH     -2,R2               ;MOVE BIT 30 TO LSB
          ADDI    R2,R4               ;ADD TO R4 (30+(28+17))
          LSH     -1,R2               ;MOVE BIT 31 TO LSB
          ADDI    R2,R4               ;ADD TO R4 (31+(30+(28+17)))
          AND     1,R4                ;MASK LSB OF R4
          LDIZ    @MINUS,R2           ;IF R4 = 0     R2 = MINUS VALUE
          LDINZ   @PLUS,R2            ;IF R4 = 1     R2 = PLUS VALUE
          LSH     1,R0                ;SHIFT SEED LEFT 1
          OR      R4,R0               ;PUT R4 INTO LSB OF R0 (SEED)
          $ENDM
;*****************************************************************************
;*   THIS SECTION DEFINES MEMORY FOR SCALE VALUES, COEFFS, ETC.              *
;*****************************************************************************
          .data                       ;ASSEMBLE INTO DATA SECTION
SCALE_1   .float  0.0, 0.0, 0.0       ;FILTER SCALE VALUES  (LOW, MID, UPPER)
SCALE_2   .float  0.0, 0.0, 0.0
SCALE_3   .float  0.0, 0.0, 0.0
SCALE_4   .float  0.0, 0.0, 0.0
SCALE_5   .float  0.0, 0.0, 0.0
SCALE_6   .float  0.0, 0.0, 0.0
SCALE_7   .float  0.0, 0.0, 0.0
SCALE_8   .float  0.0, 0.0, 0.0
SCALE_9   .float  0.0, 0.0, 0.0
SCALE_10  .float  0.0, 1.0, 0.0
                                      ;LOW 1/3 OCTAVE COEFFICIENTS #40 TO #0
LFILT_40  .float  0.000000000,  0.000000000,  0.001861572,  0.009765625
          .float  0.004577636, -0.007446289, -0.005493164, -0.000274658
          .float -0.015899658, -0.019592285,  0.037536621,  0.089355468
          .float  0.005004882, -0.159637451, -0.143707275,  0.124420166
          .float  0.299743652,  0.065185546, -0.322631835, -0.308929443
          .float  0.140655517,  0.421447753,  0.140655517, -0.308929443
          .float -0.322631835,  0.065185546,  0.299743652,  0.124420166
          .float -0.143707275, -0.159637451,  0.005004882,  0.089355468
          .float  0.037536621, -0.019592285, -0.015899658, -0.000274658
          .float -0.005493164, -0.007446289,  0.004577636,  0.009765625
LFILT_0   .float  0.001861572
                                      ;MID 1/3 OCTAVE COEFF 40
MFILT_40  .float -0.001342773, -0.000488281, -0.003692626,  0.003509521
          .float  0.009277343, -0.004486083, -0.007781982,  0.000396728
          .float -0.011413574,  0.009765625,  0.057342529, -0.023529052
          .float -0.131866455,  0.035247802,  0.225738525, -0.038635253
          .float -0.319488525,  0.030212402,  0.389099121, -0.011444091
          .float -0.414855957, -0.011444091,  0.389099121,  0.030212402
          .float -0.319488525, -0.038635253,  0.225738525,  0.035247802
          .float -0.131866455, -0.023529052,  0.057342529,  0.009765625
          .float -0.011413574,  0.000396728, -0.007781982, -0.004486083
          .float  0.009277343,  0.003509521, -0.003692626, -0.000488281
MFILT_0   .float -0.001342773
                                     ;UPPER 1/3 OCTAVE COEFFICIENTS #40 TO #0
UFILT_40  .float  0.001953125, -0.003295898, -0.000396728,  0.001861572
          .float  0.001007080,  0.003356933, -0.010589599,  0.002441406
          .float  0.006927490,  0.003692626,  0.006896972, -0.064880371
          .float  0.055999755,  0.110687255, -0.229766845,  0.020507812
          .float  0.334716796, -0.306884764, -0.166229248,  0.463836669
          .float -0.166229248, -0.306884764,  0.334716796,  0.020507812
          .float -0.229766845,  0.110687255,  0.055999755, -0.064880371
          .float  0.006896972,  0.003692626,  0.006927490,  0.002441406
          .float -0.010589599,  0.003356933,  0.001007080,  0.001861572
          .float -0.000396728, -0.003295898,  0.001953125,  0.000000000
UFILT_0   .float  0.000000000
                                      ;INTRPLTR COEFFICIENTS 1,3,...,21
INTR_01   .float  0.012542724, -0.034423828,  0.079803466, -0.180267334
          .float  0.625427246,  0.625427246, -0.180267334,  0.079803466
          .float -0.034423828,  0.012542724,  0.000000000
                                      ;INTRPLTR COEFFICIENTS 0,2,...,20
INTR_00   .float  0.007263183, -0.012023925,  0.019012451, -0.025939941
          .float  0.030700683,  0.967346191,  0.030700683, -0.025939941
          .float  0.019012451, -0.012023925,  0.007263183
FLT1_IN   .usect  "F_DATA", 64        ;START OF FILTER'S INPUT SAMPLES
FLT2_IN   .usect  "F_DATA", 64
FLT3_IN   .usect  "F_DATA", 64
FLT4_IN   .usect  "F_DATA", 64
FLT5_IN   .usect  "F_DATA", 64
FLT6_IN   .usect  "F_DATA", 64
FLT7_IN   .usect  "F_DATA", 64
FLT8_IN   .usect  "F_DATA", 64
FLT9_IN   .usect  "F_DATA", 64
FLT10_IN  .usect  "F_DATA", 64
INT1_IN   .usect  "I_DATA", 16        ;START OF INTRPLTR'S INPUT SAMPLES
INT2_IN   .usect  "I_DATA", 16
INT3_IN   .usect  "I_DATA", 16
INT4_IN   .usect  "I_DATA", 16
INT5_IN   .usect  "I_DATA", 16
INT6_IN   .usect  "I_DATA", 16
INT7_IN   .usect  "I_DATA", 16
INT8_IN   .usect  "I_DATA", 16
INT9_IN   .usect  "I_DATA", 16
          .bss    F1_COEFF, 41
          .bss    F2_COEFF, 41
          .bss    F3_COEFF, 41
          .bss    F4_COEFF, 41
          .bss    F5_COEFF, 41
          .bss    F6_COEFF, 41
          .bss    F7_COEFF, 41
          .bss    F8_COEFF, 41
          .bss    F9_COEFF, 41
          .bss    F10_COEFF, 41
          .bss    I_COEFF, 22
          .bss    BUFFER_3, 256
          .bss    FCP_STRG, 10
          .bss    FIP_STRG, 10
          .bss    ICP_STRG, 1
          .bss    IIP_STRG, 9
BUFFER_1  .float  0.0
          .space  511
BUFFER_2  .float  0.0
          .space  511
I_LENGTH  .set    11                  ;# OF INTRPLTR COEFFS
F_LENGTH  .set    41                  ;# OF FILTER COEFFS
STACKS    .word   809F00H             ;INIT STACK POINTER DATA
PLUS      .word   000001000H          ;POSITIVE LEVEL (+2^12)
MINUS     .word   0FFFFF000H          ;NEGATIVE LEVEL (-2^12)
SEED      .word   7E521603H           ;INITIAL SEED VALUE
AICSEC    .word   0E1CH,1h,4286H,67H  ;Fs=16234 Hz
SRAM_CNTL .word   808064H             ;PRIMARY BUS CONTROL REGISTER
FLTC_ADR  .word   F1_COEFF            ;POINTS TO START OF FILTER COEFFS
FLTI_ADR  .word   FLT1_IN             ;POINTS TO START OF FILTER INPUTS
INTC_ADR  .word   I_COEFF             ;POINTS TO START OF INTRPLTR COEFFS
INTI_ADR  .word   INT1_IN             ;POINTS TO START OF INTRPLTR INPUTS
B1_ADR    .word   BUFFER_1            ;POINTS TO START OF BUFFER #1
B2_ADR    .word   BUFFER_2            ;POINTS TO START OF BUFFER #2
B3_ADR    .word   BUFFER_3            ;POINTS TO START OF BUFFER #3
FC_PNTR   .word   FCP_STRG            ;POINTS TO START OF FLTR COEFF PNTRS
FI_PNTR   .word   FIP_STRG            ;POINTS TO START OF FLTR INPUT PNTRS
IC_PNTR   .word   ICP_STRG            ;POINTS TO START OF INTRPLTR COEFF PNTRS
II_PNTR   .word   IIP_STRG            ;POINTS TO START OF INTRPLTR INPUT PNTRS
SCALER    .float  0.25                ;OUTPUT SCALE FACTOR
;*****************************************************************************
;*                             INITIALIZATION                                *
;*****************************************************************************
          .text                       ;ASSEMBLE INTO TEXT SECTION
BEGIN     LDP     STACKS              ;INIT DATA PAGE
          LDI     @STACKS, SP         ;SP-> 809F00H
          LDI     -249, R0            ;0 WAIT STATE DATA
          LDI     @SRAM_CNTL, AR0     ;PRIMARY BUS CNTL REG => AR0
          AND     *AR0, R0            ;SET DESIRED BITS
          STI     R0, *AR0            ;REPLACE CONTENTS PRIMARY BUS CNTL REG
;*****************************************************************************
;*                           CREATE ADJUSTED COEFFS                           *
;*    AR0 = SCALE VALUES ADDRESS        AR3 = UPR 1/3 FLTR COEFF ADDR         *
;*    AR1 = LOW 1/3 FLTR COEFF ADDR     AR4 = ADJUSTED COEFF ADDR (10 SETS)   *
;*    AR2 = MID 1/3 FLTR COEFF ADDR     R7 = LOOP COUNTER 1 TO 10(10 FILTERS) *
;*    REGISTERS USED FOR CALCULATIONS: R0, R1, R2, R3, R4, R5, R6             *
;*****************************************************************************
          LDI     SCALE_1, AR0        ;1ST SCALE VALUE ADDR -> AR0
          LDI     @FLTC_ADR, AR4      ;ADJUSTED FLTR COEFFS STARTING ADDR -> AR4
          LDI     10, R7              ;SET LOOP COUNTER TO 10 (10 -> R7)
LOOP      LDI     LFILT_40, AR1       ;LOW 1/3 FLTR COEFFS ADDR -> AR1
          LDI     MFILT_40, AR2       ;MID 1/3 FLTR COEFFS ADDR -> AR2
          LDI     UFILT_40, AR3       ;UPR 1/3 FLTR COEFFS ADDR -> AR3
          LDF     *AR0++(1), R0       ;LOW 1/3 SCALE VALUE -> R0
          LDF     *AR0++(1), R1       ;MID 1/3 SCALE VALUE -> R1
          LDF     *AR0++(1), R2       ;UPR 1/3 SCALE VALUE -> R2

⌨️ 快捷键说明

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