diff options
author | red031000 <rubenru09@aol.com> | 2020-06-03 19:26:33 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-06-03 19:26:59 +0100 |
commit | 89fa3666e18a80632238471840de1df792409fcb (patch) | |
tree | 3c63952247f6223cf9a5f48f4ae8f0b5702137a4 | |
parent | e61df40bf88246093b97e265aa54b7dad0a101e6 (diff) |
split valarm and decomp system
-rw-r--r-- | arm7/arm7.lsf | 2 | ||||
-rw-r--r-- | arm7/asm/OS_valarm.s | 475 | ||||
-rw-r--r-- | arm7/asm/dtcm.s | 530 | ||||
-rw-r--r-- | arm7/lib/include/OS_init.h | 9 | ||||
-rw-r--r-- | arm7/lib/include/OS_system.h | 37 | ||||
-rw-r--r-- | arm7/lib/include/types.h | 50 | ||||
-rw-r--r-- | arm7/lib/src/OS_system.c | 65 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/OS_system.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/types.h | 6 |
10 files changed, 644 insertions, 550 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index bec96da5..8eb35da5 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -29,6 +29,8 @@ Autoload WRAM Object OS_timer.o Object OS_tick.o Object OS_alarm.o + Object OS_valarm.o + Object OS_system.o Object dtcm.o Object libsyscall.o Object dtcm2.o diff --git a/arm7/asm/OS_valarm.s b/arm7/asm/OS_valarm.s new file mode 100644 index 00000000..d538ad83 --- /dev/null +++ b/arm7/asm/OS_valarm.s @@ -0,0 +1,475 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OSi_GetVFrame +OSi_GetVFrame: ; 0x037FAA0C + stmdb sp!, {r4, lr} + mov r4, r0 + bl OS_DisableInterrupts + ldr r1, _037FAA50 ; =_03807940 + ldr r1, [r1] + cmp r4, r1 + ldrlt r1, _037FAA54 ; =_03807944 + ldrlt r2, [r1] + addlt r2, r2, #1 + strlt r2, [r1] + ldr r1, _037FAA50 ; =_03807940 + str r4, [r1] + bl OS_RestoreInterrupts + ldr r0, _037FAA54 ; =_03807944 + ldr r0, [r0] + ldmia sp!, {r4, lr} + bx lr +_037FAA50: .word _03807940 +_037FAA54: .word _03807944 + + arm_func_start OSi_CompareVCount +OSi_CompareVCount: ; 0x037FAA58 + ldr r3, [r0, #12] + subs r3, r1, r3 + ldrsh r1, [r0, #16] + sub r2, r2, r1 + bmi _037FAA7C + cmp r3, #0 + bne _037FAA84 + cmp r2, #0 + bge _037FAA84 +_037FAA7C: + mov r0, #0 + bx lr +_037FAA84: + cmp r2, #0 + ldrlt r1, _037FAAA4 ; =0x00000107 + addlt r2, r2, r1 + ldrsh r0, [r0, #18] + cmp r2, r0 + movle r0, #1 + movgt r0, #2 + bx lr +_037FAAA4: .word 0x00000107 + + arm_func_start OSi_VAlarmHandler +OSi_VAlarmHandler: ; 0x037FAAA8 + stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #4 + mov r0, #4 + bl OS_DisableIrqMask + ldr r2, _037FAC1C ; =0x04000004 + ldrh r0, [r2] + bic r0, r0, #32 + strh r0, [r2] + ldr r1, _037FAC20 ; =0x0380FFF8 + ldr r0, [r1] + orr r0, r0, #4 + str r0, [r1] + ldrh r2, [r2] + mov r0, r2, asr #8 + and r1, r0, #255 ; 0xff + mov r0, r2, lsl #1 + and r0, r0, #256 ; 0x100 + orr r0, r1, r0 + sub r0, r0, #1 + bl OSi_GetVFrame + ldr r9, _037FAC24 ; =0x04000006 + mov r6, #4 + ldr r5, _037FAC1C ; =0x04000004 + mov r4, #0 + ldr fp, _037FAC28 ; =_03807944 + b _037FAC00 +_037FAB10: + ldrh r8, [r9] + mov r0, r8 + bl OSi_GetVFrame + mov r7, r0 + mov r0, sl + mov r1, r7 + mov r2, r8 + bl OSi_CompareVCount + cmp r0, #0 + beq _037FAB4C + cmp r0, #1 + beq _037FAB8C + cmp r0, #2 + beq _037FABE4 + b _037FAC00 +_037FAB4C: + mov r0, sl + bl OSi_SetNextVAlarm + ldrh r1, [r9] + ldrsh r0, [sl, #16] + cmp r0, r1 + bne _037FAC10 + ldr r0, [sl, #12] + cmp r0, r7 + bne _037FAC10 + mov r0, r6 + bl OS_DisableIrqMask + ldrh r0, [r5] + bic r0, r0, #32 + strh r0, [r5] + mov r0, r6 + bl OS_ResetRequestIrqMask +_037FAB8C: + ldr r7, [sl] + mov r0, sl + bl FUN_037FAECC + str r4, [sl] + cmp r7, #0 + beq _037FABB0 + ldr r0, [sl, #4] + mov lr, pc + bx r7 +_037FABB0: + ldr r0, [sl, #28] + cmp r0, #0 + beq _037FAC00 + ldr r0, [sl, #36] ; 0x24 + cmp r0, #0 + bne _037FAC00 + str r7, [sl] + ldr r0, [fp] + add r0, r0, #1 + str r0, [sl, #12] + mov r0, sl + bl OSi_AppendVAlarm + b _037FAC00 +_037FABE4: + mov r0, sl + bl FUN_037FAECC + mov r0, sl + bl OSi_AppendVAlarm + ldr r0, [fp] + add r0, r0, #1 + str r0, [sl, #12] +_037FAC00: + ldr r0, _037FAC2C ; =_03807948 + ldr sl, [r0] + cmp sl, #0 + bne _037FAB10 +_037FAC10: + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + bx lr +_037FAC1C: .word 0x04000004 +_037FAC20: .word 0x0380FFF8 +_037FAC24: .word 0x04000006 +_037FAC28: .word _03807944 +_037FAC2C: .word _03807948 + + arm_func_start OS_CancelVAlarms +OS_CancelVAlarms: ; 0x037FAC30 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r7, r0 + bl OS_DisableInterrupts + mov r5, r0 + cmp r7, #0 + bne _037FAC50 + bl FUN_037FB1F0 +_037FAC50: + ldr r0, _037FACA8 ; =_03807948 + ldr r0, [r0] + cmp r0, #0 + ldrne r6, [r0, #24] + moveq r6, #0 + mov r4, #0 + b _037FAC8C +_037FAC6C: + ldr r1, [r0, #8] + cmp r1, r7 + bne _037FAC7C + bl OS_CancelVAlarm +_037FAC7C: + mov r0, r6 + cmp r6, #0 + ldrne r6, [r6, #24] + moveq r6, r4 +_037FAC8C: + cmp r0, #0 + bne _037FAC6C + mov r0, r5 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr +_037FACA8: .word _03807948 + + arm_func_start OS_CancelVAlarm +OS_CancelVAlarm: ; 0x037FACAC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + mov r1, #1 + str r1, [r5, #36] ; 0x24 + ldr r1, [r5] + cmp r1, #0 + bne _037FACDC + bl OS_RestoreInterrupts + b _037FACF4 +_037FACDC: + mov r0, r5 + bl FUN_037FAECC + mov r0, #0 + str r0, [r5] + mov r0, r4 + bl OS_RestoreInterrupts +_037FACF4: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + + arm_func_start OS_SetVAlarmTag +OS_SetVAlarmTag: ; 0x037FAD00 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + movs r4, r1 + bne _037FAD18 + bl FUN_037FB1F0 +_037FAD18: + cmp r5, #0 + strne r4, [r5, #8] + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + + arm_func_start OSi_SetNextVAlarm +OSi_SetNextVAlarm: ; 0x037FAD2C + stmdb sp!, {r4, lr} + mov r4, r0 + mov r0, #4 + ldr r1, _037FAD80 ; =OSi_VAlarmHandler + bl OS_SetIrqFunction + ldrsh ip, [r4, #16] + and r3, ip, #256 ; 0x100 + ldr r1, _037FAD84 ; =0x04000004 + ldrh r0, [r1] + and r2, r0, #63 ; 0x3f + and r0, ip, #255 ; 0xff + orr r0, r2, r0, lsl #8 + orr r0, r0, r3, asr #1 + strh r0, [r1] + ldrh r0, [r1] + orr r0, r0, #32 + strh r0, [r1] + mov r0, #4 + bl OS_EnableIrqMask + ldmia sp!, {r4, lr} + bx lr +_037FAD80: .word OSi_VAlarmHandler +_037FAD84: .word 0x04000004 + + arm_func_start OS_SetPeriodicVAlarm +OS_SetPeriodicVAlarm: ; 0x037FAD88 + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl OS_DisableInterrupts + mov r4, r0 + cmp r8, #0 + beq _037FADBC + ldr r0, [r8] + cmp r0, #0 + beq _037FADC0 +_037FADBC: + bl FUN_037FB1F0 +_037FADC0: + ldr r0, _037FAE1C ; =0x04000006 + ldrh r9, [r0] + mov r0, r9 + bl OSi_GetVFrame + mov r1, #1 + str r1, [r8, #28] + strh r7, [r8, #16] + cmp r7, r9 + addle r0, r0, #1 + str r0, [r8, #12] + strh r6, [r8, #18] + str r5, [r8] + ldr r0, [sp, #32] + str r0, [r8, #4] + mov r0, #0 + str r0, [r8, #36] ; 0x24 + mov r0, r8 + bl OSi_InsertVAlarm + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr +_037FAE1C: .word 0x04000006 + + arm_func_start OS_SetVAlarm +OS_SetVAlarm: ; 0x037FAE20 + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + bl OS_DisableInterrupts + mov r4, r0 + cmp r8, #0 + beq _037FAE54 + ldr r0, [r8] + cmp r0, #0 + beq _037FAE58 +_037FAE54: + bl FUN_037FB1F0 +_037FAE58: + ldr r0, _037FAEB4 ; =0x04000006 + ldrh r9, [r0] + mov r0, r9 + bl OSi_GetVFrame + mov r1, #0 + str r1, [r8, #28] + strh r7, [r8, #16] + cmp r7, r9 + addle r0, r0, #1 + str r0, [r8, #12] + strh r6, [r8, #18] + str r5, [r8] + ldr r0, [sp, #32] + str r0, [r8, #4] + mov r0, #0 + str r0, [r8, #36] ; 0x24 + mov r0, r8 + bl OSi_InsertVAlarm + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr +_037FAEB4: .word 0x04000006 + + arm_func_start OS_CreateVAlarm +OS_CreateVAlarm: ; 0x037FAEB8 + mov r1, #0 + str r1, [r0] + str r1, [r0, #8] + str r1, [r0, #32] + bx lr + + arm_func_start FUN_037FAECC +FUN_037FAECC: ; 0x037FAECC + cmp r0, #0 + bxeq lr + ldr r2, [r0, #20] + ldr r1, [r0, #24] + cmp r1, #0 + strne r2, [r1, #20] + ldreq r0, _037FAF00 ; =_03807948 + streq r2, [r0, #4] + cmp r2, #0 + strne r1, [r2, #24] + ldreq r0, _037FAF00 ; =_03807948 + streq r1, [r0] + bx lr +_037FAF00: .word _03807948 + + arm_func_start OSi_AppendVAlarm +OSi_AppendVAlarm: ; 0x037FAF04 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037FAF44 ; =_03807948 + ldr r3, [r1, #4] + str r3, [r0, #20] + mov r2, #0 + str r2, [r0, #24] + str r0, [r1, #4] + cmp r3, #0 + strne r0, [r3, #24] + bne _037FAF38 + str r0, [r1] + bl OSi_SetNextVAlarm +_037FAF38: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037FAF44: .word _03807948 + + arm_func_start OSi_InsertVAlarm +OSi_InsertVAlarm: ; 0x037FAF48 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037FAFCC ; =_03807948 + ldr r3, [r1] + b _037FAFB4 +_037FAF5C: + ldr r2, [r0, #12] + ldr r1, [r3, #12] + cmp r1, r2 + bcc _037FAFB0 + cmp r1, r2 + bne _037FAF84 + ldrsh r2, [r3, #16] + ldrsh r1, [r0, #16] + cmp r2, r1 + ble _037FAFB0 +_037FAF84: + ldr r1, [r3, #20] + str r1, [r0, #20] + str r3, [r0, #24] + str r0, [r3, #20] + cmp r1, #0 + strne r0, [r1, #24] + bne _037FAFC0 + ldr r1, _037FAFCC ; =_03807948 + str r0, [r1] + bl OSi_SetNextVAlarm + b _037FAFC0 +_037FAFB0: + ldr r3, [r3, #24] +_037FAFB4: + cmp r3, #0 + bne _037FAF5C + bl OSi_AppendVAlarm +_037FAFC0: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037FAFCC: .word _03807948 + + arm_func_start OS_IsVAlarmAvailable +OS_IsVAlarmAvailable: ; 0x037FAFD0 + ldr r0, _037FAFDC ; =_0380793C + ldrh r0, [r0] + bx lr +_037FAFDC: .word _0380793C + + arm_func_start OS_InitVAlarm +OS_InitVAlarm: ; 0x037FAFE0 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037FB038 ; =_0380793C + ldrh r1, [r0] + cmp r1, #0 + bne _037FB02C + mov r1, #1 + strh r1, [r0] + mov r1, #0 + ldr r0, _037FB03C ; =_03807948 + str r1, [r0] + str r1, [r0, #4] + mov r0, #4 + bl OS_DisableIrqMask + mov r1, #0 + ldr r0, _037FB040 ; =_03807944 + str r1, [r0] + ldr r0, _037FB044 ; =_03807940 + str r1, [r0] +_037FB02C: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037FB038: .word _0380793C +_037FB03C: .word _03807948 +_037FB040: .word _03807944 +_037FB044: .word _03807940 diff --git a/arm7/asm/dtcm.s b/arm7/asm/dtcm.s index a78cefc2..53b17162 100644 --- a/arm7/asm/dtcm.s +++ b/arm7/asm/dtcm.s @@ -2,536 +2,6 @@ .include "global.inc" .section .text - arm_func_start FUN_037FAA0C -FUN_037FAA0C: ; 0x037FAA0C - stmdb sp!, {r4, lr} - mov r4, r0 - bl OS_DisableInterrupts - ldr r1, _037FAA50 ; =_03807940 - ldr r1, [r1] - cmp r4, r1 - ldrlt r1, _037FAA54 ; =_03807944 - ldrlt r2, [r1] - addlt r2, r2, #1 - strlt r2, [r1] - ldr r1, _037FAA50 ; =_03807940 - str r4, [r1] - bl OS_RestoreInterrupts - ldr r0, _037FAA54 ; =_03807944 - ldr r0, [r0] - ldmia sp!, {r4, lr} - bx lr -_037FAA50: .word _03807940 -_037FAA54: .word _03807944 - - arm_func_start FUN_037FAA58 -FUN_037FAA58: ; 0x037FAA58 - ldr r3, [r0, #12] - subs r3, r1, r3 - ldrsh r1, [r0, #16] - sub r2, r2, r1 - bmi _037FAA7C - cmp r3, #0 - bne _037FAA84 - cmp r2, #0 - bge _037FAA84 -_037FAA7C: - mov r0, #0 - bx lr -_037FAA84: - cmp r2, #0 - ldrlt r1, _037FAAA4 ; =0x00000107 - addlt r2, r2, r1 - ldrsh r0, [r0, #18] - cmp r2, r0 - movle r0, #1 - movgt r0, #2 - bx lr -_037FAAA4: .word 0x00000107 - - arm_func_start FUN_037FAAA8 -FUN_037FAAA8: ; 0x037FAAA8 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov r0, #4 - bl OS_DisableIrqMask - ldr r2, _037FAC1C ; =0x04000004 - ldrh r0, [r2] - bic r0, r0, #32 - strh r0, [r2] - ldr r1, _037FAC20 ; =0x0380FFF8 - ldr r0, [r1] - orr r0, r0, #4 - str r0, [r1] - ldrh r2, [r2] - mov r0, r2, asr #8 - and r1, r0, #255 ; 0xff - mov r0, r2, lsl #1 - and r0, r0, #256 ; 0x100 - orr r0, r1, r0 - sub r0, r0, #1 - bl FUN_037FAA0C - ldr r9, _037FAC24 ; =0x04000006 - mov r6, #4 - ldr r5, _037FAC1C ; =0x04000004 - mov r4, #0 - ldr fp, _037FAC28 ; =_03807944 - b _037FAC00 -_037FAB10: - ldrh r8, [r9] - mov r0, r8 - bl FUN_037FAA0C - mov r7, r0 - mov r0, sl - mov r1, r7 - mov r2, r8 - bl FUN_037FAA58 - cmp r0, #0 - beq _037FAB4C - cmp r0, #1 - beq _037FAB8C - cmp r0, #2 - beq _037FABE4 - b _037FAC00 -_037FAB4C: - mov r0, sl - bl FUN_037FAD2C - ldrh r1, [r9] - ldrsh r0, [sl, #16] - cmp r0, r1 - bne _037FAC10 - ldr r0, [sl, #12] - cmp r0, r7 - bne _037FAC10 - mov r0, r6 - bl OS_DisableIrqMask - ldrh r0, [r5] - bic r0, r0, #32 - strh r0, [r5] - mov r0, r6 - bl OS_ResetRequestIrqMask -_037FAB8C: - ldr r7, [sl] - mov r0, sl - bl FUN_037FAECC - str r4, [sl] - cmp r7, #0 - beq _037FABB0 - ldr r0, [sl, #4] - mov lr, pc - bx r7 -_037FABB0: - ldr r0, [sl, #28] - cmp r0, #0 - beq _037FAC00 - ldr r0, [sl, #36] ; 0x24 - cmp r0, #0 - bne _037FAC00 - str r7, [sl] - ldr r0, [fp] - add r0, r0, #1 - str r0, [sl, #12] - mov r0, sl - bl FUN_037FAF04 - b _037FAC00 -_037FABE4: - mov r0, sl - bl FUN_037FAECC - mov r0, sl - bl FUN_037FAF04 - ldr r0, [fp] - add r0, r0, #1 - str r0, [sl, #12] -_037FAC00: - ldr r0, _037FAC2C ; =_03807948 - ldr sl, [r0] - cmp sl, #0 - bne _037FAB10 -_037FAC10: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FAC1C: .word 0x04000004 -_037FAC20: .word 0x0380FFF8 -_037FAC24: .word 0x04000006 -_037FAC28: .word _03807944 -_037FAC2C: .word _03807948 - - arm_func_start OS_CancelVAlarms -OS_CancelVAlarms: ; 0x037FAC30 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r0 - bl OS_DisableInterrupts - mov r5, r0 - cmp r7, #0 - bne _037FAC50 - bl FUN_037FB1F0 -_037FAC50: - ldr r0, _037FACA8 ; =_03807948 - ldr r0, [r0] - cmp r0, #0 - ldrne r6, [r0, #24] - moveq r6, #0 - mov r4, #0 - b _037FAC8C -_037FAC6C: - ldr r1, [r0, #8] - cmp r1, r7 - bne _037FAC7C - bl OS_CancelVAlarm -_037FAC7C: - mov r0, r6 - cmp r6, #0 - ldrne r6, [r6, #24] - moveq r6, r4 -_037FAC8C: - cmp r0, #0 - bne _037FAC6C - mov r0, r5 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FACA8: .word _03807948 - - arm_func_start OS_CancelVAlarm -OS_CancelVAlarm: ; 0x037FACAC - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - mov r1, #1 - str r1, [r5, #36] ; 0x24 - ldr r1, [r5] - cmp r1, #0 - bne _037FACDC - bl OS_RestoreInterrupts - b _037FACF4 -_037FACDC: - mov r0, r5 - bl FUN_037FAECC - mov r0, #0 - str r0, [r5] - mov r0, r4 - bl OS_RestoreInterrupts -_037FACF4: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start OS_SetVAlarmTag -OS_SetVAlarmTag: ; 0x037FAD00 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - movs r4, r1 - bne _037FAD18 - bl FUN_037FB1F0 -_037FAD18: - cmp r5, #0 - strne r4, [r5, #8] - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start FUN_037FAD2C -FUN_037FAD2C: ; 0x037FAD2C - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, #4 - ldr r1, _037FAD80 ; =FUN_037FAAA8 - bl OS_SetIrqFunction - ldrsh ip, [r4, #16] - and r3, ip, #256 ; 0x100 - ldr r1, _037FAD84 ; =0x04000004 - ldrh r0, [r1] - and r2, r0, #63 ; 0x3f - and r0, ip, #255 ; 0xff - orr r0, r2, r0, lsl #8 - orr r0, r0, r3, asr #1 - strh r0, [r1] - ldrh r0, [r1] - orr r0, r0, #32 - strh r0, [r1] - mov r0, #4 - bl OS_EnableIrqMask - ldmia sp!, {r4, lr} - bx lr -_037FAD80: .word FUN_037FAAA8 -_037FAD84: .word 0x04000004 - - arm_func_start OS_SetPeriodicVAlarm -OS_SetPeriodicVAlarm: ; 0x037FAD88 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - bl OS_DisableInterrupts - mov r4, r0 - cmp r8, #0 - beq _037FADBC - ldr r0, [r8] - cmp r0, #0 - beq _037FADC0 -_037FADBC: - bl FUN_037FB1F0 -_037FADC0: - ldr r0, _037FAE1C ; =0x04000006 - ldrh r9, [r0] - mov r0, r9 - bl FUN_037FAA0C - mov r1, #1 - str r1, [r8, #28] - strh r7, [r8, #16] - cmp r7, r9 - addle r0, r0, #1 - str r0, [r8, #12] - strh r6, [r8, #18] - str r5, [r8] - ldr r0, [sp, #32] - str r0, [r8, #4] - mov r0, #0 - str r0, [r8, #36] ; 0x24 - mov r0, r8 - bl FUN_037FAF48 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FAE1C: .word 0x04000006 - - arm_func_start OS_SetVAlarm -OS_SetVAlarm: ; 0x037FAE20 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - bl OS_DisableInterrupts - mov r4, r0 - cmp r8, #0 - beq _037FAE54 - ldr r0, [r8] - cmp r0, #0 - beq _037FAE58 -_037FAE54: - bl FUN_037FB1F0 -_037FAE58: - ldr r0, _037FAEB4 ; =0x04000006 - ldrh r9, [r0] - mov r0, r9 - bl FUN_037FAA0C - mov r1, #0 - str r1, [r8, #28] - strh r7, [r8, #16] - cmp r7, r9 - addle r0, r0, #1 - str r0, [r8, #12] - strh r6, [r8, #18] - str r5, [r8] - ldr r0, [sp, #32] - str r0, [r8, #4] - mov r0, #0 - str r0, [r8, #36] ; 0x24 - mov r0, r8 - bl FUN_037FAF48 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FAEB4: .word 0x04000006 - - arm_func_start OS_CreateVAlarm -OS_CreateVAlarm: ; 0x037FAEB8 - mov r1, #0 - str r1, [r0] - str r1, [r0, #8] - str r1, [r0, #32] - bx lr - - arm_func_start FUN_037FAECC -FUN_037FAECC: ; 0x037FAECC - cmp r0, #0 - bxeq lr - ldr r2, [r0, #20] - ldr r1, [r0, #24] - cmp r1, #0 - strne r2, [r1, #20] - ldreq r0, _037FAF00 ; =_03807948 - streq r2, [r0, #4] - cmp r2, #0 - strne r1, [r2, #24] - ldreq r0, _037FAF00 ; =_03807948 - streq r1, [r0] - bx lr -_037FAF00: .word _03807948 - - arm_func_start FUN_037FAF04 -FUN_037FAF04: ; 0x037FAF04 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037FAF44 ; =_03807948 - ldr r3, [r1, #4] - str r3, [r0, #20] - mov r2, #0 - str r2, [r0, #24] - str r0, [r1, #4] - cmp r3, #0 - strne r0, [r3, #24] - bne _037FAF38 - str r0, [r1] - bl FUN_037FAD2C -_037FAF38: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FAF44: .word _03807948 - - arm_func_start FUN_037FAF48 -FUN_037FAF48: ; 0x037FAF48 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037FAFCC ; =_03807948 - ldr r3, [r1] - b _037FAFB4 -_037FAF5C: - ldr r2, [r0, #12] - ldr r1, [r3, #12] - cmp r1, r2 - bcc _037FAFB0 - cmp r1, r2 - bne _037FAF84 - ldrsh r2, [r3, #16] - ldrsh r1, [r0, #16] - cmp r2, r1 - ble _037FAFB0 -_037FAF84: - ldr r1, [r3, #20] - str r1, [r0, #20] - str r3, [r0, #24] - str r0, [r3, #20] - cmp r1, #0 - strne r0, [r1, #24] - bne _037FAFC0 - ldr r1, _037FAFCC ; =_03807948 - str r0, [r1] - bl FUN_037FAD2C - b _037FAFC0 -_037FAFB0: - ldr r3, [r3, #24] -_037FAFB4: - cmp r3, #0 - bne _037FAF5C - bl FUN_037FAF04 -_037FAFC0: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FAFCC: .word _03807948 - - arm_func_start OS_IsVAlarmAvailable -OS_IsVAlarmAvailable: ; 0x037FAFD0 - ldr r0, _037FAFDC ; =_0380793C - ldrh r0, [r0] - bx lr -_037FAFDC: .word _0380793C - - arm_func_start OS_InitVAlarm -OS_InitVAlarm: ; 0x037FAFE0 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037FB038 ; =_0380793C - ldrh r1, [r0] - cmp r1, #0 - bne _037FB02C - mov r1, #1 - strh r1, [r0] - mov r1, #0 - ldr r0, _037FB03C ; =_03807948 - str r1, [r0] - str r1, [r0, #4] - mov r0, #4 - bl OS_DisableIrqMask - mov r1, #0 - ldr r0, _037FB040 ; =_03807944 - str r1, [r0] - ldr r0, _037FB044 ; =_03807940 - str r1, [r0] -_037FB02C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FB038: .word _0380793C -_037FB03C: .word _03807948 -_037FB040: .word _03807944 -_037FB044: .word _03807940 - - arm_func_start OS_EnableInterrupts -OS_EnableInterrupts: ; 0x037FB048 - mrs r0, CPSR - bic r1, r0, #128 ; 0x80 - msr CPSR_c, r1 - and r0, r0, #128 ; 0x80 - bx lr - - arm_func_start OS_DisableInterrupts -OS_DisableInterrupts: ; 0x037FB05C - mrs r0, CPSR - orr r1, r0, #128 ; 0x80 - msr CPSR_c, r1 - and r0, r0, #128 ; 0x80 - bx lr - - arm_func_start OS_RestoreInterrupts -OS_RestoreInterrupts: ; 0x037FB070 - mrs r1, CPSR - bic r2, r1, #128 ; 0x80 - orr r2, r2, r0 - msr CPSR_c, r2 - and r0, r1, #128 ; 0x80 - bx lr - - arm_func_start OS_DisableInterrupts_IrqAndFiq -OS_DisableInterrupts_IrqAndFiq: ; 0x037FB088 - mrs r0, CPSR - orr r1, r0, #192 ; 0xc0 - msr CPSR_c, r1 - and r0, r0, #192 ; 0xc0 - bx lr - - arm_func_start OS_RestoreInterrupts_IrqAndFiq -OS_RestoreInterrupts_IrqAndFiq: ; 0x037FB09C - mrs r1, CPSR - bic r2, r1, #192 ; 0xc0 - orr r2, r2, r0 - msr CPSR_c, r2 - and r0, r1, #192 ; 0xc0 - bx lr - - arm_func_start OS_GetProcMode -OS_GetProcMode: ; 0x037FB0B4 - mrs r0, CPSR - and r0, r0, #31 - bx lr - - arm_func_start OS_SpinWait -OS_SpinWait: ; 0x037FB0C0 - stmfd sp!, {lr} - sub sp, sp, #4 - mov r1, #4 - bl _s32_div_f - bl FUN_037F8CB4 - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - arm_func_start OS_ResetSystem OS_ResetSystem: ; 0x037FB0E0 stmfd sp!, {lr} diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h index 5b3dfcc1..1416fe8c 100644 --- a/arm7/lib/include/OS_init.h +++ b/arm7/lib/include/OS_init.h @@ -1,6 +1,9 @@ -#ifndef POKEDIAMOND_OS_INIT_H -#define POKEDIAMOND_OS_INIT_H +#ifndef POKEDIAMOND_ARM7_OS_INIT_H +#define POKEDIAMOND_ARM7_OS_INIT_H + +#include "types.h" +#include "OS_system.h" void OS_Init(void); -#endif //POKEDIAMOND_OS_INIT_H +#endif //POKEDIAMOND_ARM7_OS_INIT_H diff --git a/arm7/lib/include/OS_system.h b/arm7/lib/include/OS_system.h new file mode 100644 index 00000000..b6c81ab4 --- /dev/null +++ b/arm7/lib/include/OS_system.h @@ -0,0 +1,37 @@ +#ifndef POKEDIAMOND_ARM7_OS_SYSTEM_H +#define POKEDIAMOND_ARM7_OS_SYSTEM_H + +#include "types.h" + +//todo consts.h +#define HW_PSR_CPU_MODE_MASK 0x1f // CPU mode + +#define HW_PSR_DISABLE_FIQ 0x40 // Disable FIQ +#define HW_PSR_DISABLE_IRQ 0x80 // Disable IRQ +#define HW_PSR_DISABLE_IRQ_FIQ 0xc0 // Disable FIQ and IRQ + +typedef enum { + OS_PROCMODE_USER=16, + OS_PROCMODE_FIQ=17, + OS_PROCMODE_IRQ=18, + OS_PROCMODE_SVC=19, + OS_PROCMODE_ABORT=23, + OS_PROCMODE_UNDEF=27, + OS_PROCMODE_SYS=31 +} OSProcMode; + +typedef enum { + OS_INTRMODE_DISABLE_IRQ = HW_PSR_DISABLE_IRQ, + OS_INTRMODE_DISABLE_FIQ = HW_PSR_DISABLE_FIQ, + OS_INTRMODE_ENABLE = 0 +} OSIntrMode; + +OSIntrMode OS_EnableInterrupts(void); +OSIntrMode OS_DisableInterrupts(void); +OSIntrMode OS_RestoreInterrupts(register OSIntrMode state); +OSIntrMode OS_DisableInterrupts_IrqAndFiq(void); +OSIntrMode OS_RestoreInterrupts_IrqAndFiq(register OSIntrMode state); +OSProcMode OS_GetProcMode(void); +void OS_SpinWait(u32 cycle); + +#endif //POKEDIAMOND_ARM7_OS_SYSTEM_H diff --git a/arm7/lib/include/types.h b/arm7/lib/include/types.h new file mode 100644 index 00000000..3a497c56 --- /dev/null +++ b/arm7/lib/include/types.h @@ -0,0 +1,50 @@ +#ifndef POKEDIAMOND_ARM7_TYPES_H +#define POKEDIAMOND_ARM7_TYPES_H + +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned long u32; + +typedef signed char s8; +typedef signed short int s16; +typedef signed long s32; + +typedef unsigned long long int u64; +typedef signed long long int s64; + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; + +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + +typedef float f32; +typedef volatile f32 vf32; + +typedef u8 REGType8; +typedef u16 REGType16; +typedef u32 REGType32; +typedef u64 REGType64; + +typedef vu8 REGType8v; +typedef vu16 REGType16v; +typedef vu32 REGType32v; +typedef vu64 REGType64v; + +typedef int BOOL; +#define TRUE 1 +#define FALSE 0 + +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else // __cplusplus +#define NULL ((void *)0) +#endif // __cplusplus +#endif + +#endif //POKEDIAMOND_NITRO_TYPES_H diff --git a/arm7/lib/src/OS_system.c b/arm7/lib/src/OS_system.c new file mode 100644 index 00000000..120eddbf --- /dev/null +++ b/arm7/lib/src/OS_system.c @@ -0,0 +1,65 @@ +#include "function_target.h" +#include "OS_system.h" + +#pragma optimize_for_size on + +extern void FUN_037F8CB4(s32 count); + +ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void) +{ + mrs r0, CPSR + bic r1, r0, #HW_PSR_DISABLE_IRQ + msr CPSR_c, r1 + and r0, r0, #HW_PSR_DISABLE_IRQ + bx lr +} + +ARM_FUNC asm OSIntrMode OS_DisableInterrupts(void) +{ + mrs r0, CPSR + orr r1, r0, #HW_PSR_DISABLE_IRQ + msr CPSR_c, r1 + and r0, r0, #HW_PSR_DISABLE_IRQ + bx lr +} + +ARM_FUNC asm OSIntrMode OS_RestoreInterrupts(register OSIntrMode state) +{ + mrs r1, CPSR + bic r2, r1, #HW_PSR_DISABLE_IRQ + orr r2, r2, r0 + msr CPSR_c, r2 + and r0, r1, #HW_PSR_DISABLE_IRQ + bx lr +} + +ARM_FUNC asm OSIntrMode OS_DisableInterrupts_IrqAndFiq(void) +{ + mrs r0, CPSR + orr r1, r0, #HW_PSR_DISABLE_IRQ_FIQ + msr CPSR_c, r1 + and r0, r0, #HW_PSR_DISABLE_IRQ_FIQ + bx lr +} + +ARM_FUNC asm OSIntrMode OS_RestoreInterrupts_IrqAndFiq(register OSIntrMode state) +{ + mrs r1, CPSR + bic r2, r1, #HW_PSR_DISABLE_IRQ_FIQ + orr r2, r2, r0 + msr CPSR_c, r2 + and r0, r1, #HW_PSR_DISABLE_IRQ_FIQ + bx lr +} + +ARM_FUNC asm OSProcMode OS_GetProcMode(void) +{ + mrs r0, CPSR + and r0, r0, #HW_PSR_CPU_MODE_MASK + bx lr +} + +ARM_FUNC void OS_SpinWait(u32 cycle) +{ + FUN_037F8CB4((s32)cycle / 4); +} diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index 88c696cd..6792c900 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -1,9 +1,5 @@ -// -// Created by mart on 4/12/20. -// - -#ifndef POKEDIAMOND_OS_INIT_H -#define POKEDIAMOND_OS_INIT_H +#ifndef POKEDIAMOND_ARM9_OS_INIT_H +#define POKEDIAMOND_ARM9_OS_INIT_H #include "types.h" #include "consts.h" @@ -29,4 +25,4 @@ void OS_Init(void); -#endif //POKEDIAMOND_OS_INIT_H +#endif //POKEDIAMOND_ARM9_OS_INIT_H diff --git a/arm9/lib/include/OS_system.h b/arm9/lib/include/OS_system.h index c2b8572a..a5426c17 100644 --- a/arm9/lib/include/OS_system.h +++ b/arm9/lib/include/OS_system.h @@ -1,9 +1,5 @@ -// -// Created by mart on 4/23/20. -// - -#ifndef POKEDIAMOND_OS_SYSTEM_H -#define POKEDIAMOND_OS_SYSTEM_H +#ifndef POKEDIAMOND_ARM9_OS_SYSTEM_H +#define POKEDIAMOND_ARM9_OS_SYSTEM_H #include "function_target.h" #include "consts.h" @@ -36,4 +32,4 @@ OSProcMode OS_GetProcMode(void); void OS_SpinWait(u32 cycles); void OS_WaitVBlankIntr(void); -#endif //POKEDIAMOND_OS_SYSTEM_H +#endif //POKEDIAMOND_ARM9_OS_SYSTEM_H diff --git a/arm9/lib/include/types.h b/arm9/lib/include/types.h index 40f8207d..ca11e244 100644 --- a/arm9/lib/include/types.h +++ b/arm9/lib/include/types.h @@ -1,5 +1,5 @@ -#ifndef POKEDIAMOND_NITRO_TYPES_H -#define POKEDIAMOND_NITRO_TYPES_H +#ifndef POKEDIAMOND_ARM9_TYPES_H +#define POKEDIAMOND_ARM9_TYPES_H typedef unsigned char u8; typedef unsigned short int u16; @@ -47,4 +47,4 @@ typedef int BOOL; #endif // __cplusplus #endif -#endif //POKEDIAMOND_NITRO_TYPES_H +#endif //POKEDIAMOND_ARM9_TYPES_H |