advent-of-sh/common/parse_base10.s

25 lines
576 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 */
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:
rts
sub r8,r0