📄 fft32.asm
字号:
;=========================================================================
;文件名: fft32.asm
;日期: 2007年2月25日
;公司(作者):
;描述和说明: 32点FFT汇编子程序
;=========================================================================
; Module definition for external referance
.def _FFT32C_calc ;
.def _FFT32C_init ; Copy Twiddle factor
N .set 32 ; FFT Length
NSTG .set 5 ; Number of Stage
COS45K .set 05A82h ; Constant for COS(45)
;第一个函数
;===============================================================================
; FFT - Computation Routine (FFT32R_calc)
;===============================================================================
; * This routine takes the 32 point complex data sequence, in bit reversed form
; * It implements Decimation in time FFT algorithm
; * Performs inplace computation
; * Output in-order data "IPCB"----> Xr(0),Xi(0),Xr(1),Xi(1)...Xr(127)&Xi(127)
;===============================================================================
; (Content of REG after exec.)
ZEROI .macro ; AR6 AR2 ARP
LACC *,15,AR6 ;ACC:=QR/2 PR QR 6
ADD *,15 ;ACC:=(PR+QR)/2 PR QR 6
SACH *+,0,AR2 ;PR':=(PR+QR)/2 PI QR 2
SUB *,16 ;ACC:=(PR-QR)/2 PI QR 2
SACH *+ ;QR':=(PR-QR)/2 PI QI 2
LACC *,15,AR6 ;ACC:=QI/2 PI QI 6
ADD *,15 ;ACC:=(PI+QI)/2 PI QI 6
SACH *+,0,AR2 ;PI':=(PI+QI)/2 PR+1 QI 2
SUB *,16 ;ACC:=(PI-QI)/2 PR+1 QI 2
SACH *+ ;QI':=(PI-QI)/2 PR+1 QR+1 2
.endm
;------------------------------------------------------
; (Content of REG after exec.)
PBY2I .macro ; AR6 AR2 ARP
LACC *+,15,AR5 ; PR QI 5
SACH *,1,AR2 ;TMP:=QR PR QI 2
LACC *,15,AR6 ;ACC:=QI/2 PR QI 6
ADD *,15 ;ACC:=(PR+QI)/2 PR QI 6
SACH *+,0,AR2 ;PR':=(PR+QI)/2 PI QI 2
SUB *-,16 ;ACC:=(PR-QI)/2 PI QR 2
SACH *+,0,AR6 ;QR':=(PR-QI)/2 PI QI 2
LACC *,15,AR5 ;ACC:=PI/2 PI QI 5
SUB *,15,AR6 ;ACC:=(PI-QR)/2 PI QI 6
SACH *+,0,AR5 ;PI':=(PI-QR)/2 PR+1 QI 2
ADD *,16,AR2 ;ACC:=(PI+QR)/2 PR+1 QI 2
SACH *+ ;QI':=(PI+QR)/2 PR+1 QR+1 2
.endm
;------------------------------------------------------
; (Content of REG after exec.)
PBY4I .macro ; AR5 PREG AR6 AR2 ARP
MPY *+,AR5 ;PREG:=W*QR/2 - W*QR/2 PR QI 5
SPH *,AR6 ;TMP:=W*QR/2 W*QR/2 W*QR/2 PR QI 6
LACC *,15,AR2 ;ACC:=PR/2 W*QR/2 W*QR/2 PR QI 2
MPYS *- ;ACC:=(PR-W*QR)/2 W*QR/2 W*QI/2 PR QR 2
SPAC ;ACC:=(PR-W*QI-W*QR)/2 W*QR/2 W*QI/2 PR QR 2
SACH *+,0,AR6 ;QR':=(PR-W*QI-W*QR)/2 W*QR/2 W*QI/2 PR QI 6
SUB *,16 ;ACC:=(-PR-W*QI-W*QR)/2 W*QR/2 W*QI/2 PR QI 6
NEG ;ACC:=(PR+W*QI+W*QR)/2 W*QR/2 W*QI/2 PR QI 6
SACH *+ ;PR'=(PR+W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QI 6
LACC *,15,AR5 ;ACC:=PI/2 W*QR/2 W*QI/2 PI QI 5
SPAC ;ACC:=(PI-W*QI)/2 W*QR/2 W*QI/2 PI QI 5
ADD *,16,AR2 ;ACC:=(PI-W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QI 2
SACH *+,0,AR6 ;QI':=(PI-W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QR+1 2
SUB *,16 ;ACC:=(-PI-W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QR+1 2
NEG ;ACC:=(PI+W*QI-W*QR)/2 W*QR/2 W*QI/2 PI QR+1 2
SACH *+,0,AR2 ;PI':=(PI+W*QI-W*QR)/2 W*QR/2 W*QI/2 PR+1 QR+1 2
.endm
;------------------------------------------------------
; (Content of REG after exec.)
P3BY4I .macro p,m ; AR5 PREG AR6 AR2 ARP
MPY *+,AR5 ;PREG:=W*QR/2 - W*QR/2 PR QI 5
SPH *,AR6 ;TMP:=W*QR/2 W*QR/2 W*QR/2 PR QI 6
LACC *,15,AR2 ;ACC:=PR/2 W*QR/2 W*QR/2 PR QI 2
MPYA *- ;ACC:=(PR+W*QR)/2 W*QR/2 W*QI/2 PR QR 2
SPAC ;ACC:=(PR-W*QI+W*QR)/2 W*QR/2 W*QI/2 PR QR 2
SACH *+,0,AR6 ;QR':=(PR-W*QI+W*QR)/2 W*QR/2 W*QI/2 PR QI 6
SUB *,16 ;ACC:=(-PR-W*QI+W*QR)/2 W*QR/2 W*QI/2 PR QI 6
NEG ;ACC:=(PR+W*QI-W*QR)/2 W*QR/2 W*QI/2 PR QI 6
SACH *+ ;PR'=(PR+W*QI-W*QR)/2 W*QR/2 W*QI/2 PI QI 6
LACC *,15,AR5 ;ACC:=PI/2 W*QR/2 W*QI/2 PI QI 5
APAC ;ACC:=(PI+W*QI)/2 W*QR/2 W*QI/2 PI QI 5
ADD *,16,AR2 ;ACC:=(PI+W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QI 2
SACH *:m:+,0,AR6 ;QI':=(PI+W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QR+1 2
SUB *,16 ;ACC:=(-PI+W*QI+W*QR)/2 W*QR/2 W*QI/2 PI QR+1 2
NEG ;ACC:=(PI-W*QI-W*QR)/2 W*QR/2 W*QI/2 PI QR+1 2
SACH *:m:+,0,AR:p: ;PI':=(PI-W*QI-W*QR)/2 W*QR/2 W*QI/2 PR+1 QR+1 :P:
.endm
;------------------------------------------------------
; (Content of REG after exec.)
BFLY .macro p ; TREG AR6 AR2 AR3 AR4 ARP
LT *+,AR3 ;TREG:=QR QR PR QI WR WI 3
MPY *,AR2 ;PREG:=(QR*WR)/2 QR PR QI WR WI 2
LTP *-,AR4 ;ACC:=(QR*WR)/2 QI PR QR WR WI 4
MPY *,AR3 ;PREG:=(QI*WI)/2 QI PR QR WR WI 3
MPYA *0+,AR2 ;ACC:=(QR*WR+QI*WI)/2 QI PR QR WR+n WI 2
;PREG:=QI*WR
LT *,AR5 ;TREG:=QR QR PR QR WR+n WI 5
SACH *,1,AR6 ;TEMP:=QR*WR+QI*WI QR PR QR WR+n WI 6
ADD *,15 ;ACC:=(PR+QR*WR+QI*WI)/2 QR PI QR WR+n WI 6
SACH *+,AR5 ;PR':=(PR+QR*WR+QI*WI)/2 QR PI QR WR+n WI 5
SUB *,16,AR2 ;ACC:=(PR-QR*WR-QI*WI)/2 QR PI QR WR+n WI 2
SACH *+,0,AR6 ;QR':=(PR-QR*WR-QI*WI)/2 QR PI QI WR+n WI 6
LACC *,15,AR4 ;ACC:=PI/2 QR PI QI WR+n WI 4
MPYS *0+,AR2 ;ACC:=(PI-QI*WR)/2 QR PI QI WR+n WI+n 2
;PREG:=QR*WI
APAC ;ACC:=(PI-QI*WR+QR*WI)/2 QR PI QR+1 WR+n WI+n 2
SACH *+,0,AR6 ;QI':=(PI-QI*WR+QR*WI)/2 QR PI QR+1 WR+n WI+n 6
NEG ;ACC:=(-PI+QI*WR-QR*WI)/2 QR PI QR+1 WR+n WI+n 6
ADD *,16 ;ACC:=(PI+QI*WR-QR*WI)/2 QR PI QR+1 WR+n WI+n 6
SACH *+,0,AR:p: ;PI':=(PI+QI*WR-QR*WI)/2 QR PR+1 QR+1 WR+n WI+n :p:
.endm
;------------------------------------------------------
; (Content of REG after exec.)
COMBO .macro ; AR6 AR2 AR3 AR4 AR5 ARP
LACC *,14,AR4 ;ACC:=R3/4 R1 R2 R3 R4 T1 4
SUB *,14,AR5 ;ACC:=(R3-R4)/4 R1 R2 R3 R4 T1 5
SACH *+,1,AR4 ;T1:=(R3-R4)/2 R1 R2 R3 R4 T2 4
ADD *+,15,AR5 ;ACC:=(R3+R4)/4 R1 R2 R3 I4 T2 5
SACH *,1,AR2 ;T2:=(R3+R4)/2 R1 R2 R3 I4 T2 2
ADD *,14,AR6 ;ACC:=(R2+R3+R4)/4 R1 R2 R3 I4 T2 6
ADD *,14 ;ACC:=(R1+R2+R3+R4)/4 R1 R2 R3 I4 T2 6
SACH *+,0,AR5 ;R1':=(R1+R2+R3+R4)/4 I1 R2 R3 I4 T2 5
SUB *,16,AR3 ;ACC:=(R1+R2-R3-R4)/4 I1 R2 R3 I4 T2 3
SACH *+,0,AR5 ;R3':=(R1+R2-R3-R4)/4 I1 R2 I3 I4 T2 5
ADD *,15,AR2 ;ACC:=(R1+R2)/4 I1 R2 I3 I4 T2 2
SUB *,15,AR3 ;ACC:=(R1-R2)/4 I1 R2 I3 I4 T2 3
ADD *,14,AR4 ;ACC:=(R1-R2+I3)/4 I1 R2 I3 I4 T2 4
SUB *,14,AR2 ;ACC:=(R1-R2+I3-I4)/4 I1 R2 I3 I4 T2 2
SACH *+,0,AR4 ;R2':=(R1-R2+I3-I4)/4 I1 I2 I3 I4 T2 2
ADD *-,15,AR3 ;ACC:=(R1-R2+I3+I4)/4 I1 I2 I3 R4 T2 2
SUB *,15,AR4 ;ACC:=(R1-R2-I3+I4)/4 I1 I2 I3 R4 T2 4
SACH *+,0,AR6 ;R4':=(R1-R2-I3+I4)/4 I1 I2 I3 I4 T2 6
LACC *,14,AR2 ;ACC:=I1/4 I1 I2 I3 I4 T2 2
SUB *,14,AR5 ;ACC:=(I1-I2)/4 I1 I2 I3 I4 T2 5
SACH *,1,AR2 ;T2:=(I1-I2)/2 I1 I2 I3 I4 T2 2
ADD *,15,AR3 ;ACC:=(I1+I2)/4 I1 I2 I3 I4 T2 3
ADD *,14,AR4 ;ACC:=(I1+I2+I3)/4 I1 I2 I3 I4 T2 3
ADD *,14,AR6 ;ACC:=(I1+I2+I3+I4)/4 I1 I2 I3 I4 T2 6
SACH *0+,0,AR3 ;I1':=(I1+I2+I3+I4)/4 R5 I2 I3 I4 T2 3
SUB *,15,AR4 ;ACC:=(I1+I2-I3+I4)/4 R5 I2 I3 I4 T2 4
SUB *,15,AR3 ;ACC:=(I1+I2-I3-I4)/4 R5 I2 I3 I4 T2 3
SACH *0+,0,AR5 ;I3':=(I1+I2-I3-I4)/4 R5 I2 R7 I4 T2 5
LACC *-,15 ;ACC:=(I1-I2)4 R5 I2 R7 I4 T1 5
SUB *,15,AR2 ;ACC:=(I1-I2-R3+R4)/4 R5 I2 R7 I4 T1 2
SACH *0+,0,AR5 ;I2':=(I1-I2-R3+R4)/4 R5 R6 R7 I4 T1 5
ADD *,16,AR4 ;ACC:=(I1-I2+R3-R4)/4 R5 R6 R7 I4 T1 4
SACH *0+,0,AR7 ;I4':=(I1-I2+R3-R4)/4 R5 R6 R7 R8 T1 7
.endm
;----------------------------------------------------------------------
; FFT Computation Routine
;----------------------------------------------------------------------
__FFT32C_calc_frs .set 00009h ; Local frame size for this routine
_FFT32C_calc:
POPD *+ ; Store the Return Address in stack
SAR AR6,*+ ; Entry On Save Register AR6
SAR AR7,*+ ; Entry On Save Registe AR7
SAR AR0,*+ ; Store the Caller's Frame Pointer
SAR AR1,*
LAR AR5,* ; AR5=FP
LAR AR0,#__FFT32C_calc_frs
LAR AR0,*0+,AR7 ; Create Local frame
SETC SXM
SPM #0
LAR AR7,#0FFFBh ; ARP=AR7, AR7=-5
MAR *0+ ; ARP=AR7, AR7->FFT32C_handle->ipcbptr
LAR AR7,* ; ARP=AR7, AR7->&ipcb[0]
LAR AR6,*,AR5 ; ARP=AR5, AR5->ipcbptr(Stack), AR6=ipcbptr
SAR AR6,* ; ARP=AR5, AR5->ipcbptr(Stack), ipcbptr(Stack)=ipcbptr
ADRK #6 ; ARP=AR5, AR5->T1
MAR *,AR7
;-----------------------------------------------------------------
; Stage 1 & 2 - Using the RADIX 4 COMBO Macro
;-----------------------------------------------------------------
LAR AR6,* ; ARP=AR7, AR7->&ipcb[0], AR6=&ipcb[0]
LAR AR0,*,AR2 ; ARP=AR2, AR2=xxxxh, AR7->&ipcb[0], AR0=&ipcb[0]
LAR AR2,#2 ; ARP=AR2, AR2=2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -