mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-11 18:46:44 -05:00
arm9 OS_valarm
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "OS_reset.h"
|
||||
#include "OS_exception.h"
|
||||
#include "OS_message.h"
|
||||
#include "OS_valarm.h"
|
||||
|
||||
void OS_Init(void);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
25
arm9/lib/include/OS_valarm.h
Normal file
25
arm9/lib/include/OS_valarm.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
30
arm9/lib/src/OS_valarm.c
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user