 .equ	AtBCD0	=13		;address of r13
.equ	AtBCD2	=15		;address of r15


BIN_BCD:
; Input (r17:r16) output BCD number (r15:r14:r13:r12:r11).
; Low registers used:	3 (r13,r14,r15) 
; High registers used:	4(r16,r17,r18,r19)	
; Pointers used:	Z

	ldi		r18,16		;Init loop counter	
	clr		r15			;clear result (3 bytes)
	clr		r14		
	clr		r13		
	clr		ZH			;clear ZH (not needed for AT90Sxx0x)
bBCDx_1:	
	lsl		r16			;shift input value
	rol		r17			;through all bytes
	rol		r13			;
	rol		r14
	rol		r15
	dec		r18			;decrement loop counter
	brne	bBCDx_2		;if counter not zero
; распределим числа по ячейкам
	ldi		r18,0x0F
	mov		r11,r13
	and		r11,r18
	swap	r13
	mov		r12,r13
	and		r12,r18
	mov		r13,r14
	and		r13,r18
	swap	r14
	and		r14,r18


	ret					;return

bBCDx_2:
	ldi		r30,AtBCD2+1	;Z points to result MSB + 1
bBCDx_3:
	ld		r19,-Z		;get (Z) with pre-decrement
	subi	r19,-$03	;add 0x03
	sbrc	r19,3		;if bit 3 not clear
	st		Z,r19		;store back
	ld		r19,Z		;get (Z)
	subi	r19,-$30	;add 0x30
	sbrc	r19,7		;if bit 7 not clear
	st		Z,r19		;store back
	cpi		ZL,AtBCD0	;done all three?
	brne	bBCDx_3		;loop again if not
	rjmp	bBCDx_1		
