📄 cfft.asm
字号:
LAR AR4,sin:stage: ; start of sine in this stage
do_btfly num ; execute ZEROI & 7 times BUTTFLYI
BANZ loop?,*-,ar2 ; repeat loop until ar5==0
.endm
laststag .macro stage,offset
LAR AR1,DATAADD ; ar1 -> DATA
LAR AR2,DATA:offset: ; ar2 -> DATA+offset
LAR AR3,cos:stage: ; start of cosine in stage 'stg'
LAR AR4,sin:stage: ; start of sine in stage 'stg'
do_btfly N/2 ; execute butterflies (up to 512)
.endm
;
; C Context Defines
;
FP .set ar0
SP .set ar1
.sect ".text"
***
*** CORE BUTTERYFLY SUBROUTINE
***
******************************************************************************
* *
* CORE BUTTERFLY SUBROUTINE *
* version 2.00 from Manfred Christ update: 21. Mar 94 *
* *
* Definition: ARP -> AR2 (input) ARP -> AR2 (output) *
* *
* Definition: AR1 -> PR (input) AR1 -> PR+1 (output) *
* Definition: AR2 -> QR (input) AR2 -> QR+1 (output) *
* Definition: AR3 -> Cxxx (input) AR3 -> Cxxx+1 (output) *
* Definition: AR4 -> Sxxx (input) AR4 -> Sxxx+1 (output) *
* *
* uses index register: INDX=2 *
* *
* PR' = (PR+(QR*WR+QI*WI))/2 WR=COS(W) WI=SIN(W) *
* PI' = (PI+(QI*WR-QR*WI))/2 *
* QR' = (PR-(QR*WR+QI*WI))/2 *
* QI' = (PI-(QI*WR-QR*WI))/2 *
******************************************************************************
butterfly
LACL #2 ; make it DP-independend
SAMM INDX ; pmst(indx)=0 INDX=2
; TREG AR1 AR2 AR3 AR4 ARP
; ---- --- --- --- --- ---
lt *+,ar3 ;TREG:= QR QR PR QI C S 3
;
rptb btflyend-1
mpy *,ar2 ;PREG = QR*WR/2 QR PR QI C S 2
ltp *-,ar4 ;ACC = QR*WR/2 QI PR QR C S 4
mpy *,ar3 ;PREG = QI*WI/2 QI PR QR C S 3
mpya *+,ar2 ;ACC = (QR*WR+QI*WI)/2 QR PR QR C+1 S 2
; ;PREG = QI*WR
lt *,ar1 ;TREG = QR QR PR QR C+1 S 1
sacb ;ACCB = (QR*WR+QI*WI)/2 QR PR QR C+1 S 1
;
add *,15 ;ACC = (PR+(QR*WR+QI*WI))/2 QR PR QR C+1 S 1
sach *+,0,ar2 ;PR = (PR+(QR*WR+QI*WI))/2 QR PI QR C+1 S 2
sbb ;ACC = (PR-( 0 ))/2 QR PI QR C+1 S 2
sbb ;ACC = (PR-(QR*WR+QI*WI))/2 QR PI QR C+1 S 2
sach *0+,0,ar1 ;QR = (PR-(QR*WR+QI*WI))/2 QR PI QR+1 C+1 S 1
;
lac *,15,ar4 ;ACC = PI /PREG=QI*WR QI PI QR+1 C+1 S 4
mpys *+,ar2 ;PREG = QR*WI/2 QI PI QR+1 C+1 S+1 2
; ;ACC = (PI-QI*WR)/2
lta *- ;ACC = (PI-(QI*WR-QR*WI))/2 QR1 PI QI C+1 S+1 2
sach *0+,0,ar1 ;QI = (PI-(QI*WR-QR*WI))/2 QR1 PI QI+1 C+1 S+1 1
neg ;ACC =(-PI+(QI*WR-QR*WI))/2 QR1 PI QI+1 C+1 S+1 1
add *,16 ;ACC = (PI+(QI*WR-QR*WI))/2 QR1 PI QI+1 C+1 S+1 1
sach *+,0,ar3 ;PI = (PI+(QI*WR-QR*WI))/2 QI PR+1 QR+1 C+1 S+1 2
btflyend
LAMM AR0 ; pmst(indx)=1 -> ar0 is index
SAMM INDX ; make macro DP-independend!!!
MAR *,AR2 ; arp=index
MAR *- ; correct pointer ar2
RETD ; delayed return
MAR *0+,AR1 ; AR2 += indx
MAR *0+,AR5 ; AR1 += indx
***
*** COMPLEX FFT ROUTINE
***
_cfft:
;
; Enter Processing Context
;
ldp #0 ; data page pointer
clrc CNF ; map B0/B1 into DATA
setc SXM ; enable sign extension mode
setc OVM ; enable overflow mode
opl #6h,PMST ; enable NDX,TRM
sar FP,saveFP ; save frame pointer
sar SP,saveSP ; save stack pointer
lamm INDX ; save c context
sacl saveIDX ; save c context
;
; INIT BLOCK B2
;
mar *,ar0 ; point arp to ar0
lar ar0,#TABB
lacc #TABSTRT
rpt #TABLEN-1
tblr *+
;
; INIT TWIDDLE FACTORS
;
lar ar0,#TWID
lacc #TWIDSTRT
rpt #TWIDLEN-1
tblr *+
;
; INIT DATA WORKSPACE
;
lar ar0,DATAADD
lacc #0
rpt #2*N-1
sacl *+
;
; DO BIT REVERSED COPY
;
mar *,ar1 ; point arp to SP
sbrk 3 ; position SP at SHIFT arg
lacc *+ ; load SHIFT arg
samm TREG1 ; config SHIFT
lacc *+ ; load COUNT arg
sub #1 ; decrement for loop
samm BRCR ; config COUNT
lar ar2,*+,ar2 ; load SRC arg, point arp to SRC
lar ar3,DATAADD ; load DST ptr
splk #N,INDX ; set index register = N
rptb bitrev_end-1 ; loop
lact *+,ar3 ; load and shift src, point arp to DST
nop ; eat cycle for rptb
sacl *BR0+,ar2 ; store, point arp to SRC
bitrev_end
;
; Prep for algorithm
;
.def FFTBEG, FFTEND
.def STAGE1, STAGE2, STAGE3
.def STAGE4, STAGE5, STAGE6
.def STAGE7, STAGE8, STAGE9
FFTBEG:
STAGE1: stdmacro 1,1,255,2 ; FFT CODE for STAGE 1
STAGE2: stdmacro 2,2,127,4 ; FFT CODE for STAGE 2
STAGE3: stdmacro 3,4,63,8 ; FFT CODE FOR STAGE 3 / ARP=AR2
STAGE4: stdmacro 4,8,31,16 ; FFT CODE FOR STAGE 4 / ARP=AR2
STAGE5: stdmacro 5,16,15,32 ; FFT CODE FOR STAGE 5 / ARP=AR2
STAGE6: stdmacro 6,32,7,64 ; FFT CODE FOR STAGE 6 / ARP=AR2
STAGE7: stdmacro 7,64,3,128 ; FFT CODE FOR STAGE 7 / ARP=AR2
STAGE8: stdmacro 8,128,1,256 ; FFT CODE FOR STAGE 8 / ARP=AR2
STAGE9: laststag 9,512 ; FFT CODE FOR STAGE 9 / ARP=AR2
FFTEND:
;
; Restore C Context
;
lar FP,saveFP ; recall frame pointer
lar SP,saveSP ; recall stack pointer
lacc saveIDX ; restore c context
samm INDX ; restore c context
apl #~6h,PMST ; disable NDX,TRM
retd ; return to caller with delay
mar *,SP ; select stack pointer as current ARP
clrc OVM ; disable saturation mode
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -