mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-30 20:36:48 -05:00
example compilation for OS_arena
This commit is contained in:
@@ -44,7 +44,7 @@ ELF := $(BUILD_DIR)/$(TARGET).elf
|
||||
LD_SCRIPT := arm9.lcf
|
||||
|
||||
# Directories containing source files
|
||||
SRC_DIRS := src
|
||||
SRC_DIRS := src lib lib/src
|
||||
ASM_DIRS := asm data files
|
||||
|
||||
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
|
||||
@@ -60,7 +60,7 @@ O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \
|
||||
|
||||
##################### Compiler Options #######################
|
||||
|
||||
MWCCVERSION := 2.0/base
|
||||
MWCCVERSION = 2.0/base
|
||||
TOOLS_DIR = ../tools
|
||||
|
||||
CROSS := arm-none-eabi-
|
||||
@@ -139,6 +139,14 @@ patch_mwasmarm:
|
||||
|
||||
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(ASM_DIRS))
|
||||
|
||||
######################## Special Rules ########################
|
||||
|
||||
# TODO: Move out to lib/Makefile
|
||||
build/lib/src/%.o: CC := $(WINE) $(TOOLS_DIR)/mwccarm/1.2/sp2p3/mwccarm.exe
|
||||
build/lib/src/%.o: CFLAGS := -O4,p -proc arm9tdmi -interworking -ir include -ir ../include -lang c99
|
||||
|
||||
####################### Everything Else ######################
|
||||
|
||||
$(BUILD_DIR)/%.o: %.c
|
||||
$(CC) -c $(CFLAGS) -o $@ $<
|
||||
|
||||
|
||||
@@ -1,377 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "global.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start OS_AllocFromArenaHi
|
||||
OS_AllocFromArenaHi: ; 0x020CC204
|
||||
stmdb sp!, {r4-r6,lr}
|
||||
mov r4, r0
|
||||
mov r6, r1
|
||||
mov r5, r2
|
||||
bl OS_GetArenaHi
|
||||
_020CC218:
|
||||
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
|
||||
|
||||
arm_func_start OS_AllocFromArenaLo
|
||||
OS_AllocFromArenaLo: ; 0x020CC26C
|
||||
stmdb sp!, {r4-r7,lr}
|
||||
sub sp, sp, #0x4
|
||||
mov r7, r0
|
||||
mov r6, r1
|
||||
mov r5, r2
|
||||
bl OS_GetArenaLo
|
||||
_020CC284:
|
||||
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
|
||||
|
||||
arm_func_start OS_SetArenaLo
|
||||
OS_SetArenaLo: ; 0x020CC2F4
|
||||
mov r0, r0, lsl #0x2
|
||||
add r0, r0, #0x2700000
|
||||
add r0, r0, #0xff000
|
||||
str r1, [r0, #0xda0]
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_SetArenaHi
|
||||
OS_SetArenaHi:
|
||||
mov r0, r0, lsl #0x2
|
||||
add r0, r0, #0x2700000
|
||||
add r0, r0, #0xff000
|
||||
str r1, [r0, #0xdc4]
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_GetInitArenaLo
|
||||
OS_GetInitArenaLo: ; 0x020CC31C
|
||||
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, _020CC3EC ; =0x0225FFA0
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC35C:
|
||||
ldr r0, _020CC3F0 ; =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, _020CC3F4 ; =0x023E0000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC39C:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, _020CC3F8 ; =0x01FF8720
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3AC:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, _020CC3FC ; =0x027E0080
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3BC:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, _020CC400 ; =0x027FF000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3CC:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, _020CC404 ; =0x037F8000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC3DC:
|
||||
mov r0, #0x0
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
_020CC3EC: .word SDK_MAIN_ARENA_LO
|
||||
_020CC3F0: .word OSi_MainExArenaEnabled
|
||||
_020CC3F4: .word SDK_SECTION_ARENA_EX_START
|
||||
_020CC3F8: .word SDK_SECTION_ARENA_ITCM_START
|
||||
_020CC3FC: .word SDK_SECTION_ARENA_DTCM_START
|
||||
_020CC400: .word 0x027FF000
|
||||
_020CC404: .word 0x037F8000
|
||||
|
||||
arm_func_start OS_GetInitArenaHi
|
||||
OS_GetInitArenaHi: ; 0x020CC408
|
||||
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, _020CC518 ; =0x023E0000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC448:
|
||||
ldr r0, _020CC51C ; =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, #0x2700000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC488:
|
||||
add sp, sp, #0x4
|
||||
mov r0, #0x2000000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC498:
|
||||
ldr r0, _020CC520 ; =0x027E0000
|
||||
ldr r1, _020CC524 ; =0x00000000
|
||||
ldr r2, _020CC528 ; =0x00000400
|
||||
add r3, r0, #0x3f80
|
||||
cmp r1, #0x0
|
||||
sub r2, r3, r2
|
||||
bne _020CC4CC
|
||||
ldr r1, _020CC52C ; =0x027E0080
|
||||
add sp, sp, #0x4
|
||||
cmp r0, r1
|
||||
movcc r0, r1
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC4CC:
|
||||
cmp r1, #0x0
|
||||
ldrlt r0, _020CC52C ; =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, _020CC530 ; =0x027FF680
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC4F8:
|
||||
add sp, sp, #0x4
|
||||
ldr r0, _020CC534 ; =0x037F8000
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC508:
|
||||
mov r0, #0x0
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
_020CC518: .word 0x023E0000
|
||||
_020CC51C: .word OSi_MainExArenaEnabled
|
||||
_020CC520: .word 0x027E0000
|
||||
_020CC524: .word 0x00000000
|
||||
_020CC528: .word 0x00000400
|
||||
_020CC52C: .word 0x027E0080
|
||||
_020CC530: .word 0x027FF680
|
||||
_020CC534: .word 0x037F8000
|
||||
|
||||
arm_func_start OS_GetArenaLo
|
||||
OS_GetArenaLo:
|
||||
mov r0, r0, lsl #0x2
|
||||
add r0, r0, #0x2700000
|
||||
add r0, r0, #0xff000
|
||||
ldr r0, [r0, #0xda0]
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_GetArenaHi
|
||||
OS_GetArenaHi:
|
||||
mov r0, r0, lsl #0x2
|
||||
add r0, r0, #0x2700000
|
||||
add r0, r0, #0xff000
|
||||
ldr r0, [r0, #0xdc4]
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_InitArenaEx
|
||||
OS_InitArenaEx: ; 0x020CC560
|
||||
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, _020CC5D4 ; =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, _020CC5D8 ; =0x0200002B
|
||||
bl OS_SetProtectionRegion1
|
||||
ldr r0, _020CC5DC ; =0x023E0021
|
||||
bl OS_SetProtectionRegion2
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CC5D4: .word OSi_MainExArenaEnabled
|
||||
_020CC5D8: .word 0x0200002B
|
||||
_020CC5DC: .word 0x023E0021
|
||||
|
||||
arm_func_start OS_InitArena
|
||||
OS_InitArena: ; 0x020CC5E0
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
ldr r1, _020CC6F4 ; =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
|
||||
_020CC61C:
|
||||
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
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
_020CC6F4: .word OSi_Initialized
|
||||
45
arm9/lib/include/consts.h
Normal file
45
arm9/lib/include/consts.h
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// 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
|
||||
45
arm9/lib/include/mmap.h
Normal file
45
arm9/lib/include/mmap.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#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
|
||||
18
arm9/lib/include/nitro.h
Normal file
18
arm9/lib/include/nitro.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#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
|
||||
17
arm9/lib/include/os.h
Normal file
17
arm9/lib/include/os.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// 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
|
||||
38
arm9/lib/include/os_alloc.h
Normal file
38
arm9/lib/include/os_alloc.h
Normal file
@@ -0,0 +1,38 @@
|
||||
//
|
||||
// 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
|
||||
41
arm9/lib/include/os_arena.h
Normal file
41
arm9/lib/include/os_arena.h
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// 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
|
||||
47
arm9/lib/include/os_protectionRegion.h
Normal file
47
arm9/lib/include/os_protectionRegion.h
Normal file
@@ -0,0 +1,47 @@
|
||||
//
|
||||
// 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
|
||||
44
arm9/lib/include/os_system.h
Normal file
44
arm9/lib/include/os_system.h
Normal file
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// 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_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;
|
||||
|
||||
OSIntrMode OS_EnableInterrupts();
|
||||
OSIntrMode OS_DisableInterrupts();
|
||||
OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
|
||||
OSIntrMode OS_DisableInterrupts_IrqAndFiq();
|
||||
OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
|
||||
OSIntrMode_Irq OS_GetCpsrIrq();
|
||||
OSProcMode OS_GetProcMode();
|
||||
|
||||
|
||||
#endif //POKEDIAMOND_OS_SYSTEM_H
|
||||
40
arm9/lib/include/types.h
Normal file
40
arm9/lib/include/types.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#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
|
||||
169
arm9/lib/src/OS_arena.c
Normal file
169
arm9/lib/src/OS_arena.c
Normal file
@@ -0,0 +1,169 @@
|
||||
//
|
||||
// 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
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
void* OS_GetArenaHi(OSArenaId id) {
|
||||
return OSi_GetArenaInfo().hi[id];
|
||||
}
|
||||
|
||||
void* OS_GetArenaLo(OSArenaId id) {
|
||||
return OSi_GetArenaInfo().lo[id];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void OS_SetArenaHi(OSArenaId id, void* newHi) {
|
||||
OSi_GetArenaInfo().hi[id] = newHi;
|
||||
}
|
||||
|
||||
void OS_SetArenaLo(OSArenaId id, void* newLo) {
|
||||
OSi_GetArenaInfo().lo[id] = newLo;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user