summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authormzxrules <mzxrules@gmail.com>2023-01-13 22:29:50 -0500
committerGitHub <noreply@github.com>2023-01-14 00:29:50 -0300
commite2b61f88e46efc994db334ac5f03e1174de67058 (patch)
tree50092ee521991f2f9b2ab42dfd8ac7a9253691cd /src/code
parente4e0aed7cb4f1f99ba1b8dfd973a20662037054c (diff)
sys_cmpdata OK (#1065)
* sys_cmpdata decomp * implement suggestions * sys_cmpdata OK * format * implement suggestion * make bss data public * format bleh
Diffstat (limited to 'src/code')
-rw-r--r--src/code/sys_cfb.c20
-rw-r--r--src/code/sys_cmpdma.c115
2 files changed, 120 insertions, 15 deletions
diff --git a/src/code/sys_cfb.c b/src/code/sys_cfb.c
new file mode 100644
index 000000000..3f198ce8f
--- /dev/null
+++ b/src/code/sys_cfb.c
@@ -0,0 +1,20 @@
+#include "global.h"
+#include "system_malloc.h"
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178750.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178818.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178978.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_801789D4.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetFbPtr.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetZBuffer.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A24.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A34.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A94.s")
diff --git a/src/code/sys_cmpdma.c b/src/code/sys_cmpdma.c
index 2533c44f5..b2a17d547 100644
--- a/src/code/sys_cmpdma.c
+++ b/src/code/sys_cmpdma.c
@@ -1,32 +1,117 @@
#include "global.h"
#include "system_malloc.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178750.s")
+typedef struct {
+ union {
+ u32 dmaWord[2];
+ u32 dataStart;
+ u32 dataSize;
+ struct {
+ u32 start;
+ u32 end;
+ } offset;
+ };
+} CmpDmaBuffer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178818.s")
+CmpDmaBuffer sDmaBuffer;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178978.s")
+void func_80178AC0(u16* src, void* dst, size_t size) {
+ Color_RGBA8_u32 spC;
+ Color_RGBA16_2 tc;
+ Color_RGBA14 tc2;
+ u32* dstCur = dst;
+ u16* src16 = src;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_801789D4.s")
+ while (((uintptr_t)dstCur) - size < ((uintptr_t)dst)) {
+ tc.rgba = *(src16++);
+ if (tc.a == 1) {
+ spC.r = (tc.r * 255) / 31;
+ spC.g = (tc.g * 255) / 31;
+ spC.b = (tc.b * 255) / 31;
+ spC.a = 255;
+ } else if (tc.rgba == 0) {
+ spC.rgba = 0;
+ } else {
+ tc2.rgba = tc.rgba;
+ tc.rgba = *(src16++);
+ spC.r = (tc.r << 3) | tc2.r;
+ spC.g = (tc.g << 3) | tc2.g;
+ spC.b = (tc.b << 3) | tc2.b;
+ spC.a = ((tc.rgba & 1) << 7) | ((tc2.a * 127) / 63);
+ }
+ *(dstCur++) = spC.rgba;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/SysCfb_GetFbPtr.s")
+void CmpDma_GetFileInfo(u8* segmentRom, s32 id, uintptr_t* outFileRom, size_t* size, s32* flag) {
+ u32 dataStart;
+ u32 refOff;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBuffer.s")
+ DmaMgr_DmaRomToRam(segmentRom, &sDmaBuffer.dataStart, sizeof(sDmaBuffer.dataStart));
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178A24.s")
+ dataStart = sDmaBuffer.dataStart;
+ refOff = id * sizeof(u32);
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178A34.s")
+ // if id is >= idMax
+ if (refOff > (dataStart - 4)) {
+ *outFileRom = segmentRom;
+ *size = 0;
+ } else if (refOff == 0) {
+ // get offset start of next file, i.e. size of first file
+ DmaMgr_DmaRomToRam(segmentRom + 4, &sDmaBuffer.dataSize, sizeof(sDmaBuffer.dataSize));
+ *outFileRom = segmentRom + dataStart;
+ *size = sDmaBuffer.dataSize;
+ } else {
+ // get offset start, end from dataStart
+ DmaMgr_DmaRomToRam(refOff + segmentRom, &sDmaBuffer.offset, sizeof(sDmaBuffer.offset));
+ *outFileRom = sDmaBuffer.offset.start + segmentRom + dataStart;
+ *size = sDmaBuffer.offset.end - sDmaBuffer.offset.start;
+ }
+ *flag = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178A94.s")
+void CmpDma_Decompress(uintptr_t romStart, size_t size, void* dst) {
+ if (size != 0) {
+ Yaz0_Decompress(romStart, dst, size);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178AC0.s")
+void CmpDma_LoadFileImpl(uintptr_t segmentRom, s32 id, void* dst, size_t size) {
+ uintptr_t romStart;
+ size_t compressedSize;
+ s32 flag;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178C80.s")
+ CmpDma_GetFileInfo(segmentRom, id, &romStart, &compressedSize, &flag);
+ if (flag & 1) {
+ void* tempBuf = SystemArena_Malloc(0x1000);
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178D7C.s")
+ CmpDma_Decompress(romStart, compressedSize, tempBuf);
+ func_80178AC0(tempBuf, dst, size);
+ SystemArena_Free(tempBuf);
+ } else {
+ CmpDma_Decompress(romStart, compressedSize, dst);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178DAC.s")
+void CmpDma_LoadFile(uintptr_t segmentVrom, s32 id, void* dst, size_t size) {
+ CmpDma_LoadFileImpl(DmaMgr_TranslateVromToRom(segmentVrom), id, dst, size);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178E3C.s")
+void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size) {
+ uintptr_t rom = DmaMgr_TranslateVromToRom(segmentVrom);
+ u32 i;
+ u32 end;
+ void* nextDst;
+ u32 dataStart;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cmpdma/func_80178E7C.s")
+ DmaMgr_DmaRomToRam(rom, &sDmaBuffer.dataStart, sizeof(sDmaBuffer.dataStart));
+
+ dataStart = sDmaBuffer.dataStart;
+ nextDst = dst;
+ end = (dataStart / sizeof(u32)) - 1;
+
+ for (i = 0; i < end; i++) {
+ CmpDma_LoadFileImpl(rom, i, nextDst, 0);
+ nextDst = gYaz0DecompressDstEnd;
+ }
+}