Atmel AVR Microcontroller Radix Conversions

16bit to ASCII Decimal signed via output routine by http://elm-chan.org

;-----------------------------------------------------------------------------;
; Universal decimal string conversion (8/16/32 bit signed)
;
; Register Variables:
;  Call:  var3:0  = 32 bit value to be displayed
;         len     = String length
;         tmp1:0  = <Don't care> (high register must be assigned)
;         tmp2    = <Don't care>
;
;  Result:var3:0  = <Unknown>
;         len     = <Not changed>
;         tmp1:0  = <Unknown>
;         tmp2    = 0
;
; Size:  58 words
; Clock: depends on output routine
; Stack: 11 bytes max (+output routine)
;
; Examples:    var    len    output
;              100      0    "100"
;            -1234      0    "-1234"
;         31450000      0    "31450000"
;                0      7    "      0"
;             -400      5    " -400"
;              100      5    "  100"
;              100      2    "100"

mk_dec8:        clr     var1            ;8 bit entry
                sbrc    var0,7          ;
                dec     var1            ;/
mk_dec16:       clr     var2            ;16 bit entry 
                sbrc    var1,7          ;
                dec     var2            ;/
mk_dec24:       clr     var3            ;24 bit entry
                sbrc    var2,7          ;
                dec     var3            ;/
mk_dec32:                               ;32 bit entry
                clr     tmp2            ;digit counter
                clt                     ;Remove sign
                tst     var3            ;
                brpl    PC+10           ;
                set                     ;
                com     var0            ;
                com     var1            ;
                com     var2            ;
                com     var3            ;
                adc     var0,tmp2       ;
                adc     var1,tmp2       ;
                adc     var2,tmp2       ;
                adc     var3,tmp2       ;/
                inc     tmp2            ;---- decimal string generating loop
                clr     tmp0            ;var1 /= 10;
                ldi     tmp1,32         ;
                lsl     var0            ;
                rol     var1            ;
                rol     var2            ;
                rol     var3            ;
                rol     tmp0            ;
                cpi     tmp0,10         ;
                brcs    PC+3            ;
                subi    tmp0,10         ;
                inc     var0            ;
                dec     tmp1            ;
                brne    PC-10           ;/
                subi    tmp0,-'0'       ;Push the remander (a decimal digit)
                push    tmp0            ;/
                cp      var0,tmp1       ;if(var =! 0)
                cpc     var1,tmp1       ; continue digit loop;
                cpc     var2,tmp1       ;
                cpc     var3,tmp1       ;
                brne    PC-20           ;/
                brtc    PC+4            ;Put sign
                ldi     var0,'-'        ;
                push    var0            ;
                inc     tmp2            ;/
                cp      tmp2,len        ;Adjust string length (this can be removed for auto-length)
                brcc    PC+5            ;
                inc     tmp2            ;
                ldi     var0,' '        ;
                push    var0            ;
                rjmp    PC-5            ;/
                pop     var0            ;Put decimal string
                 rcall  xmit            ;<-- Put a char (var0) to memory, console or any display device
                dec     tmp2            ;
                brne    PC-3            ;/
                ret