📄 calctools.asm
字号:
;/subrutine name : calc.asm
;/user bady : HE84770
;/fast clock : 4Mhz
;/slow clock : 32768khz
;/programer : Alton
;-------------------------------------------
.area calc_data(data,ABS)
.org 0xd6
Length EQU 0x07
.PointFlag::
.Hbuf::
.M_exp_Y:: .ds 1
.Lbuf::
.RandCnt:: .ds 1
.area calc_data1(data,abs)
.org 0x64
.DmsCount::
;.KeyBuf1::
.PFlag:: .ds 1
.PYPP::
.PSDP:: .ds 1
.INDP:: .ds 1
.CommaFlag::
.IFlag:: .ds 1
.STDP:: .ds 1
.FractDP::
.Buf1:: .ds 1
.InputDP::
.Buf2:: .ds 1
.LRcnt::
.Buf3::
.SymFlag:: .ds 1
.SFDP:: .ds 1
.Buf4::
.Cnter::
.DecFlag:: .ds 1
.ErrorCnt::
.FractTrsCnt::
.ReleaseCnt::
.TFlag:: .ds 1
.Cnter2::
.PXPP::
.BeforePari:: .ds 1
.RCFlag::
;.KeyBuf::
.AfterPari:: .ds 1
.Temp:: .ds 1
.CntIndex:: .ds 1
.FormulaFlag::
.PosFlag:: .ds 1
.KeyPos:: .ds 1
.DataBuf:: .ds 2
.FractCount::
.DispFlag::
.ZeroFlag::
.PXDP:: .ds 1
.PYDP:: .ds 1
.Counter:: .ds 1
.SimeFlag::
.Data:: .ds 1
.area calc_data3(data,abs)
.org 0x13a
.CntByte EQU 0x08 ;07
Sign_buf:: .ds 1
Point_buf:: .ds 1
Operand_buf:: .ds .CntByte
Sign_b:: .ds 1
Point_b:: .ds 1
Operand_b:: .ds .CntByte
Sign_s:: .ds 1
Point_s:: .ds 1
Operand_s:: .ds .CntByte
Sign_r:: .ds 1
Point_r:: .ds 1
Operand_r:: .ds .CntByte
Sign_i:: .ds 1
Point_i:: .ds 1
Operand_i:: .ds .CntByte
.area calc(code)
;--------------(.percent_add)----------------------
.Percent_Add::
call .Y_trans_Buf
call Addition
call CheckOutData
call .Z_trans_X
call .Buf_trans_Y
call Division
call CheckOutData
call .Z_trans_X
call .Put_100_to_OperandY
call Multiplation
ret
;-------------------(.percent_dec )-------------
.Percent_Dec::
call .Y_trans_Buf
call Subtration
call CheckOutData
call .Z_trans_X
call .Buf_trans_Y
call Division
call CheckOutData
call .Z_trans_X
call .Put_100_to_OperandY
call Multiplation
ret
;-------------------(.percent_mul )-------------
.Percent_Mul::
call Multiplation
call CheckOutData
call .Z_trans_X
call .Put_100_to_OperandY
call Division
ret
;-------------------( .percent_div )-------------
.Percent_Div::
call Division
call CheckOutData
call .Z_trans_X
call .Put_100_to_OperandY
call Multiplation
ret
;-----------------------( ReciX 1/X )----------------------
.ReciX::
call .X_Squ
call .ClrX
call .Put_1_to_OperandX
call Division
ret
;-----------------------( Log )----------------------
.Log::
call Ln
call .Z_trans_Buf
call .ClrZ
call .ClrY
call .ClrX
call .Put_10_to_OperandX
call Ln
call .Z_trans_Y
call .Buf_trans_X
call Division
ret
;-----------------------( X ^2 )-----------------------
.XSqu::
call .X_Squ
call Multiplation
ret
;-----------------------( X ^3 )-----------------------
.XCube::
call .X_trans_Buf
call .X_Squ
call Multiplation
call .Buf_trans_X
call .Z_trans_Y
call Multiplation
ret
;-------------------------------------------
.Factorial::
lda0 ErrorFlag ;N!
brnz .EndFactorial
lda #0h
sta0 OperandX+7
call .X_trans_Z
call CheckOutData
call .Z_trans_X
call .X_trans_R
lda0 SignX
cmpe #01h
brz .DataError
lda0 PointX
cmpe #0h
brnz .DataError
lda0 OperandX+5
cmpe #0h
brnz .DataError
call .ClrY
lda #70h ;Max69!
sta0 OperandY+6
lda #0h
sta PP
call Subtration
lda0 SignZ
cmpe #0h
brz .DataError
call .R_trans_X
lda #0h
sta PP
call .ClrY
lda #08h
sta0 OperandY+6
call Multiplation
lda #01h
sta PP
lda0 OperandZ+5
sta .M_bcdbuf
lda0 OperandZ+6
sta .M_bcdbuf+1
call .Bcd2Hex
lda #^(Order_tab)
sta0 TableC+2
lda #@(Order_tab)
sta0 TableC+1
lda #<(Order_tab)
sta0 TableC
lda0 TableC+1
addc .M_hexbuf
sta0 TableC+1
lda0 TableC
addc .M_hexbuf+1
sta0 TableC
brnc .GetDataTable
lda0 TableC+1
inca
sta0 TableC+1
.GetDataTable:
lda0 TableC+2
sta TPP
lda0 TableC+1
sta TPH
lda0 TableC
sta TPL
lda #>OperandZ
sta PP
lda #<OperandZ
sta DP
lda #07h
sta0 .NumCnt
.SaveTbData:
lda0 .NumCnt
cmpe #0h
brz .EndSaveTbData
ldv
sta i
incdp
lda0 .NumCnt
deca
sta0 .NumCnt
br .SaveTbData
.EndSaveTbData:
ldv
sta0 PointZ
lda #>Sign_r
sta PP
lda Sign_r
sta0 SignZ
br .EndFactorial
.DataError:
lda #01h
sta0 ErrorFlag
.EndFactorial:
ret
;--------------------------------------------
.InputCheck::
lda #0h
sta0 ErrorFlag
call CheckOutData
lda0 PointZ
cmpe #0h
brnz .ErrData
lda0 OperandZ+5
cmpe #0h
brnz .ErrData
lda0 OperandZ+6
cmpe #70h
brnc .ErrData
ret
.ErrData:
lda #01h
sta0 ErrorFlag
ret
;-------------------------------------------
.CKNear_1::
call .ClrY
lda #99h
sta0 OperandY
sta0 OperandY+1
sta0 OperandY+2
sta0 OperandY+3
sta0 OperandY+4
sta0 OperandY+5
call .Z_trans_B
call .Z_trans_X
lda #OperandX
sta0 Addr1
call CheckData
lda0 DpCount
cmpe #0ch
brz .StartCK
cmpe #0dh
brz .ModifyOp6R
cmpe #0eh
brz .ModifyOp6
br .NoModify
.StartCK:
lda #0h
sta0 OperandX+7
sta0 SignX
sta0 SignY
lda0 PointX
sta0 PointY
call Subtration
lda0 SignZ
cmpe #0h
brnz .NoModify
call .B_trans_Z
call .DelPoint
call .Z_trans_X
call .ClrY
lda #01h
sta0 OperandY+6
call .Z_trans_X
call Addition
br .EndCKNear_1
.ModifyOp6R:
lda0 OperandX+6
anda #0f0h
sta0 OperandX+6
br .StartCK
.ModifyOp6:
lda #0h
sta0 OperandX+6
br .StartCK
.NoModify:
call .B_trans_Z
.EndCKNear_1:
call .Z_trans_X
ret
;----------------(POL)----------------------
.POL::
call .X_trans_S
call .Y_trans_Buf
call .XSqu
call .Z_trans_B
call .Buf_trans_X
call .XSqu
call .Z_trans_Y
call .B_trans_X
lda #0h
sta0 OperandX+7
sta0 OperandY+7
call Addition
call .Z_trans_X
call Squ
call .GetDpCount
lda0 DpCount
cmpe #0h
brz .Pow_x_y_Err
call .Carry
call .Z_trans_X
call .X_TO_E
call .Buf_trans_X
call .X_trans_R
call .S_trans_Y
call .Y_trans_I
call .GetDpCountY
lda0 DpCount
cmpe #0h
brz .Degree90
call Division
call .Z_trans_X
call .Atan
call .R_trans_Y
call .I_trans_X
call .CheckQuadrant
call .CheckAsinRrdDegre
call .Carry
.SavetoF:
call .Z_trans_X
call .X_TO_F
call .E_TO_Z
call .Z_trans_I
ret
.Degree90:
call .ClrZ
lda #90h
sta0 OperandZ+6
br .SavetoF
;----------------(REC)----------------------
.REC::
lda0 SignX
cmpe #0h
brnz .Pow_x_y_Err
call .X_trans_S ;S
call .Y_trans_Buf
call .Buf_trans_X
call .X_trans_Z
call .CheckRrdDegre
call Sin
call .Z_trans_Y
call .S_trans_X
lda #0h
sta PP
call Multiplation
call .Carry
call .Z_trans_X
call .X_TO_F
call .Buf_trans_X
call .X_trans_Z
call .CheckRrdDegre
call Cos
call .Z_trans_Y
call .S_trans_X
lda #0h
sta PP
call Multiplation
call .Carry
call .Z_trans_X
call .X_TO_E
ret
;-------------------------------------------
.CKPowx_y::
call X_SatDataCnt_Trans
call .Y_trans_T
call .Y_trans_X
call Fract
call .S_trans_X
call .ClrY
lda #02h
sta0 OperandY+6
call Mod
call MoveData
lda0 OperandX+6
cmpe #0h
brnz .EndCKPowx_y
lda #01h
sta0 ErrorFlag
.EndCKPowx_y:
ret
;----------------(X^Y)----------------------
.Pow_x_y::
call .IsX_Zero
brnz 1$
call .IsY_Zero
brz .Pow_x_y_Err
call ClearBuffer
lda #0
sta0 .DataBuf
ret
1$:
lda0 SignX
sta0 .DataBuf
lda0 SignX
cmpe #01h
brnz .Normal_x_y
lda0 PointY
cmpe #0h
brnz .Pow_x_y_Err
lda #0h
sta0 SignX
lda0 OperandY+6
anda #01h
brnz .Normal_x_y
lda #0h
sta0 .DataBuf
.Normal_x_y:
call .Y_trans_Buf
call Ln
call CheckOutData
call .Z_trans_X
call .Buf_trans_Y
call Multiplation
call CheckOutData
call .Z_trans_X
call Ex
lda0 .DataBuf
sta0 SignZ
lda #0h
sta0 OperandZ+7
call CheckOutData
call check_Z_carry
br .EndPow_x_y
.Pow_x_y_Err:
lda #01h
sta0 ErrorFlag
.EndPow_x_y:
ret
;----------------(X^1/Y)--------------------
.Pow_x_invy::
call .IsX_Zero
brnz 1$
call ClearBuffer
lda #0
sta0 .DataBuf
ret
1$:
lda0 SignX
sta0 .DataBuf
cmpe #01h
brnz .Nomalx_invy
lda0 OperandY+6
anda #01h
brnz .ChkY
.x_inverr:
lda #01h
sta0 ErrorFlag
br .EndPow_x_invy
.ChkY:
lda0 PointY
cmpe #0h
brnz .x_inverr
.Nomalx_invy:
lda #0h
sta0 SignX
call .Y_trans_Buf
call Ln
call .Z_trans_X
call .Buf_trans_Y
call Division
call .Z_trans_X
call Ex
lda0 .DataBuf
sta0 SignZ
.EndPow_x_invy:
ret
.IsX_Zero:
lda OperandX
ora OperandX+1
ora OperandX+2
ora OperandX+3
ora OperandX+4
ora OperandX+5
ora OperandX+6
ret
.IsY_Zero:
lda OperandY
ora OperandY+1
ora OperandY+2
ora OperandY+3
ora OperandY+4
ora OperandY+5
ora OperandY+6
ret
;----------------(X^Y)----------------------
.Pow_10_X::
call .X_trans_Buf
lda0 SignX
cmpe #01h
brnz .Dopow_10_x
lda #0h
sta0 SignX
call .ClrY
lda #01h
sta0 OperandY+5
call Subtration
lda0 SignZ
cmpe #0h
brnz .Dopow_10_x
call .ClrZ
br .EndPow_10_X
.Dopow_10_x:
call .Buf_trans_Y
call .ClrX
lda #10h
sta0 OperandX+6
call .Pow_x_y
.EndPow_10_X:
ret
;----------------(X^1/3)--------------------
.Pow_x_inv3::
call .ClrY
lda #03h
sta0 OperandY+6
lda #0h
sta0 PointY
sta0 SignY
call .Pow_x_invy
lda0 .DataBuf
sta0 SignZ
ret
;-------------------------------------------
check_Z_carry::
lda0 SignZ
sta0 .DataBuf
lda #0h
sta0 SignZ
lda0 PointZ
cmpe #3
brc 1$
lda0 OperandZ+1
anda #0fh
brnz 1$
ret
1$:
call .Z_trans_X
lda OperandX+Length-2
anda #0f0h
cmpe #50h
brc 2$
ret
2$:
lda #0
sta OperandX+Length-1
sta OperandX+Length-2
call .ClrY
lda #01h ;#05h
sta OperandY+Length-3
lda PointX
sta PointY
call Addition
lda0 .DataBuf
sta0 SignZ
ret
;-----------------------( EXP X*10^Y )------------------------
.Expp::
call .X_trans_Y
call .Put_1_to_OperandX
.Expp2::
lda #>.M_bcdbuf
sta PP
lda0 OperandY+Length-1
sta .M_bcdbuf
call .bcdtohex
lda .M_bcdbuf
sta0 .M_exp_Y
lda #0h
sta PP
lda0 OperandY+5
cmpe #0h
brnz .ErrFlag
lda0 PointY
cmpe #0h
brnz .ErrFlag
lda0 SignY
cmpe #0
brnz .18$
lda0 PointX
suba .M_exp_Y
sta .M_exp_Y
br .28$
.18$:
lda PointX
adda .M_exp_Y
sta .M_exp_Y
.28$:
call .X_trans_Z
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -