fox32rom/integer.asm

64 lines
1.2 KiB
NASM

; integer routines
; convert ASCII string into an integer
; thanks to lua for helping with this :3
; inputs:
; r0: pointer to null-terminated string
; r1: radix (i.e. 10 for decimal, 16 for hexadecimal)
; outputs:
; r0: integer
string_to_int:
push r2
push r3
mov r3, 0
string_to_int_loop:
movz.8 r2, [r0]
inc r0
cmp r2, 0
ifz jmp string_to_int_end
; if (digit >= '0' && digit <= '9') {
; digit -= '0';
; } else if (digit >= 'A' && digit <= 'Z') {
; digit -= 'A' - 10
; } else if (digit >= 'a' && digit <= 'z') {
; digit -= 'a' - 10
; } else {
; continue;
; }
cmp r2, '0'
iflt jmp string_to_int_loop_2
cmp r2, '9'
ifgt jmp string_to_int_loop_2
sub r2, '0'
jmp string_to_int_loop_end
string_to_int_loop_2:
cmp r2, 'A'
iflt jmp string_to_int_loop_3
cmp r2, 'Z'
ifgt jmp string_to_int_loop_3
sub r2, 0x37 ; 'A' - 10
jmp string_to_int_loop_end
string_to_int_loop_3:
cmp r2, 'a'
iflt jmp string_to_int_loop
cmp r2, 'z'
ifgt jmp string_to_int_loop
sub r2, 0x57 ; 'a' - 10
string_to_int_loop_end:
mul r3, r1
add r3, r2
jmp string_to_int_loop
string_to_int_end:
mov r0, r3
pop r3
pop r2
ret