.TITLE UARITH .IDENT "V1.1" ;M2.4 .ENABL LC ;**-1 ; ; This module contains routines which perform the unsigned multiply ; and divide operations for RUNOFF. They were present in the system ; library in RSX/IAS, but are not in RT-11. These do exactly the same ; thing. ; ; Bob Denny ; 31-May-80 ; ;**-1 ; Bradford A. Lubell ;M2.4 ; 1-Sep-81 ;M2.4 ;----------------------------------------------------------------------------- ;M2.4 ; ;**-1 ; $MUL -- Integer unsigned multiply ;M2.4 ; ;M2.4 ; Inputs: R0 = Multiplier ; R1 = Multiplicand ; Outputs: 32 bit product: R0 = MSH R1 = LSH ; R3 - R5 preserved $MUL:: .IF NDF I$$EIS ;M2.4 MOV R0,-(SP) ;PUSH MULTIPLIER MOV #17.,-(SP) ;PUSH ITERATION COUNT CLR R0 ;CLEAR MSH 10$: ROR R0 ;RIGHT SHIFT PARTIAL PRODUCT (32 BIT) ROR R1 BCC 20$ ;IF 0 POPPED INTO C-BIT, DON'T ADD ADD 2(SP),R0 ;ADD MULTIPLIER TO PARTIAL PRODUCT 20$: DEC (SP) ;COUNT THE ITERATION BGT 10$ ;LOOP TILL DONE XIT: ADD #4,SP ;CLEAN OFF THE STACK .IFF ;M2.4 MUL R1,R0 ;M2.4 .ENDC ;M2.4 RTS PC ;RETURN ; ; $DIV -- Integer unsigned divide ; ; Inputs: R0 = Dividend (16 bit) ; R1 = Divisor ; Outputs: R0 = Quotient ; R1 = Remainder ; R2 - R5 preserved $DIV:: .IF NDF I$$EIS ;M2.4 MOV R1,-(SP) ;PUSH DIVISOR MOV #16.,-(SP) ;PUSH ITERATION COUNT CLR R1 ;CLEAR PARTIAL REMAINDER 10$: ASL R0 ;LEFT SHIFT (32 BIT) ROL R1 CMP R1,2(SP) ;CAN DIVISOR BE SUBTRACTED? BLO 20$ ;IF LO, NOPE SUB 2(SP),R1 ;SUBTRACT OUT DIVISOR INC R0 ;SET THE LSB IN THE PARTIAL QUOTIENT 20$: DEC (SP) ;COUNT THE ITERATION BGT 10$ ;LOOP TILL DONE BR XIT ;CLEAN UP AND RETURN .IFF ;M2.4 MOV R1,-(SP) ; Push the divisor on the stack ;M2.4 MOV R0,R1 ; Convert the dividend into 32-bits ;M2.4 CLR R0 ;M2.4 DIV (SP)+,R0 ; Divide ;M2.4 RETURN ;M2.4 .ENDC ;M2.4 .END