diff options
| author | mzxrules <mzxrules@gmail.com> | 2023-01-13 22:29:50 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-14 00:29:50 -0300 |
| commit | e2b61f88e46efc994db334ac5f03e1174de67058 (patch) | |
| tree | 50092ee521991f2f9b2ab42dfd8ac7a9253691cd /src/code | |
| parent | e4e0aed7cb4f1f99ba1b8dfd973a20662037054c (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.c | 20 | ||||
| -rw-r--r-- | src/code/sys_cmpdma.c | 115 |
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; + } +} |
