📄 sat.asm
字号:
call Multiplation
call .Z_trans_X
call XYSum_Trans_Y
call Addition
call Z_Trans_XYSum
call .B_trans_X
call QR_PrepareX
call .B_trans_X
call .XSqu ;X^2
call .Z_trans_Buf ;Buf=X^2
call .Z_trans_X
call .B_trans_Y ;X
call Multiplation ;X*X^2=X^3
call .Z_trans_Y
call XCubeSum_Trans_X ;XcubeSum+=num^3
call Addition
call Z_Trans_XCubeSum
call .Buf_trans_X ;X^2
call .XSqu ;X^4
call .Z_trans_Y
call XFourSum_Trans_X
call Addition ;XFourSum+=X^4
call Z_Trans_XFourSum
call .Buf_trans_X ;Buf=X^2
call .R_trans_Y ;Y
call Multiplation ;(X^2)*Y
call .Z_trans_Y
call XSquYSum_Trans_X
call Addition
call Z_Trans_XSquYSum ;XSquYSum+=(X^2*Y)
call .R_trans_X ;y
call QR_PrePareY
;;;
;;XSum*YSum
call YSum_Trans_Y
call .Y_trans_X
call XSum_Trans_Y
call Multiplation
call .Z_trans_Buf
;;XYSum*XCnt
call XCnt_Trans_Y
call .Y_trans_X
call XYSum_Trans_Y
call Multiplation
;;XYSum*XCnt-XSum*YSum
call .Z_trans_X
call .Buf_trans_Y
call Subtration
call Z_Trans_XYMulDiff ;XYMulDiff=XYSum*XCnt-XSum*YSum
ret
;Private functions for calc Q.R coefficients (A,B,C)
;Input:No
;Output:OperandZ
;Output=XSum*YSum-n*XYSum
QR_CalcXYDiff:
call XSum_trans_Y
call .Y_trans_X
call YSum_trans_Y
call Multiplation ;XSum*YSum
call .Z_trans_Buf ;Buf=XSum*YSum
call XCnt_Trans_Y
call .Y_trans_X
call XYSum_Trans_Y ;n*XYSum
call Multiplation
call .Z_trans_Y
call .Buf_trans_X
call Subtration ;XSum*YSum-n*XYSum
ret
;Input:No
;Output:OperandZ
;output=XSquSum*XSum-n*XCubeSum
QR_CalcXCubeDiff:
call XSum_trans_Y
call XSquSum_Trans_X
call Multiplation ;XSquSum*XSum
call .Z_trans_Buf ;Buf=XSquSum*XSum
call XCubeSum_Trans_X
call XCnt_Trans_Y
call Multiplation ;n*XCubeSum
call .Z_trans_Y
call .Buf_trans_X
call Subtration ;XSquSum*XSum-n*XCubeSum
ret
;Input:No
;Output:OperandZ
;Output:XSum^2-n*XsquSum
QR_CalcXSquDiff:
call XSum_trans_Y
call .Y_trans_X
call Multiplation
call .Z_trans_Buf ;Buf=XSum^2
call XSquSum_Trans_X ;XSum^2
call XCnt_Trans_Y
call Multiplation ;n*XSquSum
call .Z_trans_Y
call .Buf_trans_X
call Subtration ;XSum^2-n*XsquSum
ret
;Input:No
;Output:OperandZ
;Output:YSum*XSquSum-n*XSquYSum
QR_CalcXSquYDiff:
call YSum_Trans_Y
call XSquSum_Trans_X
call Multiplation ;YSum*XSquSum
call .Z_trans_Buf
call XSquYSum_Trans_X
call XCnt_Trans_Y
call Multiplation ;n*XSquYSum
call .Z_trans_Y
call .Buf_trans_X
call Subtration ;YSum*XSquSum-n*XSquYSum
ret
;Input:No
;Output:OperandZ
;Output:[XSquSum^2-n*XFourSum]
QR_CalcXFourDiff:
call XSquSum_Trans_X
call .XSqu
call .Z_trans_Buf ;Buf=XSquSum^2
call XCnt_Trans_Y
call XFourSum_Trans_X
call Multiplation ;n*XFourSum
call .Z_trans_Y
call .Buf_trans_X
call Subtration ;XSquSum^2-n*XFourSum
ret
;X=4
Put_4_to_OperandX:
call .ClrX
lda #04h
sta0 OperandX+6
lda #0h
sta0 PointX
sta0 SignX
ret
;X=2
Put_2_to_OperandX:
call .ClrX
lda #02h
sta0 OperandX+6
lda #0h
sta0 PointX
sta0 SignX
ret
;Public functions
;Compute Coff C of Q.R
;;Input:No
;Output:OperandZ
;Using S,B,Buf
;[(YSum*XSum-n*XYSum)*(XSum*XSquSum-n*XCubeSum)-(YSum*XSquSum-n*XSquYSum)*(XSum^2-n*XSquSum)]/[(XSquSum*XSum-n*XCubeSum)^2-(XSquSum^2-n*XFourSum)(XSum^2-nXSquSum)]
QR_CalcC::
call QR_CalcXYDiff
call .Z_trans_S
call QR_CalcXCubeDiff
call .Z_trans_X
call .S_trans_Y
call Multiplation
call .Z_trans_S ;S=(YSum*XSum-n*XYSum)*(XSum*XSquSum-n*XCubeSum)
call QR_CalcXSquYDiff
call .Z_trans_B
call QR_CalcXSquDiff
call .B_trans_X
call .Z_trans_Y
call Multiplation
call .Z_trans_Y
call .S_trans_X
call Subtration
call .Z_trans_S ; Reserved computed value
;(XSum^2-nXSquSum)
call QR_CalcXSquDiff
call .Z_trans_B
;(XSquSum^2-n*XFourSum)
call QR_CalcXFourDiff
call .Z_trans_Y
call .B_trans_X
call Multiplation
call .Z_trans_B
;(XSquSum*XSum-n*XCubeSum)^2
call QR_CalcXCubeDiff
call .Z_trans_X
call .XSqu
;[(XSquSum*XSum-n*XCubeSum)^2-(XSquSum^2-n*XFourSum)(XSum^2-nXSquSum)]
call .Z_trans_X
call .B_trans_Y
call Subtration
call .Z_Trans_Y
call .S_trans_X
call Division
ret
;Compute Coff B of Q.R
;Input:No
;Output:OperandZ
;[(YSum*XSum-n*XYSum)-(XSquSum*XSum-n*XCubeSum)*C]/[XSum^2-n*XSquSum]
QR_CalcB::
call QR_CalcXYDiff
call .Z_trans_R
call QR_CalcC
call .Z_Trans_S ; S= coeff C
call QR_CalcXCubeDiff
call .Z_trans_Y
call .S_trans_X
call Multiplation
call .Z_trans_Y
call .R_trans_X
call Subtration
call .Z_Trans_R ; reserve computed value
call QR_CalcXSquDiff
call .Z_trans_Y
call .R_trans_X
call Division
ret
;Input:No
;Output:OperandZ
;Compute Coff A of Q.R
;A=YSum-(A*XSquSum+B*XSum)
QR_CalcA::
call QR_CalcB ;S=Coff C
call .Z_Trans_B ;B=B
call .Z_trans_X
call XSum_Trans_Y
call Multiplation
call .Z_trans_R ;Z=R=XSum*Coff B
call XSquSum_Trans_X
call .S_trans_Y ;C -> Y
call Multiplation ;Z=XSquSum*Coff C
call .Z_trans_X
call .R_trans_Y
call Addition
call YSum_Trans_Y
call .Y_trans_X
call .Z_trans_Y ;XSquSum*Coff C+XSum* Coff B
call Subtration ;YSum-(XSquSum*C+XSum*B)
call .Z_Trans_X
call XCnt_Trans_Y
call Division
ret
;Input:OperandX (X)
;Output:OperandZ
;S=Coff C
;B=Coff B
;Y=C*(X^2)+B*X+A
QR_EstimateY::
call X_Trans_Tmp
call QR_CalCA
call .Z_trans_Buf ;Buf=A
call .B_trans_Y
call Tmp_Trans_X
call Multiplation ;B*X
call .Z_trans_X
call .Buf_trans_Y
call Addition
call .Z_trans_Buf ;Buf=B*X+A
call Tmp_Trans_X
call .XSqu
call .Z_trans_Y
call .S_trans_X
call Multiplation ;C*(X^2)
call .Z_Trans_Y
call .Buf_trans_X
call Addition ;C*(X^2)+B*X+A
ret
;Input:OperandX (y)
;Output:OperandZ
;S=Coff C
;B=Coff B
;Note:Q.R's X estimate has two values i.e. x1,x2
;[sqrt([B^2+4*(y-A)*C]-B]/(2C)
QR_EstimateX1::
call X_Trans_Tmp
call QR_CalCA
call .Z_trans_Y ;Y=A
call Tmp_Trans_X
call Subtration ;(y-A)
call .Z_Trans_X
call .S_Trans_Y ;C
call Multiplation ;(y-A)*C
call .Z_trans_Y
call Put_4_to_OperandX
call Multiplation ;4*(y-A)*C
call .Z_trans_Buf ;Buf=4*(y-A)*C
call .B_trans_X
call .XSqu ;B^2
call .Z_trans_X
call .Buf_trans_Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -