diff --git a/src/include/PR/os_pfs.h b/src/include/PR/os_pfs.h index 5ff235251..d87bf4524 100644 --- a/src/include/PR/os_pfs.h +++ b/src/include/PR/os_pfs.h @@ -135,9 +135,11 @@ typedef struct { #define PFS_WRITE 1 #define PFS_CREATE 2 -#define PFS_INITIALIZED 0x1 -#define PFS_CORRUPTED 0x2 -#define PFS_MOTOR_INITIALIZED 0x8 +#define PFS_INITIALIZED 0x01 +#define PFS_CORRUPTED 0x02 +#define PFS_ID_BROKEN 0x04 +#define PFS_MOTOR_INITIALIZED 0x08 +#define PFS_GBPAK_INITIALIZED 0x10 /************************************************************************** * diff --git a/src/include/lib/lib_51570.h b/src/include/lib/lib_51570.h index b4376c5e3..0c7aa8f66 100644 --- a/src/include/lib/lib_51570.h +++ b/src/include/lib/lib_51570.h @@ -4,6 +4,6 @@ #include "data.h" #include "types.h" -u32 func00051778(void); +s32 func00051778(OSPfs *pfs); #endif diff --git a/src/lib/lib_51570.c b/src/lib/lib_51570.c index 4b4568d1d..55954c170 100644 --- a/src/lib/lib_51570.c +++ b/src/lib/lib_51570.c @@ -5,151 +5,97 @@ #include "data.h" #include "types.h" -GLOBAL_ASM( -glabel func000051570 -/* 51570: 27bdff90 */ addiu $sp,$sp,-112 -/* 51574: afbf001c */ sw $ra,0x1c($sp) -/* 51578: afb00018 */ sw $s0,0x18($sp) -/* 5157c: 00a08025 */ or $s0,$a1,$zero -/* 51580: afa40070 */ sw $a0,0x70($sp) -/* 51584: 0c012a18 */ jal __osSiGetAccess -/* 51588: afa60078 */ sw $a2,0x78($sp) -/* 5158c: 8fa40070 */ lw $a0,0x70($sp) -/* 51590: 0c012ea4 */ jal __osPfsGetStatus -/* 51594: 8fa50078 */ lw $a1,0x78($sp) -/* 51598: 0c012a29 */ jal __osSiRelAccess -/* 5159c: afa2006c */ sw $v0,0x6c($sp) -/* 515a0: 8fa3006c */ lw $v1,0x6c($sp) -/* 515a4: 8fae0070 */ lw $t6,0x70($sp) -/* 515a8: 02002025 */ or $a0,$s0,$zero -/* 515ac: 50600004 */ beqzl $v1,.L000515c0 -/* 515b0: ae0e0004 */ sw $t6,0x4($s0) -/* 515b4: 1000006b */ b .L00051764 -/* 515b8: 00601025 */ or $v0,$v1,$zero -/* 515bc: ae0e0004 */ sw $t6,0x4($s0) -.L000515c0: -/* 515c0: 8faf0078 */ lw $t7,0x78($sp) -/* 515c4: ae000000 */ sw $zero,0x0($s0) -/* 515c8: 0c0145de */ jal func00051778 -/* 515cc: ae0f0008 */ sw $t7,0x8($s0) -/* 515d0: 10400003 */ beqz $v0,.L000515e0 -/* 515d4: 02002025 */ or $a0,$s0,$zero -/* 515d8: 10000063 */ b .L00051768 -/* 515dc: 8fbf001c */ lw $ra,0x1c($sp) -.L000515e0: -/* 515e0: 0c013378 */ jal __osPfsSelectBank -/* 515e4: 00002825 */ or $a1,$zero,$zero -/* 515e8: 10400003 */ beqz $v0,.L000515f8 -/* 515ec: 24060001 */ addiu $a2,$zero,0x1 -/* 515f0: 1000005d */ b .L00051768 -/* 515f4: 8fbf001c */ lw $ra,0x1c($sp) -.L000515f8: -/* 515f8: 8e040004 */ lw $a0,0x4($s0) -/* 515fc: 8e050008 */ lw $a1,0x8($s0) -/* 51600: 0c012e18 */ jal __osContRamRead -/* 51604: 27a70048 */ addiu $a3,$sp,0x48 -/* 51608: 10400003 */ beqz $v0,.L00051618 -/* 5160c: 27a40048 */ addiu $a0,$sp,0x48 -/* 51610: 10000055 */ b .L00051768 -/* 51614: 8fbf001c */ lw $ra,0x1c($sp) -.L00051618: -/* 51618: 27a5006a */ addiu $a1,$sp,0x6a -/* 5161c: 0c013041 */ jal __osIdCheckSum -/* 51620: 27a60068 */ addiu $a2,$sp,0x68 -/* 51624: 97b8006a */ lhu $t8,0x6a($sp) -/* 51628: 97b90064 */ lhu $t9,0x64($sp) -/* 5162c: 27a50048 */ addiu $a1,$sp,0x48 -/* 51630: afa50044 */ sw $a1,0x44($sp) -/* 51634: 17190004 */ bne $t8,$t9,.L00051648 -/* 51638: 97a90068 */ lhu $t1,0x68($sp) -/* 5163c: 97aa0066 */ lhu $t2,0x66($sp) -/* 51640: 512a000a */ beql $t1,$t2,.L0005166c -/* 51644: 97ad0060 */ lhu $t5,0x60($sp) -.L00051648: -/* 51648: 0c013154 */ jal __osCheckPackId -/* 5164c: 02002025 */ or $a0,$s0,$zero -/* 51650: 50400006 */ beqzl $v0,.L0005166c -/* 51654: 97ad0060 */ lhu $t5,0x60($sp) -/* 51658: 8e0b0000 */ lw $t3,0x0($s0) -/* 5165c: 356c0004 */ ori $t4,$t3,0x4 -/* 51660: 10000040 */ b .L00051764 -/* 51664: ae0c0000 */ sw $t4,0x0($s0) -/* 51668: 97ad0060 */ lhu $t5,0x60($sp) -.L0005166c: -/* 5166c: 27a50048 */ addiu $a1,$sp,0x48 -/* 51670: 02002025 */ or $a0,$s0,$zero -/* 51674: 31ae0001 */ andi $t6,$t5,0x1 -/* 51678: 55c00016 */ bnezl $t6,.L000516d4 -/* 5167c: 8fa40044 */ lw $a0,0x44($sp) -/* 51680: 0c013080 */ jal __osRepairPackId -/* 51684: 27a60020 */ addiu $a2,$sp,0x20 -/* 51688: 10400009 */ beqz $v0,.L000516b0 -/* 5168c: 00401825 */ or $v1,$v0,$zero -/* 51690: 2401000a */ addiu $at,$zero,0xa -/* 51694: 14410004 */ bne $v0,$at,.L000516a8 -/* 51698: 00000000 */ nop -/* 5169c: 8e0f0000 */ lw $t7,0x0($s0) -/* 516a0: 35f80004 */ ori $t8,$t7,0x4 -/* 516a4: ae180000 */ sw $t8,0x0($s0) -.L000516a8: -/* 516a8: 1000002e */ b .L00051764 -/* 516ac: 00601025 */ or $v0,$v1,$zero -.L000516b0: -/* 516b0: 97a90038 */ lhu $t1,0x38($sp) -/* 516b4: 27b90020 */ addiu $t9,$sp,0x20 -/* 516b8: afb90044 */ sw $t9,0x44($sp) -/* 516bc: 312a0001 */ andi $t2,$t1,0x1 -/* 516c0: 55400004 */ bnezl $t2,.L000516d4 -/* 516c4: 8fa40044 */ lw $a0,0x44($sp) -/* 516c8: 10000026 */ b .L00051764 -/* 516cc: 2402000b */ addiu $v0,$zero,0xb -/* 516d0: 8fa40044 */ lw $a0,0x44($sp) -.L000516d4: -/* 516d4: 2605000c */ addiu $a1,$s0,0xc -/* 516d8: 0c012c5c */ jal bcopy -/* 516dc: 24060020 */ addiu $a2,$zero,0x20 -/* 516e0: 8fab0044 */ lw $t3,0x44($sp) -/* 516e4: 24190010 */ addiu $t9,$zero,0x10 -/* 516e8: 24090008 */ addiu $t1,$zero,0x8 -/* 516ec: 916c001b */ lbu $t4,0x1b($t3) -/* 516f0: 8e040004 */ lw $a0,0x4($s0) -/* 516f4: 8e050008 */ lw $a1,0x8($s0) -/* 516f8: ae0c004c */ sw $t4,0x4c($s0) -/* 516fc: 8fad0044 */ lw $t5,0x44($sp) -/* 51700: 24060007 */ addiu $a2,$zero,0x7 -/* 51704: 2607002c */ addiu $a3,$s0,0x2c -/* 51708: 91ae001a */ lbu $t6,0x1a($t5) -/* 5170c: ae190050 */ sw $t9,0x50($s0) -/* 51710: ae090054 */ sw $t1,0x54($s0) -/* 51714: 31c200ff */ andi $v0,$t6,0xff -/* 51718: 000218c0 */ sll $v1,$v0,0x3 -/* 5171c: 00027840 */ sll $t7,$v0,0x1 -/* 51720: 24680008 */ addiu $t0,$v1,0x8 -/* 51724: 25f80003 */ addiu $t8,$t7,0x3 -/* 51728: 01035021 */ addu $t2,$t0,$v1 -/* 5172c: ae180060 */ sw $t8,0x60($s0) -/* 51730: ae080058 */ sw $t0,0x58($s0) -/* 51734: ae0a005c */ sw $t2,0x5c($s0) -/* 51738: 0c012e18 */ jal __osContRamRead -/* 5173c: a20e0064 */ sb $t6,0x64($s0) -/* 51740: 10400003 */ beqz $v0,.L00051750 -/* 51744: 00000000 */ nop -/* 51748: 10000007 */ b .L00051768 -/* 5174c: 8fbf001c */ lw $ra,0x1c($sp) -.L00051750: -/* 51750: 0c0135bc */ jal osPfsChecker -/* 51754: 02002025 */ or $a0,$s0,$zero -/* 51758: 8e0b0000 */ lw $t3,0x0($s0) -/* 5175c: 356c0001 */ ori $t4,$t3,0x1 -/* 51760: ae0c0000 */ sw $t4,0x0($s0) -.L00051764: -/* 51764: 8fbf001c */ lw $ra,0x1c($sp) -.L00051768: -/* 51768: 8fb00018 */ lw $s0,0x18($sp) -/* 5176c: 27bd0070 */ addiu $sp,$sp,0x70 -/* 51770: 03e00008 */ jr $ra -/* 51774: 00000000 */ nop -); +s32 osPfsInitPak2(OSMesgQueue *queue, OSPfs *pfs, s32 channel) +{ + s32 ret; + u16 csum; + u16 icsum; + __OSPackId oldid; + __OSPackId *id; + __OSPackId newid; + + __osSiGetAccess(); + ret = __osPfsGetStatus(queue, channel); + __osSiRelAccess(); + + if (ret != 0) { + return ret; + } + + pfs->queue = queue; + pfs->channel = channel; + pfs->status = 0; + + ret = func00051778(pfs); + + if (ret != 0) { + return ret; + } + + ret = __osPfsSelectBank(pfs, 0); + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(pfs->queue, pfs->channel, 1, (u8 *)&oldid); + + if (ret != 0) { + return ret; + } + + __osIdCheckSum((u16 *)&oldid, &csum, &icsum); + + id = &oldid; + + if ((oldid.checksum != csum || oldid.inverted_checksum != icsum)) { + ret = __osCheckPackId(pfs, &oldid); + + if (ret != 0) { + pfs->status |= PFS_ID_BROKEN; + return ret; + } + } + + if ((oldid.deviceid & 1) == 0) { + ret = __osRepairPackId(pfs, &oldid, &newid); + + if (ret != 0) { + if (ret == PFS_ERR_ID_FATAL) { + pfs->status |= PFS_ID_BROKEN; + } + + return ret; + } + + id = &newid; + + if ((newid.deviceid & 1) == 0) { + return PFS_ERR_DEVICE; + } + } + + bcopy(id, pfs->id, sizeof(*id)); + + pfs->version = id->version; + pfs->banks = id->banks; + pfs->inode_start_page = pfs->banks * 2 + 3; + pfs->dir_size = 16; + pfs->inode_table = 8; + pfs->minode_table = pfs->banks * PFS_ONE_PAGE + 8; + pfs->dir_table = pfs->minode_table + pfs->banks * PFS_ONE_PAGE; + + ret = __osContRamRead(pfs->queue, pfs->channel, 7, pfs->label); + + if (ret != 0) { + return ret; + } + + ret = osPfsChecker(pfs); + pfs->status |= PFS_INITIALIZED; + + return ret; +} GLOBAL_ASM( glabel func00051778