📄 trigonom.asm
字号:
call ClearData2
lda #01h
sta PointZ
lda #OperandZ
adda #Length
deca
sta r_dp
lda #05h
sta i
br EndSin
;*************************************
;get X*(pi/180)
;max data =pi/2=1.570796326....
; |_|____is table cal
;
;tan(x+y)=(tan(x)+tan(y))/(1-tan(x)*tan(y))
;
;tan(Q)=X+(X^3/3)+(2X^5/15)+(17X^7/315)+...
;*************************************
Tan::
;added by Golden
lda0 SignX
sta0 SignTemp
lda #0
sta0 SignX
call ClearBuffer
lda #0
sta OperandX+Length
lda #BufferXn
sta Addr1
call ClearData
lda #BufferTan
sta Addr1
call ClearData
lda #0
sta PointXn
sta PointT
sta SignXn
sta SignT
;Marked by Golden
;sta SignTemp
sta TanTemp
call CheckQuadrandtal
;;;;--------------------------tom edit by 2002.03.21
lda ErrorFlag
adda #0
brnz InputErr
;;;;--------------------------edit by 2002.03.21
lda Temp1
adda #0
brz 1$
rorc
brc Tan90
rorc
brc Tan180
rorc
brc Tan270
rorc
brc Tan360
rorc
1$: ;;;chk X>45'
lda #0h
sta Xn
;;clear operandY
lda #OperandY
sta Addr1
call ClearData
;;;;-------------push 45 to operandY
lda #OperandY
adda #Length
deca
sta r_dp
lda #45h
sta i
; lda #45h
; sta OperandY+5
lda #0
sta PointY
lda #OperandY
sta Addr1
lda PointY
cmpe PointX
brz 9$
8$: ;;;adj operandY point=operandX
call ShiftToL
lda PointY
inca
sta PointY
cmpe PointX
;; brnz 8$ ;;;;2001.12.27
brz 9$ ;;;;2001.12.27
lda OperandY ;;;;2001.12.27
anda #0f0h ;;;;2001.12.27
brnz 7$ ;;;;2001.12.27
br 8$ ;;;;2001.12.27
9$:
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
lda #Length
sta DpCount
;;;compare X,Y
call CompareData
lda Temp1
adda #0
brz Tan45
deca
brnz 7$
;;;X>45' X=90-X
lda #OperandX
sta Addr1
lda #OperandY
sta Addr2
call CopyData
lda PointX
sta PointY
call ClearData
lda #OperandX
adda #Length
deca
sta r_dp
lda #90h
sta i
; lda #90h
; sta OperandX+5
lda #0
sta PointX
call Subtration
lda #OperandZ
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointZ
sta PointX
lda #01h
sta TanTemp
7$:
;;;Get pi
lda #^Pdata
sta TableC+2
lda #@Pdata
sta TableC+1
lda #<Pdata
sta TableC
lda #0
sta Temp2
call GetData
lda #0
sta Temp2
;;;get seta
call Multiplation
2$: ;;;chk seta head
;;-----------------------for check OperandZ=0
lda #OperandZ
sta Addr1
call CheckData
lda DpCount
adda #0
brz 3$
;;-----------------------
lda OperandZ
anda #0f0h
brnz 3$
lda #OperandZ
sta Addr1
lda #Length_Z
sta DpCount
call ShiftToL2
lda PointZ
inca
sta PointZ
br 2$
3$:
lda PointZ
suba #Length_Z ;;0ch
brz 5$
brnc 4$
lda #OperandZ
sta Addr1
lda #BufferXn
sta Addr2
call CopyData
lda PointZ
sta PointXn
br TanData00
4$: ;;;Get table data 2
lda OperandZ
sta Xn
lda #OperandZ
sta Addr1
lda #Length_Z
sta DpCount
call ShiftToL2
lda #Length_Z
sta DpCount
call ShiftToL2
lda PointZ
adda #02h
sta PointZ
br 6$
5$: ;;;Get table data 1
lda OperandZ
rorc
rorc
rorc
rorc
anda #0fh
sta Xn
lda #OperandZ
sta Addr1
lda #Length_Z
sta DpCount
call ShiftToL2
lda PointZ
inca
sta PointZ
6$: ;;;save seta to BufferXn
lda #OperandZ
sta Addr1
lda #BufferXn
sta Addr2
call CopyData
lda PointZ
sta PointXn
;;;clear operandX
lda #OperandX
sta Addr1
call ClearData
lda #0
sta PointX
GetXAddY: ;;;get TanXaddY table
lda #^TanXAddY
sta TableC+2
lda #@TanXAddY
sta TableC+1
lda #<TanXAddY
sta TableC
lda Xn
anda #0f0h
brz 1$
lda TableC
adda #50h
sta TableC
lda TableC+1
addc #0
sta TableC+1
lda TableC+2
addc #0
sta TableC+2
1$: ;;;Load X+Y data
lda Xn
anda #0fh
sta Temp2
;;;get X+Y data
call GetData
;;;save X+Y data to buffer
lda #OperandY
sta Addr1
lda #Buffer
sta Addr2
call CopyData
lda PointY
sta PointB
GetXMulY: ;;;reset signBz
lda #0
sta SignBz
;;;GetX*Y
lda #^TanXMulY
sta TableC+2
lda #@TanXMulY
sta TableC+1
lda #<TanXMulY
sta TableC
lda Xn
anda #0f0h
brnz 1$
;;;set X*Y=0
lda #OperandY
sta Addr1
call ClearData
;;;;------------------------push 1 to operandy
lda #0
sta PointY
lda #OperandY
adda #Length-1
sta r_dp
lda #01h
sta i
br 2$
1$:
lda Xn
anda #0fh
sta Temp2
;;;get X*Y data
call GetData
;;;save X*Y to bufferZ
lda #OperandY
sta Addr1
lda #BufferZ
sta Addr2
call CopyData
lda PointY
sta PointBz
lda Xn ;;;if Y>=6 Sign=1
anda #0fh
cmpe #06h
brnc 2$
lda #01h
sta SignBz
2$:
lda #Buffer
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointB
sta PointX
call Division
;;;save data to bufferTan
lda #OperandZ
sta Addr1
lda #BufferTan
sta Addr2
call CopyData
lda PointZ
sta PointT
lda SignZ
sta SignT
TanData00: ;;;;table end
lda #0
sta SignX
sta SignY
sta SignZ
;;;get X^2
lda #BufferXn
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointXn
sta PointX
;;;save X to BufferZ
lda #BufferZ
sta Addr2
call CopyData
lda PointXn
sta PointBz
lda #0
sta SignBz
call GetXX
;;;save X^2 to buffer
lda #OperandZ
sta Addr1
lda #Buffer
sta Addr2
call CopyData
lda PointZ
sta PointB
;;;move X^2 to Y
lda #OperandY
sta Addr2
call CopyData
lda PointZ
sta PointY
;;;move X to X
lda #BufferXn
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointXn
sta PointX
;;;X^2*X=X^3
call Multiplation
;;;save X^3 to X
lda #OperandZ
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointZ
sta PointX
;;;move X^3 to BufferXn
lda #BufferXn
sta Addr2
call CopyData
lda PointZ
sta PointXn
;;;push 3 to Y
lda #OperandY
sta Addr1
call ClearData
lda #OperandY
adda #Length-1
sta r_dp
lda #03h
sta i
lda #0
sta PointY
;;;X^3/3
call Division
;;;move X^3/3 to operandx
lda #OperandZ
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointZ
sta PointX
;;;move BufferZ to operandY
lda #BufferZ
sta Addr1
lda #OperandY
sta Addr2
call CopyData
lda PointBz
sta PointY
;;;get X+(X^3/3)
call Addition
;;;save X+(X^3/3) to bufferZ
lda #OperandZ
sta Addr1
lda #BufferZ
sta Addr2
call CopyData
lda PointZ
sta PointBz
;;;get X^5
lda #BufferXn ;load X^3 to operandx
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointXn
sta PointX
;;;load X^2 to operandy
lda #Buffer
sta Addr1
lda #OperandY
sta Addr2
call CopyData
lda PointB
sta PointY
;;;X^3*X^2=X^5
call Multiplation
;;;save X^5 to bufferxn
lda #OperandZ
sta Addr1
lda #BufferXn
sta Addr2
call CopyData
lda PointZ
sta PointXn
;;;move X^5 to operandX
lda #OperandX
sta Addr2
call CopyData
lda PointZ
sta PointX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lda #^TanTable1
sta TableC+2
lda #@TanTable1
sta TableC+1
lda #<TanTable1
sta TableC
lda #0
sta Temp2
call GetData
; ;;;Push 2/15 to operandy
; lda #OperandY
; sta r_dp
; lda #13h
; sta i
; incdp
; lda #33h
; sta i
; incdp
; lda #33h
; sta i
; incdp
; lda #33h
; sta i
; incdp
; lda #33h
; sta i
; incdp
; lda #33h
; sta i
; incdp
; lda #00h
; sta i
; lda #0ch
; sta PointY
;;;2/15*X^5
call Multiplation
;;;move to operandX
lda #OperandZ
sta Addr1
lda #OperandX
sta Addr2
call CopyData
lda PointZ
sta PointX
;;;move X+(X^3/3) data to Y
lda #BufferZ
sta Addr1
lda #OperandY
sta Addr2
call CopyData
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -