summaryrefslogtreecommitdiff
path: root/src/boot/O2
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2023-11-26 22:01:42 -0300
committerGitHub <noreply@github.com>2023-11-27 12:01:42 +1100
commit6dd16009361b2561f77b7933981611a9b975fa21 (patch)
tree606f9bd82debe312be65d4e05798e9dc2435ae41 /src/boot/O2
parent34492a4386446fc82220fe0684ff521d760e84bd (diff)
Organize `libc64` files (#1492)
* Move qrand to libc64 * use an union to avoid type punning * __osMalloc * math64.c * fixed_point.h * sleep * aprintf.h * sprintf * malloc * use original names on aprintf.c and malloc.c * qrand cleanup pass * use original names of sleep.c * og names for sprintf * more cleanup * format * fixes * whoops * use ARRAY_COUNT again * comment * Use `fu` * forgot this one * review * fix * sneak a tiny cleanup
Diffstat (limited to 'src/boot/O2')
-rw-r--r--src/boot/O2/__osMalloc.c458
-rw-r--r--src/boot/O2/gfxprint.c3
-rw-r--r--src/boot/O2/loadfragment.c6
-rw-r--r--src/boot/O2/loadfragment2.c4
-rw-r--r--src/boot/O2/math64.c191
-rw-r--r--src/boot/O2/printutils.c17
-rw-r--r--src/boot/O2/rand.c90
-rw-r--r--src/boot/O2/sleep.c27
-rw-r--r--src/boot/O2/sprintf.c30
-rw-r--r--src/boot/O2/system_heap.c10
-rw-r--r--src/boot/O2/system_malloc.c51
11 files changed, 12 insertions, 875 deletions
diff --git a/src/boot/O2/__osMalloc.c b/src/boot/O2/__osMalloc.c
deleted file mode 100644
index 71a5a5ba3..000000000
--- a/src/boot/O2/__osMalloc.c
+++ /dev/null
@@ -1,458 +0,0 @@
-#include "os_malloc.h"
-#include "libc/stdbool.h"
-#include "libc/stdint.h"
-#include "macros.h"
-#include "functions.h"
-
-#define FILL_ALLOCBLOCK (1 << 0)
-#define FILL_FREEBLOCK (1 << 1)
-#define CHECK_FREE_BLOCK (1 << 2)
-
-#define NODE_MAGIC (0x7373)
-
-#define BLOCK_UNINIT_MAGIC (0xAB)
-#define BLOCK_UNINIT_MAGIC_32 (0xABABABAB)
-#define BLOCK_ALLOC_MAGIC (0xCD)
-#define BLOCK_ALLOC_MAGIC_32 (0xCDCDCDCD)
-#define BLOCK_FREE_MAGIC (0xEF)
-#define BLOCK_FREE_MAGIC_32 (0xEFEFEFEF)
-
-OSMesg sArenaLockMsg[1];
-
-void __osMallocAddHeap(Arena* arena, void* heap, size_t size);
-
-void ArenaImpl_LockInit(Arena* arena) {
- osCreateMesgQueue(&arena->lock, sArenaLockMsg, ARRAY_COUNT(sArenaLockMsg));
-}
-
-void ArenaImpl_Lock(Arena* arena) {
- osSendMesg(&arena->lock, NULL, OS_MESG_BLOCK);
-}
-
-void ArenaImpl_Unlock(Arena* arena) {
- osRecvMesg(&arena->lock, NULL, OS_MESG_BLOCK);
-}
-
-ArenaNode* ArenaImpl_GetLastBlock(Arena* arena) {
- ArenaNode* last;
- ArenaNode* iter;
-
- last = arena->head;
-
- if (last != NULL) {
- iter = last->next;
- while (iter != NULL) {
- last = iter;
- iter = iter->next;
- }
- }
- return last;
-}
-
-/**
- * Initializes \p arena to manage the memory region \p heap.
- *
- * @param arena The Arena to initialize.
- * @param heap The memory region to use as heap space.
- * @param size The size of the heap.
- */
-void __osMallocInit(Arena* arena, void* heap, size_t size) {
- bzero(arena, sizeof(Arena));
-
- ArenaImpl_LockInit(arena);
-
- __osMallocAddHeap(arena, heap, size);
- arena->isInit = true;
-}
-
-// Original name: __osMallocAddBlock
-void __osMallocAddHeap(Arena* arena, void* heap, size_t size) {
- ptrdiff_t diff;
- s32 alignedSize;
- ArenaNode* firstNode;
- ArenaNode* lastNode;
-
- if (heap == NULL) {
- return;
- }
-
- firstNode = (ArenaNode*)ALIGN16((uintptr_t)heap);
- diff = (uintptr_t)firstNode - (uintptr_t)heap;
- alignedSize = ((s32)size - diff) & ~0xF;
-
- // If the size of the heap is smaller than sizeof(ArenaNode), then the initialization will silently fail
- if (alignedSize > (s32)sizeof(ArenaNode)) {
- firstNode->next = NULL;
- firstNode->prev = NULL;
- firstNode->size = alignedSize - sizeof(ArenaNode);
- firstNode->isFree = true;
- firstNode->magic = NODE_MAGIC;
-
- ArenaImpl_Lock(arena);
-
- lastNode = ArenaImpl_GetLastBlock(arena);
-
- // Checks if there's already a block
- if (lastNode == NULL) {
- arena->head = firstNode;
- arena->start = heap;
- } else {
- // Chain the existing block with the new one
- firstNode->prev = lastNode;
- lastNode->next = firstNode;
- }
-
- ArenaImpl_Unlock(arena);
- }
-}
-
-/**
- * Clears the whole \p arena, invalidating every allocated pointer to it.
- *
- * @param arena The Arena to clear.
- */
-void __osMallocCleanup(Arena* arena) {
- bzero(arena, sizeof(Arena));
-}
-
-/**
- * Returns whether or not the \p arena has been initialized.
- *
- * @param arena The Arena to check.
- * @return u8 `true` if the \p arena has been initialized. `false` otherwise.
- */
-u8 __osMallocIsInitalized(Arena* arena) {
- return arena->isInit;
-}
-
-/**
- * Allocates at least \p size bytes of memory using the given \p arena.
- * The block of memory will be allocated at the start of the first sufficiently large free block.
- *
- * - If there's not enough space in the given \p arena, this function will fail, returning `NULL`.
- * - If \p size is zero, then an empty region of memory is returned.
- *
- * To avoid memory leaks, the returned pointer should be eventually deallocated using either `__osFree` or
- * `__osRealloc`.
- *
- * @param[in, out] arena The specific Arena to be used for the allocation.
- * @param[in] size The size in bytes that will be allocated.
- * @return void* On success, the allocated area of the \p arena memory. Otherwise, `NULL`.
- */
-void* __osMalloc(Arena* arena, size_t size) {
- ArenaNode* iter;
- ArenaNode* newNode;
- void* alloc = NULL;
-
- size = ALIGN16(size);
-
- ArenaImpl_Lock(arena);
-
- // Start iterating from the head of the arena.
- iter = arena->head;
-
- // Iterate over the arena looking for a big enough space of memory.
- while (iter != NULL) {
- if (iter->isFree && iter->size >= size) {
- size_t blockSize = ALIGN16(size) + sizeof(ArenaNode);
-
- // If the block is larger than the requested size, then split it and just use the required size of the
- // current block.
- if (blockSize < iter->size) {
- ArenaNode* next;
-
- newNode = (ArenaNode*)((uintptr_t)iter + blockSize);
- newNode->next = iter->next;
- newNode->prev = iter;
- newNode->size = iter->size - blockSize;
- newNode->isFree = true;
- newNode->magic = NODE_MAGIC;
-
- iter->next = newNode;
- iter->size = size;
-
- next = newNode->next;
- if (next != NULL) {
- next->prev = newNode;
- }
- }
-
- iter->isFree = false;
- alloc = (void*)((uintptr_t)iter + sizeof(ArenaNode));
- break;
- }
-
- iter = iter->next;
- }
-
- ArenaImpl_Unlock(arena);
-
- return alloc;
-}
-
-/**
- * Allocates at least \p size bytes of memory using the given \p arena.
- * Unlike __osMalloc, the block of memory will be allocated from the end of the \p arena.
- *
- * - If there's not enough space in the given \p arena, this function will fail, returning `NULL`.
- * - If \p size is zero, then an empty region of memory is returned.
- *
- * To avoid memory leaks, the returned pointer should be eventually deallocated using `__osFree` or `__osRealloc`.
- *
- * @param[in, out] arena The specific Arena to be used for the allocation.
- * @param[in] size The size in bytes that will be allocated.
- * @return void* On success, the allocated area of the \p arena memory. Otherwise, `NULL`.
- */
-void* __osMallocR(Arena* arena, size_t size) {
- ArenaNode* iter;
- ArenaNode* newNode;
- size_t blockSize;
- void* alloc = NULL;
-
- size = ALIGN16(size);
-
- ArenaImpl_Lock(arena);
-
- // Start iterating from the last block of the arena.
- iter = ArenaImpl_GetLastBlock(arena);
-
- // Iterate in reverse the arena looking for a big enough space of memory.
- while (iter != NULL) {
- if (iter->isFree && iter->size >= size) {
- blockSize = ALIGN16(size) + sizeof(ArenaNode);
-
- // If the block is larger than the requested size, then split it and just use the required size of the
- // current block.
- if (blockSize < iter->size) {
- ArenaNode* next;
-
- newNode = (ArenaNode*)((uintptr_t)iter + (iter->size - size));
- newNode->next = iter->next;
- newNode->prev = iter;
- newNode->size = size;
- newNode->magic = NODE_MAGIC;
-
- iter->next = newNode;
- iter->size -= blockSize;
-
- next = newNode->next;
- if (next != NULL) {
- next->prev = newNode;
- }
- iter = newNode;
- }
-
- iter->isFree = false;
- alloc = (void*)((uintptr_t)iter + sizeof(ArenaNode));
- break;
- }
- iter = iter->prev;
- }
-
- ArenaImpl_Unlock(arena);
-
- return alloc;
-}
-
-/**
- * Deallocates the pointer \p ptr previously allocated by `__osMalloc`, `__osMallocR` or `__osRealloc`.
- * If \p ptr is `NULL` or it has been already been freed, then this function does nothing.
- *
- * - The behaviour is undefined if \p ptr is not a memory region returned by one of the cited allocating
- * functions.
- * - The behaviour is undefined if \p ptr doesn't correspond to the given \p arena.
- * - Any access to the freed pointer is undefined behaviour.
- *
- * @param[in, out] arena The specific Arena to be used for the allocation.
- * @param[in, out] ptr The allocated memory block to deallocate.
- */
-void __osFree(Arena* arena, void* ptr) {
- ArenaNode* node;
- ArenaNode* next;
- ArenaNode* prev;
-
- ArenaImpl_Lock(arena);
-
- node = (ArenaNode*)((uintptr_t)ptr - sizeof(ArenaNode));
-
- if ((ptr != NULL) && (node->magic == NODE_MAGIC) && !node->isFree) {
- next = node->next;
- prev = node->prev;
- node->isFree = true;
-
- // Checks if the next node is contiguous to the current node and if it isn't currently allocated. Then merge the
- // two nodes into one.
- if ((uintptr_t)next == (uintptr_t)node + sizeof(ArenaNode) + node->size && next->isFree) {
- ArenaNode* newNext = next->next;
-
- if (newNext != NULL) {
- newNext->prev = node;
- }
-
- node->size += next->size + sizeof(ArenaNode);
-
- node->next = newNext;
- next = newNext;
- }
-
- // Checks if the previous node is contiguous to the current node and if it isn't currently allocated. Then merge
- // the two nodes into one.
- if ((prev != NULL) && prev->isFree && ((uintptr_t)node == (uintptr_t)prev + sizeof(ArenaNode) + prev->size)) {
- if (next != NULL) {
- next->prev = prev;
- }
-
- prev->next = next;
- prev->size += node->size + sizeof(ArenaNode);
- }
- }
-
- ArenaImpl_Unlock(arena);
-}
-
-/**
- * Reallocates the pointer \p ptr.
- * \p ptr must be either a pointer previously allocated by `__osMalloc`, `__osMallocR` or `__osRealloc` and
- * not freed yet, or a `NULL` pointer.
- *
- * - If \p ptr is `NULL` a new pointer is allocated. See `__osMalloc` for more details.
- * - If \p newSize is 0, then the given pointer is freed and `NULL` is returned. See `__osFree` for more details.
- * - If \p newSize is bigger than the currently allocated allocated pointer, then the area of memory is expanded to a
- * size big enough to fit the requested size.
- *
- * - The behaviour is undefined if \p ptr is not a memory region returned by one of the cited allocating
- * functions.
- * - The behaviour is undefined if \p ptr doesn't correspond to the given \p arena.
- * - If the pointer is freed, then any access to the original freed pointer is undefined behaviour.
- *
- * @param[in, out] arena The specific Arena to be used for the allocation.
- * @param[in, out] ptr The allocated memory block to deallocate.
- * @param[in] newSize The new requested size.
- * @return void* On success, the pointer to the reallocated area of memory. On failure, `NULL` is returned,
- * and the original parameter \p ptr remains valid.
- */
-void* __osRealloc(Arena* arena, void* ptr, size_t newSize) {
- ArenaImpl_Lock(arena);
-
- (void)"__osRealloc(%08x, %d)\n";
-
- if (ptr == NULL) {
- // if the `ptr` is NULL, then allocate a new pointer with the specified size
- // if newSize is 0, then __osMalloc would return a NULL pointer
- ptr = __osMalloc(arena, newSize);
- } else if (newSize == 0) {
- // if the requested size is zero, then free the pointer
- __osFree(arena, ptr);
- ptr = NULL;
- } else {
- size_t diff;
- void* newPtr;
- // Gets the start of the ArenaNode pointer embedded
- ArenaNode* node = (void*)((uintptr_t)ptr - sizeof(ArenaNode));
-
- newSize = ALIGN16(newSize);
-
- // Only reallocate the memory if the new size isn't smaller than the actual node size
- if ((newSize != node->size) && (node->size < newSize)) {
- ArenaNode* next = node->next;
-
- diff = newSize - node->size;
- // Checks if the next node is contiguous to the current allocated node and it has enough space to fit the
- // new requested size
- if (((uintptr_t)next == (uintptr_t)node + node->size + sizeof(ArenaNode)) && (next->isFree) &&
- (next->size >= diff)) {
- ArenaNode* next2 = next->next;
-
- next->size = (next->size - diff);
- if (next2 != NULL) {
- // Update the previous element of the linked list
- next2->prev = (void*)((uintptr_t)next + diff);
- }
-
- next2 = (void*)((uintptr_t)next + diff);
- node->next = next2;
- node->size = newSize;
- __osMemcpy(next2, next, sizeof(ArenaNode));
- } else {
- // Create a new pointer and manually copy the data from the old pointer to the new one
- newPtr = __osMalloc(arena, newSize);
- if (newPtr != NULL) {
- bcopy(newPtr, ptr, node->size);
- __osFree(arena, ptr);
- }
- ptr = newPtr;
- }
- }
- }
-
- ArenaImpl_Unlock(arena);
-
- return ptr;
-}
-
-/**
- * Gets the size of the largest free block, the total free space and the total allocated space.
- *
- * @param[in, out] arena The Arena which will be used to get the values from.
- * @param[out] outMaxFree The size of the largest free block.
- * @param[out] outFree The total free space.
- * @param[out] outAlloc The total allocated space.
- */
-void __osGetSizes(Arena* arena, size_t* outMaxFree, size_t* outFree, size_t* outAlloc) {
- ArenaNode* iter;
-
- ArenaImpl_Lock(arena);
-
- *outMaxFree = 0;
- *outFree = 0;
- *outAlloc = 0;
-
- iter = arena->head;
- while (iter != NULL) {
- if (iter->isFree) {
- *outFree += iter->size;
- if (*outMaxFree < iter->size) {
- *outMaxFree = iter->size;
- }
- } else {
- *outAlloc += iter->size;
- }
-
- iter = iter->next;
- }
-
- ArenaImpl_Unlock(arena);
-}
-
-/**
- * Checks the validity of every node of the \p arena.
- *
- * @param arena The Arena to check.
- * @return s32 0 if every pointer is valid. 1 otherwise.
- */
-s32 __osCheckArena(Arena* arena) {
- ArenaNode* iter;
- s32 err = 0;
-
- ArenaImpl_Lock(arena);
-
- // "Checking the contents of the arena..."
- (void)"アリーナの内容をチェックしています... (%08x)\n";
-
- for (iter = arena->head; iter != NULL; iter = iter->next) {
- if (iter->magic != NODE_MAGIC) {
- // "Oops!!"
- (void)"おおっと!! (%08x %08x)\n";
-
- err = 1;
- break;
- }
- }
-
- // "The arena still looks good"
- (void)"アリーナはまだ、いけそうです\n";
-
- ArenaImpl_Unlock(arena);
-
- return err;
-}
diff --git a/src/boot/O2/gfxprint.c b/src/boot/O2/gfxprint.c
index b52675829..368ef7d68 100644
--- a/src/boot/O2/gfxprint.c
+++ b/src/boot/O2/gfxprint.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "libc64/aprintf.h"
#define GFXP_FLAG_HIRAGANA (1 << 0)
#define GFXP_FLAG_RAINBOW (1 << 1)
@@ -220,7 +221,7 @@ Gfx* GfxPrint_Close(GfxPrint* this) {
}
s32 GfxPrint_VPrintf(GfxPrint* this, const char* fmt, va_list args) {
- return PrintUtils_VPrintf(&this->callback, fmt, args);
+ return vaprintf(&this->callback, fmt, args);
}
s32 GfxPrint_Printf(GfxPrint* this, const char* fmt, ...) {
diff --git a/src/boot/O2/loadfragment.c b/src/boot/O2/loadfragment.c
index 69fa9959c..4da7a78b1 100644
--- a/src/boot/O2/loadfragment.c
+++ b/src/boot/O2/loadfragment.c
@@ -11,7 +11,7 @@
*/
#include "global.h"
-#include "system_malloc.h"
+#include "libc64/malloc.h"
#include "loadfragment.h"
s32 gLoadLogSeverity = 2;
@@ -186,7 +186,7 @@ void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vra
if (gLoadLogSeverity >= 3) {}
- allocatedRamAddr = SystemArena_MallocR(size);
+ allocatedRamAddr = malloc_r(size);
end = (uintptr_t)allocatedRamAddr + size;
if (gLoadLogSeverity >= 3) {}
@@ -202,7 +202,7 @@ void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vra
allocatedBytes = ovlRelocs->bssSize + size;
- allocatedRamAddr = SystemArena_Realloc(allocatedRamAddr, allocatedBytes);
+ allocatedRamAddr = realloc(allocatedRamAddr, allocatedBytes);
if (gLoadLogSeverity >= 3) {}
diff --git a/src/boot/O2/loadfragment2.c b/src/boot/O2/loadfragment2.c
index 02b3ab218..44b64f532 100644
--- a/src/boot/O2/loadfragment2.c
+++ b/src/boot/O2/loadfragment2.c
@@ -7,7 +7,7 @@
* These are for specific fragment overlays with the .ovl file extension
*/
#include "global.h"
-#include "system_malloc.h"
+#include "libc64/malloc.h"
#include "loadfragment.h"
s32 gOverlayLogSeverity = 2;
@@ -167,7 +167,7 @@ size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, void* ramStart, void
}
void* Overlay_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart, void* vramEnd) {
- void* allocatedRamAddr = SystemArena_MallocR((uintptr_t)vramEnd - (uintptr_t)vramStart);
+ void* allocatedRamAddr = malloc_r((uintptr_t)vramEnd - (uintptr_t)vramStart);
if (allocatedRamAddr != NULL) {
Overlay_Load(vromStart, vromEnd, vramStart, vramEnd, allocatedRamAddr);
diff --git a/src/boot/O2/math64.c b/src/boot/O2/math64.c
deleted file mode 100644
index cb77bed50..000000000
--- a/src/boot/O2/math64.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * MathF library
- * Contains tangent function, wrappers for a number of the handwritten functions in fp, and a suite of arctangents
- */
-#include "global.h"
-#include "fixed_point.h"
-
-s32 gUseAtanContFrac;
-
-/**
- * Tangent function computed using libultra sinf and cosf
- */
-f32 Math_FTanF(f32 x) {
- return sinf(x) / cosf(x);
-}
-
-// Unused
-f32 Math_FFloorF(f32 x) {
- return floorf(x);
-}
-
-// Unused
-f32 Math_FCeilF(f32 x) {
- return ceilf(x);
-}
-
-// Unused
-f32 Math_FRoundF(f32 x) {
- return roundf(x);
-}
-
-// Unused
-f32 Math_FTruncF(f32 x) {
- return truncf(x);
-}
-
-f32 Math_FNearbyIntF(f32 x) {
- return nearbyintf(x);
-}
-
-/**
- * Arctangent approximation using a Maclaurin series [https://mathworld.wolfram.com/MaclaurinSeries.html]
- * (one quadrant, i.e. |x| < 1)
- */
-f32 Math_FAtanTaylorQF(f32 x) {
- // Coefficients of Maclaurin series of arctangent
- static const f32 coeffs[] = {
- -1.0f / 3, +1.0f / 5, -1.0f / 7, +1.0f / 9, -1.0f / 11, +1.0f / 13, -1.0f / 15, +1.0f / 17, 0.0f,
- };
-
- f32 poly = x;
- f32 sq = SQ(x);
- f32 exp = x * sq;
- const f32* c = coeffs;
- f32 term;
-
- // Calculate the series until adding more terms does not change the float
- while (true) {
- term = *c++ * exp;
- if (poly + term == poly) {
- break;
- }
- poly += term;
- exp *= sq;
- }
-
- return poly;
-}
-
-/**
- * Extends previous arctangent function to the rest of the real numbers.
- * Uses the formulae arctan(x) = pi/2 - arctan(1/x)
- * and arctan(x) = pi/4 - arctan( (1-x)/(1+x) )
- * to extend the range in which the series computed by Math_FAtanTaylorQF is a good approximation
- */
-f32 Math_FAtanTaylorF(f32 x) {
- f32 t;
- f32 q;
-
- if (x > 0.0f) {
- t = x;
- } else if (x < 0.0f) {
- t = -x;
- } else if (x == 0.0f) {
- return 0.0f;
- } else {
- return qNaN0x10000;
- }
-
- if (t <= M_SQRT2 - 1.0f) {
- return Math_FAtanTaylorQF(x);
- }
-
- if (t >= M_SQRT2 + 1.0f) {
- q = M_PI / 2 - Math_FAtanTaylorQF(1.0f / t);
- } else { // in the interval (\sqrt{2} - 1, \sqrt{2} + 1)
- q = M_PI / 4 - Math_FAtanTaylorQF((1.0f - t) / (1.0f + t));
- }
-
- if (x > 0.0f) {
- return q;
- } else {
- return -q;
- }
-}
-
-/**
- * Arctangent approximation using a continued fraction
- * Cf. https://en.wikipedia.org/wiki/Gauss%27s_continued_fraction#The_series_2F1_2 ,
- * https://dlmf.nist.gov/4.25#E4
- */
-f32 Math_FAtanContFracF(f32 x) {
- s32 sector;
- f32 z;
- f32 conv;
- f32 sq;
- s32 i;
-
- if (x >= -1.0f && x <= 1.0f) {
- sector = 0;
- } else if (x > 1.0f) {
- sector = 1;
- x = 1.0f / x;
- } else if (x < -1.0f) {
- sector = -1;
- x = 1.0f / x;
- } else {
- return qNaN0x10000;
- }
-
- // Builds the continued fraction from the innermost fraction out
- sq = SQ(x);
- conv = 0.0f;
- z = 8.0f;
- for (i = 8; i != 0; i--) {
- conv = SQ(z) * sq / (2.0f * z + 1.0f + conv);
- z -= 1.0f;
- }
- conv = x / (1.0f + conv);
-
- if (sector == 0) {
- return conv;
- } else if (sector > 0) {
- return M_PI / 2 - conv;
- } else {
- return -M_PI / 2 - conv;
- }
-}
-
-/**
- * Single-argument arctangent, only used by the two-argument function.
- * Nothing else sets the bss variable gUseAtanContFrac, so the Maclaurin series is always used
- */
-f32 Math_FAtanF(f32 x) {
- if (!gUseAtanContFrac) {
- return Math_FAtanTaylorF(x);
- } else {
- return Math_FAtanContFracF(x);
- }
-}
-
-/**
- * Main two-argument arctangent function
- */
-f32 Math_FAtan2F(f32 y, f32 x) {
- if (x == 0.0f) {
- if (y == 0.0f) {
- return 0.0f;
- } else if (y > 0.0f) {
- return M_PI / 2;
- } else if (y < 0.0f) {
- return -M_PI / 2;
- } else {
- return qNaN0x10000;
- }
- } else if (x >= 0.0f) {
- return Math_FAtanF(y / x);
- } else if (y < 0.0f) {
- return Math_FAtanF(y / x) - M_PI;
- } else {
- return M_PI - Math_FAtanF(-(y / x));
- }
-}
-
-f32 Math_FAsinF(f32 x) {
- return Math_FAtan2F(x, sqrtf(1.0f - SQ(x)));
-}
-
-f32 Math_FAcosF(f32 x) {
- return M_PI / 2 - Math_FAsinF(x);
-}
diff --git a/src/boot/O2/printutils.c b/src/boot/O2/printutils.c
deleted file mode 100644
index 3fb8cf367..000000000
--- a/src/boot/O2/printutils.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "global.h"
-
-s32 PrintUtils_VPrintf(PrintCallback* pfn, const char* fmt, va_list args) {
- return _Printf(*pfn, pfn, fmt, args);
-}
-
-s32 PrintUtils_Printf(PrintCallback* pfn, const char* fmt, ...) {
- s32 ret;
- va_list args;
- va_start(args, fmt);
-
- ret = PrintUtils_VPrintf(pfn, fmt, args);
-
- va_end(args);
-
- return ret;
-}
diff --git a/src/boot/O2/rand.c b/src/boot/O2/rand.c
deleted file mode 100644
index 152c8a0e7..000000000
--- a/src/boot/O2/rand.c
+++ /dev/null
@@ -1,90 +0,0 @@
-#include "rand.h"
-
-//! The latest generated random number, used to generate the next number in the sequence.
-static u32 sRandInt = 1;
-
-//! Space to store a value to be re-interpreted as a float.
-//! This can't be static because it is used in z_kankyo.
-u32 gRandFloat;
-
-/**
- * Generates the next pseudo-random integer.
- */
-u32 Rand_Next(void) {
- return sRandInt = (sRandInt * RAND_MULTIPLIER) + RAND_INCREMENT;
-}
-
-/**
- * Seeds the internal pseudo-random number generator with a provided starting value.
- */
-void Rand_Seed(u32 seed) {
- sRandInt = seed;
-}
-
-/**
- * Returns a pseudo-random float between 0.0f and 1.0f from the internal PRNG.
- *
- * @note Works by generating the next integer, masking it to an IEEE-754 compliant float between 1.0f and 2.0f, and
- * subtracting 1.0f.
- *
- * @remark This is also recommended by Numerical Recipes, pp. 284-5.
- */
-f32 Rand_ZeroOne(void) {
- sRandInt = (sRandInt * RAND_MULTIPLIER) + RAND_INCREMENT;
- gRandFloat = ((sRandInt >> 9) | 0x3F800000);
- return *((f32*)&gRandFloat) - 1.0f;
-}
-
-/**
- * Returns a pseudo-random float between -0.5f and 0.5f in the same way as Rand_ZeroOne().
- */
-f32 Rand_Centered(void) {
- sRandInt = (sRandInt * RAND_MULTIPLIER) + RAND_INCREMENT;
- gRandFloat = ((sRandInt >> 9) | 0x3F800000);
- return *((f32*)&gRandFloat) - 1.5f;
-}
-
-//! All functions below are unused variants of the above four, that use a provided random number variable instead of the
-//! internal `sRandInt`
-
-/**
- * Seeds a provided pseudo-random number with a provided starting value.
- *
- * @see Rand_Seed
- */
-void Rand_Seed_Variable(u32* rndNum, u32 seed) {
- *rndNum = seed;
-}
-
-/**
- * Generates the next pseudo-random number from the provided rndNum.
- *
- * @see Rand_Next
- */
-u32 Rand_Next_Variable(u32* rndNum) {
- return *rndNum = (*rndNum * RAND_MULTIPLIER) + RAND_INCREMENT;
-}
-
-/**
- * Generates the next pseudo-random float between 0.0f and 1.0f from the provided rndNum.
- *
- * @see Rand_ZeroOne
- */
-f32 Rand_ZeroOne_Variable(u32* rndNum) {
- u32 next = (*rndNum * RAND_MULTIPLIER) + RAND_INCREMENT;
-
- gRandFloat = ((*rndNum = next) >> 9) | 0x3F800000;
- return *((f32*)&gRandFloat) - 1.0f;
-}
-
-/**
- * Generates the next pseudo-random float between -0.5f and 0.5f from the provided rndNum.
- *
- * @see Rand_ZeroOne, Rand_Centered
- */
-f32 Rand_Centered_Variable(u32* rndNum) {
- u32 next = (*rndNum * RAND_MULTIPLIER) + RAND_INCREMENT;
-
- gRandFloat = ((*rndNum = next) >> 9) | 0x3F800000;
- return *((f32*)&gRandFloat) - 1.5f;
-}
diff --git a/src/boot/O2/sleep.c b/src/boot/O2/sleep.c
deleted file mode 100644
index a35abc5b2..000000000
--- a/src/boot/O2/sleep.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "global.h"
-
-void Sleep_Cycles(u64 time) {
- OSMesgQueue mq;
- OSMesg msg[1];
- OSTimer timer;
-
- osCreateMesgQueue(&mq, msg, ARRAY_COUNT(msg));
- osSetTimer(&timer, time, 0, &mq, NULL);
- osRecvMesg(&mq, NULL, OS_MESG_BLOCK);
-}
-
-void Sleep_Nsec(u32 nsec) {
- Sleep_Cycles(OS_NSEC_TO_CYCLES(nsec));
-}
-
-void Sleep_Usec(u32 usec) {
- Sleep_Cycles(OS_USEC_TO_CYCLES(usec));
-}
-
-void Sleep_Msec(u32 ms) {
- Sleep_Cycles((ms * OS_CPU_COUNTER) / 1000ULL);
-}
-
-void Sleep_Sec(u32 sec) {
- Sleep_Cycles(sec * OS_CPU_COUNTER);
-}
diff --git a/src/boot/O2/sprintf.c b/src/boot/O2/sprintf.c
deleted file mode 100644
index 773b982ff..000000000
--- a/src/boot/O2/sprintf.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "ultra64.h"
-#include "libc/stdlib.h"
-#include "libc/string.h"
-
-void* proutSprintf(void* dst, const char* fmt, size_t size) {
- return (void*)((uintptr_t)memcpy(dst, fmt, size) + size);
-}
-
-int vsprintf(char* dst, char* fmt, va_list args) {
- int ans = _Printf(proutSprintf, dst, fmt, args);
- if (ans > -1) {
- dst[ans] = 0;
- }
- return ans;
-}
-
-int sprintf(char* dst, const char* fmt, ...) {
- int ans;
- va_list args;
- va_start(args, fmt);
-
- ans = _Printf(&proutSprintf, dst, fmt, args);
- if (ans > -1) {
- dst[ans] = 0;
- }
-
- va_end(args);
-
- return ans;
-}
diff --git a/src/boot/O2/system_heap.c b/src/boot/O2/system_heap.c
index c34129f12..7ad21b6ae 100644
--- a/src/boot/O2/system_heap.c
+++ b/src/boot/O2/system_heap.c
@@ -2,11 +2,11 @@
* @file system_heap.c
*
* @note:
- * Only SystemHeap_Init() is used, and is essentially just a wrapper for SystemArena_Init().
+ * Only SystemHeap_Init() is used, and is essentially just a wrapper for MallocInit().
*
*/
#include "global.h"
-#include "system_malloc.h"
+#include "libc64/malloc.h"
typedef void (*BlockFunc)(uintptr_t);
typedef void (*BlockFunc1)(uintptr_t, u32);
@@ -31,12 +31,12 @@ void* SystemHeap_Malloc(size_t size) {
size = 1;
}
- return __osMalloc(&gSystemArena, size);
+ return __osMalloc(&malloc_arena, size);
}
void SystemHeap_Free(void* ptr) {
if (ptr != NULL) {
- __osFree(&gSystemArena, ptr);
+ __osFree(&malloc_arena, ptr);
}
}
@@ -118,6 +118,6 @@ void SystemHeap_RunInits(void) {
}
void SystemHeap_Init(void* start, size_t size) {
- SystemArena_Init(start, size);
+ MallocInit(start, size);
SystemHeap_RunInits();
}
diff --git a/src/boot/O2/system_malloc.c b/src/boot/O2/system_malloc.c
deleted file mode 100644
index e7dc064fc..000000000
--- a/src/boot/O2/system_malloc.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "global.h"
-#include "os_malloc.h"
-
-Arena gSystemArena;
-
-void* SystemArena_Malloc(size_t size) {
- return __osMalloc(&gSystemArena, size);
-}
-
-void* SystemArena_MallocR(size_t size) {
- return __osMallocR(&gSystemArena, size);
-}
-
-void* SystemArena_Realloc(void* oldPtr, size_t newSize) {
- return __osRealloc(&gSystemArena, oldPtr, newSize);
-}
-
-void SystemArena_Free(void* ptr) {
- __osFree(&gSystemArena, ptr);
-}
-
-void* SystemArena_Calloc(size_t num, size_t size) {
- void* ptr;
- size_t totalSize = num * size;
-
- ptr = __osMalloc(&gSystemArena, totalSize);
- if (ptr != NULL) {
- bzero(ptr, totalSize);
- }
- return ptr;
-}
-
-void SystemArena_GetSizes(size_t* maxFreeBlock, size_t* bytesFree, size_t* bytesAllocated) {
- __osGetSizes(&gSystemArena, maxFreeBlock, bytesFree, bytesAllocated);
-}
-
-u32 SystemArena_CheckArena(void) {
- return __osCheckArena(&gSystemArena);
-}
-
-void SystemArena_Init(void* start, size_t size) {
- __osMallocInit(&gSystemArena, start, size);
-}
-
-void SystemArena_Cleanup(void) {
- __osMallocCleanup(&gSystemArena);
-}
-
-u8 SystemArena_IsInitialized(void) {
- return __osMallocIsInitalized(&gSystemArena);
-}