.def a0=r0 .def a1=r1 .def a2=r2 .def a3=r3 .def r=r16 .def t=r17 .def n=r18 .def k=r19 ; in: a3:a2:a1:a0 = 32bit unsigned ; yh:yl = ptr to char[11] ; out: yh:yl = ASCII string, null terminated, w/o leading zeroes ; use: a,r,t,n,k,z ; ; nur bei Megas und neueren Tinys einsetzbar ; Obacht wenn code > 64KB (die Tabelle) ; ; ~1200-1800 clock cycles bin2dec: ldi zh, high(b2dt*2) ldi zl, low(b2dt*2) ldi n, 10 ldi k, -1 b2d0: ldi r, -1+'0' ;r = odd ? '0'+10 : '0'-1 sbrc n, 0 ldi r, 10+'0' neg k adiw zh:zl, 4 b2d1: add r, k ;inc when even, dec when odd sbiw zh:zl, 4 lpm t, z+ sub a0, t lpm t, z+ sbc a1, t lpm t, z+ sbc a2, t lpm t, z+ sbc a3, t sbrs n, 0 ;loop until carry when odd brcc b2d1 sbrc n, 0 ;loop while carry when even brcs b2d1 st y+, r ;append digit dec n ;next one brne b2d0 st y, n ;trailing '\0' sbiw yh:yl, 10 ;backspace to beginning of buffer b2d2: ld t, y+ ;find the first non-'0' char ld k, y cpi t, '0' cpse k, n ;stop when k=='\0' breq b2d2 b2d3: sbiw yh:yl, 1 ret b2dt: .dd 1000000000 .dd -100000000 .dd 10000000 .dd -1000000 .dd 100000 .dd -10000 .dd 1000 .dd -100 .dd 10 .dd -1