📄 cfft512c.asm
字号:
MAR *,AR5 ; ARP=AR5, AR5->T1
SPLK #COS45K,* ; ARP=AR5, AR5->T1, T1=COS45K
LT * ; ARP=AR5, AR5->T1, TREG=COS45K
SBRK #6 ; ARP=AR5, AR5->ipcbptr
LAR AR6,* ; ARP=AR5, AR5->ipcbptr, AR6=ipcbptr->ipcb[0], ---->P
LAR AR2,* ; ARP=AR5, AR5->ipcbptr, AR2=ipcbptr
ADRK #6 ; ARP=AR5, AR5->T1
MAR *,AR2 ; ARP=AR2, AR2=ipcbptr
ADRK #8 ; ARP=AR2, AR2=ipcbptr+8->ipcb[8], ---->Q
LAR AR0,#9h ; Increment for data pointer
LAR AR7,#(N/8-1) ; Loop 16 times
STAGE3_LP: ZEROI
PBY4I
PBY2I
P3BY4I 7,0 ; AR7 at end, Use *0+ modify
BANZ STAGE3_LP,*-,AR2
;--------------------------------------------------------------------
; Stage 4 - Using ZEROI, PBY4I,PBY2I,P3BY4I,BFLY Macros
;--------------------------------------------------------------------
MAR *,AR5 ; ARP=AR5, AR5->T1
SBRK #6 ; ARP=AR5, AR5->ipcbptr
LAR AR6,* ; ARP=AR5, AR5->ipcbptr, AR6=ipcbptr->ipcb[0], ---->P
LAR AR2,* ; ARP=AR5, AR5->ipcbptr, AR2=ipcbptr
ADRK #6 ; ARP=ARP, AR5->T1
MAR *,AR2 ; ARP=AR2, AR2=ipcbptr
ADRK #16 ; ARP=AR2, AR2=ipcbptr+16->ipcb[16], ---->Q
LAR AR0,#(N/8) ; Twiddle Factor increment
LAR AR7,#(N/16-1) ; Loop 8 Times, Group loop counter
STAGE4_LP: ZEROI
LAR AR3,#(TWID+N/16+N/4)
LAR AR4,#(TWID+N/16)
BFLY 2 ; ARP=AR2
MAR *,AR5 ; ARP=AR5, AR5->T1
SPLK #COS45K,* ; ARP=AR5, AR5->T1, T1=COS45K
LT *,AR2 ; ARP=AR2, TREG=COS45K
PBY4I
BFLY 2
PBY2I
BFLY 2
MAR *,AR5 ; ARP=AR5, AR5->T1
SPLK #COS45K,* ; ARP=AR5, AR5->T1, T1=COS45K
LT *,AR2 ; ARP=AR2, TREG=COS45K
P3BY4I 2,
BFLY 6
ADRK #16 ; Data offset
MAR *,AR2
ADRK #16 ; Data offset
MAR *,AR7
BANZ STAGE4_LP,*-,AR2
;--------------------------------------------------------
; Stage 5 to LOG2(N) - Using BFLY Macro
;--------------------------------------------------------
; Initialisation
; 1. Initialise the Butterfly loop(BLC), Group loop(GLC) & Stage loop counter(SLC)
; 2. Initialise the Data offset(DOST) and twiddle factor offset (TOST)
MAR *,AR5 ; ARP=AR5, AR5->T1
ADRK #2 ; ARP=AR5, AR5->GLCB
SPLK #(N/32),* ; ARP=AR5, AR5->GLCB, GLCB=N/8
SBRK #3 ; ARP=AR5, AR5->BLC
SPLK #16,*- ; ARP=AR5, AR5->GLC, BLC=16
SPLK #(N/32),*- ; ARP=AR5, AR5->SLC, GLC=(N/32)
SPLK #(NSTG-4),*- ; ARP=AR5, AR5->TOST, SLC=NSTG-4
SPLK #(N/32),*- ; ARP=AR5, AR5->DOST, TOST=4
SPLK #32,*- ; ARP=AR5, AR5->ipcbptr, DOST=32
SLP: ; Stage loop
LAR AR6,* ; ARP=AR5, AR5->ipcbptr, AR6=ipcbptr ------>P
LAR AR2,*+ ; ARP=AR5, AR5->DOST, AR2=ipcbptr
LAR AR0,*+,AR2 ; ARP=AR2, AR2=ipcbptr, AR5->TOST, AR0=DOST
MAR *0+,AR5 ; ARP=AR5, AR5->TOST, AR2=ipcbptr+DOST -----> Q
LAR AR0,* ; ARP=AR5, AR5->TOST, AR0=TOST
ADRK #3 ; ARP=AR5, AR5->BLC
GLP: ; Group loop
LAR AR3,#(TWID+N/4) ; COS(Angle)
LAR AR4,#(TWID) ; SIN(Angle)
LAR AR7,*+,AR7 ; ARP=AR7, AR7=BLC,AR5->T1
MAR *-,AR2 ; ARP=AR2, AR7=BLC-1
BLP: ; Butterfly loop
BFLY 7
BANZ BLP,*-,AR2
; Operations performed between the group
; 1. Manuplating the P & Q pointer to point to the next group
; 2. Reinitialising the WI and WR twiddle factor pointer
; 3. Decrementing the Group Count by 1, till all the group in the stage is computed
; 4. Reinitialising the Butterfly loop index for next group
MAR *,AR5 ; ARP=AR5, AR5->T1
SBRK #5 ; ARP=AR5, AR5->DOST
LAR AR0,*+,AR6 ; ARP=AR6, AR0=DOST, AR5->TOST
MAR *0+,AR2 ; ARP=AR2
MAR *0+,AR5 ; ARP=AR5, AR5->TOST
LAR AR0,* ; ARP=AR5, AR5->TOST, AR0=TOST
ADRK #2 ; ARP=AR5, AR5->GLC
LACL * ; ARP=AR5, AR5->GLC, ACCL=GLC
SUB #1 ; ACCL=GLC-1
SACL *+ ; ARP=AR5, AR5->BLC, GLC=GLC-1
BCND GLP,NEQ
; Operation Performed, between the stage
; 1. Mutiply the data offset by 2
; 2. Divide the Group count by 2
; 3. Divide the Twiddle offset by 2
; 4. Multiply the butterfly count by 2
; 5. Decrementing the stage count by 1, till all the stage gets over
; 6. Reinitialising the P & Q data pointer to the first group of next stage
SBRK #4 ; ARP=AR5, AR5->DOST
LACL * ; ARP=AR5, AR5->DOST, ACCL=DOST
SACL *+,1 ; ARP=AR5, AR5->TOST, DOST=DOST*2
LACL * ; ARP=AR5, AR5->TOST, ACCL=TOST
SFR ; ARP=AR5, AR5->TOST, ACCL=TOST/2
SACL *+ ; ARP=AR5, AR5->SLC, TOST=TOST/2
LACL * ; ARP=AR5, AR5->SLC, ACCL=SLC
SUB #1 ; ACCL=SLC-1
SACL *+ ; ARP=AR5, AR5->GLC, SLC=SLC-1
ADRK #4 ; ARP=AR5, AR5->GLCB
LACL * ; ARP=AR5, AR->GLCB, ACCL=GLCB
SFR ; ARP=AR5, AR5->GLCB, ACCL=GLCB/2
SACL * ; ARP=AR5, AR5->GLCB, GLCB=GLCB/2
SBRK #4 ; ARP=AR5, AR5->GLC
SACL *+ ; ARP=AR5, AR5->BLC, GLC=GLCB/2
LACL * ; ARP=AR5, AR5->BLC, ACCL=BLC
SACL *,1 ; ARP=AR5, AR5->BLC, BLC=BLC*2
SBRK #2 ; ARP=AR5, AR5->SLC
LACL * ; ARP=AR5, AR5->SLC, ACCL=SCL
SBRK #3 ; ARP=AR5, AR5->ipcbptr
BCND SLP,NEQ
MAR *,AR1
SBRK #(__FFT512C_calc_frs+1) ; Clear the local frame
LAR AR0,*- ; Retrive Caller's frame pointer
LAR AR7,*-
LAR AR6,*-
PSHD * ; Push the return address to TOS
RET ; Return to the caller
;================================================================================
; TWIDDLE FACTOR INITIALISATION
;===============================================================================
; Twiddle factor Initialisation
_FFT512C_init:
POPD *+
LAR AR2,#TWID ; Copy the twiddle factor from ROM to RAM
LACC #TF_LOAD_STRT_ADR
MAR *,AR2
LAR AR3, #(TF_LOAD_END_ADR-TF_LOAD_STRT_ADR-1)
loop1: TBLR *+,AR3
ADD #1
BANZ loop1,*-,AR2
MAR *,AR1
SBRK #1
PSHD * ; Push the return address to TOS
RET
;--------------------------------------------------------------------------
; TWIDDLE FOR N=512 FFT (384 ENTRIES)
;--------------------------------------------------------------------------
.sect "FFTtf"
.label TF_LOAD_STRT_ADR
TWID: .word 0,402,804,1206,1608,2009,2411,2811,3212,3612
.word 4011,4410,4808,5205,5602,5998,6393,6787,7180,7571
.word 7962,8351,8740,9127,9512,9896,10279,10660,11039,11417
.word 11793,12167,12540,12910,13279,13646,14010,14373,14733,15091
.word 15447,15800,16151,16500,16846,17190,17531,17869,18205,18538
.word 18868,19195,19520,19841,20160,20475,20788,21097,21403,21706
.word 22006,22302,22595,22884,23170,23453,23732,24008,24279,24548
.word 24812,25073,25330,25583,25833,26078,26320,26557,26791,27020
.word 27246,27467,27684,27897,28106,28311,28511,28707,28899,29086
.word 29269,29448,29622,29792,29957,30118,30274,30425,30572,30715
.word 30853,30986,31114,31238,31357,31471,31581,31686,31786,31881
.word 31972,32058,32138,32214,32286,32352,32413,32470,32522,32568
.word 32610,32647,32679,32706,32729,32746,32758,32766,32767,32766
.word 32758,32746,32729,32706,32679,32647,32610,32568,32522,32470
.word 32413,32352,32286,32214,32138,32058,31972,31881,31786,31686
.word 31581,31471,31357,31238,31114,30986,30853,30715,30572,30425
.word 30274,30118,29957,29792,29622,29448,29269,29086,28899,28707
.word 28511,28311,28106,27897,27684,27467,27246,27020,26791,26557
.word 26320,26078,25833,25583,25330,25073,24812,24548,24279,24008
.word 23732,23453,23170,22884,22595,22302,22006,21706,21403,21097
.word 20788,20475,20160,19841,19520,19195,18868,18538,18205,17869
.word 17531,17190,16846,16500,16151,15800,15447,15091,14733,14373
.word 14010,13646,13279,12910,12540,12167,11793,11417,11039,10660
.word 10279,9896,9512,9127,8740,8351,7962,7571,7180,6787
.word 6393,5998,5602,5205,4808,4410,4011,3612,3212,2811
.word 2411,2009,1608,1206,804,402,0,-402,-804,-1206
.word -1608,-2009,-2411,-2811,-3212,-3612,-4011,-4410,-4808,-5205
.word -5602,-5998,-6393,-6787,-7180,-7571,-7962,-8351,-8740,-9127
.word -9512,-9896,-10279,-10660,-11039,-11417,-11793,-12167,-12540,-12910
.word -13279,-13646,-14010,-14373,-14733,-15091,-15447,-15800,-16151,-16500
.word -16846,-17190,-17531,-17869,-18205,-18538,-18868,-19195,-19520,-19841
.word -20160,-20475,-20788,-21097,-21403,-21706,-22006,-22302,-22595,-22884
.word -23170,-23453,-23732,-24008,-24279,-24548,-24812,-25073,-25330,-25583
.word -25833,-26078,-26320,-26557,-26791,-27020,-27246,-27467,-27684,-27897
.word -28106,-28311,-28511,-28707,-28899,-29086,-29269,-29448,-29622,-29792
.word -29957,-30118,-30274,-30425,-30572,-30715,-30853,-30986,-31114,-31238
.word -31357,-31471,-31581,-31686,-31786,-31881,-31972,-32058,-32138,-32214
.word -32286,-32352,-32413,-32470,-32522,-32568,-32610,-32647,-32679,-32706
.word -32729,-32746,-32758,-32766
.label TF_LOAD_END_ADR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -