⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trigonom.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:

        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 + -