From 52a50c018e7fc2f4e6c8868a3a97e280f675418e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 9 Feb 2021 19:30:05 +1000 Subject: [PATCH] Decompile func0f166eb4 --- src/boot/entry.c | 2 +- src/game/file.c | 76 ++++++++++--------------------------- src/game/room.c | 2 +- src/game/texture.c | 2 +- src/include/game/file.h | 2 +- src/include/lib/lib_074f0.h | 2 +- src/lib/lib_070d0.c | 2 +- src/lib/lib_074f0.c | 2 +- src/lib/lib_0e9d0.c | 2 +- src/lib/main.c | 4 +- 10 files changed, 31 insertions(+), 65 deletions(-) diff --git a/src/boot/entry.c b/src/boot/entry.c index 8c6998b10..5f2ed72c7 100644 --- a/src/boot/entry.c +++ b/src/boot/entry.c @@ -324,7 +324,7 @@ glabel boot00001180 /* 140c: afbc0070 */ sw $gp,0x70($sp) /* 1410: afbd0074 */ sw $sp,0x74($sp) /* 1414: afbe0078 */ sw $s8,0x78($sp) -/* 1418: 0c001d3c */ jal func000074f0 +/* 1418: 0c001d3c */ jal rzipInflate /* 141c: 00000000 */ nop /* 1420: 8fbf0000 */ lw $ra,0x0($sp) /* 1424: 8fa10004 */ lw $at,0x4($sp) diff --git a/src/game/file.c b/src/game/file.c index 01de05e37..dde87f3a7 100644 --- a/src/game/file.c +++ b/src/game/file.c @@ -44,61 +44,27 @@ u32 func0f166ea8(u32 *filetableaddr) return 0; } -GLOBAL_ASM( -glabel func0f166eb4 -/* f166eb4: 27bdebd0 */ addiu $sp,$sp,-5168 -/* f166eb8: afbf0014 */ sw $ra,0x14($sp) -/* f166ebc: afa41430 */ sw $a0,0x1430($sp) -/* f166ec0: afa51434 */ sw $a1,0x1434($sp) -/* f166ec4: afa61438 */ sw $a2,0x1438($sp) -/* f166ec8: afa7143c */ sw $a3,0x143c($sp) -/* f166ecc: 0fc59b95 */ jal fileGetRomSizeByTableAddress -/* f166ed0: 00c02025 */ or $a0,$a2,$zero -/* f166ed4: 8fa41434 */ lw $a0,0x1434($sp) -/* f166ed8: 8fa71430 */ lw $a3,0x1430($sp) -/* f166edc: 8fa91438 */ lw $t1,0x1438($sp) -/* f166ee0: 14800006 */ bnez $a0,.L0f166efc -/* f166ee4: 00403025 */ or $a2,$v0,$zero -/* f166ee8: 00e02025 */ or $a0,$a3,$zero -/* f166eec: 0c003504 */ jal func0000d410 -/* f166ef0: 8d250000 */ lw $a1,0x0($t1) -/* f166ef4: 1000001c */ b .L0f166f68 -/* f166ef8: 8fbf0014 */ lw $ra,0x14($sp) -.L0f166efc: -/* f166efc: 2408fff8 */ addiu $t0,$zero,-8 -/* f166f00: 244e0007 */ addiu $t6,$v0,0x7 -/* f166f04: 01c87824 */ and $t7,$t6,$t0 -/* f166f08: 00e41821 */ addu $v1,$a3,$a0 -/* f166f0c: 006fc023 */ subu $t8,$v1,$t7 -/* f166f10: 0307c823 */ subu $t9,$t8,$a3 -/* f166f14: 2f210008 */ sltiu $at,$t9,0x8 -/* f166f18: 10200004 */ beqz $at,.L0f166f2c -/* f166f1c: 24cb0007 */ addiu $t3,$a2,0x7 -/* f166f20: 8faa143c */ lw $t2,0x143c($sp) -/* f166f24: 1000000f */ b .L0f166f64 -/* f166f28: ad400000 */ sw $zero,0x0($t2) -.L0f166f2c: -/* f166f2c: 01686024 */ and $t4,$t3,$t0 -/* f166f30: 006c2023 */ subu $a0,$v1,$t4 -/* f166f34: 8d250000 */ lw $a1,0x0($t1) -/* f166f38: 0c003504 */ jal func0000d410 -/* f166f3c: afa4001c */ sw $a0,0x1c($sp) -/* f166f40: 8fa4001c */ lw $a0,0x1c($sp) -/* f166f44: 8fa51430 */ lw $a1,0x1430($sp) -/* f166f48: 0c001d3c */ jal func000074f0 -/* f166f4c: 27a6002c */ addiu $a2,$sp,0x2c -/* f166f50: 8fb8143c */ lw $t8,0x143c($sp) -/* f166f54: 244d000f */ addiu $t5,$v0,0xf -/* f166f58: 35ae000f */ ori $t6,$t5,0xf -/* f166f5c: 39cf000f */ xori $t7,$t6,0xf -/* f166f60: af0f0000 */ sw $t7,0x0($t8) -.L0f166f64: -/* f166f64: 8fbf0014 */ lw $ra,0x14($sp) -.L0f166f68: -/* f166f68: 27bd1430 */ addiu $sp,$sp,0x1430 -/* f166f6c: 03e00008 */ jr $ra -/* f166f70: 00000000 */ nop -); +void func0f166eb4(void *dst, u32 scratchlen, u32 *romaddrptr, struct fileinfo *info) +{ + u32 romsize = fileGetRomSizeByTableAddress(romaddrptr); + u8 buffer[5 * 1024]; + u32 tmp; + + if (scratchlen == 0) { + // DMA with no inflate + func0000d410(dst, (void *)*romaddrptr, romsize); + } else { + // DMA the compressed data to scratch space then inflate + u32 scratchaddr = ((u32)dst + scratchlen) - (romsize + 7 & 0xfffffff8); + + if (scratchaddr - (u32)dst < 8) { + info->size = 0; + } else { + func0000d410((void *)scratchaddr, (void *)*romaddrptr, romsize); + info->size = ALIGN16(rzipInflate((void *)scratchaddr, dst, buffer)); + } + } +} GLOBAL_ASM( glabel func0f166f74 diff --git a/src/game/room.c b/src/game/room.c index 5135047ae..720267e76 100644 --- a/src/game/room.c +++ b/src/game/room.c @@ -7356,7 +7356,7 @@ glabel func0f15d9a8 /* f15d9c4: 8fa51424 */ lw $a1,0x1424($sp) /* f15d9c8: 10400005 */ beqz $v0,.L0f15d9e0 /* f15d9cc: 8fa61428 */ lw $a2,0x1428($sp) -/* f15d9d0: 0c001d3c */ jal func000074f0 +/* f15d9d0: 0c001d3c */ jal rzipInflate /* f15d9d4: 27a6001c */ addiu $a2,$sp,0x1c /* f15d9d8: 10000004 */ b .L0f15d9ec /* f15d9dc: 00401825 */ or $v1,$v0,$zero diff --git a/src/game/texture.c b/src/game/texture.c index 1274dbe62..b2bee404b 100644 --- a/src/game/texture.c +++ b/src/game/texture.c @@ -191,7 +191,7 @@ glabel func0f16e818 /* f16ea7c: 3c04800b */ lui $a0,%hi(var800ab540) /* f16ea80: 8c84b540 */ lw $a0,%lo(var800ab540)($a0) /* f16ea84: 02802825 */ or $a1,$s4,$zero -/* f16ea88: 0c001d3c */ jal func000074f0 +/* f16ea88: 0c001d3c */ jal rzipInflate /* f16ea8c: 27a6006c */ addiu $a2,$sp,0x6c /* f16ea90: 02802025 */ or $a0,$s4,$zero /* f16ea94: 02e02825 */ or $a1,$s7,$zero diff --git a/src/include/game/file.h b/src/include/game/file.h index 6124f0a5d..37a20a348 100644 --- a/src/include/game/file.h +++ b/src/include/game/file.h @@ -7,7 +7,7 @@ void *fileGetRomAddress(s32 filenum); u32 fileGetRomSizeByTableAddress(u32 *filetableaddr); s32 fileGetRomSizeByFileNum(s32 filenum); u32 func0f166ea8(u32 *filetableaddr); -void func0f166eb4(void *ptr, u32 len, void *table, struct fileinfo *info); +void func0f166eb4(void *dst, u32 scratchlen, u32 *romaddrptr, struct fileinfo *info); void func0f166f74(void); void func0f166ff0(u16 filenum, void *memaddr, s32 offset, u32 len); u32 fileGetInflatedLength(u32 filenum); diff --git a/src/include/lib/lib_074f0.h b/src/include/lib/lib_074f0.h index f692cd724..e539d257c 100644 --- a/src/include/lib/lib_074f0.h +++ b/src/include/lib/lib_074f0.h @@ -3,7 +3,7 @@ #include #include "types.h" -u32 func000074f0(void *src, void *dst, void *arg2); +u32 rzipInflate(void *src, void *dst, void *tmpbuffer); u32 func00007908(void); u32 func0000796c(void); u32 func00007a10(void); diff --git a/src/lib/lib_070d0.c b/src/lib/lib_070d0.c index b4b15c20f..c496e8e6e 100644 --- a/src/lib/lib_070d0.c +++ b/src/lib/lib_070d0.c @@ -234,7 +234,7 @@ glabel func000070d0 /* 73f8: 3b06000f */ xori $a2,$t8,0xf /* 73fc: 8fa40048 */ lw $a0,0x48($sp) /* 7400: 02402825 */ or $a1,$s2,$zero -/* 7404: 0c001d3c */ jal func000074f0 +/* 7404: 0c001d3c */ jal rzipInflate /* 7408: 27a60068 */ addiu $a2,$sp,0x68 /* 740c: 26100001 */ addiu $s0,$s0,0x1 /* 7410: 0216082b */ sltu $at,$s0,$s6 diff --git a/src/lib/lib_074f0.c b/src/lib/lib_074f0.c index 8227a3d77..df7ace95d 100644 --- a/src/lib/lib_074f0.c +++ b/src/lib/lib_074f0.c @@ -79,7 +79,7 @@ const char var7005261c[] = "RareZipAsmDecompress: input not in any known rare zip format\n"; GLOBAL_ASM( -glabel func000074f0 +glabel rzipInflate /* 74f0: 27bdf578 */ addiu $sp,$sp,-2696 /* 74f4: afb00a48 */ sw $s0,0xa48($sp) /* 74f8: afb10a4c */ sw $s1,0xa4c($sp) diff --git a/src/lib/lib_0e9d0.c b/src/lib/lib_0e9d0.c index 55e5309d5..b99d47947 100644 --- a/src/lib/lib_0e9d0.c +++ b/src/lib/lib_0e9d0.c @@ -2044,7 +2044,7 @@ glabel func0000fc48 /* fd14: afa7143c */ sw $a3,0x143c($sp) /* fd18: 8fa40028 */ lw $a0,0x28($sp) /* fd1c: 8fa5143c */ lw $a1,0x143c($sp) -/* fd20: 0c001d3c */ jal func000074f0 +/* fd20: 0c001d3c */ jal rzipInflate /* fd24: 27a60034 */ addiu $a2,$sp,0x34 /* fd28: 02002025 */ or $a0,$s0,$zero /* fd2c: 0c00e34c */ jal func00038d30 diff --git a/src/lib/main.c b/src/lib/main.c index 694036103..2f6e86a19 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -374,7 +374,7 @@ glabel mainInit /* d7b8: 02012821 */ addu $a1,$s0,$at /* d7bc: afa50048 */ sw $a1,0x48($sp) /* d7c0: 02002025 */ or $a0,$s0,$zero -/* d7c4: 0c001d3c */ jal func000074f0 +/* d7c4: 0c001d3c */ jal rzipInflate /* d7c8: 27a60050 */ addiu $a2,$sp,0x50 /* d7cc: 3c050004 */ lui $a1,0x4 /* d7d0: 8faa0048 */ lw $t2,0x48($sp) @@ -686,7 +686,7 @@ const char var70053aa0[] = " -ml0 -me0 -mgfx100 -mvtx50 -mt700 -ma400"; // texture = fb - 507 * 48; // // // Convert the texture format? Probably reading from fb and writing to texture -// func000074f0(fb, texture, &sp50); +// rzipInflate(fb, texture, &sp50); // // // Clear the framebuffer // // This seems a bit wasteful. The buffer is 640x480, so the y increment