📄 ex4.asm
字号:
.sect "init"
.global init
.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 @ADADER,ar0
sti r0,*ar0
ldi @ADADERM,ar0
sti r0,*ar0
ldi @TSDATA,ar0
ldi @SADDR,ar1
sti ar0,*ar1
;-------------------------DDS
call ddsinit
ldf 11,r0
ldi @F1,ar0
sti r0,*ar0
float 495,r0
ldi @FL,ar0
stf r0,*ar0
float 605,r0
ldi @FH,ar0
stf r0,*ar0
call sinit
;-------------------------DDS
call initt0 ;timer0 init
ldi 100H,IE ;ACTIVE TIMER0
or 2000h,st
;--------------------------------------
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
br start
;------------------------------
;INTERRUPT SERVER;;;;;;;;;;;;;;;;;;;;;;comm sub1: timer0
timer0: push st
push ar0
push ar1
push ar2
push ar3
ldi @MCTL,ar3 ;INIT MAIN BUS
ldi MBUS7,ar1
sti ar1,*ar3
nop
ldi @ADADER,ar0
ldi *ar0,ar1
addi 2000h,ar1
and 3fffh,ar1
sti ar1,*ar0
ldi @SADDR,ar0
ldi *ar0,ar0
sti ar1,*ar0++
cmpi @TSDATAM,ar0
ldieq @TSDATA,ar0
ldi @SADDR,ar1
sti ar0,*ar1
ldi @MCTL,ar3
ldi MBUS1,ar1
sti ar1,*ar3
ldi 1,ar3
ldi @TNUM,ar0
addi3 ar3,*ar0,ar1
sti ar1,*ar0++
ldi @MCTL,ar3
ldi @MCTLS,ar0
ldi *ar0,ar0
sti ar0,*ar3
pop ar3
pop ar2
pop ar1
pop ar0
pop st
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sinit: ldi @F1,ar0
ldf *ar0,r0
call initt1
ldf @FL,r0
ldf @FH,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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;subE: 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 subE: 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data
DLENTH .set 2000H
TNUM .word 7000H
LEDS .word 7001H
MCTLS .word 7002H
SADDR .word 7003H
F1 .word 7005H
FL .word 7006H
FH .word 7007H
TSDATA .word 10000H
TSDATAM .word 12000H
INADDR .word 800000H
STCK .word 809E00H
MCTL .word 808064H
ADADER .word 810000H
ADADERM .word 810001H
LED .word 810003H
;------------------------------
FS .set 727H
SAMNUM .set 2000H
MBUS1 .set 001038H
MBUS3 .set 001098H
MBUS7 .set 0010F8H
;------------------------------
SINGFXS .FLOAT 178.95697 ;2^32/24000000
FT15M .FLOAT 15000000.0 ;FT15M=F0/FS/8=120000000/8/FS=15000000/FS
;--------------------------------------------------------------------------
DDS_FREQ0L .WORD 0810008H
DDS_FREQ0H .WORD 0810009H
DDS_FREQ1L .WORD 081000AH
DDS_FREQ1H .WORD 081000BH
DDS_PHASE0 .WORD 081000CH
DDS_PHASE1 .WORD 081000DH
DDS_PHASE2 .WORD 081000EH
DDS_PHASE3 .WORD 081000FH
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -