diff options
| author | YamaArashi <shadow962@live.com> | 2016-09-03 01:11:14 -0700 |
|---|---|---|
| committer | YamaArashi <shadow962@live.com> | 2016-09-03 01:11:14 -0700 |
| commit | b12e80fc04666cb305504744fbe37a9a24af02cb (patch) | |
| tree | 5ad75e75a41258e43f62515d65bb628c4c5ca510 /asm/libc.s | |
| parent | a05857f889631dd6e722f952475fb96382cdf999 (diff) | |
split asm/emerald.s
Diffstat (limited to 'asm/libc.s')
| -rw-r--r-- | asm/libc.s | 213 |
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. |
