From 3433bd93d4c4a0ebb885439f0a64afabac87ee9f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 12 Oct 2021 08:06:55 +1000 Subject: [PATCH] Decompile __osPfsCheckRamArea2 --- Makefile | 1 + ld/libfiles.ntsc-final.inc | 2 +- ld/libfiles.pal-final.inc | 2 +- src/include/lib/lib_51570.h | 9 -- src/lib/lib_51570.c | 175 --------------------------------- src/lib/ultra/io/pfsinitpak2.c | 135 +++++++++++++++++++++++++ 6 files changed, 138 insertions(+), 186 deletions(-) delete mode 100644 src/include/lib/lib_51570.h delete mode 100644 src/lib/lib_51570.c create mode 100644 src/lib/ultra/io/pfsinitpak2.c diff --git a/Makefile b/Makefile index 9eca094fa..17c1e126b 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/ld/libfiles.ntsc-final.inc b/ld/libfiles.ntsc-final.inc index 91e282a52..0ca38cd47 100644 --- a/ld/libfiles.ntsc-final.inc +++ b/ld/libfiles.ntsc-final.inc @@ -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); \ diff --git a/ld/libfiles.pal-final.inc b/ld/libfiles.pal-final.inc index 7730b17e2..4eebf7394 100644 --- a/ld/libfiles.pal-final.inc +++ b/ld/libfiles.pal-final.inc @@ -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); \ diff --git a/src/include/lib/lib_51570.h b/src/include/lib/lib_51570.h deleted file mode 100644 index 0c7aa8f66..000000000 --- a/src/include/lib/lib_51570.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _IN_LIB_LIB_51570_H -#define _IN_LIB_LIB_51570_H -#include -#include "data.h" -#include "types.h" - -s32 func00051778(OSPfs *pfs); - -#endif diff --git a/src/lib/lib_51570.c b/src/lib/lib_51570.c deleted file mode 100644 index 55954c170..000000000 --- a/src/lib/lib_51570.c +++ /dev/null @@ -1,175 +0,0 @@ -#include -#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 -); diff --git a/src/lib/ultra/io/pfsinitpak2.c b/src/lib/ultra/io/pfsinitpak2.c new file mode 100644 index 000000000..6bbe27e16 --- /dev/null +++ b/src/lib/ultra/io/pfsinitpak2.c @@ -0,0 +1,135 @@ +#include +#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); +}