mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-30 12:26:48 -05:00
Merge pull request #52 from red031000/master
remove include/nitro and shift everything to arm9/lib
This commit is contained in:
2
Makefile
2
Makefile
@@ -82,7 +82,7 @@ OBJCOPY := $(CROSS)objcopy
|
||||
|
||||
# ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm9_thumb.s -o arm9.o
|
||||
ASFLAGS = -proc arm5te
|
||||
CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir include -ir include-mw
|
||||
CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir include -ir include-mw -ir arm9/lib/include
|
||||
LDFLAGS = -map -nodead -w off -proc v5te -interworking -map -symtab -m _start
|
||||
|
||||
####################### Other Tools #########################
|
||||
|
||||
@@ -83,7 +83,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
|
||||
CFLAGS = -O4,p -proc v4t -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir ../arm9/lib/include # temporary fix while arm7 libos hasn't been decomped
|
||||
LDFLAGS = -map -nodead -w off -proc v4t -interworking -map -symtab -m _start
|
||||
|
||||
####################### Other Tools #########################
|
||||
|
||||
@@ -88,7 +88,7 @@ OBJCOPY := $(CROSS)objcopy
|
||||
|
||||
# ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm9_thumb.s -o arm9.o
|
||||
ASFLAGS = -proc arm5te -i ..
|
||||
CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -interworking
|
||||
CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir lib/include -interworking
|
||||
LDFLAGS = -map -nodead -w off -proc v5te -interworking -map -symtab -m _start
|
||||
|
||||
####################### Other Tools #########################
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "global.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start OS_Init
|
||||
OS_Init: ; 0x020CC1B4
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
bl OS_InitArena
|
||||
bl PXI_Init
|
||||
bl OS_InitLock
|
||||
bl OS_InitArenaEx
|
||||
bl OS_InitIrqTable
|
||||
bl OS_SetIrqStackChecker
|
||||
bl OS_InitException
|
||||
bl MI_Init
|
||||
bl OS_InitVAlarm
|
||||
bl OSi_InitVramExclusive
|
||||
bl OS_InitThread
|
||||
bl OS_InitReset
|
||||
bl CTRDG_Init
|
||||
bl CARD_Init
|
||||
bl PM_Init
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
@@ -1,77 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "global.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start OS_EnableInterrupts
|
||||
OS_EnableInterrupts: ; 0x020CD2FC
|
||||
mrs r0, cpsr
|
||||
bic r1, r0, #0x80
|
||||
msr cpsr_c, r1
|
||||
and r0, r0, #0x80
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_DisableInterrupts
|
||||
OS_DisableInterrupts:
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #0x80
|
||||
msr cpsr_c, r1
|
||||
and r0, r0, #0x80
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_RestoreInterrupts
|
||||
OS_RestoreInterrupts:
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #0x80
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #0x80
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_DisableInterrupts_IrqAndFiq
|
||||
OS_DisableInterrupts_IrqAndFiq: ; 0x020CD33C
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #0xc0
|
||||
msr cpsr_c, r1
|
||||
and r0, r0, #0xc0
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_RestoreInterrupts_IrqAndFiq
|
||||
OS_RestoreInterrupts_IrqAndFiq: ; 0x020CD350
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #0xc0
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #0xc0
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_GetCpsrIrq
|
||||
OS_GetCpsrIrq: ; 0x020CD368
|
||||
mrs r0, cpsr
|
||||
and r0, r0, #0x80
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_GetProcMode
|
||||
OS_GetProcMode: ; 0x020CD374
|
||||
mrs r0, cpsr
|
||||
and r0, r0, #0x1f
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_SpinWait
|
||||
OS_SpinWait:
|
||||
subs r0, r0, #0x4
|
||||
bhs OS_SpinWait
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_WaitVBlankIntr
|
||||
OS_WaitVBlankIntr: ; 0x020CD38C
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
mov r0, #0x1
|
||||
blx SVC_WaitByLoop
|
||||
mov r0, #0x1
|
||||
mov r1, r0
|
||||
bl OS_WaitIrq
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
@@ -2,8 +2,8 @@
|
||||
// Created by mart on 4/12/20.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_H
|
||||
#define POKEDIAMOND_OS_H
|
||||
#ifndef POKEDIAMOND_OS_INIT_H
|
||||
#define POKEDIAMOND_OS_INIT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "consts.h"
|
||||
@@ -14,4 +14,4 @@
|
||||
|
||||
void OS_Init();
|
||||
|
||||
#endif //POKEDIAMOND_OS_H
|
||||
#endif //POKEDIAMOND_OS_INIT_H
|
||||
@@ -17,17 +17,22 @@ typedef enum {
|
||||
OS_PROCMODE_SYS=31
|
||||
} OSProcMode;
|
||||
|
||||
ENUMS_ALWAYS_INT_ON
|
||||
typedef enum {
|
||||
OS_INTRMODE_DISABLE = HW_PSR_IRQ_DISABLE,
|
||||
OS_INTRMODE_DISABLE_IRQ = HW_PSR_DISABLE_IRQ,
|
||||
OS_INTRMODE_DISABLE_FIQ = HW_PSR_DISABLE_FIQ,
|
||||
OS_INTRMODE_ENABLE = 0
|
||||
} OSIntrMode;
|
||||
ENUMS_ALWAYS_INT_RESET
|
||||
|
||||
OSIntrMode OS_EnableInterrupts();
|
||||
OSIntrMode OS_DisableInterrupts();
|
||||
OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
|
||||
OSIntrMode OS_DisableInterrupts_IrqAndFiq();
|
||||
OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
|
||||
OSIntrMode OS_GetCpsrIrq();
|
||||
OSProcMode OS_GetProcMode();
|
||||
|
||||
void OS_SpinWait();
|
||||
void OS_WaitVBlankIntr();
|
||||
|
||||
#endif //POKEDIAMOND_OS_SYSTEM_H
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
|
||||
#define HW_PSR_CPU_MODE_MASK 0x1f // CPU mode
|
||||
|
||||
#define HW_PSR_FIQ_DISABLE 0x40 // Disable FIQ
|
||||
#define HW_PSR_IRQ_DISABLE 0x80 // Disable IRQ
|
||||
#define HW_PSR_IRQ_FIQ_DISABLE 0xc0 // Disable FIQ and IRQ
|
||||
#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
|
||||
|
||||
#define HW_C6_PR_4KB 0x16
|
||||
#define HW_C6_PR_8KB 0x18
|
||||
@@ -42,4 +42,6 @@
|
||||
#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1))
|
||||
#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1))
|
||||
|
||||
#define OS_IE_V_BLANK (1UL << 0)
|
||||
|
||||
#endif //POKEDIAMOND_CONSTS_H
|
||||
|
||||
@@ -8,7 +8,7 @@ extern "C" {
|
||||
// Include all nitro files
|
||||
#include "types.h"
|
||||
#include "consts.h"
|
||||
#include "OS.h"
|
||||
#include "OS_init.h"
|
||||
#include "mmap.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
// Created by mart on 4/12/20.
|
||||
//
|
||||
|
||||
#include "os.h"
|
||||
#include "function_target.h"
|
||||
#include "OS_init.h"
|
||||
|
||||
extern void PXI_Init();
|
||||
extern void OS_InitLock();
|
||||
@@ -18,7 +19,7 @@ extern void CTRDG_Init();
|
||||
extern void CARD_Init();
|
||||
extern void PM_Init();
|
||||
|
||||
void OS_Init(void) {
|
||||
ARM_FUNC void OS_Init(void) {
|
||||
OS_InitArena();
|
||||
PXI_Init();
|
||||
OS_InitLock();
|
||||
@@ -35,4 +36,3 @@ void OS_Init(void) {
|
||||
CARD_Init();
|
||||
PM_Init();
|
||||
}
|
||||
|
||||
71
arm9/lib/src/OS_system.c
Normal file
71
arm9/lib/src/OS_system.c
Normal file
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// Created by mart on 4/23/20.
|
||||
//
|
||||
|
||||
#include "function_target.h"
|
||||
#include "OS_system.h"
|
||||
|
||||
ARM_FUNC asm OSIntrMode OS_EnableInterrupts() {
|
||||
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() {
|
||||
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(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() {
|
||||
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(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 OSIntrMode OS_GetCpsrIrq() {
|
||||
mrs r0, cpsr
|
||||
and r0, r0, #HW_PSR_DISABLE_IRQ
|
||||
bx lr
|
||||
}
|
||||
|
||||
ARM_FUNC asm OSProcMode OS_GetProcMode() {
|
||||
mrs r0, cpsr
|
||||
and r0, r0, #HW_PSR_CPU_MODE_MASK
|
||||
bx lr
|
||||
}
|
||||
|
||||
ARM_FUNC asm void OS_SpinWait() {
|
||||
subs r0, r0, #0x4
|
||||
bhs OS_SpinWait
|
||||
bx lr
|
||||
}
|
||||
|
||||
ARM_FUNC void OS_WaitVBlankIntr() {
|
||||
SVC_WaitByLoop(0x1);
|
||||
OS_WaitIrq(TRUE, OS_IE_V_BLANK);
|
||||
}
|
||||
@@ -4,4 +4,8 @@
|
||||
#define ARM_FUNC _Pragma("thumb off")
|
||||
#define THUMB_FUNC _Pragma("thumb on")
|
||||
|
||||
#define ENUMS_ALWAYS_INT_ON _Pragma("enumsalwaysint on")
|
||||
#define ENUMS_ALWAYS_INT_OFF _Pragma("enumsalwaysint off")
|
||||
#define ENUMS_ALWAYS_INT_RESET _Pragma("enumsalwaysint reset")
|
||||
|
||||
#endif //GUARD_FUNCTION_TARGET_H
|
||||
@@ -2,6 +2,6 @@
|
||||
#define GUARD_GLOBAL_H
|
||||
|
||||
#include "function_target.h"
|
||||
#include "nitro/nitro.h"
|
||||
#include "nitro.h"
|
||||
|
||||
#endif //GUARD_GLOBAL_H
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
//
|
||||
// Created by mart on 4/15/20.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_CONSTS_H
|
||||
#define POKEDIAMOND_CONSTS_H
|
||||
|
||||
#include "mmap.h"
|
||||
|
||||
#define HW_PSR_CPU_MODE_MASK 0x1f // CPU mode
|
||||
|
||||
#define HW_PSR_FIQ_DISABLE 0x40 // Disable FIQ
|
||||
#define HW_PSR_IRQ_DISABLE 0x80 // Disable IRQ
|
||||
#define HW_PSR_IRQ_FIQ_DISABLE 0xc0 // Disable FIQ and IRQ
|
||||
|
||||
#define HW_C6_PR_4KB 0x16
|
||||
#define HW_C6_PR_8KB 0x18
|
||||
#define HW_C6_PR_16KB 0x1a
|
||||
#define HW_C6_PR_32KB 0x1c
|
||||
#define HW_C6_PR_64KB 0x1e
|
||||
#define HW_C6_PR_128KB 0x20
|
||||
#define HW_C6_PR_256KB 0x22
|
||||
#define HW_C6_PR_512KB 0x24
|
||||
#define HW_C6_PR_1MB 0x26
|
||||
#define HW_C6_PR_2MB 0x28
|
||||
#define HW_C6_PR_4MB 0x2a
|
||||
#define HW_C6_PR_8MB 0x2c
|
||||
#define HW_C6_PR_16MB 0x2e
|
||||
#define HW_C6_PR_32MB 0x30
|
||||
#define HW_C6_PR_64MB 0x32
|
||||
#define HW_C6_PR_128MB 0x34
|
||||
#define HW_C6_PR_256MB 0x36
|
||||
#define HW_C6_PR_512MB 0x38
|
||||
#define HW_C6_PR_1GB 0x3a
|
||||
#define HW_C6_PR_2GB 0x3c
|
||||
#define HW_C6_PR_4GB 0x3e
|
||||
|
||||
#define OS_CONSOLE_SIZE_MASK 0x00000003
|
||||
#define OS_CONSOLE_SIZE_4MB 0x00000001
|
||||
|
||||
#define OSi_GetArenaInfo() (*(OSArenaInfo*)HW_ARENA_INFO_BUF)
|
||||
#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1))
|
||||
#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1))
|
||||
|
||||
#endif //POKEDIAMOND_CONSTS_H
|
||||
@@ -1,45 +0,0 @@
|
||||
#ifndef NITRO_MMAP_H
|
||||
#define NITRO_MMAP_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
extern u32 SDK_AUTOLOAD_DTCM_START[];
|
||||
|
||||
#define HW_MAIN_MEM 0x02000000
|
||||
#define HW_MAIN_MEM_SIZE 0x00400000
|
||||
#define HW_MAIN_MEM_EX_SIZE 0x00800000
|
||||
#define HW_MAIN_MEM_MAIN_SIZE 0x003E0000
|
||||
#define HW_MAIN_MEM_SHARED_SIZE 0x00001000
|
||||
#define HW_MAIN_MEM_DEBUGGER_OFFSET 0x00700000
|
||||
|
||||
#define HW_ITCM 0x01FF8000
|
||||
#define HW_ITCM_SIZE 0x00008000
|
||||
|
||||
#define HW_WRAM 0x037F8000
|
||||
|
||||
#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START)
|
||||
#define HW_DTCM_SIZE 0x00004000
|
||||
|
||||
#define HW_CARD_ROM_HEADER_SIZE 0x00000160
|
||||
#define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020
|
||||
|
||||
#define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) // Arena data structure
|
||||
#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer
|
||||
#define HW_RED_RESERVED (HW_MAIN_MEM + 0x007ff800) // Some kind of reserved data for shared memory
|
||||
#define HW_MAIN_MEM_MAIN_END (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE)
|
||||
#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE)
|
||||
#define HW_MAIN_MEM_SHARED (HW_MAIN_MEM_EX_END - HW_MAIN_MEM_SHARED_SIZE)
|
||||
#define HW_DTCM_SVC_STACK_END (HW_DTCM + 0x00003fc0)
|
||||
#define HW_SVC_STACK_SIZE 0x00000040
|
||||
#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 OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END)
|
||||
#define OSi_MAINEX_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_DEBUGGER_OFFSET)
|
||||
#define HW_ITCM_ARENA_HI_DEFAULT (HW_ITCM + HW_ITCM_SIZE)
|
||||
#define HW_SHARED_ARENA_HI_DEFAULT (HW_RED_RESERVED - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE)
|
||||
#define HW_SHARED_ARENA_LO_DEFAULT (HW_MAIN_MEM_SHARED)
|
||||
#define OSi_WRAM_MAIN_ARENA_HI_DEFAULT (HW_WRAM)
|
||||
#define OSi_WRAM_MAIN_ARENA_LO_DEFAULT (HW_WRAM)
|
||||
|
||||
#endif
|
||||
@@ -1,18 +0,0 @@
|
||||
#ifndef POKEDIAMOND_NITRO_H
|
||||
#define POKEDIAMOND_NITRO_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Include all nitro files
|
||||
#include "types.h"
|
||||
#include "consts.h"
|
||||
#include "os.h"
|
||||
#include "mmap.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif //POKEDIAMOND_NITRO_H
|
||||
@@ -1,17 +0,0 @@
|
||||
//
|
||||
// Created by mart on 4/12/20.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_H
|
||||
#define POKEDIAMOND_OS_H
|
||||
|
||||
#include "types.h"
|
||||
#include "consts.h"
|
||||
#include "os_protectionRegion.h"
|
||||
#include "os_arena.h"
|
||||
#include "os_alloc.h"
|
||||
#include "os_system.h"
|
||||
|
||||
void OS_Init();
|
||||
|
||||
#endif //POKEDIAMOND_OS_H
|
||||
@@ -1,257 +0,0 @@
|
||||
//
|
||||
// Created by mart on 4/23/20.
|
||||
//
|
||||
|
||||
#include "os_alloc.h"
|
||||
#include "consts.h"
|
||||
#include "os_system.h"
|
||||
|
||||
extern Cell* DLInsert(Cell* list, Cell* cell);
|
||||
extern Cell* DLAddFront(Cell* list, Cell* cell);
|
||||
|
||||
void* OSiHeapInfo[OS_ARENA_MAX] = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm static Cell* DLExtract(Cell* list, Cell* cell)
|
||||
{
|
||||
ldr r3, [r1, #0x4]
|
||||
cmp r3, #0x0
|
||||
ldrne r2, [r1, #0x0]
|
||||
strne r2, [r3, #0x0]
|
||||
ldr r2, [r1, #0x0]
|
||||
cmp r2, #0x0
|
||||
ldreq r0, [r1, #0x4]
|
||||
ldrne r1, [r1, #0x4]
|
||||
strne r1, [r2, #0x4]
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
static Cell* DLExtract(Cell* list, Cell* cell)
|
||||
{
|
||||
if (cell->next) {
|
||||
cell->prev = cell->next->prev;
|
||||
}
|
||||
if (cell->prev) {
|
||||
cell->prev->next = cell->next;
|
||||
return list;
|
||||
}
|
||||
else {
|
||||
return cell->next;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#define HEADERSIZE OSi_ROUND(sizeof(Cell), 32)
|
||||
#define MINOBJSIZE (HEADERSIZE+32)
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) {
|
||||
stmdb sp!, {r4-r7, lr}
|
||||
sub sp,sp,#0x4
|
||||
mov r7,r0
|
||||
mov r5,r1
|
||||
mov r4,r2
|
||||
bl OS_DisableInterrupts
|
||||
ldr r1,=OSiHeapInfo
|
||||
mov r6,r0
|
||||
ldr r0,[r1,r7,lsl #0x2]
|
||||
cmp r5,#0x0
|
||||
ldrlt r5,[r0,#0x0]
|
||||
ldr r1,[r0,#0x10]
|
||||
mov r0,#0xc
|
||||
mla r7,r5,r0,r1
|
||||
sub r4,r4,#0x20
|
||||
ldr r0,[r7,#0x8]
|
||||
mov r1,r4
|
||||
bl DLExtract
|
||||
str r0,[r7,#0x8]
|
||||
ldr r0,[r7,#0x4]
|
||||
mov r1,r4
|
||||
bl DLInsert
|
||||
str r0,[r7,#0x4]
|
||||
mov r0,r6
|
||||
bl OS_RestoreInterrupts
|
||||
add sp,sp,#0x4
|
||||
ldmia sp!,{ r4-r7, lr }
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void* ptr) {
|
||||
OSHeapInfo *heapInfo;
|
||||
HeapDesc *hd;
|
||||
Cell *cell;
|
||||
|
||||
OSIntrMode enabled = OS_DisableInterrupts();
|
||||
heapInfo = OSiHeapInfo[id];
|
||||
|
||||
if (heap < 0) {
|
||||
heap = heapInfo->currentHeap;
|
||||
}
|
||||
|
||||
cell = (Cell *) ((char *)ptr - HEADERSIZE);
|
||||
hd = &heapInfo->heapArray[heap];
|
||||
|
||||
hd->allocated = DLExtract(hd->allocated, cell);
|
||||
hd->free = DLInsert(hd->free, cell);
|
||||
|
||||
OS_RestoreInterrupts(enabled);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) {
|
||||
stmdb sp!, {r4-r7,lr}
|
||||
sub sp, sp, #0x4
|
||||
mov r6, r0
|
||||
mov r5, r1
|
||||
mov r7, r2
|
||||
bl OS_DisableInterrupts
|
||||
ldr r1, =OSiHeapInfo
|
||||
mov r4, r0
|
||||
ldr r1, [r1, r6, lsl #0x2]
|
||||
cmp r1, #0x0
|
||||
bne _020CC7AC
|
||||
bl OS_RestoreInterrupts
|
||||
add sp, sp, #0x4
|
||||
mov r0, #0x0
|
||||
ldmia sp!, {r4-r7,lr}
|
||||
bx lr
|
||||
_020CC7AC:
|
||||
cmp r5, #0x0
|
||||
ldrlt r5, [r1, #0x0]
|
||||
ldr r1, [r1, #0x10]
|
||||
mov r0, #0xc
|
||||
mla r6, r5, r0, r1
|
||||
ldr r0, [r6, #0x4]
|
||||
add r1, r7, #0x20
|
||||
add r1, r1, #0x1f
|
||||
mov r5, r0
|
||||
cmp r0, #0x0
|
||||
bic r7, r1, #0x1f
|
||||
beq _020CC7F4
|
||||
_020CC7DC:
|
||||
ldr r1, [r5, #0x8]
|
||||
cmp r7, r1
|
||||
ble _020CC7F4
|
||||
ldr r5, [r5, #0x4]
|
||||
cmp r5, #0x0
|
||||
bne _020CC7DC
|
||||
_020CC7F4:
|
||||
cmp r5, #0x0
|
||||
bne _020CC814
|
||||
mov r0, r4
|
||||
bl OS_RestoreInterrupts
|
||||
add sp, sp, #0x4
|
||||
mov r0, #0x0
|
||||
ldmia sp!, {r4-r7,lr}
|
||||
bx lr
|
||||
_020CC814:
|
||||
ldr r1, [r5, #0x8]
|
||||
sub r1, r1, r7
|
||||
cmp r1, #0x40
|
||||
bhs _020CC834
|
||||
mov r1, r5
|
||||
bl DLExtract
|
||||
str r0, [r6, #0x4]
|
||||
b _020CC86C
|
||||
_020CC834:
|
||||
str r7, [r5, #0x8]
|
||||
add r2, r5, r7
|
||||
str r1, [r2, #0x8]
|
||||
ldr r0, [r5, #0x0]
|
||||
str r0, [r5, r7]
|
||||
ldr r0, [r5, #0x4]
|
||||
str r0, [r2, #0x4]
|
||||
ldr r0, [r2, #0x4]
|
||||
cmp r0, #0x0
|
||||
strne r2, [r0, #0x0]
|
||||
ldr r0, [r2, #0x0]
|
||||
cmp r0, #0x0
|
||||
strne r2, [r0, #0x4]
|
||||
streq r2, [r6, #0x4]
|
||||
_020CC86C:
|
||||
ldr r0, [r6, #0x8]
|
||||
mov r1, r5
|
||||
bl DLAddFront
|
||||
str r0, [r6, #0x8]
|
||||
mov r0, r4
|
||||
bl OS_RestoreInterrupts
|
||||
add r0, r5, #0x20
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r7,lr}
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size) {
|
||||
OSHeapInfo* heapInfo;
|
||||
HeapDesc* hd;
|
||||
Cell* cell;
|
||||
Cell* newCell;
|
||||
long leftoverSize;
|
||||
|
||||
OSIntrMode enabled = OS_DisableInterrupts();
|
||||
heapInfo = OSiHeapInfo[id];
|
||||
if (!heapInfo) {
|
||||
OS_RestoreInterrupts(enabled);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (heap < 0) {
|
||||
heap = heapInfo->currentHeap;
|
||||
}
|
||||
|
||||
hd = &heapInfo->heapArray[heap];
|
||||
|
||||
size += HEADERSIZE;
|
||||
size = OSi_ROUND(size, 32);
|
||||
|
||||
for (cell = hd->free; cell != NULL; cell = cell->next) {
|
||||
if ((long)size <= cell->size) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cell == NULL) {
|
||||
OS_RestoreInterrupts(enabled);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
leftoverSize = cell->size - (long)size;
|
||||
if (leftoverSize < MINOBJSIZE) {
|
||||
hd->free = DLExtract(hd->free, cell);
|
||||
} else {
|
||||
cell->size = (long)size;
|
||||
|
||||
newCell = (Cell *) ((char *)cell + size);
|
||||
newCell->size = leftoverSize;
|
||||
|
||||
newCell->prev = cell->prev;
|
||||
newCell->next = cell->next;
|
||||
|
||||
if (newCell->next != NULL) {
|
||||
newCell->next->prev = newCell;
|
||||
}
|
||||
|
||||
if (newCell->prev != NULL) {
|
||||
newCell->prev->next = newCell;
|
||||
} else {
|
||||
hd->free = newCell;
|
||||
}
|
||||
}
|
||||
|
||||
hd->allocated = DLAddFront(hd->allocated, cell);
|
||||
|
||||
OS_RestoreInterrupts(enabled);
|
||||
return (void *)((char *)cell + HEADERSIZE);
|
||||
}
|
||||
#endif
|
||||
@@ -1,38 +0,0 @@
|
||||
//
|
||||
// Created by mart on 4/23/20.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_ALLOC_H
|
||||
#define POKEDIAMOND_OS_ALLOC_H
|
||||
|
||||
#include "types.h"
|
||||
#include "os_arena.h"
|
||||
|
||||
typedef int OSHeapHandle;
|
||||
|
||||
typedef struct Cell Cell;
|
||||
|
||||
struct Cell {
|
||||
Cell* prev;
|
||||
Cell* next;
|
||||
long size;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
long size;
|
||||
Cell *free;
|
||||
Cell *allocated;
|
||||
} HeapDesc;
|
||||
|
||||
typedef struct {
|
||||
volatile OSHeapHandle currentHeap;
|
||||
int numHeaps;
|
||||
void* arenaStart;
|
||||
void* arenaEnd;
|
||||
HeapDesc* heapArray;
|
||||
} OSHeapInfo;
|
||||
|
||||
void OS_FreeToHeap(OSArenaId id, OSHeapHandle heap, void *ptr);
|
||||
void* OS_AllocFromHeap(OSArenaId id, OSHeapHandle heap, u32 size);
|
||||
|
||||
#endif //POKEDIAMOND_OS_ALLOC_H
|
||||
@@ -1,539 +0,0 @@
|
||||
//
|
||||
// Created by red031000 on 2020-04-27.
|
||||
//
|
||||
|
||||
#include "consts.h"
|
||||
#include "os_arena.h"
|
||||
#include "os_protectionRegion.h"
|
||||
|
||||
extern u32 OS_GetConsoleType();
|
||||
extern BOOL OSi_MainExArenaEnabled;
|
||||
extern BOOL OSi_Initialized; // TODO: located at 0x021d36f0
|
||||
void SDK_MAIN_ARENA_LO(); // TODO: technically this should be defined in the lcf
|
||||
extern void SDK_SECTION_ARENA_EX_START(); // TODO: technically this should be defined in the lcf
|
||||
extern void SDK_SECTION_ARENA_ITCM_START(); // TODO: technically this should be defined in the lcf
|
||||
extern void SDK_SECTION_ARENA_DTCM_START(); // TODO: technically this should be defined in the lcf
|
||||
extern void SDK_IRQ_STACKSIZE(); // TODO: technically this should be defined in the lcf
|
||||
extern void SDK_SYS_STACKSIZE(); // TODO: technically this should be defined in the lcf
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void OS_InitArena() {
|
||||
stmdb sp!,{ lr }
|
||||
sub sp,sp,#0x4
|
||||
ldr r1, =OSi_Initialized
|
||||
ldr r0,[r1,#0x0]
|
||||
cmp r0,#0x0
|
||||
addne sp,sp,#0x4
|
||||
ldmneia sp!,{ lr }
|
||||
bxne lr
|
||||
mov r2,#0x1
|
||||
mov r0,#0x0
|
||||
str r2,[r1,#0x0]
|
||||
bl OS_GetInitArenaHi
|
||||
mov r1,r0
|
||||
mov r0,#0x0
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x0
|
||||
bl OS_GetInitArenaLo
|
||||
mov r1,r0
|
||||
mov r0,#0x0
|
||||
bl OS_SetArenaLo
|
||||
mov r0,#0x2
|
||||
mov r1,#0x0
|
||||
bl OS_SetArenaLo
|
||||
mov r0,#0x2
|
||||
mov r1,#0x0
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x3
|
||||
bl OS_GetInitArenaHi
|
||||
mov r1,r0
|
||||
mov r0,#0x3
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x3
|
||||
bl OS_GetInitArenaLo
|
||||
mov r1,r0
|
||||
mov r0,#0x3
|
||||
bl OS_SetArenaLo
|
||||
mov r0,#0x4
|
||||
bl OS_GetInitArenaHi
|
||||
mov r1,r0
|
||||
mov r0,#0x4
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x4
|
||||
bl OS_GetInitArenaLo
|
||||
mov r1,r0
|
||||
mov r0,#0x4
|
||||
bl OS_SetArenaLo
|
||||
mov r0,#0x5
|
||||
bl OS_GetInitArenaHi
|
||||
mov r1,r0
|
||||
mov r0,#0x5
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x5
|
||||
bl OS_GetInitArenaLo
|
||||
mov r1,r0
|
||||
mov r0,#0x5
|
||||
bl OS_SetArenaLo
|
||||
mov r0,#0x6
|
||||
bl OS_GetInitArenaHi
|
||||
mov r1,r0
|
||||
mov r0,#0x6
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x6
|
||||
bl OS_GetInitArenaLo
|
||||
mov r1,r0
|
||||
mov r0,#0x6
|
||||
bl OS_SetArenaLo
|
||||
add sp,sp,#0x4
|
||||
ldmia sp!,{ lr }
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void OS_InitArena() {
|
||||
if (OSi_Initialized) {
|
||||
return;
|
||||
}
|
||||
OSi_Initialized = TRUE;
|
||||
|
||||
OS_SetArenaHi(OS_ARENA_MAIN, OS_GetInitArenaHi(OS_ARENA_MAIN));
|
||||
OS_SetArenaLo(OS_ARENA_MAIN, OS_GetInitArenaLo(OS_ARENA_MAIN));
|
||||
|
||||
OS_SetArenaLo(OS_ARENA_MAINEX, (void *)0);
|
||||
OS_SetArenaHi(OS_ARENA_MAINEX, (void *)0);
|
||||
|
||||
OS_SetArenaHi(OS_ARENA_ITCM, OS_GetInitArenaHi(OS_ARENA_ITCM));
|
||||
OS_SetArenaLo(OS_ARENA_ITCM, OS_GetInitArenaLo(OS_ARENA_ITCM));
|
||||
|
||||
OS_SetArenaHi(OS_ARENA_DTCM, OS_GetInitArenaHi(OS_ARENA_DTCM));
|
||||
OS_SetArenaLo(OS_ARENA_DTCM, OS_GetInitArenaLo(OS_ARENA_DTCM));
|
||||
|
||||
OS_SetArenaHi(OS_ARENA_SHARED, OS_GetInitArenaHi(OS_ARENA_SHARED));
|
||||
OS_SetArenaLo(OS_ARENA_SHARED, OS_GetInitArenaLo(OS_ARENA_SHARED));
|
||||
|
||||
OS_SetArenaHi(OS_ARENA_WRAM_MAIN, OS_GetInitArenaHi(OS_ARENA_WRAM_MAIN));
|
||||
OS_SetArenaLo(OS_ARENA_WRAM_MAIN, OS_GetInitArenaLo(OS_ARENA_WRAM_MAIN));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void OS_InitArenaEx() {
|
||||
stmdb sp!,{ lr }
|
||||
sub sp,sp,#0x4
|
||||
mov r0,#0x2
|
||||
bl OS_GetInitArenaHi
|
||||
mov r1,r0
|
||||
mov r0,#0x2
|
||||
bl OS_SetArenaHi
|
||||
mov r0,#0x2
|
||||
bl OS_GetInitArenaLo
|
||||
mov r1,r0
|
||||
mov r0,#0x2
|
||||
bl OS_SetArenaLo
|
||||
ldr r0, =OSi_MainExArenaEnabled
|
||||
ldr r0,[r0,#0x0]
|
||||
cmp r0,#0x0
|
||||
beq _020CC5B8
|
||||
bl OS_GetConsoleType
|
||||
and r0,r0,#0x3
|
||||
cmp r0,#0x1
|
||||
addne sp,sp,#0x4
|
||||
ldmneia sp!,{ lr }
|
||||
bxne lr
|
||||
_020CC5B8:
|
||||
ldr r0, =0x0200002b
|
||||
bl OS_SetProtectionRegion1
|
||||
ldr r0, =0x023e0021
|
||||
bl OS_SetProtectionRegion2
|
||||
add sp,sp,#0x4
|
||||
ldmia sp!,{ lr }
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void OS_InitArenaEx() {
|
||||
OS_SetArenaHi(2, OS_GetInitArenaHi(OS_ARENA_MAINEX));
|
||||
OS_SetArenaLo(2, OS_GetInitArenaLo(OS_ARENA_MAINEX));
|
||||
|
||||
if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) {
|
||||
OS_SetProtectionRegion(1, HW_MAIN_MEM, 4MB);
|
||||
OS_SetProtectionRegion(2, HW_MAIN_MEM_MAIN_END, 128KB);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_GetArenaHi(OSArenaId id) {
|
||||
mov r0,r0, lsl #0x2
|
||||
add r0,r0,#0x2700000
|
||||
add r0,r0,#0xff000
|
||||
ldr r0,[r0,#0xdc4]
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_GetArenaHi(OSArenaId id) {
|
||||
return OSi_GetArenaInfo().hi[id];
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_GetArenaLo(OSArenaId id) {
|
||||
mov r0,r0, lsl #0x2
|
||||
add r0,r0,#0x2700000
|
||||
add r0,r0,#0xff000
|
||||
ldr r0,[r0,#0xda0]
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_GetArenaLo(OSArenaId id) {
|
||||
return OSi_GetArenaInfo().lo[id];
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_GetInitArenaHi(OSArenaId id) {
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
cmp r0, #0x6
|
||||
addls pc, pc, r0, lsl #0x2
|
||||
b _020CC508
|
||||
_020CC41C:
|
||||
b _020CC438
|
||||
b _020CC508
|
||||
b _020CC448
|
||||
b _020CC488
|
||||
b _020CC498
|
||||
b _020CC4E8
|
||||
b _020CC4F8
|
||||
_020CC438:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =OSi_MAIN_ARENA_HI_DEFAULT
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC448:
|
||||
ldr r0, =OSi_MainExArenaEnabled
|
||||
ldr r0, [r0]
|
||||
cmp r0, #0x0
|
||||
beq _020CC468
|
||||
bl OS_GetConsoleType
|
||||
and r0, r0, #0x3
|
||||
cmp r0, #0x1
|
||||
bne _020CC478
|
||||
_020CC468:
|
||||
add sp, sp, #0x4
|
||||
mov r0, #0x0
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC478:
|
||||
add sp, sp, #0x4
|
||||
mov r0, #OSi_MAINEX_ARENA_HI_DEFAULT
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC488:
|
||||
add sp, sp, #0x4
|
||||
mov r0, #HW_ITCM_ARENA_HI_DEFAULT
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC498:
|
||||
ldr r0, =0x027E0000
|
||||
ldr r1, =0x00000000
|
||||
ldr r2, =0x00000400
|
||||
add r3, r0, #0x3f80
|
||||
cmp r1, #0x0
|
||||
sub r2, r3, r2
|
||||
bne _020CC4CC
|
||||
ldr r1, =0x027E0080
|
||||
add sp, sp, #0x4
|
||||
cmp r0, r1
|
||||
movcc r0, r1
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC4CC:
|
||||
cmp r1, #0x0
|
||||
ldrlt r0, =0x027E0080
|
||||
add sp, sp, #0x4
|
||||
sublt r0, r0, r1
|
||||
subge r0, r2, r1
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC4E8:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =HW_SHARED_ARENA_HI_DEFAULT
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC4F8:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =OSi_WRAM_MAIN_ARENA_HI_DEFAULT;
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC508:
|
||||
mov r0, #0x0
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_GetInitArenaHi(OSArenaId id) {
|
||||
switch (id) {
|
||||
case OS_ARENA_MAIN:
|
||||
return (void *)OSi_MAIN_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_MAINEX:
|
||||
if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) {
|
||||
return (void *)0;
|
||||
} else {
|
||||
return (void *)OSi_MAINEX_ARENA_HI_DEFAULT;
|
||||
}
|
||||
case OS_ARENA_ITCM:
|
||||
return (void *)HW_ITCM_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_DTCM:
|
||||
u32 irqStackLo = (u32)HW_DTCM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE;
|
||||
u32 sysStackLo;
|
||||
|
||||
if (!(s32)SDK_SYS_STACKSIZE) {
|
||||
sysStackLo = HW_DTCM;
|
||||
if (sysStackLo < (u32)SDK_SECTION_ARENA_DTCM_START) {
|
||||
sysStackLo = (u32)SDK_SECTION_ARENA_DTCM_START;
|
||||
}
|
||||
}
|
||||
else if ((s32)SDK_SYS_STACKSIZE < 0) {
|
||||
sysStackLo = (u32)SDK_SECTION_ARENA_DTCM_START - (s32)SDK_SYS_STACKSIZE;
|
||||
}
|
||||
else {
|
||||
sysStackLo = irqStackLo - (s32)SDK_SYS_STACKSIZE;
|
||||
}
|
||||
return (void*)sysStackLo;
|
||||
case OS_ARENA_SHARED:
|
||||
return (void *)HW_SHARED_ARENA_HI_DEFAULT;
|
||||
case OS_ARENA_WRAM_MAIN:
|
||||
return (void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_GetInitArenaLo(OSArenaId id) {
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
cmp r0, #0x6
|
||||
addls pc, pc, r0, lsl #0x2
|
||||
b _020CC3DC
|
||||
_020CC330:
|
||||
b _020CC34C
|
||||
b _020CC3DC
|
||||
b _020CC35C
|
||||
b _020CC39C
|
||||
b _020CC3AC
|
||||
b _020CC3BC
|
||||
b _020CC3CC
|
||||
_020CC34C:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =SDK_MAIN_ARENA_LO
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC35C:
|
||||
ldr r0, =OSi_MainExArenaEnabled
|
||||
ldr r0, [r0]
|
||||
cmp r0, #0x0
|
||||
beq _020CC37C
|
||||
bl OS_GetConsoleType
|
||||
and r0, r0, #0x3
|
||||
cmp r0, #0x1
|
||||
bne _020CC38C
|
||||
_020CC37C:
|
||||
add sp, sp, #0x4
|
||||
mov r0, #0x0
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC38C:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =SDK_SECTION_ARENA_EX_START
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC39C:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =SDK_SECTION_ARENA_ITCM_START
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3AC:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =SDK_SECTION_ARENA_DTCM_START
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3BC:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =HW_SHARED_ARENA_LO_DEFAULT
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3CC:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, =OSi_WRAM_MAIN_ARENA_LO_DEFAULT
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3DC:
|
||||
mov r0, #0x0
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_GetInitArenaLo(OSArenaId id) {
|
||||
switch (id) {
|
||||
case OS_ARENA_MAIN:
|
||||
return (void *)SDK_MAIN_ARENA_LO;
|
||||
case OS_ARENA_MAINEX:
|
||||
if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) {
|
||||
return NULL;
|
||||
} else {
|
||||
return (void *)SDK_SECTION_ARENA_EX_START;
|
||||
}
|
||||
case OS_ARENA_ITCM:
|
||||
return (void *)SDK_SECTION_ARENA_ITCM_START;
|
||||
case OS_ARENA_DTCM:
|
||||
return (void *)SDK_SECTION_ARENA_DTCM_START;
|
||||
case OS_ARENA_SHARED:
|
||||
return (void *)HW_SHARED_ARENA_LO_DEFAULT;
|
||||
case OS_ARENA_WRAM_MAIN:
|
||||
return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void OS_SetArenaHi(OSArenaId id, void* newHi) {
|
||||
mov r0,r0, lsl #0x2
|
||||
add r0,r0,#0x2700000
|
||||
add r0,r0,#0xff000
|
||||
str r1,[r0,#0xdc4]
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void OS_SetArenaHi(OSArenaId id, void* newHi) {
|
||||
OSi_GetArenaInfo().hi[id] = newHi;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void OS_SetArenaLo(OSArenaId id, void* newLo) {
|
||||
mov r0,r0, lsl #0x2
|
||||
add r0,r0,#0x2700000
|
||||
add r0,r0,#0xff000
|
||||
str r1,[r0,#0xda0]
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void OS_SetArenaLo(OSArenaId id, void* newLo) {
|
||||
OSi_GetArenaInfo().lo[id] = newLo;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
|
||||
stmdb sp!,{ r4-r7, lr }
|
||||
sub sp,sp,#0x4
|
||||
mov r7,r0
|
||||
mov r6,r1
|
||||
mov r5,r2
|
||||
bl OS_GetArenaLo
|
||||
cmp r0,#0x0
|
||||
addeq sp,sp,#0x4
|
||||
moveq r0,#0x0
|
||||
ldmeqia sp!,{ r4-r7, lr }
|
||||
bxeq lr
|
||||
add r0,r0,r5
|
||||
sub r1,r5,#0x1
|
||||
mvn r2,r1
|
||||
sub r0,r0,#0x1
|
||||
and r4,r2,r0
|
||||
add r0,r4,r6
|
||||
add r0,r0,r5
|
||||
sub r1,r0,#0x1
|
||||
mov r0,r7
|
||||
and r5,r2,r1
|
||||
bl OS_GetArenaHi
|
||||
cmp r5,r0
|
||||
addhi sp,sp,#0x4
|
||||
movhi r0,#0x0
|
||||
ldmhiia sp!,{ r4-r7, lr }
|
||||
bxhi lr
|
||||
mov r0,r7
|
||||
mov r1,r5
|
||||
bl OS_SetArenaLo
|
||||
mov r0,r4
|
||||
add sp,sp,#0x4
|
||||
ldmia sp!,{ r4-r7, lr }
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
|
||||
void* ptr;
|
||||
u8* arenaLo;
|
||||
ptr = OS_GetArenaLo(id);
|
||||
if (!ptr) {
|
||||
return NULL;
|
||||
}
|
||||
arenaLo = ptr = (void *)OSi_ROUND(ptr, align);
|
||||
arenaLo += size;
|
||||
arenaLo = (u8 *)OSi_ROUND(arenaLo, align);
|
||||
if (arenaLo > (u8*)OS_GetArenaHi(id)) {
|
||||
return NULL;
|
||||
}
|
||||
OS_SetArenaLo(id, arenaLo);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MATCH_ASM
|
||||
asm void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
|
||||
stmdb sp!,{ r4-r6, lr }
|
||||
mov r4,r0
|
||||
mov r6,r1
|
||||
mov r5,r2
|
||||
bl OS_GetArenaHi
|
||||
cmp r0,#0x0
|
||||
moveq r0,#0x0
|
||||
ldmeqia sp!,{ r4-r6, lr }
|
||||
bxeq lr
|
||||
sub r1,r5,#0x1
|
||||
mvn r2,r1
|
||||
and r0,r0,r2
|
||||
sub r1,r0,r6
|
||||
mov r0,r4
|
||||
and r5,r1,r2
|
||||
bl OS_GetArenaLo
|
||||
cmp r5,r0
|
||||
movcc r0,#0x0
|
||||
ldmccia sp!,{ r4-r6, lr }
|
||||
bxcc lr
|
||||
mov r0,r4
|
||||
mov r1,r5
|
||||
bl OS_SetArenaHi
|
||||
mov r0,r5
|
||||
ldmia sp!,{ r4-r6, lr }
|
||||
bx lr
|
||||
}
|
||||
#else
|
||||
void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
|
||||
void* ptr;
|
||||
u8* arenaHi;
|
||||
|
||||
arenaHi = OS_GetArenaHi(id);
|
||||
if (!arenaHi) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arenaHi = (u8 *)OSi_TRUNC(arenaHi, align);
|
||||
arenaHi -= size;
|
||||
arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align);
|
||||
|
||||
if (arenaHi < (u8*)OS_GetArenaLo(id)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
OS_SetArenaHi(id, arenaHi);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
#endif
|
||||
@@ -1,41 +0,0 @@
|
||||
//
|
||||
// Created by red031000 on 2020-04-27.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_ARENA_H
|
||||
#define POKEDIAMOND_OS_ARENA_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
typedef enum {
|
||||
OS_ARENA_MAIN = 0,
|
||||
OS_ARENA_MAIN_SUBPRIV = 1,
|
||||
OS_ARENA_MAINEX = 2,
|
||||
OS_ARENA_ITCM = 3,
|
||||
OS_ARENA_DTCM = 4,
|
||||
OS_ARENA_SHARED = 5,
|
||||
OS_ARENA_WRAM_MAIN = 6,
|
||||
OS_ARENA_WRAM_SUB = 7,
|
||||
OS_ARENA_WRAM_SUBPRIV = 8,
|
||||
OS_ARENA_MAX = 9
|
||||
} OSArenaId;
|
||||
|
||||
typedef struct {
|
||||
void* lo[OS_ARENA_MAX];
|
||||
void* hi[OS_ARENA_MAX];
|
||||
u16 initialized;
|
||||
u8 padding[2];
|
||||
} OSArenaInfo;
|
||||
|
||||
void OS_InitArena();
|
||||
void OS_InitArenaEx();
|
||||
void* OS_GetArenaHi(OSArenaId id);
|
||||
void* OS_GetArenaLo(OSArenaId id);
|
||||
void* OS_GetInitArenaHi(OSArenaId id);
|
||||
void* OS_GetInitArenaLo(OSArenaId id);
|
||||
void OS_SetArenaHi(OSArenaId id, void *newHi);
|
||||
void OS_SetArenaLo(OSArenaId id, void *newLo);
|
||||
void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align);
|
||||
void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align);
|
||||
|
||||
#endif //POKEDIAMOND_OS_ARENA_H
|
||||
@@ -1,17 +0,0 @@
|
||||
//
|
||||
// Created by red031000 on 2020-04-24.
|
||||
//
|
||||
|
||||
#include "os_protectionRegion.h"
|
||||
|
||||
asm void OS_SetProtectionRegion1(u32 param)
|
||||
{
|
||||
mcr p15, 0x0, r0, c6, c1, 0x0
|
||||
bx lr
|
||||
}
|
||||
|
||||
asm void OS_SetProtectionRegion2(u32 param)
|
||||
{
|
||||
mcr p15, 0x0, r0, c6, c2, 0x0
|
||||
bx lr
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
//
|
||||
// Created by red031000 on 2020-04-24.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_PROTECTIONREGION_H
|
||||
#define POKEDIAMOND_OS_PROTECTIONREGION_H
|
||||
|
||||
#include "types.h"
|
||||
#include "consts.h"
|
||||
|
||||
void OS_SetProtectionRegion1(u32 param);
|
||||
void OS_SetProtectionRegion2(u32 param);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OSi_PR_BASE_MASK_4KB = 0xfffff000,
|
||||
OSi_PR_BASE_MASK_8KB = 0xffffe000,
|
||||
OSi_PR_BASE_MASK_16KB = 0xffffc000,
|
||||
OSi_PR_BASE_MASK_32KB = 0xffff8000,
|
||||
OSi_PR_BASE_MASK_64KB = 0xffff0000,
|
||||
OSi_PR_BASE_MASK_128KB = 0xfffe0000,
|
||||
OSi_PR_BASE_MASK_256KB = 0xfffc0000,
|
||||
OSi_PR_BASE_MASK_512KB = 0xfff80000,
|
||||
OSi_PR_BASE_MASK_1MB = 0xfff00000,
|
||||
OSi_PR_BASE_MASK_2MB = 0xffe00000,
|
||||
OSi_PR_BASE_MASK_4MB = 0xffc00000,
|
||||
OSi_PR_BASE_MASK_8MB = 0xff800000,
|
||||
OSi_PR_BASE_MASK_16MB = 0xff000000,
|
||||
OSi_PR_BASE_MASK_32MB = 0xfe000000,
|
||||
OSi_PR_BASE_MASK_64MB = 0xfc000000,
|
||||
OSi_PR_BASE_MASK_128MB = 0xf8000000,
|
||||
OSi_PR_BASE_MASK_256MB = 0xf0000000,
|
||||
OSi_PR_BASE_MASK_512MB = 0xe0000000,
|
||||
OSi_PR_BASE_MASK_1GB = 0xc0000000,
|
||||
OSi_PR_BASE_MASK_2GB = 0x80000000,
|
||||
OSi_PR_BASE_MASK_4GB = 0x00000000
|
||||
} OSiProtectionRegionBaseMask;
|
||||
|
||||
static inline u32 OSi_CalcPRParam(u32 address, u32 size, OSiProtectionRegionBaseMask mask) {
|
||||
return ((address & mask) | size);
|
||||
}
|
||||
|
||||
#define OS_SetProtectionRegion(regionNo, address, sizeStr) \
|
||||
OS_SetProtectionRegion##regionNo(OSi_CalcPRParam(address, HW_C6_PR_##sizeStr, OSi_PR_BASE_MASK_##sizeStr) \
|
||||
| 1)
|
||||
|
||||
#endif //POKEDIAMOND_OS_PROTECTIONREGION_H
|
||||
@@ -1,28 +0,0 @@
|
||||
//
|
||||
// Created by mart on 4/23/20.
|
||||
//
|
||||
|
||||
#include "os_system.h"
|
||||
|
||||
asm OSIntrMode OS_DisableInterrupts() {
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #HW_PSR_IRQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
and r0, r0, #HW_PSR_IRQ_DISABLE
|
||||
bx lr
|
||||
}
|
||||
|
||||
asm OSIntrMode OS_RestoreInterrupts(OSIntrMode state) {
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_IRQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_IRQ_DISABLE
|
||||
bx lr
|
||||
}
|
||||
|
||||
asm OSProcMode OS_GetProcMode() {
|
||||
mrs r0, cpsr
|
||||
and r0, r0, #HW_PSR_CPU_MODE_MASK
|
||||
bx lr
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
//
|
||||
// Created by mart on 4/23/20.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_SYSTEM_H
|
||||
#define POKEDIAMOND_OS_SYSTEM_H
|
||||
|
||||
#include "consts.h"
|
||||
|
||||
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 = HW_PSR_IRQ_DISABLE,
|
||||
OS_INTRMODE_ENABLE = 0
|
||||
} OSIntrMode;
|
||||
|
||||
OSIntrMode OS_EnableInterrupts();
|
||||
OSIntrMode OS_DisableInterrupts();
|
||||
OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
|
||||
OSIntrMode OS_DisableInterrupts_IrqAndFiq();
|
||||
OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
|
||||
OSProcMode OS_GetProcMode();
|
||||
|
||||
|
||||
#endif //POKEDIAMOND_OS_SYSTEM_H
|
||||
@@ -1,40 +0,0 @@
|
||||
#ifndef POKEDIAMOND_NITRO_TYPES_H
|
||||
#define POKEDIAMOND_NITRO_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 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
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef POKEDIAMOND_POKEMON_H
|
||||
#define POKEDIAMOND_POKEMON_H
|
||||
|
||||
#include "nitro/types.h"
|
||||
#include "types.h"
|
||||
|
||||
// Enums
|
||||
|
||||
|
||||
Reference in New Issue
Block a user