Decompile osPfsInitPak2

This commit is contained in:
Ryan Dwyer 2021-10-11 23:46:07 +10:00
parent d82a6ba619
commit e5b7413a32
3 changed files with 97 additions and 149 deletions

View File

@ -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
/**************************************************************************
*

View File

@ -4,6 +4,6 @@
#include "data.h"
#include "types.h"
u32 func00051778(void);
s32 func00051778(OSPfs *pfs);
#endif

View File

@ -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