diff --git a/src/game/pak/pak.c b/src/game/pak/pak.c index 664007774..4da157e2a 100644 --- a/src/game/pak/pak.c +++ b/src/game/pak/pak.c @@ -1726,17 +1726,17 @@ s32 func0f117ce4(s32 arg0, s32 arg1, OSPfsState *note) const char var7f1b3c08[] = "Call to osPfsReSizeFile -> pfs=%x, cc=%u, gc=%u, gn=%s, en=%s, l=%d\n"; -u32 func0f117d90(u32 arg0, u16 arg1, u32 arg2, u32 arg3, u32 arg4, u32 arg5, u32 *arg6) +s32 func0f117d90(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 size, s32 *file_no) { - if (arg0) { - return func0004d000(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + if (pfs) { + return osPfsAllocateFile(pfs, company_code, game_code, game_name, ext_name, size, file_no); } if (g_PakHasEeprom == 0) { return 0x80; } - *arg6 = 0; + *file_no = 0; return 0; } @@ -1754,15 +1754,15 @@ u32 func0f117e00(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, c return 0; } -u32 func0f117e58(u32 arg0, u16 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *arg5) +s32 func0f117e58(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 *file_no) { - if (arg0) { - return func0004cc10(arg0, arg1, arg2, arg3, arg4, arg5); + if (pfs) { + return osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, file_no); } if (g_PakHasEeprom) { #if VERSION >= VERSION_NTSC_FINAL - *arg5 = 0; + *file_no = 0; return 0; #else u8 sp64[8]; @@ -1771,7 +1771,7 @@ u32 func0f117e58(u32 arg0, u16 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *arg5) u32 b; u16 sp44[4]; - *arg5 = 0; + *file_no = 0; a = func0f11a504(SAVEDEVICE_GAMEPAK, 0, 0, 0, 0, align16(0x10), (u8 *)sp56); if (func0f11c39c(a, SAVEDEVICE_GAMEPAK, 1, 0x60f)) { diff --git a/src/include/PR/os_cont.h b/src/include/PR/os_cont.h index 62d5a41c7..cfb83c290 100644 --- a/src/include/PR/os_cont.h +++ b/src/include/PR/os_cont.h @@ -139,8 +139,8 @@ typedef struct /* 0x8 */ u8 status; /* 0x9 */ s8 reserved; /* 0xA */ u16 data_sum; - /* 0xC */ u8 ext_name[16]; - /* 0x10 */ u8 game_name[4]; + /* 0xC */ u8 ext_name[4]; + /* 0x10 */ u8 game_name[16]; } __OSDir; typedef struct diff --git a/src/include/PR/os_pfs.h b/src/include/PR/os_pfs.h index 50e4c9313..a5382117e 100644 --- a/src/include/PR/os_pfs.h +++ b/src/include/PR/os_pfs.h @@ -100,6 +100,7 @@ typedef struct { #define PFS_LABEL_AREA 7 #define PFS_INODE_SIZE_PER_PAGE 128 #define PFS_PAGE_NOT_USED 3 +#define PFS_PAGE_SIZE (BLOCKSIZE * PFS_ONE_PAGE) #define PFS_READ 0 #define PFS_WRITE 1 diff --git a/src/include/game/pak/pak.h b/src/include/game/pak/pak.h index fc966fe44..46f0fff9e 100644 --- a/src/include/game/pak/pak.h +++ b/src/include/game/pak/pak.h @@ -52,9 +52,9 @@ s32 func0f117b4c(s32 arg0, s32 arg1, u8 operation, u32 address, u32 len, u8 *buf s32 func0f117c0c(s32 arg0, s32 *arg1, s32 *arg2); s32 func0f117c80(OSPfs *pfs, s32 *arg1); s32 func0f117ce4(s32 arg0, s32 arg1, OSPfsState *note); -u32 func0f117d90(u32 arg0, u16 arg1, u32 arg2, u32 arg3, u32 arg4, u32 arg5, u32 *arg6); +s32 func0f117d90(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 size, s32 *file_no); u32 func0f117e00(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name); -u32 func0f117e58(u32 arg0, u16 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *arg5); +s32 func0f117e58(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 *file_no); s32 func0f117ec0(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name, u32 numbytes); s32 func0f117f80(s8 device); s32 func0f117fc0(s8 device); diff --git a/src/include/lib/lib_4cc10.h b/src/include/lib/lib_4cc10.h index 9de011b25..129da6c1e 100644 --- a/src/include/lib/lib_4cc10.h +++ b/src/include/lib/lib_4cc10.h @@ -4,6 +4,6 @@ #include "data.h" #include "types.h" -u32 func0004cc10(u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *arg5); +s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 *file_no); #endif diff --git a/src/include/lib/lib_4d000.h b/src/include/lib/lib_4d000.h index 4cbf2b1ef..8603082df 100644 --- a/src/include/lib/lib_4d000.h +++ b/src/include/lib/lib_4d000.h @@ -4,7 +4,7 @@ #include "data.h" #include "types.h" -u32 func0004d000(u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 arg5, u32 *arg6); -u32 func0004d334(void); +s32 osPfsAllocateFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 num_bytes, s32 *file_no); +s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, s32 fileSizeInPages, s32 *startPage, u8 bank, s32 *decleared, s32 *finalPage); #endif diff --git a/src/lib/lib_06550.c b/src/lib/lib_06550.c index 216038ab7..4f430645f 100644 --- a/src/lib/lib_06550.c +++ b/src/lib/lib_06550.c @@ -67,7 +67,7 @@ glabel func00006550 /* 6608: 3205ffff */ andi $a1,$s0,0xffff /* 660c: 02403025 */ or $a2,$s2,$zero /* 6610: 02603825 */ or $a3,$s3,$zero -/* 6614: 0c013304 */ jal func0004cc10 +/* 6614: 0c013304 */ jal osPfsFindFile /* 6618: afb90010 */ sw $t9,0x10($sp) /* 661c: 10400005 */ beqz $v0,.L00006634 /* 6620: 24010005 */ addiu $at,$zero,0x5 @@ -253,7 +253,7 @@ glabel func00006550 /* 68a0: 02802825 */ or $a1,$s4,$zero /* 68a4: 02203025 */ or $a2,$s1,$zero /* 68a8: 02e03825 */ or $a3,$s7,$zero -/* 68ac: 0c0134cd */ jal func0004d334 +/* 68ac: 0c0134cd */ jal __osPfsDeclearPage /* 68b0: afb60010 */ sw $s6,0x10($sp) /* 68b4: 10400003 */ beqz $v0,.L000068c4 /* 68b8: 8fac02cc */ lw $t4,0x2cc($sp) diff --git a/src/lib/lib_4cc10.c b/src/lib/lib_4cc10.c index 178d5d3d7..5327b6806 100644 --- a/src/lib/lib_4cc10.c +++ b/src/lib/lib_4cc10.c @@ -6,7 +6,7 @@ #include "types.h" GLOBAL_ASM( -glabel func0004cc10 +glabel osPfsFindFile /* 4cc10: 27bdff88 */ addiu $sp,$sp,-120 /* 4cc14: afbf003c */ sw $ra,0x3c($sp) /* 4cc18: afbe0038 */ sw $s8,0x38($sp) diff --git a/src/lib/lib_4d000.c b/src/lib/lib_4d000.c index 124b84f66..0f699539d 100644 --- a/src/lib/lib_4d000.c +++ b/src/lib/lib_4d000.c @@ -8,242 +8,115 @@ #include "data.h" #include "types.h" -GLOBAL_ASM( -glabel func0004d000 -/* 4d000: 27bdfd68 */ addiu $sp,$sp,-664 -/* 4d004: afb70040 */ sw $s7,0x40($sp) -/* 4d008: afb6003c */ sw $s6,0x3c($sp) -/* 4d00c: afb50038 */ sw $s5,0x38($sp) -/* 4d010: afb30030 */ sw $s3,0x30($sp) -/* 4d014: afa5029c */ sw $a1,0x29c($sp) -/* 4d018: 30aeffff */ andi $t6,$a1,0xffff -/* 4d01c: 01c02825 */ or $a1,$t6,$zero -/* 4d020: 00809825 */ or $s3,$a0,$zero -/* 4d024: afbf0044 */ sw $ra,0x44($sp) -/* 4d028: afb40034 */ sw $s4,0x34($sp) -/* 4d02c: afb2002c */ sw $s2,0x2c($sp) -/* 4d030: afb10028 */ sw $s1,0x28($sp) -/* 4d034: afb00024 */ sw $s0,0x24($sp) -/* 4d038: afa702a4 */ sw $a3,0x2a4($sp) -/* 4d03c: 0000b025 */ or $s6,$zero,$zero -/* 4d040: 0000b825 */ or $s7,$zero,$zero -/* 4d044: 11c00003 */ beqz $t6,.L0004d054 -/* 4d048: 0000a825 */ or $s5,$zero,$zero -/* 4d04c: 14c00003 */ bnez $a2,.L0004d05c -/* 4d050: 8fb102ac */ lw $s1,0x2ac($sp) -.L0004d054: -/* 4d054: 100000ac */ b .L0004d308 -/* 4d058: 24020005 */ addiu $v0,$zero,0x5 -.L0004d05c: -/* 4d05c: 263000ff */ addiu $s0,$s1,0xff -/* 4d060: 8fb802a8 */ lw $t8,0x2a8($sp) -/* 4d064: 8fb902b0 */ lw $t9,0x2b0($sp) -/* 4d068: 06010003 */ bgez $s0,.L0004d078 -/* 4d06c: 00107a03 */ sra $t7,$s0,0x8 -/* 4d070: 260100ff */ addiu $at,$s0,0xff -/* 4d074: 00017a03 */ sra $t7,$at,0x8 -.L0004d078: -/* 4d078: 01e08025 */ or $s0,$t7,$zero -/* 4d07c: 01e0a025 */ or $s4,$t7,$zero -/* 4d080: 02602025 */ or $a0,$s3,$zero -/* 4d084: 8fa702a4 */ lw $a3,0x2a4($sp) -/* 4d088: a7a5029e */ sh $a1,0x29e($sp) -/* 4d08c: afa602a0 */ sw $a2,0x2a0($sp) -/* 4d090: afb80010 */ sw $t8,0x10($sp) -/* 4d094: 0c013304 */ jal func0004cc10 -/* 4d098: afb90014 */ sw $t9,0x14($sp) -/* 4d09c: 10400005 */ beqz $v0,.L0004d0b4 -/* 4d0a0: 24010005 */ addiu $at,$zero,0x5 -/* 4d0a4: 50410004 */ beql $v0,$at,.L0004d0b8 -/* 4d0a8: 8fa802b0 */ lw $t0,0x2b0($sp) -/* 4d0ac: 10000097 */ b .L0004d30c -/* 4d0b0: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d0b4: -/* 4d0b4: 8fa802b0 */ lw $t0,0x2b0($sp) -.L0004d0b8: -/* 4d0b8: 2401ffff */ addiu $at,$zero,-1 -/* 4d0bc: 02602025 */ or $a0,$s3,$zero -/* 4d0c0: 8d090000 */ lw $t1,0x0($t0) -/* 4d0c4: 11210003 */ beq $t1,$at,.L0004d0d4 -/* 4d0c8: 00000000 */ nop -/* 4d0cc: 1000008e */ b .L0004d308 -/* 4d0d0: 24020009 */ addiu $v0,$zero,0x9 -.L0004d0d4: -/* 4d0d4: 0c013398 */ jal osPfsFreeBlocks -/* 4d0d8: 27a50054 */ addiu $a1,$sp,0x54 -/* 4d0dc: 8faa0054 */ lw $t2,0x54($sp) -/* 4d0e0: 0151082a */ slt $at,$t2,$s1 -/* 4d0e4: 10200003 */ beqz $at,.L0004d0f4 -/* 4d0e8: 00000000 */ nop -/* 4d0ec: 10000086 */ b .L0004d308 -/* 4d0f0: 24020007 */ addiu $v0,$zero,0x7 -.L0004d0f4: -/* 4d0f4: 16000003 */ bnez $s0,.L0004d104 -/* 4d0f8: 02602025 */ or $a0,$s3,$zero -/* 4d0fc: 10000082 */ b .L0004d308 -/* 4d100: 24020005 */ addiu $v0,$zero,0x5 -.L0004d104: -/* 4d104: 8fab02b0 */ lw $t3,0x2b0($sp) -/* 4d108: 00002825 */ or $a1,$zero,$zero -/* 4d10c: 00003025 */ or $a2,$zero,$zero -/* 4d110: 00003825 */ or $a3,$zero,$zero -/* 4d114: afa00010 */ sw $zero,0x10($sp) -/* 4d118: 0c013304 */ jal func0004cc10 -/* 4d11c: afab0014 */ sw $t3,0x14($sp) -/* 4d120: 10400005 */ beqz $v0,.L0004d138 -/* 4d124: 24010005 */ addiu $at,$zero,0x5 -/* 4d128: 50410004 */ beql $v0,$at,.L0004d13c -/* 4d12c: 8fac02b0 */ lw $t4,0x2b0($sp) -/* 4d130: 10000076 */ b .L0004d30c -/* 4d134: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d138: -/* 4d138: 8fac02b0 */ lw $t4,0x2b0($sp) -.L0004d13c: -/* 4d13c: 2401ffff */ addiu $at,$zero,-1 -/* 4d140: 8d8d0000 */ lw $t5,0x0($t4) -/* 4d144: 55a10004 */ bnel $t5,$at,.L0004d158 -/* 4d148: 926e0064 */ lbu $t6,0x64($s3) -/* 4d14c: 1000006e */ b .L0004d308 -/* 4d150: 24020008 */ addiu $v0,$zero,0x8 -/* 4d154: 926e0064 */ lbu $t6,0x64($s3) -.L0004d158: -/* 4d158: 00008025 */ or $s0,$zero,$zero -/* 4d15c: 27b20180 */ addiu $s2,$sp,0x180 -/* 4d160: 19c00049 */ blez $t6,.L0004d288 -/* 4d164: 27b10080 */ addiu $s1,$sp,0x80 -.L0004d168: -/* 4d168: 02602025 */ or $a0,$s3,$zero -/* 4d16c: 02402825 */ or $a1,$s2,$zero -/* 4d170: 00003025 */ or $a2,$zero,$zero -/* 4d174: 0c01324d */ jal __osPfsRWInode -/* 4d178: 320700ff */ andi $a3,$s0,0xff -/* 4d17c: 10400003 */ beqz $v0,.L0004d18c -/* 4d180: 02602025 */ or $a0,$s3,$zero -/* 4d184: 10000061 */ b .L0004d30c -/* 4d188: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d18c: -/* 4d18c: 27af0290 */ addiu $t7,$sp,0x290 -/* 4d190: 27b8028c */ addiu $t8,$sp,0x28c -/* 4d194: afb80018 */ sw $t8,0x18($sp) -/* 4d198: afaf0014 */ sw $t7,0x14($sp) -/* 4d19c: 02402825 */ or $a1,$s2,$zero -/* 4d1a0: 02803025 */ or $a2,$s4,$zero -/* 4d1a4: 27a70294 */ addiu $a3,$sp,0x294 -/* 4d1a8: 0c0134cd */ jal func0004d334 -/* 4d1ac: afb00010 */ sw $s0,0x10($sp) -/* 4d1b0: 10400003 */ beqz $v0,.L0004d1c0 -/* 4d1b4: 8fa30294 */ lw $v1,0x294($sp) -/* 4d1b8: 10000054 */ b .L0004d30c -/* 4d1bc: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d1c0: -/* 4d1c0: 2401ffff */ addiu $at,$zero,-1 -/* 4d1c4: 5061002b */ beql $v1,$at,.L0004d274 -/* 4d1c8: 926b0064 */ lbu $t3,0x64($s3) -/* 4d1cc: 16a00004 */ bnez $s5,.L0004d1e0 -/* 4d1d0: 0016c840 */ sll $t9,$s6,0x1 -/* 4d1d4: a3a30051 */ sb $v1,0x51($sp) -/* 4d1d8: 1000000d */ b .L0004d210 -/* 4d1dc: a3b00050 */ sb $s0,0x50($sp) -.L0004d1e0: -/* 4d1e0: 02391021 */ addu $v0,$s1,$t9 -/* 4d1e4: a0500000 */ sb $s0,0x0($v0) -/* 4d1e8: a0430001 */ sb $v1,0x1($v0) -/* 4d1ec: 02602025 */ or $a0,$s3,$zero -/* 4d1f0: 02202825 */ or $a1,$s1,$zero -/* 4d1f4: 24060001 */ addiu $a2,$zero,0x1 -/* 4d1f8: 0c01324d */ jal __osPfsRWInode -/* 4d1fc: 32e700ff */ andi $a3,$s7,0xff -/* 4d200: 50400004 */ beqzl $v0,.L0004d214 -/* 4d204: 8fa80290 */ lw $t0,0x290($sp) -/* 4d208: 10000040 */ b .L0004d30c -/* 4d20c: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d210: -/* 4d210: 8fa80290 */ lw $t0,0x290($sp) -.L0004d214: -/* 4d214: 02402025 */ or $a0,$s2,$zero -/* 4d218: 02202825 */ or $a1,$s1,$zero -/* 4d21c: 0114082a */ slt $at,$t0,$s4 -/* 4d220: 5020000a */ beqzl $at,.L0004d24c -/* 4d224: 0000a025 */ or $s4,$zero,$zero -/* 4d228: 0c012c5c */ jal bcopy -/* 4d22c: 24060100 */ addiu $a2,$zero,0x100 -/* 4d230: 8fa90290 */ lw $t1,0x290($sp) -/* 4d234: 8fb6028c */ lw $s6,0x28c($sp) -/* 4d238: 321700ff */ andi $s7,$s0,0xff -/* 4d23c: 26b50001 */ addiu $s5,$s5,0x1 -/* 4d240: 1000000b */ b .L0004d270 -/* 4d244: 0289a023 */ subu $s4,$s4,$t1 -/* 4d248: 0000a025 */ or $s4,$zero,$zero -.L0004d24c: -/* 4d24c: 02602025 */ or $a0,$s3,$zero -/* 4d250: 02402825 */ or $a1,$s2,$zero -/* 4d254: 24060001 */ addiu $a2,$zero,0x1 -/* 4d258: 0c01324d */ jal __osPfsRWInode -/* 4d25c: 320700ff */ andi $a3,$s0,0xff -/* 4d260: 10400009 */ beqz $v0,.L0004d288 -/* 4d264: 00000000 */ nop -/* 4d268: 10000028 */ b .L0004d30c -/* 4d26c: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d270: -/* 4d270: 926b0064 */ lbu $t3,0x64($s3) -.L0004d274: -/* 4d274: 26100001 */ addiu $s0,$s0,0x1 -/* 4d278: 320a00ff */ andi $t2,$s0,0xff -/* 4d27c: 014b082a */ slt $at,$t2,$t3 -/* 4d280: 1420ffb9 */ bnez $at,.L0004d168 -/* 4d284: 01408025 */ or $s0,$t2,$zero -.L0004d288: -/* 4d288: 1e800004 */ bgtz $s4,.L0004d29c -/* 4d28c: 8fa30294 */ lw $v1,0x294($sp) -/* 4d290: 2401ffff */ addiu $at,$zero,-1 -/* 4d294: 14610003 */ bne $v1,$at,.L0004d2a4 -/* 4d298: 97ac0050 */ lhu $t4,0x50($sp) -.L0004d29c: -/* 4d29c: 1000001a */ b .L0004d308 -/* 4d2a0: 24020003 */ addiu $v0,$zero,0x3 -.L0004d2a4: -/* 4d2a4: 97ad029e */ lhu $t5,0x29e($sp) -/* 4d2a8: 8fae02a0 */ lw $t6,0x2a0($sp) -/* 4d2ac: a7ac0066 */ sh $t4,0x66($sp) -/* 4d2b0: a7a0006a */ sh $zero,0x6a($sp) -/* 4d2b4: 8fa402a4 */ lw $a0,0x2a4($sp) -/* 4d2b8: 27a50070 */ addiu $a1,$sp,0x70 -/* 4d2bc: 24060010 */ addiu $a2,$zero,0x10 -/* 4d2c0: a7ad0064 */ sh $t5,0x64($sp) -/* 4d2c4: 0c012c5c */ jal bcopy -/* 4d2c8: afae0060 */ sw $t6,0x60($sp) -/* 4d2cc: 8fa402a8 */ lw $a0,0x2a8($sp) -/* 4d2d0: 27a5006c */ addiu $a1,$sp,0x6c -/* 4d2d4: 0c012c5c */ jal bcopy -/* 4d2d8: 24060004 */ addiu $a2,$zero,0x4 -/* 4d2dc: 8faf02b0 */ lw $t7,0x2b0($sp) -/* 4d2e0: 8e79005c */ lw $t9,0x5c($s3) -/* 4d2e4: 8e640004 */ lw $a0,0x4($s3) -/* 4d2e8: 8df80000 */ lw $t8,0x0($t7) -/* 4d2ec: 8e650008 */ lw $a1,0x8($s3) -/* 4d2f0: afa00010 */ sw $zero,0x10($sp) -/* 4d2f4: 03193021 */ addu $a2,$t8,$t9 -/* 4d2f8: 30c8ffff */ andi $t0,$a2,0xffff -/* 4d2fc: 01003025 */ or $a2,$t0,$zero -/* 4d300: 0c012d84 */ jal __osContRamWrite -/* 4d304: 27a70060 */ addiu $a3,$sp,0x60 -.L0004d308: -/* 4d308: 8fbf0044 */ lw $ra,0x44($sp) -.L0004d30c: -/* 4d30c: 8fb00024 */ lw $s0,0x24($sp) -/* 4d310: 8fb10028 */ lw $s1,0x28($sp) -/* 4d314: 8fb2002c */ lw $s2,0x2c($sp) -/* 4d318: 8fb30030 */ lw $s3,0x30($sp) -/* 4d31c: 8fb40034 */ lw $s4,0x34($sp) -/* 4d320: 8fb50038 */ lw $s5,0x38($sp) -/* 4d324: 8fb6003c */ lw $s6,0x3c($sp) -/* 4d328: 8fb70040 */ lw $s7,0x40($sp) -/* 4d32c: 03e00008 */ jr $ra -/* 4d330: 27bd0298 */ addiu $sp,$sp,0x298 -); +s32 osPfsAllocateFile(OSPfs *pfs, u16 company_code, u32 game_code, char *game_name, char *ext_name, s32 num_bytes, s32 *file_no) +{ + s32 startPage; + s32 decleared; + s32 prevPage; + s32 oldPrevPage = 0; + s32 ret = 0; + s32 fileSizeInPages; + __OSInode inode; + __OSInode backupInode; + __OSDir dir; + u8 bank; + u8 prevBank = 0; + s32 firsttime = 0; + s32 bytes; + __OSInodeUnit fpage; + + if (company_code == 0 || game_code == 0) { + return PFS_ERR_INVALID; + } + + fileSizeInPages = (num_bytes + PFS_PAGE_SIZE - 1) / PFS_PAGE_SIZE; + + if ((ret = osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, file_no)) != 0 + && ret != PFS_ERR_INVALID) { + return ret; + } + + if (*file_no != -1) { + return PFS_ERR_EXIST; + } + + ret = osPfsFreeBlocks(pfs, &bytes); + + if (num_bytes > bytes) { + return PFS_DATA_FULL; + } + + if (fileSizeInPages == 0) { + return (PFS_ERR_INVALID); + } + + if ((ret = osPfsFindFile(pfs, 0, 0, 0, 0, file_no)) != 0 && ret != PFS_ERR_INVALID) { + return ret; + } + + if (*file_no == -1) { + return PFS_DIR_FULL; + } + + for (bank = 0; bank < pfs->banks; bank++) { + if ((ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank)) != 0) { + return ret; + } + + ret = __osPfsDeclearPage(pfs, &inode, fileSizeInPages, &startPage, bank, &decleared, &prevPage); + + if (ret) { + return ret; + } + + if (startPage != -1) { /* There is free space */ + if (firsttime == 0) { + fpage.inode_t.page = (u8)startPage; + fpage.inode_t.bank = bank; + } else { /* Writing previous bank inode */ + backupInode.inode_page[oldPrevPage].inode_t.bank = bank; + backupInode.inode_page[oldPrevPage].inode_t.page = (u8)startPage; + + if ((ret = __osPfsRWInode(pfs, &backupInode, PFS_WRITE, prevBank)) != 0) { + return ret; + } + } + + if (fileSizeInPages > decleared) { + bcopy(&inode, &backupInode, sizeof(__OSInode)); + oldPrevPage = prevPage; + prevBank = bank; + fileSizeInPages -= decleared; + firsttime++; + } else { + fileSizeInPages = 0; + + if ((ret = __osPfsRWInode(pfs, &inode, PFS_WRITE, bank)) != 0) { + return ret; + } + + break; + } + } + } + + if (fileSizeInPages > 0 || startPage == -1) { + return PFS_ERR_INCONSISTENT; + } + + dir.start_page = fpage; + dir.company_code = company_code; + dir.game_code = game_code; + dir.data_sum = 0; + + bcopy(game_name, dir.game_name, PFS_FILE_NAME_LEN); + bcopy(ext_name, dir.ext_name, PFS_FILE_EXT_LEN); + + return __osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + *file_no, (u8*)&dir, 0); +} GLOBAL_ASM( -glabel func0004d334 +glabel __osPfsDeclearPage /* 4d334: 27bdfff0 */ addiu $sp,$sp,-16 /* 4d338: afb00008 */ sw $s0,0x8($sp) /* 4d33c: 93b00023 */ lbu $s0,0x23($sp) diff --git a/src/lib/lib_4d480.c b/src/lib/lib_4d480.c index d462e3aed..fa977735e 100644 --- a/src/lib/lib_4d480.c +++ b/src/lib/lib_4d480.c @@ -32,7 +32,7 @@ glabel func0004d480 /* 4d4c4: 8faf0180 */ lw $t7,0x180($sp) /* 4d4c8: 27b8016c */ addiu $t8,$sp,0x16c /* 4d4cc: afb80014 */ sw $t8,0x14($sp) -/* 4d4d0: 0c013304 */ jal func0004cc10 +/* 4d4d0: 0c013304 */ jal osPfsFindFile /* 4d4d4: afaf0010 */ sw $t7,0x10($sp) /* 4d4d8: 50400004 */ beqzl $v0,.L0004d4ec /* 4d4dc: 92590065 */ lbu $t9,0x65($s2)