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