📄 fract.asm
字号:
.include "CAL_MACRO.h"
.area fraction_code(code)
;Input:OperandX
;Output:Denominator=S,Numerator=B
Fract::
call X_Trans_FractBuf
call .X_trans_Z
call GetInt
call .Z_trans_Y
call .X_trans_S
call Subtration
call .Z_trans_X
lda #OperandZ
sta Addr1
call CheckData
lda DpCount
ora Temp2
brz FractRet
1$:
call .ClrY
lda #6
sta PointY
lda #99h
sta OperandY+6
sta OperandY+5
sta OperandY+4
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0
brz FractRet
call .ClrY
lda #7
sta PointY
lda #99h
sta OperandY+6
sta OperandY+5
sta OperandY+4
lda #09
sta OperandY+3
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0
brz FractRet
call .S_trans_X
call .ClrY
lda #8
sta PointY
lda #99h
sta OperandY+6
sta OperandY+5
sta OperandY+4
sta OperandY+3
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0
brz FractRet
call .S_trans_X
call .ClrY
lda #9
sta PointY
lda #99h
sta OperandY+6
sta OperandY+5
sta OperandY+4
sta OperandY+3
lda #09h
sta OperandY+2
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0
brz FractRet
call .S_trans_X
call .ClrY
lda #10
sta PointY
lda #99h
sta OperandY+6
sta OperandY+5
sta OperandY+4
sta OperandY+3
sta OperandY+2
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0
brz FractRet
2$:
call .S_trans_X
lda0 SignX
sta0 SignT
lda #0
sta0 SignX
call X_Trans_Tmp ;Keep input value
call .X_trans_R ;R=|X|
call .Put_1_to_OperandX
call .X_trans_S ;FD=S=1
call .ClrY
call .Y_trans_Buf ;Prev_FD(Buf)=0
call .R_trans_Z
call GetInt
call .Z_trans_Y
call .R_trans_X
call LineUp
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0 ;X==Y
brnz FractLoop
call .Z_trans_B
br EndFract
FractLoop:
call .R_trans_Z
call GetInt
call .Z_trans_Y
call .R_trans_X
call Subtration
call .Z_trans_X
call .ReciX
call .Z_trans_R ;R=Z
call S_Trans_BZ
;call .R_trans_Z
call GetInt
call .S_trans_X ;X=FD (FD->Temp)
call .Z_trans_Y ;Y=(int)Z
call Multiplation
call .Z_trans_X ;X=FD*(int)Z
call .Buf_trans_Y ;Y=Prev_FD
call Addition
call .Z_trans_S ;FD=FD*(int)Z+Prev_FD;
Call BZ_Trans_Buf
call Tmp_Trans_X
call .S_trans_Y
call Multiplation
call .Z_trans_Y
call Put_05_to_OperandX
call Addition ;compute Numerator
call GetInt
call .Z_trans_X ;FN=(int)(input*FD+0.5)
call .Z_trans_B ;FN->B
;
call .S_trans_Y ;FD(S)->Y
call Division
call .Z_trans_Y
call Tmp_Trans_X
call Subtration
call .Z_trans_X
lda #0
sta0 SignX
call .ClrY
lda #1
sta0 OperandY+6
lda #13
sta0 PointY ;Y=1E-13=10^(-13)
call LineUp
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #2 ;X<Y
brz EndFract
call .R_trans_Z
call GetInt
call .Z_trans_Y
call .R_trans_X
call Subtration
call .Z_trans_X ;Z-(int)Z
lda #0
sta0 SignX
call .ClrY
lda #1
sta0 OperandY+6
lda #5
sta0 PointY ;Y=1E-5=10^(-5)
call LineUp
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #07h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #2
brnz FractLoop
EndFract:
lda #>Sign_s
sta PP
lda0 SignT
sta Sign_s
lda #0
sta PP
call .S_trans_Y
call .B_trans_X
call Division
call .Carry ;-----
call .Z_trans_Y
call FractBuf_Trans_X
call .X_trans_Z
call .Carry
call .Z_trans_X
call LineUp
lda #OperandX
sta0 Addr1
lda #OperandY
sta0 Addr2
lda #05h
sta0 DpCount
call CompareData
lda0 Temp1
cmpe #0
brnz FractRet
ret
FractRet:
call .ClrX
call .X_trans_B
call .X_trans_S
ret
;x=0.5
Put_05_to_OperandX:
call .ClrX
lda #1
sta0 PointX
lda #05h
sta0 OperandX+6
ret
.if 0
;Input:OperandZ
;Output:OperandZ
GetInt:
lda0 PointZ
ora #0
brz EndGetInt
cmpe #0x80
brc EndGetInt
call DelPoint
EndGetInt:
ret
DelPoint::
lda #>PointY
sta PP
lda #0eh
sta PointY
lda #OperandZ+6
sta DP
lda PointZ
cmpe PointY
brc ClearPointEven
lda0 PointZ
sta0 PointY
ClearPointEven:
lda0 PointY
ora #0
brz EndClearPoint
deca
sta0 PointY
lda i
anda #0xf0
sta i
ClearPointOdd:
lda0 PointY
ora #0
brz EndClearPoint
deca
sta0 PointY
lda i
anda #0x0f
sta i
decdp
br ClearPointEven
EndClearPoint:
;lda #0
;sta0 PointZ
ret
.endif
S_Trans_BZ:
lda #>Sign_s
sta0 .PXPP
lda #<Sign_s
sta0 .PXDP
lda #>SignBz
sta0 .PYPP
lda #<SignBz
sta0 .PYDP
call .CopyData
ret
BZ_Trans_Buf:
lda #>SignBz
sta0 .PXPP
lda #<SignBz
sta0 .PXDP
lda #>Sign_buf
sta0 .PYPP
lda #<Sign_buf
sta0 .PYDP
call .CopyData
ret
.TransFract::
call .B_trans_Y
call .ClrX
call Subtration
lda0 SignZ
cmpe #0h
brz .EndFract
call .B_trans_X
call .B_trans_Z
lda #0h
sta0 OperandZ+7
call CheckOutData
call .Z_trans_B
call .S_trans_Y
call .S_trans_Z
lda #0h
sta0 OperandZ+7
call CheckOutData
call .Z_trans_T ;z_s
call Division
call .Z_trans_Buf
lda0 .KeyPos
cmpe #31h
brz .Y_beyond_X
lda #>.SetFlag
sta PP
lda .SetFlag
anda #30h
cmpe #30h
brz .Y_beyond_X
call .S_trans_Y
call .B_trans_X
lda #0h
sta0 SignY
call Subtration
lda0 SignZ
cmpe #01h
brz .Y_beyond_X
call Mod
call .X_trans_Z
lda #0h
sta0 OperandZ+7
call CheckOutData
call .Z_trans_B
call .T_trans_S
br .EndFraction
.Y_beyond_X:
call .T_trans_S
.EndFraction:
call .I_trans_Z
lda0 SignT
sta0 SignZ
br .EnDtrans
.EndFract:
call .I_trans_Z
.EnDtrans:
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -