arm9 OS_valarm

This commit is contained in:
red031000
2020-08-01 19:30:35 +01:00
committed by PikalaxALT
parent ecadd4cc93
commit 76397dd412
8 changed files with 58 additions and 225 deletions

View File

@@ -1,170 +0,0 @@
.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OSi_DequeueItem
OSi_DequeueItem: ; 0x020CBE9C
ldr r2, [r1, #0x10]
ldr r1, [r1, #0x14]
cmp r2, #0x0
streq r1, [r0, #0x8c]
strne r1, [r2, #0x14]
cmp r1, #0x0
streq r2, [r0, #0x88]
strne r2, [r1, #0x10]
bx lr
arm_func_start OSi_EnqueueTail
OSi_EnqueueTail: ; 0x020CBEC0
ldr r2, [r0, #0x8c]
cmp r2, #0x0
streq r1, [r0, #0x88]
strne r1, [r2, #0x10]
str r2, [r1, #0x14]
mov r2, #0x0
str r2, [r1, #0x10]
str r1, [r0, #0x8c]
bx lr
arm_func_start OS_TryLockMutex
OS_TryLockMutex: ; 0x020CBEE4
stmdb sp!, {r4-r6,lr}
mov r5, r0
bl OS_DisableInterrupts
ldr r2, [r5, #0x8]
ldr r1, _020CBF54 ; =OSi_ThreadInfo
mov r4, r0
cmp r2, #0x0
ldr r0, [r1, #0x4]
bne _020CBF28
str r0, [r5, #0x8]
ldr r2, [r5, #0xc]
mov r1, r5
add r2, r2, #0x1
str r2, [r5, #0xc]
bl OSi_EnqueueTail
mov r6, #0x1
b _020CBF40
_020CBF28:
cmp r2, r0
ldreq r0, [r5, #0xc]
moveq r6, #0x1
addeq r0, r0, #0x1
streq r0, [r5, #0xc]
movne r6, #0x0
_020CBF40:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, r6
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CBF54: .word OSi_ThreadInfo
arm_func_start OSi_UnlockAllMutex
OSi_UnlockAllMutex: ; 0x020CBF58
stmdb sp!, {r4-r6,lr}
mov r6, r0
ldr r0, [r6, #0x88]
cmp r0, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
add r5, r6, #0x88
mov r4, #0x0
_020CBF78:
mov r0, r5
bl OSi_RemoveMutexLinkFromQueue
str r4, [r0, #0xc]
str r4, [r0, #0x8]
bl OS_WakeupThread
ldr r0, [r6, #0x88]
cmp r0, #0x0
bne _020CBF78
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start OS_UnlockMutex
OS_UnlockMutex: ; 0x020CBFA0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CC00C ; =OSi_ThreadInfo
mov r4, r0
ldr r0, [r1, #0x4]
ldr r1, [r5, #0x8]
cmp r1, r0
bne _020CBFF8
ldr r1, [r5, #0xc]
sub r1, r1, #0x1
str r1, [r5, #0xc]
ldr r1, [r5, #0xc]
cmp r1, #0x0
bne _020CBFF8
mov r1, r5
bl OSi_DequeueItem
mov r1, #0x0
mov r0, r5
str r1, [r5, #0x8]
bl OS_WakeupThread
_020CBFF8:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CC00C: .word OSi_ThreadInfo
arm_func_start OS_LockMutex
OS_LockMutex: ; 0x020CC010
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CC098 ; =OSi_ThreadInfo
mov r4, r0
ldr r7, [r1, #0x4]
mov r6, #0x0
_020CC030:
ldr r0, [r5, #0x8]
cmp r0, #0x0
bne _020CC05C
str r7, [r5, #0x8]
ldr r1, [r5, #0xc]
mov r0, r7
add r2, r1, #0x1
mov r1, r5
str r2, [r5, #0xc]
bl OSi_EnqueueTail
b _020CC084
_020CC05C:
cmp r0, r7
ldreq r0, [r5, #0xc]
addeq r0, r0, #0x1
streq r0, [r5, #0xc]
beq _020CC084
mov r0, r5
str r5, [r7, #0x84]
bl OS_SleepThread
str r6, [r7, #0x84]
b _020CC030
_020CC084:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CC098: .word OSi_ThreadInfo
arm_func_start OS_InitMutex
OS_InitMutex: ; 0x020CC09C
mov r2, #0x0
str r2, [r0, #0x4]
ldr r1, [r0, #0x4]
str r1, [r0, #0x0]
str r2, [r0, #0x8]
str r2, [r0, #0xc]
bx lr

View File

@@ -1,54 +0,0 @@
.include "asm/macros.inc"
.include "global.inc"
.section .bss
.global OSi_UseVAlarm
OSi_UseVAlarm: ; 0x021D37C8
.space 0x4
.global OSi_PreviousVCount
OSi_PreviousVCount: ; 0x021D37CC
.space 0x4
.global OSi_VFrameCount
OSi_VFrameCount: ; 0x021D37D0
.space 0x4
.global OSi_VAlarmQueue
OSi_VAlarmQueue: ; 0x021D37D4
.space 0x8
.text
arm_func_start OS_InitVAlarm
OS_InitVAlarm: ; 0x020CD28C
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r2, _020CD2EC ; =OSi_UseVAlarm
ldrh r0, [r2, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r1, _020CD2F0 ; =OSi_VAlarmQueue
mov r3, #0x0
mov r12, #0x1
mov r0, #0x4
strh r12, [r2, #0x0]
str r3, [r1, #0x0]
str r3, [r1, #0x4]
bl OS_DisableIrqMask
ldr r1, _020CD2F4 ; =OSi_VFrameCount
mov r2, #0x0
ldr r0, _020CD2F8 ; =OSi_PreviousVCount
str r2, [r1, #0x0]
str r2, [r0, #0x0]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CD2EC: .word OSi_UseVAlarm
_020CD2F0: .word OSi_VAlarmQueue
_020CD2F4: .word OSi_VFrameCount
_020CD2F8: .word OSi_PreviousVCount

View File

@@ -25,6 +25,7 @@
#include "OS_reset.h"
#include "OS_exception.h"
#include "OS_message.h"
#include "OS_valarm.h"
void OS_Init(void);

View File

@@ -4,6 +4,7 @@
#include "consts.h"
#include "nitro/OS_interrupt_shared.h"
#define OS_IE_V_COUNT (1UL << REG_OS_IE_VE_SHIFT)
#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT)
#define OS_IE_TIMER1 (1UL << REG_OS_IE_T1_SHIFT)

View File

@@ -0,0 +1,25 @@
#ifndef POKEDIAMOND_OS_VALARM_H
#define POKEDIAMOND_OS_VALARM_H
#include "nitro/types.h"
#include "OS_alarm.h"
typedef struct OSiVAlarm OSVAlarm;
struct OSiVAlarm
{
OSAlarmHandler handler;
void *arg;
u32 tag;
u32 frame;
s16 fire;
s16 delay;
OSVAlarm *prev;
OSVAlarm *next;
BOOL period;
BOOL finish;
BOOL canceled;
};
void OS_InitVAlarm(void);
#endif //POKEDIAMOND_OS_VALARM_H

View File

@@ -345,6 +345,7 @@
#define reg_MI_MCD1 (*(REGType32v *)0x4100010)
#define reg_CARD_DATA (*(REGType32v *)0x4100010) //?
#define REG_OS_IE_VE_SHIFT 2
#define REG_OS_IE_T0_SHIFT 3
#define REG_OS_IE_T1_SHIFT 4

View File

@@ -3,7 +3,6 @@
extern void PXI_Init(void);
extern void MI_Init(void);
extern void OS_InitVAlarm(void);
extern void OSi_InitVramExclusive(void);
extern void CTRDG_Init(void);
extern void CARD_Init(void);

30
arm9/lib/src/OS_valarm.c Normal file
View File

@@ -0,0 +1,30 @@
#include "OS_valarm.h"
#include "function_target.h"
#include "OS_interrupt.h"
static struct OSiVAlarmQueue
{
OSVAlarm *head;
OSVAlarm *tail;
} OSi_VAlarmQueue;
static u16 OSi_UseVAlarm = FALSE;
static s32 OSi_VFrameCount;
static s32 OSi_PreviousVCount;
ARM_FUNC void OS_InitVAlarm(void)
{
if (!OSi_UseVAlarm)
{
OSi_UseVAlarm = TRUE;
OSi_VAlarmQueue.head = NULL;
OSi_VAlarmQueue.tail = NULL;
(void)OS_DisableIrqMask(OS_IE_V_COUNT);
OSi_VFrameCount = 0;
OSi_PreviousVCount = 0;
}
}