From 0eb05318385e9362c522c3b8617c3b04f0fa36cb Mon Sep 17 00:00:00 2001 From: queueRAM Date: Fri, 13 Mar 2026 22:55:53 +0000 Subject: [PATCH] Create space for 4 bytes copied from ROM filesystem UVBlockCounts is the first filesystem block that includes counts for all the block types that follow. This is memset to 0 beforehand with size of 0x24, but when DMA from ROM, the block size is defined to be 0x28. This happens to work out since there happens to be 4 bytes padding between this 0x24 and the next struct in memory. Create a new wrapper struct which explicitly allocates this 4 bytes to keep the code portable. --- include/uv_memory.h | 9 +++++++-- src/kernel/memory.c | 6 +++--- src/kernel/texture.c | 33 ++++++++++++++++----------------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/include/uv_memory.h b/include/uv_memory.h index bf212dc6..db8de4e2 100644 --- a/include/uv_memory.h +++ b/include/uv_memory.h @@ -26,6 +26,11 @@ typedef struct { u16 unk22; } UVBlockCounts; +typedef struct { + UVBlockCounts counts; + s32 unk24; +} UVBlockMeta; + typedef struct { void* UVSY[1]; void* UVMD[0x190]; @@ -56,8 +61,8 @@ extern void* D_802B6E30[LEVEL_TEXTURE_COUNT]; extern uvLevelData gLevelData; extern Unk802B53C0* D_802B53C0; -extern UVBlockCounts gUVBlockCounts; // D_802B53C8 -extern UVBlockOffsets gUVBlockOffsets; // D_802B53F0 +extern UVBlockMeta gUVBlockCounts; +extern UVBlockOffsets gUVBlockOffsets; void mio0_decompress(void* src, u8* dst); diff --git a/src/kernel/memory.c b/src/kernel/memory.c index 61568c83..e80abacc 100644 --- a/src/kernel/memory.c +++ b/src/kernel/memory.c @@ -358,15 +358,15 @@ void uvLevelInit(void) { switch (tag) { case 'COMM': _uvMediaCopy(&gUVBlockCounts, source, length); - gLevelData.unk1608 = gUVBlockCounts.unk0; + gLevelData.unk1608 = gUVBlockCounts.counts.unk0; break; default: break; } } uvFile_80223F30(temp_v0); - if (gUVBlockCounts.uvVersion != UV_KERNEL_VERSION) { - _uvDebugPrintf("uvLevelInit: dbase [ver %d] and kernel [ver %d] out of date\n", gUVBlockCounts.uvVersion, UV_KERNEL_VERSION); + if (gUVBlockCounts.counts.uvVersion != UV_KERNEL_VERSION) { + _uvDebugPrintf("uvLevelInit: dbase [ver %d] and kernel [ver %d] out of date\n", gUVBlockCounts.counts.uvVersion, UV_KERNEL_VERSION); } } diff --git a/src/kernel/texture.c b/src/kernel/texture.c index efcd6c5d..f46be9f5 100644 --- a/src/kernel/texture.c +++ b/src/kernel/texture.c @@ -48,7 +48,7 @@ ParsedUVTR* _uvParseUVTR(u8*); ParsedUVBT* _uvParseUVBT(u8*); Unk802B53C0* D_802B53C0; -UVBlockCounts gUVBlockCounts; +UVBlockMeta gUVBlockCounts; UVBlockOffsets gUVBlockOffsets; void* D_802B6E30[LEVEL_TEXTURE_COUNT]; u16 D_802B7600[1000]; @@ -68,7 +68,7 @@ void uvMemInitBlockHdr(void) { u32 tag; UVBlockHeader* var_a0; - uvMemSet(&gUVBlockCounts, 0, sizeof(gUVBlockCounts)); + uvMemSet(&gUVBlockCounts.counts, 0, sizeof(gUVBlockCounts.counts)); sp64 = uvFileReadHeader(SEGMENT_ROM_START(filetable)); romOffset = SEGMENT_ROM_START(filesys); @@ -82,46 +82,46 @@ void uvMemInitBlockHdr(void) { gUVBlockOffsets.UVSY[0] = romOffset; break; case 'UVAN': - gUVBlockOffsets.UVAN[gUVBlockCounts.UVAN++] = romOffset; + gUVBlockOffsets.UVAN[gUVBlockCounts.counts.UVAN++] = romOffset; break; case 'UVFT': - gUVBlockOffsets.UVFT[gUVBlockCounts.UVFT++] = romOffset; + gUVBlockOffsets.UVFT[gUVBlockCounts.counts.UVFT++] = romOffset; break; case 'UVBT': - gUVBlockOffsets.UVBT[gUVBlockCounts.UVBT++] = romOffset; + gUVBlockOffsets.UVBT[gUVBlockCounts.counts.UVBT++] = romOffset; break; case 'UVMD': - gUVBlockOffsets.UVMD[gUVBlockCounts.UVMD++] = romOffset; + gUVBlockOffsets.UVMD[gUVBlockCounts.counts.UVMD++] = romOffset; break; case 'UVCT': - gUVBlockOffsets.UVCT[gUVBlockCounts.UVCT++] = romOffset; + gUVBlockOffsets.UVCT[gUVBlockCounts.counts.UVCT++] = romOffset; break; case 'UVTX': - gUVBlockOffsets.UVTX[gUVBlockCounts.UVTX++] = romOffset; + gUVBlockOffsets.UVTX[gUVBlockCounts.counts.UVTX++] = romOffset; break; case 'UVEN': - gUVBlockOffsets.UVEN[gUVBlockCounts.UVEN++] = romOffset; + gUVBlockOffsets.UVEN[gUVBlockCounts.counts.UVEN++] = romOffset; break; case 'UVLT': - gUVBlockOffsets.UVLT[gUVBlockCounts.UVLT++] = romOffset; + gUVBlockOffsets.UVLT[gUVBlockCounts.counts.UVLT++] = romOffset; break; case 'UVLV': - gUVBlockOffsets.UVLV[gUVBlockCounts.UVLV++] = romOffset; + gUVBlockOffsets.UVLV[gUVBlockCounts.counts.UVLV++] = romOffset; break; case 'UVSQ': - gUVBlockOffsets.UVSQ[gUVBlockCounts.UVSQ++] = romOffset; + gUVBlockOffsets.UVSQ[gUVBlockCounts.counts.UVSQ++] = romOffset; break; case 'UVTR': - gUVBlockOffsets.UVTR[gUVBlockCounts.UVTR++] = romOffset; + gUVBlockOffsets.UVTR[gUVBlockCounts.counts.UVTR++] = romOffset; break; case 'UVTP': - gUVBlockOffsets.UVTP[gUVBlockCounts.UVTP++] = romOffset; + gUVBlockOffsets.UVTP[gUVBlockCounts.counts.UVTP++] = romOffset; break; case 'UVSX': - gUVBlockOffsets.UVSX[gUVBlockCounts.UVSX++] = romOffset; + gUVBlockOffsets.UVSX[gUVBlockCounts.counts.UVSX++] = romOffset; break; default: - gUVBlockOffsets.unk1838[gUVBlockCounts.unk1C++] = romOffset; + gUVBlockOffsets.unk1838[gUVBlockCounts.counts.unk1C++] = romOffset; break; } romOffset += var_a0->size; @@ -1325,4 +1325,3 @@ s32 func_80227E5C(s32 arg0, s32 arg1) { } return FALSE; } -