;**************************************************************************
;(12)标号:SH2功能:双字节二进制无符号数开平方(快速)
;
;入口条件:被开方数在R2、R3中。
;出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7堆栈需求:2字节
;**************************************************************************
SH2:MOVA,R2
ORLA,R3
JNZSH20
RET ;;被开方数为零,不必运算
SH20:MOVR7,#0 ;;左规次数初始化
MOVA,R2
SH22:ANLA,#0C0H ;;被开方数高字节小于40H否?
JNZSQRH ;;不小于40H,左规格化完成,转开方过程
CLRC ;;每左规一次,被开方数左移两位
MOVA,R3
RLCA
MOVF0,C
CLRC
RLCA
MOVR3,A
MOVA,R2
MOVACC.7,C
MOVC,F0
RLCA
RLCA
MOVR2,A
INCR7 ;;左规次数加一
SJMPSH22;;继续左规
;======================分割线=================================
;开方汇编子程序
;(13)
; 标号:SH4功能:四字节二进制无符号数开平方(快速)
;入口条件:被开方数在R2、R3、R4、R5中。
;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7堆栈需求:2字节
SH4:MOVA,R2
ORLA,R3
ORLA,R4
ORLA,R5
JNZSH40
RET;被开方数为零,不必运算
SH40:MOVR7,#0;左规次数初始化
MOVA,R2
SH41:ANLA,#0C0H;被开方数高字节小于40H否?
JNZSQRH;不小于40H,左规格化完成
MOVR6,#2;每左规一次,被开方数左移两位
SH42:CLRC;被开方数左移一位
MOVA,R5
RLCA
MOVR5,A
MOVA,R4
RLCA
MOVR4,A
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
DJNZR6,SH42;被开方数左移完两位
INCR7;左规次数加一
SJMPSH41;继续左规
SQRH:MOVA,R2;规格化后高字节按折线法分为三个区间
ADDA,#57H
JCSQR2
ADDA,#45H
JCSQR1
ADDA,#24H
MOVB,#0E3H;第一区间的斜率
MOVR4,#80H;第一区间的平方根基数
SJMPSQR3
SQR1:MOVB,#0B2H;第二区间的斜率
MOVR4,#0A0H;第二区间的平方根基数
SJMPSQR3
SQR2:MOVB,#8DH;第三区间的斜率
MOVR4,#0D0H;第三区间的平方根基数
SQR3:MULAB;与区间基点的偏移量乘区间斜率
MOVA,B
ADDA,R4;累加到平方根的基数上
MOVR4,A
MOVB,A
MULAB;求当前平方根的幂
XCHA,R3;求偏移量(存放在R2R3中)
CLRC
SUBBA,R3
MOVR3,A
MOVA,R2
SUBBA,B
MOVR2,A
SQR4:SETBC;用减奇数法校正一个字节的平方根
MOVA,R4;当前平方根的两倍加一存入R5R6中
RLCA
MOVR6,A
CLRA
RLCA
MOVR5,A
MOVA,R3;偏移量小于该奇数否?
SUBBA,R6
MOVB,A
MOVA,R2
SUBBA,R5
JCSQR5;小于,校正结束,已达到一个字节的精度
INCR4;不小于,平方根加一
MOVR2,A;保存新的偏移量
MOVR3,B
SJMPSQR4;继续校正
SQR5:MOVA,R4;将一个字节精度的根存入R2
XCHA,R2
RRCA
MOVF0,C;保存最终偏移量的最高位
MOVA,R3
MOVR5,A;将最终偏移量的低八位存入R5中
MOVR4,#8;通过(R5R6/R2)求根的低字节
SQR6:CLRC
MOVA,R3
RLCA
MOVR3,A
CLRC
MOVA,R5
SUBBA,R2
JBF0,SQR7
JCSQR8
SQR7:MOVR5,A
INCR3
SQR8:CLRC
MOVA,R5
RLCA
MOVR5,A
MOVF0,C
DJNZR4,SQR6;根的第二字节计算完,在R3中
MOVA,R7;取原被开方数的左规次数
JZSQRE;未左规,开方结束
SQR9:CLRC;按左规次数右移平方根,得到实际根
MOVA,R2
RRCA
MOVR2,A
MOVA,R3
RRCA
MOVR3,A
DJNZR7,SQR9
SQRE:RET