pokediamond/arm9/asm/MSL_Common_string.s
2023-05-24 09:15:59 +01:00

365 lines
6.0 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start strlen
strlen: ; 0x020E2EAC
mvn r2, #0x0
_020E2EB0:
ldrsb r1, [r0], #0x1
add r2, r2, #0x1
cmp r1, #0x0
bne _020E2EB0
mov r0, r2
bx lr
arm_func_end strlen
arm_func_start strcpy
strcpy: ; 0x020E2EC8
stmdb sp!, {r3-r5,lr}
and r4, r1, #0x3
and r3, r0, #0x3
mov r2, r0
cmp r3, r4
bne _020E2F64
cmp r4, #0x0
beq _020E2F20
ldrb r3, [r1, #0x0]
strb r3, [r0, #0x0]
cmp r3, #0x0
ldmeqia sp!, {r3-r5,pc}
rsbs r4, r4, #0x3
beq _020E2F18
_020E2F00:
ldrb r3, [r1, #0x1]!
cmp r3, #0x0
strb r3, [r2, #0x1]!
ldmeqia sp!, {r3-r5,pc}
subs r4, r4, #0x1
bne _020E2F00
_020E2F18:
add r2, r2, #0x1
add r1, r1, #0x1
_020E2F20:
ldr r5, [r1, #0x0]
ldr r3, _020E2F88 ; =0xFEFEFEFF
mvn r4, r5
add lr, r5, r3
ldr ip, _020E2F8C ; =0x80808080
and r4, lr, r4
tst r4, r12
bne _020E2F64
sub r2, r2, #0x4
_020E2F44:
str r5, [r2, #0x4]!
ldr r5, [r1, #0x4]!
add r4, r5, r3
mvn lr, r5
and lr, r4, lr
tst lr, r12
beq _020E2F44
add r2, r2, #0x4
_020E2F64:
ldrb r3, [r1, #0x0]
strb r3, [r2, #0x0]
cmp r3, #0x0
ldmeqia sp!, {r3-r5,pc}
_020E2F74:
ldrb r3, [r1, #0x1]!
cmp r3, #0x0
strb r3, [r2, #0x1]!
bne _020E2F74
ldmia sp!, {r3-r5,pc}
.balign 4
_020E2F88: .word 0xFEFEFEFF
_020E2F8C: .word 0x80808080
arm_func_end strcpy
arm_func_start strncpy
strncpy: ; 0x020E2F90
stmdb sp!, {r3,lr}
mov lr, r0
cmp r2, #0x0
ldmeqia sp!, {r3,pc}
_020E2FA0:
ldrsb r3, [r1], #0x1
mov r12, lr
strb r3, [lr], #0x1
ldrsb r3, [r12, #0x0]
cmp r3, #0x0
bne _020E2FD4
subs r2, r2, #0x1
ldmeqia sp!, {r3,pc}
mov r1, #0x0
_020E2FC4:
strb r1, [lr], #0x1
subs r2, r2, #0x1
bne _020E2FC4
ldmia sp!, {r3,pc}
_020E2FD4:
subs r2, r2, #0x1
bne _020E2FA0
ldmia sp!, {r3,pc}
arm_func_end strncpy
arm_func_start strcat
strcat: ; 0x020E2FE0
mov r3, r0
_020E2FE4:
ldrsb r2, [r3], #0x1
cmp r2, #0x0
bne _020E2FE4
sub r3, r3, #0x1
_020E2FF4:
ldrsb r2, [r1], #0x1
mov r12, r3
strb r2, [r3], #0x1
ldrsb r2, [r12, #0x0]
cmp r2, #0x0
bne _020E2FF4
bx lr
arm_func_end strcat
arm_func_start strncat
strncat: ; 0x020E3010
stmdb sp!, {r3,lr}
mov r12, r0
_020E3018:
ldrsb r3, [r12], #0x1
cmp r3, #0x0
bne _020E3018
cmp r2, #0x0
sub r12, r12, #0x1
beq _020E3054
_020E3030:
ldrsb r3, [r1], #0x1
mov lr, r12
strb r3, [r12], #0x1
ldrsb r3, [lr, #0x0]
cmp r3, #0x0
subeq r12, r12, #0x1
beq _020E3054
subs r2, r2, #0x1
bne _020E3030
_020E3054:
mov r1, #0x0
strb r1, [r12, #0x0]
ldmia sp!, {r3,pc}
arm_func_end strncat
arm_func_start strcmp
strcmp: ; 0x020E3060
stmdb sp!, {r4,lr}
ldrb r2, [r0, #0x0]
ldrb r3, [r1, #0x0]
subs r3, r2, r3
movne r0, r3
ldmneia sp!, {r4,pc}
and r4, r0, #0x3
and r3, r1, #0x3
cmp r3, r4
bne _020E313C
cmp r4, #0x0
beq _020E30D4
cmp r2, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4,pc}
rsbs r4, r4, #0x3
beq _020E30CC
_020E30A4:
ldrb r3, [r0, #0x1]!
ldrb r2, [r1, #0x1]!
subs r2, r3, r2
movne r0, r2
ldmneia sp!, {r4,pc}
cmp r3, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4,pc}
subs r4, r4, #0x1
bne _020E30A4
_020E30CC:
add r0, r0, #0x1
add r1, r1, #0x1
_020E30D4:
ldr r2, [r0, #0x0]
ldr r3, _020E316C ; =0xFEFEFEFF
mvn r4, r2
add lr, r2, r3
ldr ip, _020E3170 ; =0x80808080
and r4, lr, r4
tst r4, r12
ldr r4, [r1, #0x0]
bne _020E3128
cmp r2, r4
bne _020E311C
_020E3100:
ldr r2, [r0, #0x4]!
ldr r4, [r1, #0x4]!
add lr, r2, r3
tst lr, r12
bne _020E3128
cmp r2, r4
beq _020E3100
_020E311C:
sub r0, r0, #0x1
sub r1, r1, #0x1
b _020E313C
_020E3128:
ldrb r2, [r0, #0x0]
ldrb r3, [r1, #0x0]
subs r3, r2, r3
movne r0, r3
ldmneia sp!, {r4,pc}
_020E313C:
cmp r2, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4,pc}
_020E3148:
ldrb r3, [r0, #0x1]!
ldrb r2, [r1, #0x1]!
subs r2, r3, r2
movne r0, r2
ldmneia sp!, {r4,pc}
cmp r3, #0x0
bne _020E3148
mov r0, #0x0
ldmia sp!, {r4,pc}
.balign 4
_020E316C: .word 0xFEFEFEFF
_020E3170: .word 0x80808080
arm_func_end strcmp
arm_func_start strncmp
strncmp: ; 0x020E3174
cmp r2, #0x0
beq _020E31A0
_020E317C:
ldrb r12, [r1], #0x1
ldrb r3, [r0], #0x1
cmp r3, r12
subne r0, r3, r12
bxne lr
cmp r3, #0x0
beq _020E31A0
subs r2, r2, #0x1
bne _020E317C
_020E31A0:
mov r0, #0x0
bx lr
arm_func_end strncmp
arm_func_start strchr
strchr: ; 0x020E31A8
ldrsb r2, [r0], #0x1
mov r1, r1, lsl #0x18
mov r1, r1, asr #0x18
cmp r2, #0x0
beq _020E31D4
_020E31BC:
cmp r2, r1
subeq r0, r0, #0x1
bxeq lr
ldrsb r2, [r0], #0x1
cmp r2, #0x0
bne _020E31BC
_020E31D4:
cmp r1, #0x0
movne r0, #0x0
subeq r0, r0, #0x1
bx lr
arm_func_end strchr
arm_func_start strspn
strspn: ; 0x020E31E4
stmdb sp!, {r4,lr}
sub sp, sp, #0x20
add r12, sp, #0x0
mov r3, #0x8
mov r2, #0x0
_020E31F8:
strb r2, [r12, #0x0]
strb r2, [r12, #0x1]
strb r2, [r12, #0x2]
strb r2, [r12, #0x3]
add r12, r12, #0x4
subs r3, r3, #0x1
bne _020E31F8
ldrb r3, [r1, #0x0]
add r4, r1, #0x1
cmp r3, #0x0
beq _020E3254
add lr, sp, #0x0
mov r2, #0x1
_020E322C:
and r12, r3, #0xff
and r1, r3, #0x7
mov r1, r2, lsl r1
ldrb r3, [lr, r12, asr #0x3]
and r1, r1, #0xff
orr r1, r3, r1
strb r1, [lr, r12, asr #0x3]
ldrb r3, [r4], #0x1
cmp r3, #0x0
bne _020E322C
_020E3254:
ldrb r1, [r0, #0x0]
add r4, r0, #0x1
cmp r1, #0x0
beq _020E3294
add r12, sp, #0x0
mov r2, #0x1
_020E326C:
and r3, r1, #0xff
and r1, r1, #0x7
mov r1, r2, lsl r1
ldrb r3, [r12, r3, asr #0x3]
and r1, r1, #0xff
tst r3, r1
bne _020E3294
ldrb r1, [r4], #0x1
cmp r1, #0x0
bne _020E326C
_020E3294:
sub r0, r4, r0
sub r0, r0, #0x1
add sp, sp, #0x20
ldmia sp!, {r4,pc}
arm_func_end strspn
arm_func_start strstr
strstr: ; 0x020E32A4
stmdb sp!, {r4,lr}
cmp r1, #0x0
ldrneb r2, [r1, #0x0]
cmpne r2, #0x0
ldmeqia sp!, {r4,pc}
ldrb r3, [r0, #0x0]
add r4, r0, #0x1
cmp r3, #0x0
beq _020E3308
_020E32C8:
cmp r3, r2
bne _020E32FC
mov lr, r4
add r12, r1, #0x1
_020E32D8:
ldrb r3, [r12], #0x1
ldrb r0, [lr], #0x1
cmp r0, r3
bne _020E32F0
cmp r0, #0x0
bne _020E32D8
_020E32F0:
cmp r3, #0x0
subeq r0, r4, #0x1
ldmeqia sp!, {r4,pc}
_020E32FC:
ldrb r3, [r4], #0x1
cmp r3, #0x0
bne _020E32C8
_020E3308:
mov r0, #0x0
ldmia sp!, {r4,pc}
arm_func_end strstr