- UID
- 79854
- 性别
- 男
|
/*.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; |
|