首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

参考例程:双精度除法

参考例程:双精度除法

/*.MODULE         Double_Precision_Divide;

{
        Double-Precision Division
                Z = X / Y

        Calling Parameters
                AY0 = LSW of Y
                AY1 = MSW of Y
                SR1 = MSW of X
                SR0 = Next Significant Word of X
                MR1 = Next Significant Word of X
                MR0 = LSW of X
                SE = -15

        Return Values
                MR1 = MSW of Z
                MR0 = LSW of Z

        Altered Registers
                AF,AR,AX1,AX0,SI,SR,MR

        Computation Time
                485 cycles (maximum)

}*/

//.ENTRY  ddivs;
//.ENTRY  ddivq;

ddivs:  AF=PASS SR1;
        SI=SR0, AR=SR1 XOR AY1;     {Exclusive or sign bits}
        AX1=AR;
        SR=LSHIFT MR0 BY 1(LO);     {Shift dividend up one bit}
        SR=SR OR LSHIFT MR1 BY 1(HI);
        SR=SR OR LSHIFT AR(LO);     {Shift in quotient bit}
        AR=PASS AF, MR0=SR0;
        MR1=SR1, SR=LSHIFT MR1(LO);
        SR=SR OR LSHIFT SI BY 1(LO);
        SR=SR OR LSHIFT AR BY 1(HI);
        CNTR=31;
        JUMP ddiv;
ddivq:  CNTR=32;
        AX1=0;
ddiv:   AX0=AY1;
        DO ddivu UNTIL CE;
                AR=ABS AX1;        
                IF POS JUMP aqz;   {Is quotient bit set?}
aqo:            AR=SR0+AY0;        {Yes, add divisor to partial remainder}
                SI=AR, AF=SR1+AY1+C;
                JUMP ddivi;
aqz:            AR=SR0-AY0;        {No, subtract divisor from partial remainder}
                SI=AR, AF=SR1-AY1+C-1;
ddivi:          SR=LSHIFT MR0 BY 1(LO); {Shift dividend one bit}
                SR=SR OR LSHIFT MR1 BY 1(HI);
                AR=AX0 XOR AF;     {Compute quotient bit}
                AX1=AR;            {Save quotient bit}
                AR=NOT AX1;
                SR=SR OR LSHIFT AR(LO); {Shift in new bit}
                MR0=SR0, AR=PASS AF;
                MR1=SR1, SR=LSHIFT MR1(LO);
                SR=SR OR LSHIFT SI BY 1(LO);
ddivu:          SR=SR OR LSHIFT AR BY 1(HI);
                RTS;

//.ENDMOD;
芯片是死的,人是活的,人是很厉害的, 你说那?
返回列表