diff --git a/lib/asm/non_matchings/unknown_0CD820/__osPackReadData.s b/lib/asm/non_matchings/unknown_0CD820/__osPackReadData.s deleted file mode 100644 index 85ab93d0..00000000 --- a/lib/asm/non_matchings/unknown_0CD820/__osPackReadData.s +++ /dev/null @@ -1,67 +0,0 @@ -glabel __osPackReadData -/* 0CDD4C 800CD14C 27BDFFF0 */ addiu $sp, $sp, -0x10 -/* 0CDD50 800CD150 3C0E8013 */ lui $t6, %hi(__osContPifRam) # $t6, 0x8013 -/* 0CDD54 800CD154 25CECD50 */ addiu $t6, %lo(__osContPifRam) # addiu $t6, $t6, -0x32b0 -/* 0CDD58 800CD158 AFAE000C */ sw $t6, 0xc($sp) -/* 0CDD5C 800CD15C AFA00000 */ sw $zero, ($sp) -.L800CD160: -/* 0CDD60 800CD160 8FAF0000 */ lw $t7, ($sp) -/* 0CDD64 800CD164 8FB90000 */ lw $t9, ($sp) -/* 0CDD68 800CD168 3C018013 */ lui $at, %hi(__osContPifRam) # $at, 0x8013 -/* 0CDD6C 800CD16C 000FC080 */ sll $t8, $t7, 2 -/* 0CDD70 800CD170 00380821 */ addu $at, $at, $t8 -/* 0CDD74 800CD174 AC20CD50 */ sw $zero, %lo(__osContPifRam)($at) -/* 0CDD78 800CD178 27280001 */ addiu $t0, $t9, 1 -/* 0CDD7C 800CD17C 29010010 */ slti $at, $t0, 0x10 -/* 0CDD80 800CD180 1420FFF7 */ bnez $at, .L800CD160 -/* 0CDD84 800CD184 AFA80000 */ sw $t0, ($sp) -/* 0CDD88 800CD188 3C198013 */ lui $t9, %hi(__osMaxControllers) # $t9, 0x8013 -/* 0CDD8C 800CD18C 9339CD91 */ lbu $t9, %lo(__osMaxControllers)($t9) -/* 0CDD90 800CD190 24090001 */ li $t1, 1 -/* 0CDD94 800CD194 3C018013 */ lui $at, %hi(__osContPifRam) # $at, 0x8013 -/* 0CDD98 800CD198 240A00FF */ li $t2, 255 -/* 0CDD9C 800CD19C 240B0001 */ li $t3, 1 -/* 0CDDA0 800CD1A0 240C0004 */ li $t4, 4 -/* 0CDDA4 800CD1A4 240D0001 */ li $t5, 1 -/* 0CDDA8 800CD1A8 340EFFFF */ li $t6, 65535 -/* 0CDDAC 800CD1AC 240FFFFF */ li $t7, -1 -/* 0CDDB0 800CD1B0 2418FFFF */ li $t8, -1 -/* 0CDDB4 800CD1B4 AC29CD8C */ sw $t1, %lo(__osContPifRam+60)($at) -/* 0CDDB8 800CD1B8 A3AA0004 */ sb $t2, 4($sp) -/* 0CDDBC 800CD1BC A3AB0005 */ sb $t3, 5($sp) -/* 0CDDC0 800CD1C0 A3AC0006 */ sb $t4, 6($sp) -/* 0CDDC4 800CD1C4 A3AD0007 */ sb $t5, 7($sp) -/* 0CDDC8 800CD1C8 A7AE0008 */ sh $t6, 8($sp) -/* 0CDDCC 800CD1CC A3AF000A */ sb $t7, 0xa($sp) -/* 0CDDD0 800CD1D0 A3B8000B */ sb $t8, 0xb($sp) -/* 0CDDD4 800CD1D4 1B200013 */ blez $t9, .L800CD224 -/* 0CDDD8 800CD1D8 AFA00000 */ sw $zero, ($sp) -.L800CD1DC: -/* 0CDDDC 800CD1DC 27A90004 */ addiu $t1, $sp, 4 -/* 0CDDE0 800CD1E0 8D210000 */ lw $at, ($t1) -/* 0CDDE4 800CD1E4 8FA8000C */ lw $t0, 0xc($sp) -/* 0CDDE8 800CD1E8 3C188013 */ lui $t8, %hi(__osMaxControllers) # $t8, 0x8013 -/* 0CDDEC 800CD1EC A9010000 */ swl $at, ($t0) -/* 0CDDF0 800CD1F0 B9010003 */ swr $at, 3($t0) -/* 0CDDF4 800CD1F4 8D2B0004 */ lw $t3, 4($t1) -/* 0CDDF8 800CD1F8 A90B0004 */ swl $t3, 4($t0) -/* 0CDDFC 800CD1FC B90B0007 */ swr $t3, 7($t0) -/* 0CDE00 800CD200 8FAE0000 */ lw $t6, ($sp) -/* 0CDE04 800CD204 9318CD91 */ lbu $t8, %lo(__osMaxControllers)($t8) -/* 0CDE08 800CD208 8FAC000C */ lw $t4, 0xc($sp) -/* 0CDE0C 800CD20C 25CF0001 */ addiu $t7, $t6, 1 -/* 0CDE10 800CD210 01F8082A */ slt $at, $t7, $t8 -/* 0CDE14 800CD214 258D0008 */ addiu $t5, $t4, 8 -/* 0CDE18 800CD218 AFAF0000 */ sw $t7, ($sp) -/* 0CDE1C 800CD21C 1420FFEF */ bnez $at, .L800CD1DC -/* 0CDE20 800CD220 AFAD000C */ sw $t5, 0xc($sp) -.L800CD224: -/* 0CDE24 800CD224 8FAA000C */ lw $t2, 0xc($sp) -/* 0CDE28 800CD228 241900FE */ li $t9, 254 -/* 0CDE2C 800CD22C 27BD0010 */ addiu $sp, $sp, 0x10 -/* 0CDE30 800CD230 03E00008 */ jr $ra -/* 0CDE34 800CD234 A1590000 */ sb $t9, ($t2) - -/* 0CDE38 800CD238 00000000 */ nop -/* 0CDE3C 800CD23C 00000000 */ nop - diff --git a/lib/asm/non_matchings/unknown_0CD820/osContGetReadData.s b/lib/asm/non_matchings/unknown_0CD820/osContGetReadData.s deleted file mode 100644 index 9614abeb..00000000 --- a/lib/asm/non_matchings/unknown_0CD820/osContGetReadData.s +++ /dev/null @@ -1,47 +0,0 @@ -glabel osContGetReadData -/* 0CDCA4 800CD0A4 3C0F8013 */ lui $t7, %hi(__osMaxControllers) # $t7, 0x8013 -/* 0CDCA8 800CD0A8 91EFCD91 */ lbu $t7, %lo(__osMaxControllers)($t7) -/* 0CDCAC 800CD0AC 3C0E8013 */ lui $t6, %hi(__osContPifRam) # $t6, 0x8013 -/* 0CDCB0 800CD0B0 27BDFFF0 */ addiu $sp, $sp, -0x10 -/* 0CDCB4 800CD0B4 25CECD50 */ addiu $t6, %lo(__osContPifRam) # addiu $t6, $t6, -0x32b0 -/* 0CDCB8 800CD0B8 AFAE000C */ sw $t6, 0xc($sp) -/* 0CDCBC 800CD0BC 19E00021 */ blez $t7, .L800CD144 -/* 0CDCC0 800CD0C0 AFA00000 */ sw $zero, ($sp) -.L800CD0C4: -/* 0CDCC4 800CD0C4 8FB9000C */ lw $t9, 0xc($sp) -/* 0CDCC8 800CD0C8 27B80004 */ addiu $t8, $sp, 4 -/* 0CDCCC 800CD0CC 8B210000 */ lwl $at, ($t9) -/* 0CDCD0 800CD0D0 9B210003 */ lwr $at, 3($t9) -/* 0CDCD4 800CD0D4 AF010000 */ sw $at, ($t8) -/* 0CDCD8 800CD0D8 8B290004 */ lwl $t1, 4($t9) -/* 0CDCDC 800CD0DC 9B290007 */ lwr $t1, 7($t9) -/* 0CDCE0 800CD0E0 AF090004 */ sw $t1, 4($t8) -/* 0CDCE4 800CD0E4 93AA0006 */ lbu $t2, 6($sp) -/* 0CDCE8 800CD0E8 314B00C0 */ andi $t3, $t2, 0xc0 -/* 0CDCEC 800CD0EC 000B6103 */ sra $t4, $t3, 4 -/* 0CDCF0 800CD0F0 A08C0004 */ sb $t4, 4($a0) -/* 0CDCF4 800CD0F4 908D0004 */ lbu $t5, 4($a0) -/* 0CDCF8 800CD0F8 15A00007 */ bnez $t5, .L800CD118 -/* 0CDCFC 800CD0FC 00000000 */ nop -/* 0CDD00 800CD100 97AE0008 */ lhu $t6, 8($sp) -/* 0CDD04 800CD104 A48E0000 */ sh $t6, ($a0) -/* 0CDD08 800CD108 83AF000A */ lb $t7, 0xa($sp) -/* 0CDD0C 800CD10C A08F0002 */ sb $t7, 2($a0) -/* 0CDD10 800CD110 83A8000B */ lb $t0, 0xb($sp) -/* 0CDD14 800CD114 A0880003 */ sb $t0, 3($a0) -.L800CD118: -/* 0CDD18 800CD118 8FB80000 */ lw $t8, ($sp) -/* 0CDD1C 800CD11C 3C0B8013 */ lui $t3, %hi(__osMaxControllers) # $t3, 0x8013 -/* 0CDD20 800CD120 916BCD91 */ lbu $t3, %lo(__osMaxControllers)($t3) -/* 0CDD24 800CD124 8FA9000C */ lw $t1, 0xc($sp) -/* 0CDD28 800CD128 27190001 */ addiu $t9, $t8, 1 -/* 0CDD2C 800CD12C 032B082A */ slt $at, $t9, $t3 -/* 0CDD30 800CD130 252A0008 */ addiu $t2, $t1, 8 -/* 0CDD34 800CD134 AFAA000C */ sw $t2, 0xc($sp) -/* 0CDD38 800CD138 AFB90000 */ sw $t9, ($sp) -/* 0CDD3C 800CD13C 1420FFE1 */ bnez $at, .L800CD0C4 -/* 0CDD40 800CD140 24840006 */ addiu $a0, $a0, 6 -.L800CD144: -/* 0CDD44 800CD144 03E00008 */ jr $ra -/* 0CDD48 800CD148 27BD0010 */ addiu $sp, $sp, 0x10 - diff --git a/lib/asm/non_matchings/unknown_0CD820/osContStartReadData.s b/lib/asm/non_matchings/unknown_0CD820/osContStartReadData.s deleted file mode 100644 index 2dbdf980..00000000 --- a/lib/asm/non_matchings/unknown_0CD820/osContStartReadData.s +++ /dev/null @@ -1,53 +0,0 @@ -glabel osContStartReadData -/* 0CDBE0 800CCFE0 27BDFFE0 */ addiu $sp, $sp, -0x20 -/* 0CDBE4 800CCFE4 AFBF0014 */ sw $ra, 0x14($sp) -/* 0CDBE8 800CCFE8 AFA40020 */ sw $a0, 0x20($sp) -/* 0CDBEC 800CCFEC 0C033594 */ jal __osSiGetAccess -/* 0CDBF0 800CCFF0 AFA0001C */ sw $zero, 0x1c($sp) -/* 0CDBF4 800CCFF4 3C0E8013 */ lui $t6, %hi(__osContLastCmd) # $t6, 0x8013 -/* 0CDBF8 800CCFF8 91CECD90 */ lbu $t6, %lo(__osContLastCmd)($t6) -/* 0CDBFC 800CCFFC 24010001 */ li $at, 1 -/* 0CDC00 800CD000 11C1000C */ beq $t6, $at, .L800CD034 -/* 0CDC04 800CD004 00000000 */ nop -/* 0CDC08 800CD008 0C033453 */ jal __osPackReadData -/* 0CDC0C 800CD00C 00000000 */ nop -/* 0CDC10 800CD010 3C058013 */ lui $a1, %hi(__osContPifRam) # $a1, 0x8013 -/* 0CDC14 800CD014 24A5CD50 */ addiu $a1, %lo(__osContPifRam) # addiu $a1, $a1, -0x32b0 -/* 0CDC18 800CD018 0C0335B0 */ jal __osSiRawStartDma -/* 0CDC1C 800CD01C 24040001 */ li $a0, 1 -/* 0CDC20 800CD020 AFA2001C */ sw $v0, 0x1c($sp) -/* 0CDC24 800CD024 8FA40020 */ lw $a0, 0x20($sp) -/* 0CDC28 800CD028 00002825 */ move $a1, $zero -/* 0CDC2C 800CD02C 0C0322EC */ jal osRecvMesg -/* 0CDC30 800CD030 24060001 */ li $a2, 1 -.L800CD034: -/* 0CDC34 800CD034 AFA00018 */ sw $zero, 0x18($sp) -.L800CD038: -/* 0CDC38 800CD038 8FB80018 */ lw $t8, 0x18($sp) -/* 0CDC3C 800CD03C 8FA80018 */ lw $t0, 0x18($sp) -/* 0CDC40 800CD040 3C018013 */ lui $at, %hi(__osContPifRam) # $at, 0x8013 -/* 0CDC44 800CD044 0018C880 */ sll $t9, $t8, 2 -/* 0CDC48 800CD048 00390821 */ addu $at, $at, $t9 -/* 0CDC4C 800CD04C 240F00FF */ li $t7, 255 -/* 0CDC50 800CD050 AC2FCD50 */ sw $t7, %lo(__osContPifRam)($at) -/* 0CDC54 800CD054 25090001 */ addiu $t1, $t0, 1 -/* 0CDC58 800CD058 29210010 */ slti $at, $t1, 0x10 -/* 0CDC5C 800CD05C 1420FFF6 */ bnez $at, .L800CD038 -/* 0CDC60 800CD060 AFA90018 */ sw $t1, 0x18($sp) -/* 0CDC64 800CD064 3C018013 */ lui $at, %hi(__osContPifRam) # $at, 0x8013 -/* 0CDC68 800CD068 3C058013 */ lui $a1, %hi(__osContPifRam) # $a1, 0x8013 -/* 0CDC6C 800CD06C AC20CD8C */ sw $zero, %lo(__osContPifRam+60)($at) -/* 0CDC70 800CD070 24A5CD50 */ addiu $a1, %lo(__osContPifRam) # addiu $a1, $a1, -0x32b0 -/* 0CDC74 800CD074 0C0335B0 */ jal __osSiRawStartDma -/* 0CDC78 800CD078 00002025 */ move $a0, $zero -/* 0CDC7C 800CD07C 240A0001 */ li $t2, 1 -/* 0CDC80 800CD080 3C018013 */ lui $at, %hi(__osContLastCmd) # $at, 0x8013 -/* 0CDC84 800CD084 AFA2001C */ sw $v0, 0x1c($sp) -/* 0CDC88 800CD088 0C0335A5 */ jal __osSiRelAccess -/* 0CDC8C 800CD08C A02ACD90 */ sb $t2, %lo(__osContLastCmd)($at) -/* 0CDC90 800CD090 8FBF0014 */ lw $ra, 0x14($sp) -/* 0CDC94 800CD094 8FA2001C */ lw $v0, 0x1c($sp) -/* 0CDC98 800CD098 27BD0020 */ addiu $sp, $sp, 0x20 -/* 0CDC9C 800CD09C 03E00008 */ jr $ra -/* 0CDCA0 800CD0A0 00000000 */ nop - diff --git a/lib/src/os/contramread.c b/lib/src/os/contramread.c index 28c41d94..872a93c7 100644 --- a/lib/src/os/contramread.c +++ b/lib/src/os/contramread.c @@ -24,7 +24,7 @@ s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) { for (i = 0; i < ARRLEN(__osPfsPifRam.ramarray) + 1; i++) { // also clear pifstatus __osPfsPifRam.ramarray[i] = 0xFFU; } - __osPfsPifRam.pifstatus = 0; + __osPfsPifRam.pifstatus = CONT_CMD_REQUEST_STATUS; ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); ptr = (u8 *)&__osPfsPifRam; diff --git a/lib/src/os/contramwrite.c b/lib/src/os/contramwrite.c index 8bae742b..0462d816 100644 --- a/lib/src/os/contramwrite.c +++ b/lib/src/os/contramwrite.c @@ -28,7 +28,7 @@ s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int for (i = 0; i < ARRLEN(__osPfsPifRam.ramarray) + 1; i++) { // also clear pifstatus __osPfsPifRam.ramarray[i] = 0xFFU; } - __osPfsPifRam.pifstatus = 0; + __osPfsPifRam.pifstatus = CONT_CMD_REQUEST_STATUS; ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); ptr = (u8 *)&__osPfsPifRam; diff --git a/lib/src/os/contreaddata.c b/lib/src/os/contreaddata.c index daa3003a..717e1e62 100644 --- a/lib/src/os/contreaddata.c +++ b/lib/src/os/contreaddata.c @@ -6,6 +6,68 @@ #include "libultra_internal.h" #include "controller.h" -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CD820/osContStartReadData.s") -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CD820/osContGetReadData.s") -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CD820/__osPackReadData.s") +static void __osPackReadData(void); +s32 osContStartReadData(OSMesgQueue *mq) { + s32 ret; + int i; + + ret = 0; + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_READ_BUTTON) { + __osPackReadData(); + ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + + for (i = 0; i <= ARRLEN(__osContPifRam.ramarray); i++) { + __osContPifRam.ramarray[i] = 255; + } + + __osContPifRam.pifstatus = CONT_CMD_REQUEST_STATUS; + ret = __osSiRawStartDma(OS_READ, &__osContPifRam); + + __osContLastCmd = CONT_CMD_READ_BUTTON; + __osSiRelAccess(); + return ret; +} + +void osContGetReadData(OSContPad *data) { + u8 *ptr; + __OSContReadFormat readformat; + int i; + ptr = (u8 *)&__osContPifRam.ramarray; + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContReadFormat), data++) { + readformat = *(__OSContReadFormat *)ptr; + data->errno = CHNL_ERR(readformat); + if (data->errno == 0) { + data->button = readformat.button; + data->stick_x = readformat.stick_x; + data->stick_y = readformat.stick_y; + } + } +} + +static void __osPackReadData(void) { + u8 *ptr; + __OSContReadFormat readformat; + int i; + + ptr = (u8*)&__osContPifRam.ramarray; + for (i = 0; i <= ARRLEN(__osContPifRam.ramarray); i++) { + __osContPifRam.ramarray[i] = 0; + } + __osContPifRam.pifstatus = CONT_CMD_EXE; + readformat.dummy = CONT_CMD_NOP; + readformat.txsize = CONT_CMD_READ_BUTTON_TX; + readformat.rxsize = CONT_CMD_READ_BUTTON_RX; + readformat.cmd = CONT_CMD_READ_BUTTON; + readformat.button = -1; + readformat.stick_x = -1; + readformat.stick_y = -1; + for(i=0; i < __osMaxControllers; i++) { + *(__OSContReadFormat*)ptr = readformat; + ptr += sizeof(__OSContReadFormat); + } + *ptr = CONT_CMD_END; +} diff --git a/lib/src/os/osEepromRead.c b/lib/src/os/osEepromRead.c index c5856877..7aec2526 100644 --- a/lib/src/os/osEepromRead.c +++ b/lib/src/os/osEepromRead.c @@ -46,7 +46,7 @@ s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) { __osEepPifRam.ramarray[i] = CONT_CMD_NOP; } - __osEepPifRam.pifstatus = 0; + __osEepPifRam.pifstatus = CONT_CMD_REQUEST_STATUS; ret = __osSiRawStartDma(OS_READ, __osEepPifRam.ramarray); diff --git a/lib/src/os/osEepromWrite.c b/lib/src/os/osEepromWrite.c index a9884f24..a7d902ad 100644 --- a/lib/src/os/osEepromWrite.c +++ b/lib/src/os/osEepromWrite.c @@ -36,11 +36,11 @@ s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) { ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); //send command to pif osRecvMesg(mq, NULL, OS_MESG_BLOCK); - for (i = 0; i < 0x10; i++) { + for (i = 0; i <= ARRLEN(__osEepPifRam.ramarray); i++) { __osEepPifRam.ramarray[i] = 255; } - __osEepPifRam.pifstatus = 0; + __osEepPifRam.pifstatus = CONT_CMD_REQUEST_STATUS; ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); //recv response __osContLastCmd = CONT_CMD_WRITE_EEPROM; osRecvMesg(mq, NULL, OS_MESG_BLOCK);