diff options
Diffstat (limited to 'arm7/asm/OS_alloc.s')
-rw-r--r-- | arm7/asm/OS_alloc.s | 427 |
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 |