.TITLE DPDIV .IDENT /V7.01/ ;+ ; ; *** DP.DIV ; ; ROUTINE TO DIVIDE A DOUBLE PRECISION INTEGER BY ANOTHER DOUBLE ; PRECISION INTEGER. THIS ROUTINE ONLY WORKS IF THE RESULT IS KNOWN ; TO BE SINGLE PRECISION. IF THE DIVISOR IS ZERO, A ZERO RESULT IS RETURNED. ; ; VERSION: V6 MAY 1979 ; VERSION: V7 SAME AS V6, JAN 1981 ; ; STEVE THOMPSON SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; ; INPUTS: ; R0 POINTS TO DIVISOR ; R1 POINTS TO DIVIDEND ; ; OUTPUTS: ; R2 RESULT ; ALL OTHER REGISTERS ARE PRESERVED ; ; ; REVISION HISTORY ; ---------------- ; ; SMT821 23-APR-82 CHANGED ENTRY POINT NAMES OF ACCOUNTING ; SUPPORT ROUTINES (SEE MODIFY.TXT) ; ;- DP.DIV:: ; MOV (R0),R2 ; IS DIVISOR ZERO? BIS 2(R0),R2 ; BEQ 20$ ; YES MOV R0,-(SP) ; SAVE R0 MOV R1,-(SP) ; SAVE R1 MOV (R0)+,-(SP) ; PUT HIGH ORDER DIVISOR ON STACK MOV (R0),R0 ; AND LOW ORDER DIVISOR IN R0 MOV 2(R1),R2 ; LOW ORDER DIVIDEND GOES IN R2 MOV (R1),R1 ; AND HIGH ORDER IN R1 5$: TST (SP) ; IS THE HIGH ORDER DIVISOR ZERO? BNE 10$ ; NO, CONTINUE TO SHIFT TST R0 ; YES, IS THE LOW ORDER STILL SIGNED? BPL 15$ ; NO, DO D.P. BY S.P. DIVIDE 10$: ASR R1 ; DIVIDE DIVIDEND BY 2 ROR R2 ; ASR (SP) ; AND ALSO THE DIVISOR ROR R0 ; BR 5$ ; 15$: TST (SP)+ ; CLEAN THE STACK CALL $DDIV ; DO REMAINING DIVIDE MOV (SP)+,R1 ; RESTORE R1 MOV (SP)+,R0 ; AND R0 20$: RETURN ; RETURN .END