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