📄 ex5demo.asm
字号:
.sect "init"
.global init,SINP
.text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;init start!!!
.word init
.space 8
.word timer0
init: ldp 0,dp
ldi @STCK,sp ;INIT STACK
ldi 1800H,st ;INIT ST
ldi @MCTL,ar0 ;INIT MAIN BUS
ldi MBUS1,r0
sti r0,*ar0
ldi @MCTLS,ar0
sti r0,*ar0
ldi 0,r0
ldi @TSDATA,ar0
rpts @SAMNUM
sti r0,*ar0++
ldi @PORT232,ar1
rpts 030h
sti r0,*ar1++
ldi 0,r0
ldi @ADADER,ar0 ;SET A/D MODE A CHANNL 1 LU
sti r0,*ar0
ldi @ADADERM,ar0
sti r0,*ar0 ;RUN A/D
ldi @TNUM,ar0
sti r0,*ar0
ldi @TSDATA,ar0
ldi @SADDR,ar1
sti ar0,*ar1
;-------------------------DDS
call ddsinit
ldf 11,r0
ldi @F1,ar0
stf r0,*ar0
float 1000,r0
ldi @FL,ar0
stf r0,*ar0
float 1000,r0
ldi @FH,ar0
stf r0,*ar0
call sinit
;-------------------------DDS
call initt0 ;timer0 init
ldi 100H,IE ;ACTIVE TIMER0
or 2000h,st
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;init end!!!
start: ldi @TNUM,ar0
ldi *ar0,r0
absi r0
cmpi 2000h,r0
blt start
ldi 0,r0
sti r0,*ar0
ldi @LEDS,ar0
ldi *ar0,r0
cmpi 0,r0
ldieq 1,r0
ldine 0,r0
sti r0,*ar0
ldi @LED,ar0
sti r0,*ar0
call msamp
call haming
ldi @INADDRD,ar0
ldi @INADDR,r0
sti r0,*ar0
ldi @LOGFFT,ar0
ldi SULOG,r0
sti r0,*ar0
call fft
ldi 0,ar0
ldi 4095,ar1
addi @INADDR,ar0
addi @INADDR,ar1
ldi DLENTH,r0
call spc1
; call sort ;you must write the program
; call output
br start
;--------------------------------------------------------------comm_sub list
; 1: timer0 2: msamp 3: haming 4: spc1 5: initt0
; 6: ddsinit 7: sinit 8: initt1 9: invf 10: sqrt 11: fft
;--------------------------------------------------------------comm sub list
;INTERRUPT SERVER;;;;;;;;;;;;;;;;;;;;;;comm sub1: timer0
timer0: push st
push ar0
push ar1
push ar2
push BK
ldi SAMNUM,BK
ldi @MCTL,ar0
ldi MBUS7,ar1
sti ar1,*ar0
ldi @ADADER,ar0
ldi *ar0++,ar2
addi 2000h,ar2
and 3fffh,ar2
sti ar2,*ar0
ldi @SADDR,ar0
ldi *ar0,ar0
sti ar2,*ar0++%
ldi @SADDR,ar2
sti ar0,*ar2
ldi @MCTL,ar1
ldi @MCTLS,ar0
ldi *ar0,ar0
sti ar0,*ar1
ldi @TNUM,ar0
ldi *ar0,ar1
addi 1,ar1
sti ar1,*ar0
pop BK
pop ar2
pop ar1
pop ar0
pop st
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub2: msamp
msamp: ldi SAMNUM,BK
ldi @INADDR,ar2
ldi @SADDR,ar0
ldi *ar0,ar1
ldi DLENTH,rc
subi 2,rc
float *ar1++%,r0
rptb samp0
samp0: float *ar1++%,r0
|| stf r0,*ar2++
stf r0,*ar2++
ldf 0.0,r0
ldi DLENTH,rc ;SET DATA LENGTH
subi 1,rc
rptb samp1
samp1: stf r0,*ar2++ ;IMAG PART CLEAR end
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub3: HAMING_windows
haming: ldi @INADDR,ar0
ldi 8192,ar7
ldi @SINTAB,ar6 ;SET SINTAB ADDER
addi 17ffh,ar6 ;97,11
ldi ar7,r5
lsh -1,r5
subi 1,r5
ldi ar7,rc ;SET REPEAT LEN.
subi 1,rc
rptb ham
ldf *ar0,r2
cmpi r5,rc ;1fffh-1000h 1 part
blt part2
beq mid ;0fffh-0 2 part
ldf *ar6--,r6
br nom
mid: nop *ar6++
part2: ldf *ar6++,r6
nom: addf 1.0,r6
mpyf 0.46,r6
addf 0.08,r6
mpyf r6,r2
ham: stf r2,*ar0++
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub4: spc1
spc1: ldi @PWADDR,ar2 ;interface:ar0,ar1
subi3 ar0,ar1,rc ; ar0:real part addr.
addi3 r0,ar0,ar1 ; output addr. PWADDR
rptb sends ;use:PWADDR DLENTH
ldf *ar1++,r1 ;use:ar0-ar2,r0,r1,rc
|| ldf *ar0++,r0
mpyf r0,r0
mpyf r1,r1
addf r1,r0
sends: stf r0,*ar2++
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub5: initt0
initt0: ldi 0,r0
ldi 808h,ar0
lsh 12,ar0
addi 20h,ar0
sti r0,*+ar0(4)
ldi FS,r0
sti r0,*+ar0(8)
ldi 3c1h,r0
sti r0,*ar0
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub6: ddsinit
ddsinit:ldi @MCTL,ar0
ldi MBUS7,r0
sti r0,*ar0
ldi 4000h,r0
lsh 4,r0
rpts r0
nop
ldi 0,r0
ldi @DDS_PHASE0,ar0
sti r0,*ar0
ldi @DDS_PHASE1,ar0
sti r0,*ar0
ldi @DDS_PHASE2,ar0
sti r0,*ar0
ldi @DDS_PHASE3,ar0
sti r0,*ar0
ldi @MCTL,ar0
ldi MBUS1,r0
sti r0,*ar0
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub7: sinit
sinit: ldi @F1,ar0
ldf *ar0,r0
call initt1
ldi @MCTL,ar0
ldi MBUS7,r0
sti r0,*ar0
ldi @FL,ar0
ldf *ar0,r0
ldi @FH,ar1
ldf *ar1,r1
mpyf @SINGFXS,r0
addf 0.5,r0
fix r0
mpyf @SINGFXS,r1
addf 0.5,r1
fix r1
ldi 0fh,r6
lsh 16,r6
and3 r6,r0,r5
lsh -16,r5
ldi @DDS_FREQ0H,ar0
sti r5,*ar0
ldi @DDS_FREQ0L,ar0
sti r0,*ar0
and3 r1,r6,r5
lsh -16,r5
ldi @DDS_FREQ1H,ar0
sti r5,*ar0
ldi @DDS_FREQ1L,ar0
sti r1,*ar0
ldi @MCTL,ar0
ldi MBUS1,r0
sti r0,*ar0
ldi @MCTLS,ar0
sti r0,*ar0
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub8: initt1
initt1: call invf ;input data R0 float
ldf @FT15M,r4
mpyf r0,r4
addf 0.5,r4
fix r4
ldi 0h,r0 ;r4=FS
ldi 808h,ar0 ;INIT TIMER1
lsh 12,ar0
addi 30h,ar0
sti r0,*+ar0(4) ;COUNTER CLEAR
sti r4,*+ar0(8) ;15000000/FS
ldi 3c1h,r0 ;RUN TIMER1
sti r0,*ar0
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub9: invf
invf: ldf r0,r3 ;use r0,r1,r2,r3
absf r0 ;input & output use r0
pushf r0
pop r1
ash -24,r1
negi r1
subi 1,r1
ash 24,r1
push r1
popf r1
mpyf r1,r0,r2
subrf 2.0,r2
mpyf r2,r1
mpyf r1,r0,r2
subrf 2.0,r2
mpyf r2,r1
mpyf r1,r0,r2
subrf 2.0,r2
mpyf r2,r1
mpyf r1,r0,r2
subrf 2.0,r2
mpyf r2,r1
rnd r1
mpyf r1,r0,r2
subrf 1.0,r2
mpyf r1,r2
addf r2,r1
rnd r1,r0
negf r0,r2
ldf r3,r3
ldfn r2,r0
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub10: sqrt
sqrt: ldf r0,r3 ;use r0,r1,r2,r3
retsle ;input & output use r0
pushf r0
pop r1
ash -24,r1
addi 1,r1
ash -1,r1
negi r1,r1
ash 24,r1
push r1
popf r1
mpyf 0.5,r0
mpyf3 r1,r1,r2
mpyf r0,r2
subrf 1.5,r2
mpyf r2,r1
rnd r1,r1
mpyf3 r1,r1,r2
mpyf r0,r2
subrf 1.5,r2
mpyf r2,r1
rnd r1,r1
mpyf3 r1,r1,r2
mpyf r0,r2
subrf 1.5,r2
mpyf r2,r1
rnd r1,r1
mpyf3 r1,r1,r2
mpyf r0,r2
subrf 1.5,r2
mpyf r2,r1
rnd r1,r1
mpyf3 r1,r1,r2
mpyf r0,r2
subrf 1.5,r2
mpyf r2,r1
rnd r1,r0
mpyf r3,r0
rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub11: fft
fft: ldi @LOGFFT,ar0 ;ar0 save 09--512,0b--2048
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
fft1: ldi @INADDRD,ar0
ldi *ar0,ar0
addi3 ar7,ar0,ar1
addi3 r7,ar0,ar2
addi3 ar7,ar2,ar3
ldi ar6,rc
subi 1,rc
rptb fft2
addf3 *ar1,*ar0,r0
subf3 *ar1,*ar0,r1
addf3 *ar3,*ar2,r2
subf3 *ar3,*ar2,r3
stf r1,*ar1++(ir0)
|| stf r0,*ar0++(ir0)
fft2: stf r3,*ar3++(ir0)
|| stf r2,*ar2++(ir0)
cmpi 1,ar7
bzd fft5
ldi 1,r6
ldi @SINTAB,ar4
fft3: 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 fft4
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data
;--------------------------------------common data
SINTAB .word SINP
FS .set 727H
DLENTH .set 8192
SULOG .set 0dH
SAMNUM .set 2000H
;--------------------------------------
XNUM .float 0.00048828 ;1/2048
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADRR
SADDR .word 7000H
TNUM .word 7001H
INADDRD .word 7002H
LOGFFT .word 7003H
;--------------------------------------
MCTLS .word 7004H
LEDS .word 7005H
FL .word 7006H
FH .word 7007H
F1 .word 7008H
;---------------------------------------------------------------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 + -