From 9e8680d3b8ed4111025cc38d70ad008c1418a3c7 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Mon, 27 Sep 2021 15:24:44 -0400 Subject: [PATCH] MAtch osPfsFindFile --- .../unknown_0D1A80/osPfsFindFile.s | 127 ------------------ lib/src/os/osEepromWrite.c | 33 ++--- lib/src/os/osInvalDCache.c | 1 + lib/src/os/osPfsFindFile.c | 45 ++++++- 4 files changed, 55 insertions(+), 151 deletions(-) delete mode 100644 lib/asm/non_matchings/unknown_0D1A80/osPfsFindFile.s diff --git a/lib/asm/non_matchings/unknown_0D1A80/osPfsFindFile.s b/lib/asm/non_matchings/unknown_0D1A80/osPfsFindFile.s deleted file mode 100644 index eee24ea8..00000000 --- a/lib/asm/non_matchings/unknown_0D1A80/osPfsFindFile.s +++ /dev/null @@ -1,127 +0,0 @@ -glabel osPfsFindFile -/* 0D1A80 800D0E80 27BDFFB8 */ addiu $sp, $sp, -0x48 -/* 0D1A84 800D0E84 AFBF0014 */ sw $ra, 0x14($sp) -/* 0D1A88 800D0E88 AFA40048 */ sw $a0, 0x48($sp) -/* 0D1A8C 800D0E8C AFA5004C */ sw $a1, 0x4c($sp) -/* 0D1A90 800D0E90 AFA60050 */ sw $a2, 0x50($sp) -/* 0D1A94 800D0E94 AFA70054 */ sw $a3, 0x54($sp) -/* 0D1A98 800D0E98 AFA0001C */ sw $zero, 0x1c($sp) -/* 0D1A9C 800D0E9C 0C0356F0 */ jal __osCheckId -/* 0D1AA0 800D0EA0 8FA40048 */ lw $a0, 0x48($sp) -/* 0D1AA4 800D0EA4 24010002 */ li $at, 2 -/* 0D1AA8 800D0EA8 14410003 */ bne $v0, $at, .L800D0EB8 -/* 0D1AAC 800D0EAC 00000000 */ nop -/* 0D1AB0 800D0EB0 1000005C */ b .L800D1024 -/* 0D1AB4 800D0EB4 24020002 */ li $v0, 2 -.L800D0EB8: -/* 0D1AB8 800D0EB8 8FAE0048 */ lw $t6, 0x48($sp) -/* 0D1ABC 800D0EBC AFA00044 */ sw $zero, 0x44($sp) -/* 0D1AC0 800D0EC0 8DCF0050 */ lw $t7, 0x50($t6) -/* 0D1AC4 800D0EC4 19E00053 */ blez $t7, .L800D1014 -/* 0D1AC8 800D0EC8 00000000 */ nop -.L800D0ECC: -/* 0D1ACC 800D0ECC 8FB80048 */ lw $t8, 0x48($sp) -/* 0D1AD0 800D0ED0 8FA80044 */ lw $t0, 0x44($sp) -/* 0D1AD4 800D0ED4 27A70020 */ addiu $a3, $sp, 0x20 -/* 0D1AD8 800D0ED8 8F19005C */ lw $t9, 0x5c($t8) -/* 0D1ADC 800D0EDC 8F040004 */ lw $a0, 4($t8) -/* 0D1AE0 800D0EE0 8F050008 */ lw $a1, 8($t8) -/* 0D1AE4 800D0EE4 0C033728 */ jal __osContRamRead -/* 0D1AE8 800D0EE8 03283021 */ addu $a2, $t9, $t0 -/* 0D1AEC 800D0EEC AFA2001C */ sw $v0, 0x1c($sp) -/* 0D1AF0 800D0EF0 8FA9001C */ lw $t1, 0x1c($sp) -/* 0D1AF4 800D0EF4 11200003 */ beqz $t1, .L800D0F04 -/* 0D1AF8 800D0EF8 00000000 */ nop -/* 0D1AFC 800D0EFC 10000049 */ b .L800D1024 -/* 0D1B00 800D0F00 01201025 */ move $v0, $t1 -.L800D0F04: -/* 0D1B04 800D0F04 97AA0024 */ lhu $t2, 0x24($sp) -/* 0D1B08 800D0F08 97AB004E */ lhu $t3, 0x4e($sp) -/* 0D1B0C 800D0F0C 154B0039 */ bne $t2, $t3, .L800D0FF4 -/* 0D1B10 800D0F10 00000000 */ nop -/* 0D1B14 800D0F14 8FAC0020 */ lw $t4, 0x20($sp) -/* 0D1B18 800D0F18 8FAD0050 */ lw $t5, 0x50($sp) -/* 0D1B1C 800D0F1C 158D0035 */ bne $t4, $t5, .L800D0FF4 -/* 0D1B20 800D0F20 00000000 */ nop -/* 0D1B24 800D0F24 8FAE0054 */ lw $t6, 0x54($sp) -/* 0D1B28 800D0F28 AFA00018 */ sw $zero, 0x18($sp) -/* 0D1B2C 800D0F2C 11C00012 */ beqz $t6, .L800D0F78 -/* 0D1B30 800D0F30 00000000 */ nop -/* 0D1B34 800D0F34 AFA00040 */ sw $zero, 0x40($sp) -.L800D0F38: -/* 0D1B38 800D0F38 8FB80040 */ lw $t8, 0x40($sp) -/* 0D1B3C 800D0F3C 8FAF0054 */ lw $t7, 0x54($sp) -/* 0D1B40 800D0F40 03B84821 */ addu $t1, $sp, $t8 -/* 0D1B44 800D0F44 01F8C821 */ addu $t9, $t7, $t8 -/* 0D1B48 800D0F48 93280000 */ lbu $t0, ($t9) -/* 0D1B4C 800D0F4C 91290030 */ lbu $t1, 0x30($t1) -/* 0D1B50 800D0F50 11090004 */ beq $t0, $t1, .L800D0F64 -/* 0D1B54 800D0F54 00000000 */ nop -/* 0D1B58 800D0F58 240A0001 */ li $t2, 1 -/* 0D1B5C 800D0F5C 10000006 */ b .L800D0F78 -/* 0D1B60 800D0F60 AFAA0018 */ sw $t2, 0x18($sp) -.L800D0F64: -/* 0D1B64 800D0F64 8FAB0040 */ lw $t3, 0x40($sp) -/* 0D1B68 800D0F68 256C0001 */ addiu $t4, $t3, 1 -/* 0D1B6C 800D0F6C 29810010 */ slti $at, $t4, 0x10 -/* 0D1B70 800D0F70 1420FFF1 */ bnez $at, .L800D0F38 -/* 0D1B74 800D0F74 AFAC0040 */ sw $t4, 0x40($sp) -.L800D0F78: -/* 0D1B78 800D0F78 8FAD0058 */ lw $t5, 0x58($sp) -/* 0D1B7C 800D0F7C 11A00015 */ beqz $t5, .L800D0FD4 -/* 0D1B80 800D0F80 00000000 */ nop -/* 0D1B84 800D0F84 8FAE0018 */ lw $t6, 0x18($sp) -/* 0D1B88 800D0F88 15C00012 */ bnez $t6, .L800D0FD4 -/* 0D1B8C 800D0F8C 00000000 */ nop -/* 0D1B90 800D0F90 AFA00040 */ sw $zero, 0x40($sp) -.L800D0F94: -/* 0D1B94 800D0F94 8FB90040 */ lw $t9, 0x40($sp) -/* 0D1B98 800D0F98 8FAF0058 */ lw $t7, 0x58($sp) -/* 0D1B9C 800D0F9C 03B94821 */ addu $t1, $sp, $t9 -/* 0D1BA0 800D0FA0 01F9C021 */ addu $t8, $t7, $t9 -/* 0D1BA4 800D0FA4 93080000 */ lbu $t0, ($t8) -/* 0D1BA8 800D0FA8 9129002C */ lbu $t1, 0x2c($t1) -/* 0D1BAC 800D0FAC 11090004 */ beq $t0, $t1, .L800D0FC0 -/* 0D1BB0 800D0FB0 00000000 */ nop -/* 0D1BB4 800D0FB4 240A0001 */ li $t2, 1 -/* 0D1BB8 800D0FB8 10000006 */ b .L800D0FD4 -/* 0D1BBC 800D0FBC AFAA0018 */ sw $t2, 0x18($sp) -.L800D0FC0: -/* 0D1BC0 800D0FC0 8FAB0040 */ lw $t3, 0x40($sp) -/* 0D1BC4 800D0FC4 256C0001 */ addiu $t4, $t3, 1 -/* 0D1BC8 800D0FC8 29810004 */ slti $at, $t4, 4 -/* 0D1BCC 800D0FCC 1420FFF1 */ bnez $at, .L800D0F94 -/* 0D1BD0 800D0FD0 AFAC0040 */ sw $t4, 0x40($sp) -.L800D0FD4: -/* 0D1BD4 800D0FD4 8FAD0018 */ lw $t5, 0x18($sp) -/* 0D1BD8 800D0FD8 15A00006 */ bnez $t5, .L800D0FF4 -/* 0D1BDC 800D0FDC 00000000 */ nop -/* 0D1BE0 800D0FE0 8FAE0044 */ lw $t6, 0x44($sp) -/* 0D1BE4 800D0FE4 8FAF005C */ lw $t7, 0x5c($sp) -/* 0D1BE8 800D0FE8 ADEE0000 */ sw $t6, ($t7) -/* 0D1BEC 800D0FEC 1000000D */ b .L800D1024 -/* 0D1BF0 800D0FF0 8FA2001C */ lw $v0, 0x1c($sp) -.L800D0FF4: -/* 0D1BF4 800D0FF4 8FB80044 */ lw $t8, 0x44($sp) -/* 0D1BF8 800D0FF8 8FA80048 */ lw $t0, 0x48($sp) -/* 0D1BFC 800D0FFC 27190001 */ addiu $t9, $t8, 1 -/* 0D1C00 800D1000 AFB90044 */ sw $t9, 0x44($sp) -/* 0D1C04 800D1004 8D090050 */ lw $t1, 0x50($t0) -/* 0D1C08 800D1008 0329082A */ slt $at, $t9, $t1 -/* 0D1C0C 800D100C 1420FFAF */ bnez $at, .L800D0ECC -/* 0D1C10 800D1010 00000000 */ nop -.L800D1014: -/* 0D1C14 800D1014 8FAB005C */ lw $t3, 0x5c($sp) -/* 0D1C18 800D1018 240AFFFF */ li $t2, -1 -/* 0D1C1C 800D101C 24020005 */ li $v0, 5 -/* 0D1C20 800D1020 AD6A0000 */ sw $t2, ($t3) -.L800D1024: -/* 0D1C24 800D1024 8FBF0014 */ lw $ra, 0x14($sp) -/* 0D1C28 800D1028 27BD0048 */ addiu $sp, $sp, 0x48 -/* 0D1C2C 800D102C 03E00008 */ jr $ra -/* 0D1C30 800D1030 00000000 */ nop - -/* 0D1C34 800D1034 00000000 */ nop -/* 0D1C38 800D1038 00000000 */ nop -/* 0D1C3C 800D103C 00000000 */ nop - diff --git a/lib/src/os/osEepromWrite.c b/lib/src/os/osEepromWrite.c index b8d80b34..a9884f24 100644 --- a/lib/src/os/osEepromWrite.c +++ b/lib/src/os/osEepromWrite.c @@ -7,9 +7,7 @@ #include "siint.h" void __osPackEepWriteData(u8 address, u8 *buffer); -s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) -{ - +s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) { s32 ret; int i; u8 *ptr; @@ -28,12 +26,10 @@ s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) ret = __osEepStatus(mq, &sdata); - if (ret != 0 || sdata.type != CONT_EEPROM) - { + if (ret != 0 || sdata.type != CONT_EEPROM) { return CONT_NO_RESPONSE_ERROR; } - while (sdata.status & CONT_EEPROM_BUSY) - { + while (sdata.status & CONT_EEPROM_BUSY) { __osEepStatus(mq, &sdata); } __osPackEepWriteData(address, buffer); @@ -48,8 +44,8 @@ s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); //recv response __osContLastCmd = CONT_CMD_WRITE_EEPROM; osRecvMesg(mq, NULL, OS_MESG_BLOCK); - for (i = 0; i < 4; i++) //skip the first 4 bytes - { + //skip the first 4 bytes + for (i = 0; i < 4; i++) { ptr++; } eepromformat = *(__OSContEepromFormat *)ptr; @@ -61,14 +57,12 @@ s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) return ret; } -void __osPackEepWriteData(u8 address, u8 *buffer) -{ +void __osPackEepWriteData(u8 address, u8 *buffer) { u8 *ptr; __OSContEepromFormat eepromformat; int i; ptr = (u8 *)&__osEepPifRam.ramarray; - for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) - { + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { __osEepPifRam.ramarray[i] = CONT_CMD_NOP; } __osEepPifRam.pifstatus = CONT_CMD_EXE; @@ -77,12 +71,11 @@ void __osPackEepWriteData(u8 address, u8 *buffer) eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX; eepromformat.cmd = CONT_CMD_WRITE_EEPROM; eepromformat.address = address; - for (i = 0; i < ARRLEN(eepromformat.data); i++) - { + for (i = 0; i < ARRLEN(eepromformat.data); i++) { eepromformat.data[i] = *buffer++; } - for (i = 0; i < 4; i++) //skip the first 4 bytes - { + //skip the first 4 bytes + for (i = 0; i < 4; i++) { *ptr++ = 0; } *(__OSContEepromFormat *)(ptr) = eepromformat; @@ -90,8 +83,7 @@ void __osPackEepWriteData(u8 address, u8 *buffer) ptr[0] = CONT_CMD_END; } -s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) -{ +s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) { s32 ret; s32 i; u8 *ptr; @@ -99,8 +91,7 @@ s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) ret = 0; ptr = (u8 *)__osEepPifRam.ramarray; - for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) - { + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { __osEepPifRam.ramarray[i] = 0; } __osEepPifRam.pifstatus = CONT_CMD_EXE; diff --git a/lib/src/os/osInvalDCache.c b/lib/src/os/osInvalDCache.c index 132bd1c4..08cbb7ef 100644 --- a/lib/src/os/osInvalDCache.c +++ b/lib/src/os/osInvalDCache.c @@ -4,4 +4,5 @@ #include "types.h" #include "macros.h" +//Most likely hand written and unable to be be decomped GLOBAL_ASM("lib/asm/non_matchings/unknown_0D23F0/osInvalDCache.s") diff --git a/lib/src/os/osPfsFindFile.c b/lib/src/os/osPfsFindFile.c index 0fdb9412..661db5ac 100644 --- a/lib/src/os/osPfsFindFile.c +++ b/lib/src/os/osPfsFindFile.c @@ -1,7 +1,46 @@ /* The comment below is needed for this file to be picked up by generate_ld */ /* RAM_POS: 0x800D0E80 */ -#include "types.h" -#include "macros.h" +#include "libultra_internal.h" +#include "controller.h" -GLOBAL_ASM("lib/asm/non_matchings/unknown_0D1A80/osPfsFindFile.s") +s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name, s32 *file_no) { + s32 j; + int i; + __OSDir dir; + s32 ret; + int fail; + ret = 0; + PFS_CHECK_ID; + + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&dir)); + if ((dir.company_code == company_code) && dir.game_code == game_code) { + fail = FALSE; + if (game_name != NULL) { + for (i = 0; i < ARRLEN(dir.game_name); i++) { + if (dir.game_name[i] != game_name[i]) { + fail = TRUE; + break; + } + } + } + if (ext_name != NULL && !fail) { + for (i = 0; i < ARRLEN(dir.ext_name); i++) { + if (dir.ext_name[i] != ext_name[i]) { + fail = TRUE; + break; + } + } + } + if (!fail) { + *file_no = j; + return ret; + } + } + } + + *file_no = -1; + + return PFS_ERR_INVALID; +}