;------------------------------------------------ ; converts 16-bit value in r20/r21 into decimal ; for each digit calls output_decimal (ASCII in r25) ; registers used: r22/r23/r24 ;------------------------------------------------ output_decimal: ldi r24, '0' ; ASCII '0' ; count the 10000s ldi r22, LOW(10000) ldi r23, HIGH(10000) rcall div_16 add r25, r24 ; r25 contains ASCII code rcall output_digit ; count the 1000s ldi r22, LOW(1000) ldi r23, HIGH(1000) rcall div_16 add r25, r24 rcall output_digit ; count the 100s ldi r22, LOW(100) ldi r23, HIGH(100) rcall div_16 add r25, r24 rcall output_digit ; count the 10s ldi r22, LOW(10) ldi r23, HIGH(10) rcall div_16 add r25, r24 rcall output_digit ; output the 1s mov r25, r20 add r25, r24 rcall output_digit ret ;----------------------------------------- ; divide r20/21 by r22/23, ; result in r25, modulus in r20/21 ;----------------------------------------- div_16: clr r25 div_16_loop: ; r20/21 -= r22/23 sub r20, r22 sbc r21, r23 inc r25 brcc div_16_loop ; fix the extra loop dec r25 add r20, r22 adc r21, r23 ret