;-----------------------------------------------------------------------------: ; 16bit/16bit Unsigned Division ; ; Register Variables ; Call: var1[1:0] = dividend (0x0000..0xffff) ; var2[1:0] = divisor (0x0001..0x7fff) ; mod[1:0] = <don't care> ; lc = <don't care> (high register must be allocated) ; ; Result:var1[1:0] = var1[1:0] / var2[1:0] ; var2[1:0] = <not changed> ; mod[1:0] = var1[1:0] % var2[1:0] ; lc = 0 ; ; Size = 16 words ; Clock = 179..211 cycles (+ret) ; Stack = 0 byte div16u: clr mod0 ;initialize variables clr mod1 ; mod = 0; ldi lc,16 ; lc = 16; ;---- calculating loop lsl var10 ;var1 = var1 << 1; rol var11 ;/ rol mod0 ;mod = mod << 1 + carry; rol mod1 ;/ cp mod0,var20 ;if (mod => var2) { cpc mod1,var21 ; mod -= var2; var1++; brcs PC+4 ; } inc var10 ; sub mod0,var20 ; sbc mod1,var21 ;/ dec lc ;if (--lc > 0) brne PC-11 ; continue loop; ret