summaryrefslogtreecommitdiff
path: root/src/sys/sys_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/sys_lib.c')
-rw-r--r--src/sys/sys_lib.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/sys/sys_lib.c b/src/sys/sys_lib.c
new file mode 100644
index 00000000..ffb3cb91
--- /dev/null
+++ b/src/sys/sys_lib.c
@@ -0,0 +1,143 @@
+#include "sys.h"
+
+s32 Lib_vsPrintf(char* dst, const char* fmt, va_list args) {
+ return vsprintf(dst, fmt, args);
+}
+
+void Lib_vTable(s32 index, void (**table)(s32, s32), s32 arg0, s32 arg1) {
+ void (*func)(s32, s32) = table[index];
+
+ func(arg0, arg1);
+}
+
+void Lib_SwapBuffers(u8* buf1, u8* buf2, s32 len) {
+ s32 i;
+ u8 temp;
+
+ for (i = 0; i < len; i++) {
+ temp = buf2[i];
+ buf2[i] = buf1[i];
+ buf1[i] = temp;
+ }
+}
+
+void Lib_QuickSort(u8* first, u32 length, u32 size, CompareFunc cFunc) {
+ u32 splitIdx;
+ u8* last;
+ u8* right;
+ u8* left;
+
+ while (1) {
+ last = first + (length - 1) * size;
+
+ if (length == 2) {
+ if (cFunc(first, last) > 0) {
+ Lib_SwapBuffers(first, last, size);
+ }
+ return;
+ }
+ if (size && size && size) {} //! FAKE: must be here with at least 3 && operands.
+ left = first;
+ right = last - size;
+
+ while (1) {
+ while (cFunc(left, last) < 0) {
+ left += size;
+ }
+ while ((cFunc(right, last) >= 0) && (left < right)) {
+ right -= size;
+ }
+ if (left >= right) {
+ break;
+ }
+ Lib_SwapBuffers(left, right, size);
+ left += size;
+ right -= size;
+ }
+ Lib_SwapBuffers(last, left, size);
+ splitIdx = (left - first) / size;
+ if (length / 2 < splitIdx) {
+ if ((length - splitIdx) > 2) {
+ Lib_QuickSort(left + size, length - splitIdx - 1, size, cFunc);
+ }
+
+ if (splitIdx < 2) {
+ return;
+ }
+ left = first;
+ length = splitIdx;
+ } else {
+ if (splitIdx >= 2) {
+ Lib_QuickSort(first, splitIdx, size, cFunc);
+ }
+
+ if ((length - splitIdx) <= 2) {
+ return;
+ }
+
+ first = left + size;
+ length -= splitIdx + 1;
+ }
+ }
+}
+
+void Lib_Perspective(Gfx** dList) {
+ u16 norm;
+
+ guPerspective(gGfxMtx, &norm, D_game_80161A3C, (f32) SCREEN_WIDTH / SCREEN_HEIGHT, D_game_80161A40, D_game_80161A44,
+ 1.0f);
+ gSPPerspNormalize((*dList)++, norm);
+ gSPMatrix((*dList)++, gGfxMtx++, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ guLookAt(gGfxMtx, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -12800.0f, 0.0f, 1.0f, 0.0f);
+ gSPMatrix((*dList)++, gGfxMtx++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+ Matrix_Copy(gGfxMatrix, &gIdentityMatrix);
+}
+
+void Lib_Ortho(Gfx** dList) {
+ guOrtho(gGfxMtx, -160.0f, 160.0f, -120.0f, 120.0f, D_game_80161A40, D_game_80161A44, 1.0f);
+ gSPMatrix((*dList)++, gGfxMtx++, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ guLookAt(gGfxMtx, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -12800.0f, 0.0f, 1.0f, 0.0f);
+ gSPMatrix((*dList)++, gGfxMtx++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+ Matrix_Copy(gGfxMatrix, &gIdentityMatrix);
+}
+
+void Lib_DmaRead(void* src, void* dst, ptrdiff_t size) {
+ osInvalICache(dst, size);
+ osInvalDCache(dst, size);
+ while (size > 0x100) {
+ osPiStartDma(&gDmaIOMsg, 0, 0, (uintptr_t) src, dst, 0x100, &gDmaMsgQueue);
+ size -= 0x100;
+ src = (void*) ((uintptr_t) src + 0x100);
+ dst = (void*) ((uintptr_t) dst + 0x100);
+ osRecvMesg(&gDmaMsgQueue, NULL, OS_MESG_BLOCK);
+ }
+ if (size != 0) {
+ osPiStartDma(&gDmaIOMsg, 0, 0, (uintptr_t) src, dst, size, &gDmaMsgQueue);
+ osRecvMesg(&gDmaMsgQueue, NULL, OS_MESG_BLOCK);
+ }
+}
+
+void Lib_FillScreen(u8 setFill) {
+ s32 i;
+
+ gFillScreenColor |= 1;
+ if (setFill == true) {
+ if (gFillScreen == false) {
+ if (gFillScreenColor == 1) {
+ osViBlack(1);
+ } else {
+ for (i = 0; i < 3 * SCREEN_WIDTH; i++) {
+ gFillBuffer[i] = gFillScreenColor;
+ }
+ osWritebackDCacheAll();
+ osViSwapBuffer(&gFillBuffer[SCREEN_WIDTH]);
+ osViRepeatLine(1);
+ }
+ gFillScreen = true;
+ }
+ } else if (gFillScreen == true) {
+ osViRepeatLine(0);
+ osViBlack(0);
+ gFillScreen = false;
+ }
+}