📄 cfft128c.asm
字号:
; ARP=2
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
; (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
;----------------------------------------------------
; MACRO 'BFLY'
; Number of WORDS/Number of Cycles 18
; USAGE: General Butterfly RADIX 2 -> TWIDDLE FACTOR W=WR-jWI
;
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; ARP=2
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; AR3-> Real Part of Twiddle Factor: WR(COSx)
; AR4-> Imaginary Part of Twiddle Factor: WI(SINx)
; AR5-> Temporary Variable
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6 -> PR'=(PR+QR*WR+QI*WI)/2
; AR2 -> QR'=(PR-QR*WR-QI*WI)/2
; AR6+1 -> PI'=(PI+QI*WR-QR*WI)/2
; AR2+1 -> QI'=(PI-QI*WR+QR*WI)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; ARP=2
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
; AR3-> Real Part of Next Twiddle Factor
; AR4-> Imaginary Part ofNext Twiddle Factor
;------------------------------------------------------
; (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
;----------------------------------------------------
; MACRO 'COMBO'
; Number of WORDS/Number of Cycles 33
; USAGE: RADIX 4 USED AT THE FIRST STAGE
;
; POINTERS AT ENTRY
; ARP=3
; AR6->(R1,I1)
; AR2->(R2,I2)
; AR3->(R3,I3)
; AR4->(R4,I4)
; AR5-> Temporary Variable
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6 -> R1'=(R1+R2+R3+R4)/4
; AR2 -> R2'=(R1-R2+I3-I4)/4
; AR3 -> R3'=(R1+R2-R3-R4)/4
; AR4 -> R4'=(R1-R2-I3+I4)/4
; AR6+1 -> I1'=(I1+I2+I3+I4)/4
; AR2+1 -> I2'=(I1-I2-R3+R4)/4
; AR3+1 -> I3'=(I1+I2-I3-I4)/4
; AR4+1 -> I4'=(I1-I2+R3-R4)/4
; POINTERS AT EXIT
; ARP=7
; AR6->(R5,I5)
; AR2->(R6,I6)
; AR3->(R7,I7)
; AR4->(R8,I8)
;------------------------------------------------------
; (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
;----------------------------------------------------------------------
;====================================================================
; Function Local Frame
;====================================================================
; |_______|
; |_______|<- Stack Pointer (FP+9) <---AR1
; |_______|<- GLCB (FP+8)
; |_______|<- (T2) (FP+7)
; |_______|<- (T1) (FP+6) <---AR5
; |_______|<- BLC (Butterfly loop counter) (FP+5)
; |_______|<- GLC (Group loop counter) (FP+4)
; |_______|<- SLC (Stage loop counter) (FP+3)
; |_______|<- TOST (Twiddle offset, for decimation) (FP+2)
; |_______|<- DOST (Data offset) (FP+1)
; |_______|<- ipcbptr (FP)
; |_______|<- Old FP (AR0) (FP-1)
; |_______|<- Context Save of AR7 (FP-2)
; |_______|<- Context Save of AR6 (FP-3)
; |_______|<- Return Address of the Caller (FP-4)
; |_______|<- FFTxxxx_handle (FP-5)
;
;===================================================================
__FFT128C_calc_frs .set 00009h ; Local frame size for this routine
_FFT128C_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,#__FFT128C_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->FFT128C_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]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -