| 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 |
ltoa.S |
ltoa.S |
| 33 |
|
|
| 71 |
push ZH ; keep &string |
push ZH ; keep &string |
| 72 |
push ZL |
push ZL |
| 73 |
cpi a_radix, 2 ; no radix < 2 |
cpi a_radix, 2 ; no radix < 2 |
| 74 |
brlt conv_finished ; return with \0 |
brlt 99f ; return with \0 |
| 75 |
cpi a_radix, 37 ; no radix > 36 |
cpi a_radix, 37 ; no radix > 36 |
| 76 |
brge conv_finished ; return with \0 |
brge 99f ; return with \0 |
| 77 |
mov r_radix, a_radix; save radix |
mov r_radix, a_radix; save radix |
| 78 |
clt ; make sure T flag is clear |
clt ; make sure T flag is clear |
| 79 |
cpi r_radix, 10 ; decimal number? |
cpi r_radix, 10 ; decimal number? |
| 80 |
brne divide_loop |
brne 1f |
| 81 |
bst a_val_hhi, 7 ; remember sign of decimal number |
bst a_val_hhi, 7 ; remember sign of decimal number |
| 82 |
brtc divide_loop ; number positive? -> convert |
brtc 1f ; number positive? -> convert |
| 83 |
com a_val_hhi ; make decimal number positive |
com a_val_hhi ; make decimal number positive |
| 84 |
com a_val_hlo |
com a_val_hlo |
| 85 |
com a_val_hi |
com a_val_hi |
| 87 |
sbci a_val_hi, lo8(-1) |
sbci a_val_hi, lo8(-1) |
| 88 |
sbci a_val_hlo, lo8(-1) |
sbci a_val_hlo, lo8(-1) |
| 89 |
sbci a_val_hhi, lo8(-1) |
sbci a_val_hhi, lo8(-1) |
| 90 |
divide_loop: |
1: |
| 91 |
mov r18, r_radix ; radix is divisor |
mov r18, r_radix ; radix is divisor |
| 92 |
clr r19 ; remainder of number is dividend |
clr r19 ; remainder of number is dividend |
| 93 |
clr r20 |
clr r20 |
| 99 |
pop ZH |
pop ZH |
| 100 |
subi r22, 0xd0 ; + '0' |
subi r22, 0xd0 ; + '0' |
| 101 |
cpi r22, 0x3a ; > '9' ? |
cpi r22, 0x3a ; > '9' ? |
| 102 |
brlt L_10 |
brlt 10f |
| 103 |
subi r22, 0xd9 ; + 'a' - 10 - '0' |
subi r22, 0xd9 ; + 'a' - 10 - '0' |
| 104 |
L_10: |
10: |
| 105 |
st Z+, r22 ; write character to string in reverse order! |
st Z+, r22 ; write character to string in reverse order! |
| 106 |
mov a_val_lo, r18 ; quotient -> dividend |
mov a_val_lo, r18 ; quotient -> dividend |
| 107 |
mov a_val_hi, r19 |
mov a_val_hi, r19 |
| 111 |
sbci a_val_hi, 0 |
sbci a_val_hi, 0 |
| 112 |
sbci a_val_hlo, 0 |
sbci a_val_hlo, 0 |
| 113 |
sbci a_val_hhi,0 ; value == 0 ? |
sbci a_val_hhi,0 ; value == 0 ? |
| 114 |
brne divide_loop |
brne 1b |
| 115 |
brtc conv_finished ; decimal number positive -> finish |
brtc 99f ; decimal number positive -> finish |
| 116 |
ldi r28, '-' |
ldi r28, '-' |
| 117 |
st Z+, r28 ; write minus sign to string |
st Z+, r28 ; write minus sign to string |
| 118 |
conv_finished: |
99: |
| 119 |
st Z, __zero_reg__ ; terminate string |
st Z, __zero_reg__ ; terminate string |
| 120 |
pop a_val_hlo ; restore &string as return value |
pop a_val_hlo ; restore &string as return value |
| 121 |
pop a_val_hhi |
pop a_val_hhi |