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

📄 hyperbolic.asm

📁 这是用台湾KingB 8位单片机开发的科学计算器程序
💻 ASM
字号:
;/subrutine name : Hyperbolic.asm
;/user bady      : 
;/fast clock     :  
;/slow clock     :  
;/programer      : Alton
;
;



       			.area   Hyperbolic_data(data,rel)
       			
.InpLength		EQU		0x08       			     
 			
       			.area   Hyperbolic_code(code,rel)
.SinH::						;;1/2(e^x-e^-x)	SinH(-x)=-SinH(x)
		
		lda0	SignX
		sta0	.Buf1			;STORE SignX
		lda	#0h
		sta0	SignX
		call	.X_trans_Buf	
		call	.CkXsize
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.EndSinH
		call	.Buf_trans_X
		call	.X_trans_B
		call	.ClrY
		lda	#01h
		sta0	OperandY+6
		lda	#05h
		sta0	PointY
		call	Subtration
		lda0	SignZ
		cmpe	#01h
		brz	.GetBufToZ
		call	.Buf_trans_X		
		call	.ClrY
		lda	#33h
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignX
		sta	SignY
		sta	PointY		
		call    Subtration
		lda	SignZ
		cmpe	#01h
		brz	.SinCondition1
		call	.Buf_trans_X
		call	Ex
		call	.Z_trans_X
		br	.SinCondition2		
.SinCondition1:					;x<33
		lda	.Buf_trans_X
		lda	#0h
		sta	SignX
		call	Ex
		call	.Z_trans_Buf
		call	.Put_1_to_OperandX			   
		call	.Buf_trans_Y
		call    Division
		call	.Buf_trans_X
		call	.Z_trans_Y
		call    Subtration
.SinCondition2:					;x>33
		call	.ClrY
		lda	#02h		
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignY
		sta	PointY	
		call	.Z_trans_X
		call    Division
		call	.B_trans_X		
		lda0	.Buf1			;STORE SignX
		sta	SignZ
		br	.EndSinH
.GetBufToZ:
		call	.Buf_trans_Z		
.EndSinH:		
		ret  			
;===========================================		
.CosH::						;1/2(e^x+e^-x)	CosH(x)=CosH(-x)
		lda	#0h			;;228
		sta0	SignX			;228
		call	.X_trans_Buf
		call	.CkXsize
		lda0	ErrorFlag
		cmpe	#0h
		brnz	.EndCosh
		call	.Buf_trans_X		
		call	.ClrY
		lda	#33h
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignX
		sta	SignY
		sta	PointY		
		call    Subtration
		lda	SignZ
		cmpe	#01h
		brz	.CosCondition1
		call	.Buf_trans_X	
		lda	#0h
		sta	SignX
		call	Ex
		call	.Z_trans_X
		br	.CosCondition2		
.CosCondition1:					;x<33
		lda	.Buf_trans_X
		lda	#0h
		sta	SignX
		call	Ex
		call	.Z_trans_Buf
		call	.Put_1_to_OperandX			   
		call	.Buf_trans_Y
		call    Division
		call	.Buf_trans_X
		call	.Z_trans_Y
		call    Addition
.CosCondition2:					;x>33
		call	.ClrY
		lda	#02h		
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignY
		sta	PointY	
		call	.Z_trans_X
		call    Division
		lda	#0h
		sta	SignZ
.EndCosh:		
		ret  
;===========================================
.TanH::		
;--------check limit big				;1-2/((e ^2x)+1)
		call	.X_trans_Buf
		lda	#0h
		sta0	SignX
		call	.ClrY
		lda	#01h			;IF X>=12.2 ANS Z=1
		sta0	OperandY+5
		lda	#22h
		sta0	OperandY+6
		lda	#01h
		sta0	PointY
		call	Subtration
		lda0	SignZ
		cmpe	#0h
		brz	.Ans1
;--------check limit small			;if x<1^-5 Ans =X
		call	.Buf_trans_X
		lda	#0h
		sta0	SignX
		call	.ClrY
		lda	#01h
		sta0	OperandY+6
		lda	#05h
		sta0	PointY
		call	Subtration
		lda0	SignZ
		cmpe	#01h
		brz	.GetBufToZ 

;-------------				
		call	.Buf_trans_X
		lda0	SignX
		cmpe	#01h
		brnz	.DoTanh
		call	.ClrY	
		lda	#01h
		sta0	PointY
		sta0	OperandY+5	 
		lda	#22h
		sta0	OperandY+6
		lda	#0h
		sta0	SignX
		call	Subtration
		lda0	SignZ
		cmpe	#0h
		brz	.Ans_1
.DoTanh:		
		call	.Buf_trans_X
		call	.ClrY
		lda	#02h		
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignY
		sta	PointY
		call    Multiplation
		call	.Z_trans_X
		call	Ex							       			
		call	.Z_trans_Y
		call	.Put_1_to_OperandX
		call    Addition
		call	.ClrX
		lda	#02h		
		sta	OperandX+.InpLength-2
		lda	#0h
		sta	SignX
		sta	PointX
		call	.Z_trans_Y
		call    Division
		call	.Put_1_to_OperandX
		call	.Z_trans_Y
		call    Subtration
		br	.EndTanH
.Ans1:
		call	.Buf_trans_X
		lda0	SignX
		cmpe	#0h
		brnz	.Ans_1	
		call	.Put_1_to_OperandX
		call	.X_trans_Z
		br	.EndTanH
.Ans_1:
		call	.Put_1_to_OperandX
		call	.X_trans_Z
		lda	#01h
		sta0	SignZ
		br	.EndTanH		
.EndTanH:
		
		ret
		
;===========================================
.AsinH::				;ln(x+sqrt(x^2+1)) x belong R	
	
		lda0	SignX		;x=|x|
		sta0	.Buf1
		lda	#0h
		sta0	SignX
		call	.X_trans_Buf
		call	.ClrY
		lda	#01h
		sta0	OperandY+6
		lda	#05h
		sta0	PointY
		call	Subtration
		lda0	SignZ
		cmpe	#01h
		brz	.GetXtoZ
		call	.Buf_trans_X
		lda0	PointX
		suba	#9dh
		brnc	.NormalAsinh
		lda0	PointX
		suba	#0e0h		;<=exp^32
		brnc	.AsinHXisBigNum
.NormalAsinh:		
		call	.XSqu
		call	.ClrX
		call	.Put_1_to_OperandX
		call	.Z_trans_Y
		call    Addition
		call	.Z_trans_X		
		call	.Squ
		call	.Buf_trans_X
		call	.Z_trans_Y
.Bignumsin::		
		call    Addition
		call	.Z_trans_X
		call	Ln
		lda0	.Buf1		;X's SignX
		sta0	SignZ
		br	.EndAsinh		
.AsinHXisBigNum:
		call	.Buf_trans_X
		call	.Buf_trans_Y
		br	.Bignumsin		
.GetXtoZ:
		call	.Buf_trans_Z		
.EndAsinh:		
		ret
;===========================================
.AcosH::				;ln(x+sqrt(x^2-1))  x>=1
		call	.X_trans_Buf
		call	.ClrY
		lda	#01h		
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignY
		sta	PointY	
		call	.Buf_trans_X
		call    Subtration
		lda	SignZ
		cmpe	#01h
		brz	.ErrorInvCosHInput
		lda0	PointX
		suba	#9dh
		brnc	.NormalAcosh
		lda0	PointX
		suba	#0e0h		;<=exp^32
		brnc	.AcosHXisBigNum
.NormalAcosh:		
		call	.XSqu		
		call	.Put_1_to_OperandX
		lda	#01h
		sta	SignX
		call	.Z_trans_Y
		call    Addition
		call	.Z_trans_X				
		call	.Squ
		call	.Buf_trans_X
		call	.Z_trans_Y
.Bignumcos:		
		call    Addition
		call	.Z_trans_X
		call	Ln
		br	.EndInvCosH
.AcosHXisBigNum:		
		call	.Buf_trans_X
		call	.Buf_trans_Y
		br	.Bignumcos
.ErrorInvCosHInput:
		lda	#01h
		sta	ErrorFlag
.EndInvCosH:				
		ret
;===========================================
.AtanH::				;-1<x<1 ; 1/2(ln(1+x)-ln(1-x))
		call	.X_trans_Buf
		call	.X_trans_Z
		call	.DelPoint
		lda	OperandZ+.InpLength-2
		cmpe	#0h
		brnz	.ErrorInvTanHInput		
		call	.Put_1_to_OperandX
		call	.Buf_trans_Y
		call    Subtration
		call	.Z_trans_X
		call	Ln
		call	.Z_trans_B			
		call	.Put_1_to_OperandX
		call	.Buf_trans_Y
		call    Addition
		call	.Z_trans_X
		call	Ln		
		call	.B_trans_Y
		call	.Z_trans_X
		call    Subtration
		call	.ClrY
		lda	#02h		
		sta	OperandY+.InpLength-2
		lda	#0h
		sta	SignY
		sta	PointY
		call	.Z_trans_X	
		call    Division
		br 	.EndInvTanH	
.ErrorInvTanHInput:		
		lda	#01h
		sta	ErrorFlag
.EndInvTanH:				
		ret
;-------------------------------------------
.CkXsize:
		call	.ClrY
		lda	#07h
		sta0	PointY	
		lda	#23h
		sta0	OperandY
		lda	#02h
		sta0	OperandY+1
		lda	#58h
		sta0	OperandY+2
		lda	#50h
		sta0	OperandY+3
		lda	#93h
		sta0	OperandY+4
		call	Subtration
		lda0	SignZ
		cmpe	#0h
		brnz	.EndXsize
		lda	#01h
		sta0	ErrorFlag
.EndXsize:
		ret									

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -