From 3e925e7398bd285989b003cb3c9b0a09bb689f89 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 25 Mar 2021 08:21:39 +1000 Subject: [PATCH] Decompile __osPfsRWInode --- src/include/PR/os_pfs.h | 4 + src/include/data.h | 4 +- src/include/lib/lib_4c090.h | 2 +- src/include/libultra_internal.h | 2 + src/lib/lib_06550.c | 20 +- src/lib/lib_4c090.c | 336 +++++++------------------------- src/lib/lib_4ce60.c | 2 +- src/lib/lib_4d000.c | 6 +- src/lib/lib_4d480.c | 4 +- src/lib/lib_4d6f0.c | 10 +- src/lib/lib_50480.c | 2 +- src/lib/lib_50a00.c | 2 +- src/lib/ultra/io/pfsgetstatus.c | 2 +- 13 files changed, 102 insertions(+), 294 deletions(-) diff --git a/src/include/PR/os_pfs.h b/src/include/PR/os_pfs.h index 0dd998d1b..4e3a456de 100644 --- a/src/include/PR/os_pfs.h +++ b/src/include/PR/os_pfs.h @@ -98,6 +98,10 @@ typedef struct { #define PFS_ONE_PAGE 8 /* blocks */ #define PFS_MAX_BANKS 62 +#define PFS_READ 0 +#define PFS_WRITE 1 +#define PFS_CREATE 2 + #define PFS_INITIALIZED 0x1 #define PFS_CORRUPTED 0x2 diff --git a/src/include/data.h b/src/include/data.h index 70f45536c..3f27c52b4 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -121,8 +121,8 @@ extern OSThread *__osFaultedThread; extern u32 __osSiAccessQueueEnabled; extern u32 __osContInitialized; extern u32 var80060970; -extern u32 var80060980; -extern u8 var80060984; +extern s32 g_PfsPrevChannel; +extern u8 g_PfsPrevBank; extern u32 var80060990; extern u32 var800609a0; extern u32 var800609c4; diff --git a/src/include/lib/lib_4c090.h b/src/include/lib/lib_4c090.h index 9cfb6f8ca..a816c672c 100644 --- a/src/include/lib/lib_4c090.h +++ b/src/include/lib/lib_4c090.h @@ -10,6 +10,6 @@ s32 __osRepairPackId(OSPfs *pfs, __OSPackId *badid, __OSPackId *newid); s32 __osCheckPackId(OSPfs *pfs, __OSPackId *temp); s32 __osGetId(OSPfs *pfs); u32 func0004c860(void); -u32 func0004c934(void); +s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank); #endif diff --git a/src/include/libultra_internal.h b/src/include/libultra_internal.h index df7b584a0..72bcfcf65 100644 --- a/src/include/libultra_internal.h +++ b/src/include/libultra_internal.h @@ -15,6 +15,8 @@ typedef struct s32 __osDisableInt(); void __osRestoreInt(s32); +s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer); +s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force); void __osEnqueueAndYield(OSThread**); void __osDequeueThread(OSThread**, OSThread*); void __osEnqueueThread(OSThread**, OSThread*); diff --git a/src/lib/lib_06550.c b/src/lib/lib_06550.c index c7ce42bf2..809cd2a60 100644 --- a/src/lib/lib_06550.c +++ b/src/lib/lib_06550.c @@ -138,7 +138,7 @@ glabel func00006550 /* 6704: 02802825 */ or $a1,$s4,$zero /* 6708: 00003025 */ or $a2,$zero,$zero /* 670c: 32c700ff */ andi $a3,$s6,0xff -/* 6710: 0c01324d */ jal func0004c934 +/* 6710: 0c01324d */ jal __osPfsRWInode /* 6714: afa3009c */ sw $v1,0x9c($sp) /* 6718: 8fa3009c */ lw $v1,0x9c($sp) /* 671c: 10400003 */ beqz $v0,.L0000672c @@ -240,7 +240,7 @@ glabel func00006550 /* 686c: 02a02025 */ or $a0,$s5,$zero /* 6870: 02802825 */ or $a1,$s4,$zero /* 6874: 00003025 */ or $a2,$zero,$zero -/* 6878: 0c01324d */ jal func0004c934 +/* 6878: 0c01324d */ jal __osPfsRWInode /* 687c: 32c700ff */ andi $a3,$s6,0xff /* 6880: 10400003 */ beqz $v0,.L00006890 /* 6884: 02a02025 */ or $a0,$s5,$zero @@ -280,7 +280,7 @@ glabel func00006550 /* 6900: 02a02025 */ or $a0,$s5,$zero /* 6904: 24060001 */ addiu $a2,$zero,0x1 /* 6908: 324700ff */ andi $a3,$s2,0xff -/* 690c: 0c01324d */ jal func0004c934 +/* 690c: 0c01324d */ jal __osPfsRWInode /* 6910: a0590001 */ sb $t9,0x1($v0) /* 6914: 50400004 */ beqzl $v0,.L00006928 /* 6918: 27a300c4 */ addiu $v1,$sp,0xc4 @@ -338,7 +338,7 @@ glabel func00006550 .L000069c8: /* 69c8: 27a500c4 */ addiu $a1,$sp,0xc4 /* 69cc: 24060001 */ addiu $a2,$zero,0x1 -/* 69d0: 0c01324d */ jal func0004c934 +/* 69d0: 0c01324d */ jal __osPfsRWInode /* 69d4: 324700ff */ andi $a3,$s2,0xff /* 69d8: 104000d4 */ beqz $v0,.L00006d2c /* 69dc: 00402025 */ or $a0,$v0,$zero @@ -359,7 +359,7 @@ glabel func00006550 .L00006a14: /* 6a14: 02802825 */ or $a1,$s4,$zero /* 6a18: 00003025 */ or $a2,$zero,$zero -/* 6a1c: 0c01324d */ jal func0004c934 +/* 6a1c: 0c01324d */ jal __osPfsRWInode /* 6a20: 32c700ff */ andi $a3,$s6,0xff /* 6a24: 10400003 */ beqz $v0,.L00006a34 /* 6a28: 27aa005c */ addiu $t2,$sp,0x5c @@ -416,7 +416,7 @@ glabel func00006550 /* 6ae0: 028d7021 */ addu $t6,$s4,$t5 /* 6ae4: a5cc0000 */ sh $t4,0x0($t6) /* 6ae8: 24060001 */ addiu $a2,$zero,0x1 -/* 6aec: 0c01324d */ jal func0004c934 +/* 6aec: 0c01324d */ jal __osPfsRWInode /* 6af0: 32c700ff */ andi $a3,$s6,0xff /* 6af4: 50400004 */ beqzl $v0,.L00006b08 /* 6af8: 8faf0060 */ lw $t7,0x60($sp) @@ -434,7 +434,7 @@ glabel func00006550 /* 6b20: 00003025 */ or $a2,$zero,$zero /* 6b24: a7210000 */ sh $at,0x0($t9) /* 6b28: 93b60094 */ lbu $s6,0x94($sp) -/* 6b2c: 0c01324d */ jal func0004c934 +/* 6b2c: 0c01324d */ jal __osPfsRWInode /* 6b30: 02c03825 */ or $a3,$s6,$zero /* 6b34: 10400003 */ beqz $v0,.L00006b44 /* 6b38: 00000000 */ nop @@ -491,7 +491,7 @@ glabel func00006550 /* 6be4: 02a02025 */ or $a0,$s5,$zero /* 6be8: 02802825 */ or $a1,$s4,$zero /* 6bec: 24060001 */ addiu $a2,$zero,0x1 -/* 6bf0: 0c01324d */ jal func0004c934 +/* 6bf0: 0c01324d */ jal __osPfsRWInode /* 6bf4: 32c700ff */ andi $a3,$s6,0xff /* 6bf8: 50400039 */ beqzl $v0,.L00006ce0 /* 6bfc: 97a200ae */ lhu $v0,0xae($sp) @@ -521,7 +521,7 @@ glabel func00006550 .L00006c54: /* 6c54: 02802825 */ or $a1,$s4,$zero /* 6c58: 24060001 */ addiu $a2,$zero,0x1 -/* 6c5c: 0c01324d */ jal func0004c934 +/* 6c5c: 0c01324d */ jal __osPfsRWInode /* 6c60: 32c700ff */ andi $a3,$s6,0xff /* 6c64: 10400003 */ beqz $v0,.L00006c74 /* 6c68: 97b80070 */ lhu $t8,0x70($sp) @@ -539,7 +539,7 @@ glabel func00006550 /* 6c90: 02802825 */ or $a1,$s4,$zero /* 6c94: 00003025 */ or $a2,$zero,$zero /* 6c98: 02c03825 */ or $a3,$s6,$zero -/* 6c9c: 0c01324d */ jal func0004c934 +/* 6c9c: 0c01324d */ jal __osPfsRWInode /* 6ca0: a5410000 */ sh $at,0x0($t2) /* 6ca4: 50400004 */ beqzl $v0,.L00006cb8 /* 6ca8: 92a20064 */ lbu $v0,0x64($s5) diff --git a/src/lib/lib_4c090.c b/src/lib/lib_4c090.c index 382e57992..a28529e25 100644 --- a/src/lib/lib_4c090.c +++ b/src/lib/lib_4c090.c @@ -8,73 +8,8 @@ #include "data.h" #include "types.h" -u32 var8009c870; -u32 var8009c874; -u32 var8009c878; -u32 var8009c87c; -u32 var8009c880; -u32 var8009c884; -u32 var8009c888; -u32 var8009c88c; -u32 var8009c890; -u32 var8009c894; -u32 var8009c898; -u32 var8009c89c; -u32 var8009c8a0; -u32 var8009c8a4; -u32 var8009c8a8; -u32 var8009c8ac; -u32 var8009c8b0; -u32 var8009c8b4; -u32 var8009c8b8; -u32 var8009c8bc; -u32 var8009c8c0; -u32 var8009c8c4; -u32 var8009c8c8; -u32 var8009c8cc; -u32 var8009c8d0; -u32 var8009c8d4; -u32 var8009c8d8; -u32 var8009c8dc; -u32 var8009c8e0; -u32 var8009c8e4; -u32 var8009c8e8; -u32 var8009c8ec; -u32 var8009c8f0; -u32 var8009c8f4; -u32 var8009c8f8; -u32 var8009c8fc; -u32 var8009c900; -u32 var8009c904; -u32 var8009c908; -u32 var8009c90c; -u32 var8009c910; -u32 var8009c914; -u32 var8009c918; -u32 var8009c91c; -u32 var8009c920; -u32 var8009c924; -u32 var8009c928; -u32 var8009c92c; -u32 var8009c930; -u32 var8009c934; -u32 var8009c938; -u32 var8009c93c; -u32 var8009c940; -u32 var8009c944; -u32 var8009c948; -u32 var8009c94c; -u32 var8009c950; -u32 var8009c954; -u32 var8009c958; -u32 var8009c95c; -u32 var8009c960; -u32 var8009c964; -u32 var8009c968; -u32 var8009c96c; - -u32 var80060980 = 0xffffffff; -u8 var80060984 = 0xfa; +s32 g_PfsPrevChannel = -1; +u8 g_PfsPrevBank = 250; u16 __osSumCalc(u8 *ptr, int length) { @@ -607,203 +542,70 @@ glabel func0004c860 /* 4c930: 00000000 */ nop ); -GLOBAL_ASM( -glabel func0004c934 -/* 4c934: 27bdffa8 */ addiu $sp,$sp,-88 -/* 4c938: afb40030 */ sw $s4,0x30($sp) -/* 4c93c: 30d400ff */ andi $s4,$a2,0xff -/* 4c940: afb20028 */ sw $s2,0x28($sp) -/* 4c944: 00809025 */ or $s2,$a0,$zero -/* 4c948: afbf0034 */ sw $ra,0x34($sp) -/* 4c94c: afb3002c */ sw $s3,0x2c($sp) -/* 4c950: afb10024 */ sw $s1,0x24($sp) -/* 4c954: afb00020 */ sw $s0,0x20($sp) -/* 4c958: afa5005c */ sw $a1,0x5c($sp) -/* 4c95c: afa60060 */ sw $a2,0x60($sp) -/* 4c960: 16800011 */ bnez $s4,.L0004c9a8 -/* 4c964: afa70064 */ sw $a3,0x64($sp) -/* 4c968: 3c0f8006 */ lui $t7,%hi(var80060984) -/* 4c96c: 91ef0984 */ lbu $t7,%lo(var80060984)($t7) -/* 4c970: 93b80067 */ lbu $t8,0x67($sp) -/* 4c974: 3c198006 */ lui $t9,%hi(var80060980) -/* 4c978: 55f8000c */ bnel $t7,$t8,.L0004c9ac -/* 4c97c: 92490065 */ lbu $t1,0x65($s2) -/* 4c980: 8f390980 */ lw $t9,%lo(var80060980)($t9) -/* 4c984: 8c880008 */ lw $t0,0x8($a0) -/* 4c988: 3c04800a */ lui $a0,%hi(var8009c870) -/* 4c98c: 2484c870 */ addiu $a0,$a0,%lo(var8009c870) -/* 4c990: 57280006 */ bnel $t9,$t0,.L0004c9ac -/* 4c994: 92490065 */ lbu $t1,0x65($s2) -/* 4c998: 0c012c5c */ jal bcopy -/* 4c99c: 24060100 */ addiu $a2,$zero,0x100 -/* 4c9a0: 10000091 */ b .L0004cbe8 -/* 4c9a4: 00001025 */ or $v0,$zero,$zero -.L0004c9a8: -/* 4c9a8: 92490065 */ lbu $t1,0x65($s2) -.L0004c9ac: -/* 4c9ac: 02402025 */ or $a0,$s2,$zero -/* 4c9b0: 51200008 */ beqzl $t1,.L0004c9d4 -/* 4c9b4: 93a30067 */ lbu $v1,0x67($sp) -/* 4c9b8: 0c013378 */ jal __osPfsSelectBank -/* 4c9bc: 00002825 */ or $a1,$zero,$zero -/* 4c9c0: 50400004 */ beqzl $v0,.L0004c9d4 -/* 4c9c4: 93a30067 */ lbu $v1,0x67($sp) -/* 4c9c8: 10000088 */ b .L0004cbec -/* 4c9cc: 8fbf0034 */ lw $ra,0x34($sp) -/* 4c9d0: 93a30067 */ lbu $v1,0x67($sp) -.L0004c9d4: -/* 4c9d4: 24020001 */ addiu $v0,$zero,0x1 -/* 4c9d8: 240a0001 */ addiu $t2,$zero,0x1 -/* 4c9dc: 58600004 */ blezl $v1,.L0004c9f0 -/* 4c9e0: 8e4b0060 */ lw $t3,0x60($s2) -/* 4c9e4: 10000003 */ b .L0004c9f4 -/* 4c9e8: afaa0048 */ sw $t2,0x48($sp) -/* 4c9ec: 8e4b0060 */ lw $t3,0x60($s2) -.L0004c9f0: -/* 4c9f0: afab0048 */ sw $t3,0x48($sp) -.L0004c9f4: -/* 4c9f4: 1454000c */ bne $v0,$s4,.L0004ca28 -/* 4c9f8: 8fad0048 */ lw $t5,0x48($sp) -/* 4c9fc: 8fac005c */ lw $t4,0x5c($sp) -/* 4ca00: 000d2823 */ negu $a1,$t5 -/* 4ca04: 00057840 */ sll $t7,$a1,0x1 -/* 4ca08: 000d7040 */ sll $t6,$t5,0x1 -/* 4ca0c: 25e50100 */ addiu $a1,$t7,0x100 -/* 4ca10: afa3003c */ sw $v1,0x3c($sp) -/* 4ca14: 0c013024 */ jal __osSumCalc -/* 4ca18: 018e2021 */ addu $a0,$t4,$t6 -/* 4ca1c: 8fb8005c */ lw $t8,0x5c($sp) -/* 4ca20: 8fa3003c */ lw $v1,0x3c($sp) -/* 4ca24: a3020001 */ sb $v0,0x1($t8) -.L0004ca28: -/* 4ca28: 00008025 */ or $s0,$zero,$zero -/* 4ca2c: 8fb1005c */ lw $s1,0x5c($sp) -/* 4ca30: 000398c0 */ sll $s3,$v1,0x3 -.L0004ca34: -/* 4ca34: 24020001 */ addiu $v0,$zero,0x1 -/* 4ca38: 14540016 */ bne $v0,$s4,.L0004ca94 -/* 4ca3c: 8e450008 */ lw $a1,0x8($s2) -/* 4ca40: 8e590054 */ lw $t9,0x54($s2) -/* 4ca44: 8e440004 */ lw $a0,0x4($s2) -/* 4ca48: afa00010 */ sw $zero,0x10($sp) -/* 4ca4c: 03334021 */ addu $t0,$t9,$s3 -/* 4ca50: 01103021 */ addu $a2,$t0,$s0 -/* 4ca54: 30c9ffff */ andi $t1,$a2,0xffff -/* 4ca58: 01203025 */ or $a2,$t1,$zero -/* 4ca5c: 0c012d84 */ jal __osContRamWrite -/* 4ca60: 02203825 */ or $a3,$s1,$zero -/* 4ca64: 8e4a0058 */ lw $t2,0x58($s2) -/* 4ca68: 8e440004 */ lw $a0,0x4($s2) -/* 4ca6c: 8e450008 */ lw $a1,0x8($s2) -/* 4ca70: 01535821 */ addu $t3,$t2,$s3 -/* 4ca74: 01703021 */ addu $a2,$t3,$s0 -/* 4ca78: 30ccffff */ andi $t4,$a2,0xffff -/* 4ca7c: 01803025 */ or $a2,$t4,$zero -/* 4ca80: afa00010 */ sw $zero,0x10($sp) -/* 4ca84: 0c012d84 */ jal __osContRamWrite -/* 4ca88: 02203825 */ or $a3,$s1,$zero -/* 4ca8c: 1000000a */ b .L0004cab8 -/* 4ca90: 00401825 */ or $v1,$v0,$zero -.L0004ca94: -/* 4ca94: 8e4e0054 */ lw $t6,0x54($s2) -/* 4ca98: 8e440004 */ lw $a0,0x4($s2) -/* 4ca9c: 02203825 */ or $a3,$s1,$zero -/* 4caa0: 01d36821 */ addu $t5,$t6,$s3 -/* 4caa4: 01b03021 */ addu $a2,$t5,$s0 -/* 4caa8: 30cfffff */ andi $t7,$a2,0xffff -/* 4caac: 0c012e18 */ jal __osContRamRead -/* 4cab0: 01e03025 */ or $a2,$t7,$zero -/* 4cab4: 00401825 */ or $v1,$v0,$zero -.L0004cab8: -/* 4cab8: 10400003 */ beqz $v0,.L0004cac8 -/* 4cabc: 26100001 */ addiu $s0,$s0,0x1 -/* 4cac0: 10000049 */ b .L0004cbe8 -/* 4cac4: 00601025 */ or $v0,$v1,$zero -.L0004cac8: -/* 4cac8: 2a010008 */ slti $at,$s0,0x8 -/* 4cacc: 1420ffd9 */ bnez $at,.L0004ca34 -/* 4cad0: 26310020 */ addiu $s1,$s1,0x20 -/* 4cad4: 16800038 */ bnez $s4,.L0004cbb8 -/* 4cad8: 8fb90048 */ lw $t9,0x48($sp) -/* 4cadc: 8fb8005c */ lw $t8,0x5c($sp) -/* 4cae0: 00192823 */ negu $a1,$t9 -/* 4cae4: 00054840 */ sll $t1,$a1,0x1 -/* 4cae8: 00194040 */ sll $t0,$t9,0x1 -/* 4caec: 25250100 */ addiu $a1,$t1,0x100 -/* 4caf0: 0308a021 */ addu $s4,$t8,$t0 -/* 4caf4: 02802025 */ or $a0,$s4,$zero -/* 4caf8: 0c013024 */ jal __osSumCalc -/* 4cafc: afa5003c */ sw $a1,0x3c($sp) -/* 4cb00: 8fab005c */ lw $t3,0x5c($sp) -/* 4cb04: 304a00ff */ andi $t2,$v0,0xff -/* 4cb08: 00008025 */ or $s0,$zero,$zero -/* 4cb0c: 916c0001 */ lbu $t4,0x1($t3) -/* 4cb10: 01608825 */ or $s1,$t3,$zero -/* 4cb14: 514c0029 */ beql $t2,$t4,.L0004cbbc -/* 4cb18: 93ab0067 */ lbu $t3,0x67($sp) -.L0004cb1c: -/* 4cb1c: 8e4e0058 */ lw $t6,0x58($s2) -/* 4cb20: 8e440004 */ lw $a0,0x4($s2) -/* 4cb24: 8e450008 */ lw $a1,0x8($s2) -/* 4cb28: 01d36821 */ addu $t5,$t6,$s3 -/* 4cb2c: 01b03021 */ addu $a2,$t5,$s0 -/* 4cb30: 30cfffff */ andi $t7,$a2,0xffff -/* 4cb34: 01e03025 */ or $a2,$t7,$zero -/* 4cb38: 0c012e18 */ jal __osContRamRead -/* 4cb3c: 02203825 */ or $a3,$s1,$zero -/* 4cb40: 26100001 */ addiu $s0,$s0,0x1 -/* 4cb44: 2a010008 */ slti $at,$s0,0x8 -/* 4cb48: 1420fff4 */ bnez $at,.L0004cb1c -/* 4cb4c: 26310020 */ addiu $s1,$s1,0x20 -/* 4cb50: 02802025 */ or $a0,$s4,$zero -/* 4cb54: 0c013024 */ jal __osSumCalc -/* 4cb58: 8fa5003c */ lw $a1,0x3c($sp) -/* 4cb5c: 8fa8005c */ lw $t0,0x5c($sp) -/* 4cb60: 305800ff */ andi $t8,$v0,0xff -/* 4cb64: 00008025 */ or $s0,$zero,$zero -/* 4cb68: 91190001 */ lbu $t9,0x1($t0) -/* 4cb6c: 8fb1005c */ lw $s1,0x5c($sp) -/* 4cb70: 13190003 */ beq $t8,$t9,.L0004cb80 -/* 4cb74: 00000000 */ nop -/* 4cb78: 1000001b */ b .L0004cbe8 -/* 4cb7c: 24020003 */ addiu $v0,$zero,0x3 -.L0004cb80: -/* 4cb80: 8e490054 */ lw $t1,0x54($s2) -/* 4cb84: 8e440004 */ lw $a0,0x4($s2) -/* 4cb88: 8e450008 */ lw $a1,0x8($s2) -/* 4cb8c: 01335021 */ addu $t2,$t1,$s3 -/* 4cb90: 01503021 */ addu $a2,$t2,$s0 -/* 4cb94: 30ccffff */ andi $t4,$a2,0xffff -/* 4cb98: 01803025 */ or $a2,$t4,$zero -/* 4cb9c: afa00010 */ sw $zero,0x10($sp) -/* 4cba0: 0c012d84 */ jal __osContRamWrite -/* 4cba4: 02203825 */ or $a3,$s1,$zero -/* 4cba8: 26100001 */ addiu $s0,$s0,0x1 -/* 4cbac: 24010008 */ addiu $at,$zero,0x8 -/* 4cbb0: 1601fff3 */ bne $s0,$at,.L0004cb80 -/* 4cbb4: 26310020 */ addiu $s1,$s1,0x20 -.L0004cbb8: -/* 4cbb8: 93ab0067 */ lbu $t3,0x67($sp) -.L0004cbbc: -/* 4cbbc: 3c018006 */ lui $at,%hi(var80060984) -/* 4cbc0: 3c05800a */ lui $a1,%hi(var8009c870) -/* 4cbc4: 24a5c870 */ addiu $a1,$a1,%lo(var8009c870) -/* 4cbc8: 8fa4005c */ lw $a0,0x5c($sp) -/* 4cbcc: 24060100 */ addiu $a2,$zero,0x100 -/* 4cbd0: 0c012c5c */ jal bcopy -/* 4cbd4: a02b0984 */ sb $t3,%lo(var80060984)($at) -/* 4cbd8: 8e4e0008 */ lw $t6,0x8($s2) -/* 4cbdc: 3c018006 */ lui $at,%hi(var80060980) -/* 4cbe0: 00001025 */ or $v0,$zero,$zero -/* 4cbe4: ac2e0980 */ sw $t6,%lo(var80060980)($at) -.L0004cbe8: -/* 4cbe8: 8fbf0034 */ lw $ra,0x34($sp) -.L0004cbec: -/* 4cbec: 8fb00020 */ lw $s0,0x20($sp) -/* 4cbf0: 8fb10024 */ lw $s1,0x24($sp) -/* 4cbf4: 8fb20028 */ lw $s2,0x28($sp) -/* 4cbf8: 8fb3002c */ lw $s3,0x2c($sp) -/* 4cbfc: 8fb40030 */ lw $s4,0x30($sp) -/* 4cc00: 03e00008 */ jr $ra -/* 4cc04: 27bd0058 */ addiu $sp,$sp,0x58 -); +s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank) +{ + u8 sum; + int j; + s32 ret; + int offset; + u8 *addr; + static __OSInode prevnode; + + if (flag == 0 && bank == g_PfsPrevBank && pfs->channel == g_PfsPrevChannel) { + bcopy(&prevnode, inode, sizeof(__OSInode)); + return 0; + } + + if (pfs->activebank != 0) { + ERRCK(__osPfsSelectBank(pfs, 0)); + } + + offset = (bank > 0) ? 1 : pfs->inode_start_page; + + if (flag == PFS_WRITE) { + inode->inode_page[0].inode_t.page = __osSumCalc((u8*)&inode->inode_page[offset], (-offset) * 2 + 256); + } + + for (j = 0; j < 8; j++) { + addr = ((u8 *)inode->inode_page + j * 32); + + if (flag == PFS_WRITE) { + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * 8 + j, addr, FALSE); + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + bank * 8 + j, addr, FALSE); + } else { + ret = __osContRamRead(pfs->queue, pfs->channel, pfs->inode_table + bank * 8 + j, addr); + } + + if (ret != 0) { + return ret; + } + } + + if (flag == PFS_READ) { + sum = __osSumCalc((u8*)&inode->inode_page[offset], (-offset) * 2 + 256); + + if (sum != inode->inode_page[0].inode_t.page) { + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8 *)inode->inode_page + j * 32); + ret = __osContRamRead(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr); + } + + sum = __osSumCalc((u8*)&inode->inode_page[offset], (-offset) * 2 + 256); + + if (sum != inode->inode_page[0].inode_t.page) { + return PFS_ERR_INCONSISTENT; + } + + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8 *)inode->inode_page + j * 32); + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr, FALSE); + } + } + } + + g_PfsPrevBank = bank; + bcopy(inode, &prevnode, sizeof(__OSInode)); + g_PfsPrevChannel = pfs->channel; + + return 0; +} diff --git a/src/lib/lib_4ce60.c b/src/lib/lib_4ce60.c index 3f6cfaeb3..81706bb9f 100644 --- a/src/lib/lib_4ce60.c +++ b/src/lib/lib_4ce60.c @@ -42,7 +42,7 @@ glabel func0004ce60 /* 4ced4: 02802025 */ or $a0,$s4,$zero /* 4ced8: 27a50048 */ addiu $a1,$sp,0x48 /* 4cedc: 00003025 */ or $a2,$zero,$zero -/* 4cee0: 0c01324d */ jal func0004c934 +/* 4cee0: 0c01324d */ jal __osPfsRWInode /* 4cee4: 326700ff */ andi $a3,$s3,0xff /* 4cee8: 10400003 */ beqz $v0,.L0004cef8 /* 4ceec: 00000000 */ nop diff --git a/src/lib/lib_4d000.c b/src/lib/lib_4d000.c index 4a9627607..666f54d01 100644 --- a/src/lib/lib_4d000.c +++ b/src/lib/lib_4d000.c @@ -116,7 +116,7 @@ glabel func0004d000 /* 4d168: 02602025 */ or $a0,$s3,$zero /* 4d16c: 02402825 */ or $a1,$s2,$zero /* 4d170: 00003025 */ or $a2,$zero,$zero -/* 4d174: 0c01324d */ jal func0004c934 +/* 4d174: 0c01324d */ jal __osPfsRWInode /* 4d178: 320700ff */ andi $a3,$s0,0xff /* 4d17c: 10400003 */ beqz $v0,.L0004d18c /* 4d180: 02602025 */ or $a0,$s3,$zero @@ -152,7 +152,7 @@ glabel func0004d000 /* 4d1ec: 02602025 */ or $a0,$s3,$zero /* 4d1f0: 02202825 */ or $a1,$s1,$zero /* 4d1f4: 24060001 */ addiu $a2,$zero,0x1 -/* 4d1f8: 0c01324d */ jal func0004c934 +/* 4d1f8: 0c01324d */ jal __osPfsRWInode /* 4d1fc: 32e700ff */ andi $a3,$s7,0xff /* 4d200: 50400004 */ beqzl $v0,.L0004d214 /* 4d204: 8fa80290 */ lw $t0,0x290($sp) @@ -179,7 +179,7 @@ glabel func0004d000 /* 4d24c: 02602025 */ or $a0,$s3,$zero /* 4d250: 02402825 */ or $a1,$s2,$zero /* 4d254: 24060001 */ addiu $a2,$zero,0x1 -/* 4d258: 0c01324d */ jal func0004c934 +/* 4d258: 0c01324d */ jal __osPfsRWInode /* 4d25c: 320700ff */ andi $a3,$s0,0xff /* 4d260: 10400009 */ beqz $v0,.L0004d288 /* 4d264: 00000000 */ nop diff --git a/src/lib/lib_4d480.c b/src/lib/lib_4d480.c index af91a557a..c951726a8 100644 --- a/src/lib/lib_4d480.c +++ b/src/lib/lib_4d480.c @@ -75,7 +75,7 @@ glabel func0004d480 .L0004d564: /* 4d564: 02202825 */ or $a1,$s1,$zero /* 4d568: 00003025 */ or $a2,$zero,$zero -/* 4d56c: 0c01324d */ jal func0004c934 +/* 4d56c: 0c01324d */ jal __osPfsRWInode /* 4d570: 320700ff */ andi $a3,$s0,0xff /* 4d574: 10400003 */ beqz $v0,.L0004d584 /* 4d578: 02402025 */ or $a0,$s2,$zero @@ -94,7 +94,7 @@ glabel func0004d480 .L0004d5a8: /* 4d5a8: 02202825 */ or $a1,$s1,$zero /* 4d5ac: 24060001 */ addiu $a2,$zero,0x1 -/* 4d5b0: 0c01324d */ jal func0004c934 +/* 4d5b0: 0c01324d */ jal __osPfsRWInode /* 4d5b4: 320700ff */ andi $a3,$s0,0xff /* 4d5b8: 10400003 */ beqz $v0,.L0004d5c8 /* 4d5bc: 97ac0044 */ lhu $t4,0x44($sp) diff --git a/src/lib/lib_4d6f0.c b/src/lib/lib_4d6f0.c index 6cd743f7e..9aff46448 100644 --- a/src/lib/lib_4d6f0.c +++ b/src/lib/lib_4d6f0.c @@ -106,7 +106,7 @@ glabel osPfsChecker /* 4d844: 02602025 */ or $a0,$s3,$zero /* 4d848: 02a02825 */ or $a1,$s5,$zero /* 4d84c: 00003025 */ or $a2,$zero,$zero -/* 4d850: 0c01324d */ jal func0004c934 +/* 4d850: 0c01324d */ jal __osPfsRWInode /* 4d854: 332700ff */ andi $a3,$t9,0xff /* 4d858: 0040b825 */ or $s7,$v0,$zero /* 4d85c: 32de00ff */ andi $s8,$s6,0xff @@ -242,7 +242,7 @@ glabel osPfsChecker /* 4da24: 02602025 */ or $a0,$s3,$zero /* 4da28: 02a02825 */ or $a1,$s5,$zero /* 4da2c: 00003025 */ or $a2,$zero,$zero -/* 4da30: 0c01324d */ jal func0004c934 +/* 4da30: 0c01324d */ jal __osPfsRWInode /* 4da34: 32c700ff */ andi $a3,$s6,0xff /* 4da38: 10400006 */ beqz $v0,.L0004da54 /* 4da3c: 27a804bc */ addiu $t0,$sp,0x4bc @@ -346,7 +346,7 @@ glabel osPfsChecker /* 4db90: 5420ffe3 */ bnezl $at,.L0004db20 /* 4db94: 90990000 */ lbu $t9,0x0($a0) .L0004db98: -/* 4db98: 0c01324d */ jal func0004c934 +/* 4db98: 0c01324d */ jal __osPfsRWInode /* 4db9c: 02602025 */ or $a0,$s3,$zero /* 4dba0: 50400004 */ beqzl $v0,.L0004dbb4 /* 4dba4: 926d0064 */ lbu $t5,0x64($s3) @@ -435,7 +435,7 @@ glabel func0004dc28 .L0004dcc0: /* 4dcc0: 02a02825 */ or $a1,$s5,$zero /* 4dcc4: 00003025 */ or $a2,$zero,$zero -/* 4dcc8: 0c01324d */ jal func0004c934 +/* 4dcc8: 0c01324d */ jal __osPfsRWInode /* 4dccc: 32e700ff */ andi $a3,$s7,0xff /* 4dcd0: 10400005 */ beqz $v0,.L0004dce8 /* 4dcd4: 24010003 */ addiu $at,$zero,0x3 @@ -660,7 +660,7 @@ glabel func0004def4 /* 4dfc0: 02602825 */ or $a1,$s3,$zero /* 4dfc4: 11e2000a */ beq $t7,$v0,.L0004dff0 /* 4dfc8: 00003025 */ or $a2,$zero,$zero -/* 4dfcc: 0c01324d */ jal func0004c934 +/* 4dfcc: 0c01324d */ jal __osPfsRWInode /* 4dfd0: 324700ff */ andi $a3,$s2,0xff /* 4dfd4: 50400006 */ beqzl $v0,.L0004dff0 /* 4dfd8: a2720100 */ sb $s2,0x100($s3) diff --git a/src/lib/lib_50480.c b/src/lib/lib_50480.c index ba145cfa4..e6c2ec45e 100644 --- a/src/lib/lib_50480.c +++ b/src/lib/lib_50480.c @@ -22,7 +22,7 @@ glabel func00050480 /* 504ac: a0a20000 */ sb $v0,0x0($a1) /* 504b0: 91c70000 */ lbu $a3,0x0($t6) /* 504b4: afa40020 */ sw $a0,0x20($sp) -/* 504b8: 0c01324d */ jal func0004c934 +/* 504b8: 0c01324d */ jal __osPfsRWInode /* 504bc: 8fa50028 */ lw $a1,0x28($sp) /* 504c0: 10400003 */ beqz $v0,.L000504d0 /* 504c4: 8fa40020 */ lw $a0,0x20($sp) diff --git a/src/lib/lib_50a00.c b/src/lib/lib_50a00.c index 8904ad52d..1c1f2c22e 100644 --- a/src/lib/lib_50a00.c +++ b/src/lib/lib_50a00.c @@ -96,7 +96,7 @@ glabel func00050a00 /* 50b1c: 12190008 */ beq $s0,$t9,.L00050b40 /* 50b20: 00003025 */ or $a2,$zero,$zero /* 50b24: 03208025 */ or $s0,$t9,$zero -/* 50b28: 0c01324d */ jal func0004c934 +/* 50b28: 0c01324d */ jal __osPfsRWInode /* 50b2c: 332700ff */ andi $a3,$t9,0xff /* 50b30: 50400004 */ beqzl $v0,.L00050b44 /* 50b34: 93a80035 */ lbu $t0,0x35($sp) diff --git a/src/lib/ultra/io/pfsgetstatus.c b/src/lib/ultra/io/pfsgetstatus.c index 6cfa870d7..3188eb3b4 100644 --- a/src/lib/ultra/io/pfsgetstatus.c +++ b/src/lib/ultra/io/pfsgetstatus.c @@ -12,7 +12,7 @@ s32 __osPfsGetStatus(OSMesgQueue *queue, int channel) OSContStatus data; ret = 0; - var80060984 = 0xfa; + g_PfsPrevBank = 0xfa; __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);