.TITLE UARITH .IDENT "V1.0" .ENABL LC ; ; 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 ;----------------------------------------------------------------------------- ; ; $MUL -- Integer unsigned multiply ; ; Inputs: R0 = Multiplier ; R1 = Multiplicand ; Outputs: 32 bit product: R0 = MSH R1 = LSH ; R3 - R5 preserved $MUL:: 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 RTS PC ;RETURN ; ; $DIV -- Integer unsigned divide ; ; Inputs: R0 = Dividend (16 bit) ; R1 = Divisor ; Outputs: R0 = Quotient ; R1 = Remainder ; R2 - R5 preserved $DIV:: 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 .END