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!