summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_alloc.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/asm/OS_alloc.s')
-rw-r--r--arm7/asm/OS_alloc.s427
1 files changed, 427 insertions, 0 deletions
diff --git a/arm7/asm/OS_alloc.s b/arm7/asm/OS_alloc.s
new file mode 100644
index 00000000..43372371
--- /dev/null
+++ b/arm7/asm/OS_alloc.s
@@ -0,0 +1,427 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OS_CheckHeap
+OS_CheckHeap: ; 0x037F9D88
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r8, r0
+ mov r7, r1
+ mov r6, #0
+ mov r5, r6
+ mvn r4, #0
+ bl OS_DisableInterrupts
+ ldr r1, _037F9F34 ; =OSiHeapInfo
+ ldr ip, [r1, r8, lsl #2]
+ mov r1, r4
+ cmp r7, r1
+ ldreq r7, [ip]
+ ldr r2, [ip, #16]
+ cmp r2, #0
+ beq _037F9F24
+ cmp r7, #0
+ blt _037F9F24
+ ldr r1, [ip, #4]
+ cmp r7, r1
+ bge _037F9F24
+ mov r1, #12
+ mul r1, r7, r1
+ add r3, r2, r1
+ ldr r2, [r2, r1]
+ cmp r2, #0
+ blt _037F9F24
+ ldr r1, [r3, #8]
+ cmp r1, #0
+ beq _037F9E70
+ ldr r7, [r1]
+ cmp r7, #0
+ bne _037F9F24
+ b _037F9E70
+_037F9E0C:
+ ldr r7, [ip, #8]
+ cmp r7, r1
+ bhi _037F9F24
+ ldr r7, [ip, #12]
+ cmp r1, r7
+ bcs _037F9F24
+ ands r7, r1, #31
+ bne _037F9F24
+ ldr lr, [r1, #4]
+ cmp lr, #0
+ beq _037F9E44
+ ldr r7, [lr]
+ cmp r7, r1
+ bne _037F9F24
+_037F9E44:
+ ldr r7, [r1, #8]
+ cmp r7, #64 ; 0x40
+ bcc _037F9F24
+ ands r1, r7, #31
+ bne _037F9F24
+ add r6, r6, r7
+ cmp r6, #0
+ ble _037F9F24
+ cmp r6, r2
+ bgt _037F9F24
+ mov r1, lr
+_037F9E70:
+ cmp r1, #0
+ bne _037F9E0C
+ ldr r1, [r3, #4]
+ cmp r1, #0
+ beq _037F9F14
+ ldr r3, [r1]
+ cmp r3, #0
+ bne _037F9F24
+ b _037F9F14
+_037F9E94:
+ ldr r3, [ip, #8]
+ cmp r3, r1
+ bhi _037F9F24
+ ldr r3, [ip, #12]
+ cmp r1, r3
+ bcs _037F9F24
+ ands r3, r1, #31
+ bne _037F9F24
+ ldr lr, [r1, #4]
+ cmp lr, #0
+ beq _037F9ECC
+ ldr r3, [lr]
+ cmp r3, r1
+ bne _037F9F24
+_037F9ECC:
+ ldr r7, [r1, #8]
+ cmp r7, #64 ; 0x40
+ bcc _037F9F24
+ ands r3, r7, #31
+ bne _037F9F24
+ cmp lr, #0
+ beq _037F9EF4
+ add r1, r1, r7
+ cmp r1, lr
+ bcs _037F9F24
+_037F9EF4:
+ add r6, r6, r7
+ sub r1, r7, #32
+ add r5, r5, r1
+ cmp r6, #0
+ ble _037F9F24
+ cmp r6, r2
+ bgt _037F9F24
+ mov r1, lr
+_037F9F14:
+ cmp r1, #0
+ bne _037F9E94
+ cmp r6, r2
+ moveq r4, r5
+_037F9F24:
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_037F9F34: .word OSiHeapInfo
+
+ arm_func_start OS_CreateHeap
+OS_CreateHeap: ; 0x037F9F38
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r4, r0
+ mov r6, r1
+ mov r5, r2
+ bl OS_DisableInterrupts
+ ldr r1, _037F9FDC ; =OSiHeapInfo
+ ldr r7, [r1, r4, lsl #2]
+ add r1, r6, #31
+ bic r6, r1, #31
+ bic r5, r5, #31
+ mov r4, #0
+ ldr lr, [r7, #4]
+ mov r1, #12
+ b _037F9FC0
+_037F9F74:
+ ldr r3, [r7, #16]
+ mul r2, r4, r1
+ add ip, r3, r2
+ ldr r2, [r3, r2]
+ cmp r2, #0
+ bge _037F9FBC
+ sub r1, r5, r6
+ str r1, [ip]
+ mov r2, #0
+ str r2, [r6]
+ str r2, [r6, #4]
+ ldr r1, [ip]
+ str r1, [r6, #8]
+ str r6, [ip, #4]
+ str r2, [ip, #8]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ b _037F9FD0
+_037F9FBC:
+ add r4, r4, #1
+_037F9FC0:
+ cmp r4, lr
+ blt _037F9F74
+ bl OS_RestoreInterrupts
+ mvn r0, #0
+_037F9FD0:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_037F9FDC: .word OSiHeapInfo
+
+ arm_func_start OS_InitAlloc
+OS_InitAlloc: ; 0x037F9FE0
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r7, r0
+ mov r5, r1
+ mov r4, r2
+ mov r6, r3
+ bl OS_DisableInterrupts
+ ldr r1, _037FA084 ; =OSiHeapInfo
+ str r5, [r1, r7, lsl #2]
+ mov r2, #12
+ mul r1, r6, r2
+ add r3, r5, #20
+ str r3, [r5, #16]
+ str r6, [r5, #4]
+ mov r8, #0
+ mvn lr, #0
+ mov ip, r8
+ b _037FA044
+_037FA024:
+ ldr r6, [r5, #16]
+ mul r3, r8, r2
+ add r7, r6, r3
+ str lr, [r6, r3]
+ str ip, [r7, #8]
+ ldr r3, [r7, #8]
+ str r3, [r7, #4]
+ add r8, r8, #1
+_037FA044:
+ ldr r3, [r5, #4]
+ cmp r8, r3
+ blt _037FA024
+ mvn r2, #0
+ str r2, [r5]
+ ldr r2, [r5, #16]
+ add r1, r2, r1
+ add r1, r1, #31
+ bic r1, r1, #31
+ str r1, [r5, #8]
+ bic r1, r4, #31
+ str r1, [r5, #12]
+ bl OS_RestoreInterrupts
+ ldr r0, [r5, #8]
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_037FA084: .word OSiHeapInfo
+
+ arm_func_start OS_SetCurrentHeap
+OS_SetCurrentHeap: ; 0x037FA088
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r4, r0
+ mov r5, r1
+ bl OS_DisableInterrupts
+ ldr r1, _037FA0C0 ; =OSiHeapInfo
+ ldr r1, [r1, r4, lsl #2]
+ ldr r4, [r1]
+ str r5, [r1]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037FA0C0: .word OSiHeapInfo
+
+ arm_func_start OS_FreeToHeap
+OS_FreeToHeap: ; 0x037FA0C4
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r7, r0
+ mov r4, r1
+ mov r6, r2
+ bl OS_DisableInterrupts
+ mov r5, r0
+ ldr r0, _037FA134 ; =OSiHeapInfo
+ ldr r0, [r0, r7, lsl #2]
+ cmp r4, #0
+ ldrlt r4, [r0]
+ sub r6, r6, #32
+ ldr r1, [r0, #16]
+ mov r0, #12
+ mla r7, r4, r0, r1
+ ldr r0, [r7, #8]
+ mov r1, r6
+ bl DLExtract
+ str r0, [r7, #8]
+ ldr r0, [r7, #4]
+ mov r1, r6
+ bl DLInsert
+ str r0, [r7, #4]
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_037FA134: .word OSiHeapInfo
+
+ arm_func_start OS_AllocFromHeap
+OS_AllocFromHeap: ; 0x037FA138
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r6, r0
+ mov r5, r1
+ mov r7, r2
+ bl OS_DisableInterrupts
+ mov r4, r0
+ ldr r1, _037FA24C ; =OSiHeapInfo
+ ldr r1, [r1, r6, lsl #2]
+ cmp r1, #0
+ bne _037FA170
+ bl OS_RestoreInterrupts
+ mov r0, #0
+ b _037FA240
+_037FA170:
+ cmp r5, #0
+ ldrlt r5, [r1]
+ ldr r1, [r1, #16]
+ mov r0, #12
+ mla r6, r5, r0, r1
+ add r0, r7, #32
+ add r0, r0, #31
+ bic r7, r0, #31
+ ldr r0, [r6, #4]
+ mov r5, r0
+ b _037FA1AC
+_037FA19C:
+ ldr r1, [r5, #8]
+ cmp r7, r1
+ ble _037FA1B4
+ ldr r5, [r5, #4]
+_037FA1AC:
+ cmp r5, #0
+ bne _037FA19C
+_037FA1B4:
+ cmp r5, #0
+ bne _037FA1CC
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #0
+ b _037FA240
+_037FA1CC:
+ ldr r1, [r5, #8]
+ sub r1, r1, r7
+ cmp r1, #64 ; 0x40
+ bcs _037FA1EC
+ mov r1, r5
+ bl DLExtract
+ str r0, [r6, #4]
+ b _037FA224
+_037FA1EC:
+ str r7, [r5, #8]
+ add r2, r5, r7
+ str r1, [r2, #8]
+ ldr r0, [r5]
+ str r0, [r5, r7]
+ ldr r0, [r5, #4]
+ str r0, [r2, #4]
+ ldr r0, [r2, #4]
+ cmp r0, #0
+ strne r2, [r0]
+ ldr r0, [r2]
+ cmp r0, #0
+ strne r2, [r0, #4]
+ streq r2, [r6, #4]
+_037FA224:
+ ldr r0, [r6, #8]
+ mov r1, r5
+ bl DLAddFront
+ str r0, [r6, #8]
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add r0, r5, #32
+_037FA240:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_037FA24C: .word OSiHeapInfo
+
+ arm_func_start DLInsert
+DLInsert: ; 0x037FA250
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ mov ip, r0
+ mov lr, #0
+ b _037FA274
+_037FA264:
+ cmp r1, ip
+ bls _037FA27C
+ mov lr, ip
+ ldr ip, [ip, #4]
+_037FA274:
+ cmp ip, #0
+ bne _037FA264
+_037FA27C:
+ str ip, [r1, #4]
+ str lr, [r1]
+ cmp ip, #0
+ beq _037FA2BC
+ str r1, [ip]
+ ldr r3, [r1, #8]
+ add r2, r1, r3
+ cmp r2, ip
+ bne _037FA2BC
+ ldr r2, [ip, #8]
+ add r2, r3, r2
+ str r2, [r1, #8]
+ ldr ip, [ip, #4]
+ str ip, [r1, #4]
+ cmp ip, #0
+ strne r1, [ip]
+_037FA2BC:
+ cmp lr, #0
+ beq _037FA2F4
+ str r1, [lr, #4]
+ ldr r2, [lr, #8]
+ add r3, lr, r2
+ cmp r3, r1
+ bne _037FA2F8
+ ldr r1, [r1, #8]
+ add r1, r2, r1
+ str r1, [lr, #8]
+ str ip, [lr, #4]
+ cmp ip, #0
+ strne lr, [ip]
+ b _037FA2F8
+_037FA2F4:
+ mov r0, r1
+_037FA2F8:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start DLExtract
+DLExtract: ; 0x037FA304
+ ldr r3, [r1, #4]
+ cmp r3, #0
+ ldrne r2, [r1]
+ strne r2, [r3]
+ ldr r2, [r1]
+ cmp r2, #0
+ ldreq r0, [r1, #4]
+ ldrne r1, [r1, #4]
+ strne r1, [r2, #4]
+ bx lr
+
+ arm_func_start DLAddFront
+DLAddFront: ; 0x037FA32C
+ str r0, [r1, #4]
+ mov r2, #0
+ str r2, [r1]
+ cmp r0, #0
+ strne r1, [r0]
+ mov r0, r1
+ bx lr