alloc, tick, and timer

This commit is contained in:
red031000
2020-06-01 23:29:20 +01:00
parent 65a29a0733
commit 1fef9c4319
6 changed files with 584 additions and 567 deletions

View File

@@ -25,6 +25,9 @@ Autoload WRAM
Object OS_mutex.o
Object OS_init.o
Object OS_arena.o
Object OS_alloc.o
Object OS_timer.o
Object OS_tick.o
Object dtcm.o
Object libsyscall.o
Object dtcm2.o

427
arm7/asm/OS_alloc.s Normal file
View File

@@ -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

138
arm7/asm/OS_tick.s Normal file
View File

@@ -0,0 +1,138 @@
.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OS_GetTick
OS_GetTick: ; 0x037FA364
stmfd sp!, {lr}
sub sp, sp, #12
bl OS_DisableInterrupts
ldr r1, _037FA404 ; =0x04000100
ldrh r1, [r1]
strh r1, [sp]
ldr r1, _037FA408 ; =OSi_TickCounter
ldr ip, [r1]
ldr r3, [r1, #4]
ldr r2, _037FA40C ; =0x0000FFFF
mvn r1, #0
and r2, r3, r2
and r1, ip, r1
str r1, [sp, #4]
str r2, [sp, #8]
ldr r1, _037FA410 ; =0x04000214
ldr r1, [r1]
ands r1, r1, #8
beq _037FA3D8
ldrh r1, [sp]
ands r1, r1, #32768 ; 0x8000
bne _037FA3D8
ldr r3, [sp, #4]
ldr r2, [sp, #8]
mov r1, #1
adds r3, r3, r1
adc r1, r2, #0
str r3, [sp, #4]
str r1, [sp, #8]
_037FA3D8:
bl OS_RestoreInterrupts
ldr r2, [sp, #4]
ldr r0, [sp, #8]
mov r1, r0, lsl #16
orr r1, r1, r2, lsr #16
ldrh r0, [sp]
orr r1, r1, r0, asr #31
orr r0, r0, r2, lsl #16
add sp, sp, #12
ldmia sp!, {lr}
bx lr
_037FA404: .word 0x04000100
_037FA408: .word OSi_TickCounter
_037FA40C: .word 0x0000FFFF
_037FA410: .word 0x04000214
arm_func_start OSi_CountUpTick
OSi_CountUpTick: ; 0x037FA414
stmfd sp!, {lr}
sub sp, sp, #4
ldr r1, _037FA488 ; =OSi_TickCounter
ldr ip, [r1]
ldr r2, [r1, #4]
mov r3, #0
mov r0, #1
adds ip, ip, r0
adc r0, r2, #0
str ip, [r1]
str r0, [r1, #4]
ldr r0, _037FA48C ; =OSi_NeedResetTimer
ldr r1, [r0]
cmp r1, #0
beq _037FA46C
ldr r2, _037FA490 ; =0x04000102
strh r3, [r2]
ldr r1, _037FA494 ; =0x04000100
strh r3, [r1]
mov r1, #193 ; 0xc1
strh r1, [r2]
str r3, [r0]
_037FA46C:
mov r0, #0
ldr r1, _037FA498 ; =OSi_CountUpTick
mov r2, r0
bl OSi_EnterTimerCallback
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FA488: .word OSi_TickCounter
_037FA48C: .word OSi_NeedResetTimer
_037FA490: .word 0x04000102
_037FA494: .word 0x04000100
_037FA498: .word OSi_CountUpTick
arm_func_start OS_IsTickAvailable
OS_IsTickAvailable: ; 0x037FA49C
ldr r0, _037FA4A8 ; =_03807920
ldrh r0, [r0]
bx lr
_037FA4A8: .word _03807920
arm_func_start OS_InitTick
OS_InitTick: ; 0x037FA4AC
stmfd sp!, {lr}
sub sp, sp, #4
ldr r0, _037FA528 ; =_03807920
ldrh r1, [r0]
cmp r1, #0
bne _037FA51C
mov r1, #1
strh r1, [r0]
mov r0, #0
bl OSi_SetTimerReserved
mov r2, #0
ldr r0, _037FA52C ; =OSi_TickCounter
str r2, [r0]
str r2, [r0, #4]
ldr r1, _037FA530 ; =0x04000102
strh r2, [r1]
ldr r0, _037FA534 ; =0x04000100
strh r2, [r0]
mov r0, #193 ; 0xc1
strh r0, [r1]
mov r0, #8
ldr r1, _037FA538 ; =OSi_CountUpTick
bl OS_SetIrqFunction
mov r0, #8
bl OS_EnableIrqMask
mov r1, #0
ldr r0, _037FA53C ; =OSi_NeedResetTimer
str r1, [r0]
_037FA51C:
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FA528: .word _03807920
_037FA52C: .word OSi_TickCounter
_037FA530: .word 0x04000102
_037FA534: .word 0x04000100
_037FA538: .word OSi_CountUpTick
_037FA53C: .word OSi_NeedResetTimer

14
arm7/asm/OS_timer.s Normal file
View File

@@ -0,0 +1,14 @@
.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OSi_SetTimerReserved
OSi_SetTimerReserved: ; 0x037FA348
ldr r1, _037FA360 ; =_0380791C
ldrh r3, [r1]
mov r2, #1
orr r0, r3, r2, lsl r0
strh r0, [r1]
bx lr
_037FA360: .word _0380791C

View File

@@ -2,573 +2,6 @@
.include "global.inc"
.section .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 FUN_037FA304
str r0, [r7, #8]
ldr r0, [r7, #4]
mov r1, r6
bl FUN_037FA250
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 FUN_037FA304
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 FUN_037FA32C
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 FUN_037FA250
FUN_037FA250: ; 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 FUN_037FA304
FUN_037FA304: ; 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 FUN_037FA32C
FUN_037FA32C: ; 0x037FA32C
str r0, [r1, #4]
mov r2, #0
str r2, [r1]
cmp r0, #0
strne r1, [r0]
mov r0, r1
bx lr
arm_func_start OSi_SetTimerReserved
OSi_SetTimerReserved: ; 0x037FA348
ldr r1, _037FA360 ; =_0380791C
ldrh r3, [r1]
mov r2, #1
orr r0, r3, r2, lsl r0
strh r0, [r1]
bx lr
_037FA360: .word _0380791C
arm_func_start OS_GetTick
OS_GetTick: ; 0x037FA364
stmfd sp!, {lr}
sub sp, sp, #12
bl OS_DisableInterrupts
ldr r1, _037FA404 ; =0x04000100
ldrh r1, [r1]
strh r1, [sp]
ldr r1, _037FA408 ; =OSi_TickCounter
ldr ip, [r1]
ldr r3, [r1, #4]
ldr r2, _037FA40C ; =0x0000FFFF
mvn r1, #0
and r2, r3, r2
and r1, ip, r1
str r1, [sp, #4]
str r2, [sp, #8]
ldr r1, _037FA410 ; =0x04000214
ldr r1, [r1]
ands r1, r1, #8
beq _037FA3D8
ldrh r1, [sp]
ands r1, r1, #32768 ; 0x8000
bne _037FA3D8
ldr r3, [sp, #4]
ldr r2, [sp, #8]
mov r1, #1
adds r3, r3, r1
adc r1, r2, #0
str r3, [sp, #4]
str r1, [sp, #8]
_037FA3D8:
bl OS_RestoreInterrupts
ldr r2, [sp, #4]
ldr r0, [sp, #8]
mov r1, r0, lsl #16
orr r1, r1, r2, lsr #16
ldrh r0, [sp]
orr r1, r1, r0, asr #31
orr r0, r0, r2, lsl #16
add sp, sp, #12
ldmia sp!, {lr}
bx lr
_037FA404: .word 0x04000100
_037FA408: .word OSi_TickCounter
_037FA40C: .word 0x0000FFFF
_037FA410: .word 0x04000214
arm_func_start FUN_037FA414
FUN_037FA414: ; 0x037FA414
stmfd sp!, {lr}
sub sp, sp, #4
ldr r1, _037FA488 ; =OSi_TickCounter
ldr ip, [r1]
ldr r2, [r1, #4]
mov r3, #0
mov r0, #1
adds ip, ip, r0
adc r0, r2, #0
str ip, [r1]
str r0, [r1, #4]
ldr r0, _037FA48C ; =OSi_NeedResetTimer
ldr r1, [r0]
cmp r1, #0
beq _037FA46C
ldr r2, _037FA490 ; =0x04000102
strh r3, [r2]
ldr r1, _037FA494 ; =0x04000100
strh r3, [r1]
mov r1, #193 ; 0xc1
strh r1, [r2]
str r3, [r0]
_037FA46C:
mov r0, #0
ldr r1, _037FA498 ; =FUN_037FA414
mov r2, r0
bl OSi_EnterTimerCallback
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FA488: .word OSi_TickCounter
_037FA48C: .word OSi_NeedResetTimer
_037FA490: .word 0x04000102
_037FA494: .word 0x04000100
_037FA498: .word FUN_037FA414
arm_func_start OS_IsTickAvailable
OS_IsTickAvailable: ; 0x037FA49C
ldr r0, _037FA4A8 ; =_03807920
ldrh r0, [r0]
bx lr
_037FA4A8: .word _03807920
arm_func_start OS_InitTick
OS_InitTick: ; 0x037FA4AC
stmfd sp!, {lr}
sub sp, sp, #4
ldr r0, _037FA528 ; =_03807920
ldrh r1, [r0]
cmp r1, #0
bne _037FA51C
mov r1, #1
strh r1, [r0]
mov r0, #0
bl OSi_SetTimerReserved
mov r2, #0
ldr r0, _037FA52C ; =OSi_TickCounter
str r2, [r0]
str r2, [r0, #4]
ldr r1, _037FA530 ; =0x04000102
strh r2, [r1]
ldr r0, _037FA534 ; =0x04000100
strh r2, [r0]
mov r0, #193 ; 0xc1
strh r0, [r1]
mov r0, #8
ldr r1, _037FA538 ; =FUN_037FA414
bl OS_SetIrqFunction
mov r0, #8
bl OS_EnableIrqMask
mov r1, #0
ldr r0, _037FA53C ; =OSi_NeedResetTimer
str r1, [r0]
_037FA51C:
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FA528: .word _03807920
_037FA52C: .word OSi_TickCounter
_037FA530: .word 0x04000102
_037FA534: .word 0x04000100
_037FA538: .word FUN_037FA414
_037FA53C: .word OSi_NeedResetTimer
arm_func_start FUN_037FA540
FUN_037FA540: ; 0x037FA540
stmdb sp!, {r0, lr}

View File

@@ -26,6 +26,7 @@
.extern OSi_IrqDma1
.extern OSi_IrqDma0
.extern OSi_RemoveMutexLinkFromQueue
.extern OSi_SetTimerReserved
.extern OSi_UnlockAllMutex
.extern OS_IrqDummy
.extern OS_CheckHeap
@@ -47,6 +48,7 @@
.extern OS_InitReset
.extern OS_InitThread
.extern OS_IsResetOccurred
.extern OS_IsTickAvailable
.extern OS_LoadContext
.extern OS_ResetRequestIrqMask
.extern OS_ResetSystem