1 #include <nitro.h>
2 
3 
4 #define HEAP_ID    ((OSHeapHandle)0)
5 #define ARENA_ID   ((OSArenaId)OS_ARENA_MAIN)
6 #define ROUND(n, a)     (((u32) (n) + (a) - 1) & ~((a) - 1))
7 
8 //----------------------------------------------------------------
9 //
operator new(std::size_t blocksize)10 void* operator new ( std::size_t blocksize )
11 {
12     return OS_AllocFromHeap( ARENA_ID, HEAP_ID, blocksize );
13 }
14 
15 //----------------------------------------------------------------
16 //
operator new[](std::size_t blocksize)17 void* operator new[] ( std::size_t blocksize )
18 {
19     return OS_AllocFromHeap( ARENA_ID, HEAP_ID, blocksize );
20 }
21 
22 //----------------------------------------------------------------
23 //
operator delete(void * block)24 void operator delete ( void* block ) throw()
25 {
26     OS_FreeToHeap( ARENA_ID, HEAP_ID, block );
27 }
28 
29 //----------------------------------------------------------------
30 //
operator delete[](void * block)31 void operator delete[] ( void* block ) throw()
32 {
33     OS_FreeToHeap( ARENA_ID, HEAP_ID, block );
34 }
35 
36 /*---------------------------------------------------------------------------*
37   Name:         NitroStartUp
38 
39   Description:  startup befor NitroMain()
40 
41   Arguments:    None
42 
43   Returns:      None
44  *---------------------------------------------------------------------------*/
NitroStartUp(void)45 void NitroStartUp(void)
46 {
47     void*    arenaLo;
48     void*    arenaHi;
49 
50     OS_Init();
51 
52     arenaLo = OS_GetArenaLo( ARENA_ID );
53     arenaHi = OS_GetArenaHi( ARENA_ID );
54 
55     // Create a heap
56     arenaLo = OS_InitAlloc( ARENA_ID, arenaLo, arenaHi, 1 );
57     OS_SetArenaLo( ARENA_ID, arenaLo );
58 
59     // Ensure boundaries are 32B aligned
60     arenaLo = (void*)ROUND( arenaLo, 32 );
61     arenaHi = (void*)ROUND( arenaHi, 32 );
62 
63     // The boundaries given to OSCreateHeap should be 32B aligned
64     (void)OS_SetCurrentHeap( ARENA_ID, OS_CreateHeap( ARENA_ID, arenaLo, arenaHi ) );
65 
66     // From here on out, OS_Alloc and OS_Free behave like malloc and free respectively
67     OS_SetArenaLo( ARENA_ID, arenaLo = arenaHi );
68 }
69