From 71eb2486369feefbd2274d5fd82c7ee8b92c6891 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Wed, 6 Oct 2021 21:01:16 -0400 Subject: [PATCH] Identify and match osPfsInit --- .../controller_pak/func_80074B34.s | 2 +- .../controller_pak/func_800758DC.s | 4 +- .../controller_pak/func_80075B18.s | 4 +- .../unknown_0CF330/func_800CED20.s | 50 ------------ lib/src/os/osPfsInit.c | 76 +++++++++++++++++++ lib/src/os/unknown_0CF330.c | 4 +- 6 files changed, 82 insertions(+), 58 deletions(-) delete mode 100644 lib/asm/non_matchings/unknown_0CF330/func_800CED20.s create mode 100644 lib/src/os/osPfsInit.c diff --git a/asm/non_matchings/controller_pak/func_80074B34.s b/asm/non_matchings/controller_pak/func_80074B34.s index c6bc48e8..62679033 100644 --- a/asm/non_matchings/controller_pak/func_80074B34.s +++ b/asm/non_matchings/controller_pak/func_80074B34.s @@ -52,7 +52,7 @@ glabel func_80074B34 /* 0757F4 80074BF4 15C00004 */ bnez $t6, .L80074C08 /* 0757F8 80074BF8 3C048012 */ lui $a0, %hi(D_80124010) # $a0, 0x8012 /* 0757FC 80074BFC 8C844010 */ lw $a0, %lo(D_80124010)($a0) -/* 075800 80074C00 0C033B48 */ jal func_800CED20 +/* 075800 80074C00 0C033B48 */ jal osPfsInit /* 075804 80074C04 03203025 */ move $a2, $t9 .L80074C08: /* 075808 80074C08 8FA40058 */ lw $a0, 0x58($sp) diff --git a/asm/non_matchings/controller_pak/func_800758DC.s b/asm/non_matchings/controller_pak/func_800758DC.s index e05a2d72..5b31d09b 100644 --- a/asm/non_matchings/controller_pak/func_800758DC.s +++ b/asm/non_matchings/controller_pak/func_800758DC.s @@ -68,7 +68,7 @@ glabel func_800758DC /* 0765D0 800759D0 00401825 */ move $v1, $v0 /* 0765D4 800759D4 8E840000 */ lw $a0, ($s4) /* 0765D8 800759D8 02602825 */ move $a1, $s3 -/* 0765DC 800759DC 0C033B48 */ jal func_800CED20 +/* 0765DC 800759DC 0C033B48 */ jal osPfsInit /* 0765E0 800759E0 02A03025 */ move $a2, $s5 /* 0765E4 800759E4 00401825 */ move $v1, $v0 .L800759E8: @@ -90,7 +90,7 @@ glabel func_800758DC /* 07661C 80075A1C 24010001 */ li $at, 1 /* 076620 80075A20 8E840000 */ lw $a0, ($s4) /* 076624 80075A24 02602825 */ move $a1, $s3 -/* 076628 80075A28 0C033B48 */ jal func_800CED20 +/* 076628 80075A28 0C033B48 */ jal osPfsInit /* 07662C 80075A2C 02A03025 */ move $a2, $s5 /* 076630 80075A30 14520008 */ bne $v0, $s2, .L80075A54 /* 076634 80075A34 02602825 */ move $a1, $s3 diff --git a/asm/non_matchings/controller_pak/func_80075B18.s b/asm/non_matchings/controller_pak/func_80075B18.s index ec64e9dd..820b5d28 100644 --- a/asm/non_matchings/controller_pak/func_80075B18.s +++ b/asm/non_matchings/controller_pak/func_80075B18.s @@ -67,13 +67,13 @@ glabel func_80075B18 /* 076818 80075C18 018D9021 */ addu $s2, $t4, $t5 /* 07681C 80075C1C 8E840000 */ lw $a0, ($s4) /* 076820 80075C20 02402825 */ move $a1, $s2 -/* 076824 80075C24 0C033B48 */ jal func_800CED20 +/* 076824 80075C24 0C033B48 */ jal osPfsInit /* 076828 80075C28 02003025 */ move $a2, $s0 /* 07682C 80075C2C 24010002 */ li $at, 2 /* 076830 80075C30 14410004 */ bne $v0, $at, .L80075C44 /* 076834 80075C34 02402825 */ move $a1, $s2 /* 076838 80075C38 8E840000 */ lw $a0, ($s4) -/* 07683C 80075C3C 0C033B48 */ jal func_800CED20 +/* 07683C 80075C3C 0C033B48 */ jal osPfsInit /* 076840 80075C40 02003025 */ move $a2, $s0 .L80075C44: /* 076844 80075C44 14400006 */ bnez $v0, .L80075C60 diff --git a/lib/asm/non_matchings/unknown_0CF330/func_800CED20.s b/lib/asm/non_matchings/unknown_0CF330/func_800CED20.s deleted file mode 100644 index 8f362cdb..00000000 --- a/lib/asm/non_matchings/unknown_0CF330/func_800CED20.s +++ /dev/null @@ -1,50 +0,0 @@ -glabel func_800CED20 -/* 0CF920 800CED20 27BDFFE0 */ addiu $sp, $sp, -0x20 -/* 0CF924 800CED24 AFBF0014 */ sw $ra, 0x14($sp) -/* 0CF928 800CED28 AFA40020 */ sw $a0, 0x20($sp) -/* 0CF92C 800CED2C AFA50024 */ sw $a1, 0x24($sp) -/* 0CF930 800CED30 AFA60028 */ sw $a2, 0x28($sp) -/* 0CF934 800CED34 0C033594 */ jal __osSiGetAccess -/* 0CF938 800CED38 AFA0001C */ sw $zero, 0x1c($sp) -/* 0CF93C 800CED3C 8FA40020 */ lw $a0, 0x20($sp) -/* 0CF940 800CED40 0C033B75 */ jal __osPfsGetStatus -/* 0CF944 800CED44 8FA50028 */ lw $a1, 0x28($sp) -/* 0CF948 800CED48 0C0335A5 */ jal __osSiRelAccess -/* 0CF94C 800CED4C AFA2001C */ sw $v0, 0x1c($sp) -/* 0CF950 800CED50 8FAE001C */ lw $t6, 0x1c($sp) -/* 0CF954 800CED54 11C00003 */ beqz $t6, .L800CED64 -/* 0CF958 800CED58 00000000 */ nop -/* 0CF95C 800CED5C 10000019 */ b .L800CEDC4 -/* 0CF960 800CED60 01C01025 */ move $v0, $t6 -.L800CED64: -/* 0CF964 800CED64 8FAF0020 */ lw $t7, 0x20($sp) -/* 0CF968 800CED68 8FB80024 */ lw $t8, 0x24($sp) -/* 0CF96C 800CED6C AF0F0004 */ sw $t7, 4($t8) -/* 0CF970 800CED70 8FA80024 */ lw $t0, 0x24($sp) -/* 0CF974 800CED74 8FB90028 */ lw $t9, 0x28($sp) -/* 0CF978 800CED78 AD190008 */ sw $t9, 8($t0) -/* 0CF97C 800CED7C 8FA90024 */ lw $t1, 0x24($sp) -/* 0CF980 800CED80 AD200000 */ sw $zero, ($t1) -/* 0CF984 800CED84 0C035659 */ jal __osGetId -/* 0CF988 800CED88 8FA40024 */ lw $a0, 0x24($sp) -/* 0CF98C 800CED8C AFA2001C */ sw $v0, 0x1c($sp) -/* 0CF990 800CED90 8FAA001C */ lw $t2, 0x1c($sp) -/* 0CF994 800CED94 11400003 */ beqz $t2, .L800CEDA4 -/* 0CF998 800CED98 00000000 */ nop -/* 0CF99C 800CED9C 10000009 */ b .L800CEDC4 -/* 0CF9A0 800CEDA0 01401025 */ move $v0, $t2 -.L800CEDA4: -/* 0CF9A4 800CEDA4 0C033D4C */ jal osPfsChecker -/* 0CF9A8 800CEDA8 8FA40024 */ lw $a0, 0x24($sp) -/* 0CF9AC 800CEDAC 8FAB0024 */ lw $t3, 0x24($sp) -/* 0CF9B0 800CEDB0 AFA2001C */ sw $v0, 0x1c($sp) -/* 0CF9B4 800CEDB4 8D6C0000 */ lw $t4, ($t3) -/* 0CF9B8 800CEDB8 358D0001 */ ori $t5, $t4, 1 -/* 0CF9BC 800CEDBC AD6D0000 */ sw $t5, ($t3) -/* 0CF9C0 800CEDC0 8FA2001C */ lw $v0, 0x1c($sp) -.L800CEDC4: -/* 0CF9C4 800CEDC4 8FBF0014 */ lw $ra, 0x14($sp) -/* 0CF9C8 800CEDC8 27BD0020 */ addiu $sp, $sp, 0x20 -/* 0CF9CC 800CEDCC 03E00008 */ jr $ra -/* 0CF9D0 800CEDD0 00000000 */ nop - diff --git a/lib/src/os/osPfsInit.c b/lib/src/os/osPfsInit.c new file mode 100644 index 00000000..1dccaddd --- /dev/null +++ b/lib/src/os/osPfsInit.c @@ -0,0 +1,76 @@ +/* The comment below is needed for this file to be picked up by generate_ld */ +/* RAM_POS: 0x800CED20 */ + +#include "macros.h" +#include "libultra_internal.h" +#include "controller.h" +#include "siint.h" + +s32 osPfsInit(OSMesgQueue *queue, OSPfs *pfs, int channel) { + s32 ret; + ret = 0; + __osSiGetAccess(); + ret = __osPfsGetStatus(queue, channel); + __osSiRelAccess(); + if (ret != 0) + return ret; + + pfs->queue = queue; + pfs->channel = channel; + pfs->status = 0; + //pfs->activebank = -1; //Single difference between this an libreultra + ERRCK(__osGetId(pfs)); + + ret = osPfsChecker(pfs); + pfs->status |= PFS_INITIALIZED; + return ret; +} + +#if 1 +GLOBAL_ASM("lib/asm/non_matchings/unknown_0CF330/__osPfsGetStatus.s") +#else +s32 osPfsIsPlug(OSMesgQueue *queue, u8 *pattern) +{ + s32 ret; + OSMesg dummy; + u8 bitpattern; + OSContStatus data[MAXCONTROLLERS]; + int channel; + u8 bits; + int crc_error_cnt; + ret = 0; + bits = 0; + crc_error_cnt = 3; + __osSiGetAccess(); + while (TRUE) + { + __osPfsRequestData(CONT_CMD_REQUEST_STATUS); + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + __osPfsGetInitData(&bitpattern, data); + for (channel = 0; channel < __osMaxControllers; channel++) + { + if ((data[channel].status & CONT_ADDR_CRC_ER) == 0) + { + crc_error_cnt--; + break; + } + } + if (__osMaxControllers == channel) + crc_error_cnt = 0; + if (crc_error_cnt < 1) + { + for (channel = 0; channel < __osMaxControllers; channel++) + { + if (data[channel].errno == 0 && (data[channel].status & CONT_CARD_ON) != 0) + bits |= 1 << channel; + } + __osSiRelAccess(); + *pattern = bits; + return ret; + } + } +} +#endif diff --git a/lib/src/os/unknown_0CF330.c b/lib/src/os/unknown_0CF330.c index 8da09a4d..fac4b485 100644 --- a/lib/src/os/unknown_0CF330.c +++ b/lib/src/os/unknown_0CF330.c @@ -1,10 +1,8 @@ /* The comment below is needed for this file to be picked up by generate_ld */ -/* RAM_POS: 0x800CED20 */ +/* RAM_POS: 0x800CEEE0 */ #include "types.h" #include "macros.h" -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CF330/func_800CED20.s") -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CF330/__osPfsGetStatus.s") GLOBAL_ASM("lib/asm/non_matchings/unknown_0CF330/__osPfsGetNextPage.s") GLOBAL_ASM("lib/asm/non_matchings/unknown_0CF330/osPfsReadWriteFile.s")