few cleanups to os_alloc.c

This commit is contained in:
red031000
2020-04-24 02:58:06 +01:00
parent bbd690eb99
commit 8ef3e3d8e1
3 changed files with 133 additions and 9 deletions

View File

@@ -4,9 +4,25 @@
#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_DEBUGGER_OFFSET 0x00700000
#define HW_ITCM 0x01FF8000
#define HW_ITCM_SIZE 0x00008000
#define HW_WRAM 0x037F8000
#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 OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE)
#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 OSi_WRAM_MAIN_ARENA_HI_DEFAULT (HW_WRAM)
#endif

View File

@@ -6,12 +6,11 @@
#include "consts.h"
#include "os_system.h"
extern BOOL OSi_MainExArenaEnabled; // TODO: located at 0x021d36f4
extern BOOL OSi_MainExArenaEnabled;
extern BOOL OSi_Initialized; // TODO: located at 0x021d36f0
extern u32 OS_GetConsoleType();
extern u32 OS_CONSOLE_SIZE_MASK;
extern u32 OS_CONSOLE_SIZE_4MB;
extern Cell* DLExtract(Cell* list, Cell* cell);
extern Cell* DLInsert(Cell* list, Cell* cell);
extern Cell* DLAddFront(Cell* list, Cell* cell);
extern void OS_SetProtectionRegion1(u32 param);
@@ -29,6 +28,36 @@ void* OSiHeapInfo[OS_ARENA_MAX] = {
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
#ifdef MATCH_ASM
asm void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
stmdb sp!,{ r4-r6, lr }
@@ -198,27 +227,105 @@ void* OS_GetInitArenaLo(OSArenaId id) {
#ifdef MATCH_ASM
asm void* OS_GetInitArenaHi(OSArenaId id) {
// TODO: idk how to do switch case stuff properly in asm
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 *)0x023e0000;
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 *)0x02700000;
return (void *)OSi_MAINEX_ARENA_HI_DEFAULT;
}
case OS_ARENA_ITCM:
return (void *)0x02000000;
return (void *)HW_ITCM_ARENA_HI_DEFAULT;
case OS_ARENA_DTCM:
return (void *)0x027e0080;
return (void *)0x027e0080; //todo pretty sure this is incorrect, no constant and doesn't match
case OS_ARENA_SHARED:
return (void *)0x027ff680;
return (void *)HW_SHARED_ARENA_HI_DEFAULT;
case OS_ARENA_WRAM_MAIN:
return (void *)0x037f8000;
return (void *)OSi_WRAM_MAIN_ARENA_HI_DEFAULT;
default:
return NULL;
}

View File

@@ -377,6 +377,7 @@ gBacklightTop_2 = 0x02106FA0;
gUnknown2106FB8 = 0x02106FB8;
gUnknown21C48B8 = 0x021C48B8;
gUnk021C4918 = 0x021C4918;
OSi_MainExArenaEnabled = 0x021D36F4;
FUN_021D74E0 = 0x021D74E0;
FUN_021D76AC = 0x021D76AC;
gUnk021D76C8 = 0x021D76C8;