diff --git a/strint.asm b/strint.asm index 2f258e0..84bebbc 100644 --- a/strint.asm +++ b/strint.asm @@ -2,7 +2,7 @@ ; r1 - Partially parsed output integer ; r2 - Parsing position ; r3 - Character being parsed -; r4 - Flag set if negative +; r4 - Set to -1 if the input is negative ; Convert string to integer ; Arguments: @@ -44,8 +44,9 @@ je atoi_hex_loop ; FALLTHROUGH: not a valid prefix, but we did see a zero atoi_done: -add r1, r1, r4 +add r1, r1, r4 ; If r4 is -1, negate r1. Else it's 0 and no effect. xor r1, r1, r4 +mov flags, 0 ; No error jmp r13 ; Convert decimal string to integer @@ -60,8 +61,15 @@ jmp r13 pub atoi_dec: mov r2, r1 mov r1, 0 +mov r4, 0 +load_8 r3, [r2] +cmp r3, 0x2D ; '-' +jne atoi_dec_positive +sub r4, zr, 1 ; Set r4 to -1 +add r2, r2, 1 atoi_dec_loop: load_8 r3, [r2] +atoi_dec_positive: cmp r3, 0x30 ; '0' jl atoi_done cmp r3, 0x39 ; '9' @@ -86,6 +94,13 @@ jmp atoi_dec_loop pub atoi_bin: mov r2, r1 mov r1, 0 +mov r4, 0 +load_8 r3, [r2] +cmp r3, 0x2D ; '-' +jne atoi_bin_positive +sub r4, zr, 1 ; Set r4 to -1 +add r2, r2, 1 +atoi_bin_positive: load_16 r3, [r2] ; check for prefix and r3, r3, 0xFF5F ; to uppercase cmp r3, 0x3042 ; "0B" @@ -115,6 +130,13 @@ jmp atoi_bin_loop pub atoi_oct: mov r2, r1 mov r1, 0 +mov r4, 0 +load_8 r3, [r2] +cmp r3, 0x2D ; '-' +jne atoi_oct_positive +sub r4, zr, 1 ; Set r4 to -1 +add r2, r2, 1 +atoi_oct_positive: load_16 r3, [r2] ; check for prefix and r3, r3, 0xFF5F ; to uppercase cmp r3, 0x304F ; "0O" @@ -144,6 +166,13 @@ jmp atoi_oct_loop pub atoi_hex: mov r2, r1 mov r1, 0 +mov r4, 0 +load_8 r3, [r2] +cmp r3, 0x2D ; '-' +jne atoi_hex_positive +sub r4, zr, 1 ; Set r4 to -1 +add r2, r2, 1 +atoi_hex_positive: load_16 r3, [r2] ; check for prefix and r3, r3, 0xFF5F ; to uppercase cmp r3, 0x3058 ; "0X"