From f3989d9e7443819c99c8493ffa03604244dc7ddc Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 25 Mar 2021 16:58:36 +1000 Subject: [PATCH] Decompile osPfsDeleteFile --- src/game/pak/pak.c | 2 +- src/include/lib/lib_4d480.h | 4 +- src/lib/lib_06550.c | 2 +- src/lib/lib_4d480.c | 196 +++++++++++------------------------- 4 files changed, 64 insertions(+), 140 deletions(-) diff --git a/src/game/pak/pak.c b/src/game/pak/pak.c index 10a852fb2..3434b7464 100644 --- a/src/game/pak/pak.c +++ b/src/game/pak/pak.c @@ -1742,7 +1742,7 @@ s32 func0f117d90(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, c u32 func0f117e00(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name) { if (pfs) { - return func0004d480(pfs, company_code, game_code, game_name, ext_name); + return osPfsDeleteFile(pfs, company_code, game_code, game_name, ext_name); } if (g_PakHasEeprom == 0) { diff --git a/src/include/lib/lib_4d480.h b/src/include/lib/lib_4d480.h index cd7e19526..1786a70cd 100644 --- a/src/include/lib/lib_4d480.h +++ b/src/include/lib/lib_4d480.h @@ -4,7 +4,7 @@ #include "data.h" #include "types.h" -u32 func0004d480(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name); -u32 func0004d658(void); +s32 osPfsDeleteFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name); +s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 initialPage, u8 bank, __OSInodeUnit* final_page); #endif diff --git a/src/lib/lib_06550.c b/src/lib/lib_06550.c index 40ab34975..92488c252 100644 --- a/src/lib/lib_06550.c +++ b/src/lib/lib_06550.c @@ -509,7 +509,7 @@ glabel func00006550 /* 6c30: 02802825 */ or $a1,$s4,$zero /* 6c34: 93a6005d */ lbu $a2,0x5d($sp) /* 6c38: 32c700ff */ andi $a3,$s6,0xff -/* 6c3c: 0c013596 */ jal func0004d658 +/* 6c3c: 0c013596 */ jal __osPfsReleasePages /* 6c40: afb00010 */ sw $s0,0x10($sp) /* 6c44: 10400003 */ beqz $v0,.L00006c54 /* 6c48: 02a02025 */ or $a0,$s5,$zero diff --git a/src/lib/lib_4d480.c b/src/lib/lib_4d480.c index d9ef86df7..4a7614f4a 100644 --- a/src/lib/lib_4d480.c +++ b/src/lib/lib_4d480.c @@ -7,144 +7,68 @@ #include "data.h" #include "types.h" -GLOBAL_ASM( -glabel func0004d480 -/* 4d480: 27bdfe90 */ addiu $sp,$sp,-368 -/* 4d484: afb20024 */ sw $s2,0x24($sp) -/* 4d488: afa50174 */ sw $a1,0x174($sp) -/* 4d48c: 30aeffff */ andi $t6,$a1,0xffff -/* 4d490: 01c02825 */ or $a1,$t6,$zero -/* 4d494: 00809025 */ or $s2,$a0,$zero -/* 4d498: afbf0034 */ sw $ra,0x34($sp) -/* 4d49c: afb50030 */ sw $s5,0x30($sp) -/* 4d4a0: afb4002c */ sw $s4,0x2c($sp) -/* 4d4a4: afb30028 */ sw $s3,0x28($sp) -/* 4d4a8: afb10020 */ sw $s1,0x20($sp) -/* 4d4ac: 11c00003 */ beqz $t6,.L0004d4bc -/* 4d4b0: afb0001c */ sw $s0,0x1c($sp) -/* 4d4b4: 14c00003 */ bnez $a2,.L0004d4c4 -/* 4d4b8: 02402025 */ or $a0,$s2,$zero -.L0004d4bc: -/* 4d4bc: 1000005d */ b .L0004d634 -/* 4d4c0: 24020005 */ addiu $v0,$zero,0x5 -.L0004d4c4: -/* 4d4c4: 8faf0180 */ lw $t7,0x180($sp) -/* 4d4c8: 27b8016c */ addiu $t8,$sp,0x16c -/* 4d4cc: afb80014 */ sw $t8,0x14($sp) -/* 4d4d0: 0c013304 */ jal osPfsFindFile -/* 4d4d4: afaf0010 */ sw $t7,0x10($sp) -/* 4d4d8: 50400004 */ beqzl $v0,.L0004d4ec -/* 4d4dc: 92590065 */ lbu $t9,0x65($s2) -/* 4d4e0: 10000055 */ b .L0004d638 -/* 4d4e4: 8fbf0034 */ lw $ra,0x34($sp) -/* 4d4e8: 92590065 */ lbu $t9,0x65($s2) -.L0004d4ec: -/* 4d4ec: 02402025 */ or $a0,$s2,$zero -/* 4d4f0: 53200008 */ beqzl $t9,.L0004d514 -/* 4d4f4: 8e48005c */ lw $t0,0x5c($s2) -/* 4d4f8: 0c013378 */ jal __osPfsSelectBank -/* 4d4fc: 00002825 */ or $a1,$zero,$zero -/* 4d500: 50400004 */ beqzl $v0,.L0004d514 -/* 4d504: 8e48005c */ lw $t0,0x5c($s2) -/* 4d508: 1000004b */ b .L0004d638 -/* 4d50c: 8fbf0034 */ lw $ra,0x34($sp) -/* 4d510: 8e48005c */ lw $t0,0x5c($s2) -.L0004d514: -/* 4d514: 8fa9016c */ lw $t1,0x16c($sp) -/* 4d518: 8e440004 */ lw $a0,0x4($s2) -/* 4d51c: 8e450008 */ lw $a1,0x8($s2) -/* 4d520: 01093021 */ addu $a2,$t0,$t1 -/* 4d524: 30caffff */ andi $t2,$a2,0xffff -/* 4d528: 01403025 */ or $a2,$t2,$zero -/* 4d52c: 0c012e18 */ jal __osContRamRead -/* 4d530: 27a70048 */ addiu $a3,$sp,0x48 -/* 4d534: 10400003 */ beqz $v0,.L0004d544 -/* 4d538: 93b0004e */ lbu $s0,0x4e($sp) -/* 4d53c: 1000003e */ b .L0004d638 -/* 4d540: 8fbf0034 */ lw $ra,0x34($sp) -.L0004d544: -/* 4d544: 92420064 */ lbu $v0,0x64($s2) -/* 4d548: 93b3004f */ lbu $s3,0x4f($sp) -/* 4d54c: 24150001 */ addiu $s5,$zero,0x1 -/* 4d550: 0202082a */ slt $at,$s0,$v0 -/* 4d554: 10200026 */ beqz $at,.L0004d5f0 -/* 4d558: 27b40044 */ addiu $s4,$sp,0x44 -/* 4d55c: 27b10068 */ addiu $s1,$sp,0x68 -/* 4d560: 02402025 */ or $a0,$s2,$zero -.L0004d564: -/* 4d564: 02202825 */ or $a1,$s1,$zero -/* 4d568: 00003025 */ or $a2,$zero,$zero -/* 4d56c: 0c01324d */ jal __osPfsRWInode -/* 4d570: 320700ff */ andi $a3,$s0,0xff -/* 4d574: 10400003 */ beqz $v0,.L0004d584 -/* 4d578: 02402025 */ or $a0,$s2,$zero -/* 4d57c: 1000002e */ b .L0004d638 -/* 4d580: 8fbf0034 */ lw $ra,0x34($sp) -.L0004d584: -/* 4d584: 02202825 */ or $a1,$s1,$zero -/* 4d588: 326600ff */ andi $a2,$s3,0xff -/* 4d58c: 320700ff */ andi $a3,$s0,0xff -/* 4d590: 0c013596 */ jal func0004d658 -/* 4d594: afb40010 */ sw $s4,0x10($sp) -/* 4d598: 10400003 */ beqz $v0,.L0004d5a8 -/* 4d59c: 02402025 */ or $a0,$s2,$zero -/* 4d5a0: 10000025 */ b .L0004d638 -/* 4d5a4: 8fbf0034 */ lw $ra,0x34($sp) -.L0004d5a8: -/* 4d5a8: 02202825 */ or $a1,$s1,$zero -/* 4d5ac: 24060001 */ addiu $a2,$zero,0x1 -/* 4d5b0: 0c01324d */ jal __osPfsRWInode -/* 4d5b4: 320700ff */ andi $a3,$s0,0xff -/* 4d5b8: 10400003 */ beqz $v0,.L0004d5c8 -/* 4d5bc: 97ac0044 */ lhu $t4,0x44($sp) -/* 4d5c0: 1000001d */ b .L0004d638 -/* 4d5c4: 8fbf0034 */ lw $ra,0x34($sp) -.L0004d5c8: -/* 4d5c8: 56ac0004 */ bnel $s5,$t4,.L0004d5dc -/* 4d5cc: 92420064 */ lbu $v0,0x64($s2) -/* 4d5d0: 10000007 */ b .L0004d5f0 -/* 4d5d4: 92420064 */ lbu $v0,0x64($s2) -/* 4d5d8: 92420064 */ lbu $v0,0x64($s2) -.L0004d5dc: -/* 4d5dc: 93b00044 */ lbu $s0,0x44($sp) -/* 4d5e0: 93b30045 */ lbu $s3,0x45($sp) -/* 4d5e4: 0202082a */ slt $at,$s0,$v0 -/* 4d5e8: 5420ffde */ bnezl $at,.L0004d564 -/* 4d5ec: 02402025 */ or $a0,$s2,$zero -.L0004d5f0: -/* 4d5f0: 0202082a */ slt $at,$s0,$v0 -/* 4d5f4: 14200003 */ bnez $at,.L0004d604 -/* 4d5f8: 27a40048 */ addiu $a0,$sp,0x48 -/* 4d5fc: 1000000d */ b .L0004d634 -/* 4d600: 24020003 */ addiu $v0,$zero,0x3 -.L0004d604: -/* 4d604: 0c012c30 */ jal bzero -/* 4d608: 24050020 */ addiu $a1,$zero,0x20 -/* 4d60c: 8e4d005c */ lw $t5,0x5c($s2) -/* 4d610: 8fae016c */ lw $t6,0x16c($sp) -/* 4d614: 8e440004 */ lw $a0,0x4($s2) -/* 4d618: 8e450008 */ lw $a1,0x8($s2) -/* 4d61c: 01ae3021 */ addu $a2,$t5,$t6 -/* 4d620: 30cfffff */ andi $t7,$a2,0xffff -/* 4d624: 01e03025 */ or $a2,$t7,$zero -/* 4d628: afa00010 */ sw $zero,0x10($sp) -/* 4d62c: 0c012d84 */ jal __osContRamWrite -/* 4d630: 27a70048 */ addiu $a3,$sp,0x48 -.L0004d634: -/* 4d634: 8fbf0034 */ lw $ra,0x34($sp) -.L0004d638: -/* 4d638: 8fb0001c */ lw $s0,0x1c($sp) -/* 4d63c: 8fb10020 */ lw $s1,0x20($sp) -/* 4d640: 8fb20024 */ lw $s2,0x24($sp) -/* 4d644: 8fb30028 */ lw $s3,0x28($sp) -/* 4d648: 8fb4002c */ lw $s4,0x2c($sp) -/* 4d64c: 8fb50030 */ lw $s5,0x30($sp) -/* 4d650: 03e00008 */ jr $ra -/* 4d654: 27bd0170 */ addiu $sp,$sp,0x170 -); +s32 osPfsDeleteFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name) +{ + s32 file_no; + s32 ret; + __OSInode inode; + __OSDir dir; + __OSInodeUnit last_page; + u8 startpage; + u8 bank; + + if (company_code == 0 || game_code == 0) { + return PFS_ERR_INVALID; + } + + if ((ret = osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, &file_no)) != 0) { + return ret; + } + + if (pfs->activebank != 0 && (ret = __osPfsSelectBank(pfs, 0)) != 0) { + return ret; + } + + if ((ret = __osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir)) != 0) { + return ret; + } + + startpage = dir.start_page.inode_t.page; + + for (bank = dir.start_page.inode_t.bank; bank < pfs->banks;) { + if ((ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank)) != 0) { + return ret; + } + + if ((ret = __osPfsReleasePages(pfs, &inode, startpage, bank, &last_page)) != 0) { + return ret; + } + + if ((ret = __osPfsRWInode(pfs, &inode, PFS_WRITE, bank)) != 0) { + return ret; + } + + if (last_page.ipage == 1) { + break; + } + + bank = last_page.inode_t.bank; + startpage = last_page.inode_t.page; + } + + if (bank >= pfs->banks) { + return PFS_ERR_INCONSISTENT; + } + + bzero(&dir, sizeof(__OSDir)); + + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir, 0); + + return ret; +} GLOBAL_ASM( -glabel func0004d658 +glabel __osPfsReleasePages /* 4d658: 27bdfff0 */ addiu $sp,$sp,-16 /* 4d65c: 30e200ff */ andi $v0,$a3,0xff /* 4d660: 30ce00ff */ andi $t6,$a2,0xff