Decompile osPfsReleasePages
This commit is contained in:
parent
f3989d9e74
commit
116b6c3fff
|
|
@ -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); \
|
||||
|
|
|
|||
|
|
@ -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); \
|
||||
|
|
|
|||
|
|
@ -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); \
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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) */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
#ifndef _IN_LIB_LIB_4D480_H
|
||||
#define _IN_LIB_LIB_4D480_H
|
||||
#include <ultra64.h>
|
||||
#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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -1,110 +0,0 @@
|
|||
#include <ultra64.h>
|
||||
#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)
|
||||
);
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
#include <ultra64.h>
|
||||
#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;
|
||||
}
|
||||
Loading…
Reference in New Issue