Decompile __osPfsCheckRamArea2

This commit is contained in:
Ryan Dwyer 2021-10-12 08:06:55 +10:00
parent e5b7413a32
commit 3433bd93d4
6 changed files with 138 additions and 186 deletions

View File

@ -85,6 +85,7 @@ $(B_DIR)/lib/ultra/io/motor.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfschecker.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfsfreeblocks.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfsgetstatus.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/io/pfsinitpak2.o: LOOPUNROLL :=
$(B_DIR)/lib/ultra/libc/ll.o: MIPSISET := -mips3 -o32
$(B_DIR)/lib/ultra/libc/llcvt.o: MIPSISET := -mips3 -32

View File

@ -207,7 +207,7 @@
build/ROMID/lib/ultra/io/gbpakreadid.o (section); \
build/ROMID/lib/ultra/io/gbpakcheckconnector.o (section); \
build/ROMID/lib/ultra/io/gbpakreadwrite.o (section); \
build/ROMID/lib/lib_51570.o (section); \
build/ROMID/lib/ultra/io/pfsinitpak2.o (section); \
build/ROMID/lib/ultra/io/vimodepallan1.o (section); \
build/ROMID/lib/ultra/io/vimodempallan1.o (section); \
build/ROMID/lib/ultra/io/vimodentsclan1.o (section); \

View File

@ -207,7 +207,7 @@
build/ROMID/lib/ultra/io/gbpakreadid.o (section); \
build/ROMID/lib/ultra/io/gbpakcheckconnector.o (section); \
build/ROMID/lib/ultra/io/gbpakreadwrite.o (section); \
build/ROMID/lib/lib_51570.o (section); \
build/ROMID/lib/ultra/io/pfsinitpak2.o (section); \
build/ROMID/lib/ultra/io/vimodepallan1.o (section); \
build/ROMID/lib/ultra/io/vimodempallan1.o (section); \
build/ROMID/lib/ultra/io/vimodentsclan1.o (section); \

View File

@ -1,9 +0,0 @@
#ifndef _IN_LIB_LIB_51570_H
#define _IN_LIB_LIB_51570_H
#include <ultra64.h>
#include "data.h"
#include "types.h"
s32 func00051778(OSPfs *pfs);
#endif

View File

@ -1,175 +0,0 @@
#include <ultra64.h>
#include "libultra_internal.h"
#include "constants.h"
#include "bss.h"
#include "data.h"
#include "types.h"
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
/* 51778: 27bdff68 */ addiu $sp,$sp,-152
/* 5177c: afbf0024 */ sw $ra,0x24($sp)
/* 51780: afb00020 */ sw $s0,0x20($sp)
/* 51784: 00808025 */ or $s0,$a0,$zero
/* 51788: 0c013378 */ jal __osPfsSelectBank
/* 5178c: 00002825 */ or $a1,$zero,$zero
/* 51790: 10400003 */ beqz $v0,.L000517a0
/* 51794: 00003025 */ or $a2,$zero,$zero
/* 51798: 10000034 */ b .L0005186c
/* 5179c: 8fbf0024 */ lw $ra,0x24($sp)
.L000517a0:
/* 517a0: 8e040004 */ lw $a0,0x4($s0)
/* 517a4: 8e050008 */ lw $a1,0x8($s0)
/* 517a8: 0c012e18 */ jal __osContRamRead
/* 517ac: 27a70030 */ addiu $a3,$sp,0x30
/* 517b0: 10400003 */ beqz $v0,.L000517c0
/* 517b4: 27a30070 */ addiu $v1,$sp,0x70
/* 517b8: 1000002c */ b .L0005186c
/* 517bc: 8fbf0024 */ lw $ra,0x24($sp)
.L000517c0:
/* 517c0: 00001025 */ or $v0,$zero,$zero
/* 517c4: 24040020 */ addiu $a0,$zero,0x20
.L000517c8:
/* 517c8: 244e0001 */ addiu $t6,$v0,0x1
/* 517cc: 244f0002 */ addiu $t7,$v0,0x2
/* 517d0: 24580003 */ addiu $t8,$v0,0x3
/* 517d4: a0620000 */ sb $v0,0x0($v1)
/* 517d8: 24420004 */ addiu $v0,$v0,0x4
/* 517dc: a0780003 */ sb $t8,0x3($v1)
/* 517e0: a06f0002 */ sb $t7,0x2($v1)
/* 517e4: a06e0001 */ sb $t6,0x1($v1)
/* 517e8: 1444fff7 */ bne $v0,$a0,.L000517c8
/* 517ec: 24630004 */ addiu $v1,$v1,0x4
/* 517f0: 8e040004 */ lw $a0,0x4($s0)
/* 517f4: 8e050008 */ lw $a1,0x8($s0)
/* 517f8: afa00010 */ sw $zero,0x10($sp)
/* 517fc: 00003025 */ or $a2,$zero,$zero
/* 51800: 0c012d84 */ jal __osContRamWrite
/* 51804: 27a70070 */ addiu $a3,$sp,0x70
/* 51808: 10400003 */ beqz $v0,.L00051818
/* 5180c: 00003025 */ or $a2,$zero,$zero
/* 51810: 10000016 */ b .L0005186c
/* 51814: 8fbf0024 */ lw $ra,0x24($sp)
.L00051818:
/* 51818: 8e040004 */ lw $a0,0x4($s0)
/* 5181c: 8e050008 */ lw $a1,0x8($s0)
/* 51820: 0c012e18 */ jal __osContRamRead
/* 51824: 27a70050 */ addiu $a3,$sp,0x50
/* 51828: 10400003 */ beqz $v0,.L00051838
/* 5182c: 27a40070 */ addiu $a0,$sp,0x70
/* 51830: 1000000e */ b .L0005186c
/* 51834: 8fbf0024 */ lw $ra,0x24($sp)
.L00051838:
/* 51838: 27a50050 */ addiu $a1,$sp,0x50
/* 5183c: 0c013824 */ jal bcmp
/* 51840: 24060020 */ addiu $a2,$zero,0x20
/* 51844: 10400003 */ beqz $v0,.L00051854
/* 51848: 00003025 */ or $a2,$zero,$zero
/* 5184c: 10000006 */ b .L00051868
/* 51850: 2402000b */ addiu $v0,$zero,0xb
.L00051854:
/* 51854: 8e040004 */ lw $a0,0x4($s0)
/* 51858: 8e050008 */ lw $a1,0x8($s0)
/* 5185c: afa00010 */ sw $zero,0x10($sp)
/* 51860: 0c012d84 */ jal __osContRamWrite
/* 51864: 27a70030 */ addiu $a3,$sp,0x30
.L00051868:
/* 51868: 8fbf0024 */ lw $ra,0x24($sp)
.L0005186c:
/* 5186c: 8fb00020 */ lw $s0,0x20($sp)
/* 51870: 27bd0098 */ addiu $sp,$sp,0x98
/* 51874: 03e00008 */ jr $ra
/* 51878: 00000000 */ nop
);

View File

@ -0,0 +1,135 @@
#include <ultra64.h>
#include "libultra_internal.h"
#include "constants.h"
#include "bss.h"
#include "data.h"
#include "types.h"
s32 __osPfsCheckRamArea2(OSPfs* pfs);
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 = __osPfsCheckRamArea2(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;
}
s32 __osPfsCheckRamArea2(OSPfs* pfs)
{
s32 i = 0;
s32 ret = 0;
u8 temp1[BLOCKSIZE];
u8 temp2[BLOCKSIZE];
u8 saveReg[BLOCKSIZE];
if ((ret = __osPfsSelectBank(pfs, 0)) != 0) {
return ret;
}
if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, saveReg)) != 0) {
return ret;
}
for (i = 0; i < BLOCKSIZE; i++) {
temp1[i] = i;
}
if ((ret = __osContRamWrite(pfs->queue, pfs->channel, 0, temp1, 0)) != 0) {
return ret;
}
if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, temp2)) != 0) {
return ret;
}
if (bcmp(temp1, temp2, BLOCKSIZE) != 0) {
return PFS_ERR_DEVICE;
}
return __osContRamWrite(pfs->queue, pfs->channel, 0, saveReg, 0);
}