| 26 |
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 27 |
POSSIBILITY OF SUCH DAMAGE. */ |
POSSIBILITY OF SUCH DAMAGE. */ |
| 28 |
|
|
| 29 |
|
/* $Id$ */ |
| 30 |
|
|
| 31 |
/* |
/* |
| 32 |
itoa.S |
itoa.S |
| 33 |
|
|
| 68 |
mov r_lstr_hi, ZH |
mov r_lstr_hi, ZH |
| 69 |
clt ; make sure T flag is clear |
clt ; make sure T flag is clear |
| 70 |
cpi r_radix, 2 ; no radix < 2 |
cpi r_radix, 2 ; no radix < 2 |
| 71 |
brlt terminate ; return with \0 |
brlt 99f ; return with \0 |
| 72 |
cpi r_radix, 37 ; no radix > 36 |
cpi r_radix, 37 ; no radix > 36 |
| 73 |
brge terminate ; return with \0 |
brge 99f ; return with \0 |
| 74 |
cpi r_radix, 10 ; decimal number ? |
cpi r_radix, 10 ; decimal number ? |
| 75 |
brne divide_loop ; no -> convert |
brne 1f ; no -> convert |
| 76 |
bst r_val_hi, 7 ; for decimal numbers remember sign of value |
bst r_val_hi, 7 ; for decimal numbers remember sign of value |
| 77 |
brtc divide_loop ; positive number -> convert |
brtc 1f ; positive number -> convert |
| 78 |
com r_val_hi ; negative number -> make positive |
com r_val_hi ; negative number -> make positive |
| 79 |
neg r_val_lo |
neg r_val_lo |
| 80 |
sbci r_val_hi, 0xff |
sbci r_val_hi, 0xff |
| 81 |
divide_loop: |
1: |
| 82 |
mov r22, r_radix ; radix |
mov r22, r_radix ; radix |
| 83 |
clr r23 ; dividend in r25:r24, divisor in r23:r22 |
clr r23 ; dividend in r25:r24, divisor in r23:r22 |
| 84 |
XCALL _U(__udivmodhi4); quotient in r23:r22, remainder in r25:r24 |
XCALL _U(__udivmodhi4); quotient in r23:r22, remainder in r25:r24 |
| 86 |
; call-used but preserved: r18, r19, r20, r30, r31 |
; call-used but preserved: r18, r19, r20, r30, r31 |
| 87 |
subi r24, 0xd0 ; + '0' |
subi r24, 0xd0 ; + '0' |
| 88 |
cpi r24, 0x3a ; > '9' ? |
cpi r24, 0x3a ; > '9' ? |
| 89 |
brlt L_10 |
brlt 10f |
| 90 |
subi r24, 0xd9 ; + 'a' - 10 - '0' |
subi r24, 0xd9 ; + 'a' - 10 - '0' |
| 91 |
L_10: |
10: |
| 92 |
st Z+, r24 ; write char to string in reverse order |
st Z+, r24 ; write char to string in reverse order |
| 93 |
mov r_val_lo, r22 ; quotient -> dividend |
mov r_val_lo, r22 ; quotient -> dividend |
| 94 |
mov r_val_hi, r23 |
mov r_val_hi, r23 |
| 95 |
sbiw r_val_lo, 0 ; value == 0 ? |
sbiw r_val_lo, 0 ; value == 0 ? |
| 96 |
brne divide_loop |
brne 1b |
| 97 |
brtc terminate ; T flag clear? -> positive number |
brtc 99f ; T flag clear? -> positive number |
| 98 |
ldi r21, '-' |
ldi r21, '-' |
| 99 |
st Z+, r21 ; write minus sign to string |
st Z+, r21 ; write minus sign to string |
| 100 |
terminate: ; restore &string as return value |
99: |
| 101 |
mov r_val_hi, r_lstr_hi |
mov r_val_hi, r_lstr_hi ; restore &string as return value |
| 102 |
mov r_val_lo, r_lstr_lo |
mov r_val_lo, r_lstr_lo |
| 103 |
st Z, __zero_reg__ ; terminate string |
st Z, __zero_reg__ ; terminate string |
| 104 |
XJMP _U(strrev) ; reverse string |
XJMP _U(strrev) ; reverse string |