from by Nikolai Golovchenko
cblock x:2 y temp:3 endc ; x = 256*x/y ; ; Input: ; x - 8 bit unsigned integer ; y - 8 bit unsigned integer (unmodified) ; Output: ; x, x+1 - 16 bit unsigned integer (x - LSB, x+1 - MSB) ; Temporary: ; temp, x+1 - current result/counter ; temp+1, temp+2 - current remainder div8scaled8 clrf temp ;prepare temp regs clrf temp+1 clrf temp+2 clrf x+1 bsf temp, 0 ;set counter bit clrc div8scaled8_loop rlf x, f ;shift in zero and shift out next divisor bit rlf temp+1, f rlf temp+2, f movf y, w ;move y to w btfss temp, 0 goto div8scaled8_add subwf temp+1, f movlw 1 skpc subwf temp+2, f goto div8scaled8_next div8scaled8_add addwf temp+1, f movlw 1 skpnc addwf temp+2, f div8scaled8_next rlf temp, f ;shift in next result rlf x+1, f skpc ;repeat until carry is set goto div8scaled8_loop movf temp, w ;move result to x movwf x return ;done!