📄 fft.asm
字号:
.globl FFT ; Entry point for execution
.globl N ; FFT size
.globl M ; LOG2(N)
.globl SINE ; Address of sine table
.globl SINE
.globl N
.globl M
.global start,INIT,BEGIN
N .set 256
M .set 8
.data
MASK .word 0FFFFFFFFH
BLK0 .word 0809800H ; 片内1K×32bit RAM块0起始地址
BLK1 .word 0809C00H ; 片内1K×32bit RAM块1起始地址
STCK .word 0809F00H ; 堆栈起始地址
CTRL .word 0808000H ; Pointer for peripheral±bus memory map
DMACTL .word 0000000H ; Init for DMA control (0)
TIM0CTL .word 0000000H ; Init of timer 0 control (32)
TIM1CTL .word 0000000H ; Init of timer 1 control (48)
SERGLOB0 .word 0000000H ; Init of serial 0 glbl control (64)
SERPRTX0 .word 0000000H ; Init of serial 0 xmt port control (66)
SERPRTR0 .word 0000000H ; Init of serial 0 rcv port control (67)
SERTIM0 .word 0000000H ; Init of serial 0 timer control (68)
SERGLOB1 .word 0000000H ; Init of serial 1 glbl control (80)
SERPRTX1 .word 0000000H ; Init of serial 1 xmt port control (82)
SERPRTR1 .word 0000000H ; Init of serial 1 rcv port control (83)
SERTIM1 .word 0000000H ; Init of serial 1 timer control (84)
PARINT .word 0000000H ; Init of parallel interface control (100)
IOINT .word 0000000H ; Init of I/O interface control (96)
.sect "vectors"; Named section
start .word INIT ; load address INIT to PC
.space 63 ; Reserved space
.text
FFTSIZ .WORD N
LOGFFT .WORD M
SINTAB .WORD SINE
INPUT .WORD INP
INIT: LDP 0,DP ; Point the DP register to page 0
LDI 1800H,ST ; Clear and enable cache, and disable OVM
LDI @MASK,IE ; Unmask all interrupts
LDI @BLK0,AR0 ; AR0 points to block 0
LDI @BLK1,AR1 ; AR1 points to block 1
LDF 0.0,R0 ; 0 register R0
RPTS 1023 ; Repeat 1024 times ...
STF R0,*AR0++(1) ; Zero out location in RAM block 0 and ...
|| STF R0,*AR1++(1) ; Zero out location in RAM block 1
LDI @CTRL,AR0 ; Load in AR0 the pointer to control registers
LDI @DMACTL,R0
STI R0,*+AR0(0) ; Init DMA control
LDI @TIM0CTL,R0
STI R0,*+AR0(32) ; Init timer 0 control
LDI @TIM1CTL,R0
STI R0,*+AR0(48) ; Init timer 1 control
LDI @SERGLOB0,R0
STI R0,*+AR0(64) ; Init serial 0 global control
LDI @SERPRTX0,R0
STI R0,*+AR0(66) ; Init serial 0 xmt control
LDI @SERPRTR0,R0
STI R0,*+AR0(67) ; Init serial 0 rcv control
LDI @SERTIM0,R0
STI R0,*+AR0(68) ; Init serial 0 timer control
LDI @SERGLOB1,R0
STI R0,*+AR0(80) ; Init serial 1 global control
LDI @SERPRTX1,R0
STI R0,*+AR0(82) ; Init serial 1 xmt control
LDI @SERPRTR1,R0
STI R0,*+AR0(83) ; Init serial 1 rcv control
LDI @SERTIM1,R0
STI R0,*+AR0(84) ; Init serial 1 timer control
LDI @PARINT,R0
STI R0,*+AR0(100) ; Init parallel interface control (C30 only)
LDI @IOINT,R0
STI R0,*+AR0(96) ; Init I/O interface control
LDI @STCK,SP ; Init the stack pointer
OR 2000H,ST ; Global interrupt enable
LDI 0,R0
LDI -1,R1
LDI @INPUT,AR0
LDI @INPUT,AR1
ADDI 1,AR1
LDI 127,RC
LDI 2,IR0
RPTB D_IN
NEGI R1
D_IN: STF R0,*AR0++(IR0) ;
|| STF R1,*AR1++(IR0) ;
CALL FFT
BR $; Branch to itself at the end
FFT: LDP FFTSIZ ; Command to load data page pointer
LDI @FFTSIZ,RC;RC=N
LDI RC,IR0
LSH -1,IR0; IR1 = N/2, HALF THE SIZE OF FFT
SUBI 1,RC;RC should be one less than desired
LDI @INPUT,AR0
LDI AR0,AR1
LDI RC,BK
RPTB BITRV
CMPI AR1,AR0
BGE CONT
LDF *AR0,R0
|| LDF *AR1,R1
STF R0,*AR1
|| STF R1,*AR0
CONT NOP *AR0++
BITRV NOP *AR1++(IR0)B
*length-two butterfiles
LDI @ INPUT,AR0 ; AR0 POINTS TO X(I)
LDI IR0,RC ;REPEAT N/2 TIMES
SUBI 1,RC ; RC should be one less than desired #
RPTB BLK_1
ADDF *+AR0,*AR0++,R0 ; R0 = X(I)+X(I+1)
SUBF *AR0,*-AR0,R1 ; R1 = X(I)-X(I+1)
BLK_1: STF R0,*-AR0; X(I) = X(I)+X(I+1)
|| STF R1,*AR0++; X(I+1) = X(I)-X(I+1)
*FIRST PASS OF THE DO-2 LOOP
LDI @INPUT,AR0
LDI 2,IR0
LDI @FFTSIZ,RC
LSH -2,RC
SUBI 1,RC
RPTB BLK_2
ADDF *+AR0(IR0),*AR0++(IR0),R0 ;R0=X(I)+X(I+2)
SUBF *AR0,*-AR0(IR0),R1 ;R0=X(I)-X(I+2)
NEGF *+AR0,R0
|| STF R0,*-AR0(IR0) ; X(I) = -(X(I)+X(I+2))
BLK_2: STF R1,*AR0++(IR0) ; X(I+2) = X(I)-X(I+2)
||STF R0,*+AR0 ; X(I+3) =-X(I+3)
*MAIN LOOP(FFT STAGE)
LDI @FFTSIZ,IR0
LSH -2,IR0
LDI 3,R5 ;CURRENT STAGE NO.
LDI 1,R4 ;R4=N4
LDI 2,R3 ;R3=N2
LOO: LSH -1,IR0 ;E=E/2
LSH 1,R4 ;N4=N4*2
LSH 1,R3 ;N2=N2*2
*INNER LOOP
LDI @INPUT,AR5 ;AR5 POINTS TO X(I)
INLOP: LDI IR0,AR0
ADDI @SINTAB,AR0;AR0 POINTS TO SIN/COS TABLE
LDI R4,IR1 ;IR1=N4
LDI AR5,AR1
ADDI 1,AR1 ;AR1 POINTS TO X(I1)=X(I+J)
LDI AR1,AR3
ADDI R3,AR3 ;AR3 POINTS TO X(I3)=X(I+J+N2)
LDI AR3,AR2
SUBI 2,AR2 ;AR2 POINTS TO X(I2)=X(I-J+N2)
ADDI R3,AR2,AR4 ;AR4 POINTS TO X(I4)=X(I-J+N1)
LDF *AR5++(IR1),R0 ;R0=X(I)
ADDF *+AR5(IR1),R0,R1;R1=X(I)+X(I+N2)
SUBF R0,*++AR5(IR0),R0;R0=-X(I)+X(I+N2)
|| STF R1,*-AR5(IR1) ;X(I)=X(I)+X(I+N2)
NEGF R0
NEGF *++AR5(IR1),R1 ;
|| STF R0,*AR5
STF R1,*AR5
*INNERMOST LOOP
LDI @FFTSIZ,IR1
LSH -2,IR1
LDI R4,RC
SUBI 2,RC
RPTB BLK_3
MPYF *AR3,*+AR0(IR1),R0 ;X(I3)*COS
MPYF *AR4,*AR0,R1 ;X(I4)*SIN
MPYF *AR4,*+AR0(IR1),R1
|| ADDF R0,R1,R2 ;X(I3)*COS+X(I4)*SIN
MPYF *AR3,*AR0++(IR0),R0 ;X(I3)*SIN
SUBF R0,R1,R0 ;-X(I3)*SIN+X(I4)*COS
SUBF *AR2,R0,R1 ;-X(I2)+R0
ADDF *AR2,R0,R1 ;X(I2)+R0
|| STF R1,*AR3++ ;X(I4)=X(I2)+R0
ADDF *AR1,R2,R1 ;X(I1)-R2
|| STF R1,*AR4-- ;X(I1)=X(I1)+R2
SUBF R2,*AR1,R1
|| STF R1,*AR1++ ;X(I2)=X(I1)-R2
BLK_3: STF R1,*AR2--
SUBI @INPUT,AR5
ADDI R3,AR5 ;AR5=I+N1
CMPI @FFTSIZ,AR5
BLED INLOP ;BAK TO INNER LOOP
ADDI @INPUT,AR5
NOP
NOP
ADDI 1,R5
CMPI @LOGFFT,R5
BLE LOO
RETS
.data
SINE
.float 0.00000000000000
.float 0.02454122852291
.float 0.04906767432742
.float 0.07356456359967
.float 0.09801714032956
.float 0.12241067519922
.float 0.14673047445536
.float 0.17096188876030
.float 0.19509032201613
.float 0.21910124015687
.float 0.24298017990326
.float 0.26671275747490
.float 0.29028467725446
.float 0.31368174039889
.float 0.33688985339222
.float 0.35989503653499
.float 0.38268343236509
.float 0.40524131400499
.float 0.42755509343028
.float 0.44961132965461
.float 0.47139673682600
.float 0.49289819222978
.float 0.51410274419322
.float 0.53499761988710
.float 0.55557023301960
.float 0.57580819141785
.float 0.59569930449243
.float 0.61523159058063
.float 0.63439328416365
.float 0.65317284295378
.float 0.67155895484702
.float 0.68954054473707
.float 0.70710678118655
.float 0.72424708295147
.float 0.74095112535496
.float 0.75720884650648
.float 0.77301045336274
.float 0.78834642762661
.float 0.80320753148064
.float 0.81758481315158
.float 0.83146961230255
.float 0.84485356524971
.float 0.85772861000027
.float 0.87008699110871
.float 0.88192126434835
.float 0.89322430119552
.float 0.90398929312344
.float 0.91420975570353
.float 0.92387953251129
.float 0.93299279883474
.float 0.94154406518302
.float 0.94952818059304
.float 0.95694033573221
.float 0.96377606579544
.float 0.97003125319454
.float 0.97570213003853
.float 0.98078528040323
.float 0.98527764238894
.float 0.98917650996478
.float 0.99247953459871
.float 0.99518472667220
.float 0.99729045667869
.float 0.99879545620517
.float 0.99969881869620
.float 1.00000000000000
.float 0.99969881869620
.float 0.99879545620517
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -