mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-30 12:26:48 -05:00
OS_InitLock
This commit is contained in:
@@ -457,6 +457,7 @@ SECTIONS {
|
||||
OS_irqHandler.o (.text)
|
||||
OS_irqTable.o (.text)
|
||||
OS_interrupt.o (.text)
|
||||
OS_spinLock_asm.o (.text)
|
||||
OS_spinLock.o (.text)
|
||||
OS_printf.o (.text)
|
||||
OS_thread.o (.text)
|
||||
@@ -584,6 +585,8 @@ SECTIONS {
|
||||
bss.o (.bss)
|
||||
FUN_020910A4.o (.bss)
|
||||
bss_2.o (.bss)
|
||||
OS_spinLock.o (.bss)
|
||||
bss_2_2.o (.bss)
|
||||
OS_alloc.o (.bss)
|
||||
bss_3.o (.bss)
|
||||
FS_archive.o (.bss)
|
||||
|
||||
@@ -282,69 +282,3 @@ _020CA380:
|
||||
bgt _020CA380
|
||||
ldmia sp!, {r4-r8,lr}
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_InitLock
|
||||
OS_InitLock: ; 0x020CA3AC
|
||||
stmdb sp!, {r4-r5,lr}
|
||||
sub sp, sp, #0x4
|
||||
ldr r0, _020CA484 ; =isInitialized
|
||||
ldr r1, [r0, #0x0]
|
||||
cmp r1, #0x0
|
||||
addne sp, sp, #0x4
|
||||
ldmneia sp!, {r4-r5,lr}
|
||||
bxne lr
|
||||
mov r2, #0x1
|
||||
ldr r1, _020CA488 ; =0x027FFFF0
|
||||
str r2, [r0, #0x0]
|
||||
mov r2, #0x0
|
||||
mov r0, #0x7e
|
||||
str r2, [r1, #0x0]
|
||||
bl OS_TryLockByWord
|
||||
ldr r5, _020CA488 ; =0x027FFFF0
|
||||
ldrh r0, [r5, #0x6]
|
||||
cmp r0, #0x0
|
||||
beq _020CA410
|
||||
mov r4, #0x400
|
||||
_020CA3FC:
|
||||
mov r0, r4
|
||||
bl SVC_WaitByLoop
|
||||
ldrh r0, [r5, #0x6]
|
||||
cmp r0, #0x0
|
||||
bne _020CA3FC
|
||||
_020CA410:
|
||||
ldr r2, _020CA48C ; =0x027FFFB0
|
||||
mvn r12, #0x0
|
||||
mov r0, #0x10000
|
||||
ldr r3, _020CA490 ; =0x027FFFB4
|
||||
ldr r1, _020CA494 ; =0x027FFFC0
|
||||
str r12, [r2, #0x0]
|
||||
rsb r12, r0, #0x0
|
||||
mov r0, #0x0
|
||||
mov r2, #0x28
|
||||
str r12, [r3, #0x0]
|
||||
bl MIi_CpuClear32
|
||||
ldr ip, _020CA498 ; =0x04000204
|
||||
ldr r1, _020CA488 ; =0x027FFFF0
|
||||
ldrh r3, [r12, #0x0]
|
||||
mov r0, #0x7e
|
||||
mov r2, #0x0
|
||||
orr r3, r3, #0x800
|
||||
strh r3, [r12, #0x0]
|
||||
ldrh r3, [r12, #0x0]
|
||||
orr r3, r3, #0x80
|
||||
strh r3, [r12, #0x0]
|
||||
bl OS_UnlockByWord
|
||||
ldr r1, _020CA488 ; =0x027FFFF0
|
||||
mov r0, #0x7f
|
||||
mov r2, #0x0
|
||||
bl OS_TryLockByWord
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CA484: .word isInitialized
|
||||
_020CA488: .word 0x027FFFF0
|
||||
_020CA48C: .word 0x027FFFB0
|
||||
_020CA490: .word 0x027FFFB4
|
||||
_020CA494: .word 0x027FFFC0
|
||||
_020CA498: .word 0x04000204
|
||||
@@ -1075,59 +1075,3 @@ UNK_021D3450: ; 0x021D3450
|
||||
.global UNK_021D3454
|
||||
UNK_021D3454: ; 0x021D3454
|
||||
.space 0x28
|
||||
|
||||
.global isInitialized
|
||||
isInitialized: ; 0x021D347C
|
||||
.space 0x4
|
||||
|
||||
.global OSi_StackForDestructor
|
||||
OSi_StackForDestructor: ; 0x021D3480
|
||||
.space 0x4
|
||||
|
||||
.global OSi_RescheduleCount
|
||||
OSi_RescheduleCount: ; 0x021D3484
|
||||
.space 0x4
|
||||
|
||||
.global OSi_ThreadIdCount
|
||||
OSi_ThreadIdCount: ; 0x021D3488
|
||||
.space 0x4
|
||||
|
||||
.global OSi_SystemCallbackInSwitchThread
|
||||
OSi_SystemCallbackInSwitchThread: ; 0x021D348C
|
||||
.space 0x4
|
||||
|
||||
.global OSi_CurrentThreadPtr
|
||||
OSi_CurrentThreadPtr: ; 0x021D3490
|
||||
.space 0x4
|
||||
|
||||
.global OSi_IsThreadInitialized
|
||||
OSi_IsThreadInitialized: ; 0x021D3494
|
||||
.space 0x4
|
||||
|
||||
.global OSi_ThreadInfo
|
||||
OSi_ThreadInfo: ; 0x021D3498
|
||||
.space 0x4
|
||||
|
||||
.global UNK_021D349C
|
||||
UNK_021D349C: ; 0x021D349C
|
||||
.space 0xc
|
||||
|
||||
.global OSi_IdleThread
|
||||
OSi_IdleThread: ; 0x021D34A8
|
||||
.space 0xc0
|
||||
|
||||
.global OSi_LauncherThread
|
||||
OSi_LauncherThread: ; 0x021D3568
|
||||
.space 0xC0
|
||||
|
||||
.global OSi_IdleThreadStack
|
||||
OSi_IdleThreadStack: ; 0x021D3628
|
||||
.space 0xC8
|
||||
|
||||
.global OSi_Initialized
|
||||
OSi_Initialized: ; 0x021D36F0
|
||||
.space 0x4
|
||||
|
||||
.global OSi_MainExArenaEnabled
|
||||
OSi_MainExArenaEnabled: ; 0x021D36F4
|
||||
.space 0x4
|
||||
|
||||
53
arm9/data/bss_2_2.s
Normal file
53
arm9/data/bss_2_2.s
Normal file
@@ -0,0 +1,53 @@
|
||||
.section .bss
|
||||
|
||||
.global OSi_StackForDestructor
|
||||
OSi_StackForDestructor: ; 0x021D3480
|
||||
.space 0x4
|
||||
|
||||
.global OSi_RescheduleCount
|
||||
OSi_RescheduleCount: ; 0x021D3484
|
||||
.space 0x4
|
||||
|
||||
.global OSi_ThreadIdCount
|
||||
OSi_ThreadIdCount: ; 0x021D3488
|
||||
.space 0x4
|
||||
|
||||
.global OSi_SystemCallbackInSwitchThread
|
||||
OSi_SystemCallbackInSwitchThread: ; 0x021D348C
|
||||
.space 0x4
|
||||
|
||||
.global OSi_CurrentThreadPtr
|
||||
OSi_CurrentThreadPtr: ; 0x021D3490
|
||||
.space 0x4
|
||||
|
||||
.global OSi_IsThreadInitialized
|
||||
OSi_IsThreadInitialized: ; 0x021D3494
|
||||
.space 0x4
|
||||
|
||||
.global OSi_ThreadInfo
|
||||
OSi_ThreadInfo: ; 0x021D3498
|
||||
.space 0x4
|
||||
|
||||
.global UNK_021D349C
|
||||
UNK_021D349C: ; 0x021D349C
|
||||
.space 0xc
|
||||
|
||||
.global OSi_IdleThread
|
||||
OSi_IdleThread: ; 0x021D34A8
|
||||
.space 0xc0
|
||||
|
||||
.global OSi_LauncherThread
|
||||
OSi_LauncherThread: ; 0x021D3568
|
||||
.space 0xC0
|
||||
|
||||
.global OSi_IdleThreadStack
|
||||
OSi_IdleThreadStack: ; 0x021D3628
|
||||
.space 0xC8
|
||||
|
||||
.global OSi_Initialized
|
||||
OSi_Initialized: ; 0x021D36F0
|
||||
.space 0x4
|
||||
|
||||
.global OSi_MainExArenaEnabled
|
||||
OSi_MainExArenaEnabled: ; 0x021D36F4
|
||||
.space 0x4
|
||||
@@ -1,9 +1,23 @@
|
||||
#ifndef NITRO_MI_EXMEMORY_H_
|
||||
#define NITRO_MI_EXMEMORY_H_
|
||||
|
||||
#include "consts.h"
|
||||
|
||||
typedef enum {
|
||||
MI_PROCESSOR_ARM9 = 0,
|
||||
MI_PROCESSOR_ARM7 = 1
|
||||
} MIProcessor;
|
||||
|
||||
static inline void MIi_SetCardProcessor(MIProcessor proc)
|
||||
{
|
||||
reg_MI_EXMEMCNT =
|
||||
(u16)((reg_MI_EXMEMCNT & ~0x0800) | (proc << 11));
|
||||
}
|
||||
|
||||
static inline void MIi_SetCartridgeProcessor(MIProcessor proc)
|
||||
{
|
||||
reg_MI_EXMEMCNT =
|
||||
(u16)((reg_MI_EXMEMCNT & ~0x0080) | (proc << 7));
|
||||
}
|
||||
|
||||
#endif //NITRO_MI_EXMEMORY_H_
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "OS_terminate_proc.h"
|
||||
#include "OS_interrupt.h"
|
||||
#include "OS_reset.h"
|
||||
#include "OS_spinLock.h"
|
||||
|
||||
void OS_Init();
|
||||
|
||||
|
||||
@@ -5,12 +5,21 @@
|
||||
#ifndef POKEDIAMOND_OS_SPINLOCK_H
|
||||
#define POKEDIAMOND_OS_SPINLOCK_H
|
||||
|
||||
#include "types.h"
|
||||
#include "syscall.h"
|
||||
|
||||
typedef volatile struct OSLockWord {
|
||||
u32 lockFlag;
|
||||
u16 ownerID;
|
||||
u16 extension;
|
||||
} OSLockWord;
|
||||
|
||||
static inline void OSi_WaitByLoop()
|
||||
{
|
||||
SVC_WaitByLoop(0x1000 / 4);
|
||||
}
|
||||
|
||||
void OS_InitLock();
|
||||
s32 OS_GetLockID(void);
|
||||
|
||||
#endif //POKEDIAMOND_OS_SPINLOCK_H
|
||||
|
||||
@@ -39,6 +39,9 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
|
||||
#define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE)
|
||||
#define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK)
|
||||
|
||||
#define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM + 0x007fffb0)
|
||||
#define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0)
|
||||
|
||||
#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8)
|
||||
|
||||
#define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#include "OS_init.h"
|
||||
|
||||
extern void PXI_Init();
|
||||
extern void OS_InitLock();
|
||||
extern void OS_InitException();
|
||||
extern void MI_Init();
|
||||
extern void OS_InitVAlarm();
|
||||
|
||||
46
arm9/lib/src/OS_spinLock.c
Normal file
46
arm9/lib/src/OS_spinLock.c
Normal file
@@ -0,0 +1,46 @@
|
||||
//
|
||||
// Created by red031000 on 2020-05-21.
|
||||
//
|
||||
|
||||
#include "OS_spinLock.h"
|
||||
#include "function_target.h"
|
||||
#include "consts.h"
|
||||
#include "MI_exMemory.h"
|
||||
|
||||
extern void OS_TryLockByWord(u16 param1, OSLockWord* lockp, void* func);
|
||||
extern void OS_UnlockByWord(u16 param1, OSLockWord* lockp, void* func);
|
||||
extern void MIi_CpuClear32(u32 param1, void * addr, u32 length); //not too sure about names
|
||||
|
||||
ARM_FUNC void OS_InitLock()
|
||||
{
|
||||
static BOOL isInitialized = FALSE;
|
||||
|
||||
if (isInitialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
isInitialized = TRUE;
|
||||
|
||||
OSLockWord* lockp = (OSLockWord *)0x027FFFF0;
|
||||
|
||||
lockp->lockFlag = 0;
|
||||
|
||||
(void)OS_TryLockByWord(0x7e, lockp, NULL);
|
||||
|
||||
while (lockp->extension)
|
||||
{
|
||||
OSi_WaitByLoop();
|
||||
}
|
||||
|
||||
((u32 *)HW_LOCK_ID_FLAG_MAIN)[0] = 0xffffffff;
|
||||
((u32 *)HW_LOCK_ID_FLAG_MAIN)[1] = 0xffff0000;
|
||||
|
||||
MIi_CpuClear32(0x0, (void *)HW_SHARED_LOCK_BUF, 0x28);
|
||||
|
||||
MIi_SetCardProcessor(MI_PROCESSOR_ARM7);
|
||||
|
||||
MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7);
|
||||
|
||||
OS_UnlockByWord(0x7e, lockp, NULL);
|
||||
OS_TryLockByWord(0x7f, lockp, NULL);
|
||||
}
|
||||
Reference in New Issue
Block a user