diff --git a/Makefile b/Makefile index e6eae1d8..797d2cff 100755 --- a/Makefile +++ b/Makefile @@ -268,9 +268,6 @@ $(BUILD_DIR)/lib/src/unknown_0D3160.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0D3360.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0D5EC0.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0C9C90.o: OPT_FLAGS := -O2 -Wo,-loopunroll,0 -$(BUILD_DIR)/lib/src/osEepromWrite.o: OPT_FLAGS := -O1 -$(BUILD_DIR)/lib/src/osEepromRead.o: OPT_FLAGS := -O1 -$(BUILD_DIR)/lib/src/osSetTimer.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/%.o: MIPSISET := -mips2 $(BUILD_DIR)/lib/src/mips1/%.o: MIPSISET := -mips1 diff --git a/lib/asm/non_matchings/unknown_0CDE90/__osPfsRequestData.s b/lib/asm/non_matchings/unknown_0CDE90/__osPfsRequestData.s deleted file mode 100644 index 5bf21989..00000000 --- a/lib/asm/non_matchings/unknown_0CDE90/__osPfsRequestData.s +++ /dev/null @@ -1,68 +0,0 @@ -glabel __osPfsRequestData -/* 0CE030 800CD430 27BDFFF0 */ addiu $sp, $sp, -0x10 -/* 0CE034 800CD434 308400FF */ andi $a0, $a0, 0xff -/* 0CE038 800CD438 3C018013 */ lui $at, %hi(__osContLastCmd) # $at, 0x8013 -/* 0CE03C 800CD43C A024CD90 */ sb $a0, %lo(__osContLastCmd)($at) -/* 0CE040 800CD440 AFA00000 */ sw $zero, ($sp) -.L800CD444: -/* 0CE044 800CD444 8FAE0000 */ lw $t6, ($sp) -/* 0CE048 800CD448 8FB80000 */ lw $t8, ($sp) -/* 0CE04C 800CD44C 3C018013 */ lui $at, %hi(__osPfsPifRam) # $at, 0x8013 -/* 0CE050 800CD450 000E7880 */ sll $t7, $t6, 2 -/* 0CE054 800CD454 002F0821 */ addu $at, $at, $t7 -/* 0CE058 800CD458 AC20CDE0 */ sw $zero, %lo(__osPfsPifRam)($at) -/* 0CE05C 800CD45C 27190001 */ addiu $t9, $t8, 1 -/* 0CE060 800CD460 2B210010 */ slti $at, $t9, 0x10 -/* 0CE064 800CD464 1420FFF7 */ bnez $at, .L800CD444 -/* 0CE068 800CD468 AFB90000 */ sw $t9, ($sp) -/* 0CE06C 800CD46C 3C198013 */ lui $t9, %hi(__osMaxControllers) # $t9, 0x8013 -/* 0CE070 800CD470 9339CD91 */ lbu $t9, %lo(__osMaxControllers)($t9) -/* 0CE074 800CD474 3C098013 */ lui $t1, %hi(__osPfsPifRam) # $t1, 0x8013 -/* 0CE078 800CD478 24080001 */ li $t0, 1 -/* 0CE07C 800CD47C 3C018013 */ lui $at, %hi(D_8012CE1C) # $at, 0x8013 -/* 0CE080 800CD480 2529CDE0 */ addiu $t1, %lo(__osPfsPifRam) # addiu $t1, $t1, -0x3220 -/* 0CE084 800CD484 240A00FF */ li $t2, 255 -/* 0CE088 800CD488 240B0001 */ li $t3, 1 -/* 0CE08C 800CD48C 240C0003 */ li $t4, 3 -/* 0CE090 800CD490 240D00FF */ li $t5, 255 -/* 0CE094 800CD494 240E00FF */ li $t6, 255 -/* 0CE098 800CD498 240F00FF */ li $t7, 255 -/* 0CE09C 800CD49C 241800FF */ li $t8, 255 -/* 0CE0A0 800CD4A0 AC28CE1C */ sw $t0, %lo(D_8012CE1C)($at) -/* 0CE0A4 800CD4A4 AFA9000C */ sw $t1, 0xc($sp) -/* 0CE0A8 800CD4A8 A3AA0004 */ sb $t2, 4($sp) -/* 0CE0AC 800CD4AC A3AB0005 */ sb $t3, 5($sp) -/* 0CE0B0 800CD4B0 A3AC0006 */ sb $t4, 6($sp) -/* 0CE0B4 800CD4B4 A3A40007 */ sb $a0, 7($sp) -/* 0CE0B8 800CD4B8 A3AD0008 */ sb $t5, 8($sp) -/* 0CE0BC 800CD4BC A3AE0009 */ sb $t6, 9($sp) -/* 0CE0C0 800CD4C0 A3AF000A */ sb $t7, 0xa($sp) -/* 0CE0C4 800CD4C4 A3B8000B */ sb $t8, 0xb($sp) -/* 0CE0C8 800CD4C8 1B200013 */ blez $t9, .L800CD518 -/* 0CE0CC 800CD4CC AFA00000 */ sw $zero, ($sp) -.L800CD4D0: -/* 0CE0D0 800CD4D0 27A90004 */ addiu $t1, $sp, 4 -/* 0CE0D4 800CD4D4 8D210000 */ lw $at, ($t1) -/* 0CE0D8 800CD4D8 8FA8000C */ lw $t0, 0xc($sp) -/* 0CE0DC 800CD4DC 3C188013 */ lui $t8, %hi(__osMaxControllers) # $t8, 0x8013 -/* 0CE0E0 800CD4E0 A9010000 */ swl $at, ($t0) -/* 0CE0E4 800CD4E4 B9010003 */ swr $at, 3($t0) -/* 0CE0E8 800CD4E8 8D2B0004 */ lw $t3, 4($t1) -/* 0CE0EC 800CD4EC A90B0004 */ swl $t3, 4($t0) -/* 0CE0F0 800CD4F0 B90B0007 */ swr $t3, 7($t0) -/* 0CE0F4 800CD4F4 8FAE0000 */ lw $t6, ($sp) -/* 0CE0F8 800CD4F8 9318CD91 */ lbu $t8, %lo(__osMaxControllers)($t8) -/* 0CE0FC 800CD4FC 8FAC000C */ lw $t4, 0xc($sp) -/* 0CE100 800CD500 25CF0001 */ addiu $t7, $t6, 1 -/* 0CE104 800CD504 01F8082A */ slt $at, $t7, $t8 -/* 0CE108 800CD508 258D0008 */ addiu $t5, $t4, 8 -/* 0CE10C 800CD50C AFAF0000 */ sw $t7, ($sp) -/* 0CE110 800CD510 1420FFEF */ bnez $at, .L800CD4D0 -/* 0CE114 800CD514 AFAD000C */ sw $t5, 0xc($sp) -.L800CD518: -/* 0CE118 800CD518 8FAA000C */ lw $t2, 0xc($sp) -/* 0CE11C 800CD51C 241900FE */ li $t9, 254 -/* 0CE120 800CD520 27BD0010 */ addiu $sp, $sp, 0x10 -/* 0CE124 800CD524 03E00008 */ jr $ra -/* 0CE128 800CD528 A1590000 */ sb $t9, ($t2) - diff --git a/lib/asm/non_matchings/unknown_0CDE90/osPfsIsPlug.s b/lib/asm/non_matchings/unknown_0CDE90/osPfsIsPlug.s deleted file mode 100644 index c49b772a..00000000 --- a/lib/asm/non_matchings/unknown_0CDE90/osPfsIsPlug.s +++ /dev/null @@ -1,114 +0,0 @@ -glabel osPfsIsPlug -/* 0CDE90 800CD290 27BDFFC0 */ addiu $sp, $sp, -0x40 -/* 0CDE94 800CD294 AFBF0014 */ sw $ra, 0x14($sp) -/* 0CDE98 800CD298 240E0003 */ li $t6, 3 -/* 0CDE9C 800CD29C AFA40040 */ sw $a0, 0x40($sp) -/* 0CDEA0 800CD2A0 AFA50044 */ sw $a1, 0x44($sp) -/* 0CDEA4 800CD2A4 AFA0003C */ sw $zero, 0x3c($sp) -/* 0CDEA8 800CD2A8 A3A0001F */ sb $zero, 0x1f($sp) -/* 0CDEAC 800CD2AC 0C033594 */ jal __osSiGetAccess -/* 0CDEB0 800CD2B0 AFAE0018 */ sw $t6, 0x18($sp) -.L800CD2B4: -/* 0CDEB4 800CD2B4 0C03350C */ jal __osPfsRequestData -/* 0CDEB8 800CD2B8 00002025 */ move $a0, $zero -/* 0CDEBC 800CD2BC 3C058013 */ lui $a1, %hi(__osPfsPifRam) # $a1, 0x8013 -/* 0CDEC0 800CD2C0 24A5CDE0 */ addiu $a1, %lo(__osPfsPifRam) # addiu $a1, $a1, -0x3220 -/* 0CDEC4 800CD2C4 0C0335B0 */ jal __osSiRawStartDma -/* 0CDEC8 800CD2C8 24040001 */ li $a0, 1 -/* 0CDECC 800CD2CC AFA2003C */ sw $v0, 0x3c($sp) -/* 0CDED0 800CD2D0 8FA40040 */ lw $a0, 0x40($sp) -/* 0CDED4 800CD2D4 27A50038 */ addiu $a1, $sp, 0x38 -/* 0CDED8 800CD2D8 0C0322EC */ jal osRecvMesg -/* 0CDEDC 800CD2DC 24060001 */ li $a2, 1 -/* 0CDEE0 800CD2E0 3C058013 */ lui $a1, %hi(__osPfsPifRam) # $a1, 0x8013 -/* 0CDEE4 800CD2E4 24A5CDE0 */ addiu $a1, %lo(__osPfsPifRam) # addiu $a1, $a1, -0x3220 -/* 0CDEE8 800CD2E8 0C0335B0 */ jal __osSiRawStartDma -/* 0CDEEC 800CD2EC 00002025 */ move $a0, $zero -/* 0CDEF0 800CD2F0 AFA2003C */ sw $v0, 0x3c($sp) -/* 0CDEF4 800CD2F4 8FA40040 */ lw $a0, 0x40($sp) -/* 0CDEF8 800CD2F8 27A50038 */ addiu $a1, $sp, 0x38 -/* 0CDEFC 800CD2FC 0C0322EC */ jal osRecvMesg -/* 0CDF00 800CD300 24060001 */ li $a2, 1 -/* 0CDF04 800CD304 27A40037 */ addiu $a0, $sp, 0x37 -/* 0CDF08 800CD308 0C03354B */ jal __osPfsGetInitData -/* 0CDF0C 800CD30C 27A50024 */ addiu $a1, $sp, 0x24 -/* 0CDF10 800CD310 3C0F8013 */ lui $t7, %hi(__osMaxControllers) # $t7, 0x8013 -/* 0CDF14 800CD314 91EFCD91 */ lbu $t7, %lo(__osMaxControllers)($t7) -/* 0CDF18 800CD318 AFA00020 */ sw $zero, 0x20($sp) -/* 0CDF1C 800CD31C 19E00014 */ blez $t7, .L800CD370 -/* 0CDF20 800CD320 00000000 */ nop -.L800CD324: -/* 0CDF24 800CD324 8FB80020 */ lw $t8, 0x20($sp) -/* 0CDF28 800CD328 0018C880 */ sll $t9, $t8, 2 -/* 0CDF2C 800CD32C 03B94021 */ addu $t0, $sp, $t9 -/* 0CDF30 800CD330 91080026 */ lbu $t0, 0x26($t0) -/* 0CDF34 800CD334 31090004 */ andi $t1, $t0, 4 -/* 0CDF38 800CD338 15200005 */ bnez $t1, .L800CD350 -/* 0CDF3C 800CD33C 00000000 */ nop -/* 0CDF40 800CD340 8FAA0018 */ lw $t2, 0x18($sp) -/* 0CDF44 800CD344 254BFFFF */ addiu $t3, $t2, -1 -/* 0CDF48 800CD348 10000009 */ b .L800CD370 -/* 0CDF4C 800CD34C AFAB0018 */ sw $t3, 0x18($sp) -.L800CD350: -/* 0CDF50 800CD350 8FAC0020 */ lw $t4, 0x20($sp) -/* 0CDF54 800CD354 3C0E8013 */ lui $t6, %hi(__osMaxControllers) # $t6, 0x8013 -/* 0CDF58 800CD358 91CECD91 */ lbu $t6, %lo(__osMaxControllers)($t6) -/* 0CDF5C 800CD35C 258D0001 */ addiu $t5, $t4, 1 -/* 0CDF60 800CD360 AFAD0020 */ sw $t5, 0x20($sp) -/* 0CDF64 800CD364 01AE082A */ slt $at, $t5, $t6 -/* 0CDF68 800CD368 1420FFEE */ bnez $at, .L800CD324 -/* 0CDF6C 800CD36C 00000000 */ nop -.L800CD370: -/* 0CDF70 800CD370 3C0F8013 */ lui $t7, %hi(__osMaxControllers) # $t7, 0x8013 -/* 0CDF74 800CD374 91EFCD91 */ lbu $t7, %lo(__osMaxControllers)($t7) -/* 0CDF78 800CD378 8FB80020 */ lw $t8, 0x20($sp) -/* 0CDF7C 800CD37C 15F80002 */ bne $t7, $t8, .L800CD388 -/* 0CDF80 800CD380 00000000 */ nop -/* 0CDF84 800CD384 AFA00018 */ sw $zero, 0x18($sp) -.L800CD388: -/* 0CDF88 800CD388 8FB90018 */ lw $t9, 0x18($sp) -/* 0CDF8C 800CD38C 1F20FFC9 */ bgtz $t9, .L800CD2B4 -/* 0CDF90 800CD390 00000000 */ nop -/* 0CDF94 800CD394 3C088013 */ lui $t0, %hi(__osMaxControllers) # $t0, 0x8013 -/* 0CDF98 800CD398 9108CD91 */ lbu $t0, %lo(__osMaxControllers)($t0) -/* 0CDF9C 800CD39C AFA00020 */ sw $zero, 0x20($sp) -/* 0CDFA0 800CD3A0 19000019 */ blez $t0, .L800CD408 -/* 0CDFA4 800CD3A4 00000000 */ nop -.L800CD3A8: -/* 0CDFA8 800CD3A8 8FA90020 */ lw $t1, 0x20($sp) -/* 0CDFAC 800CD3AC 27AB0024 */ addiu $t3, $sp, 0x24 -/* 0CDFB0 800CD3B0 00095080 */ sll $t2, $t1, 2 -/* 0CDFB4 800CD3B4 014B6021 */ addu $t4, $t2, $t3 -/* 0CDFB8 800CD3B8 918D0003 */ lbu $t5, 3($t4) -/* 0CDFBC 800CD3BC 15A0000A */ bnez $t5, .L800CD3E8 -/* 0CDFC0 800CD3C0 00000000 */ nop -/* 0CDFC4 800CD3C4 918E0002 */ lbu $t6, 2($t4) -/* 0CDFC8 800CD3C8 31CF0001 */ andi $t7, $t6, 1 -/* 0CDFCC 800CD3CC 11E00006 */ beqz $t7, .L800CD3E8 -/* 0CDFD0 800CD3D0 00000000 */ nop -/* 0CDFD4 800CD3D4 93B8001F */ lbu $t8, 0x1f($sp) -/* 0CDFD8 800CD3D8 24190001 */ li $t9, 1 -/* 0CDFDC 800CD3DC 01394004 */ sllv $t0, $t9, $t1 -/* 0CDFE0 800CD3E0 03085025 */ or $t2, $t8, $t0 -/* 0CDFE4 800CD3E4 A3AA001F */ sb $t2, 0x1f($sp) -.L800CD3E8: -/* 0CDFE8 800CD3E8 8FAB0020 */ lw $t3, 0x20($sp) -/* 0CDFEC 800CD3EC 3C0C8013 */ lui $t4, %hi(__osMaxControllers) # $t4, 0x8013 -/* 0CDFF0 800CD3F0 918CCD91 */ lbu $t4, %lo(__osMaxControllers)($t4) -/* 0CDFF4 800CD3F4 256D0001 */ addiu $t5, $t3, 1 -/* 0CDFF8 800CD3F8 AFAD0020 */ sw $t5, 0x20($sp) -/* 0CDFFC 800CD3FC 01AC082A */ slt $at, $t5, $t4 -/* 0CE000 800CD400 1420FFE9 */ bnez $at, .L800CD3A8 -/* 0CE004 800CD404 00000000 */ nop -.L800CD408: -/* 0CE008 800CD408 0C0335A5 */ jal __osSiRelAccess -/* 0CE00C 800CD40C 00000000 */ nop -/* 0CE010 800CD410 93AE001F */ lbu $t6, 0x1f($sp) -/* 0CE014 800CD414 8FAF0044 */ lw $t7, 0x44($sp) -/* 0CE018 800CD418 A1EE0000 */ sb $t6, ($t7) -/* 0CE01C 800CD41C 8FBF0014 */ lw $ra, 0x14($sp) -/* 0CE020 800CD420 8FA2003C */ lw $v0, 0x3c($sp) -/* 0CE024 800CD424 27BD0040 */ addiu $sp, $sp, 0x40 -/* 0CE028 800CD428 03E00008 */ jr $ra -/* 0CE02C 800CD42C 00000000 */ nop - diff --git a/lib/src/unknown_0CDE90.c b/lib/src/unknown_0CDE90.c index 863b500f..c90615f8 100644 --- a/lib/src/unknown_0CDE90.c +++ b/lib/src/unknown_0CDE90.c @@ -5,32 +5,104 @@ #include "macros.h" #include "libultra_internal.h" #include "controller.h" +#include "siint.h" -extern OSPifRam __osPfsPifRam; //__osPfsPifRam -extern u8 __osContLastCmd; //__osContLastCmd -extern u8 __osMaxControllers;//__osMaxControllers -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CDE90/osPfsIsPlug.s") -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CDE90/__osPfsRequestData.s") +void __osPfsGetInitData(u8 *pattern, OSContStatus *data); +void __osPfsRequestData(u8 cmd); -void __osPfsGetInitData(u8 *pattern, OSContStatus *data) -{ +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; + } + } +} + +void __osPfsRequestData(u8 cmd) { + u8 *ptr; + __OSContRequesFormat requestformat; + int i; + + __osContLastCmd = cmd; + //Also clear pifstatus + for (i = 0; i < ARRLEN(__osPfsPifRam.ramarray) + 1; i++) { + __osPfsPifRam.ramarray[i] = 0; + } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8 *)&__osPfsPifRam; + requestformat.dummy = CONT_CMD_NOP; + requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; + requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; + requestformat.cmd = cmd; + requestformat.typeh = CONT_CMD_NOP; + requestformat.typel = CONT_CMD_NOP; + requestformat.status = CONT_CMD_NOP; + requestformat.dummy1 = CONT_CMD_NOP; + + for (i = 0; i < __osMaxControllers; i++) { + *(__OSContRequesFormat *)ptr = requestformat; + ptr += sizeof(__OSContRequesFormat); + } + + *ptr = CONT_CMD_END; +} + +void __osPfsGetInitData(u8 *pattern, OSContStatus *data) { u8 *ptr; __OSContRequesFormat requestformat; int i; u8 bits; + bits = 0; ptr = (u8 *)&__osPfsPifRam; - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContRequesFormat)) - { + + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContRequesFormat)) { requestformat = *(__OSContRequesFormat *)ptr; data->errno = CHNL_ERR(requestformat); - if (data->errno == 0) - { + if (data->errno == 0) { data->type = (requestformat.typel << 8) | (requestformat.typeh); data->status = requestformat.status; bits |= 1 << i; } data++; } + *pattern = bits; }