Files
pokediamond/arm7/asm/OS_alloc.s
2020-06-01 23:29:20 +01:00

428 lines
6.8 KiB
ArmAsm

.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