diff --git a/ld/libfiles.ntsc-beta.inc b/ld/libfiles.ntsc-beta.inc index cf787e83b..052d7bc33 100644 --- a/ld/libfiles.ntsc-beta.inc +++ b/ld/libfiles.ntsc-beta.inc @@ -167,7 +167,7 @@ build/ROMID/lib/ultra/io/pfsselectbank.o (section); \ build/ROMID/lib/ultra/io/pfsfreeblocks.o (section); \ build/ROMID/lib/ultra/io/pfsallocatefile.o (section); \ - build/ROMID/lib/lib_4d480.o (section); \ + build/ROMID/lib/ultra/io/pfsdeletefile.o (section); \ build/ROMID/lib/ultra/io/siacs.o (section); \ build/ROMID/lib/ultra/io/pfschecker.o (section); \ build/ROMID/lib/lib_4e090.o (section); \ diff --git a/ld/libfiles.ntsc-final.inc b/ld/libfiles.ntsc-final.inc index 2cc27b285..cf55e24f0 100644 --- a/ld/libfiles.ntsc-final.inc +++ b/ld/libfiles.ntsc-final.inc @@ -166,7 +166,7 @@ build/ROMID/lib/ultra/io/pfsselectbank.o (section); \ build/ROMID/lib/ultra/io/pfsfreeblocks.o (section); \ build/ROMID/lib/ultra/io/pfsallocatefile.o (section); \ - build/ROMID/lib/lib_4d480.o (section); \ + build/ROMID/lib/ultra/io/pfsdeletefile.o (section); \ build/ROMID/lib/ultra/io/pfschecker.o (section); \ build/ROMID/lib/lib_4e090.o (section); \ build/ROMID/lib/ultra/os/maptlb.o (section); \ diff --git a/ld/libfiles.pal-final.inc b/ld/libfiles.pal-final.inc index 35551f512..b2c5c5719 100644 --- a/ld/libfiles.pal-final.inc +++ b/ld/libfiles.pal-final.inc @@ -165,7 +165,7 @@ build/ROMID/lib/ultra/io/pfsselectbank.o (section); \ build/ROMID/lib/ultra/io/pfsfreeblocks.o (section); \ build/ROMID/lib/ultra/io/pfsallocatefile.o (section); \ - build/ROMID/lib/lib_4d480.o (section); \ + build/ROMID/lib/ultra/io/pfsdeletefile.o (section); \ build/ROMID/lib/ultra/io/pfschecker.o (section); \ build/ROMID/lib/lib_4e090.o (section); \ build/ROMID/lib/ultra/os/maptlb.o (section); \ diff --git a/src/game/pak/pak.c b/src/game/pak/pak.c index 3434b7464..8c11bfe4c 100644 --- a/src/game/pak/pak.c +++ b/src/game/pak/pak.c @@ -15,7 +15,6 @@ #include "lib/main.h" #include "lib/memory.h" #include "lib/rng.h" -#include "lib/lib_4d480.h" #include "lib/lib_4e090.h" #include "lib/lib_4f5e0.h" #include "lib/lib_50480.h" diff --git a/src/include/PR/os_pfs.h b/src/include/PR/os_pfs.h index 9e557a69b..ff8bc8092 100644 --- a/src/include/PR/os_pfs.h +++ b/src/include/PR/os_pfs.h @@ -153,6 +153,7 @@ typedef struct { extern s32 osPfsIsPlug(OSMesgQueue *, u8 *); s32 osPfsAllocateFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 num_bytes, s32 *file_no); s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 *file_no); +s32 osPfsDeleteFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name); #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ diff --git a/src/include/lib/lib_4d480.h b/src/include/lib/lib_4d480.h deleted file mode 100644 index 1786a70cd..000000000 --- a/src/include/lib/lib_4d480.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _IN_LIB_LIB_4D480_H -#define _IN_LIB_LIB_4D480_H -#include -#include "data.h" -#include "types.h" - -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/include/libultra_internal.h b/src/include/libultra_internal.h index ee65f7b01..6878874d8 100644 --- a/src/include/libultra_internal.h +++ b/src/include/libultra_internal.h @@ -67,5 +67,6 @@ s32 __osCheckId(OSPfs *pfs); s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank); u8 __osContAddressCrc(u16 inaddr); u8 __osContDataCrc(u8 *data); +s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 initial_page, u8 bank, __OSInodeUnit *final_page); #endif diff --git a/src/lib/lib_06550.c b/src/lib/lib_06550.c index 92488c252..542328cb6 100644 --- a/src/lib/lib_06550.c +++ b/src/lib/lib_06550.c @@ -4,7 +4,6 @@ #include "bss.h" #include "lib/lib_06550.h" #include "lib/lib_4b170.h" -#include "lib/lib_4d480.h" #include "lib/lib_4e090.h" #include "data.h" #include "types.h" diff --git a/src/lib/lib_4d480.c b/src/lib/lib_4d480.c deleted file mode 100644 index 4a7614f4a..000000000 --- a/src/lib/lib_4d480.c +++ /dev/null @@ -1,110 +0,0 @@ -#include -#include "libultra_internal.h" -#include "constants.h" -#include "bss.h" -#include "lib/libc/ll.h" -#include "lib/lib_4d480.h" -#include "data.h" -#include "types.h" - -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 __osPfsReleasePages -/* 4d658: 27bdfff0 */ addiu $sp,$sp,-16 -/* 4d65c: 30e200ff */ andi $v0,$a3,0xff -/* 4d660: 30ce00ff */ andi $t6,$a2,0xff -/* 4d664: 0002c200 */ sll $t8,$v0,0x8 -/* 4d668: afa60018 */ sw $a2,0x18($sp) -/* 4d66c: afa7001c */ sw $a3,0x1c($sp) -/* 4d670: 030ec821 */ addu $t9,$t8,$t6 -/* 4d674: a7b9000c */ sh $t9,0xc($sp) -/* 4d678: 24070003 */ addiu $a3,$zero,0x3 -/* 4d67c: 27a6000c */ addiu $a2,$sp,0xc -/* 4d680: 27a30008 */ addiu $v1,$sp,0x8 -/* 4d684: 94c10000 */ lhu $at,0x0($a2) -.L0004d688: -/* 4d688: a4610000 */ sh $at,0x0($v1) -/* 4d68c: 93ab000d */ lbu $t3,0xd($sp) -/* 4d690: 000b6040 */ sll $t4,$t3,0x1 -/* 4d694: 00ac6821 */ addu $t5,$a1,$t4 -/* 4d698: 95a10000 */ lhu $at,0x0($t5) -/* 4d69c: a4c10000 */ sh $at,0x0($a2) -/* 4d6a0: 93b90009 */ lbu $t9,0x9($sp) -/* 4d6a4: 00194840 */ sll $t1,$t9,0x1 -/* 4d6a8: 00a94021 */ addu $t0,$a1,$t1 -/* 4d6ac: a5070000 */ sh $a3,0x0($t0) -/* 4d6b0: 8c8b0060 */ lw $t3,0x60($a0) -/* 4d6b4: 97aa000c */ lhu $t2,0xc($sp) -/* 4d6b8: 93ac000c */ lbu $t4,0xc($sp) -/* 4d6bc: 014b082a */ slt $at,$t2,$t3 -/* 4d6c0: 54200004 */ bnezl $at,.L0004d6d4 -/* 4d6c4: 8faf0020 */ lw $t7,0x20($sp) -/* 4d6c8: 504cffef */ beql $v0,$t4,.L0004d688 -/* 4d6cc: 94c10000 */ lhu $at,0x0($a2) -/* 4d6d0: 8faf0020 */ lw $t7,0x20($sp) -.L0004d6d4: -/* 4d6d4: 94c10000 */ lhu $at,0x0($a2) -/* 4d6d8: 27bd0010 */ addiu $sp,$sp,0x10 -/* 4d6dc: 00001025 */ or $v0,$zero,$zero -/* 4d6e0: 03e00008 */ jr $ra -/* 4d6e4: a5e10000 */ sh $at,0x0($t7) -); diff --git a/src/lib/ultra/io/pfsdeletefile.c b/src/lib/ultra/io/pfsdeletefile.c new file mode 100644 index 000000000..11be40ff4 --- /dev/null +++ b/src/lib/ultra/io/pfsdeletefile.c @@ -0,0 +1,86 @@ +#include +#include "libultra_internal.h" +#include "constants.h" +#include "bss.h" +#include "lib/libc/ll.h" +#include "data.h" +#include "types.h" + +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; +} + +s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 initial_page, u8 bank, __OSInodeUnit *final_page) +{ + __OSInodeUnit next; + __OSInodeUnit prev; + s32 ret = 0; + + next.ipage = (u16)((bank << 8) + initial_page); + + do { + prev = next; + next = inode->inode_page[next.inode_t.page]; + inode->inode_page[prev.inode_t.page].ipage = PFS_PAGE_NOT_USED; + } while (next.ipage >= pfs->inode_start_page && next.inode_t.bank == bank); + + *final_page = next; + + return ret; +}