mirror of
https://github.com/pret/pokediamond.git
synced 2025-03-02 19:08:48 +00:00
Add more OS functions
This commit is contained in:
parent
346db6f14c
commit
dcdf587399
0
arm7/.gitkeep
Normal file
0
arm7/.gitkeep
Normal file
0
arm9/.gitkeep
Normal file
0
arm9/.gitkeep
Normal file
20
nitro/consts.h
Normal file
20
nitro/consts.h
Normal 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
12
nitro/mmap.h
Normal 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
|
@ -7,7 +7,9 @@ extern "C" {
|
||||
|
||||
// Include all nitro files
|
||||
#include "types.h"
|
||||
#include "consts.h"
|
||||
#include "os.h"
|
||||
#include "mmap.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
|
196
nitro/os.c
196
nitro/os.c
@ -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
|
||||
}
|
||||
|
61
nitro/os.h
61
nitro/os.h
@ -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
|
||||
|
@ -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
|
@ -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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user