Looking at the divider in App Note 200, I think it's putting the result in dd16ul and dd16uh instead of dres16ul and dres16uh, or am I daft? :roll: I don't even see it touching the dres.. registers.

Torby

;***************************************************************************

;*

;* "div16u" - 16/16 Bit Unsigned Division

;*

;* This subroutine divides the two 16-bit numbers

;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).

;* The result is placed in "dres16uH:dres16uL" and the remainder in

;* "drem16uH:drem16uL".

;*

;* Number of words :19

;* Number of cycles :235/251 (Min/Max)

;* Low registers used :2 (drem16uL,drem16uH)

;* High registers used :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,

;* dcnt16u)

;*

;***************************************************************************

;***** Subroutine Register Variables

.def drem16uL=r14

.def drem16uH=r15

.def dres16uL=r16

.def dres16uH=r17

.def dd16uL =r16

.def dd16uH =r17

.def dv16uL =r18

.def dv16uH =r19

.def dcnt16u =r20

;***** Code

div16u: clr drem16uL ;clear remainder Low byte

sub drem16uH,drem16uH;clear remainder High byte and carry

ldi dcnt16u,17 ;init loop counter

d16u_1: rol dd16uL ;shift left dividend

rol dd16uH

dec dcnt16u ;decrement counter

brne d16u_2 ;if done

ret ; return

d16u_2: rol drem16uL ;shift dividend into remainder

rol drem16uH

sub drem16uL,dv16uL ;remainder = remainder - divisor

sbc drem16uH,dv16uH ;

brcc d16u_3 ;if result negative

add drem16uL,dv16uL ; restore remainder

adc drem16uH,dv16uH

clc ; clear carry to be shifted into result

rjmp d16u_1 ;else

d16u_3: sec ; set carry to be shifted into result

rjmp d16u_1