diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-02 14:58:16 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-02 14:58:16 -0400 |
commit | da886eccda180fa10389a8299c1f99ea31ebdb9b (patch) | |
tree | 3f80e883b8b0f27dcb235bf0c63eeff3faa36222 | |
parent | 38571ea575fe718f764803afe917ad973f0e2230 (diff) | |
parent | 176340dc54ddb0819390d492dbb88811e2dc5827 (diff) |
Merge branch 'master' of github.com:martmists/pokediamond into pikalax_work
-rw-r--r-- | arm7/Makefile | 48 | ||||
-rw-r--r-- | arm7/arm7.lsf | 14 | ||||
-rw-r--r-- | arm7/asm/OS_alloc.s | 427 | ||||
-rw-r--r-- | arm7/asm/OS_arena.s | 149 | ||||
-rw-r--r-- | arm7/asm/OS_context.s | 65 | ||||
-rw-r--r-- | arm7/asm/OS_interrupt.s | 155 | ||||
-rw-r--r-- | arm7/asm/OS_irqHandler.s | 111 | ||||
-rw-r--r-- | arm7/asm/OS_irqTable.s | 132 | ||||
-rw-r--r-- | arm7/asm/OS_message.s | 147 | ||||
-rw-r--r-- | arm7/asm/OS_mutex.s | 131 | ||||
-rw-r--r-- | arm7/asm/OS_spinLock.s | 272 | ||||
-rw-r--r-- | arm7/asm/OS_thread.s | 767 | ||||
-rw-r--r-- | arm7/asm/OS_tick.s | 138 | ||||
-rw-r--r-- | arm7/asm/OS_timer.s | 14 | ||||
-rw-r--r-- | arm7/asm/dtcm.s | 2862 | ||||
-rw-r--r-- | arm7/asm/main.s | 391 | ||||
-rw-r--r-- | arm7/global.inc | 37 | ||||
-rw-r--r-- | arm7/lib/include/OS_init.h | 6 | ||||
-rw-r--r-- | arm7/lib/src/OS_init.c | 25 |
19 files changed, 3019 insertions, 2872 deletions
diff --git a/arm7/Makefile b/arm7/Makefile index 08f8d64c..d898e7bd 100644 --- a/arm7/Makefile +++ b/arm7/Makefile @@ -46,15 +46,21 @@ LD_SPEC := $(TARGET).lsf LD_TEMPLATE := ARM7-TS.lcf.template # Directories containing source files -SRC_DIRS := src +SRC_DIRS := src lib lib/src ASM_DIRS := asm data files C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) S_FILES := $(foreach dir,$(ASM_DIRS),$(wildcard $(dir)/*.s)) +C_OBJS = $(C_FILES:%.c=$(BUILD_DIR)/%.o) +S_OBJS = $(S_FILES:%.s=$(BUILD_DIR)/%.o) + # Object files -O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \ - $(foreach file,$(S_FILES),$(BUILD_DIR)/$(file:.s=.o)) \ +O_FILES := $(C_OBJS) $(S_OBJS) + +.SECONDARY: +.DELETE_ON_ERROR: +.SECONDEXPANSION: ##################### Compiler Options ####################### @@ -83,7 +89,7 @@ OBJCOPY := $(CROSS)objcopy # ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm7_thumb.s -o arm7.o ASFLAGS = -proc arm4t -i .. -CFLAGS = -O4,p -proc v4t -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir ../arm9/lib/include -W all # temporary fix while arm7 libos hasn't been decomped +CFLAGS = -O4,p -proc arm7tdmi -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir lib/include -interworking -DFS_IMPLEMENT -enum int -W all LDFLAGS = -map -nodead -w off -proc v4t -interworking -map -symtab -m _start ####################### Other Tools ######################### @@ -92,6 +98,7 @@ LDFLAGS = -map -nodead -w off -proc v4t -interworking -map -symtab -m _start SHA1SUM = sha1sum JSONPROC = $(TOOLS_DIR)/jsonproc/jsonproc GFX = $(TOOLS_DIR)/nitrogfx/nitrogfx +SCANINC = $(TOOLS_DIR)/scaninc/scaninc$(EXE) MWASMARM_PATCHER = $(TOOLS_DIR)/mwasmarm_patcher/mwasmarm_patcher$(EXE) -q TOOLDIRS = $(filter-out $(TOOLS_DIR)/mwccarm $(TOOLS_DIR)/bin,$(wildcard $(TOOLS_DIR)/*)) @@ -99,6 +106,7 @@ TOOLBASE = $(TOOLDIRS:$(TOOLS_DIR)/%=%) TOOLS = $(foreach tool,$(TOOLBASE),$(TOOLS_DIR)/$(tool)/$(tool)$(EXE)) export LM_LICENSE_FILE := $(TOOLS_DIR)/mwccarm/license.dat +export MWCIncludes := lib/include ######################### Targets ########################### @@ -112,6 +120,7 @@ else NODEP := 1 endif +.PRECIOUS: $(ROM) .PHONY: all clean mostlyclean tidy tools $(TOOLDIRS) patch_mwasmarm MAKEFLAGS += --no-print-directory @@ -142,17 +151,31 @@ patch_mwasmarm: ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(ASM_DIRS)) -$(BUILD_DIR)/%.o: %.c +######################## Special Rules ######################## + +# TODO: Move out to lib/Makefile +build/lib/src/%.o: MWCCVERSION = 1.2/sp2p3 + +####################### Everything Else ###################### + +ifeq (,$(NODEP)) +$(BUILD_DIR)/%.o: dep = $(shell $(SCANINC) -I ../include -I ../include-mw -I lib/include $(filter $*.c,$(C_FILES)) $(filter $*.s,$(S_FILES))) +else +$(BUILD_DIR)/%.o: dep := +endif + +$(C_OBJS): $(BUILD_DIR)/%.o: %.c $$(dep) $(CC) -c $(CFLAGS) -o $@ $< -$(BUILD_DIR)/%.o: %.s - $(AS) $(ASFLAGS) $< -o $@ +$(S_OBJS): $(BUILD_DIR)/%.o: %.s $$(dep) + $(AS) $(ASFLAGS) -o $@ $< $(BUILD_DIR)/$(LD_SCRIPT): $(LD_SPEC) $(LD_TEMPLATE) $(MAKELSF) $< $(LD_TEMPLATE) $@ -$(ROM): $(O_FILES) $(BUILD_DIR)/$(LD_SCRIPT) - $(LD) $(LDFLAGS) $(BUILD_DIR)/$(LD_SCRIPT) -o $(ELF) $(O_FILES) +$(ROM): $(O_FILES) $(BUILD_DIR)/$(LD_SCRIPT) $(BIN_FILES) + $(LD) $(LDFLAGS) $(BUILD_DIR)/$(LD_SCRIPT) -o $(ELF) $(O_FILES) $(BIN_FILES) + $(OBJCOPY) --update-section arm7=$@ -j arm7 $(foreach ov,$(OVERLAYS),--update-section $(ov)=$(BUILD_DIR)/$(ov).sbin -j $(ov)) $(ELF) 2>/dev/null # Make sure build directory exists before compiling anything DUMMY != mkdir -p $(ALL_DIRS) @@ -172,7 +195,12 @@ DUMMY != mkdir -p $(ALL_DIRS) %.png: ; %.pal: ; -$(BUILD_DIR)/data/icon.o: graphics/icon.4bpp graphics/icon.gbapal +# Included files +baserom.%: ; +%.h: ; +%.inc: ; + +$(BIN_FILES): ; ### Debug Print ### diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index 9ab7cc9a..e047081a 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -14,6 +14,20 @@ Autoload MAIN Autoload WRAM { Address 0x037F8000 + Object main.o + Object OS_irqHandler.o + Object OS_irqTable.o + Object OS_interrupt.o + Object OS_spinLock.o + Object OS_thread.o + Object OS_context.o + Object OS_message.o + 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 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 diff --git a/arm7/asm/OS_arena.s b/arm7/asm/OS_arena.s new file mode 100644 index 00000000..3b444cdd --- /dev/null +++ b/arm7/asm/OS_arena.s @@ -0,0 +1,149 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_SetArenaLo +OS_SetArenaLo: ; 0x037F9BBC + mov r0, r0, lsl #2 + add r0, r0, #40894464 ; 0x2700000 + add r0, r0, #1044480 ; 0xff000 + str r1, [r0, #3488] ; 0xda0 + bx lr + + arm_func_start OS_SetArenaHi +OS_SetArenaHi: ; 0x037F9BD0 + mov r0, r0, lsl #2 + add r0, r0, #40894464 ; 0x2700000 + add r0, r0, #1044480 ; 0xff000 + str r1, [r0, #3524] ; 0xdc4 + bx lr + + arm_func_start OS_GetInitArenaLo +OS_GetInitArenaLo: ; 0x037F9BE4 + cmp r0, #1 + beq _037F9C00 + cmp r0, #7 + beq _037F9C08 + cmp r0, #8 + beq _037F9C18 + b _037F9C2C +_037F9C00: + ldr r0, _037F9C34 ; =0x027FAFCC + bx lr +_037F9C08: + ldr r0, _037F9C38 ; =0x0380B92C + cmp r0, #58720256 ; 0x03800000 + movhi r0, #58720256 ; 0x03800000 + bx lr +_037F9C18: + mov r0, #58720256 ; 0x03800000 + ldr r1, _037F9C38 ; =0x0380B92C + cmp r1, #58720256 ; 0x03800000 + movhi r0, r1 + bx lr +_037F9C2C: + mov r0, #0 + bx lr +_037F9C34: .word 0x027FAFCC +_037F9C38: .word 0x0380B92C + + arm_func_start OS_GetInitArenaHi +OS_GetInitArenaHi: ; 0x037F9C3C + cmp r0, #1 + beq _037F9C58 + cmp r0, #7 + beq _037F9C60 + cmp r0, #8 + beq _037F9C68 + b _037F9CA0 +_037F9C58: + ldr r0, _037F9CA8 ; =0x027FF000 + bx lr +_037F9C60: + mov r0, #58720256 ; 0x03800000 + bx lr +_037F9C68: + ldr r1, _037F9CAC ; =0x00000400 + ldr r0, _037F9CB0 ; =0x0380FF80 + sub r2, r0, r1 + mov r0, #58720256 ; 0x03800000 + ldr r1, _037F9CB4 ; =0x0380B92C + cmp r1, #58720256 ; 0x03800000 + movhi r0, r1 + ldr r1, _037F9CB8 ; =0x00000400 + cmp r1, #0 + bxeq lr + cmp r1, #0 + sublt r0, r0, r1 + subge r0, r2, r1 + bx lr +_037F9CA0: + mov r0, #0 + bx lr +_037F9CA8: .word 0x027FF000 +_037F9CAC: .word 0x00000400 +_037F9CB0: .word 0x0380FF80 +_037F9CB4: .word 0x0380B92C +_037F9CB8: .word 0x00000400 + + arm_func_start OS_GetArenaLo +OS_GetArenaLo: ; 0x037F9CBC + mov r0, r0, lsl #2 + add r0, r0, #40894464 ; 0x2700000 + add r0, r0, #1044480 ; 0xff000 + ldr r0, [r0, #3488] ; 0xda0 + bx lr + + arm_func_start OS_GetArenaHi +OS_GetArenaHi: ; 0x037F9CD0 + mov r0, r0, lsl #2 + add r0, r0, #40894464 ; 0x2700000 + add r0, r0, #1044480 ; 0xff000 + ldr r0, [r0, #3524] ; 0xdc4 + bx lr + + arm_func_start OS_InitArena +OS_InitArena: ; 0x037F9CE4 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037F9D84 ; =_038078F4 + ldr r0, [r1] + cmp r0, #0 + bne _037F9D78 + mov r0, #1 + str r0, [r1] + bl OS_GetInitArenaHi + mov r1, r0 + mov r0, #1 + bl OS_SetArenaHi + mov r0, #1 + bl OS_GetInitArenaLo + mov r1, r0 + mov r0, #1 + bl OS_SetArenaLo + mov r0, #7 + bl OS_GetInitArenaHi + mov r1, r0 + mov r0, #7 + bl OS_SetArenaHi + mov r0, #7 + bl OS_GetInitArenaLo + mov r1, r0 + mov r0, #7 + bl OS_SetArenaLo + mov r0, #8 + bl OS_GetInitArenaHi + mov r1, r0 + mov r0, #8 + bl OS_SetArenaHi + mov r0, #8 + bl OS_GetInitArenaLo + mov r1, r0 + mov r0, #8 + bl OS_SetArenaLo +_037F9D78: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F9D84: .word _038078F4 diff --git a/arm7/asm/OS_context.s b/arm7/asm/OS_context.s new file mode 100644 index 00000000..21479b1f --- /dev/null +++ b/arm7/asm/OS_context.s @@ -0,0 +1,65 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_InitContext +OS_InitContext: ; 0x037F9740 + add r1, r1, #4 + str r1, [r0, #64] ; 0x40 + str r2, [r0, #68] ; 0x44 + sub r2, r2, #64 ; 0x40 + tst r2, #4 + subne r2, r2, #4 + str r2, [r0, #56] ; 0x38 + ands r1, r1, #1 + movne r1, #63 ; 0x3f + moveq r1, #31 + str r1, [r0] + mov r1, #0 + str r1, [r0, #4] + str r1, [r0, #8] + str r1, [r0, #12] + str r1, [r0, #16] + str r1, [r0, #20] + str r1, [r0, #24] + str r1, [r0, #28] + str r1, [r0, #32] + str r1, [r0, #36] ; 0x24 + str r1, [r0, #40] ; 0x28 + str r1, [r0, #44] ; 0x2c + str r1, [r0, #48] ; 0x30 + str r1, [r0, #52] ; 0x34 + str r1, [r0, #60] ; 0x3c + bx lr + + arm_func_start OS_SaveContext +OS_SaveContext: ; 0x037F97AC + add r1, r0, #0 + mrs r2, CPSR + str r2, [r1], #4 + mov r0, #211 ; 0xd3 + msr CPSR_c, r0 + str sp, [r1, #64] ; 0x40 + msr CPSR_c, r2 + mov r0, #1 + stmia r1, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr} + adr r0, _037F97E0 + str r0, [r1, #60] ; 0x3c + mov r0, #0 + bx lr + + arm_func_start OS_LoadContext +OS_LoadContext: ; 0x037F97E0 +_037F97E0: ; needed because otherwise it breaks + mrs r1, CPSR + bic r1, r1, #31 + orr r1, r1, #211 ; 0xd3 + msr CPSR_c, r1 + ldr r1, [r0], #4 + msr SPSR_fsxc, r1 + ldr sp, [r0, #64] ; 0x40 + ldr lr, [r0, #60] ; 0x3c + ldmia r0, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ + nop ; (mov r0, r0) + subs pc, lr, #4 diff --git a/arm7/asm/OS_interrupt.s b/arm7/asm/OS_interrupt.s new file mode 100644 index 00000000..48fc9d1b --- /dev/null +++ b/arm7/asm/OS_interrupt.s @@ -0,0 +1,155 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_ResetRequestIrqMask +OS_ResetRequestIrqMask: ; 0x037F8824 + ldr ip, _037F8850 ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F8854 ; =0x04000214 + ldr r1, [r2] + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F8850: .word 0x04000208 +_037F8854: .word 0x04000214 + + arm_func_start OS_DisableIrqMask +OS_DisableIrqMask: ; 0x037F8858 + ldr ip, _037F888C ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F8890 ; =0x04000210 + ldr r1, [r2] + mvn r0, r0 + and r0, r1, r0 + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F888C: .word 0x04000208 +_037F8890: .word 0x04000210 + + arm_func_start OS_EnableIrqMask +OS_EnableIrqMask: ; 0x037F8894 + ldr ip, _037F88C4 ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F88C8 ; =0x04000210 + ldr r1, [r2] + orr r0, r1, r0 + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F88C4: .word 0x04000208 +_037F88C8: .word 0x04000210 + + arm_func_start OS_SetIrqMask +OS_SetIrqMask: ; 0x037F88CC + ldr ip, _037F88F8 ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F88FC ; =0x04000210 + ldr r1, [r2] + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F88F8: .word 0x04000208 +_037F88FC: .word 0x04000210 + + arm_func_start OSi_EnterTimerCallback +OSi_EnterTimerCallback: ; 0x037F8900 + stmdb sp!, {r4, lr} + mov r3, #12 + mul r4, r0, r3 + ldr r3, _037F8940 ; =_03807744 + str r1, [r3, r4] + ldr r1, _037F8944 ; =_0380774C + str r2, [r1, r4] + mov r1, #1 + add r0, r0, #3 + mov r0, r1, lsl r0 + bl OS_EnableIrqMask + mov r1, #1 + ldr r0, _037F8948 ; =_03807748 + str r1, [r0, r4] + ldmia sp!, {r4, lr} + bx lr +_037F8940: .word _03807744 +_037F8944: .word _0380774C +_037F8948: .word _03807748 + + arm_func_start OS_SetIrqFunction +OS_SetIrqFunction: ; 0x037F894C + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r9, #0 + mov r7, r9 + ldr lr, _037F89E8 ; =OS_IRQTable + ldr r4, _037F89EC ; =_03807774 + ldr r6, _037F89F0 ; =OSi_IrqCallbackInfo + mov ip, r9 + mov r3, #1 + mov r2, #12 +_037F8974: + ands r5, r0, #1 + beq _037F89CC + mov r8, r7 + cmp r9, #8 + blt _037F8998 + cmp r9, #11 + suble r5, r9, #8 + mlale r8, r5, r2, r6 + ble _037F89BC +_037F8998: + cmp r9, #3 + blt _037F89B0 + cmp r9, #6 + addle r5, r9, #1 + mlale r8, r5, r2, r6 + ble _037F89BC +_037F89B0: + cmp r9, #0 + moveq r8, r4 + strne r1, [lr, r9, lsl #2] +_037F89BC: + cmp r8, #0 + strne r1, [r8] + strne ip, [r8, #8] + strne r3, [r8, #4] +_037F89CC: + mov r0, r0, lsr #1 + add r9, r9, #1 + cmp r9, #25 + blt _037F8974 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr +_037F89E8: .word OS_IRQTable +_037F89EC: .word _03807774 +_037F89F0: .word OSi_IrqCallbackInfo + + arm_func_start OS_InitIrqTable +OS_InitIrqTable: ; 0x037F89F4 + mov r1, #0 + ldr r0, _037F8A10 ; =OSi_IrqThreadQueue + str r1, [r0, #4] + str r1, [r0] + ldr r0, _037F8A14 ; =0x027FFC3C + str r1, [r0] + bx lr +_037F8A10: .word OSi_IrqThreadQueue +_037F8A14: .word 0x027FFC3C diff --git a/arm7/asm/OS_irqHandler.s b/arm7/asm/OS_irqHandler.s new file mode 100644 index 00000000..ed96fdae --- /dev/null +++ b/arm7/asm/OS_irqHandler.s @@ -0,0 +1,111 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_IrqHandler +OS_IrqHandler: ; 0x037F853C + stmfd sp!, {lr} + mov ip, #67108864 ; 0x4000000 + add ip, ip, #528 ; 0x210 + ldr r1, [ip, #-8] + cmp r1, #0 + ldmeqfd sp!, {pc} + ldmia ip, {r1, r2} + ands r1, r1, r2 + ldmeqfd sp!, {pc} + mov r3, #1 + mov r0, #0 +_037F8568: + ands r2, r1, r3, lsl r0 + addeq r0, r0, #1 + beq _037F8568 + str r2, [ip, #4] + ldr r1, _037F8588 ; =OS_IRQTable + ldr r0, [r1, r0, lsl #2] + ldr lr, _037F858C ; =OS_IrqHandler_ThreadSwitch + bx r0 +_037F8588: .word OS_IRQTable +_037F858C: .word OS_IrqHandler_ThreadSwitch + + arm_func_start OS_IrqHandler_ThreadSwitch +OS_IrqHandler_ThreadSwitch: + ldr ip, _037F86AC ; =OSi_IrqThreadQueue + mov r3, #0 + ldr ip, [ip] + mov r2, #1 + cmp ip, #0 + beq _037F85E0 +_037F85A8: + str r2, [ip, #72] ; 0x48 + str r3, [ip, #92] ; 0x5c + str r3, [ip, #96] ; 0x60 + ldr r0, [ip, #100] ; 0x64 + str r3, [ip, #100] ; 0x64 + mov ip, r0 + cmp ip, #0 + bne _037F85A8 + ldr ip, _037F86AC ; =OSi_IrqThreadQueue + str r3, [ip] + str r3, [ip, #4] + ldr ip, _037F86B0 ; =OSi_ThreadInfo + mov r1, #1 + strh r1, [ip] +_037F85E0: + ldr ip, _037F86B0 ; =OSi_ThreadInfo + ldrh r1, [ip] + cmp r1, #0 + ldreq pc, [sp], #4 ; (ldreq pc, [sp], #4) + mov r1, #0 + strh r1, [ip] + mov r3, #210 ; 0xd2 + msr CPSR_c, r3 + add r2, ip, #8 + ldr r1, [r2] +_037F8608: + cmp r1, #0 + ldrneh r0, [r1, #72] ; 0x48 + cmpne r0, #1 + ldrne r1, [r1, #76] ; 0x4c + bne _037F8608 + cmp r1, #0 + bne _037F8630 +_037F8624: + mov r3, #146 ; 0x92 + msr CPSR_c, r3 + ldr pc, [sp], #4 +_037F8630: + ldr r0, [ip, #4] + cmp r1, r0 + beq _037F8624 + ldr r3, [ip, #12] + cmp r3, #0 + beq _037F8658 + stmdb sp!, {r0, r1, ip} + mov lr, pc + bx r3 + ldmia sp!, {r0, r1, ip} +_037F8658: + str r1, [ip, #4] + mrs r2, SPSR + str r2, [r0, #0]! + ldmib sp!, {r2, r3} + stmib r0!, {r2, r3} + ldmib sp!, {r2, r3, ip, lr} + stmib r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ + stmib r0!, {lr} + mov r3, #211 ; 0xd3 + msr CPSR_c, r3 + stmib r0!, {sp} + ldr sp, [r1, #68] ; 0x44 + mov r3, #210 ; 0xd2 + msr CPSR_c, r3 + ldr r2, [r1, #0]! + msr SPSR_fc, r2 + ldr lr, [r1, #64] ; 0x40 + ldmib r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ + nop ; (mov r0, r0) + stmda sp!, {r0, r1, r2, r3, ip, lr} + ldmia sp!, {pc} +_037F86AC: .word OSi_IrqThreadQueue +_037F86B0: .word OSi_ThreadInfo diff --git a/arm7/asm/OS_irqTable.s b/arm7/asm/OS_irqTable.s new file mode 100644 index 00000000..56eea302 --- /dev/null +++ b/arm7/asm/OS_irqTable.s @@ -0,0 +1,132 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OSi_IrqVBlank +OSi_IrqVBlank: ; 0x037F86B4 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037F8700 ; =OSi_IrqCallbackInfo + ldr r2, [r0, #96] ; 0x60 + ldr r1, _037F8704 ; =0x027FFC3C + ldr r0, [r1] + add r0, r0, #1 + str r0, [r1] + cmp r2, #0 + beq _037F86E4 + mov lr, pc + bx r2 +_037F86E4: + ldr r1, _037F8708 ; =0x0380FFF8 + ldr r0, [r1] + orr r0, r0, #1 + str r0, [r1] + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F8700: .word OSi_IrqCallbackInfo +_037F8704: .word 0x027FFC3C +_037F8708: .word 0x0380FFF8 + + arm_func_start OSi_IrqTimer3 +OSi_IrqTimer3: ; 0x037F870C + mov r0, #7 + ldr ip, _037F8718 ; =OSi_IrqCallback + bx ip +_037F8718: .word OSi_IrqCallback + + arm_func_start OSi_IrqTimer2 +OSi_IrqTimer2: ; 0x037F871C + mov r0, #6 + ldr ip, _037F8728 ; =OSi_IrqCallback + bx ip +_037F8728: .word OSi_IrqCallback + + arm_func_start OSi_IrqTimer1 +OSi_IrqTimer1: ; 0x037F872C + mov r0, #5 + ldr ip, _037F8738 ; =OSi_IrqCallback + bx ip +_037F8738: .word OSi_IrqCallback + + arm_func_start OSi_IrqTimer0 +OSi_IrqTimer0: ; 0x037F873C + mov r0, #4 + ldr ip, _037F8748 ; =OSi_IrqCallback + bx ip +_037F8748: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma3 +OSi_IrqDma3: ; 0x037F874C + mov r0, #3 + ldr ip, _037F8758 ; =OSi_IrqCallback + bx ip +_037F8758: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma2 +OSi_IrqDma2: ; 0x037F875C + mov r0, #2 + ldr ip, _037F8768 ; =OSi_IrqCallback + bx ip +_037F8768: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma1 +OSi_IrqDma1: ; 0x037F876C + mov r0, #1 + ldr ip, _037F8778 ; =OSi_IrqCallback + bx ip +_037F8778: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma0 +OSi_IrqDma0: ; 0x037F877C + mov r0, #0 + ldr ip, _037F8788 ; =OSi_IrqCallback + bx ip +_037F8788: .word OSi_IrqCallback + + arm_func_start OSi_IrqCallback +OSi_IrqCallback: ; 0x037F878C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r3, #1 + mov r2, r0, lsl #1 + ldr r1, _037F880C ; =_038075E4 + ldrh r1, [r1, r2] + mov r5, r3, lsl r1 + mov r1, #12 + mul r4, r0, r1 + ldr r2, _037F8810 ; =OSi_IrqCallbackInfo + ldr r1, [r2, r4] + mov r0, #0 + str r0, [r2, r4] + cmp r1, #0 + beq _037F87D8 + ldr r0, _037F8814 ; =_0380771C + ldr r0, [r0, r4] + mov lr, pc + bx r1 +_037F87D8: + ldr r1, _037F8818 ; =0x0380FFF8 + ldr r0, [r1] + orr r0, r0, r5 + str r0, [r1] + ldr r0, _037F881C ; =_03807718 + ldr r0, [r0, r4] + cmp r0, #0 + bne _037F8800 + mov r0, r5 + bl OS_DisableIrqMask +_037F8800: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F880C: .word _038075E4 +_037F8810: .word OSi_IrqCallbackInfo +_037F8814: .word _0380771C +_037F8818: .word 0x0380FFF8 +_037F881C: .word _03807718 + + arm_func_start OS_IrqDummy +OS_IrqDummy: ; 0x037F8820 + bx lr diff --git a/arm7/asm/OS_message.s b/arm7/asm/OS_message.s new file mode 100644 index 00000000..ade175de --- /dev/null +++ b/arm7/asm/OS_message.s @@ -0,0 +1,147 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_ReadMessage +OS_ReadMessage: ; 0x037F980C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + mov r5, r1 + mov r7, r2 + bl OS_DisableInterrupts + mov r4, r0 + and r8, r7, #1 + add r7, r6, #8 + b _037F9850 +_037F9830: + cmp r8, #0 + bne _037F9848 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + b _037F987C +_037F9848: + mov r0, r7 + bl OS_SleepThread +_037F9850: + ldr r0, [r6, #28] + cmp r0, #0 + beq _037F9830 + cmp r5, #0 + ldrne r1, [r6, #16] + ldrne r0, [r6, #24] + ldrne r0, [r1, r0, lsl #2] + strne r0, [r5] + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 +_037F987C: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + + arm_func_start OS_ReceiveMessage +OS_ReceiveMessage: ; 0x037F9884 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + mov r5, r1 + mov r7, r2 + bl OS_DisableInterrupts + mov r4, r0 + and r8, r7, #1 + add r7, r6, #8 + b _037F98C8 +_037F98A8: + cmp r8, #0 + bne _037F98C0 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + b _037F991C +_037F98C0: + mov r0, r7 + bl OS_SleepThread +_037F98C8: + ldr r0, [r6, #28] + cmp r0, #0 + beq _037F98A8 + cmp r5, #0 + ldrne r1, [r6, #16] + ldrne r0, [r6, #24] + ldrne r0, [r1, r0, lsl #2] + strne r0, [r5] + ldr r0, [r6, #24] + add r0, r0, #1 + ldr r1, [r6, #20] + bl _s32_div_f + str r1, [r6, #24] + ldr r0, [r6, #28] + sub r0, r0, #1 + str r0, [r6, #28] + mov r0, r6 + bl OS_WakeupThread + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 +_037F991C: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + + arm_func_start OS_SendMessage +OS_SendMessage: ; 0x037F9924 + 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 + and r7, r7, #1 + b _037F9968 +_037F9948: + cmp r7, #0 + bne _037F9960 + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + b _037F99AC +_037F9960: + mov r0, r6 + bl OS_SleepThread +_037F9968: + ldr r2, [r6, #28] + ldr r1, [r6, #20] + cmp r1, r2 + ble _037F9948 + ldr r0, [r6, #24] + add r0, r0, r2 + bl _s32_div_f + ldr r0, [r6, #16] + str r5, [r0, r1, lsl #2] + ldr r0, [r6, #28] + add r0, r0, #1 + str r0, [r6, #28] + add r0, r6, #8 + bl OS_WakeupThread + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 +_037F99AC: + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + + arm_func_start OS_InitMessageQueue +OS_InitMessageQueue: ; 0x037F99B8 + mov ip, #0 + str ip, [r0, #4] + ldr r3, [r0, #4] + str r3, [r0] + str ip, [r0, #12] + ldr r3, [r0, #12] + str r3, [r0, #8] + str r1, [r0, #16] + str r2, [r0, #20] + str ip, [r0, #24] + str ip, [r0, #28] + bx lr diff --git a/arm7/asm/OS_mutex.s b/arm7/asm/OS_mutex.s new file mode 100644 index 00000000..981842b8 --- /dev/null +++ b/arm7/asm/OS_mutex.s @@ -0,0 +1,131 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OSi_DequeueItem +OSi_DequeueItem: ; 0x037F99E8 + ldr r2, [r1, #16] + ldr r1, [r1, #20] + cmp r2, #0 + streq r1, [r0, #112] ; 0x70 + strne r1, [r2, #20] + cmp r1, #0 + streq r2, [r0, #108] ; 0x6c + strne r2, [r1, #16] + bx lr + + arm_func_start OSi_EnqueueTail +OSi_EnqueueTail: ; 0x037F9A0C + ldr r2, [r0, #112] ; 0x70 + cmp r2, #0 + streq r1, [r0, #108] ; 0x6c + strne r1, [r2, #16] + str r2, [r1, #20] + mov r2, #0 + str r2, [r1, #16] + str r1, [r0, #112] ; 0x70 + bx lr + + arm_func_start OSi_UnlockAllMutex +OSi_UnlockAllMutex: ; 0x037F9A30 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + add r5, r6, #108 ; 0x6c + mov r4, #0 + b _037F9A58 +_037F9A44: + mov r0, r5 + bl OSi_RemoveMutexLinkFromQueue + str r4, [r0, #12] + str r4, [r0, #8] + bl OS_WakeupThread +_037F9A58: + ldr r0, [r6, #108] ; 0x6c + cmp r0, #0 + bne _037F9A44 + ldmia sp!, {r4, r5, r6, lr} + bx lr + + arm_func_start OS_UnlockMutex +OS_UnlockMutex: ; 0x037F9A6C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _037F9AD8 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + ldr r1, [r5, #8] + cmp r1, r0 + bne _037F9AC4 + ldr r1, [r5, #12] + sub r1, r1, #1 + str r1, [r5, #12] + ldr r1, [r5, #12] + cmp r1, #0 + bne _037F9AC4 + mov r1, r5 + bl OSi_DequeueItem + mov r0, #0 + str r0, [r5, #8] + mov r0, r5 + bl OS_WakeupThread +_037F9AC4: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F9AD8: .word OSi_ThreadInfo + + arm_func_start OS_LockMutex +OS_LockMutex: ; 0x037F9ADC + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, _037F9B64 ; =OSi_ThreadInfo + ldr r7, [r0, #4] + mov r6, #0 +_037F9AFC: + ldr r0, [r5, #8] + cmp r0, #0 + bne _037F9B28 + str r7, [r5, #8] + ldr r0, [r5, #12] + add r0, r0, #1 + str r0, [r5, #12] + mov r0, r7 + mov r1, r5 + bl OSi_EnqueueTail + b _037F9B50 +_037F9B28: + cmp r0, r7 + ldreq r0, [r5, #12] + addeq r0, r0, #1 + streq r0, [r5, #12] + beq _037F9B50 + str r5, [r7, #104] ; 0x68 + mov r0, r5 + bl OS_SleepThread + str r6, [r7, #104] ; 0x68 + b _037F9AFC +_037F9B50: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_037F9B64: .word OSi_ThreadInfo + + arm_func_start OS_InitMutex +OS_InitMutex: ; 0x037F9B68 + mov r2, #0 + str r2, [r0, #4] + ldr r1, [r0, #4] + str r1, [r0] + str r2, [r0, #8] + str r2, [r0, #12] + bx lr diff --git a/arm7/asm/OS_spinLock.s b/arm7/asm/OS_spinLock.s new file mode 100644 index 00000000..04f4683b --- /dev/null +++ b/arm7/asm/OS_spinLock.s @@ -0,0 +1,272 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_UnLockCartridge +OS_UnLockCartridge: ; 0x037F8A18 + ldr r1, _037F8A20 ; =OS_UnlockCartridge + bx r1 +_037F8A20: .word OS_UnlockCartridge + + arm_func_start OS_GetLockID +OS_GetLockID: ; 0x037F8A24 + ldr r3, _037F8AB4 ; =0x027FFFB8 + ldr r1, [r3] + mov r2, #0 + mov r0, #-2147483648 ; 0x80000000 +_037F8A34: + tst r1, r0 + bne _037F8A50 + add r2, r2, #1 + cmp r2, #32 + beq _037F8A50 + mov r0, r0, lsr #1 + b _037F8A34 +_037F8A50: + cmp r2, #32 + movne r0, #128 ; 0x80 + bne _037F8A98 + add r3, r3, #4 + ldr r1, [r3] + mov r2, #0 + mov r0, #-2147483648 ; 0x80000000 +_037F8A6C: + tst r1, r0 + bne _037F8A88 + add r2, r2, #1 + cmp r2, #32 + beq _037F8A88 + mov r0, r0, lsr #1 + b _037F8A6C +_037F8A88: + cmp r2, #32 + ldr r0, _037F8AB8 ; =0xFFFFFFFD + bxeq lr + mov r0, #160 ; 0xa0 +_037F8A98: + add r0, r0, r2 + mov r1, #-2147483648 ; 0x80000000 + mov r1, r1, lsr r2 + ldr r2, [r3] + bic r2, r2, r1 + str r2, [r3] + bx lr +_037F8AB4: .word 0x027FFFB8 +_037F8AB8: .word 0xFFFFFFFD + + arm_func_start OS_ReleaseLockID +OS_ReleaseLockID: ; 0x037F8ABC + ldr r3, _037F8AE8 ; =0x027FFFB8 + cmp r0, #160 ; 0xa0 + addpl r3, r3, #4 + subpl r0, r0, #160 ; 0xa0 + submi r0, r0, #128 ; 0x80 + mov r1, #-2147483648 ; 0x80000000 + mov r1, r1, lsr r0 + ldr r2, [r3] + orr r2, r2, r1 + str r2, [r3] + bx lr +_037F8AE8: .word 0x027FFFB8 + + arm_func_start OS_ReadOwnerOfLockWord +OS_ReadOwnerOfLockWord: ; 0x037F8AEC + ldrh r0, [r0, #4] + bx lr + + arm_func_start OSi_FreeCartridgeBus +OSi_FreeCartridgeBus: ;0x037F8AF4 + bx lr + + arm_func_start OSi_AllocateCartridgeBus +OSi_AllocateCartridgeBus: ;0x037F8AF8 + bx lr + + arm_func_start OS_TryLockCartridge +OS_TryLockCartridge: ; 0x037F8AFC + ldr r1, _037F8B10 ; =0x027FFFE8 + ldr r2, _037F8B14 ; =OSi_AllocateCartridgeBus + mov r3, #1 + ldr ip, _037F8B18 ; =OSi_DoTryLockByWord + bx ip +_037F8B10: .word 0x027FFFE8 +_037F8B14: .word OSi_AllocateCartridgeBus +_037F8B18: .word OSi_DoTryLockByWord + + arm_func_start OS_UnlockCartridge +OS_UnlockCartridge: ; 0x037F8B1C + ldr r1, _037F8B30 ; =0x027FFFE8 + ldr r2, _037F8B34 ; =OSi_FreeCartridgeBus + mov r3, #1 + ldr ip, _037F8B38 ; =OSi_DoUnlockByWord + bx ip +_037F8B30: .word 0x027FFFE8 +_037F8B34: .word OSi_FreeCartridgeBus +_037F8B38: .word OSi_DoUnlockByWord + + arm_func_start OS_LockCartridge +OS_LockCartridge: ; 0x037F8B3C + ldr r1, _037F8B50 ; =0x027FFFE8 + ldr r2, _037F8B54 ; =OSi_AllocateCartridgeBus + mov r3, #1 + ldr ip, _037F8B58 ; =OSi_DoLockByWord + bx ip +_037F8B50: .word 0x027FFFE8 +_037F8B54: .word OSi_AllocateCartridgeBus +_037F8B58: .word OSi_DoLockByWord + + arm_func_start OSi_DoTryLockByWord +OSi_DoTryLockByWord: ; 0x037F8B5C + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r9, r0 + mov r8, r1 + mov r7, r2 + movs r6, r3 + beq _037F8B84 + bl OS_DisableInterrupts_IrqAndFiq + mov r5, r0 + b _037F8B8C +_037F8B84: + bl OS_DisableInterrupts + mov r5, r0 +_037F8B8C: + mov r0, r9 + mov r1, r8 + bl MI_SwapWord + movs r4, r0 + bne _037F8BB4 + cmp r7, #0 + beq _037F8BB0 + mov lr, pc + bx r7 +_037F8BB0: + strh r9, [r8, #4] +_037F8BB4: + cmp r6, #0 + beq _037F8BC8 + mov r0, r5 + bl OS_RestoreInterrupts_IrqAndFiq + b _037F8BD0 +_037F8BC8: + mov r0, r5 + bl OS_RestoreInterrupts +_037F8BD0: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr + + arm_func_start OSi_DoUnlockByWord +OSi_DoUnlockByWord: ; 0x037F8BE0 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r7, r1 + mov r6, r2 + mov r5, r3 + ldrh r1, [r7, #4] + cmp r0, r1 + mvnne r0, #1 + bne _037F8C60 + cmp r5, #0 + beq _037F8C18 + bl OS_DisableInterrupts_IrqAndFiq + mov r4, r0 + b _037F8C20 +_037F8C18: + bl OS_DisableInterrupts + mov r4, r0 +_037F8C20: + mov r0, #0 + strh r0, [r7, #4] + cmp r6, #0 + beq _037F8C38 + mov lr, pc + bx r6 +_037F8C38: + mov r0, #0 + str r0, [r7] + cmp r5, #0 + beq _037F8C54 + mov r0, r4 + bl OS_RestoreInterrupts_IrqAndFiq + b _037F8C5C +_037F8C54: + mov r0, r4 + bl OS_RestoreInterrupts +_037F8C5C: + mov r0, #0 +_037F8C60: + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + + arm_func_start OSi_DoLockByWord +OSi_DoLockByWord: ; 0x037F8C6C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + mov r4, #1024 ; 0x400 + b _037F8C90 +_037F8C88: + mov r0, r4 + bl FUN_037F8CB4 +_037F8C90: + mov r0, r8 + mov r1, r7 + mov r2, r6 + mov r3, r5 + bl OSi_DoTryLockByWord + cmp r0, #0 + bgt _037F8C88 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + + arm_func_start FUN_037F8CB4 +FUN_037F8CB4: ; 0x037F8CB4 ;part of the above func? + ldr ip, _037F8CBC ; =SVC_WaitByLoop + bx ip +_037F8CBC: .word SVC_WaitByLoop + + arm_func_start OS_InitLock +OS_InitLock: ; 0x037F8CC0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + ldr r0, _037F8D38 ; =_03807780 + ldr r1, [r0] + cmp r1, #0 + bne _037F8D2C + mov r1, #1 + str r1, [r0] + mov r0, #0 + ldr r4, _037F8D3C ; =0x027FFFF0 + strh r0, [r4, #6] + mov r5, #1024 ; 0x400 + b _037F8CFC +_037F8CF4: + mov r0, r5 + bl FUN_037F8CB4 +_037F8CFC: + ldrh r0, [r4, #4] + cmp r0, #127 ; 0x7f + bne _037F8CF4 + mvn r1, #0 + ldr r0, _037F8D40 ; =0x027FFFB8 + str r1, [r0] + mov r0, #65536 ; 0x10000 + rsb r1, r0, #0 + ldr r0, _037F8D44 ; =0x027FFFBC + str r1, [r0] + mov r0, #191 ; 0xbf + strh r0, [r4, #6] +_037F8D2C: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F8D38: .word _03807780 +_037F8D3C: .word 0x027FFFF0 +_037F8D40: .word 0x027FFFB8 +_037F8D44: .word 0x027FFFBC diff --git a/arm7/asm/OS_thread.s b/arm7/asm/OS_thread.s new file mode 100644 index 00000000..832e6606 --- /dev/null +++ b/arm7/asm/OS_thread.s @@ -0,0 +1,767 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_SetThreadDestructor +OS_SetThreadDestructor: ; 0x037F8D48 + str r1, [r0, #152] ; 0x98 + bx lr + + arm_func_start OS_EnableScheduler +OS_EnableScheduler: ; 0x037F8D50 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, #0 + ldr r1, _037F8D84 ; =OSi_RescheduleCount + ldr r3, [r1] + cmp r3, #0 + subne r2, r3, #1 + strne r2, [r1] + movne r4, r3 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr +_037F8D84: .word OSi_RescheduleCount + + arm_func_start OS_DisableScheduler +OS_DisableScheduler: ; 0x037F8D88 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r2, _037F8DBC ; =OSi_RescheduleCount + ldr r3, [r2] + mvn r1, #0 + cmp r3, r1 + addcc r1, r3, #1 + strcc r1, [r2] + movcc r4, r3 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr +_037F8DBC: .word OSi_RescheduleCount + + arm_func_start OS_SetSwitchThreadCallback +OS_SetSwitchThreadCallback: ; 0x037F8DC0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _037F8DF0 ; =OSi_ThreadInfo + ldr r4, [r1, #12] + str r5, [r1, #12] + bl OS_RestoreInterrupts + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F8DF0: .word OSi_ThreadInfo +_037F8DF4: + ldr r2, [r0] + mov r1, #0 + str r1, [r0] + str r1, [r2, #148] ; 0x94 + mov r0, r2 + ldr ip, _037F8E10 ; =OS_WakeupThreadDirect + bx ip +_037F8E10: .word OS_WakeupThreadDirect + + arm_func_start OS_Sleep +OS_Sleep: ; 0x037F8E14 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #52 ; 0x34 + mov r5, r0 + add r0, sp, #8 + bl OS_CreateAlarm + ldr r0, _037F8EAC ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r0, [r0] + str r0, [sp, #4] + bl OS_DisableInterrupts + mov r4, r0 + add r0, sp, #8 + ldr r1, [sp, #4] + str r0, [r1, #148] ; 0x94 + add r1, sp, #4 + str r1, [sp] + mov r2, #0 + ldr r1, _037F8EB0 ; =0x000082EA + umull ip, r3, r5, r1 + mla r3, r5, r2, r3 + mla r3, r2, r1, r3 + mov r2, r3, lsr #6 + mov r1, ip, lsr #6 + orr r1, r1, r3, lsl #26 + ldr r3, _037F8EB4 ; =_037F8DF4 + bl OS_SetAlarm + mov r5, #0 + b _037F8E8C +_037F8E84: + mov r0, r5 + bl OS_SleepThread +_037F8E8C: + ldr r0, [sp, #4] + cmp r0, #0 + bne _037F8E84 + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #52 ; 0x34 + ldmia sp!, {r4, r5, lr} + bx lr +_037F8EAC: .word OSi_CurrentThreadPtr +_037F8EB0: .word 0x000082EA +_037F8EB4: .word _037F8DF4 + + arm_func_start OS_SetThreadPriority +OS_SetThreadPriority: ; 0x037F8EB8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + mov r5, r1 + ldr r0, _037F8F60 ; =OSi_ThreadInfo + ldr r8, [r0, #8] + mov r7, #0 + bl OS_DisableInterrupts + mov r4, r0 + b _037F8EE4 +_037F8EDC: + mov r7, r8 + ldr r8, [r8, #76] ; 0x4c +_037F8EE4: + cmp r8, #0 + beq _037F8EF4 + cmp r8, r6 + bne _037F8EDC +_037F8EF4: + cmp r8, #0 + beq _037F8F08 + ldr r0, _037F8F64 ; =OSi_IdleThread + cmp r8, r0 + bne _037F8F18 +_037F8F08: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + b _037F8F58 +_037F8F18: + ldr r0, [r8, #84] ; 0x54 + cmp r0, r5 + beq _037F8F4C + cmp r7, #0 + ldreq r1, [r6, #76] ; 0x4c + ldreq r0, _037F8F60 ; =OSi_ThreadInfo + streq r1, [r0, #8] + ldrne r0, [r6, #76] ; 0x4c + strne r0, [r7, #76] ; 0x4c + str r5, [r6, #84] ; 0x54 + mov r0, r6 + bl OSi_InsertThreadToList + bl OSi_RescheduleThread +_037F8F4C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 +_037F8F58: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr +_037F8F60: .word OSi_ThreadInfo +_037F8F64: .word OSi_IdleThread + + arm_func_start OS_RescheduleThread +OS_RescheduleThread: ; 0x037F8F68 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, r0 + bl OSi_RescheduleThread + mov r0, r4 + bl OS_RestoreInterrupts + ldmia sp!, {r4, lr} + bx lr + + arm_func_start OS_SelectThread +OS_SelectThread: ; 0x037F8F88 + ldr r0, _037F8FB0 ; =OSi_ThreadInfo + ldr r0, [r0, #8] + b _037F8F98 +_037F8F94: + ldr r0, [r0, #76] ; 0x4c +_037F8F98: + cmp r0, #0 + bxeq lr + ldr r1, [r0, #72] ; 0x48 + cmp r1, #1 + bne _037F8F94 + bx lr +_037F8FB0: .word OSi_ThreadInfo + + arm_func_start OS_WakeupThreadDirect +OS_WakeupThreadDirect: ; 0x037F8FB4 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #1 + str r0, [r5, #72] ; 0x48 + bl OSi_RescheduleThread + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + + arm_func_start OS_WakeupThread +OS_WakeupThread: ; 0x037F8FE8 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, [r5] + cmp r0, #0 + beq _037F9050 + mov r7, #1 + mov r6, #0 + b _037F9030 +_037F9014: + mov r0, r5 + bl OSi_RemoveLinkFromQueue + str r7, [r0, #72] ; 0x48 + str r6, [r0, #92] ; 0x5c + str r6, [r0, #100] ; 0x64 + ldr r1, [r0, #100] ; 0x64 + str r1, [r0, #96] ; 0x60 +_037F9030: + ldr r0, [r5] + cmp r0, #0 + bne _037F9014 + mov r0, #0 + str r0, [r5, #4] + ldr r0, [r5, #4] + str r0, [r5] + bl OSi_RescheduleThread +_037F9050: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + + arm_func_start OS_SleepThread +OS_SleepThread: ; 0x037F9064 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + bl OS_DisableInterrupts + mov r5, r0 + ldr r0, _037F90B4 ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r4, [r0] + cmp r6, #0 + beq _037F9098 + str r6, [r4, #92] ; 0x5c + mov r0, r6 + mov r1, r4 + bl OSi_InsertLinkToQueue +_037F9098: + mov r0, #0 + str r0, [r4, #72] ; 0x48 + bl OSi_RescheduleThread + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, lr} + bx lr +_037F90B4: .word OSi_CurrentThreadPtr + + arm_func_start OS_IsThreadTerminated +OS_IsThreadTerminated: ; 0x037F90B8 + ldr r0, [r0, #72] ; 0x48 + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + bx lr + + arm_func_start OS_JoinThread +OS_JoinThread: ; 0x037F90CC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, [r5, #72] ; 0x48 + cmp r0, #2 + beq _037F90F4 + add r0, r5, #128 ; 0x80 + bl OS_SleepThread +_037F90F4: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + + arm_func_start OSi_ExitThread_Destroy +OSi_ExitThread_Destroy: ; 0x037F9108 + stmdb sp!, {r4, lr} + ldr r0, _037F9164 ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r4, [r0] + bl OS_DisableScheduler + mov r0, r4 + bl OSi_UnlockAllMutex + ldr r0, [r4, #92] ; 0x5c + cmp r0, #0 + beq _037F9138 + mov r1, r4 + bl OSi_RemoveSpecifiedLinkFromQueue +_037F9138: + mov r0, r4 + bl OSi_RemoveThreadFromList + mov r0, #2 + str r0, [r4, #72] ; 0x48 + add r0, r4, #128 ; 0x80 + bl OS_WakeupThread + bl OS_EnableScheduler + bl OS_RescheduleThread + bl FUN_037FB1F0 + ldmia sp!, {r4, lr} + bx lr +_037F9164: .word OSi_CurrentThreadPtr + + arm_func_start OSi_ExitThread +OSi_ExitThread: ; 0x037F9168 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037F91AC ; =OSi_CurrentThreadPtr + ldr r1, [r1] + ldr r3, [r1] + ldr r2, [r3, #152] ; 0x98 + cmp r2, #0 + beq _037F919C + mov r1, #0 + str r1, [r3, #152] ; 0x98 + mov lr, pc + bx r2 + bl OS_DisableInterrupts +_037F919C: + bl OSi_ExitThread_Destroy + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F91AC: .word OSi_CurrentThreadPtr + + arm_func_start OSi_ExitThread_ArgSpecified +OSi_ExitThread_ArgSpecified: ; 0x037F91B0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + mov r4, r1 + ldr r1, _037F9210 ; =OSi_StackForDestructor + ldr r2, [r1] + cmp r2, #0 + beq _037F91FC + ldr r1, _037F9214 ; =OSi_ExitThread + bl OS_InitContext + str r4, [r5, #4] + ldr r0, [r5] + orr r0, r0, #128 ; 0x80 + str r0, [r5] + mov r0, #1 + str r0, [r5, #72] ; 0x48 + mov r0, r5 + bl OS_LoadContext + b _037F9204 +_037F91FC: + mov r0, r4 + bl OSi_ExitThread +_037F9204: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F9210: .word OSi_StackForDestructor +_037F9214: .word OSi_ExitThread + + arm_func_start OS_ExitThread +OS_ExitThread: ; 0x037F9218 + stmfd sp!, {lr} + sub sp, sp, #4 + bl OS_DisableInterrupts + ldr r0, _037F9240 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + mov r1, #0 + bl OSi_ExitThread_ArgSpecified + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F9240: .word OSi_ThreadInfo + + arm_func_start OS_CreateThread +OS_CreateThread: ; 0x037F9244 + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r9, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl OS_DisableInterrupts + mov r4, r0 + bl OSi_GetUnusedThreadId + ldr r1, [sp, #36] ; 0x24 + str r1, [r9, #84] ; 0x54 + str r0, [r9, #80] ; 0x50 + mov r0, #0 + str r0, [r9, #72] ; 0x48 + str r0, [r9, #88] ; 0x58 + mov r0, r9 + bl OSi_InsertThreadToList + str r6, [r9, #120] ; 0x78 + ldr r0, [sp, #32] + sub r5, r6, r0 + str r5, [r9, #116] ; 0x74 + mov r2, #0 + str r2, [r9, #124] ; 0x7c + ldr r1, _037F9348 ; =0xD73BFDF7 + ldr r0, [r9, #120] ; 0x78 + str r1, [r0, #-4] + ldr r1, _037F934C ; =0xFBDD37BB + ldr r0, [r9, #116] ; 0x74 + str r1, [r0] + str r2, [r9, #132] ; 0x84 + ldr r0, [r9, #132] ; 0x84 + str r0, [r9, #128] ; 0x80 + mov r0, r9 + mov r1, r8 + sub r2, r6, #4 + bl OS_InitContext + str r7, [r9, #4] + ldr r0, _037F9350 ; =OS_ExitThread + str r0, [r9, #60] ; 0x3c + mov r0, #0 + add r1, r5, #4 + ldr r2, [sp, #32] + sub r2, r2, #8 + bl MIi_CpuClear32 + mov r1, #0 + str r1, [r9, #104] ; 0x68 + str r1, [r9, #108] ; 0x6c + str r1, [r9, #112] ; 0x70 + mov r0, r9 + bl OS_SetThreadDestructor + mov r0, #0 + str r0, [r9, #92] ; 0x5c + str r0, [r9, #100] ; 0x64 + ldr r1, [r9, #100] ; 0x64 + str r1, [r9, #96] ; 0x60 + add r1, r9, #136 ; 0x88 + mov r2, #12 + bl MIi_CpuClear32 + mov r0, #0 + str r0, [r9, #148] ; 0x94 + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr +_037F9348: .word 0xD73BFDF7 +_037F934C: .word 0xFBDD37BB +_037F9350: .word OS_ExitThread + + arm_func_start OS_InitThread +OS_InitThread: ; 0x037F9354 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037F942C ; =OSi_IsThreadInitialized + ldr r1, [r0] + cmp r1, #0 + bne _037F9420 + mov r2, #1 + str r2, [r0] + ldr r1, _037F9430 ; =_038077A0 + ldr r0, _037F9434 ; =OSi_CurrentThreadPtr + str r1, [r0] + mov r0, #16 + ldr r1, _037F9438 ; =OSi_LauncherThread + str r0, [r1, #84] ; 0x54 + mov r0, #0 + str r0, [r1, #80] ; 0x50 + str r2, [r1, #72] ; 0x48 + str r0, [r1, #76] ; 0x4c + str r0, [r1, #88] ; 0x58 + ldr r0, _037F943C ; =OSi_ThreadInfo + str r1, [r0, #8] + str r1, [r0, #4] + ldr r2, _037F9440 ; =0x00000400 + cmp r2, #0 + ldrle r0, _037F9444 ; =FUN_037F8000 + suble r2, r0, r2 + ldrgt r1, _037F9448 ; =0x00000400 + ldrgt r0, _037F944C ; =0x0380FF80 + subgt r0, r0, r1 + subgt r2, r0, r2 + ldr r1, _037F9448 ; =0x00000400 + ldr r0, _037F944C ; =0x0380FF80 + sub r3, r0, r1 + ldr r1, _037F9438 ; =OSi_LauncherThread + str r3, [r1, #120] ; 0x78 + str r2, [r1, #116] ; 0x74 + mov r0, #0 + str r0, [r1, #124] ; 0x7c + ldr r2, _037F9450 ; =0xD73BFDF7 + str r2, [r3, #-4] + ldr r3, _037F9454 ; =0xFBDD37BB + ldr r2, [r1, #116] ; 0x74 + str r3, [r2] + str r0, [r1, #132] ; 0x84 + str r0, [r1, #128] ; 0x80 + ldr r1, _037F943C ; =OSi_ThreadInfo + strh r0, [r1] + strh r0, [r1, #2] + ldr r2, _037F9458 ; =0x027FFFA4 + str r1, [r2] + bl OS_SetSwitchThreadCallback +_037F9420: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F942C: .word OSi_IsThreadInitialized +_037F9430: .word _038077A0 +_037F9434: .word OSi_CurrentThreadPtr +_037F9438: .word OSi_LauncherThread +_037F943C: .word OSi_ThreadInfo +_037F9440: .word 0x00000400 +_037F9444: .word FUN_037F8000 +_037F9448: .word 0x00000400 +_037F944C: .word 0x0380FF80 +_037F9450: .word 0xD73BFDF7 +_037F9454: .word 0xFBDD37BB +_037F9458: .word 0x027FFFA4 + + arm_func_start OSi_RescheduleThread +OSi_RescheduleThread: ; 0x037F945C + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _037F952C ; =OSi_RescheduleCount + ldr r0, [r0] + cmp r0, #0 + bne _037F9524 + ldr r4, _037F9530 ; =OSi_ThreadInfo + ldrh r0, [r4, #2] + cmp r0, #0 + bne _037F948C + bl OS_GetProcMode + cmp r0, #18 + bne _037F9498 +_037F948C: + mov r0, #1 + strh r0, [r4] + b _037F9524 +_037F9498: + ldr r0, _037F9534 ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r6, [r0] + bl OS_SelectThread + mov r5, r0 + cmp r6, r5 + beq _037F9524 + cmp r5, #0 + beq _037F9524 + ldr r0, [r6, #72] ; 0x48 + cmp r0, #2 + beq _037F94D8 + mov r0, r6 + bl OS_SaveContext + cmp r0, #0 + bne _037F9524 +_037F94D8: + ldr r0, _037F9538 ; =OSi_SystemCallbackInSwitchThread + ldr r2, [r0] + cmp r2, #0 + beq _037F94F8 + mov r0, r6 + mov r1, r5 + mov lr, pc + bx r2 +_037F94F8: + ldr r2, [r4, #12] + cmp r2, #0 + beq _037F9514 + mov r0, r6 + mov r1, r5 + mov lr, pc + bx r2 +_037F9514: + ldr r0, _037F9530 ; =OSi_ThreadInfo + str r5, [r0, #4] + mov r0, r5 + bl OS_LoadContext +_037F9524: + ldmia sp!, {r4, r5, r6, lr} + bx lr +_037F952C: .word OSi_RescheduleCount +_037F9530: .word OSi_ThreadInfo +_037F9534: .word OSi_CurrentThreadPtr +_037F9538: .word OSi_SystemCallbackInSwitchThread + + arm_func_start OSi_RemoveThreadFromList +OSi_RemoveThreadFromList: ; 0x037F953C + ldr r1, _037F9580 ; =OSi_ThreadInfo + ldr r2, [r1, #8] + mov r1, #0 + b _037F9554 +_037F954C: + mov r1, r2 + ldr r2, [r2, #76] ; 0x4c +_037F9554: + cmp r2, #0 + beq _037F9564 + cmp r2, r0 + bne _037F954C +_037F9564: + cmp r1, #0 + ldreq r1, [r0, #76] ; 0x4c + ldreq r0, _037F9580 ; =OSi_ThreadInfo + streq r1, [r0, #8] + ldrne r0, [r0, #76] ; 0x4c + strne r0, [r1, #76] ; 0x4c + bx lr +_037F9580: .word OSi_ThreadInfo + + arm_func_start OSi_InsertThreadToList +OSi_InsertThreadToList: ; 0x037F9584 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037F95E8 ; =OSi_ThreadInfo + ldr r3, [r1, #8] + mov lr, r3 + mov ip, #0 + b _037F95A8 +_037F95A0: + mov ip, lr + ldr lr, [lr, #76] ; 0x4c +_037F95A8: + cmp lr, #0 + beq _037F95C0 + ldr r2, [lr, #84] ; 0x54 + ldr r1, [r0, #84] ; 0x54 + cmp r2, r1 + bcc _037F95A0 +_037F95C0: + cmp ip, #0 + streq r3, [r0, #76] ; 0x4c + ldreq r1, _037F95E8 ; =OSi_ThreadInfo + streq r0, [r1, #8] + ldrne r1, [ip, #76] ; 0x4c + strne r1, [r0, #76] ; 0x4c + strne r0, [ip, #76] ; 0x4c + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F95E8: .word OSi_ThreadInfo + + arm_func_start OSi_RemoveMutexLinkFromQueue +OSi_RemoveMutexLinkFromQueue: ; 0x037F95EC + ldr r2, [r0] + cmp r2, #0 + beq _037F9614 + ldr r1, [r2, #16] + str r1, [r0] + cmp r1, #0 + movne r0, #0 + strne r0, [r1, #20] + moveq r1, #0 + streq r1, [r0, #4] +_037F9614: + mov r0, r2 + bx lr + + arm_func_start OSi_RemoveSpecifiedLinkFromQueue +OSi_RemoveSpecifiedLinkFromQueue: ; 0x037F961C + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r2, [r0] + mov lr, r2 + b _037F9664 +_037F9630: + ldr ip, [lr, #100] ; 0x64 + cmp lr, r1 + bne _037F9660 + ldr r3, [lr, #96] ; 0x60 + cmp r2, lr + streq ip, [r0] + strne ip, [r3, #100] ; 0x64 + ldr r1, [r0, #4] + cmp r1, lr + streq r3, [r0, #4] + strne r3, [ip, #96] ; 0x60 + b _037F966C +_037F9660: + mov lr, ip +_037F9664: + cmp lr, #0 + bne _037F9630 +_037F966C: + mov r0, lr + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + + arm_func_start OSi_RemoveLinkFromQueue +OSi_RemoveLinkFromQueue: ; 0x037F967C + ldr r2, [r0] + cmp r2, #0 + beq _037F96A8 + ldr r1, [r2, #100] ; 0x64 + str r1, [r0] + cmp r1, #0 + movne r0, #0 + strne r0, [r1, #96] ; 0x60 + moveq r1, #0 + streq r1, [r0, #4] + streq r1, [r2, #92] ; 0x5c +_037F96A8: + mov r0, r2 + bx lr + + arm_func_start OSi_InsertLinkToQueue +OSi_InsertLinkToQueue: ; 0x037F96B0 + ldr ip, [r0] + b _037F96C4 +_037F96B8: + cmp ip, r1 + bxeq lr + ldr ip, [ip, #100] ; 0x64 +_037F96C4: + cmp ip, #0 + beq _037F96DC + ldr r3, [ip, #84] ; 0x54 + ldr r2, [r1, #84] ; 0x54 + cmp r3, r2 + bls _037F96B8 +_037F96DC: + cmp ip, #0 + bne _037F9708 + ldr r2, [r0, #4] + cmp r2, #0 + streq r1, [r0] + strne r1, [r2, #100] ; 0x64 + str r2, [r1, #96] ; 0x60 + mov r2, #0 + str r2, [r1, #100] ; 0x64 + str r1, [r0, #4] + bx lr +_037F9708: + ldr r2, [ip, #96] ; 0x60 + cmp r2, #0 + streq r1, [r0] + strne r1, [r2, #100] ; 0x64 + str r2, [r1, #96] ; 0x60 + str ip, [r1, #100] ; 0x64 + str r1, [ip, #96] ; 0x60 + bx lr + + arm_func_start OSi_GetUnusedThreadId +OSi_GetUnusedThreadId: ; 0x037F9728 + ldr r1, _037F973C ; =_0380778C + ldr r0, [r1] + add r0, r0, #1 + str r0, [r1] + bx lr +_037F973C: .word _0380778C diff --git a/arm7/asm/OS_tick.s b/arm7/asm/OS_tick.s new file mode 100644 index 00000000..40589867 --- /dev/null +++ b/arm7/asm/OS_tick.s @@ -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 diff --git a/arm7/asm/OS_timer.s b/arm7/asm/OS_timer.s new file mode 100644 index 00000000..5794046e --- /dev/null +++ b/arm7/asm/OS_timer.s @@ -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 diff --git a/arm7/asm/dtcm.s b/arm7/asm/dtcm.s index b639598d..a403919a 100644 --- a/arm7/asm/dtcm.s +++ b/arm7/asm/dtcm.s @@ -2,2868 +2,6 @@ .include "global.inc" .section .text - arm_func_start FUN_037F8000 -FUN_037F8000: ; 0x037F8000 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037F8028 ; =PMi_Initialized - ldr r0, [r0] - cmp r0, #0 - beq _037F801C - bl PM_SelfBlinkProc -_037F801C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F8028: .word PMi_Initialized - - arm_func_start FUN_037F802C -FUN_037F802C: ; 0x037F802C - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov r8, #0 - bl FUN_037F81E8 - cmp r0, #0 - beq _037F80F8 - bl FUN_037F81C4 - mov r7, r0 - mov r9, r8 - mov r4, #1 - mov fp, #138 ; 0x8a - mov r5, #112 ; 0x70 -_037F8060: - add r6, sl, r9, lsl #8 - ldr r0, _037F81B4 ; =0x0000FFFF - mov r1, r6 - mov r2, r5 - bl FUN_037F81B8 - mov r2, r6 - ldrh r1, [r2, #114] ; 0x72 - cmp r0, r1 - bne _037F80E0 - ldrh r0, [r2, #112] ; 0x70 - cmp r0, #128 ; 0x80 - bcs _037F80E0 - ldr r0, _037F81B4 ; =0x0000FFFF - add r1, r6, #116 ; 0x74 - mov r2, fp - bl FUN_037F81B8 - mov r3, r6 - ldrh r1, [r3, #254] ; 0xfe - cmp r0, r1 - bne _037F80E0 - ldrh r2, [r3, #118] ; 0x76 - ldrb r0, [r3, #117] ; 0x75 - mov r1, r4, lsl r0 - ands r1, r1, r2 - beq _037F80E0 - ands r1, r7, r2 - ldrneh r1, [r6, #100] ; 0x64 - bicne r1, r1, #7 - andne r0, r0, #7 - orrne r0, r1, r0 - strneh r0, [r6, #100] ; 0x64 - orr r8, r8, r4, lsl r9 -_037F80E0: - add r0, r9, #1 - mov r0, r0, lsl #16 - mov r9, r0, lsr #16 - cmp r9, #2 - bcc _037F8060 - b _037F8158 -_037F80F8: - bl FUN_037F81C4 - cmp r0, #0 - movne r0, #3 - bne _037F81A8 - mov r7, r8 - mov r4, #1 - ldr r6, _037F81B4 ; =0x0000FFFF - mov r5, #112 ; 0x70 -_037F8118: - mov r0, r6 - add r1, sl, r7, lsl #8 - mov r2, r5 - bl FUN_037F81B8 - add r2, sl, r7, lsl #8 - ldrh r1, [r2, #114] ; 0x72 - cmp r0, r1 - bne _037F8144 - ldrh r0, [r2, #112] ; 0x70 - cmp r0, #128 ; 0x80 - orrcc r8, r8, r4, lsl r7 -_037F8144: - add r0, r7, #1 - mov r0, r0, lsl #16 - mov r7, r0, lsr #16 - cmp r7, #2 - bcc _037F8118 -_037F8158: - cmp r8, #1 - beq _037F8174 - cmp r8, #2 - beq _037F8174 - cmp r8, #3 - beq _037F817C - b _037F81A4 -_037F8174: - mov r0, r8 - b _037F81A8 -_037F817C: - ldrh r0, [sl, #112] ; 0x70 - add r0, r0, #1 - and r0, r0, #127 ; 0x7f - and r1, r0, #255 ; 0xff - add r0, sl, #256 ; 0x100 - ldrh r0, [r0, #112] ; 0x70 - cmp r1, r0 - moveq r0, #2 - movne r0, #1 - b _037F81A8 -_037F81A4: - mov r0, #0 -_037F81A8: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037F81B4: .word 0x0000FFFF - - arm_func_start FUN_037F81B8 -FUN_037F81B8: ; 0x037F81B8 - ldr ip, _037F81C0 ; =SVC_GetCRC16 - bx ip -_037F81C0: .word SVC_GetCRC16 - - arm_func_start FUN_037F81C4 -FUN_037F81C4: ; 0x037F81C4 - mov r0, #0 - ldr r1, _037F81E4 ; =0x027FFE1D - ldrb r1, [r1] - cmp r1, #128 ; 0x80 - orreq r0, r0, #64 ; 0x40 - moveq r0, r0, lsl #16 - moveq r0, r0, lsr #16 - bx lr -_037F81E4: .word 0x027FFE1D - - arm_func_start FUN_037F81E8 -FUN_037F81E8: ; 0x037F81E8 - stmfd sp!, {lr} - sub sp, sp, #4 - mov r0, #29 - mov r1, #1 - add r2, sp, #0 - bl NVRAM_ReadDataBytes - ldrb r0, [sp] - cmp r0, #255 ; 0xff - moveq r0, #0 - beq _037F821C - ands r0, r0, #64 ; 0x40 - movne r0, #1 - moveq r0, #0 -_037F821C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - - arm_func_start FUN_037F8228 -FUN_037F8228: ; 0x037F8228 - stmdb sp!, {r4, lr} - sub sp, sp, #528 ; 0x210 - mov r0, #32 - mov r1, #2 - add r2, sp, #4 - bl NVRAM_ReadDataBytes - ldr r0, [sp, #4] - mov r0, r0, lsl #3 - str r0, [sp, #4] - mov r1, #256 ; 0x100 - add r2, sp, #16 - bl NVRAM_ReadDataBytes - ldr r0, [sp, #4] - add r0, r0, #256 ; 0x100 - mov r1, #256 ; 0x100 - add r2, sp, #272 ; 0x110 - bl NVRAM_ReadDataBytes - add r0, sp, #16 - bl FUN_037F802C - cmp r0, #3 - blt _037F8290 - mvn r0, #0 - ldr r1, _037F83A4 ; =0x027FFC80 - mov r2, #116 ; 0x74 - bl MIi_CpuClear32 - b _037F834C -_037F8290: - cmp r0, #0 - beq _037F833C - mov r2, r0, lsl #8 - ldr r1, _037F83A8 ; =0xFFFFFF2A - add r1, sp, r1 - ldrb r1, [r1, r0, lsl #8] - cmp r1, #10 - bcs _037F82DC - mov ip, #10 - mov r3, #0 - add r1, sp, #16 - add r2, r1, r2 - b _037F82D0 -_037F82C4: - add r1, r2, ip, lsl #1 - strh r3, [r1, #-252] ; 0xffffff04 - sub ip, ip, #1 -_037F82D0: - ldrb r1, [r2, #-230] ; 0xffffff1a - cmp ip, r1 - bgt _037F82C4 -_037F82DC: - mov r2, r0, lsl #8 - ldr r1, _037F83AC ; =0xFFFFFF60 - add r1, sp, r1 - ldrb r1, [r1, r0, lsl #8] - cmp r1, #26 - bcs _037F8320 - mov ip, #26 - mov r3, #0 - add r1, sp, #16 - add r2, r1, r2 - b _037F8314 -_037F8308: - add r1, r2, ip, lsl #1 - strh r3, [r1, #-230] ; 0xffffff1a - sub ip, ip, #1 -_037F8314: - ldrb r1, [r2, #-176] ; 0xffffff50 - cmp ip, r1 - bgt _037F8308 -_037F8320: - add r1, sp, #16 - sub r0, r0, #1 - add r0, r1, r0, lsl #8 - ldr r1, _037F83A4 ; =0x027FFC80 - mov r2, #116 ; 0x74 - bl MIi_CpuCopy32 - b _037F834C -_037F833C: - mov r0, #0 - ldr r1, _037F83A4 ; =0x027FFC80 - mov r2, #116 ; 0x74 - bl MIi_CpuClear32 -_037F834C: - mov r0, #54 ; 0x36 - mov r1, #6 - add r2, sp, #8 - bl NVRAM_ReadDataBytes - ldr r0, _037F83A4 ; =0x027FFC80 - add r4, r0, #116 ; 0x74 - add r0, sp, #8 - mov r1, r4 - mov r2, #6 - bl MI_CpuCopy8 - mov r0, #60 ; 0x3c - mov r1, #2 - add r2, sp, #0 - bl NVRAM_ReadDataBytes - ldrh r0, [sp] - mov r0, r0, lsl #15 - mov r0, r0, lsr #16 - bl WMSP_GetAllowedChannel - strh r0, [r4, #6] - add sp, sp, #528 ; 0x210 - ldmia sp!, {r4, lr} - bx lr -_037F83A4: .word 0x027FFC80 -_037F83A8: .word 0xFFFFFF2A -_037F83AC: .word 0xFFFFFF60 - - arm_func_start FUN_037F83B0 -FUN_037F83B0: ; 0x037F83B0 - stmdb sp!, {r4, lr} - mov r0, #8 - bl OS_GetArenaHi - mov r4, r0 - mov r0, #8 - bl OS_GetArenaLo - mov r1, r0 - mov r0, #8 - mov r2, r4 - mov r3, #1 - bl OS_InitAlloc - mov r4, r0 - mov r0, #8 - bl OS_GetArenaHi - mov r2, r0 - mov r0, r4 - mov r1, #0 - sub r2, r2, r4 - bl MI_CpuFill8 - mov r0, #8 - mov r1, r4 - bl OS_SetArenaLo - mov r0, #8 - bl OS_GetArenaHi - mov r4, r0 - mov r0, #8 - bl OS_GetArenaLo - mov r1, r0 - mov r0, #8 - mov r2, r4 - bl OS_CreateHeap - movs r4, r0 - bpl _037F8438 - bl FUN_037FB1F0 -_037F8438: - mov r0, #8 - mov r1, r4 - bl OS_SetCurrentHeap - mov r0, #8 - mov r1, r4 - bl OS_CheckHeap - cmp r0, #8448 ; 0x2100 - bcs _037F845C - bl FUN_037FB1F0 -_037F845C: - mov r0, r4 - ldmia sp!, {r4, lr} - bx lr - - arm_func_start NitroSpMain -NitroSpMain: ; 0x037F8468 - stmdb sp!, {r4, lr} - bl WVR_ShelterExtWram - bl OS_Init - bl OS_InitThread - bl FUN_037F8228 - bl PXI_Init - bl FUN_037F83B0 - mov r4, r0 - mov r0, #6 - bl SND_Init - bl PAD_InitXYButton - mov r0, #1 - ldr r1, _037F8524 ; =FUN_037F8000 - bl OS_SetIrqFunction - mov r0, #1 - bl OS_EnableIrqMask - ldr r1, _037F8528 ; =0x04000004 - ldrh r0, [r1] - ldrh r0, [r1] - orr r0, r0, #8 - strh r0, [r1] - ldr r1, _037F852C ; =0x04000208 - ldrh r0, [r1] - mov r0, #1 - strh r0, [r1] - bl OS_EnableInterrupts - mvn r0, #0 - bl FS_Init - mov r0, #15 - bl CARD_SetThreadPriority - mov r0, #12 - bl RTC_Init - mov r0, r4 - bl WVR_Init - mov r0, #2 - bl SPI_Init - mov r4, #0 -_037F84FC: - bl FUN_037F8530 - bl OS_IsResetOccurred - cmp r0, #0 - beq _037F8518 - mov r0, r4 - bl CTRDG_VibPulseEdgeUpdate - bl OS_ResetSystem -_037F8518: - bl CTRDG_CheckPullOut_Polling - bl CARD_CheckPullOut_Polling - b _037F84FC -_037F8524: .word FUN_037F8000 -_037F8528: .word 0x04000004 -_037F852C: .word 0x04000208 - - arm_func_start FUN_037F8530 -FUN_037F8530: ; 0x037F8530 - ldr ip, _037F8538 ; =SVC_Halt - bx ip -_037F8538: .word SVC_Halt - - arm_func_start OS_IrqHandler -OS_IrqHandler: ; 0x037F853C - stmfd sp!, {lr} - mov ip, #67108864 ; 0x4000000 - add ip, ip, #528 ; 0x210 - ldr r1, [ip, #-8] - cmp r1, #0 - ldmeqfd sp!, {pc} - ldmia ip, {r1, r2} - ands r1, r1, r2 - ldmeqfd sp!, {pc} - mov r3, #1 - mov r0, #0 -_037F8568: - ands r2, r1, r3, lsl r0 - addeq r0, r0, #1 - beq _037F8568 - str r2, [ip, #4] - ldr r1, _037F8588 ; =OS_IRQTable - ldr r0, [r1, r0, lsl #2] - ldr lr, _037F858C ; =OS_IrqHandler_ThreadSwitch - bx r0 -_037F8588: .word OS_IRQTable -_037F858C: .word OS_IrqHandler_ThreadSwitch - - arm_func_start OS_IrqHandler_ThreadSwitch -OS_IrqHandler_ThreadSwitch: - ldr ip, _037F86AC ; =OSi_IrqThreadQueue - mov r3, #0 - ldr ip, [ip] - mov r2, #1 - cmp ip, #0 - beq _037F85E0 -_037F85A8: - str r2, [ip, #72] ; 0x48 - str r3, [ip, #92] ; 0x5c - str r3, [ip, #96] ; 0x60 - ldr r0, [ip, #100] ; 0x64 - str r3, [ip, #100] ; 0x64 - mov ip, r0 - cmp ip, #0 - bne _037F85A8 - ldr ip, _037F86AC ; =OSi_IrqThreadQueue - str r3, [ip] - str r3, [ip, #4] - ldr ip, _037F86B0 ; =OSi_ThreadInfo - mov r1, #1 - strh r1, [ip] -_037F85E0: - ldr ip, _037F86B0 ; =OSi_ThreadInfo - ldrh r1, [ip] - cmp r1, #0 - ldreq pc, [sp], #4 ; (ldreq pc, [sp], #4) - mov r1, #0 - strh r1, [ip] - mov r3, #210 ; 0xd2 - msr CPSR_c, r3 - add r2, ip, #8 - ldr r1, [r2] -_037F8608: - cmp r1, #0 - ldrneh r0, [r1, #72] ; 0x48 - cmpne r0, #1 - ldrne r1, [r1, #76] ; 0x4c - bne _037F8608 - cmp r1, #0 - bne _037F8630 -_037F8624: - mov r3, #146 ; 0x92 - msr CPSR_c, r3 - ldr pc, [sp], #4 -_037F8630: - ldr r0, [ip, #4] - cmp r1, r0 - beq _037F8624 - ldr r3, [ip, #12] - cmp r3, #0 - beq _037F8658 - - arm_func_start FUN_037F8648 -FUN_037F8648: ; 0x037F8648 - stmdb sp!, {r0, r1, ip} - mov lr, pc - bx r3 - ldmia sp!, {r0, r1, ip} -_037F8658: - str r1, [ip, #4] - mrs r2, SPSR - str r2, [r0, #0]! - ldmib sp!, {r2, r3} - stmib r0!, {r2, r3} - ldmib sp!, {r2, r3, ip, lr} - stmib r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ - stmib r0!, {lr} - mov r3, #211 ; 0xd3 - msr CPSR_c, r3 - stmib r0!, {sp} - ldr sp, [r1, #68] ; 0x44 - mov r3, #210 ; 0xd2 - msr CPSR_c, r3 - ldr r2, [r1, #0]! - msr SPSR_fc, r2 - ldr lr, [r1, #64] ; 0x40 - ldmib r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ - nop ; (mov r0, r0) - stmda sp!, {r0, r1, r2, r3, ip, lr} - ldmia sp!, {pc} -_037F86AC: .word OSi_IrqThreadQueue -_037F86B0: .word OSi_ThreadInfo - - arm_func_start OSi_IrqVBlank -OSi_IrqVBlank: ; 0x037F86B4 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037F8700 ; =OSi_IrqCallbackInfo - ldr r2, [r0, #96] ; 0x60 - ldr r1, _037F8704 ; =0x027FFC3C - ldr r0, [r1] - add r0, r0, #1 - str r0, [r1] - cmp r2, #0 - beq _037F86E4 - mov lr, pc - bx r2 -_037F86E4: - ldr r1, _037F8708 ; =0x0380FFF8 - ldr r0, [r1] - orr r0, r0, #1 - str r0, [r1] - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F8700: .word OSi_IrqCallbackInfo -_037F8704: .word 0x027FFC3C -_037F8708: .word 0x0380FFF8 - - arm_func_start OSi_IrqTimer3 -OSi_IrqTimer3: ; 0x037F870C - mov r0, #7 - ldr ip, _037F8718 ; =OSi_IrqCallback - bx ip -_037F8718: .word OSi_IrqCallback - - arm_func_start OSi_IrqTimer2 -OSi_IrqTimer2: ; 0x037F871C - mov r0, #6 - ldr ip, _037F8728 ; =OSi_IrqCallback - bx ip -_037F8728: .word OSi_IrqCallback - - arm_func_start OSi_IrqTimer1 -OSi_IrqTimer1: ; 0x037F872C - mov r0, #5 - ldr ip, _037F8738 ; =OSi_IrqCallback - bx ip -_037F8738: .word OSi_IrqCallback - - arm_func_start OSi_IrqTimer0 -OSi_IrqTimer0: ; 0x037F873C - mov r0, #4 - ldr ip, _037F8748 ; =OSi_IrqCallback - bx ip -_037F8748: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma3 -OSi_IrqDma3: ; 0x037F874C - mov r0, #3 - ldr ip, _037F8758 ; =OSi_IrqCallback - bx ip -_037F8758: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma2 -OSi_IrqDma2: ; 0x037F875C - mov r0, #2 - ldr ip, _037F8768 ; =OSi_IrqCallback - bx ip -_037F8768: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma1 -OSi_IrqDma1: ; 0x037F876C - mov r0, #1 - ldr ip, _037F8778 ; =OSi_IrqCallback - bx ip -_037F8778: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma0 -OSi_IrqDma0: ; 0x037F877C - mov r0, #0 - ldr ip, _037F8788 ; =OSi_IrqCallback - bx ip -_037F8788: .word OSi_IrqCallback - - arm_func_start OSi_IrqCallback -OSi_IrqCallback: ; 0x037F878C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r3, #1 - mov r2, r0, lsl #1 - ldr r1, _037F880C ; =_038075E4 - ldrh r1, [r1, r2] - mov r5, r3, lsl r1 - mov r1, #12 - mul r4, r0, r1 - ldr r2, _037F8810 ; =OSi_IrqCallbackInfo - ldr r1, [r2, r4] - mov r0, #0 - str r0, [r2, r4] - cmp r1, #0 - beq _037F87D8 - ldr r0, _037F8814 ; =_0380771C - ldr r0, [r0, r4] - mov lr, pc - bx r1 -_037F87D8: - ldr r1, _037F8818 ; =0x0380FFF8 - ldr r0, [r1] - orr r0, r0, r5 - str r0, [r1] - ldr r0, _037F881C ; =_03807718 - ldr r0, [r0, r4] - cmp r0, #0 - bne _037F8800 - mov r0, r5 - bl OS_DisableIrqMask -_037F8800: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F880C: .word _038075E4 -_037F8810: .word OSi_IrqCallbackInfo -_037F8814: .word _0380771C -_037F8818: .word 0x0380FFF8 -_037F881C: .word _03807718 - - arm_func_start OS_IrqDummy -OS_IrqDummy: ; 0x037F8820 - bx lr - - arm_func_start OS_ResetRequestIrqMask -OS_ResetRequestIrqMask: ; 0x037F8824 - ldr ip, _037F8850 ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F8854 ; =0x04000214 - ldr r1, [r2] - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F8850: .word 0x04000208 -_037F8854: .word 0x04000214 - - arm_func_start OS_DisableIrqMask -OS_DisableIrqMask: ; 0x037F8858 - ldr ip, _037F888C ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F8890 ; =0x04000210 - ldr r1, [r2] - mvn r0, r0 - and r0, r1, r0 - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F888C: .word 0x04000208 -_037F8890: .word 0x04000210 - - arm_func_start OS_EnableIrqMask -OS_EnableIrqMask: ; 0x037F8894 - ldr ip, _037F88C4 ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F88C8 ; =0x04000210 - ldr r1, [r2] - orr r0, r1, r0 - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F88C4: .word 0x04000208 -_037F88C8: .word 0x04000210 - - arm_func_start OS_SetIrqMask -OS_SetIrqMask: ; 0x037F88CC - ldr ip, _037F88F8 ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F88FC ; =0x04000210 - ldr r1, [r2] - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F88F8: .word 0x04000208 -_037F88FC: .word 0x04000210 - - arm_func_start OSi_EnterTimerCallback -OSi_EnterTimerCallback: ; 0x037F8900 - stmdb sp!, {r4, lr} - mov r3, #12 - mul r4, r0, r3 - ldr r3, _037F8940 ; =_03807744 - str r1, [r3, r4] - ldr r1, _037F8944 ; =_0380774C - str r2, [r1, r4] - mov r1, #1 - add r0, r0, #3 - mov r0, r1, lsl r0 - bl OS_EnableIrqMask - mov r1, #1 - ldr r0, _037F8948 ; =_03807748 - str r1, [r0, r4] - ldmia sp!, {r4, lr} - bx lr -_037F8940: .word _03807744 -_037F8944: .word _0380774C -_037F8948: .word _03807748 - - arm_func_start OS_SetIrqFunction -OS_SetIrqFunction: ; 0x037F894C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, #0 - mov r7, r9 - ldr lr, _037F89E8 ; =OS_IRQTable - ldr r4, _037F89EC ; =_03807774 - ldr r6, _037F89F0 ; =OSi_IrqCallbackInfo - mov ip, r9 - mov r3, #1 - mov r2, #12 -_037F8974: - ands r5, r0, #1 - beq _037F89CC - mov r8, r7 - cmp r9, #8 - blt _037F8998 - cmp r9, #11 - suble r5, r9, #8 - mlale r8, r5, r2, r6 - ble _037F89BC -_037F8998: - cmp r9, #3 - blt _037F89B0 - cmp r9, #6 - addle r5, r9, #1 - mlale r8, r5, r2, r6 - ble _037F89BC -_037F89B0: - cmp r9, #0 - moveq r8, r4 - strne r1, [lr, r9, lsl #2] -_037F89BC: - cmp r8, #0 - strne r1, [r8] - strne ip, [r8, #8] - strne r3, [r8, #4] -_037F89CC: - mov r0, r0, lsr #1 - add r9, r9, #1 - cmp r9, #25 - blt _037F8974 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037F89E8: .word OS_IRQTable -_037F89EC: .word _03807774 -_037F89F0: .word OSi_IrqCallbackInfo - - arm_func_start OS_InitIrqTable -OS_InitIrqTable: ; 0x037F89F4 - mov r1, #0 - ldr r0, _037F8A10 ; =OSi_IrqThreadQueue - str r1, [r0, #4] - str r1, [r0] - ldr r0, _037F8A14 ; =0x027FFC3C - str r1, [r0] - bx lr -_037F8A10: .word OSi_IrqThreadQueue -_037F8A14: .word 0x027FFC3C - - arm_func_start OS_UnLockCartridge -OS_UnLockCartridge: ; 0x037F8A18 - ldr r1, _037F8A20 ; =OS_UnlockCartridge - bx r1 -_037F8A20: .word OS_UnlockCartridge - - arm_func_start OS_GetLockID -OS_GetLockID: ; 0x037F8A24 - ldr r3, _037F8AB4 ; =0x027FFFB8 - ldr r1, [r3] - mov r2, #0 - mov r0, #-2147483648 ; 0x80000000 -_037F8A34: - tst r1, r0 - bne _037F8A50 - add r2, r2, #1 - cmp r2, #32 - beq _037F8A50 - mov r0, r0, lsr #1 - b _037F8A34 -_037F8A50: - cmp r2, #32 - movne r0, #128 ; 0x80 - bne _037F8A98 - add r3, r3, #4 - ldr r1, [r3] - mov r2, #0 - mov r0, #-2147483648 ; 0x80000000 -_037F8A6C: - tst r1, r0 - bne _037F8A88 - add r2, r2, #1 - cmp r2, #32 - beq _037F8A88 - mov r0, r0, lsr #1 - b _037F8A6C -_037F8A88: - cmp r2, #32 - ldr r0, _037F8AB8 ; =0xFFFFFFFD - bxeq lr - mov r0, #160 ; 0xa0 -_037F8A98: - add r0, r0, r2 - mov r1, #-2147483648 ; 0x80000000 - mov r1, r1, lsr r2 - ldr r2, [r3] - bic r2, r2, r1 - str r2, [r3] - bx lr -_037F8AB4: .word 0x027FFFB8 -_037F8AB8: .word 0xFFFFFFFD - - arm_func_start OS_ReleaseLockID -OS_ReleaseLockID: ; 0x037F8ABC - ldr r3, _037F8AE8 ; =0x027FFFB8 - cmp r0, #160 ; 0xa0 - addpl r3, r3, #4 - subpl r0, r0, #160 ; 0xa0 - submi r0, r0, #128 ; 0x80 - mov r1, #-2147483648 ; 0x80000000 - mov r1, r1, lsr r0 - ldr r2, [r3] - orr r2, r2, r1 - str r2, [r3] - bx lr -_037F8AE8: .word 0x027FFFB8 - - arm_func_start OS_ReadOwnerOfLockWord -OS_ReadOwnerOfLockWord: ; 0x037F8AEC - ldrh r0, [r0, #4] - bx lr -_037F8AF4: - bx lr -_037F8AF8: - bx lr - - arm_func_start OS_TryLockCartridge -OS_TryLockCartridge: ; 0x037F8AFC - ldr r1, _037F8B10 ; =0x027FFFE8 - ldr r2, _037F8B14 ; =_037F8AF8 - mov r3, #1 - ldr ip, _037F8B18 ; =FUN_037F8B5C - bx ip -_037F8B10: .word 0x027FFFE8 -_037F8B14: .word _037F8AF8 -_037F8B18: .word FUN_037F8B5C - - arm_func_start OS_UnlockCartridge -OS_UnlockCartridge: ; 0x037F8B1C - ldr r1, _037F8B30 ; =0x027FFFE8 - ldr r2, _037F8B34 ; =_037F8AF4 - mov r3, #1 - ldr ip, _037F8B38 ; =FUN_037F8BE0 - bx ip -_037F8B30: .word 0x027FFFE8 -_037F8B34: .word _037F8AF4 -_037F8B38: .word FUN_037F8BE0 - - arm_func_start OS_LockCartridge -OS_LockCartridge: ; 0x037F8B3C - ldr r1, _037F8B50 ; =0x027FFFE8 - ldr r2, _037F8B54 ; =_037F8AF8 - mov r3, #1 - ldr ip, _037F8B58 ; =FUN_037F8C6C - bx ip -_037F8B50: .word 0x027FFFE8 -_037F8B54: .word _037F8AF8 -_037F8B58: .word FUN_037F8C6C - - arm_func_start FUN_037F8B5C -FUN_037F8B5C: ; 0x037F8B5C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, r0 - mov r8, r1 - mov r7, r2 - movs r6, r3 - beq _037F8B84 - bl OS_DisableInterrupts_IrqAndFiq - mov r5, r0 - b _037F8B8C -_037F8B84: - bl OS_DisableInterrupts - mov r5, r0 -_037F8B8C: - mov r0, r9 - mov r1, r8 - bl MI_SwapWord - movs r4, r0 - bne _037F8BB4 - cmp r7, #0 - beq _037F8BB0 - mov lr, pc - bx r7 -_037F8BB0: - strh r9, [r8, #4] -_037F8BB4: - cmp r6, #0 - beq _037F8BC8 - mov r0, r5 - bl OS_RestoreInterrupts_IrqAndFiq - b _037F8BD0 -_037F8BC8: - mov r0, r5 - bl OS_RestoreInterrupts -_037F8BD0: - mov r0, r4 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr - - arm_func_start FUN_037F8BE0 -FUN_037F8BE0: ; 0x037F8BE0 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r1 - mov r6, r2 - mov r5, r3 - ldrh r1, [r7, #4] - cmp r0, r1 - mvnne r0, #1 - bne _037F8C60 - cmp r5, #0 - beq _037F8C18 - bl OS_DisableInterrupts_IrqAndFiq - mov r4, r0 - b _037F8C20 -_037F8C18: - bl OS_DisableInterrupts - mov r4, r0 -_037F8C20: - mov r0, #0 - strh r0, [r7, #4] - cmp r6, #0 - beq _037F8C38 - mov lr, pc - bx r6 -_037F8C38: - mov r0, #0 - str r0, [r7] - cmp r5, #0 - beq _037F8C54 - mov r0, r4 - bl OS_RestoreInterrupts_IrqAndFiq - b _037F8C5C -_037F8C54: - mov r0, r4 - bl OS_RestoreInterrupts -_037F8C5C: - mov r0, #0 -_037F8C60: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start FUN_037F8C6C -FUN_037F8C6C: ; 0x037F8C6C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - mov r4, #1024 ; 0x400 - b _037F8C90 -_037F8C88: - mov r0, r4 - bl FUN_037F8CB4 -_037F8C90: - mov r0, r8 - mov r1, r7 - mov r2, r6 - mov r3, r5 - bl FUN_037F8B5C - cmp r0, #0 - bgt _037F8C88 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr - - arm_func_start FUN_037F8CB4 -FUN_037F8CB4: ; 0x037F8CB4 - ldr ip, _037F8CBC ; =SVC_WaitByLoop - bx ip -_037F8CBC: .word SVC_WaitByLoop - - arm_func_start OS_InitLock -OS_InitLock: ; 0x037F8CC0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - ldr r0, _037F8D38 ; =_03807780 - ldr r1, [r0] - cmp r1, #0 - bne _037F8D2C - mov r1, #1 - str r1, [r0] - mov r0, #0 - ldr r4, _037F8D3C ; =0x027FFFF0 - strh r0, [r4, #6] - mov r5, #1024 ; 0x400 - b _037F8CFC -_037F8CF4: - mov r0, r5 - bl FUN_037F8CB4 -_037F8CFC: - ldrh r0, [r4, #4] - cmp r0, #127 ; 0x7f - bne _037F8CF4 - mvn r1, #0 - ldr r0, _037F8D40 ; =0x027FFFB8 - str r1, [r0] - mov r0, #65536 ; 0x10000 - rsb r1, r0, #0 - ldr r0, _037F8D44 ; =0x027FFFBC - str r1, [r0] - mov r0, #191 ; 0xbf - strh r0, [r4, #6] -_037F8D2C: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8D38: .word _03807780 -_037F8D3C: .word 0x027FFFF0 -_037F8D40: .word 0x027FFFB8 -_037F8D44: .word 0x027FFFBC - - arm_func_start OS_SetThreadDestructor -OS_SetThreadDestructor: ; 0x037F8D48 - str r1, [r0, #152] ; 0x98 - bx lr - - arm_func_start OS_EnableScheduler -OS_EnableScheduler: ; 0x037F8D50 - stmdb sp!, {r4, lr} - bl OS_DisableInterrupts - mov r4, #0 - ldr r1, _037F8D84 ; =OSi_RescheduleCount - ldr r3, [r1] - cmp r3, #0 - subne r2, r3, #1 - strne r2, [r1] - movne r4, r3 - bl OS_RestoreInterrupts - mov r0, r4 - ldmia sp!, {r4, lr} - bx lr -_037F8D84: .word OSi_RescheduleCount - - arm_func_start OS_DisableScheduler -OS_DisableScheduler: ; 0x037F8D88 - stmdb sp!, {r4, lr} - bl OS_DisableInterrupts - ldr r2, _037F8DBC ; =OSi_RescheduleCount - ldr r3, [r2] - mvn r1, #0 - cmp r3, r1 - addcc r1, r3, #1 - strcc r1, [r2] - movcc r4, r3 - bl OS_RestoreInterrupts - mov r0, r4 - ldmia sp!, {r4, lr} - bx lr -_037F8DBC: .word OSi_RescheduleCount - - arm_func_start OS_SetSwitchThreadCallback -OS_SetSwitchThreadCallback: ; 0x037F8DC0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - ldr r1, _037F8DF0 ; =OSi_ThreadInfo - ldr r4, [r1, #12] - str r5, [r1, #12] - bl OS_RestoreInterrupts - mov r0, r4 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8DF0: .word OSi_ThreadInfo -_037F8DF4: - ldr r2, [r0] - mov r1, #0 - str r1, [r0] - str r1, [r2, #148] ; 0x94 - mov r0, r2 - ldr ip, _037F8E10 ; =OS_WakeupThreadDirect - bx ip -_037F8E10: .word OS_WakeupThreadDirect - - arm_func_start OS_Sleep -OS_Sleep: ; 0x037F8E14 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #52 ; 0x34 - mov r5, r0 - add r0, sp, #8 - bl OS_CreateAlarm - ldr r0, _037F8EAC ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r0, [r0] - str r0, [sp, #4] - bl OS_DisableInterrupts - mov r4, r0 - add r0, sp, #8 - ldr r1, [sp, #4] - str r0, [r1, #148] ; 0x94 - add r1, sp, #4 - str r1, [sp] - mov r2, #0 - ldr r1, _037F8EB0 ; =0x000082EA - umull ip, r3, r5, r1 - mla r3, r5, r2, r3 - mla r3, r2, r1, r3 - mov r2, r3, lsr #6 - mov r1, ip, lsr #6 - orr r1, r1, r3, lsl #26 - ldr r3, _037F8EB4 ; =_037F8DF4 - bl OS_SetAlarm - mov r5, #0 - b _037F8E8C -_037F8E84: - mov r0, r5 - bl OS_SleepThread -_037F8E8C: - ldr r0, [sp, #4] - cmp r0, #0 - bne _037F8E84 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #52 ; 0x34 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8EAC: .word OSi_CurrentThreadPtr -_037F8EB0: .word 0x000082EA -_037F8EB4: .word _037F8DF4 - - arm_func_start OS_SetThreadPriority -OS_SetThreadPriority: ; 0x037F8EB8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r0 - mov r5, r1 - ldr r0, _037F8F60 ; =OSi_ThreadInfo - ldr r8, [r0, #8] - mov r7, #0 - bl OS_DisableInterrupts - mov r4, r0 - b _037F8EE4 -_037F8EDC: - mov r7, r8 - ldr r8, [r8, #76] ; 0x4c -_037F8EE4: - cmp r8, #0 - beq _037F8EF4 - cmp r8, r6 - bne _037F8EDC -_037F8EF4: - cmp r8, #0 - beq _037F8F08 - ldr r0, _037F8F64 ; =OSi_IdleThread - cmp r8, r0 - bne _037F8F18 -_037F8F08: - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0 - b _037F8F58 -_037F8F18: - ldr r0, [r8, #84] ; 0x54 - cmp r0, r5 - beq _037F8F4C - cmp r7, #0 - ldreq r1, [r6, #76] ; 0x4c - ldreq r0, _037F8F60 ; =OSi_ThreadInfo - streq r1, [r0, #8] - ldrne r0, [r6, #76] ; 0x4c - strne r0, [r7, #76] ; 0x4c - str r5, [r6, #84] ; 0x54 - mov r0, r6 - bl FUN_037F9584 - bl FUN_037F945C -_037F8F4C: - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #1 -_037F8F58: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037F8F60: .word OSi_ThreadInfo -_037F8F64: .word OSi_IdleThread - - arm_func_start OS_RescheduleThread -OS_RescheduleThread: ; 0x037F8F68 - stmdb sp!, {r4, lr} - bl OS_DisableInterrupts - mov r4, r0 - bl FUN_037F945C - mov r0, r4 - bl OS_RestoreInterrupts - ldmia sp!, {r4, lr} - bx lr - - arm_func_start OS_SelectThread -OS_SelectThread: ; 0x037F8F88 - ldr r0, _037F8FB0 ; =OSi_ThreadInfo - ldr r0, [r0, #8] - b _037F8F98 -_037F8F94: - ldr r0, [r0, #76] ; 0x4c -_037F8F98: - cmp r0, #0 - bxeq lr - ldr r1, [r0, #72] ; 0x48 - cmp r1, #1 - bne _037F8F94 - bx lr -_037F8FB0: .word OSi_ThreadInfo - - arm_func_start OS_WakeupThreadDirect -OS_WakeupThreadDirect: ; 0x037F8FB4 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - mov r0, #1 - str r0, [r5, #72] ; 0x48 - bl FUN_037F945C - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start OS_WakeupThread -OS_WakeupThread: ; 0x037F8FE8 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, [r5] - cmp r0, #0 - beq _037F9050 - mov r7, #1 - mov r6, #0 - b _037F9030 -_037F9014: - mov r0, r5 - bl FUN_037F967C - str r7, [r0, #72] ; 0x48 - str r6, [r0, #92] ; 0x5c - str r6, [r0, #100] ; 0x64 - ldr r1, [r0, #100] ; 0x64 - str r1, [r0, #96] ; 0x60 -_037F9030: - ldr r0, [r5] - cmp r0, #0 - bne _037F9014 - mov r0, #0 - str r0, [r5, #4] - ldr r0, [r5, #4] - str r0, [r5] - bl FUN_037F945C -_037F9050: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start OS_SleepThread -OS_SleepThread: ; 0x037F9064 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - bl OS_DisableInterrupts - mov r5, r0 - ldr r0, _037F90B4 ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r4, [r0] - cmp r6, #0 - beq _037F9098 - str r6, [r4, #92] ; 0x5c - mov r0, r6 - mov r1, r4 - bl FUN_037F96B0 -_037F9098: - mov r0, #0 - str r0, [r4, #72] ; 0x48 - bl FUN_037F945C - mov r0, r5 - bl OS_RestoreInterrupts - ldmia sp!, {r4, r5, r6, lr} - bx lr -_037F90B4: .word OSi_CurrentThreadPtr - - arm_func_start OS_IsThreadTerminated -OS_IsThreadTerminated: ; 0x037F90B8 - ldr r0, [r0, #72] ; 0x48 - cmp r0, #2 - moveq r0, #1 - movne r0, #0 - bx lr - - arm_func_start OS_JoinThread -OS_JoinThread: ; 0x037F90CC - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, [r5, #72] ; 0x48 - cmp r0, #2 - beq _037F90F4 - add r0, r5, #128 ; 0x80 - bl OS_SleepThread -_037F90F4: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start FUN_037F9108 -FUN_037F9108: ; 0x037F9108 - stmdb sp!, {r4, lr} - ldr r0, _037F9164 ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r4, [r0] - bl OS_DisableScheduler - mov r0, r4 - bl OSi_UnlockAllMutex - ldr r0, [r4, #92] ; 0x5c - cmp r0, #0 - beq _037F9138 - mov r1, r4 - bl FUN_037F961C -_037F9138: - mov r0, r4 - bl FUN_037F953C - mov r0, #2 - str r0, [r4, #72] ; 0x48 - add r0, r4, #128 ; 0x80 - bl OS_WakeupThread - bl OS_EnableScheduler - bl OS_RescheduleThread - bl FUN_037FB1F0 - ldmia sp!, {r4, lr} - bx lr -_037F9164: .word OSi_CurrentThreadPtr - - arm_func_start FUN_037F9168 -FUN_037F9168: ; 0x037F9168 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037F91AC ; =OSi_CurrentThreadPtr - ldr r1, [r1] - ldr r3, [r1] - ldr r2, [r3, #152] ; 0x98 - cmp r2, #0 - beq _037F919C - mov r1, #0 - str r1, [r3, #152] ; 0x98 - mov lr, pc - bx r2 - bl OS_DisableInterrupts -_037F919C: - bl FUN_037F9108 - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F91AC: .word OSi_CurrentThreadPtr - - arm_func_start FUN_037F91B0 -FUN_037F91B0: ; 0x037F91B0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, r1 - ldr r1, _037F9210 ; =OSi_StackForDestructor - ldr r2, [r1] - cmp r2, #0 - beq _037F91FC - ldr r1, _037F9214 ; =FUN_037F9168 - bl OS_InitContext - str r4, [r5, #4] - ldr r0, [r5] - orr r0, r0, #128 ; 0x80 - str r0, [r5] - mov r0, #1 - str r0, [r5, #72] ; 0x48 - mov r0, r5 - bl OS_LoadContext - b _037F9204 -_037F91FC: - mov r0, r4 - bl FUN_037F9168 -_037F9204: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F9210: .word OSi_StackForDestructor -_037F9214: .word FUN_037F9168 - - arm_func_start OS_ExitThread -OS_ExitThread: ; 0x037F9218 - stmfd sp!, {lr} - sub sp, sp, #4 - bl OS_DisableInterrupts - ldr r0, _037F9240 ; =OSi_ThreadInfo - ldr r0, [r0, #4] - mov r1, #0 - bl FUN_037F91B0 - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F9240: .word OSi_ThreadInfo - - arm_func_start OS_CreateThread -OS_CreateThread: ; 0x037F9244 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, r0 - mov r8, r1 - mov r7, r2 - mov r6, r3 - bl OS_DisableInterrupts - mov r4, r0 - bl FUN_037F9728 - ldr r1, [sp, #36] ; 0x24 - str r1, [r9, #84] ; 0x54 - str r0, [r9, #80] ; 0x50 - mov r0, #0 - str r0, [r9, #72] ; 0x48 - str r0, [r9, #88] ; 0x58 - mov r0, r9 - bl FUN_037F9584 - str r6, [r9, #120] ; 0x78 - ldr r0, [sp, #32] - sub r5, r6, r0 - str r5, [r9, #116] ; 0x74 - mov r2, #0 - str r2, [r9, #124] ; 0x7c - ldr r1, _037F9348 ; =0xD73BFDF7 - ldr r0, [r9, #120] ; 0x78 - str r1, [r0, #-4] - ldr r1, _037F934C ; =0xFBDD37BB - ldr r0, [r9, #116] ; 0x74 - str r1, [r0] - str r2, [r9, #132] ; 0x84 - ldr r0, [r9, #132] ; 0x84 - str r0, [r9, #128] ; 0x80 - mov r0, r9 - mov r1, r8 - sub r2, r6, #4 - bl OS_InitContext - str r7, [r9, #4] - ldr r0, _037F9350 ; =OS_ExitThread - str r0, [r9, #60] ; 0x3c - mov r0, #0 - add r1, r5, #4 - ldr r2, [sp, #32] - sub r2, r2, #8 - bl MIi_CpuClear32 - mov r1, #0 - str r1, [r9, #104] ; 0x68 - str r1, [r9, #108] ; 0x6c - str r1, [r9, #112] ; 0x70 - mov r0, r9 - bl OS_SetThreadDestructor - mov r0, #0 - str r0, [r9, #92] ; 0x5c - str r0, [r9, #100] ; 0x64 - ldr r1, [r9, #100] ; 0x64 - str r1, [r9, #96] ; 0x60 - add r1, r9, #136 ; 0x88 - mov r2, #12 - bl MIi_CpuClear32 - mov r0, #0 - str r0, [r9, #148] ; 0x94 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037F9348: .word 0xD73BFDF7 -_037F934C: .word 0xFBDD37BB -_037F9350: .word OS_ExitThread - - arm_func_start OS_InitThread -OS_InitThread: ; 0x037F9354 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037F942C ; =OSi_IsThreadInitialized - ldr r1, [r0] - cmp r1, #0 - bne _037F9420 - mov r2, #1 - str r2, [r0] - ldr r1, _037F9430 ; =_038077A0 - ldr r0, _037F9434 ; =OSi_CurrentThreadPtr - str r1, [r0] - mov r0, #16 - ldr r1, _037F9438 ; =OSi_LauncherThread - str r0, [r1, #84] ; 0x54 - mov r0, #0 - str r0, [r1, #80] ; 0x50 - str r2, [r1, #72] ; 0x48 - str r0, [r1, #76] ; 0x4c - str r0, [r1, #88] ; 0x58 - ldr r0, _037F943C ; =OSi_ThreadInfo - str r1, [r0, #8] - str r1, [r0, #4] - ldr r2, _037F9440 ; =0x00000400 - cmp r2, #0 - ldrle r0, _037F9444 ; =FUN_037F8000 - suble r2, r0, r2 - ldrgt r1, _037F9448 ; =0x00000400 - ldrgt r0, _037F944C ; =0x0380FF80 - subgt r0, r0, r1 - subgt r2, r0, r2 - ldr r1, _037F9448 ; =0x00000400 - ldr r0, _037F944C ; =0x0380FF80 - sub r3, r0, r1 - ldr r1, _037F9438 ; =OSi_LauncherThread - str r3, [r1, #120] ; 0x78 - str r2, [r1, #116] ; 0x74 - mov r0, #0 - str r0, [r1, #124] ; 0x7c - ldr r2, _037F9450 ; =0xD73BFDF7 - str r2, [r3, #-4] - ldr r3, _037F9454 ; =0xFBDD37BB - ldr r2, [r1, #116] ; 0x74 - str r3, [r2] - str r0, [r1, #132] ; 0x84 - str r0, [r1, #128] ; 0x80 - ldr r1, _037F943C ; =OSi_ThreadInfo - strh r0, [r1] - strh r0, [r1, #2] - ldr r2, _037F9458 ; =0x027FFFA4 - str r1, [r2] - bl OS_SetSwitchThreadCallback -_037F9420: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F942C: .word OSi_IsThreadInitialized -_037F9430: .word _038077A0 -_037F9434: .word OSi_CurrentThreadPtr -_037F9438: .word OSi_LauncherThread -_037F943C: .word OSi_ThreadInfo -_037F9440: .word 0x00000400 -_037F9444: .word FUN_037F8000 -_037F9448: .word 0x00000400 -_037F944C: .word 0x0380FF80 -_037F9450: .word 0xD73BFDF7 -_037F9454: .word 0xFBDD37BB -_037F9458: .word 0x027FFFA4 - - arm_func_start FUN_037F945C -FUN_037F945C: ; 0x037F945C - stmdb sp!, {r4, r5, r6, lr} - ldr r0, _037F952C ; =OSi_RescheduleCount - ldr r0, [r0] - cmp r0, #0 - bne _037F9524 - ldr r4, _037F9530 ; =OSi_ThreadInfo - ldrh r0, [r4, #2] - cmp r0, #0 - bne _037F948C - bl OS_GetProcMode - cmp r0, #18 - bne _037F9498 -_037F948C: - mov r0, #1 - strh r0, [r4] - b _037F9524 -_037F9498: - ldr r0, _037F9534 ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r6, [r0] - bl OS_SelectThread - mov r5, r0 - cmp r6, r5 - beq _037F9524 - cmp r5, #0 - beq _037F9524 - ldr r0, [r6, #72] ; 0x48 - cmp r0, #2 - beq _037F94D8 - mov r0, r6 - bl OS_SaveContext - cmp r0, #0 - bne _037F9524 -_037F94D8: - ldr r0, _037F9538 ; =OSi_SystemCallbackInSwitchThread - ldr r2, [r0] - cmp r2, #0 - beq _037F94F8 - mov r0, r6 - mov r1, r5 - mov lr, pc - bx r2 -_037F94F8: - ldr r2, [r4, #12] - cmp r2, #0 - beq _037F9514 - mov r0, r6 - mov r1, r5 - mov lr, pc - bx r2 -_037F9514: - ldr r0, _037F9530 ; =OSi_ThreadInfo - str r5, [r0, #4] - mov r0, r5 - bl OS_LoadContext -_037F9524: - ldmia sp!, {r4, r5, r6, lr} - bx lr -_037F952C: .word OSi_RescheduleCount -_037F9530: .word OSi_ThreadInfo -_037F9534: .word OSi_CurrentThreadPtr -_037F9538: .word OSi_SystemCallbackInSwitchThread - - arm_func_start FUN_037F953C -FUN_037F953C: ; 0x037F953C - ldr r1, _037F9580 ; =OSi_ThreadInfo - ldr r2, [r1, #8] - mov r1, #0 - b _037F9554 -_037F954C: - mov r1, r2 - ldr r2, [r2, #76] ; 0x4c -_037F9554: - cmp r2, #0 - beq _037F9564 - cmp r2, r0 - bne _037F954C -_037F9564: - cmp r1, #0 - ldreq r1, [r0, #76] ; 0x4c - ldreq r0, _037F9580 ; =OSi_ThreadInfo - streq r1, [r0, #8] - ldrne r0, [r0, #76] ; 0x4c - strne r0, [r1, #76] ; 0x4c - bx lr -_037F9580: .word OSi_ThreadInfo - - arm_func_start FUN_037F9584 -FUN_037F9584: ; 0x037F9584 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037F95E8 ; =OSi_ThreadInfo - ldr r3, [r1, #8] - mov lr, r3 - mov ip, #0 - b _037F95A8 -_037F95A0: - mov ip, lr - ldr lr, [lr, #76] ; 0x4c -_037F95A8: - cmp lr, #0 - beq _037F95C0 - ldr r2, [lr, #84] ; 0x54 - ldr r1, [r0, #84] ; 0x54 - cmp r2, r1 - bcc _037F95A0 -_037F95C0: - cmp ip, #0 - streq r3, [r0, #76] ; 0x4c - ldreq r1, _037F95E8 ; =OSi_ThreadInfo - streq r0, [r1, #8] - ldrne r1, [ip, #76] ; 0x4c - strne r1, [r0, #76] ; 0x4c - strne r0, [ip, #76] ; 0x4c - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F95E8: .word OSi_ThreadInfo - - arm_func_start OSi_RemoveMutexLinkFromQueue -OSi_RemoveMutexLinkFromQueue: ; 0x037F95EC - ldr r2, [r0] - cmp r2, #0 - beq _037F9614 - ldr r1, [r2, #16] - str r1, [r0] - cmp r1, #0 - movne r0, #0 - strne r0, [r1, #20] - moveq r1, #0 - streq r1, [r0, #4] -_037F9614: - mov r0, r2 - bx lr - - arm_func_start FUN_037F961C -FUN_037F961C: ; 0x037F961C - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r2, [r0] - mov lr, r2 - b _037F9664 -_037F9630: - ldr ip, [lr, #100] ; 0x64 - cmp lr, r1 - bne _037F9660 - ldr r3, [lr, #96] ; 0x60 - cmp r2, lr - streq ip, [r0] - strne ip, [r3, #100] ; 0x64 - ldr r1, [r0, #4] - cmp r1, lr - streq r3, [r0, #4] - strne r3, [ip, #96] ; 0x60 - b _037F966C -_037F9660: - mov lr, ip -_037F9664: - cmp lr, #0 - bne _037F9630 -_037F966C: - mov r0, lr - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - - arm_func_start FUN_037F967C -FUN_037F967C: ; 0x037F967C - ldr r2, [r0] - cmp r2, #0 - beq _037F96A8 - ldr r1, [r2, #100] ; 0x64 - str r1, [r0] - cmp r1, #0 - movne r0, #0 - strne r0, [r1, #96] ; 0x60 - moveq r1, #0 - streq r1, [r0, #4] - streq r1, [r2, #92] ; 0x5c -_037F96A8: - mov r0, r2 - bx lr - - arm_func_start FUN_037F96B0 -FUN_037F96B0: ; 0x037F96B0 - ldr ip, [r0] - b _037F96C4 -_037F96B8: - cmp ip, r1 - bxeq lr - ldr ip, [ip, #100] ; 0x64 -_037F96C4: - cmp ip, #0 - beq _037F96DC - ldr r3, [ip, #84] ; 0x54 - ldr r2, [r1, #84] ; 0x54 - cmp r3, r2 - bls _037F96B8 -_037F96DC: - cmp ip, #0 - bne _037F9708 - ldr r2, [r0, #4] - cmp r2, #0 - streq r1, [r0] - strne r1, [r2, #100] ; 0x64 - str r2, [r1, #96] ; 0x60 - mov r2, #0 - str r2, [r1, #100] ; 0x64 - str r1, [r0, #4] - bx lr -_037F9708: - ldr r2, [ip, #96] ; 0x60 - cmp r2, #0 - streq r1, [r0] - strne r1, [r2, #100] ; 0x64 - str r2, [r1, #96] ; 0x60 - str ip, [r1, #100] ; 0x64 - str r1, [ip, #96] ; 0x60 - bx lr - - arm_func_start FUN_037F9728 -FUN_037F9728: ; 0x037F9728 - ldr r1, _037F973C ; =_0380778C - ldr r0, [r1] - add r0, r0, #1 - str r0, [r1] - bx lr -_037F973C: .word _0380778C - - arm_func_start OS_InitContext -OS_InitContext: ; 0x037F9740 - add r1, r1, #4 - str r1, [r0, #64] ; 0x40 - str r2, [r0, #68] ; 0x44 - sub r2, r2, #64 ; 0x40 - tst r2, #4 - subne r2, r2, #4 - str r2, [r0, #56] ; 0x38 - ands r1, r1, #1 - movne r1, #63 ; 0x3f - moveq r1, #31 - str r1, [r0] - mov r1, #0 - str r1, [r0, #4] - str r1, [r0, #8] - str r1, [r0, #12] - str r1, [r0, #16] - str r1, [r0, #20] - str r1, [r0, #24] - str r1, [r0, #28] - str r1, [r0, #32] - str r1, [r0, #36] ; 0x24 - str r1, [r0, #40] ; 0x28 - str r1, [r0, #44] ; 0x2c - str r1, [r0, #48] ; 0x30 - str r1, [r0, #52] ; 0x34 - str r1, [r0, #60] ; 0x3c - bx lr - - arm_func_start OS_SaveContext -OS_SaveContext: ; 0x037F97AC - add r1, r0, #0 - mrs r2, CPSR - str r2, [r1], #4 - mov r0, #211 ; 0xd3 - msr CPSR_c, r0 - str sp, [r1, #64] ; 0x40 - msr CPSR_c, r2 - mov r0, #1 - stmia r1, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr} - adr r0, OS_LoadContext - str r0, [r1, #60] ; 0x3c - mov r0, #0 - bx lr - - arm_func_start OS_LoadContext -OS_LoadContext: ; 0x037F97E0 - mrs r1, CPSR - bic r1, r1, #31 - orr r1, r1, #211 ; 0xd3 - msr CPSR_c, r1 - ldr r1, [r0], #4 - msr SPSR_fsxc, r1 - ldr sp, [r0, #64] ; 0x40 - ldr lr, [r0, #60] ; 0x3c - ldmia r0, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ - nop ; (mov r0, r0) - subs pc, lr, #4 - - arm_func_start OS_ReadMessage -OS_ReadMessage: ; 0x037F980C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - mov r4, r0 - and r8, r7, #1 - add r7, r6, #8 - b _037F9850 -_037F9830: - cmp r8, #0 - bne _037F9848 - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0 - b _037F987C -_037F9848: - mov r0, r7 - bl OS_SleepThread -_037F9850: - ldr r0, [r6, #28] - cmp r0, #0 - beq _037F9830 - cmp r5, #0 - ldrne r1, [r6, #16] - ldrne r0, [r6, #24] - ldrne r0, [r1, r0, lsl #2] - strne r0, [r5] - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #1 -_037F987C: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr - - arm_func_start OS_ReceiveMessage -OS_ReceiveMessage: ; 0x037F9884 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - mov r4, r0 - and r8, r7, #1 - add r7, r6, #8 - b _037F98C8 -_037F98A8: - cmp r8, #0 - bne _037F98C0 - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0 - b _037F991C -_037F98C0: - mov r0, r7 - bl OS_SleepThread -_037F98C8: - ldr r0, [r6, #28] - cmp r0, #0 - beq _037F98A8 - cmp r5, #0 - ldrne r1, [r6, #16] - ldrne r0, [r6, #24] - ldrne r0, [r1, r0, lsl #2] - strne r0, [r5] - ldr r0, [r6, #24] - add r0, r0, #1 - ldr r1, [r6, #20] - bl _s32_div_f - str r1, [r6, #24] - ldr r0, [r6, #28] - sub r0, r0, #1 - str r0, [r6, #28] - mov r0, r6 - bl OS_WakeupThread - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #1 -_037F991C: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr - - arm_func_start OS_SendMessage -OS_SendMessage: ; 0x037F9924 - 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 - and r7, r7, #1 - b _037F9968 -_037F9948: - cmp r7, #0 - bne _037F9960 - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0 - b _037F99AC -_037F9960: - mov r0, r6 - bl OS_SleepThread -_037F9968: - ldr r2, [r6, #28] - ldr r1, [r6, #20] - cmp r1, r2 - ble _037F9948 - ldr r0, [r6, #24] - add r0, r0, r2 - bl _s32_div_f - ldr r0, [r6, #16] - str r5, [r0, r1, lsl #2] - ldr r0, [r6, #28] - add r0, r0, #1 - str r0, [r6, #28] - add r0, r6, #8 - bl OS_WakeupThread - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #1 -_037F99AC: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start OS_InitMessageQueue -OS_InitMessageQueue: ; 0x037F99B8 - mov ip, #0 - str ip, [r0, #4] - ldr r3, [r0, #4] - str r3, [r0] - str ip, [r0, #12] - ldr r3, [r0, #12] - str r3, [r0, #8] - str r1, [r0, #16] - str r2, [r0, #20] - str ip, [r0, #24] - str ip, [r0, #28] - bx lr - - arm_func_start OSi_DequeueItem -OSi_DequeueItem: ; 0x037F99E8 - ldr r2, [r1, #16] - ldr r1, [r1, #20] - cmp r2, #0 - streq r1, [r0, #112] ; 0x70 - strne r1, [r2, #20] - cmp r1, #0 - streq r2, [r0, #108] ; 0x6c - strne r2, [r1, #16] - bx lr - - arm_func_start OSi_EnqueueTail -OSi_EnqueueTail: ; 0x037F9A0C - ldr r2, [r0, #112] ; 0x70 - cmp r2, #0 - streq r1, [r0, #108] ; 0x6c - strne r1, [r2, #16] - str r2, [r1, #20] - mov r2, #0 - str r2, [r1, #16] - str r1, [r0, #112] ; 0x70 - bx lr - - arm_func_start OSi_UnlockAllMutex -OSi_UnlockAllMutex: ; 0x037F9A30 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - add r5, r6, #108 ; 0x6c - mov r4, #0 - b _037F9A58 -_037F9A44: - mov r0, r5 - bl OSi_RemoveMutexLinkFromQueue - str r4, [r0, #12] - str r4, [r0, #8] - bl OS_WakeupThread -_037F9A58: - ldr r0, [r6, #108] ; 0x6c - cmp r0, #0 - bne _037F9A44 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start OS_UnlockMutex -OS_UnlockMutex: ; 0x037F9A6C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, _037F9AD8 ; =OSi_ThreadInfo - ldr r0, [r0, #4] - ldr r1, [r5, #8] - cmp r1, r0 - bne _037F9AC4 - ldr r1, [r5, #12] - sub r1, r1, #1 - str r1, [r5, #12] - ldr r1, [r5, #12] - cmp r1, #0 - bne _037F9AC4 - mov r1, r5 - bl OSi_DequeueItem - mov r0, #0 - str r0, [r5, #8] - mov r0, r5 - bl OS_WakeupThread -_037F9AC4: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F9AD8: .word OSi_ThreadInfo - - arm_func_start OS_LockMutex -OS_LockMutex: ; 0x037F9ADC - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, _037F9B64 ; =OSi_ThreadInfo - ldr r7, [r0, #4] - mov r6, #0 -_037F9AFC: - ldr r0, [r5, #8] - cmp r0, #0 - bne _037F9B28 - str r7, [r5, #8] - ldr r0, [r5, #12] - add r0, r0, #1 - str r0, [r5, #12] - mov r0, r7 - mov r1, r5 - bl OSi_EnqueueTail - b _037F9B50 -_037F9B28: - cmp r0, r7 - ldreq r0, [r5, #12] - addeq r0, r0, #1 - streq r0, [r5, #12] - beq _037F9B50 - str r5, [r7, #104] ; 0x68 - mov r0, r5 - bl OS_SleepThread - str r6, [r7, #104] ; 0x68 - b _037F9AFC -_037F9B50: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037F9B64: .word OSi_ThreadInfo - - arm_func_start OS_InitMutex -OS_InitMutex: ; 0x037F9B68 - mov r2, #0 - str r2, [r0, #4] - ldr r1, [r0, #4] - str r1, [r0] - str r2, [r0, #8] - str r2, [r0, #12] - bx lr - - arm_func_start OS_Init -OS_Init: ; 0x037F9B84 - stmfd sp!, {lr} - sub sp, sp, #4 - bl OS_InitArena - bl PXI_Init - bl OS_InitLock - bl OS_InitIrqTable - bl OS_InitTick - bl OS_InitAlarm - bl OS_InitThread - bl OS_InitReset - bl CTRDG_Init - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - - arm_func_start OS_SetArenaLo -OS_SetArenaLo: ; 0x037F9BBC - mov r0, r0, lsl #2 - add r0, r0, #40894464 ; 0x2700000 - add r0, r0, #1044480 ; 0xff000 - str r1, [r0, #3488] ; 0xda0 - bx lr - - arm_func_start OS_SetArenaHi -OS_SetArenaHi: ; 0x037F9BD0 - mov r0, r0, lsl #2 - add r0, r0, #40894464 ; 0x2700000 - add r0, r0, #1044480 ; 0xff000 - str r1, [r0, #3524] ; 0xdc4 - bx lr - - arm_func_start OS_GetInitArenaLo -OS_GetInitArenaLo: ; 0x037F9BE4 - cmp r0, #1 - beq _037F9C00 - cmp r0, #7 - beq _037F9C08 - cmp r0, #8 - beq _037F9C18 - b _037F9C2C -_037F9C00: - ldr r0, _037F9C34 ; =0x027FAFCC - bx lr -_037F9C08: - ldr r0, _037F9C38 ; =0x0380B92C - cmp r0, #58720256 ; 0x03800000 - movhi r0, #58720256 ; 0x03800000 - bx lr -_037F9C18: - mov r0, #58720256 ; 0x03800000 - ldr r1, _037F9C38 ; =0x0380B92C - cmp r1, #58720256 ; 0x03800000 - movhi r0, r1 - bx lr -_037F9C2C: - mov r0, #0 - bx lr -_037F9C34: .word 0x027FAFCC -_037F9C38: .word 0x0380B92C - - arm_func_start OS_GetInitArenaHi -OS_GetInitArenaHi: ; 0x037F9C3C - cmp r0, #1 - beq _037F9C58 - cmp r0, #7 - beq _037F9C60 - cmp r0, #8 - beq _037F9C68 - b _037F9CA0 -_037F9C58: - ldr r0, _037F9CA8 ; =0x027FF000 - bx lr -_037F9C60: - mov r0, #58720256 ; 0x03800000 - bx lr -_037F9C68: - ldr r1, _037F9CAC ; =0x00000400 - ldr r0, _037F9CB0 ; =0x0380FF80 - sub r2, r0, r1 - mov r0, #58720256 ; 0x03800000 - ldr r1, _037F9CB4 ; =0x0380B92C - cmp r1, #58720256 ; 0x03800000 - movhi r0, r1 - ldr r1, _037F9CB8 ; =0x00000400 - cmp r1, #0 - bxeq lr - cmp r1, #0 - sublt r0, r0, r1 - subge r0, r2, r1 - bx lr -_037F9CA0: - mov r0, #0 - bx lr -_037F9CA8: .word 0x027FF000 -_037F9CAC: .word 0x00000400 -_037F9CB0: .word 0x0380FF80 -_037F9CB4: .word 0x0380B92C -_037F9CB8: .word 0x00000400 - - arm_func_start OS_GetArenaLo -OS_GetArenaLo: ; 0x037F9CBC - mov r0, r0, lsl #2 - add r0, r0, #40894464 ; 0x2700000 - add r0, r0, #1044480 ; 0xff000 - ldr r0, [r0, #3488] ; 0xda0 - bx lr - - arm_func_start OS_GetArenaHi -OS_GetArenaHi: ; 0x037F9CD0 - mov r0, r0, lsl #2 - add r0, r0, #40894464 ; 0x2700000 - add r0, r0, #1044480 ; 0xff000 - ldr r0, [r0, #3524] ; 0xdc4 - bx lr - - arm_func_start OS_InitArena -OS_InitArena: ; 0x037F9CE4 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037F9D84 ; =_038078F4 - ldr r0, [r1] - cmp r0, #0 - bne _037F9D78 - mov r0, #1 - str r0, [r1] - bl OS_GetInitArenaHi - mov r1, r0 - mov r0, #1 - bl OS_SetArenaHi - mov r0, #1 - bl OS_GetInitArenaLo - mov r1, r0 - mov r0, #1 - bl OS_SetArenaLo - mov r0, #7 - bl OS_GetInitArenaHi - mov r1, r0 - mov r0, #7 - bl OS_SetArenaHi - mov r0, #7 - bl OS_GetInitArenaLo - mov r1, r0 - mov r0, #7 - bl OS_SetArenaLo - mov r0, #8 - bl OS_GetInitArenaHi - mov r1, r0 - mov r0, #8 - bl OS_SetArenaHi - mov r0, #8 - bl OS_GetInitArenaLo - mov r1, r0 - mov r0, #8 - bl OS_SetArenaLo -_037F9D78: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F9D84: .word _038078F4 - - 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} diff --git a/arm7/asm/main.s b/arm7/asm/main.s new file mode 100644 index 00000000..c12d04f6 --- /dev/null +++ b/arm7/asm/main.s @@ -0,0 +1,391 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start FUN_037F8000 +FUN_037F8000: ; 0x037F8000 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037F8028 ; =PMi_Initialized + ldr r0, [r0] + cmp r0, #0 + beq _037F801C + bl PM_SelfBlinkProc +_037F801C: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F8028: .word PMi_Initialized + + arm_func_start FUN_037F802C +FUN_037F802C: ; 0x037F802C + stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #4 + mov sl, r0 + mov r8, #0 + bl FUN_037F81E8 + cmp r0, #0 + beq _037F80F8 + bl FUN_037F81C4 + mov r7, r0 + mov r9, r8 + mov r4, #1 + mov fp, #138 ; 0x8a + mov r5, #112 ; 0x70 +_037F8060: + add r6, sl, r9, lsl #8 + ldr r0, _037F81B4 ; =0x0000FFFF + mov r1, r6 + mov r2, r5 + bl FUN_037F81B8 + mov r2, r6 + ldrh r1, [r2, #114] ; 0x72 + cmp r0, r1 + bne _037F80E0 + ldrh r0, [r2, #112] ; 0x70 + cmp r0, #128 ; 0x80 + bcs _037F80E0 + ldr r0, _037F81B4 ; =0x0000FFFF + add r1, r6, #116 ; 0x74 + mov r2, fp + bl FUN_037F81B8 + mov r3, r6 + ldrh r1, [r3, #254] ; 0xfe + cmp r0, r1 + bne _037F80E0 + ldrh r2, [r3, #118] ; 0x76 + ldrb r0, [r3, #117] ; 0x75 + mov r1, r4, lsl r0 + ands r1, r1, r2 + beq _037F80E0 + ands r1, r7, r2 + ldrneh r1, [r6, #100] ; 0x64 + bicne r1, r1, #7 + andne r0, r0, #7 + orrne r0, r1, r0 + strneh r0, [r6, #100] ; 0x64 + orr r8, r8, r4, lsl r9 +_037F80E0: + add r0, r9, #1 + mov r0, r0, lsl #16 + mov r9, r0, lsr #16 + cmp r9, #2 + bcc _037F8060 + b _037F8158 +_037F80F8: + bl FUN_037F81C4 + cmp r0, #0 + movne r0, #3 + bne _037F81A8 + mov r7, r8 + mov r4, #1 + ldr r6, _037F81B4 ; =0x0000FFFF + mov r5, #112 ; 0x70 +_037F8118: + mov r0, r6 + add r1, sl, r7, lsl #8 + mov r2, r5 + bl FUN_037F81B8 + add r2, sl, r7, lsl #8 + ldrh r1, [r2, #114] ; 0x72 + cmp r0, r1 + bne _037F8144 + ldrh r0, [r2, #112] ; 0x70 + cmp r0, #128 ; 0x80 + orrcc r8, r8, r4, lsl r7 +_037F8144: + add r0, r7, #1 + mov r0, r0, lsl #16 + mov r7, r0, lsr #16 + cmp r7, #2 + bcc _037F8118 +_037F8158: + cmp r8, #1 + beq _037F8174 + cmp r8, #2 + beq _037F8174 + cmp r8, #3 + beq _037F817C + b _037F81A4 +_037F8174: + mov r0, r8 + b _037F81A8 +_037F817C: + ldrh r0, [sl, #112] ; 0x70 + add r0, r0, #1 + and r0, r0, #127 ; 0x7f + and r1, r0, #255 ; 0xff + add r0, sl, #256 ; 0x100 + ldrh r0, [r0, #112] ; 0x70 + cmp r1, r0 + moveq r0, #2 + movne r0, #1 + b _037F81A8 +_037F81A4: + mov r0, #0 +_037F81A8: + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + bx lr +_037F81B4: .word 0x0000FFFF + + arm_func_start FUN_037F81B8 +FUN_037F81B8: ; 0x037F81B8 + ldr ip, _037F81C0 ; =SVC_GetCRC16 + bx ip +_037F81C0: .word SVC_GetCRC16 + + arm_func_start FUN_037F81C4 +FUN_037F81C4: ; 0x037F81C4 + mov r0, #0 + ldr r1, _037F81E4 ; =0x027FFE1D + ldrb r1, [r1] + cmp r1, #128 ; 0x80 + orreq r0, r0, #64 ; 0x40 + moveq r0, r0, lsl #16 + moveq r0, r0, lsr #16 + bx lr +_037F81E4: .word 0x027FFE1D + + arm_func_start FUN_037F81E8 +FUN_037F81E8: ; 0x037F81E8 + stmfd sp!, {lr} + sub sp, sp, #4 + mov r0, #29 + mov r1, #1 + add r2, sp, #0 + bl NVRAM_ReadDataBytes + ldrb r0, [sp] + cmp r0, #255 ; 0xff + moveq r0, #0 + beq _037F821C + ands r0, r0, #64 ; 0x40 + movne r0, #1 + moveq r0, #0 +_037F821C: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + + arm_func_start FUN_037F8228 +FUN_037F8228: ; 0x037F8228 + stmdb sp!, {r4, lr} + sub sp, sp, #528 ; 0x210 + mov r0, #32 + mov r1, #2 + add r2, sp, #4 + bl NVRAM_ReadDataBytes + ldr r0, [sp, #4] + mov r0, r0, lsl #3 + str r0, [sp, #4] + mov r1, #256 ; 0x100 + add r2, sp, #16 + bl NVRAM_ReadDataBytes + ldr r0, [sp, #4] + add r0, r0, #256 ; 0x100 + mov r1, #256 ; 0x100 + add r2, sp, #272 ; 0x110 + bl NVRAM_ReadDataBytes + add r0, sp, #16 + bl FUN_037F802C + cmp r0, #3 + blt _037F8290 + mvn r0, #0 + ldr r1, _037F83A4 ; =0x027FFC80 + mov r2, #116 ; 0x74 + bl MIi_CpuClear32 + b _037F834C +_037F8290: + cmp r0, #0 + beq _037F833C + mov r2, r0, lsl #8 + ldr r1, _037F83A8 ; =0xFFFFFF2A + add r1, sp, r1 + ldrb r1, [r1, r0, lsl #8] + cmp r1, #10 + bcs _037F82DC + mov ip, #10 + mov r3, #0 + add r1, sp, #16 + add r2, r1, r2 + b _037F82D0 +_037F82C4: + add r1, r2, ip, lsl #1 + strh r3, [r1, #-252] ; 0xffffff04 + sub ip, ip, #1 +_037F82D0: + ldrb r1, [r2, #-230] ; 0xffffff1a + cmp ip, r1 + bgt _037F82C4 +_037F82DC: + mov r2, r0, lsl #8 + ldr r1, _037F83AC ; =0xFFFFFF60 + add r1, sp, r1 + ldrb r1, [r1, r0, lsl #8] + cmp r1, #26 + bcs _037F8320 + mov ip, #26 + mov r3, #0 + add r1, sp, #16 + add r2, r1, r2 + b _037F8314 +_037F8308: + add r1, r2, ip, lsl #1 + strh r3, [r1, #-230] ; 0xffffff1a + sub ip, ip, #1 +_037F8314: + ldrb r1, [r2, #-176] ; 0xffffff50 + cmp ip, r1 + bgt _037F8308 +_037F8320: + add r1, sp, #16 + sub r0, r0, #1 + add r0, r1, r0, lsl #8 + ldr r1, _037F83A4 ; =0x027FFC80 + mov r2, #116 ; 0x74 + bl MIi_CpuCopy32 + b _037F834C +_037F833C: + mov r0, #0 + ldr r1, _037F83A4 ; =0x027FFC80 + mov r2, #116 ; 0x74 + bl MIi_CpuClear32 +_037F834C: + mov r0, #54 ; 0x36 + mov r1, #6 + add r2, sp, #8 + bl NVRAM_ReadDataBytes + ldr r0, _037F83A4 ; =0x027FFC80 + add r4, r0, #116 ; 0x74 + add r0, sp, #8 + mov r1, r4 + mov r2, #6 + bl MI_CpuCopy8 + mov r0, #60 ; 0x3c + mov r1, #2 + add r2, sp, #0 + bl NVRAM_ReadDataBytes + ldrh r0, [sp] + mov r0, r0, lsl #15 + mov r0, r0, lsr #16 + bl WMSP_GetAllowedChannel + strh r0, [r4, #6] + add sp, sp, #528 ; 0x210 + ldmia sp!, {r4, lr} + bx lr +_037F83A4: .word 0x027FFC80 +_037F83A8: .word 0xFFFFFF2A +_037F83AC: .word 0xFFFFFF60 + + arm_func_start FUN_037F83B0 +FUN_037F83B0: ; 0x037F83B0 + stmdb sp!, {r4, lr} + mov r0, #8 + bl OS_GetArenaHi + mov r4, r0 + mov r0, #8 + bl OS_GetArenaLo + mov r1, r0 + mov r0, #8 + mov r2, r4 + mov r3, #1 + bl OS_InitAlloc + mov r4, r0 + mov r0, #8 + bl OS_GetArenaHi + mov r2, r0 + mov r0, r4 + mov r1, #0 + sub r2, r2, r4 + bl MI_CpuFill8 + mov r0, #8 + mov r1, r4 + bl OS_SetArenaLo + mov r0, #8 + bl OS_GetArenaHi + mov r4, r0 + mov r0, #8 + bl OS_GetArenaLo + mov r1, r0 + mov r0, #8 + mov r2, r4 + bl OS_CreateHeap + movs r4, r0 + bpl _037F8438 + bl FUN_037FB1F0 +_037F8438: + mov r0, #8 + mov r1, r4 + bl OS_SetCurrentHeap + mov r0, #8 + mov r1, r4 + bl OS_CheckHeap + cmp r0, #8448 ; 0x2100 + bcs _037F845C + bl FUN_037FB1F0 +_037F845C: + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr + + arm_func_start NitroSpMain +NitroSpMain: ; 0x037F8468 + stmdb sp!, {r4, lr} + bl WVR_ShelterExtWram + bl OS_Init + bl OS_InitThread + bl FUN_037F8228 + bl PXI_Init + bl FUN_037F83B0 + mov r4, r0 + mov r0, #6 + bl SND_Init + bl PAD_InitXYButton + mov r0, #1 + ldr r1, _037F8524 ; =FUN_037F8000 + bl OS_SetIrqFunction + mov r0, #1 + bl OS_EnableIrqMask + ldr r1, _037F8528 ; =0x04000004 + ldrh r0, [r1] + ldrh r0, [r1] + orr r0, r0, #8 + strh r0, [r1] + ldr r1, _037F852C ; =0x04000208 + ldrh r0, [r1] + mov r0, #1 + strh r0, [r1] + bl OS_EnableInterrupts + mvn r0, #0 + bl FS_Init + mov r0, #15 + bl CARD_SetThreadPriority + mov r0, #12 + bl RTC_Init + mov r0, r4 + bl WVR_Init + mov r0, #2 + bl SPI_Init + mov r4, #0 +_037F84FC: + bl FUN_037F8530 + bl OS_IsResetOccurred + cmp r0, #0 + beq _037F8518 + mov r0, r4 + bl CTRDG_VibPulseEdgeUpdate + bl OS_ResetSystem +_037F8518: + bl CTRDG_CheckPullOut_Polling + bl CARD_CheckPullOut_Polling + b _037F84FC +_037F8524: .word FUN_037F8000 +_037F8528: .word 0x04000004 +_037F852C: .word 0x04000208 + + arm_func_start FUN_037F8530 +FUN_037F8530: ; 0x037F8530 + ldr ip, _037F8538 ; =SVC_Halt + bx ip +_037F8538: .word SVC_Halt diff --git a/arm7/global.inc b/arm7/global.inc index f80ee571..fc925f6c 100644 --- a/arm7/global.inc +++ b/arm7/global.inc @@ -15,6 +15,7 @@ ; .dtcm
.extern OS_IrqHandler_ThreadSwitch
+.extern OSi_EnterTimerCallback
.extern OSi_IrqVBlank
.extern OSi_IrqTimer3
.extern OSi_IrqTimer2
@@ -24,9 +25,37 @@ .extern OSi_IrqDma2
.extern OSi_IrqDma1
.extern OSi_IrqDma0
+.extern OSi_RemoveMutexLinkFromQueue
+.extern OSi_SetTimerReserved
+.extern OSi_UnlockAllMutex
.extern OS_IrqDummy
+.extern OS_CheckHeap
+.extern OS_CreateHeap
+.extern OS_CreateHeap
+.extern OS_DisableInterrupts_IrqAndFiq
.extern OS_DisableIrqMask
+.extern OS_EnableInterrupts
.extern OS_EnableIrqMask
+.extern OS_GetArenaHi
+.extern OS_GetArenaLo
+.extern OS_GetProcMode
+.extern OS_Init
+.extern OS_InitAlloc
+.extern OS_InitArena
+.extern OS_InitContext
+.extern OS_InitIrqTable
+.extern OS_InitLock
+.extern OS_InitReset
+.extern OS_InitThread
+.extern OS_IsResetOccurred
+.extern OS_IsTickAvailable
+.extern OS_LoadContext
+.extern OS_ResetRequestIrqMask
+.extern OS_ResetSystem
+.extern OS_RestoreInterrupts_IrqAndFiq
+.extern OS_SaveContext
+.extern OS_SetArenaLo
+.extern OS_SetCurrentHeap
.extern OS_SetIrqMask
.extern OS_SetIrqFunction
.extern OS_UnLockCartridge
@@ -36,6 +65,8 @@ .extern OS_TryLockCartridge
.extern OS_UnlockCartridge
.extern OS_LockCartridge
+.extern FUN_037F8000
+.extern FUN_037F8530
.extern FUN_037F8CB4
.extern OS_Sleep
.extern OS_WakeupThreadDirect
@@ -69,6 +100,7 @@ .extern MIi_CpuClearFast
.extern MIi_CpuCopyFast
.extern MI_CpuFill8
+.extern MI_SwapWord
.extern PXI_Init
.extern PXI_SendWordByFifo
.extern PXI_SetFifoRecvCallback
@@ -76,6 +108,7 @@ .extern EXIi_SetBitRcnt0L
.extern SND_EndSleep
.extern SND_BeginSleep
+.extern SND_Init
.extern SPI_Init
.extern PMi_ResetControl
.extern PMi_SetControl
@@ -177,6 +210,8 @@ .extern sMasterPan
.extern _03807660
.extern cardi_rom_header_addr
+.extern CARD_CheckPullOut_Polling
+.extern CARD_SetThreadPriority
.extern _03807668
.extern _0380766C
.extern PMi_LEDStatus
@@ -218,6 +253,7 @@ .extern _03807954
.extern _03807958
.extern _0380795C
+.extern PAD_InitXYButton
.extern PADi_XYButtonAvailable
.extern _038079E0
.extern sSurroundDecay
@@ -295,6 +331,7 @@ .extern _0380A4A4
.extern _0380AA64
.extern _0380B064
+.extern FS_Init
; .ext
.extern WMSP_GetIndicateThread
diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h new file mode 100644 index 00000000..5b3dfcc1 --- /dev/null +++ b/arm7/lib/include/OS_init.h @@ -0,0 +1,6 @@ +#ifndef POKEDIAMOND_OS_INIT_H +#define POKEDIAMOND_OS_INIT_H + +void OS_Init(void); + +#endif //POKEDIAMOND_OS_INIT_H diff --git a/arm7/lib/src/OS_init.c b/arm7/lib/src/OS_init.c new file mode 100644 index 00000000..082b3e70 --- /dev/null +++ b/arm7/lib/src/OS_init.c @@ -0,0 +1,25 @@ +#include "function_target.h" +#include "OS_init.h" + +extern void OS_InitArena(void); +extern void PXI_Init(void); +extern void OS_InitLock(void); +extern void OS_InitIrqTable(void); +extern void OS_InitTick(void); +extern void OS_InitAlarm(void); +extern void OS_InitThread(void); +extern void OS_InitReset(void); +extern void CTRDG_Init(void); + +ARM_FUNC void OS_Init(void) +{ + OS_InitArena(); + PXI_Init(); + OS_InitLock(); + OS_InitIrqTable(); + OS_InitTick(); + OS_InitAlarm(); + OS_InitThread(); + OS_InitReset(); + CTRDG_Init(); +} |