Add more OS functions

This commit is contained in:
Martmists 2020-04-16 16:13:01 +02:00
parent 346db6f14c
commit dcdf587399
No known key found for this signature in database
GPG Key ID: 2C67A9D790F7A5C6
10 changed files with 288 additions and 32 deletions

0
arm7/.gitkeep Normal file
View File

0
arm9/.gitkeep Normal file
View File

20
nitro/consts.h Normal file
View File

@ -0,0 +1,20 @@
//
// 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 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

12
nitro/mmap.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef NITRO_MMAP_H
#define NITRO_MMAP_H
#define HW_MAIN_MEM 0x02000000
#define HW_MAIN_MEM_SIZE 0x00400000
#define HW_MAIN_MEM_EX_SIZE 0x00800000
#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
#endif

View File

@ -7,7 +7,9 @@ extern "C" {
// Include all nitro files
#include "types.h"
#include "consts.h"
#include "os.h"
#include "mmap.h"
#ifdef __cplusplus
};

View File

@ -3,7 +3,199 @@
//
#include "os.h"
#include "consts.h"
asm void OS_GetProcMode() {
OSProcMode OS_GetProcMode() {
__asm {
mrs r0, cpsr
and r0, r0, #HW_PSR_CPU_MODE_MASK
bx lr
}
}
}
OSIntrMode OS_DisableInterrupts() {
__asm {
mrs r0, cpsr
orr r1, r0, #HW_PSR_IRQ_DISABLE
msr cpsr_c, r1
and r0, r0, #HW_PSR_IRQ_DISABLE
bx lr
}
}
OSIntrMode OS_RestoreInterrupts(OSIntrMode state) {
__asm {
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
}
}
void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) {
#ifdef MATCH_ASM
__asm {
stmdb sp!,{ r4 r5 r6 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 r5 r6 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 r5 r6 r7 lr }
bxhi lr
mov r0,r7
mov r1,r5
bl OS_SetArenaLo
mov r0,r4
add sp,sp,#0x4
ldmia sp!,{ r4 r5 r6 r7 lr }
bx lr
}
#else
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
}
void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) {
#ifdef MATCH_ASM
__asm {
stmdb sp!,{ r4 r5 r6 lr }
mov r4,r0
mov r6,r1
mov r5,r2
bl OS_GetArenaHi
cmp r0,#0x0
moveq r0,#0x0
ldmeqia sp!,{ r4 r5 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 r5 r6 lr }
bxcc lr
mov r0,r4
mov r1,r5
bl OS_SetArenaHi
mov r0,r5
ldmia sp!,{ r4 r5 r6 lr }
bx lr
};
#else
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
}
void OS_SetArenaHi(OSArenaId id, void *newHi) {
#ifdef MATCH_ASM
__asm {
mov r0,r0, lsl #0x2
add r0,r0,#0x2700000
add r0,r0,#0xff000
str r1,[r0,#0xdc4]
bx lr
}
#else
OSi_GetArenaInfo().lo[id] = newHi;
#endif
}
void OS_SetArenaLo(OSArenaId id, void *newLo) {
#ifdef MATCH_ASM
__asm {
mov r0,r0, lsl #0x2
add r0,r0,#0x2700000
add r0,r0,#0xff000
str r1,[r0,#0xda0]
bx lr
}
#else
OSi_GetArenaInfo().lo[id] = newLo;
#endif
}
void* OS_GetArenaHi(OSArenaId id) {
#ifdef MATCH_ASM
__asm {
mov r0,r0, lsl #0x2
add r0,r0,#0x2700000
add r0,r0,#0xff000
ldr r0,[r0,#0xdc4]
bx lr
}
#else
return OSi_GetArenaInfo().hi[id];
#endif
}
void* OS_GetArenaLo(OSArenaId id) {
#ifdef MATCH_ASM
__asm {
mov r0,r0, lsl #0x2
add r0,r0,#0x2700000
add r0,r0,#0xff000
ldr r0,[r0,#0xda0]
bx lr
}
#else
return OSi_GetArenaInfo().lo[id];
#endif
}

View File

@ -5,6 +5,65 @@
#ifndef POKEDIAMOND_OS_H
#define POKEDIAMOND_OS_H
#include "os_asm.h"
#include "types.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_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 enum {
OS_INTRMODE_IRQ_DISABLE = HW_PSR_IRQ_DISABLE,
OS_INTRMODE_IRQ_ENABLE = 0
} OSIntrMode_Irq;
typedef enum {
OS_INTRMODE_FIQ_DISABLE = HW_PSR_FIQ_DISABLE,
OS_INTRMODE_FIQ_ENABLE = 0
} OSIntrMode_Fiq;
typedef union {
OSIntrMode_Fiq mode_fiq;
OSIntrMode_Irq mode_irq;
} OSIntrMode;
typedef struct {
void *lo[OS_ARENA_MAX];
void *hi[OS_ARENA_MAX];
u16 initialized;
u8 padding[2];
} OSArenaInfo;
OSProcMode OS_GetProcMode();
OSIntrMode OS_DisableInterrupts();
OSIntrMode OS_RestoreInterrupts(register OSIntrMode state);
void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align);
void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align);
void OS_SetArenaHi(OSArenaId id, void *newHi);
void OS_SetArenaLo(OSArenaId id, void *newLo);
void* OS_GetArenaHi(OSArenaId id);
void* OS_GetArenaLo(OSArenaId id);
#endif //POKEDIAMOND_OS_H

View File

@ -1,12 +0,0 @@
//
// Created by mart on 4/12/20.
//
#ifndef POKEDIAMOND_OS_ASM_H
#define POKEDIAMOND_OS_ASM_H
#include "types.h"
OSProcMode OS_GetProcMode();
#endif //POKEDIAMOND_OS_ASM_H

View File

@ -1,7 +0,0 @@
# TODO: make this syntax look correct in CLion
# Potentially switch to AT&T syntax?
OS_GetProcMode:
mrs r0, cpsr
and r0, r0, #0x80
bx lr

View File

@ -37,14 +37,4 @@ typedef int BOOL;
#endif // __cplusplus
#endif
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;
#endif //POKEDIAMOND_NITRO_TYPES_H