📄 sin.asm
字号:
;sin.asm
;sin(theta)=x(1-x^2/2*3(1-x^2/4*5(1-x^2/6*7(1-x^2/8*9))))
;cos(theta)=1-x^2/2(1-x^2/3*4(1-x^2/5*6(1-x^/7*8)))
;sin(2*theta)=2*sin(theta)*cos(theta)
.title "sin.asm"
.mmregs
.global reset,start
.def start,_c_int00
.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx
sin_x: .usect "sin_x",360 ;
STACK: .usect "STACK",10
k_theta .set 286 ;pi/360*32767=286
PA13 .set 13
TMP .set 60h
DLEVEL .set 61h
LEVEL .set 8000h
.text
_c_int00
b start
nop
nop
NMI rete
nop
nop
nop
SINT17 .space 4*16
SINT18 .space 4*16
SINT19 .space 4*16
SINT20 .space 4*16
SINT21 .space 4*16
SINT22 .space 4*16
SINT23 .space 4*16
SINT24 .space 4*16
SINT25 .space 4*16
SINT26 .space 4*16
SINT27 .space 4*16
SINT28 .space 4*16
SINT29 .space 4*16
SINT30 .space 4*16
INT0: rsbx intm
rete
nop
nop
INT1 rsbx intm
rete
nop
nop
INT2 rsbx intm
rete
nop
nop
TINT: rete
nop
nop
nop
RINT0: rete
nop
nop
nop
XINT0: rete
nop
nop
nop
RINT1: rete
nop
nop
nop
XINT1: rete
nop
nop
nop
INT3: rete
nop
nop
nop
start:
STM #STACK+10,SP
LD #LEVEL,A ;[DLEVEL] = >800
STL A,DLEVEL
LD #0,A
STM #sin_x,AR1
RPTZ A,#1024
STL A,*AR1+
STM k_theta,AR0
STM 0,AR1
STM #sin_x,AR6
STM #90,BRC
RPTB loop1-1
LDM AR1,A
LD #d_xs,DP
STL A,@d_xs
STL A,@d_xc
CALL sinx
CALL cosx
LD #d_sinx,DP
LD @d_sinx,16,A
MPYA @d_cosx
STH B,1,*AR6+
MAR *AR1+0
loop1: STM #sin_x+90-1,AR7
STM #90-2,BRC
RPTB loop2-1
LD *AR7-,A
STL A,*AR6+
loop2: STM #360/2-1,BRC
STM #sin_x,AR7
RPTB loop3-1
LD *AR7+,A
NEG A
STL A,*AR6+
loop3: STM #sin_x,AR6
STM #1,AR0
STM #360,BK
loop4: LD *AR6+0%,A
ADD DLEVEL,A
STH A,12,TMP
PORTW TMP,PA13
B loop4
sinx:
.def d_xs,d_sinx
.data
table_s .word 01c7h ;c1=1/(8*9)
.word 030bh ;c2=1/(6*7)
.word 0666h ;c3=1/(4*5)
.word 1556h ;c4=1/(2*3)
d_coef_s .usect "coef_s",4
d_xs .usect "sin_vars",1
d_squr_xs .usect "sin_vars",1
d_temp_s .usect "sin_vars",1
d_sinx .usect "sin_vars",1
c_l_s .usect "sin_vars",1
.text
SSBX FRCT
STM #d_coef_s,AR5
RPT #3
MVPD #table_s,*AR5+
STM #d_coef_s,AR3
STM #d_xs,AR2
STM #c_l_s,AR4
ST #7FFFh,c_l_s
SQUR *AR2+,A
ST A,*AR2
||LD *AR4,B
MASR *AR2+,*AR3+,B,A
MPYA A
STH A,*AR2
MASR *AR2-,*AR3+,B,A
MPYA *AR2+
ST B,*AR2
||LD *AR4,B
MASR *AR2-,*AR3+,B,A
MPYA *AR2+
ST B,*AR2
||LD *AR4,B
MASR *AR2-,*AR3+,B,A
MPYA d_xs
STH B,d_sinx
RET
cosx:
.def d_xc,d_cosx
d_coef_c .usect "coef_c",4
.data
table_c .word 0249h ;c1=1/(7*8)
.word 0444h ;c2=1/(5*6)
.word 0aabh ;c3=1/(3*4)
.word 4000h ;c4=1/2
d_xc .usect "cos_vars",1
d_squr_xc .usect "cos_vars",1
d_temp_c .usect "cos_vars",1
d_cosx .usect "cos_vars",1
c_l_c .usect "cos_vars",1
.text
SSBX FRCT
STM #d_coef_c,AR5
RPT #3
MVPD #table_c,*AR5+
STM #d_coef_c,AR3
STM #d_xc,AR2
STM #c_l_c,AR4
ST #7FFFh,c_l_c
SQUR *AR2+,A
ST A,*AR2
||LD *AR4,B
MASR *AR2+,*AR3+,B,A
MPYA A
STH A,*AR2
MASR *AR2-,*AR3+,B,A
MPYA *AR2+
ST B,*AR2
||LD *AR4,B
MASR *AR2-,*AR3+,B,A
SFTA A,-1,A
NEG A
MPYA *AR2+
MAR *AR2+
RETD
ADD *AR4,16,B
STH B,*AR2
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -