diff --git a/ld/pd.ld b/ld/pd.ld index 1925cad9b..eba249817 100644 --- a/ld/pd.ld +++ b/ld/pd.ld @@ -109,7 +109,6 @@ SECTIONS _val7f11ad0c = 0x0efc; _val7f11ae0c = 0x0f20; _val7f11aef4 = 0x0f38; - _val7f11bb48 = 0x1131; _val7f11c1d0 = 0x128d; #elif VERSION >= VERSION_NTSC_FINAL _val7f116f34 = 0x0339; @@ -122,7 +121,6 @@ SECTIONS _val7f11ad0c = 0x0ef5; _val7f11ae0c = 0x0f19; _val7f11aef4 = 0x0f31; - _val7f11bb48 = 0x112a; _val7f11c1d0 = 0x1286; #else _val7f116f34 = 0x0336; @@ -135,7 +133,6 @@ SECTIONS _val7f11ad0c = 0x0e32; _val7f11ae0c = 0x0e56; _val7f11aef4 = 0x0e6e; - _val7f11bb48 = 0x1067; _val7f11c1d0 = 0x11c3; #endif diff --git a/src/game/pak/pak.c b/src/game/pak/pak.c index 704d21809..c3b3bb0fd 100644 --- a/src/game/pak/pak.c +++ b/src/game/pak/pak.c @@ -201,7 +201,7 @@ void pak0f116650(void) // empty } -s32 pakGetAlignedFileLenByBodyLen(s8 device, s32 bodylen) +s32 pakGetAlignedFileLenByBodyLen(s8 device, u32 bodylen) { return pakAlign(device, sizeof(struct pakfileheader) + bodylen); } @@ -5888,504 +5888,146 @@ bool pakGetFilesystemLength(s8 device, u32 *outlen) return false; } +/** + * Read a file from cache or from the pak and write it to *data. + */ +s32 pak0f11b86c(s8 device, u32 offset, u8 *data, struct pakfileheader *header, s32 bodylen) +{ + struct pakfileheader headerstack; + s32 s0; #if VERSION >= VERSION_NTSC_1_0 -GLOBAL_ASM( -glabel pak0f11b86c -/* f11b86c: 27bdfed0 */ addiu $sp,$sp,-304 -/* f11b870: afb2002c */ sw $s2,0x2c($sp) -/* f11b874: 8fb20140 */ lw $s2,0x140($sp) -/* f11b878: afb10028 */ sw $s1,0x28($sp) -/* f11b87c: 00048e00 */ sll $s1,$a0,0x18 -/* f11b880: 00117603 */ sra $t6,$s1,0x18 -/* f11b884: afb50038 */ sw $s5,0x38($sp) -/* f11b888: afb30030 */ sw $s3,0x30($sp) -/* f11b88c: 2401ffff */ addiu $at,$zero,-1 -/* f11b890: 00e09825 */ or $s3,$a3,$zero -/* f11b894: 00c0a825 */ or $s5,$a2,$zero -/* f11b898: 01c08825 */ or $s1,$t6,$zero -/* f11b89c: afbf003c */ sw $ra,0x3c($sp) -/* f11b8a0: afb40034 */ sw $s4,0x34($sp) -/* f11b8a4: afb00024 */ sw $s0,0x24($sp) -/* f11b8a8: afa40130 */ sw $a0,0x130($sp) -/* f11b8ac: 16410006 */ bne $s2,$at,.L0f11b8c8 -/* f11b8b0: afa50134 */ sw $a1,0x134($sp) -/* f11b8b4: 240f0001 */ addiu $t7,$zero,0x1 -/* f11b8b8: afaf0114 */ sw $t7,0x114($sp) -/* f11b8bc: 24140001 */ addiu $s4,$zero,0x1 -/* f11b8c0: 10000003 */ beqz $zero,.L0f11b8d0 -/* f11b8c4: 00009025 */ or $s2,$zero,$zero -.L0f11b8c8: -/* f11b8c8: afa00114 */ sw $zero,0x114($sp) -/* f11b8cc: 0000a025 */ or $s4,$zero,$zero -.L0f11b8d0: -/* f11b8d0: 00112600 */ sll $a0,$s1,0x18 -/* f11b8d4: 0004c603 */ sra $t8,$a0,0x18 -/* f11b8d8: 0fc45974 */ jal pakGetBlockSize -/* f11b8dc: 03002025 */ or $a0,$t8,$zero -/* f11b8e0: 0012802b */ sltu $s0,$zero,$s2 -/* f11b8e4: 12000008 */ beqz $s0,.L0f11b908 -/* f11b8e8: 00112600 */ sll $a0,$s1,0x18 -/* f11b8ec: 0015802b */ sltu $s0,$zero,$s5 -/* f11b8f0: 12000005 */ beqz $s0,.L0f11b908 -/* f11b8f4: 26590010 */ addiu $t9,$s2,0x10 -/* f11b8f8: 0059802b */ sltu $s0,$v0,$t9 -/* f11b8fc: 3a100001 */ xori $s0,$s0,0x1 -/* f11b900: 0010482b */ sltu $t1,$zero,$s0 -/* f11b904: 01208025 */ or $s0,$t1,$zero -.L0f11b908: -/* f11b908: 16600002 */ bnez $s3,.L0f11b914 -/* f11b90c: 00045603 */ sra $t2,$a0,0x18 -/* f11b910: 27b30120 */ addiu $s3,$sp,0x120 -.L0f11b914: -/* f11b914: 01402025 */ or $a0,$t2,$zero -/* f11b918: 8fa50134 */ lw $a1,0x134($sp) -/* f11b91c: 0fc45d48 */ jal pakReadHeaderAtOffset -/* f11b920: 02603025 */ or $a2,$s3,$zero -/* f11b924: 10400003 */ beqz $v0,.L0f11b934 -/* f11b928: 00000000 */ sll $zero,$zero,0x0 -/* f11b92c: 100000a2 */ beqz $zero,.L0f11bbb8 -/* f11b930: 8fbf003c */ lw $ra,0x3c($sp) -.L0f11b934: -/* f11b934: 16800007 */ bnez $s4,.L0f11b954 -/* f11b938: 00000000 */ sll $zero,$zero,0x0 -/* f11b93c: 8e6b000c */ lw $t3,0xc($s3) -/* f11b940: 000b6f40 */ sll $t5,$t3,0x1d -/* f11b944: 05a00003 */ bltz $t5,.L0f11b954 -/* f11b948: 00000000 */ sll $zero,$zero,0x0 -/* f11b94c: 10000099 */ beqz $zero,.L0f11bbb4 -/* f11b950: 2402000a */ addiu $v0,$zero,0xa -.L0f11b954: -/* f11b954: 12000014 */ beqz $s0,.L0f11b9a8 -/* f11b958: 00112600 */ sll $a0,$s1,0x18 -/* f11b95c: 00047603 */ sra $t6,$a0,0x18 -/* f11b960: 01c02025 */ or $a0,$t6,$zero -/* f11b964: 8fa50134 */ lw $a1,0x134($sp) -/* f11b968: 0fc45d0c */ jal pakRetrieveBlockFromCache -/* f11b96c: 27a600e0 */ addiu $a2,$sp,0xe0 -/* f11b970: 5040000e */ beqzl $v0,.L0f11b9ac -/* f11b974: 8e650008 */ lw $a1,0x8($s3) -/* f11b978: 12400009 */ beqz $s2,.L0f11b9a0 -/* f11b97c: 00008025 */ or $s0,$zero,$zero -/* f11b980: 02a01025 */ or $v0,$s5,$zero -/* f11b984: 27a300e0 */ addiu $v1,$sp,0xe0 -.L0f11b988: -/* f11b988: 906f0010 */ lbu $t7,0x10($v1) -/* f11b98c: 26100001 */ addiu $s0,$s0,0x1 -/* f11b990: 24420001 */ addiu $v0,$v0,0x1 -/* f11b994: 24630001 */ addiu $v1,$v1,0x1 -/* f11b998: 1612fffb */ bne $s0,$s2,.L0f11b988 -/* f11b99c: a04fffff */ sb $t7,-0x1($v0) -.L0f11b9a0: -/* f11b9a0: 10000084 */ beqz $zero,.L0f11bbb4 -/* f11b9a4: 00001025 */ or $v0,$zero,$zero -.L0f11b9a8: -/* f11b9a8: 8e650008 */ lw $a1,0x8($s3) -.L0f11b9ac: -/* f11b9ac: 00112600 */ sll $a0,$s1,0x18 -/* f11b9b0: 00044e03 */ sra $t1,$a0,0x18 -/* f11b9b4: 0005c240 */ sll $t8,$a1,0x9 -/* f11b9b8: 00182d42 */ srl $a1,$t8,0x15 -/* f11b9bc: 16450002 */ bne $s2,$a1,.L0f11b9c8 -/* f11b9c0: 00000000 */ sll $zero,$zero,0x0 -/* f11b9c4: 00009025 */ or $s2,$zero,$zero -.L0f11b9c8: -/* f11b9c8: 0fc45996 */ jal pakGetAlignedFileLenByBodyLen -/* f11b9cc: 01202025 */ or $a0,$t1,$zero -/* f11b9d0: 16400005 */ bnez $s2,.L0f11b9e8 -/* f11b9d4: 8fac0114 */ lw $t4,0x114($sp) -/* f11b9d8: 8e700008 */ lw $s0,0x8($s3) -/* f11b9dc: 00105240 */ sll $t2,$s0,0x9 -/* f11b9e0: 10000002 */ beqz $zero,.L0f11b9ec -/* f11b9e4: 000a8542 */ srl $s0,$t2,0x15 -.L0f11b9e8: -/* f11b9e8: 02408025 */ or $s0,$s2,$zero -.L0f11b9ec: -/* f11b9ec: 11800002 */ beqz $t4,.L0f11b9f8 -/* f11b9f0: 26030010 */ addiu $v1,$s0,0x10 -/* f11b9f4: 00401825 */ or $v1,$v0,$zero -.L0f11b9f8: -/* f11b9f8: 0c00543a */ jal joyDisableCyclicPolling -/* f11b9fc: afa30104 */ sw $v1,0x104($sp) -/* f11ba00: 8fad0104 */ lw $t5,0x104($sp) -/* f11ba04: 00008025 */ or $s0,$zero,$zero -/* f11ba08: 27b40058 */ addiu $s4,$sp,0x58 -/* f11ba0c: 11a00066 */ beqz $t5,.L0f11bba8 -/* f11ba10: 00112600 */ sll $a0,$s1,0x18 -.L0f11ba14: -/* f11ba14: 00047603 */ sra $t6,$a0,0x18 -/* f11ba18: 0fc45974 */ jal pakGetBlockSize -/* f11ba1c: 01c02025 */ or $a0,$t6,$zero -/* f11ba20: 0202001b */ divu $zero,$s0,$v0 -/* f11ba24: 00112600 */ sll $a0,$s1,0x18 -/* f11ba28: 00009010 */ mfhi $s2 -/* f11ba2c: 00047e03 */ sra $t7,$a0,0x18 -/* f11ba30: 14400002 */ bnez $v0,.L0f11ba3c -/* f11ba34: 00000000 */ sll $zero,$zero,0x0 -/* f11ba38: 0007000d */ break 0x7 -.L0f11ba3c: -/* f11ba3c: 01e02025 */ or $a0,$t7,$zero -/* f11ba40: 0fc45974 */ jal pakGetBlockSize -/* f11ba44: 00000000 */ sll $zero,$zero,0x0 -/* f11ba48: 0202001b */ divu $zero,$s0,$v0 -/* f11ba4c: 00001812 */ mflo $v1 -/* f11ba50: 00112600 */ sll $a0,$s1,0x18 -/* f11ba54: 14400002 */ bnez $v0,.L0f11ba60 -/* f11ba58: 00000000 */ sll $zero,$zero,0x0 -/* f11ba5c: 0007000d */ break 0x7 -.L0f11ba60: -/* f11ba60: 0004c603 */ sra $t8,$a0,0x18 -/* f11ba64: 16400044 */ bnez $s2,.L0f11bb78 -/* f11ba68: 0011c880 */ sll $t9,$s1,0x2 -/* f11ba6c: 0331c823 */ subu $t9,$t9,$s1 -/* f11ba70: 0019c880 */ sll $t9,$t9,0x2 -/* f11ba74: 0331c823 */ subu $t9,$t9,$s1 -/* f11ba78: 0019c880 */ sll $t9,$t9,0x2 -/* f11ba7c: 0331c821 */ addu $t9,$t9,$s1 -/* f11ba80: 0019c880 */ sll $t9,$t9,0x2 -/* f11ba84: 0331c823 */ subu $t9,$t9,$s1 -/* f11ba88: 3c09800a */ lui $t1,%hi(g_Paks) -/* f11ba8c: 25292380 */ addiu $t1,$t1,%lo(g_Paks) -/* f11ba90: 0019c880 */ sll $t9,$t9,0x2 -/* f11ba94: 03299821 */ addu $s3,$t9,$t1 -/* f11ba98: 03002025 */ or $a0,$t8,$zero -/* f11ba9c: 0fc45974 */ jal pakGetBlockSize -/* f11baa0: afa300d8 */ sw $v1,0xd8($sp) -/* f11baa4: 8fa300d8 */ lw $v1,0xd8($sp) -/* f11baa8: 00116080 */ sll $t4,$s1,0x2 -/* f11baac: 01916023 */ subu $t4,$t4,$s1 -/* f11bab0: 00430019 */ multu $v0,$v1 -/* f11bab4: 8fab0134 */ lw $t3,0x134($sp) -/* f11bab8: 000c6080 */ sll $t4,$t4,0x2 -/* f11babc: 00112600 */ sll $a0,$s1,0x18 -/* f11bac0: 00047603 */ sra $t6,$a0,0x18 -/* f11bac4: 01916021 */ addu $t4,$t4,$s1 -/* f11bac8: 24010004 */ addiu $at,$zero,0x4 -/* f11bacc: 3c0d800a */ lui $t5,%hi(g_Pfses) -/* f11bad0: 25ad3180 */ addiu $t5,$t5,%lo(g_Pfses) -/* f11bad4: 000c60c0 */ sll $t4,$t4,0x3 -/* f11bad8: 00005012 */ mflo $t2 -/* f11badc: 01c02025 */ or $a0,$t6,$zero -/* f11bae0: 16210003 */ bne $s1,$at,.L0f11baf0 -/* f11bae4: 014b4021 */ addu $t0,$t2,$t3 -/* f11bae8: 10000002 */ beqz $zero,.L0f11baf4 -/* f11baec: 00002825 */ or $a1,$zero,$zero -.L0f11baf0: -/* f11baf0: 018d2821 */ addu $a1,$t4,$t5 -.L0f11baf4: -/* f11baf4: afa50048 */ sw $a1,0x48($sp) -/* f11baf8: 0fc45974 */ jal pakGetBlockSize -/* f11bafc: afa80054 */ sw $t0,0x54($sp) -/* f11bb00: 8fa80054 */ lw $t0,0x54($sp) -/* f11bb04: 00112600 */ sll $a0,$s1,0x18 -/* f11bb08: 00047e03 */ sra $t7,$a0,0x18 -/* f11bb0c: 01e02025 */ or $a0,$t7,$zero -/* f11bb10: 8fa50048 */ lw $a1,0x48($sp) -/* f11bb14: 8e66029c */ lw $a2,0x29c($s3) -/* f11bb18: 00003825 */ or $a3,$zero,$zero -/* f11bb1c: afa20014 */ sw $v0,0x14($sp) -/* f11bb20: afb40018 */ sw $s4,0x18($sp) -/* f11bb24: 0fc46941 */ jal pakReadWriteBlock -/* f11bb28: afa80010 */ sw $t0,0x10($sp) -/* f11bb2c: 00112e00 */ sll $a1,$s1,0x18 -/* f11bb30: 0005c603 */ sra $t8,$a1,0x18 -/* f11bb34: 00409825 */ or $s3,$v0,$zero -/* f11bb38: 03002825 */ or $a1,$t8,$zero -/* f11bb3c: 00402025 */ or $a0,$v0,$zero -/* f11bb40: 24060001 */ addiu $a2,$zero,0x1 -/* f11bb44: 0fc470e7 */ jal pakHandleResult -/* f11bb48: 2407112a */ addiu $a3,$zero,_val7f11bb48 -/* f11bb4c: 5440000b */ bnezl $v0,.L0f11bb7c -/* f11bb50: 2e010010 */ sltiu $at,$s0,0x10 -/* f11bb54: 0c005451 */ jal joyEnableCyclicPolling -/* f11bb58: 00000000 */ sll $zero,$zero,0x0 -/* f11bb5c: 24010001 */ addiu $at,$zero,0x1 -/* f11bb60: 16610003 */ bne $s3,$at,.L0f11bb70 -/* f11bb64: 00000000 */ sll $zero,$zero,0x0 -/* f11bb68: 10000012 */ beqz $zero,.L0f11bbb4 -/* f11bb6c: 24020001 */ addiu $v0,$zero,0x1 -.L0f11bb70: -/* f11bb70: 10000010 */ beqz $zero,.L0f11bbb4 -/* f11bb74: 24020004 */ addiu $v0,$zero,0x4 -.L0f11bb78: -/* f11bb78: 2e010010 */ sltiu $at,$s0,0x10 -.L0f11bb7c: -/* f11bb7c: 54200007 */ bnezl $at,.L0f11bb9c -/* f11bb80: 8faa0104 */ lw $t2,0x104($sp) -/* f11bb84: 12a00004 */ beqz $s5,.L0f11bb98 -/* f11bb88: 0292c821 */ addu $t9,$s4,$s2 -/* f11bb8c: 93290000 */ lbu $t1,0x0($t9) -/* f11bb90: 26b50001 */ addiu $s5,$s5,0x1 -/* f11bb94: a2a9ffff */ sb $t1,-0x1($s5) -.L0f11bb98: -/* f11bb98: 8faa0104 */ lw $t2,0x104($sp) -.L0f11bb9c: -/* f11bb9c: 26100001 */ addiu $s0,$s0,0x1 -/* f11bba0: 560aff9c */ bnel $s0,$t2,.L0f11ba14 -/* f11bba4: 00112600 */ sll $a0,$s1,0x18 -.L0f11bba8: -/* f11bba8: 0c005451 */ jal joyEnableCyclicPolling -/* f11bbac: 00000000 */ sll $zero,$zero,0x0 -/* f11bbb0: 00001025 */ or $v0,$zero,$zero -.L0f11bbb4: -/* f11bbb4: 8fbf003c */ lw $ra,0x3c($sp) -.L0f11bbb8: -/* f11bbb8: 8fb00024 */ lw $s0,0x24($sp) -/* f11bbbc: 8fb10028 */ lw $s1,0x28($sp) -/* f11bbc0: 8fb2002c */ lw $s2,0x2c($sp) -/* f11bbc4: 8fb30030 */ lw $s3,0x30($sp) -/* f11bbc8: 8fb40034 */ lw $s4,0x34($sp) -/* f11bbcc: 8fb50038 */ lw $s5,0x38($sp) -/* f11bbd0: 03e00008 */ jr $ra -/* f11bbd4: 27bd0130 */ addiu $sp,$sp,0x130 -); -#else -GLOBAL_ASM( -glabel pak0f11b86c -/* f1157f8: 27bdfed0 */ addiu $sp,$sp,-304 -/* f1157fc: afb2002c */ sw $s2,0x2c($sp) -/* f115800: 8fb20140 */ lw $s2,0x140($sp) -/* f115804: afb10028 */ sw $s1,0x28($sp) -/* f115808: 00048e00 */ sll $s1,$a0,0x18 -/* f11580c: 00117603 */ sra $t6,$s1,0x18 -/* f115810: afb50038 */ sw $s5,0x38($sp) -/* f115814: afb30030 */ sw $s3,0x30($sp) -/* f115818: 2401ffff */ addiu $at,$zero,-1 -/* f11581c: 00e09825 */ or $s3,$a3,$zero -/* f115820: 00c0a825 */ or $s5,$a2,$zero -/* f115824: 01c08825 */ or $s1,$t6,$zero -/* f115828: afbf003c */ sw $ra,0x3c($sp) -/* f11582c: afb40034 */ sw $s4,0x34($sp) -/* f115830: afb00024 */ sw $s0,0x24($sp) -/* f115834: afa40130 */ sw $a0,0x130($sp) -/* f115838: 16410004 */ bne $s2,$at,.NB0f11584c -/* f11583c: afa50134 */ sw $a1,0x134($sp) -/* f115840: 24140001 */ addiu $s4,$zero,0x1 -/* f115844: 10000002 */ beqz $zero,.NB0f115850 -/* f115848: 00009025 */ or $s2,$zero,$zero -.NB0f11584c: -/* f11584c: 0000a025 */ or $s4,$zero,$zero -.NB0f115850: -/* f115850: 00112600 */ sll $a0,$s1,0x18 -/* f115854: 00047e03 */ sra $t7,$a0,0x18 -/* f115858: 0fc4428c */ jal pakGetBlockSize -/* f11585c: 01e02025 */ or $a0,$t7,$zero -/* f115860: 0012802b */ sltu $s0,$zero,$s2 -/* f115864: 12000008 */ beqz $s0,.NB0f115888 -/* f115868: 00112600 */ sll $a0,$s1,0x18 -/* f11586c: 0015802b */ sltu $s0,$zero,$s5 -/* f115870: 12000005 */ beqz $s0,.NB0f115888 -/* f115874: 26580010 */ addiu $t8,$s2,0x10 -/* f115878: 0058802b */ sltu $s0,$v0,$t8 -/* f11587c: 3a100001 */ xori $s0,$s0,0x1 -/* f115880: 0010c82b */ sltu $t9,$zero,$s0 -/* f115884: 03208025 */ or $s0,$t9,$zero -.NB0f115888: -/* f115888: 16600002 */ bnez $s3,.NB0f115894 -/* f11588c: 00044e03 */ sra $t1,$a0,0x18 -/* f115890: 27b30120 */ addiu $s3,$sp,0x120 -.NB0f115894: -/* f115894: 01202025 */ or $a0,$t1,$zero -/* f115898: 8fa50134 */ lw $a1,0x134($sp) -/* f11589c: 0fc4461f */ jal pakReadHeaderAtOffset -/* f1158a0: 02603025 */ or $a2,$s3,$zero -/* f1158a4: 50400004 */ beqzl $v0,.NB0f1158b8 -/* f1158a8: 8e6a000c */ lw $t2,0xc($s3) -/* f1158ac: 100000a3 */ beqz $zero,.NB0f115b3c -/* f1158b0: 8fbf003c */ lw $ra,0x3c($sp) -/* f1158b4: 8e6a000c */ lw $t2,0xc($s3) -.NB0f1158b8: -/* f1158b8: 000a6740 */ sll $t4,$t2,0x1d -/* f1158bc: 05800003 */ bltz $t4,.NB0f1158cc -/* f1158c0: 00000000 */ sll $zero,$zero,0x0 -/* f1158c4: 1000009c */ beqz $zero,.NB0f115b38 -/* f1158c8: 2402000a */ addiu $v0,$zero,0xa -.NB0f1158cc: -/* f1158cc: 12000014 */ beqz $s0,.NB0f115920 -/* f1158d0: 00112600 */ sll $a0,$s1,0x18 -/* f1158d4: 00046e03 */ sra $t5,$a0,0x18 -/* f1158d8: 01a02025 */ or $a0,$t5,$zero -/* f1158dc: 8fa50134 */ lw $a1,0x134($sp) -/* f1158e0: 0fc445e5 */ jal pakRetrieveBlockFromCache -/* f1158e4: 27a600e4 */ addiu $a2,$sp,0xe4 -/* f1158e8: 5040000e */ beqzl $v0,.NB0f115924 -/* f1158ec: 8e650008 */ lw $a1,0x8($s3) -/* f1158f0: 12400009 */ beqz $s2,.NB0f115918 -/* f1158f4: 00008025 */ or $s0,$zero,$zero -/* f1158f8: 02a01025 */ or $v0,$s5,$zero -/* f1158fc: 27a300e4 */ addiu $v1,$sp,0xe4 -.NB0f115900: -/* f115900: 906e0010 */ lbu $t6,0x10($v1) -/* f115904: 26100001 */ addiu $s0,$s0,0x1 -/* f115908: 24420001 */ addiu $v0,$v0,0x1 -/* f11590c: 24630001 */ addiu $v1,$v1,0x1 -/* f115910: 1612fffb */ bne $s0,$s2,.NB0f115900 -/* f115914: a04effff */ sb $t6,-0x1($v0) -.NB0f115918: -/* f115918: 10000087 */ beqz $zero,.NB0f115b38 -/* f11591c: 00001025 */ or $v0,$zero,$zero -.NB0f115920: -/* f115920: 8e650008 */ lw $a1,0x8($s3) -.NB0f115924: -/* f115924: 00112600 */ sll $a0,$s1,0x18 -/* f115928: 0004ce03 */ sra $t9,$a0,0x18 -/* f11592c: 00057a40 */ sll $t7,$a1,0x9 -/* f115930: 000f2d42 */ srl $a1,$t7,0x15 -/* f115934: 16450002 */ bne $s2,$a1,.NB0f115940 -/* f115938: 00000000 */ sll $zero,$zero,0x0 -/* f11593c: 00009025 */ or $s2,$zero,$zero -.NB0f115940: -/* f115940: 0fc442ae */ jal pakGetAlignedFileLenByBodyLen -/* f115944: 03202025 */ or $a0,$t9,$zero -/* f115948: 16400005 */ bnez $s2,.NB0f115960 -/* f11594c: 24040fa8 */ addiu $a0,$zero,0xfa8 -/* f115950: 8e700008 */ lw $s0,0x8($s3) -/* f115954: 00104a40 */ sll $t1,$s0,0x9 -/* f115958: 10000002 */ beqz $zero,.NB0f115964 -/* f11595c: 00098542 */ srl $s0,$t1,0x15 -.NB0f115960: -/* f115960: 02408025 */ or $s0,$s2,$zero -.NB0f115964: -/* f115964: 12800002 */ beqz $s4,.NB0f115970 -/* f115968: 26030010 */ addiu $v1,$s0,0x10 -/* f11596c: 00401825 */ or $v1,$v0,$zero -.NB0f115970: -/* f115970: 3c057f1b */ lui $a1,0x7f1b -/* f115974: 24a5e544 */ addiu $a1,$a1,-6844 -/* f115978: 0c00581b */ jal joyDisableCyclicPolling -/* f11597c: afa30108 */ sw $v1,0x108($sp) -/* f115980: 8fab0108 */ lw $t3,0x108($sp) -/* f115984: 00008025 */ or $s0,$zero,$zero -/* f115988: 27b4005c */ addiu $s4,$sp,0x5c -/* f11598c: 11600065 */ beqz $t3,.NB0f115b24 -/* f115990: 00112600 */ sll $a0,$s1,0x18 -.NB0f115994: -/* f115994: 00046603 */ sra $t4,$a0,0x18 -/* f115998: 0fc4428c */ jal pakGetBlockSize -/* f11599c: 01802025 */ or $a0,$t4,$zero -/* f1159a0: 0202001b */ divu $zero,$s0,$v0 -/* f1159a4: 00112600 */ sll $a0,$s1,0x18 -/* f1159a8: 00009010 */ mfhi $s2 -/* f1159ac: 00046e03 */ sra $t5,$a0,0x18 -/* f1159b0: 14400002 */ bnez $v0,.NB0f1159bc -/* f1159b4: 00000000 */ sll $zero,$zero,0x0 -/* f1159b8: 0007000d */ break 0x7 -.NB0f1159bc: -/* f1159bc: 01a02025 */ or $a0,$t5,$zero -/* f1159c0: 0fc4428c */ jal pakGetBlockSize -/* f1159c4: 00000000 */ sll $zero,$zero,0x0 -/* f1159c8: 0202001b */ divu $zero,$s0,$v0 -/* f1159cc: 00001812 */ mflo $v1 -/* f1159d0: 00112600 */ sll $a0,$s1,0x18 -/* f1159d4: 14400002 */ bnez $v0,.NB0f1159e0 -/* f1159d8: 00000000 */ sll $zero,$zero,0x0 -/* f1159dc: 0007000d */ break 0x7 -.NB0f1159e0: -/* f1159e0: 00047603 */ sra $t6,$a0,0x18 -/* f1159e4: 16400043 */ bnez $s2,.NB0f115af4 -/* f1159e8: 00117880 */ sll $t7,$s1,0x2 -/* f1159ec: 01f17823 */ subu $t7,$t7,$s1 -/* f1159f0: 000f7880 */ sll $t7,$t7,0x2 -/* f1159f4: 01f17823 */ subu $t7,$t7,$s1 -/* f1159f8: 000f78c0 */ sll $t7,$t7,0x3 -/* f1159fc: 01f17821 */ addu $t7,$t7,$s1 -/* f115a00: 3c18800a */ lui $t8,0x800a -/* f115a04: 27186870 */ addiu $t8,$t8,0x6870 -/* f115a08: 000f78c0 */ sll $t7,$t7,0x3 -/* f115a0c: 01f89821 */ addu $s3,$t7,$t8 -/* f115a10: 01c02025 */ or $a0,$t6,$zero -/* f115a14: 0fc4428c */ jal pakGetBlockSize -/* f115a18: afa300dc */ sw $v1,0xdc($sp) -/* f115a1c: 8fa300dc */ lw $v1,0xdc($sp) -/* f115a20: 00115080 */ sll $t2,$s1,0x2 -/* f115a24: 01515023 */ subu $t2,$t2,$s1 -/* f115a28: 00430019 */ multu $v0,$v1 -/* f115a2c: 8fa90134 */ lw $t1,0x134($sp) -/* f115a30: 000a5080 */ sll $t2,$t2,0x2 -/* f115a34: 00112600 */ sll $a0,$s1,0x18 -/* f115a38: 00046603 */ sra $t4,$a0,0x18 -/* f115a3c: 01515021 */ addu $t2,$t2,$s1 -/* f115a40: 24010004 */ addiu $at,$zero,0x4 -/* f115a44: 3c0b800a */ lui $t3,0x800a -/* f115a48: 256b7658 */ addiu $t3,$t3,0x7658 -/* f115a4c: 000a50c0 */ sll $t2,$t2,0x3 -/* f115a50: 0000c812 */ mflo $t9 -/* f115a54: 01802025 */ or $a0,$t4,$zero -/* f115a58: 16210003 */ bne $s1,$at,.NB0f115a68 -/* f115a5c: 03294021 */ addu $t0,$t9,$t1 -/* f115a60: 10000002 */ beqz $zero,.NB0f115a6c -/* f115a64: 00002825 */ or $a1,$zero,$zero -.NB0f115a68: -/* f115a68: 014b2821 */ addu $a1,$t2,$t3 -.NB0f115a6c: -/* f115a6c: afa5004c */ sw $a1,0x4c($sp) -/* f115a70: 0fc4428c */ jal pakGetBlockSize -/* f115a74: afa80058 */ sw $t0,0x58($sp) -/* f115a78: 8fa80058 */ lw $t0,0x58($sp) -/* f115a7c: 00112600 */ sll $a0,$s1,0x18 -/* f115a80: 00046e03 */ sra $t5,$a0,0x18 -/* f115a84: 01a02025 */ or $a0,$t5,$zero -/* f115a88: 8fa5004c */ lw $a1,0x4c($sp) -/* f115a8c: 8e66029c */ lw $a2,0x29c($s3) -/* f115a90: 00003825 */ or $a3,$zero,$zero -/* f115a94: afa20014 */ sw $v0,0x14($sp) -/* f115a98: afb40018 */ sw $s4,0x18($sp) -/* f115a9c: 0fc450ea */ jal pakReadWriteBlock -/* f115aa0: afa80010 */ sw $t0,0x10($sp) -/* f115aa4: 00112e00 */ sll $a1,$s1,0x18 -/* f115aa8: 00057603 */ sra $t6,$a1,0x18 -/* f115aac: 00409825 */ or $s3,$v0,$zero -/* f115ab0: 01c02825 */ or $a1,$t6,$zero -/* f115ab4: 00402025 */ or $a0,$v0,$zero -/* f115ab8: 24060001 */ addiu $a2,$zero,0x1 -/* f115abc: 0fc458cb */ jal pakHandleResult -/* f115ac0: 24070fbd */ addiu $a3,$zero,0xfbd -/* f115ac4: 1440000b */ bnez $v0,.NB0f115af4 -/* f115ac8: 3c057f1b */ lui $a1,0x7f1b -/* f115acc: 24a5e54c */ addiu $a1,$a1,-6836 -/* f115ad0: 0c005834 */ jal joyEnableCyclicPolling -/* f115ad4: 24040fc0 */ addiu $a0,$zero,0xfc0 -/* f115ad8: 24010001 */ addiu $at,$zero,0x1 -/* f115adc: 16610003 */ bne $s3,$at,.NB0f115aec -/* f115ae0: 00000000 */ sll $zero,$zero,0x0 -/* f115ae4: 10000014 */ beqz $zero,.NB0f115b38 -/* f115ae8: 24020001 */ addiu $v0,$zero,0x1 -.NB0f115aec: -/* f115aec: 10000012 */ beqz $zero,.NB0f115b38 -/* f115af0: 24020004 */ addiu $v0,$zero,0x4 -.NB0f115af4: -/* f115af4: 2e010010 */ sltiu $at,$s0,0x10 -/* f115af8: 54200007 */ bnezl $at,.NB0f115b18 -/* f115afc: 8fb90108 */ lw $t9,0x108($sp) -/* f115b00: 12a00004 */ beqz $s5,.NB0f115b14 -/* f115b04: 02927821 */ addu $t7,$s4,$s2 -/* f115b08: 91f80000 */ lbu $t8,0x0($t7) -/* f115b0c: 26b50001 */ addiu $s5,$s5,0x1 -/* f115b10: a2b8ffff */ sb $t8,-0x1($s5) -.NB0f115b14: -/* f115b14: 8fb90108 */ lw $t9,0x108($sp) -.NB0f115b18: -/* f115b18: 26100001 */ addiu $s0,$s0,0x1 -/* f115b1c: 5619ff9d */ bnel $s0,$t9,.NB0f115994 -/* f115b20: 00112600 */ sll $a0,$s1,0x18 -.NB0f115b24: -/* f115b24: 3c057f1b */ lui $a1,0x7f1b -/* f115b28: 24a5e554 */ addiu $a1,$a1,-6828 -/* f115b2c: 0c005834 */ jal joyEnableCyclicPolling -/* f115b30: 24040fd6 */ addiu $a0,$zero,0xfd6 -/* f115b34: 00001025 */ or $v0,$zero,$zero -.NB0f115b38: -/* f115b38: 8fbf003c */ lw $ra,0x3c($sp) -.NB0f115b3c: -/* f115b3c: 8fb00024 */ lw $s0,0x24($sp) -/* f115b40: 8fb10028 */ lw $s1,0x28($sp) -/* f115b44: 8fb2002c */ lw $s2,0x2c($sp) -/* f115b48: 8fb30030 */ lw $s3,0x30($sp) -/* f115b4c: 8fb40034 */ lw $s4,0x34($sp) -/* f115b50: 8fb50038 */ lw $s5,0x38($sp) -/* f115b54: 03e00008 */ jr $ra -/* f115b58: 27bd0130 */ addiu $sp,$sp,0x130 -); + s32 negativebodylen2; #endif + bool negativebodylen; + s32 ret; + bool isoneblock; + u32 i; + u32 filelen; + u32 blocksize; + u32 alignedfilelen; + u32 stack[3]; + u8 buffer[16]; + s32 offsetinblock; + s32 blocknum; + u8 sp58[128]; + +#if VERSION >= VERSION_NTSC_1_0 + if (bodylen == -1) { + negativebodylen = true; + negativebodylen2 = true; + bodylen = 0; + } else { + negativebodylen = false; + negativebodylen2 = false; + } +#else + if (bodylen == -1) { + negativebodylen = true; + bodylen = 0; + } else { + negativebodylen = false; + } +#endif + + blocksize = pakGetBlockSize(device); + isoneblock = bodylen && data && (bool)(bodylen + sizeof(struct pakfileheader) <= blocksize); + + if (header == NULL) { + header = &headerstack; + } + + ret = pakReadHeaderAtOffset(device, offset, header); + + if (ret != 0) { + return ret; + } + +#if VERSION >= VERSION_NTSC_1_0 + if (!negativebodylen2 && !header->occupied) { + return 10; + } +#else + if (!header->occupied) { + return 10; + } +#endif + + if (isoneblock) { + if (pakRetrieveBlockFromCache(device, offset, buffer)) { + for (i = 0; i < bodylen; i++) { + data[i] = buffer[sizeof(struct pakfileheader) + i]; + } + + return 0; + } + } + + if (bodylen == header->bodylen) { + bodylen = 0; + } + + alignedfilelen = pakGetAlignedFileLenByBodyLen(device, header->bodylen); + + filelen = (bodylen == 0 ? header->bodylen : bodylen) + sizeof(struct pakfileheader); + + if (negativebodylen) { + filelen = alignedfilelen; + } + +#if VERSION >= VERSION_NTSC_1_0 + joyDisableCyclicPolling(); +#else + joyDisableCyclicPolling(4008, "pak.c"); +#endif + + for (i = 0; i != filelen; i++) { + offsetinblock = i % pakGetBlockSize(device); + blocknum = i / pakGetBlockSize(device); + + if (offsetinblock == 0) { + s32 absoluteoffset = pakGetBlockSize(device) * blocknum + offset; + s32 ret; + + ret = pakReadWriteBlock(device, PFS(device), g_Paks[device].noteindex, OS_READ, absoluteoffset, pakGetBlockSize(device), sp58); + +#if VERSION >= VERSION_PAL_FINAL + if (!pakHandleResult(ret, device, true, 4401)) +#elif VERSION >= VERSION_NTSC_FINAL + if (!pakHandleResult(ret, device, true, 4394)) +#elif VERSION >= VERSION_NTSC_1_0 + if (!pakHandleResult(ret, device, true, 4199)) +#else + if (!pakHandleResult(ret, device, true, 4029)) +#endif + { +#if VERSION >= VERSION_NTSC_1_0 + joyEnableCyclicPolling(); +#else + joyEnableCyclicPolling(4032, "pak.c"); +#endif + + if (ret == 1) { + return 1; + } + + return 4; + } + } + + if (i >= 0x10 && data != NULL) { + *data = sp58[offsetinblock]; + data++; + } + } + +#if VERSION >= VERSION_NTSC_1_0 + joyEnableCyclicPolling(); +#else + joyEnableCyclicPolling(4054, "pak.c"); +#endif + + return 0; +} bool pakReplaceFileAtOffsetWithBlank(s8 device, u32 offset) { diff --git a/src/include/game/pak/pak.h b/src/include/game/pak/pak.h index ccd2f0883..d81732303 100644 --- a/src/include/game/pak/pak.h +++ b/src/include/game/pak/pak.h @@ -6,7 +6,7 @@ u32 pakGetBlockSize(s8 device); u32 pakAlign(s8 device, u32 size); -s32 pakGetAlignedFileLenByBodyLen(s8 device, s32 bodylen); +s32 pakGetAlignedFileLenByBodyLen(s8 device, u32 bodylen); u32 pakGetBodyLenByFileLen(u32 filelen); u32 pakGenerateSerial(s8 device); bool pakIsMemoryPak(s8 device); @@ -96,7 +96,7 @@ void pakSaveHeaderToCache(s8 device, s32 blocknum, struct pakfileheader *header) bool pakRetrieveHeaderFromCache(s8 device, s32 blocknum, struct pakfileheader *header); s32 pakCreateFilesystem(s8 device); bool pakGetFilesystemLength(s8 device, u32 *outlen); -s32 pak0f11b86c(s32 device, u32 uVar2, u8 *data, struct pakfileheader *header, s32 arg3); +s32 pak0f11b86c(s8 device, u32 offset, u8 *data, struct pakfileheader *header, s32 arg4); bool pakReplaceFileAtOffsetWithBlank(s8 device, u32 offset); s32 pakWriteFileAtOffset(s8 device, u32 offset, u32 filetype, u8 *newdata, s32 bodylen, s32 *outfileid, u8 *olddata, u32 fileid, u32 generation); bool pakRepair(s8 device);