📄 hyperbolic.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 + -