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:
mzxrules 2023-01-13 22:29:50 -05:00 committed by GitHub
parent e4e0aed7cb
commit e2b61f88e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 169 additions and 47 deletions

View File

@ -51,6 +51,26 @@ typedef union {
u16 rgba;
} Color_RGBA16;
typedef union {
struct {
u32 r : 5;
u32 g : 5;
u32 b : 5;
u32 a : 1;
};
u16 rgba;
} Color_RGBA16_2;
typedef union{
struct {
u32 r : 3;
u32 g : 3;
u32 b : 3;
u32 a : 5;
};
u16 rgba;
} Color_RGBA14;
#define RGBA8(r, g, b, a) ((((r) & 0xFF) << 24) | (((g) & 0xFF) << 16) | (((b) & 0xFF) << 8) | (((a) & 0xFF) << 0))
#endif

View File

@ -2565,12 +2565,8 @@ u32 SysCfb_GetZBuffer(void);
// UNK_TYPE4 func_80178A24(void);
// void func_80178A34(void);
s32 func_80178A94(s32 param_1, s32 param_2);
// void func_80178AC0(void);
// void func_80178C80(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
// void func_80178D7C(void);
// void func_80178DAC(void);
void func_80178E3C(u8*, s32, s32, s32);
void func_80178E7C(uintptr_t arg0, void* arg1, size_t size);
void CmpDma_LoadFile(uintptr_t segmentVrom, s32 id, void* dst, size_t size);
void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size);
// void Check_WriteRGBA16Pixel(u16* buffer, u32 x, u32 y, u32 value);
// void Check_WriteI4Pixel(u16* buffer, u32 x, u32 y, u32 value);
// void Check_DrawI4Texture(u16* buffer, u32 x, u32 y, u32 width, u32 height, u8* texture);

View File

@ -308,7 +308,7 @@ extern u8* sYaz0CurDataEnd;
extern u32 sYaz0CurRomStart;
extern u32 sYaz0CurSize;
extern u8* sYaz0MaxPtr;
extern u8* D_8009BE20;
extern void* gYaz0DecompressDstEnd;
// extern UNK_TYPE4 D_8009BE30;
// extern UNK_TYPE4 D_8009BE34;
// extern FaultClient romInfoFaultClient;
@ -2574,7 +2574,6 @@ extern UNK_TYPE2 D_801FBBCE;
// extern UNK_TYPE1 D_801FBBD0;
// extern UNK_TYPE1 D_801FBBD2;
// extern UNK_TYPE1 D_801FBBD4;
// extern UNK_TYPE1 D_801FBBE0;
extern Vec3f D_801FBBF0;
extern LineSegment Math3D_ColSphereTri_line;
extern Vec3f Math3D_ColSphereTri_point;

2
spec
View File

@ -581,9 +581,9 @@ beginseg
include "build/data/code/speed_meter.data.o"
include "build/data/code/speed_meter.bss.o"
include "build/src/code/su_mtx.o"
include "build/src/code/sys_cfb.o"
include "build/data/code/sys_cfb.bss.o"
include "build/src/code/sys_cmpdma.o"
include "build/data/code/sys_cmpdma.bss.o"
include "build/src/code/sys_initial_check.o"
include "build/src/code/sys_math.o"
include "build/src/code/sys_math3d.o"

View File

@ -6,7 +6,7 @@ u8* sYaz0CurDataEnd;
uintptr_t sYaz0CurRomStart;
u32 sYaz0CurSize;
u8* sYaz0MaxPtr;
u8* D_8009BE20;
void* gYaz0DecompressDstEnd;
void* Yaz0_FirstDMA() {
u32 pad0;
@ -118,7 +118,7 @@ s32 Yaz0_DecompressImpl(u8* src, u8* dst) {
bitIdx--;
} while (dst != dstEnd);
D_8009BE20 = dstEnd;
gYaz0DecompressDstEnd = dstEnd;
return 0;
}

20
src/code/sys_cfb.c Normal file
View File

@ -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")

View File

@ -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;
}
}

View File

@ -461,15 +461,15 @@ f32 D_8082BE28[] = {
s16 D_8082BE84 = 0;
void func_80821900(void* segment, u32 texIndex) {
func_80178E3C(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
}
void func_8082192C(void* segment, u32 texIndex) {
func_80178E3C(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
}
void func_80821958(void* segment, u32 texIndex) {
func_80178E3C(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_MoveCursorToSpecialPos.s")
@ -611,7 +611,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->iconItemSegment = (void*)ALIGN16((uintptr_t)play->objectCtx.spaceStart);
size0 = SEGMENT_ROM_SIZE(icon_item_static_old);
func_80178E7C((uintptr_t)SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
gSegments[0x08] = PHYSICAL_TO_VIRTUAL(pauseCtx->iconItemSegment);
@ -623,7 +623,8 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0);
size1 = SEGMENT_ROM_SIZE(icon_item_24_static_old);
func_80178E7C((uintptr_t)SEGMENT_ROM_START(icon_item_24_static_test), pauseCtx->iconItem24Segment, size1);
CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_24_static_test), pauseCtx->iconItem24Segment,
size1);
pauseCtx->iconItemAltSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItem24Segment + size1);
if (func_8010A0A4(play)) {
@ -932,11 +933,11 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->iconItemSegment =
(void*)(((uintptr_t)play->objectCtx.spaceStart + 0x30) & ~0x3F); // Messed up ALIGN64
size0 = SEGMENT_ROM_SIZE(icon_item_static_old);
func_80178E7C(SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
CmpDma_LoadAllFiles(SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0);
size1 = SEGMENT_ROM_SIZE(icon_item_24_static_old);
func_80178E7C(SEGMENT_ROM_START(icon_item_24_static_test), pauseCtx->iconItem24Segment, size1);
CmpDma_LoadAllFiles(SEGMENT_ROM_START(icon_item_24_static_test), pauseCtx->iconItem24Segment, size1);
pauseCtx->iconItemAltSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItem24Segment + size1);
size2 = SEGMENT_ROM_SIZE(icon_item_gameover_static);
@ -1179,7 +1180,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->iconItemSegment = (void*)ALIGN16((uintptr_t)play->objectCtx.spaceStart);
size0 = SEGMENT_ROM_SIZE(icon_item_static_old);
func_80178E7C(SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
CmpDma_LoadAllFiles(SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
pauseCtx->iconItemAltSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0);
sInDungeonScene = false;

View File

@ -466,7 +466,8 @@
0x80176280 : "sched",
0x80177390 : "speed_meter",
0x801780F0 : "su_mtx",
0x80178750 : "sys_cmpdma",
0x80178750 : "sys_cfb",
0x80178AC0 : "sys_cmpdma",
0x80178F30 : "sys_initial_check",
0x80179300 : "sys_math",
0x801795F0 : "sys_math3d",

View File

@ -3235,11 +3235,11 @@
0x80178A34:("func_80178A34",),
0x80178A94:("func_80178A94",),
0x80178AC0:("func_80178AC0",),
0x80178C80:("func_80178C80",),
0x80178D7C:("func_80178D7C",),
0x80178DAC:("func_80178DAC",),
0x80178E3C:("func_80178E3C",),
0x80178E7C:("func_80178E7C",),
0x80178C80:("CmpDma_GetFileInfo",),
0x80178D7C:("CmpDma_Decompress",),
0x80178DAC:("CmpDma_LoadFileImpl",),
0x80178E3C:("CmpDma_LoadFile",),
0x80178E7C:("CmpDma_LoadAllFiles",),
0x80178F30:("Check_WriteRGBA16Pixel",),
0x80178F60:("Check_WriteI4Pixel",),
0x80178FA0:("Check_DrawI4Texture",),

View File

@ -311,7 +311,7 @@
0x8009BE14:("sYaz0CurRomStart","u32","",0x4),
0x8009BE18:("sYaz0CurSize","u32","",0x4),
0x8009BE1C:("sYaz0MaxPtr","u8*","",0x4),
0x8009BE20:("D_8009BE20","u8*","",0x4),
0x8009BE20:("gYaz0DecompressDstEnd","void*","",0x4),
0x8009BE30:("D_8009BE30","UNK_TYPE4","",0x4),
0x8009BE34:("D_8009BE34","UNK_TYPE4","",0x4),
0x8009BE38:("romInfoFaultClient","FaultClient","",0x10),
@ -4139,7 +4139,7 @@
0x801FBBD0:("D_801FBBD0","UNK_TYPE1","",0x1),
0x801FBBD2:("D_801FBBD2","UNK_TYPE1","",0x1),
0x801FBBD4:("D_801FBBD4","UNK_TYPE1","",0x1),
0x801FBBE0:("D_801FBBE0","UNK_TYPE1","",0x1),
0x801FBBE0:("sDmaBuffer","u32","[2]",0x8),
0x801FBBF0:("D_801FBBF0","Vec3f","",0xc),
0x801FBC00:("Math3D_ColSphereTri_line","LineSegment","",0x18),
0x801FBC18:("Math3D_ColSphereTri_point","Vec3f","",0xc),

View File

@ -2749,11 +2749,11 @@ asm/non_matchings/code/sys_cmpdma/func_80178A24.s,func_80178A24,0x80178A24,0x4
asm/non_matchings/code/sys_cmpdma/func_80178A34.s,func_80178A34,0x80178A34,0x18
asm/non_matchings/code/sys_cmpdma/func_80178A94.s,func_80178A94,0x80178A94,0xB
asm/non_matchings/code/sys_cmpdma/func_80178AC0.s,func_80178AC0,0x80178AC0,0x70
asm/non_matchings/code/sys_cmpdma/func_80178C80.s,func_80178C80,0x80178C80,0x3F
asm/non_matchings/code/sys_cmpdma/func_80178D7C.s,func_80178D7C,0x80178D7C,0xC
asm/non_matchings/code/sys_cmpdma/func_80178DAC.s,func_80178DAC,0x80178DAC,0x24
asm/non_matchings/code/sys_cmpdma/func_80178E3C.s,func_80178E3C,0x80178E3C,0x10
asm/non_matchings/code/sys_cmpdma/func_80178E7C.s,func_80178E7C,0x80178E7C,0x2D
asm/non_matchings/code/sys_cmpdma/CmpDma_GetFileInfo.s,CmpDma_GetFileInfo,0x80178C80,0x3F
asm/non_matchings/code/sys_cmpdma/CmpDma_Decompress.s,CmpDma_Decompress,0x80178D7C,0xC
asm/non_matchings/code/sys_cmpdma/CmpDma_LoadFileImpl.s,CmpDma_LoadFileImpl,0x80178DAC,0x24
asm/non_matchings/code/sys_cmpdma/CmpDma_LoadFile.s,CmpDma_LoadFile,0x80178E3C,0x10
asm/non_matchings/code/sys_cmpdma/CmpDma_LoadAllFiles.s,CmpDma_LoadAllFiles,0x80178E7C,0x2D
asm/non_matchings/code/sys_initial_check/Check_WriteRGBA16Pixel.s,Check_WriteRGBA16Pixel,0x80178F30,0xC
asm/non_matchings/code/sys_initial_check/Check_WriteI4Pixel.s,Check_WriteI4Pixel,0x80178F60,0x10
asm/non_matchings/code/sys_initial_check/Check_DrawI4Texture.s,Check_DrawI4Texture,0x80178FA0,0x3C

1 asm/non_matchings/code/z_en_a_keep/EnAObj_Init.s EnAObj_Init 0x800A5AC0 0x2B
2749 asm/non_matchings/code/sys_cmpdma/func_80178A34.s func_80178A34 0x80178A34 0x18
2750 asm/non_matchings/code/sys_cmpdma/func_80178A94.s func_80178A94 0x80178A94 0xB
2751 asm/non_matchings/code/sys_cmpdma/func_80178AC0.s func_80178AC0 0x80178AC0 0x70
2752 asm/non_matchings/code/sys_cmpdma/func_80178C80.s asm/non_matchings/code/sys_cmpdma/CmpDma_GetFileInfo.s func_80178C80 CmpDma_GetFileInfo 0x80178C80 0x3F
2753 asm/non_matchings/code/sys_cmpdma/func_80178D7C.s asm/non_matchings/code/sys_cmpdma/CmpDma_Decompress.s func_80178D7C CmpDma_Decompress 0x80178D7C 0xC
2754 asm/non_matchings/code/sys_cmpdma/func_80178DAC.s asm/non_matchings/code/sys_cmpdma/CmpDma_LoadFileImpl.s func_80178DAC CmpDma_LoadFileImpl 0x80178DAC 0x24
2755 asm/non_matchings/code/sys_cmpdma/func_80178E3C.s asm/non_matchings/code/sys_cmpdma/CmpDma_LoadFile.s func_80178E3C CmpDma_LoadFile 0x80178E3C 0x10
2756 asm/non_matchings/code/sys_cmpdma/func_80178E7C.s asm/non_matchings/code/sys_cmpdma/CmpDma_LoadAllFiles.s func_80178E7C CmpDma_LoadAllFiles 0x80178E7C 0x2D
2757 asm/non_matchings/code/sys_initial_check/Check_WriteRGBA16Pixel.s Check_WriteRGBA16Pixel 0x80178F30 0xC
2758 asm/non_matchings/code/sys_initial_check/Check_WriteI4Pixel.s Check_WriteI4Pixel 0x80178F60 0x10
2759 asm/non_matchings/code/sys_initial_check/Check_DrawI4Texture.s Check_DrawI4Texture 0x80178FA0 0x3C