from: http://www.chatzones.co.uk/discus/messages/7/DivideByTen-11542.txt
;Subroutine to divide by 10 using the binary fraction equivalent of 0.1. ;Argument: 16-bit dividend in DDHI,DDLO. ;Returns: 16-bit quotient in QTHI,QTLO. METHOD1 CLRF QTHI ; Clear quotient accumulator CLRF QTLO ; MOVLW B'00011001' ; 1/10 = binary .0001100110011001 recurring MOVWF DRHI ; ...loaded into divisor registers MOVLW B'10011001' ; MOVWF DRLO ; MOVLW 16 ; Initialise loop counter (16 gives max accuracy) MOVWF COUNT ; SHIFT BCF STATUS,C ; RRF DDHI,F ; Halve the dividend RRF DDLO,F ; RLF DRLO,F ; Shift the divisor RLF DRHI,F ; ...so the left-most bit goes into carry BTFSC STATUS,C ; Was the left-most bit a '1'? CALL ADDIT ; Yes, so accumulate the partial dividend DECF COUNT,F ; Bump the loop count BTFSC STATUS,Z ; Is it zero? RETURN ; Yes. Done. GOTO SHIFT ; No. Loop for next divisor bit RETURN ;Subroutine to accumulate partial results. Called by METHOD1. ;Argument: Current partial result in DDHI,DDLO. ;Returns: Accumulated quotient in QTHI,QTLO. ADDIT MOVF DDLO,W ; Get the partial result LSB ADDWF QTLO,F ; Add it to the quotient LSB BTFSC STATUS,C ; Carry generated? INCF QTHI,F ; Yes. Bump quotient MSB MOVF DDHI,W ; No. Get the partial result MSB ADDWF QTHI,F ; Add it to the quotient MSB RETURN ; Return ;Subroutine to divide by 10 by repeated subtraction of 10. ;Argument: 16-bit dividend in DDHI,DDLO. ;Returns: 16-bit quotient in QHI,QLO, remainder in DDLO. METHOD2 CLRF QHI ; Clear quotient registers CLRF QLO ; MOVLW 10 ; W = divisor STEP SUBWF DDLO,F ; Subtract 10 from dividend LSB BTFSC STATUS,C ; Carry? GOTO BUMP ; No. Jump MOVF DDHI,F ; Yes. Is dividend MSB 0? BTFSC STATUS,Z ; GOTO DONE ; Yes. Done DECF DDHI,F ; No. Decrement dividend MSB BUMP INCF QLO,F ; Bump quotient LSB BTFSC STATUS,Z ; Is it 0? INCF QHI,F ; Yes. Increment quotient MSB GOTO STEP ; Loop until dividend is <0 DONE ADDWF DDLO,F ; Correct the dividend LSB RETURN