📄 fft.lst
字号:
0001
0002 .globl FFT ; Entry point for execution
0003 .globl N ; FFT size
0004 .globl M ; LOG2(N)
0005 .globl SINE ; Address of sine table
0006 .globl SINE
0007 .globl N
0008 .globl M
0009 .global start,INIT,BEGIN
0010
0011
0012 00000100 N .set 256
0013 00000008 M .set 8
0014 000000 .data
0015 000000 ffffffff MASK .word 0FFFFFFFFH
0016 000001 00809800 BLK0 .word 0809800H ; 片内1K×32bit RAM块0起始地址
0017 000002 00809c00 BLK1 .word 0809C00H ; 片内1K×32bit RAM块1起始地址
0018 000003 00809f00 STCK .word 0809F00H ; 堆栈起始地址
0019 000004 00808000 CTRL .word 0808000H ; Pointer for peripheral±bus me
0020 000005 00000000 DMACTL .word 0000000H ; Init for DMA control (0)
0021 000006 00000000 TIM0CTL .word 0000000H ; Init of timer 0 control (32)
0022 000007 00000000 TIM1CTL .word 0000000H ; Init of timer 1 control (48)
0023 000008 00000000 SERGLOB0 .word 0000000H ; Init of serial 0 glbl control
0024 000009 00000000 SERPRTX0 .word 0000000H ; Init of serial 0 xmt port cont
0025 00000a 00000000 SERPRTR0 .word 0000000H ; Init of serial 0 rcv port cont
0026 00000b 00000000 SERTIM0 .word 0000000H ; Init of serial 0 timer control
0027 00000c 00000000 SERGLOB1 .word 0000000H ; Init of serial 1 glbl control
0028 00000d 00000000 SERPRTX1 .word 0000000H ; Init of serial 1 xmt port cont
0029 00000e 00000000 SERPRTR1 .word 0000000H ; Init of serial 1 rcv port cont
0030 00000f 00000000 SERTIM1 .word 0000000H ; Init of serial 1 timer control
0031 000010 00000000 PARINT .word 0000000H ; Init of parallel interface con
0032 000011 00000000 IOINT .word 0000000H ; Init of I/O interface control
0033
0034
0035 000000 .sect "vectors"; Named section
0036 000000 00000004' start .word INIT ; load address INIT to PC
0037 000001 00000000 .space 63 ; Reserved space
0038
0039 000000 .text
0040 000000 00000100 FFTSIZ .WORD N
0041 000001 00000008 LOGFFT .WORD M
0042 000002 00000012" SINTAB .WORD SINE
0043 000003 00000000+ INPUT .WORD INP
0044 000004 08700000 INIT: LDP 0,DP ; Point the DP register to page 0
0045 000005 08751800 LDI 1800H,ST ; Clear and enable cache, and disa
0046 000006 08360000+ LDI @MASK,IE ; Unmask all interrupts
0047 000007 08280001+ LDI @BLK0,AR0 ; AR0 points to block 0
0048 000008 08290002+ LDI @BLK1,AR1 ; AR1 points to block 1
0049 000009 07608000 LDF 0.0,R0 ; 0 register R0
0050 00000a 13fb03ff RPTS 1023 ; Repeat 1024 times ...
0051 00000b c0002120 STF R0,*AR0++(1) ; Zero out location in RAM blo
0052 || STF R0,*AR1++(1) ; Zero out location in RAM blo
0053 00000c 08280004+ LDI @CTRL,AR0 ; Load in AR0 the pointer to cont
0054 00000d 08200005+ LDI @DMACTL,R0
0055 00000e 15400000 STI R0,*+AR0(0) ; Init DMA control
0056 00000f 08200006+ LDI @TIM0CTL,R0
0057 000010 15400020 STI R0,*+AR0(32) ; Init timer 0 control
0058 000011 08200007+ LDI @TIM1CTL,R0
0059 000012 15400030 STI R0,*+AR0(48) ; Init timer 1 control
0060 000013 08200008+ LDI @SERGLOB0,R0
0061 000014 15400040 STI R0,*+AR0(64) ; Init serial 0 global control
0062 000015 08200009+ LDI @SERPRTX0,R0
0063 000016 15400042 STI R0,*+AR0(66) ; Init serial 0 xmt control
0064 000017 0820000a+ LDI @SERPRTR0,R0
0065 000018 15400043 STI R0,*+AR0(67) ; Init serial 0 rcv control
0066 000019 0820000b+ LDI @SERTIM0,R0
0067 00001a 15400044 STI R0,*+AR0(68) ; Init serial 0 timer control
0068 00001b 0820000c+ LDI @SERGLOB1,R0
0069 00001c 15400050 STI R0,*+AR0(80) ; Init serial 1 global control
0070 00001d 0820000d+ LDI @SERPRTX1,R0
0071 00001e 15400052 STI R0,*+AR0(82) ; Init serial 1 xmt control
0072 00001f 0820000e+ LDI @SERPRTR1,R0
0073 000020 15400053 STI R0,*+AR0(83) ; Init serial 1 rcv control
0074 000021 0820000f+ LDI @SERTIM1,R0
0075 000022 15400054 STI R0,*+AR0(84) ; Init serial 1 timer control
0076 000023 08200010+ LDI @PARINT,R0
0077 000024 15400064 STI R0,*+AR0(100) ; Init parallel interface control (
0078 000025 08200011+ LDI @IOINT,R0
0079 000026 15400060 STI R0,*+AR0(96) ; Init I/O interface control
0080 000027 08340003+ LDI @STCK,SP ; Init the stack pointer
0081 000028 10752000 OR 2000H,ST ; Global interrupt enable
0082 000029 08600000 LDI 0,R0
0083 00002a 0861ffff LDI -1,R1
0084 00002b 08280003+ LDI @INPUT,AR0
0085 00002c 08290003+ LDI @INPUT,AR1
0086 00002d 02690001 ADDI 1,AR1
0087 00002e 087b007f LDI 127,RC
0088 00002f 08710002 LDI 2,IR0
0089 000030 64000032+ RPTB D_IN
0090 000031 0c010001 NEGI R1
0091 000032 c0016160 D_IN: STF R0,*AR0++(IR0) ;
0092 || STF R1,*AR1++(IR0) ;
0093 000033 62000035+ CALL FFT
0094
0095
0096 000034 60000034 BR $; Branch to itself at the end
0097
0098 000035 08700000+ FFT: LDP FFTSIZ ; Command to load data page pointer
0099 000036 083b0000+ LDI @FFTSIZ,RC;RC=N
0100 000037 0811001b LDI RC,IR0
0101 000038 09f1ffff LSH -1,IR0; IR1 = N/2, HALF THE SIZE OF FFT
0102 000039 187b0001 SUBI 1,RC;RC should be one less than desired
0103 00003a 08280003+ LDI @INPUT,AR0
0104 00003b 08090008 LDI AR0,AR1
0105 00003c 0813001b LDI RC,BK
0106 00003d 64000043+ RPTB BITRV
0107 00003e 04880009 CMPI AR1,AR0
0108 00003f 6a0a0002 BGE CONT
0109 000040 c408c1c0 LDF *AR0,R0
0110 || LDF *AR1,R1
0111 000041 c001c0c1 STF R0,*AR1
0112 || STF R1,*AR0
0113 000042 0cc02001 CONT NOP *AR0++
0114 000043 0cc0c911 BITRV NOP *AR1++(IR0)B
0115 *length-two butterfiles
0116 000044 08280003+ LDI @ INPUT,AR0 ; AR0 POINTS TO X(I)
0117 000045 081b0011 LDI IR0,RC ;REPEAT N/2 TIMES
0118 000046 187b0001 SUBI 1,RC ; RC should be one less than desired #
0119 000047 6400004a+ RPTB BLK_1
0120 000048 20e02000 ADDF *+AR0,*AR0++,R0 ; R0 = X(I)+X(I+1)
0121 000049 26e108c0 SUBF *AR0,*-AR0,R1 ; R1 = X(I)-X(I+1)
0122 00004a c0012008 BLK_1: STF R0,*-AR0; X(I) = X(I)+X(I+1)
0123 || STF R1,*AR0++; X(I+1) = X(I)-X(I+1)
0124 *FIRST PASS OF THE DO-2 LOOP
0125 00004b 08280003+ LDI @INPUT,AR0
0126 00004c 08710002 LDI 2,IR0
0127 00004d 083b0000+ LDI @FFTSIZ,RC
0128 00004e 09fbfffe LSH -2,RC
0129 00004f 187b0001 SUBI 1,RC
0130 000050 64000054+ RPTB BLK_2
0131 000051 20e06040 ADDF *+AR0(IR0),*AR0++(IR0),R0 ;R0=X(I)+X(I+2)
0132 000052 26e148c0 SUBF *AR0,*-AR0(IR0),R1 ;R0=X(I)-X(I+2)
0133 000053 e2004800 NEGF *+AR0,R0
0134 || STF R0,*-AR0(IR0) ; X(I) = -(X(I)+X
0135 000054 c0400060 BLK_2: STF R1,*AR0++(IR0) ; X(I+2) = X(I)-X
0136 ||STF R0,*+AR0 ; X(I+3) =-X(I+3)
0137 *MAIN LOOP(FFT STAGE)
0138 000055 08310000+ LDI @FFTSIZ,IR0
0139 000056 09f1fffe LSH -2,IR0
0140 000057 08650003 LDI 3,R5 ;CURRENT STAGE NO.
0141 000058 08640001 LDI 1,R4 ;R4=N4
0142 000059 08630002 LDI 2,R3 ;R3=N2
0143 00005a 09f1ffff LOO: LSH -1,IR0 ;E=E/2
0144 00005b 09e40001 LSH 1,R4 ;N4=N4*2
0145 00005c 09e30001 LSH 1,R3 ;N2=N2*2
0146 *INNER LOOP
0147 00005d 082d0003+ LDI @INPUT,AR5 ;AR5 POINTS TO X(I)
0148 00005e 08080011 INLOP: LDI IR0,AR0
0149 00005f 02280002+ ADDI @SINTAB,AR0;AR0 POINTS TO SIN/COS TABLE
0150 000060 08120004 LDI R4,IR1 ;IR1=N4
0151 000061 0809000d LDI AR5,AR1
0152 000062 02690001 ADDI 1,AR1 ;AR1 POINTS TO X(I1)=X(I+J)
0153 000063 080b0009 LDI AR1,AR3
0154 000064 020b0003 ADDI R3,AR3 ;AR3 POINTS TO X(I3)=X(I+J+N2)
0155 000065 080a000b LDI AR3,AR2
0156 000066 186a0002 SUBI 2,AR2 ;AR2 POINTS TO X(I2)=X(I-J+N2)
0157 000067 210c0a03 ADDI R3,AR2,AR4 ;AR4 POINTS TO X(I4)=X(I-J+N1)
0158 000068 0740a512 LDF *AR5++(IR1),R0 ;R0=X(I)
0159 000069 20c10085 ADDF *+AR5(IR1),R0,R1;R1=X(I)+X(I+N2)
0160 00006a ea018d55 SUBF R0,*++AR5(IR0),R0;R0=-X(I)+X(I+N2)
0161 || STF R1,*-AR5(IR1) ;X(I)=X(I)+X(I+N2)
0162 00006b 0b800000 NEGF R0
0163 00006c e240c595 NEGF *++AR5(IR1),R1 ;
0164 || STF R0,*AR5
0165 00006d 1441c500 STF R1,*AR5
0166 *INNERMOST LOOP
0167 00006e 08320000+ LDI @FFTSIZ,IR1
0168 00006f 09f2fffe LSH -2,IR1
0169 000070 081b0004 LDI R4,RC
0170 000071 187b0002 SUBI 2,RC
0171 000072 6400007c+ RPTB BLK_3
0172 000073 24e080c3 MPYF *AR3,*+AR0(IR1),R0 ;X(I3)*COS
0173 000074 24e1c0c4 MPYF *AR4,*AR0,R1 ;X(I4)*SIN
0174 000075 808880c4 MPYF *AR4,*+AR0(IR1),R1
0175 || ADDF R0,R1,R2 ;X(I3)*COS+X(I4)*SI
0176 000076 24e060c3 MPYF *AR3,*AR0++(IR0),R0 ;X(I3)*SIN
0177 000077 26800100 SUBF R0,R1,R0 ;-X(I3)*SIN+X(I4)*COS
0178 000078 26c100c2 SUBF *AR2,R0,R1 ;-X(I2)+R0
0179 000079 cc4123c2 ADDF *AR2,R0,R1 ;X(I2)+R0
0180 || STF R1,*AR3++ ;X(I4)=X(I2)+R0
0181 00007a cc512cc1 ADDF *AR1,R2,R1 ;X(I1)-R2
0182 || STF R1,*AR4-- ;X(I1)=X(I1)+R2
0183 00007b ea5121c1 SUBF R2,*AR1,R1
0184 || STF R1,*AR1++ ;X(I2)=X(I1)-R
0185 00007c 14412a01 BLK_3: STF R1,*AR2--
0186 00007d 182d0003+ SUBI @INPUT,AR5
0187 00007e 020d0003 ADDI R3,AR5 ;AR5=I+N1
0188 00007f 04ad0000+ CMPI @FFTSIZ,AR5
0189 000080 6a28ffdb BLED INLOP ;BAK TO INNER LOOP
0190 000081 022d0003+ ADDI @INPUT,AR5
0191 000082 0c800000 NOP
0192 000083 0c800000 NOP
0193 000084 02650001 ADDI 1,R5
0194 000085 04a50001+ CMPI @LOGFFT,R5
0195 000086 6a08ffd3 BLE LOO
0196 000087 78800000 RETS
0197
0198 000012 .data
0199 000012 SINE
0200 000012 80000000 .float 0.00000000000000
0201 000013 fa490aaf .float 0.02454122852291
0202 000014 fb48fb2f .float 0.04906767432742
0203 000015 fc16a904 .float 0.07356456359967
0204 000016 fc48bd35 .float 0.09801714032956
0205 000017 fc7ab272 .float 0.12241067519922
0206 000018 fd164083 .float 0.14673047445536
0207 000019 fd2f10a2 .float 0.17096188876030
0208 00001a fd47c5c1 .float 0.19509032201613
0209 00001b fd605c13 .float 0.21910124015687
0210 00001c fd78cfcb .float 0.24298017990326
0211 00001d fe088e93 .float 0.26671275747490
0212 00001e fe14a031 .float 0.29028467725446
0213 00001f fe209ae4 .float 0.31368174039889
0214 000020 fe2c7cd3 .float 0.33688985339222
0215 000021 fe384429 .float 0.35989503653499
0216 000022 fe43ef15 .float 0.38268343236509
0217 000023 fe4f7bca .float 0.40524131400499
0218 000024 fe5ae880 .float 0.42755509343028
0219 000025 fe663374 .float 0.44961132965461
0220 000026 fe715ae9 .float 0.47139673682600
0221 000027 fe7c5d26 .float 0.49289819222978
0222 000028 ff039c3c .float 0.51410274419322
0223 000029 ff08f59a .float 0.53499761988710
0224 00002a ff0e39d9 .float 0.55557023301960
0225 00002b ff13682a .float 0.57580819141785
0226 00002c ff187fbf .float 0.59569930449243
0227 00002d ff1d7fd1 .float 0.61523159058063
0228 00002e ff226799 .float 0.63439328416365
0229 00002f ff273655 .float 0.65317284295378
0230 000030 ff2beb49 .float 0.67155895484702
0231 000031 ff3085ba .float 0.68954054473707
0232 000032 ff3504f3 .float 0.70710678118655
0233 000033 ff396841 .float 0.72424708295147
0234 000034 ff3daef9 .float 0.74095112535496
0235 000035 ff41d870 .float 0.75720884650648
0236 000036 ff45e403 .float 0.77301045336274
0237 000037 ff49d112 .float 0.78834642762661
0238 000038 ff4d9f02 .float 0.80320753148064
0239 000039 ff514d3c .float 0.81758481315158
0240 00003a ff54db31 .float 0.83146961230255
0241 00003b ff584852 .float 0.84485356524971
0242 00003c ff5b941a .float 0.85772861000027
0243 00003d ff5ebe05 .float 0.87008699110871
0244 00003e ff61c597 .float 0.88192126434835
0245 00003f ff64aa59 .float 0.89322430119552
0246 000040 ff676bd7 .float 0.90398929312344
0247 000041 ff6a09a6 .float 0.91420975570353
0248 000042 ff6c835e .float 0.92387953251129
0249 000043 ff6ed89d .float 0.93299279883474
0250 000044 ff710908 .float 0.94154406518302
0251 000045 ff731447 .float 0.94952818059304
0252 000046 ff74fa0a .float 0.95694033573221
0253 000047 ff76ba07 .float 0.96377606579544
0254 000048 ff7853f7 .float 0.97003125319454
0255 000049 ff79c79d .float 0.97570213003853
0256 00004a ff7b14be .float 0.98078528040323
0257 00004b ff7c3b27 .float 0.98527764238894
0258 00004c ff7d3aab .float 0.98917650996478
0259 00004d ff7e1323 .float 0.99247953459871
0260 00004e ff7ec46d .float 0.99518472667220
0261 00004f ff7f4e6d .float 0.99729045667869
0262 000050 ff7fb10f .float 0.99879545620517
0263 000051 ff7fec42 .float 0.99969881869620
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -