summaryrefslogtreecommitdiff
path: root/asm/libc.s
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-09-03 01:11:14 -0700
committerYamaArashi <shadow962@live.com>2016-09-03 01:11:14 -0700
commitb12e80fc04666cb305504744fbe37a9a24af02cb (patch)
tree5ad75e75a41258e43f62515d65bb628c4c5ca510 /asm/libc.s
parenta05857f889631dd6e722f952475fb96382cdf999 (diff)
split asm/emerald.s
Diffstat (limited to 'asm/libc.s')
-rw-r--r--asm/libc.s213
1 files changed, 213 insertions, 0 deletions
diff --git a/asm/libc.s b/asm/libc.s
new file mode 100644
index 000000000..a7a233f83
--- /dev/null
+++ b/asm/libc.s
@@ -0,0 +1,213 @@
+ .include "asm/macros.s"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start memcpy
+@ void *memcpy(void *dest, void *src, int size)
+memcpy: @ 82E93D4
+ push {r4,r5,lr}
+ adds r5, r0, 0
+ adds r4, r5, 0
+ adds r3, r1, 0
+ cmp r2, 0xF
+ bls _082E9414
+ adds r0, r3, 0
+ orrs r0, r5
+ movs r1, 0x3
+ ands r0, r1
+ cmp r0, 0
+ bne _082E9414
+ adds r1, r5, 0
+_082E93EE:
+ ldm r3!, {r0}
+ stm r1!, {r0}
+ ldm r3!, {r0}
+ stm r1!, {r0}
+ ldm r3!, {r0}
+ stm r1!, {r0}
+ ldm r3!, {r0}
+ stm r1!, {r0}
+ subs r2, 0x10
+ cmp r2, 0xF
+ bhi _082E93EE
+ cmp r2, 0x3
+ bls _082E9412
+_082E9408:
+ ldm r3!, {r0}
+ stm r1!, {r0}
+ subs r2, 0x4
+ cmp r2, 0x3
+ bhi _082E9408
+_082E9412:
+ adds r4, r1, 0
+_082E9414:
+ subs r2, 0x1
+ movs r0, 0x1
+ negs r0, r0
+ cmp r2, r0
+ beq _082E942E
+ adds r1, r0, 0
+_082E9420:
+ ldrb r0, [r3]
+ strb r0, [r4]
+ adds r3, 0x1
+ adds r4, 0x1
+ subs r2, 0x1
+ cmp r2, r1
+ bne _082E9420
+_082E942E:
+ adds r0, r5, 0
+ pop {r4,r5,pc}
+ thumb_func_end memcpy
+
+ thumb_func_start memset
+@ void *memset(void *dest, char c, int size)
+memset: @ 82E9434
+ push {r4,r5,lr}
+ adds r5, r0, 0
+ adds r4, r1, 0
+ adds r3, r5, 0
+ cmp r2, 0x3
+ bls _082E947A
+ movs r0, 0x3
+ ands r0, r5
+ cmp r0, 0
+ bne _082E947A
+ adds r1, r5, 0
+ movs r0, 0xFF
+ ands r4, r0
+ lsls r3, r4, 8
+ orrs r3, r4
+ lsls r0, r3, 16
+ orrs r3, r0
+ cmp r2, 0xF
+ bls _082E946E
+_082E945A:
+ stm r1!, {r3}
+ stm r1!, {r3}
+ stm r1!, {r3}
+ stm r1!, {r3}
+ subs r2, 0x10
+ cmp r2, 0xF
+ bhi _082E945A
+ b _082E946E
+_082E946A:
+ stm r1!, {r3}
+ subs r2, 0x4
+_082E946E:
+ cmp r2, 0x3
+ bhi _082E946A
+ adds r3, r1, 0
+ b _082E947A
+_082E9476:
+ strb r4, [r3]
+ adds r3, 0x1
+_082E947A:
+ adds r0, r2, 0
+ subs r2, 0x1
+ cmp r0, 0
+ bne _082E9476
+ adds r0, r5, 0
+ pop {r4,r5,pc}
+ thumb_func_end memset
+
+ thumb_func_start strcmp
+@ int strcmp(char *s1, char *s2)
+strcmp: @ 82E9488
+ push {r4,r5,lr}
+ adds r2, r0, 0
+ adds r3, r1, 0
+ orrs r0, r3
+ movs r1, 0x3
+ ands r0, r1
+ cmp r0, 0
+ bne _082E94CE
+ ldr r1, [r2]
+ ldr r0, [r3]
+ cmp r1, r0
+ bne _082E94CE
+ ldr r5, _082E94B4
+ ldr r4, _082E94B8
+_082E94A4:
+ ldr r1, [r2]
+ adds r0, r1, r5
+ bics r0, r1
+ ands r0, r4
+ cmp r0, 0
+ beq _082E94BC
+ movs r0, 0
+ b _082E94E0
+ .align 2, 0
+_082E94B4: .4byte 0xfefefeff
+_082E94B8: .4byte 0x80808080
+_082E94BC:
+ adds r2, 0x4
+ adds r3, 0x4
+ ldr r1, [r2]
+ ldr r0, [r3]
+ cmp r1, r0
+ beq _082E94A4
+ b _082E94CE
+_082E94CA:
+ adds r2, 0x1
+ adds r3, 0x1
+_082E94CE:
+ ldrb r0, [r2]
+ cmp r0, 0
+ beq _082E94DA
+ ldrb r1, [r3]
+ cmp r0, r1
+ beq _082E94CA
+_082E94DA:
+ ldrb r2, [r2]
+ ldrb r3, [r3]
+ subs r0, r2, r3
+_082E94E0:
+ pop {r4,r5,pc}
+ thumb_func_end strcmp
+
+ thumb_func_start strcat
+strcat: @ 82E94E4
+ push {r4-r6,lr}
+ adds r6, r0, 0
+ adds r3, r6, 0
+ adds r2, r1, 0
+ adds r0, r2, 0
+ orrs r0, r6
+ movs r1, 0x3
+ ands r0, r1
+ cmp r0, 0
+ bne _082E951C
+ ldr r1, [r2]
+ ldr r5, _082E9504
+ adds r0, r1, r5
+ bics r0, r1
+ ldr r4, _082E9508
+ b _082E9516
+ .align 2, 0
+_082E9504: .4byte 0xfefefeff
+_082E9508: .4byte 0x80808080
+_082E950C:
+ ldm r2!, {r0}
+ stm r3!, {r0}
+ ldr r1, [r2]
+ adds r0, r1, r5
+ bics r0, r1
+_082E9516:
+ ands r0, r4
+ cmp r0, 0
+ beq _082E950C
+_082E951C:
+ ldrb r0, [r2]
+ strb r0, [r3]
+ lsls r0, 24
+ adds r2, 0x1
+ adds r3, 0x1
+ cmp r0, 0
+ bne _082E951C
+ adds r0, r6, 0
+ pop {r4-r6,pc}
+
+ .align 2, 0 @ Don't pad with nop.