summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/Makefile48
-rw-r--r--arm7/arm7.lsf14
-rw-r--r--arm7/asm/OS_alloc.s427
-rw-r--r--arm7/asm/OS_arena.s149
-rw-r--r--arm7/asm/OS_context.s65
-rw-r--r--arm7/asm/OS_interrupt.s155
-rw-r--r--arm7/asm/OS_irqHandler.s111
-rw-r--r--arm7/asm/OS_irqTable.s132
-rw-r--r--arm7/asm/OS_message.s147
-rw-r--r--arm7/asm/OS_mutex.s131
-rw-r--r--arm7/asm/OS_spinLock.s272
-rw-r--r--arm7/asm/OS_thread.s767
-rw-r--r--arm7/asm/OS_tick.s138
-rw-r--r--arm7/asm/OS_timer.s14
-rw-r--r--arm7/asm/dtcm.s2862
-rw-r--r--arm7/asm/main.s391
-rw-r--r--arm7/global.inc37
-rw-r--r--arm7/lib/include/OS_init.h6
-rw-r--r--arm7/lib/src/OS_init.c25
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();
+}