⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft.asm

📁 TMS320C3X 汇编语言程序编译环境
💻 ASM
📖 第 1 页 / 共 2 页
字号:

         .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 + -