summaryrefslogtreecommitdiff
path: root/arm9/asm/MSL_Common_strtoul.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/MSL_Common_strtoul.s')
-rw-r--r--arm9/asm/MSL_Common_strtoul.s743
1 files changed, 743 insertions, 0 deletions
diff --git a/arm9/asm/MSL_Common_strtoul.s b/arm9/asm/MSL_Common_strtoul.s
new file mode 100644
index 00000000..ab4a1bbf
--- /dev/null
+++ b/arm9/asm/MSL_Common_strtoul.s
@@ -0,0 +1,743 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start __strtoul
+__strtoul:
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0xc
+ ldr r4, [sp, #0x38]
+ movs r9, r0
+ ldr r0, [sp, #0x34]
+ str r4, [sp, #0x38]
+ mov r4, #0x0
+ str r0, [sp, #0x34]
+ ldr r0, [sp, #0x38]
+ str r1, [sp, #0x0]
+ str r4, [r0, #0x0]
+ mov r0, r4
+ str r0, [sp, #0x4]
+ ldr r0, [sp, #0x34]
+ mov r1, r4
+ str r1, [r0, #0x0]
+ ldr r0, [sp, #0x30]
+ str r4, [sp, #0x8]
+ mov r8, r2
+ mov r7, r3
+ mov r5, r4
+ mov r10, r4
+ str r0, [sp, #0x30]
+ mov r4, #0x1
+ bmi _020E46CC
+ cmp r9, #0x1
+ beq _020E46CC
+ cmp r9, #0x24
+ bgt _020E46CC
+ ldr r0, [sp, #0x0]
+ cmp r0, #0x1
+ bge _020E46D4
+_020E46CC:
+ mov r4, #0x40
+ b _020E46F0
+_020E46D4:
+ ldr r1, [sp, #0x8]
+ mov r0, r7
+ mov r3, r1
+ mov r2, r1
+ add r5, r3, #0x1
+ blx r8
+ mov r6, r0
+_020E46F0:
+ cmp r9, #0x0
+ beq _020E4708
+ mov r1, r9
+ mvn r0, #0x0
+ bl _u32_div_f
+ str r0, [sp, #0x4]
+_020E4708:
+ mvn r11, #0x0
+ b _020E49C8
+_020E4710:
+ cmp r4, #0x8
+ bgt _020E4748
+ cmp r4, #0x0
+ addge pc, pc, r4, lsl #0x2
+ b _020E49C8
+ b _020E49C8
+ b _020E4754
+ b _020E4800
+ b _020E49C8
+ b _020E483C
+ b _020E49C8
+ b _020E49C8
+ b _020E49C8
+ b _020E487C
+_020E4748:
+ cmp r4, #0x10
+ beq _020E487C
+ b _020E49C8
+_020E4754:
+ cmp r6, #0x0
+ blt _020E4764
+ cmp r6, #0x80
+ blt _020E476C
+_020E4764:
+ mov r0, #0x0
+ b _020E477C
+_020E476C:
+ ldr r0, _020E4A2C ; =__msl_digit
+ mov r1, r6, lsl #0x1
+ ldrh r0, [r0, r1]
+ and r0, r0, #0x100
+_020E477C:
+ cmp r0, #0x0
+ beq _020E47A8
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ blx r8
+ mov r6, r0
+ ldr r0, [sp, #0x8]
+ add r0, r0, #0x1
+ str r0, [sp, #0x8]
+ b _020E49C8
+_020E47A8:
+ cmp r6, #0x2b
+ bne _020E47CC
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ b _020E47F8
+_020E47CC:
+ cmp r6, #0x2d
+ bne _020E47F8
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ ldr r0, [sp, #0x34]
+ mov r1, #0x1
+ str r1, [r0, #0x0]
+_020E47F8:
+ mov r4, #0x2
+ b _020E49C8
+_020E4800:
+ cmp r9, #0x0
+ cmpne r9, #0x10
+ bne _020E4834
+ cmp r6, #0x30
+ bne _020E4834
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ mov r4, #0x4
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ b _020E49C8
+_020E4834:
+ mov r4, #0x8
+ b _020E49C8
+_020E483C:
+ cmp r6, #0x58
+ cmpne r6, #0x78
+ bne _020E486C
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ mov r9, #0x10
+ mov r4, #0x8
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ b _020E49C8
+_020E486C:
+ cmp r9, #0x0
+ moveq r9, #0x8
+ mov r4, #0x10
+ b _020E49C8
+_020E487C:
+ ldr r0, [sp, #0x4]
+ cmp r9, #0x0
+ moveq r9, #0xa
+ cmp r0, #0x0
+ bne _020E48A0
+ mov r0, r11
+ mov r1, r9
+ bl _u32_div_f
+ str r0, [sp, #0x4]
+_020E48A0:
+ cmp r6, #0x0
+ blt _020E48B0
+ cmp r6, #0x80
+ blt _020E48B8
+_020E48B0:
+ mov r0, #0x0
+ b _020E48C8
+_020E48B8:
+ ldr r0, _020E4A2C ; =__msl_digit
+ mov r1, r6, lsl #0x1
+ ldrh r0, [r0, r1]
+ and r0, r0, #0x8
+_020E48C8:
+ cmp r0, #0x0
+ beq _020E48F0
+ sub r6, r6, #0x30
+ cmp r6, r9
+ blt _020E4978
+ cmp r4, #0x10
+ moveq r4, #0x20
+ movne r4, #0x40
+ add r6, r6, #0x30
+ b _020E49C8
+_020E48F0:
+ cmp r6, #0x0
+ blt _020E4900
+ cmp r6, #0x80
+ blt _020E4908
+_020E4900:
+ mov r0, #0x0
+ b _020E4918
+_020E4908:
+ ldr r0, _020E4A2C ; =__msl_digit
+ mov r1, r6, lsl #0x1
+ ldrh r0, [r0, r1]
+ and r0, r0, #0x1
+_020E4918:
+ cmp r0, #0x0
+ beq _020E494C
+ cmp r6, #0x0
+ blt _020E4930
+ cmp r6, #0x80
+ blt _020E4938
+_020E4930:
+ mov r0, r6
+ b _020E4940
+_020E4938:
+ ldr r0, _020E4A30 ; =__upper_mapC
+ ldrb r0, [r0, r6]
+_020E4940:
+ sub r0, r0, #0x37
+ cmp r0, r9
+ blt _020E495C
+_020E494C:
+ cmp r4, #0x10
+ moveq r4, #0x20
+ movne r4, #0x40
+ b _020E49C8
+_020E495C:
+ cmp r6, #0x0
+ blt _020E4974
+ cmp r6, #0x80
+ bge _020E4974
+ ldr r0, _020E4A30 ; =__upper_mapC
+ ldrb r6, [r0, r6]
+_020E4974:
+ sub r6, r6, #0x37
+_020E4978:
+ ldr r0, [sp, #0x4]
+ mov r4, #0x10
+ cmp r10, r0
+ ldrhi r0, [sp, #0x38]
+ movhi r1, #0x1
+ strhi r1, [r0, #0x0]
+ mul r0, r10, r9
+ mov r10, r0
+ sub r0, r11, r0
+ cmp r6, r0
+ ldrhi r0, [sp, #0x38]
+ movhi r1, #0x1
+ strhi r1, [r0, #0x0]
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ add r10, r10, r6
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+_020E49C8:
+ ldr r0, [sp, #0x0]
+ cmp r5, r0
+ bgt _020E49E4
+ cmp r6, r11
+ beq _020E49E4
+ tst r4, #0x60
+ beq _020E4710
+_020E49E4:
+ tst r4, #0x34
+ bne _020E49FC
+ ldr r0, [sp, #0x30]
+ mov r10, #0x0
+ str r10, [r0, #0x0]
+ b _020E4A10
+_020E49FC:
+ ldr r0, [sp, #0x8]
+ sub r1, r5, #0x1
+ add r1, r1, r0
+ ldr r0, [sp, #0x30]
+ str r1, [r0, #0x0]
+_020E4A10:
+ mov r0, r7
+ mov r1, r6
+ mov r2, #0x1
+ blx r8
+ mov r0, r10
+ add sp, sp, #0xc
+ ldmia sp!, {r4-r11,pc}
+ .balign 4
+_020E4A2C: .word __msl_digit
+_020E4A30: .word __upper_mapC
+ arm_func_end __strtoul
+
+ arm_func_start __strtoull
+__strtoull: ; 0x020E4A34
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x1c
+ ldr r4, [sp, #0x48]
+ movs r9, r0
+ ldr r0, [sp, #0x44]
+ str r4, [sp, #0x48]
+ mov r4, #0x0
+ str r0, [sp, #0x44]
+ ldr r0, [sp, #0x48]
+ str r1, [sp, #0x0]
+ str r4, [r0, #0x0]
+ mov r0, r4
+ str r0, [sp, #0xc]
+ str r0, [sp, #0x8]
+ ldr r0, [sp, #0x44]
+ mov r1, r4
+ str r1, [r0, #0x0]
+ ldr r0, [sp, #0x40]
+ str r4, [sp, #0x14]
+ mov r8, r2
+ mov r7, r3
+ mov r5, r4
+ mov r10, r4
+ mov r11, r4
+ str r0, [sp, #0x40]
+ mov r4, #0x1
+ bmi _020E4ABC
+ cmp r9, #0x1
+ beq _020E4ABC
+ cmp r9, #0x24
+ bgt _020E4ABC
+ ldr r0, [sp, #0x0]
+ cmp r0, #0x1
+ bge _020E4AC4
+_020E4ABC:
+ mov r4, #0x40
+ b _020E4ADC
+_020E4AC4:
+ ldr r1, [sp, #0x14]
+ mov r0, r7
+ mov r2, r1
+ add r5, r1, #0x1
+ blx r8
+ mov r6, r0
+_020E4ADC:
+ cmp r9, #0x0
+ beq _020E4B00
+ mvn r0, #0x0
+ mov r1, r0
+ mov r3, r9, asr #0x1f
+ mov r2, r9
+ bl _ll_udiv
+ str r0, [sp, #0xc]
+ str r1, [sp, #0x8]
+_020E4B00:
+ mvn r0, #0x0
+ str r0, [sp, #0x18]
+ b _020E4E08
+_020E4B0C:
+ cmp r4, #0x8
+ bgt _020E4B44
+ cmp r4, #0x0
+ addge pc, pc, r4, lsl #0x2
+ b _020E4E08
+ b _020E4E08
+ b _020E4B50
+ b _020E4BFC
+ b _020E4E08
+ b _020E4C38
+ b _020E4E08
+ b _020E4E08
+ b _020E4E08
+ b _020E4C78
+_020E4B44:
+ cmp r4, #0x10
+ beq _020E4C78
+ b _020E4E08
+_020E4B50:
+ cmp r6, #0x0
+ blt _020E4B60
+ cmp r6, #0x80
+ blt _020E4B68
+_020E4B60:
+ mov r0, #0x0
+ b _020E4B78
+_020E4B68:
+ ldr r0, _020E4E78 ; =__msl_digit
+ mov r1, r6, lsl #0x1
+ ldrh r0, [r0, r1]
+ and r0, r0, #0x100
+_020E4B78:
+ cmp r0, #0x0
+ beq _020E4BA4
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ blx r8
+ mov r6, r0
+ ldr r0, [sp, #0x14]
+ add r0, r0, #0x1
+ str r0, [sp, #0x14]
+ b _020E4E08
+_020E4BA4:
+ cmp r6, #0x2b
+ bne _020E4BC8
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ b _020E4BF4
+_020E4BC8:
+ cmp r6, #0x2d
+ bne _020E4BF4
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ ldr r0, [sp, #0x44]
+ mov r1, #0x1
+ str r1, [r0, #0x0]
+_020E4BF4:
+ mov r4, #0x2
+ b _020E4E08
+_020E4BFC:
+ cmp r9, #0x0
+ cmpne r9, #0x10
+ bne _020E4C30
+ cmp r6, #0x30
+ bne _020E4C30
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ mov r4, #0x4
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ b _020E4E08
+_020E4C30:
+ mov r4, #0x8
+ b _020E4E08
+_020E4C38:
+ cmp r6, #0x58
+ cmpne r6, #0x78
+ bne _020E4C68
+ mov r1, #0x0
+ mov r0, r7
+ mov r2, r1
+ mov r9, #0x10
+ mov r4, #0x8
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+ b _020E4E08
+_020E4C68:
+ cmp r9, #0x0
+ moveq r9, #0x8
+ mov r4, #0x10
+ b _020E4E08
+_020E4C78:
+ ldr r1, [sp, #0x8]
+ mov r0, #0x0
+ cmp r9, #0x0
+ moveq r9, #0xa
+ cmp r1, r0
+ ldr r1, [sp, #0xc]
+ cmpeq r1, r0
+ bne _020E4CB4
+ ldr r0, [sp, #0x18]
+ mov r3, r9, asr #0x1f
+ mov r1, r0
+ mov r2, r9
+ bl _ll_udiv
+ str r0, [sp, #0xc]
+ str r1, [sp, #0x8]
+_020E4CB4:
+ cmp r6, #0x0
+ blt _020E4CC4
+ cmp r6, #0x80
+ blt _020E4CCC
+_020E4CC4:
+ mov r0, #0x0
+ b _020E4CDC
+_020E4CCC:
+ ldr r0, _020E4E78 ; =__msl_digit
+ mov r1, r6, lsl #0x1
+ ldrh r0, [r0, r1]
+ and r0, r0, #0x8
+_020E4CDC:
+ cmp r0, #0x0
+ beq _020E4D04
+ sub r6, r6, #0x30
+ cmp r6, r9
+ blt _020E4D8C
+ cmp r4, #0x10
+ moveq r4, #0x20
+ movne r4, #0x40
+ add r6, r6, #0x30
+ b _020E4E08
+_020E4D04:
+ cmp r6, #0x0
+ blt _020E4D14
+ cmp r6, #0x80
+ blt _020E4D1C
+_020E4D14:
+ mov r0, #0x0
+ b _020E4D2C
+_020E4D1C:
+ ldr r0, _020E4E78 ; =__msl_digit
+ mov r1, r6, lsl #0x1
+ ldrh r0, [r0, r1]
+ and r0, r0, #0x1
+_020E4D2C:
+ cmp r0, #0x0
+ beq _020E4D60
+ cmp r6, #0x0
+ blt _020E4D44
+ cmp r6, #0x80
+ blt _020E4D4C
+_020E4D44:
+ mov r0, r6
+ b _020E4D54
+_020E4D4C:
+ ldr r0, _020E4E7C ; =__upper_mapC
+ ldrb r0, [r0, r6]
+_020E4D54:
+ sub r0, r0, #0x37
+ cmp r0, r9
+ blt _020E4D70
+_020E4D60:
+ cmp r4, #0x10
+ moveq r4, #0x20
+ movne r4, #0x40
+ b _020E4E08
+_020E4D70:
+ cmp r6, #0x0
+ blt _020E4D88
+ cmp r6, #0x80
+ bge _020E4D88
+ ldr r0, _020E4E7C ; =__upper_mapC
+ ldrb r6, [r0, r6]
+_020E4D88:
+ sub r6, r6, #0x37
+_020E4D8C:
+ ldr r0, [sp, #0x8]
+ umull r2, r3, r10, r9
+ cmp r11, r0
+ ldr r0, [sp, #0xc]
+ mov r4, #0x10
+ cmpeq r10, r0
+ ldrhi r0, [sp, #0x48]
+ movhi r1, #0x1
+ strhi r1, [r0, #0x0]
+ mov r1, r9, asr #0x1f
+ mla r3, r10, r1, r3
+ mla r3, r11, r9, r3
+ ldr r1, [sp, #0x18]
+ mov r10, r2
+ subs r2, r1, r2
+ mov r0, r6, asr #0x1f
+ sbc r1, r1, r3
+ cmp r0, r1
+ cmpeq r6, r2
+ ldrhi r1, [sp, #0x48]
+ movhi r2, #0x1
+ strhi r2, [r1, #0x0]
+ mov r1, #0x0
+ mov r11, r3
+ adds r10, r10, r6
+ adc r11, r11, r0
+ mov r0, r7
+ mov r2, r1
+ add r5, r5, #0x1
+ blx r8
+ mov r6, r0
+_020E4E08:
+ ldr r0, [sp, #0x0]
+ cmp r5, r0
+ bgt _020E4E28
+ ldr r0, [sp, #0x18]
+ cmp r6, r0
+ beq _020E4E28
+ tst r4, #0x60
+ beq _020E4B0C
+_020E4E28:
+ tst r4, #0x34
+ bne _020E4E44
+ ldr r0, [sp, #0x40]
+ mov r10, #0x0
+ mov r11, r10
+ str r10, [r0, #0x0]
+ b _020E4E58
+_020E4E44:
+ ldr r0, [sp, #0x14]
+ sub r1, r5, #0x1
+ add r1, r1, r0
+ ldr r0, [sp, #0x40]
+ str r1, [r0, #0x0]
+_020E4E58:
+ mov r0, r7
+ mov r1, r6
+ mov r2, #0x1
+ blx r8
+ mov r0, r10
+ mov r1, r11
+ add sp, sp, #0x1c
+ ldmia sp!, {r4-r11,pc}
+ .balign 4
+_020E4E78: .word __msl_digit
+_020E4E7C: .word __upper_mapC
+ arm_func_end __strtoull
+
+ arm_func_start strtoul
+strtoul: ; 0x020E4E80
+ stmdb sp!, {r3-r5,lr}
+ sub sp, sp, #0x20
+ mov r5, r0
+ mov lr, #0x0
+ mov r0, r2
+ mov r4, r1
+ add r2, sp, #0x1c
+ str r5, [sp, #0xc]
+ str lr, [sp, #0x10]
+ str r2, [sp, #0x0]
+ add r1, sp, #0x18
+ str r1, [sp, #0x4]
+ add r12, sp, #0x14
+ ldr r2, _020E4F10 ; =__StringRead
+ add r3, sp, #0xc
+ sub r1, lr, #0x80000001
+ str r12, [sp, #0x8]
+ bl __strtoul
+ cmp r4, #0x0
+ ldrne r1, [sp, #0x1c]
+ addne r1, r5, r1
+ strne r1, [r4, #0x0]
+ ldr r1, [sp, #0x14]
+ cmp r1, #0x0
+ beq _020E4EFC
+ ldr r0, _020E4F14 ; =errno
+ mov r1, #0x22
+ str r1, [r0, #0x0]
+ add sp, sp, #0x20
+ mvn r0, #0x0
+ ldmia sp!, {r3-r5,pc}
+_020E4EFC:
+ ldr r1, [sp, #0x18]
+ cmp r1, #0x0
+ rsbne r0, r0, #0x0
+ add sp, sp, #0x20
+ ldmia sp!, {r3-r5,pc}
+ .balign 4
+_020E4F10: .word __StringRead
+_020E4F14: .word errno
+ arm_func_end strtoul
+
+ arm_func_start strtol
+strtol: ; 0x020E4F18
+ stmdb sp!, {r3-r5,lr}
+ sub sp, sp, #0x20
+ mov r5, r0
+ mov lr, #0x0
+ mov r0, r2
+ mov r4, r1
+ add r2, sp, #0x1c
+ str r5, [sp, #0xc]
+ str lr, [sp, #0x10]
+ str r2, [sp, #0x0]
+ add r1, sp, #0x18
+ str r1, [sp, #0x4]
+ add r12, sp, #0x14
+ ldr r2, _020E4FD8 ; =__StringRead
+ add r3, sp, #0xc
+ sub r1, lr, #0x80000001
+ str r12, [sp, #0x8]
+ bl __strtoul
+ cmp r4, #0x0
+ ldrne r1, [sp, #0x1c]
+ addne r1, r5, r1
+ strne r1, [r4, #0x0]
+ ldr r1, [sp, #0x14]
+ cmp r1, #0x0
+ bne _020E4FA4
+ ldr r2, [sp, #0x18]
+ cmp r2, #0x0
+ bne _020E4F94
+ mvn r1, #0x80000000
+ cmp r0, r1
+ bhi _020E4FA4
+_020E4F94:
+ cmp r2, #0x0
+ beq _020E4FC8
+ cmp r0, #0x80000000
+ bls _020E4FC8
+_020E4FA4:
+ ldr r0, [sp, #0x18]
+ ldr r1, _020E4FDC ; =errno
+ mov r2, #0x22
+ cmp r0, #0x0
+ movne r0, #0x80000000
+ str r2, [r1, #0x0]
+ add sp, sp, #0x20
+ mvneq r0, #0x80000000
+ ldmia sp!, {r3-r5,pc}
+_020E4FC8:
+ cmp r2, #0x0
+ rsbne r0, r0, #0x0
+ add sp, sp, #0x20
+ ldmia sp!, {r3-r5,pc}
+ .balign 4
+_020E4FD8: .word __StringRead
+_020E4FDC: .word errno
+ arm_func_end strtol
+
+ arm_func_start atol
+atol: ; 0x020E4FE0
+ ldr ip, _020E4FF0 ; =strtol
+ mov r1, #0x0
+ mov r2, #0xa
+ bx r12
+ .balign 4
+_020E4FF0: .word strtol
+ arm_func_end atol
+
+ .section .exceptix,4
+
+ .word __strtoul
+ .short 1001
+ .word 0x0060FF00
+ .word __strtoull
+ .short 1101
+ .word 0x0080FF00
+ .word strtoul
+ .short 153
+ .word 0x00600300
+ .word strtol
+ .short 201
+ .word 0x00600300
+ .word atol
+ .short 21
+ .word 0x00000000