mirror of
https://github.com/zeldaret/mm.git
synced 2026-06-18 07:05:21 -04:00
sys_cmpdata OK (#1065)
* sys_cmpdata decomp * implement suggestions * sys_cmpdata OK * format * implement suggestion * make bss data public * format bleh
This commit is contained in:
@@ -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")
|
||||
+100
-15
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user