27 lines
620 B
ArmAsm
27 lines
620 B
ArmAsm
.section .text.parse_base10
|
|
|
|
.global _parse_base10
|
|
_parse_base10:
|
|
/* r8 = pointer to text ; r1 = number */
|
|
/* return r0 = number of digits */
|
|
mov #0,r1 /* r1: accumulated number */
|
|
mov r8,r0 /* r0: number of digits */
|
|
add #1,r0
|
|
parse_base10_loop:
|
|
mov.b @r8+,r2
|
|
add #-48,r2 /* ascii '0' */
|
|
cmp/pz r2 /* Rn >= 0 (signed) (r2 >= 0 ) */
|
|
bf/s parse_base10_rts
|
|
mov #9,r4 /* const 9 */
|
|
cmp/ge r2,r4 /* Rn >= Rm (signed) ( 9 >= r2) */
|
|
bf/s parse_base10_rts
|
|
mov #10,r4 /* const 10 */
|
|
mulu.w r1,r4
|
|
sts macl,r1
|
|
bra parse_base10_loop
|
|
add r2,r1
|
|
parse_base10_rts:
|
|
sub r8,r0
|
|
rts
|
|
neg r0,r0
|