📄 fft.asm
字号:
*************************************
*Radix-2,DIT,Real-input FFT Program *
* fft.asm *
*************************************
.mmregs
.global sav_sin,sav_idx,sav_grp,_fft
.global _INPUT,_DisData
.data
OUTDATA .space 1024*4*16 ;OUTDATA .space 1024*16
N .set 256 ;N .set 512
LOGN .set 8 ;LOGN .set 9
sav_grp .usect "tempv",3
sav_sin .set sav_grp+1
sav_idx .set sav_grp+2
.copy "twiddle1.inc"
.copy "twiddle2.inc"
.text
_fft:
PSHM SWWSR
PSHM AR0
PSHM AR1
PSHM AR6
PSHM AR7
PSHM ST0
PSHM ST1
SSBX TC
SSBX C
RSBX OVA
RSBX OVB
LD #0,DP
RSBX CPL
SSBX XF
SSBX SXM
LD #00,ASM
SSBX FRCT
STM #7FFFH,28H
STM #2*N,BK
STM #_INPUT,AR3 ;***************INPUT
STM #OUTDATA,AR7
MVMM AR7,AR2
STM #N-1,BRC
RPTBD plend-1
STM #N,AR0
MVDD *AR3+,*AR2+
NOP
NOP
MVDD *AR3-,*AR2+
NOP
NOP
MAR *AR3+0B
plend:
STM #0,BK
LD #-1,ASM
MVMM AR7,AR2
STM #OUTDATA+2,AR3
STM #N/2-1,BRC
LD *AR2,16,A
RPTBD s1end-1
STM #3,AR0
SUB *AR3,16,A,B
ADD *AR3,16,A
STH A,ASM,*AR2+
ST B,*AR3+
||LD *AR2,A
SUB *AR3,16,A,B
ADD *AR3,16,A
STH A,ASM,*AR2+0
ST B,*AR3+0%
||LD *AR2,A
s1end:
MVMM AR7,AR2
STM #OUTDATA+4,AR3
STM #N/4-1,BRC
LD *AR2,16,A
RPTBD s2end-1
STM #5,AR0
SUB *AR3,16,A,B
ADD *AR3,16,A
STH A,ASM,*AR2+
ST B,*AR3+
||LD *AR2,A
SUB *AR3,16,A,B
ADD *AR3,16,A
STH A,ASM,*AR2+
STH B,ASM,*AR3+
MAR *AR3+
ADD *AR2,*AR3,A
SUB *AR2,*AR3-,B
STH A,ASM,*AR2+
SUB *AR2,*AR3,A
ST B,*AR3
||LD *AR3+,B
ST A,*AR2
||ADD *AR2+0%,A
ST A,*AR3+0%
||LD *AR2,A
s2end:
STM #1024,BK ;STM #512,BK
ST #256,@sav_sin ;ST #128,@sav_sin
STM #256,AR0 ;STM #128,AR0
STM #TWI2,AR4
STM #TWI1,AR5
STM #-3+LOGN,AR7
ST #-1+N/8,@sav_grp
STM #3,AR6
ST #8,@sav_idx
stage:
STM #OUTDATA,AR2
LD @sav_idx,A
ADD *(AR2),A
STLM A,AR3
MVDK @sav_grp,AR1
group:
MVMD AR6,BRC
RPTBD bend-1
LD *AR4,T
MPY *AR3+,A
MACR *AR5+0%,*AR3-,A
ADD *AR2,16,A,B
ST B,*AR2
||SUB *AR2+,B
ST B,*AR3
||MPY *AR3+,A
MASR *AR3,*AR4+0%,A
ADD *AR2,16,A,B
ST B,*AR3+
||SUB *AR2,B
LD *AR4,T
ST B,*AR2+
||MPY *AR3+,A
bend:
PSHM AR0
MVDK sav_idx,AR0
MAR *AR2+0
MAR *AR3+0
BANZD group,*AR1-
POPM AR0
MAR *AR3-
;s3end
LD sav_idx,A
SUB #1,A,B
STLM B,AR6
STL A,1,sav_idx
LD sav_grp,A
STL A,ASM,sav_grp
LD sav_sin,A
STL A,ASM,sav_sin
BANZD stage,*AR7-
MVDK sav_sin,AR0
;FFTend
STM #OUTDATA+2,AR2
STM #OUTDATA+2*N-2,AR3
STM #OUTDATA+2*N+3,AR7
STM #OUTDATA+4*N-1,AR6
STM #-2+N/2,BRC
RPTBD p3end-1
STM #3,AR0
;
ADD *AR2,*AR3,A
SUB *AR2,*AR3,B
STH A,ASM,*AR2+
STH A,ASM,*AR3+
STH B,ASM,*AR6-
NEG B
STH B,ASM,*AR7-
ADD *AR2,*AR3,A
SUB *AR2,*AR3,B
STH A,ASM,*AR2+
STH A,ASM,*AR3-0
STH B,ASM,*AR6-
NEG B
STH B,ASM,*AR7+0
p3end:
ST #0,*AR6-
ST #0,*AR6
p3test:
STM #OUTDATA,AR2
STM #OUTDATA+1,AR4
STM #OUTDATA+2*N+1,AR5
ADD *AR2,*AR4,A
SUB *AR2,*AR4,B
STH A,ASM,*AR2+
ST #0,*AR2
MVDD *AR2+,*AR5-
STH B,ASM,*AR5
;
STM #OUTDATA+4*N-1,AR3
STM #TWI2+1024/N,AR4 ;STM #TWI2+512/N,AR4
STM #TWI1+1024/N,AR5 ;STM #TWI1+512/N,AR5
STM #N-2,BRC
RPTBD p4end-1
STM #1024/N,AR0 ;STM #512/N,AR0
LD *AR2+,16,A
MACR *AR4,*AR2,A
MASR *AR5,*AR3-,A
LD *AR3+,16,B
MASR *AR5+0%,*AR2-,B
MASR *AR4+0%,*AR3,B
STH A,ASM,*AR2+
STH B,ASM,*AR2+
NEG B
STH B,ASM,*AR3-
STH A,ASM,*AR3-
p4end:
power:
STM #_DisData,AR3 ;AR3指向输出缓冲地址
STM #N*2-1,BRC ;块循环计数器设置为255
RPTBD power_end-1 ;带延迟方式的重复执行指令
STM #OUTDATA,AR2 ;AR2指向AR[0]
SQUR *AR2+,A ;A := AR2
SQURA *AR2+,A ;A := AR2 + AI2
; STH A,7,*AR3 ;将A中的数据存入输出缓冲中,
; ANDM #7FFFH,*AR3+ ;避免输出数据过大在虚拟示波器中显示错误
STH A,*AR3+
power_end:
NOP
POPM ST1
POPM ST0
POPM AR7
POPM AR6
POPM AR1
POPM AR0
POPM SWWSR
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -