📄 ex6-1.asm
字号:
subf3 *ar1,*ar0,r2
subf3 *ar3,*ar2,r1
mpyf3 r2,r5,r0
|| addf3 *ar3,*ar2,r3
mpyf3 *+ar4(ir1),r1,r3
|| stf r3,*ar2++(ir0)
subf3 r0,r3,r4
mpyf3 r1,r5,r0
|| addf3 *ar1,*ar0,r3
mpyf3 *+ar4(ir1),r2,r3
|| stf r3,*ar0++(ir0)
addf r0,r3
fft4: stf r4,*ar3++(ir0)
|| stf r3,*ar1++(ir0)
cmpi ar7,r6
bnz fft3
lsh 1,ar5
brd fft1
lsh 1,ar6
ldi ar7,ir0
lsh -1,ar7
fft5: ldi r7,rc
subi 3,rc
ldi r7,ir0
lsh -1,ir0
ldi @INADDRD,ar0
ldi *ar0,ar0
addi3 r7,ar0,ar1
ldi ar0,ar2
nop *ar0++(1)
nop *ar2++(ir0)B
ldi ar1,ar3
rptb fft6
cmpi ar2,ar0
bged fft6
nop *ar1++(1)
nop *ar3++(ir0)B
ldf *ar2,r2
|| ldf *ar0++(1),r0
ldf *ar3,r3
|| ldf *ar1,r1
stf r2,*-ar0(1)
|| stf r0,*ar2
stf r3,*ar1
|| stf r1,*ar3
fft6: nop *ar2++(ir0)B
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub9:ifft
ifft: ldi @LOGIFFT,ar0 ;ar0 save 08--256
ldi 1,ar1
lsh3 *ar0,ar1,r7
ldi r7,ir0
ldi r7,ar7
lsh -1,ar7
ldi 2048,ir1
ldi 13,ar4
subi *ar0,ar4
lsh3 ar4,ar1,ar5
ldi 1,ar6
ldi @INADDRD,ar0
ldi *ar0,ar0
ldi r7,r0
addi3 r0,ar0,ar0
ldi r0,rc
subi 1,rc
rptb ifft1
ldf *ar0,r0
negf r0,r0
ifft1: stf r0,*ar0++(1)
ifft2: ldi @INADDRD,ar1
ldi *ar1,ar0
addi3 ar7,ar0,ar1
addi3 r7,ar0,ar2
addi3 ar7,ar2,ar3
ldi ar6,rc
subi 1,rc
rptb ifft3
addf3 *ar1,*ar0,r0
subf3 *ar1,*ar0,r1
addf3 *ar3,*ar2,r2
subf3 *ar3,*ar2,r3
stf r1,*ar1++(ir0)
|| stf r0,*ar0++(ir0)
ifft3: stf r3,*ar3++(ir0)
|| stf r2,*ar2++(ir0)
cmpi 1,ar7
bzd ifft6
ldi 1,r6
ldi @SINTAB,ar4
ifft4: addi ar5,ar4
ldf *ar4,r5
ldi r6,ar0
ldi @INADDRD,ar1
ldi *ar1,ar1
addi ar1,ar0
addi3 ar7,ar0,ar1
addi3 r7,ar0,ar2
addi3 ar7,ar2,ar3
addi 1,r6
ldi ar6,rc
subi 1,rc
rptb ifft5
subf3 *ar1,*ar0,r2
subf3 *ar3,*ar2,r1
mpyf3 r2,r5,r0
|| addf3 *ar3,*ar2,r3
mpyf3 *+ar4(ir1),r1,r3
|| stf r3,*ar2++(ir0)
subf3 r0,r3,r4
mpyf3 r1,r5,r0
|| addf3 *ar1,*ar0,r3
mpyf3 *+ar4(ir1),r2,r3
|| stf r3,*ar0++(ir0)
addf r0,r3
ifft5: stf r4,*ar3++(ir0)
|| stf r3,*ar1++(ir0)
cmpi ar7,r6
bnz ifft4
lsh 1,ar5
brd ifft2
lsh 1,ar6
ldi ar7,ir0
lsh -1,ar7
ifft6: ldi r7,rc
subi 3,rc
ldi r7,ir0
lsh -1,ir0
ldi @INADDRD,ar1
ldi *ar1,ar0
addi3 r7,ar0,ar1
ldi ar0,ar2
nop *ar0++(1)
nop *ar2++(ir0)B
ldi ar1,ar3
rptb ifft7
cmpi ar2,ar0
bged ifft7
nop *ar1++(1)
nop *ar3++(ir0)B
ldf *ar2,r2
|| ldf *ar0++(1),r0
ldf *ar3,r3
|| ldf *ar1,r1
stf r2,*-ar0(1)
|| stf r0,*ar2
stf r3,*ar1
|| stf r1,*ar3
ifft7: nop *ar2++(ir0)B
ldi @INADDRD,ar0
ldi *ar0,ar0
ldi r7,r0
addi3 r0,ar0,ar0
ldi r0,rc
subi 1,rc
rptb ifft8
ldf *ar0,r0
negf r0,r0
ifft8: stf r0,*ar0++(1)
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub12: sort
sort: ldi ar0,ar2
ldf *ar2,r0 ;第一个值读出,逐地址比较
ldf r0,r2
subi ar0,ar1 ;末地址-首地址,得出比较(循环)次数
ldi ar1,rc
rptb sort1
ldf *++ar0,r0
cmpf r0,r2 ;浮点数的比较
bgt sort1 ;若大于,则不执行操作
ldf r0,r2 ;若小于,则大值覆盖小值
ldi ar0,ar2
sort1: nop
ldi ar2,ar0 ;数据放到出口参数里
ldf r2,r0
call sqrt ;进行衰减
subi CLSLENTH,ar2
ldi CLSLENTH,r1
mpyi 2,r1
ldf 0.0,r2
rpts r1
stf r2,*ar2++ ;谱线的周边10个进行清零
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;信号频谱细化32倍
zfft: ldi @INADDR,ar0 ;输入输出数据的实部首地址
ldi ar0,ar1 ;ar0为搬移后的实部存储地址,ar1为虚部
addi 256,ar1 ;存储地址,实部与虚部距离256点
ldi ar0,ar2
addi 1700,ar2 ;ar2和ar3分别为需要搬移的频段的实部和虚部地址
subi 40,ar2 ;载频1700,区段为1660-1740
ldi ar2,ar3 ;ar3=ar2=实部首地址+1660
addi 8192,ar3 ;实部与虚部的距离8192Hz,ar3=虚部首地址+1660
ldi 80,rc ;rc=80
rptb zrest0 ;频谱搬移
ldf *ar2++,r0
ldf *ar3++,r1
stf r0,*ar0++
zrest0: stf r1,*ar1++ ;搬移后,ar0指向实部第81个点,ar1指向虚部第81个点
ldf 0,r2 ;(80-127)点清零
ldi 46,rc
rptb zfft1
zfft1: stf r2,*ar0++
|| stf r2,*ar1++
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldi ar0,ar2 ;镜象赋值
ldi ar1,ar3 ;把上述获得的0-127点的值赋给128-255
nop *ar0-- ;数据关于第128点中心对称
nop *ar1--
ldi 127,rc
rptb same
ldf *ar0--,r0
|| ldf *ar1--,r1
same: stf r0,*ar2++
|| stf r1,*ar3++
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;256 point ifft
ldi @INADDRD,ar0
ldi @INADDR,r0
sti r0,*ar0
ldi @LOGFFT,ar0
ldi 8,r0
sti r0,*ar0
call ifft
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldi @INADDR,ar0 ;256点搬移
addi 256,ar0
ldi @INADDR,ar1
addi 8192,ar1
ldi 254,rc ;256-2
ldf *ar0++,r1
rptb zfft2
zfft2: ldf *ar0++,r1
|| stf r1,*ar1++
stf r1,*ar1++ ;实部不动,只移动虚部
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldf 0,r2
ldi @INADDR,ar0
addi 256,ar0
ldi 8192,rc
subi 257,rc ;8192-256-1
rptb zfft3
zfft3: stf r2,*ar0++ ;除了实部和虚部外的地方清零
|| stf r2,*ar1++
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldi @INADDRD,ar0 ;在调用fft函数之前进行入口参数设置
ldi @INADDR,r0
sti r0,*ar0 ;fft数据起始地址指针INADDRD
ldi @LOGFFT,ar0 ;0d就是13,2的13次幂
ldi SULOG,r0
sti r0,*ar0
call fft ;进行2的13次幂8192点的fft
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
output: ldi @MCTL,ar3 ;INIT MAIN BUS
ldi MBUS3,ar1
sti ar1,*ar3
ldi @MCTLS,ar3
sti ar1,*ar3
ldi @PORT232,ar0 ;双口RAM
addi 1,ar0 ;指向标志位下一位,数据长度
ldi 21,r0
sti r0,*ar0++ ;第1个数据传输数据长度
ldi @FM,ar1
ldf *ar1,r1
mpyf 0.03125,r1
mpyf 10.0,r1 ;精确到0.1
addf 0.5,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
and3 ar4,r1,r0 ;low 8 bit
and 0ff00h,r1 ;high 8 bit
lsh -8,r1
sti r1,*ar0++
sti r0,*ar0++
ldi @FC,ar1
ldf *ar1,r1
mpyf 0.03125,r1
addf @A,r1
mpyf 10.0,r1 ;精确到0.1
addf 0.5,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
and3 ar4,r1,r0 ;low 8 bit
and 0ff00h,r1 ;high 8 bit
lsh -8,r1
sti r1,*ar0++
sti r0,*ar0++
ldi @F2,ar1
ldf *ar1,r1
mpyf 0.03125,r1
addf @A,r1
mpyf 10.0,r1 ;精确到0.1
addf 0.5,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
and3 ar4,r1,r0 ;low 8 bit
and 0ff00h,r1 ;high 8 bit
lsh -8,r1
sti r1,*ar0++
sti r0,*ar0++
ldi @F3,ar1
ldf *ar1,r1
mpyf 0.03125,r1
addf @A,r1
mpyf 10.0,r1 ;精确到0.1
addf 0.5,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
and3 ar4,r1,r0 ;low 8 bit
and 0ff00h,r1 ;high 8 bit
lsh -8,r1
sti r1,*ar0++
sti r0,*ar0++
ldi @FCAMP,ar1
ldf *ar1,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
lsh 24,ar4 ;ar4=ff000000
and3 ar4,r1,r0
lsh -24,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
lsh -16,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
lsh -8,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
sti r0,*ar0++
ldi @F2AMP,ar1
ldf *ar1,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
lsh 24,ar4
and3 ar4,r1,r0
lsh -24,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
lsh -16,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
lsh -8,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
sti r0,*ar0++
ldi @F3AMP,ar1
ldf *ar1,r1
fix r1 ;浮点->整型
ldi 0ffh,ar4
lsh 24,ar4
and3 ar4,r1,r0
lsh -24,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
lsh -16,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
lsh -8,r0
sti r0,*ar0++
lsh -8,ar4
and3 ar4,r1,r0
sti r0,*ar0
;-------------------------------------
ldi @PORT232,ar0
ldi 55h,r0
sti r0,*ar0
ldi @MCTL,ar3
ldi MBUS1,ar1
sti ar1,*ar3
ldi @MCTLS,ar3
sti ar1,*ar3
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data
;--------------------------------------common data
SINTAB .word SINP
FS .set 727H
DLENTH .set 8192
SULOG .set 0dH
SULOG1 .set 08H
SAMNUM .set 2000H
CLSLENTH .set 320
;--------------------------------------
XNUM .float 0.00048828 ;1/2048
FREQXS .float 1.0 ;8192/8192
A .float 1660
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADRR
SADDR .word 7000H
TNUM .word 7001H
INADDRD .word 7002H
LOGFFT .word 7003H
LOGIFFT .word 7011H
;--------------------------------------
MCTLS .word 7004H
LEDS .word 7005H
FL .word 7006H
FH .word 7007H
F1 .word 7008H
;--------------------------------------
FC .word 7009H
FCAMP .word 700AH
FM .word 700BH
F2 .word 700CH
F2AMP .word 700DH
F3 .word 700EH
F3AMP .word 700FH
;---------------------------------------------------------------FLASH
TSDATA .word 10000H
TSDATAM .word 12000H
;------------------------------------------------------------inter ram
MCTL .word 808064H
STCK .word 809E00H
INADDR .word 800000H
PWADDR .word 804000H
;--------------------------------------------------------------------------
ADADER .word 810000H ;read
ADADERM .word 810001H ;write
LED .word 810003H
DDS_FREQ0L .word 810008H
DDS_FREQ0H .word 810009H
DDS_FREQ1L .word 81000AH
DDS_FREQ1H .word 81000BH
DDS_PHASE0 .word 81000CH
DDS_PHASE1 .word 81000DH
DDS_PHASE2 .word 81000EH
DDS_PHASE3 .word 81000FH
;--------------------------------------------------------------------------
PORT232 .word 0C00000H
PORT2 .word 0C00200H
;--------------------------------------------------------------------------
MBUS1 .set 0001038H ;001x wait level 3--1 wait
MBUS3 .set 0001078H ;011x wait level 7--3 wait dual port
MBUS7 .set 00010F8H ;111x wait level F--7 wait DDS & D/A
;-----------------------------------------------------------T_DATA
SINGFXS .float 178.95697 ;2^32/24000000
FT15M .float 15000000.0 ;FT15M=F0/FS/8=120000000/8/FS=15000000/FS
;-----------------------------------------------------------------------------
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -