From: Hughe
Divide a 24 bit number by 6 and round up if the remainder is 3 or more - can be used for any 8 bit constant divisor with 2 values changed.CBLOCK iA:3 iB iC ENDC DivBySix24: movlw .24 ; loop for 24 shifts movwf iC ; iC is loop counter clrf iB ; clear remainder reg bcf STATUS,C ; clear result bit DivBySixLoop: rlf iA+0 ; roll result bit onto iA rlf iA+1 rlf iA+2 rlf iB ; and top bit of iA onto iB movlw D'6' ; check if remainder (iB) >= 6 subwf iB,w ; w = iB-6 btfss STATUS,C ; carry set if iB >= 6 goto DivBySixNogo movwf iB ; iB-6 (w) into iB ; the carry gets rolled onto iA as a result DivBySixNogo: decfsz iC,f ; loop until all bits checked goto DivBySixLoop rlf iA+0 ; roll last result bit onto A rlf iA+1 rlf iA+2 ; the folowing could be left off if no rounding is required movlw D'3' ; if remainder is 3 or more round up subwf iB,w ; w = iB-3 btfss STATUS,C ; carry set if iB >= 3 return incf iA+0,f ; increment Result btfsc STATUS,Z incf iA+1,f btfsc STATUS,Z incf iA+2,f return