div.inc
changeset 89 1b3cea759eff
parent 88 c923295ee520
child 90 13c2deb919d1
equal deleted inserted replaced
88:c923295ee520 89:1b3cea759eff
     1 ;*************************************************************************** 
       
     2 ;* 
       
     3 ;* "div8u" - 8/8 Bit Unsigned Division 
       
     4 ;* 
       
     5 ;* This subroutine divides the two register variables "dd8u" (dividend) and  
       
     6 ;* "dv8u" (divisor). The result is placed in "dres8u" and the remainder in 
       
     7 ;* "drem8u". 
       
     8 ;*   
       
     9 ;* Number of words	:14 
       
    10 ;* Number of cycles	:97 
       
    11 ;* Low registers used	:1 (drem8u) 
       
    12 ;* High registers used  :3 (dres8u/dd8u,dv8u,dcnt8u) 
       
    13 ;* 
       
    14 ;*************************************************************************** 
       
    15  
       
    16 ;***** Subroutine Register Variables 
       
    17  
       
    18 .def	drem8u	=r15		;remainder 
       
    19 .def	dres8u	=r16		;result 
       
    20 .def	dd8u	=r16		;dividend 
       
    21 .def	dv8u	=r17		;divisor 
       
    22 .def	dcnt8u	=r18		;loop counter 
       
    23  
       
    24 ;***** Code 
       
    25  
       
    26 div8u:	sub	drem8u,drem8u	;clear remainder and carry 
       
    27 		ldi	dcnt8u,9		;init loop counter 
       
    28 d8u_1:	rol	dd8u			;shift left dividend 
       
    29 		dec	dcnt8u			;decrement counter 
       
    30 		brne	d8u_2		;if done 
       
    31 		ret					;    return 
       
    32 d8u_2:	rol	drem8u			;shift dividend into remainder 
       
    33 		sub	drem8u,dv8u		;remainder = remainder - divisor 
       
    34 		brcc	d8u_3		;if result negative 
       
    35 		add	drem8u,dv8u		;    restore remainder 
       
    36 		clc					;    clear carry to be shifted into result 
       
    37 		rjmp	d8u_1		;else 
       
    38 d8u_3:	sec					;    set carry to be shifted into result 
       
    39 		rjmp	d8u_1 
       
    40  
       
    41