diff --git a/asm/code_800BB570.s b/asm/code_800BB570.s index 584b6a0654..57226ac5da 100644 --- a/asm/code_800BB570.s +++ b/asm/code_800BB570.s @@ -15,7 +15,7 @@ glabel func_800BB570 /* B32718 800BB578 AFBF0014 */ sw $ra, 0x14($sp) /* B3271C 800BB57C 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32720 800BB580 AFA0001C */ sw $zero, 0x1c($sp) -/* B32724 800BB584 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B32724 800BB584 0C031C94 */ jal padmgr_LockSerialMesgQ /* B32728 800BB588 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B3272C 800BB58C 3C058016 */ lui $a1, %hi(D_801612F0) # $a1, 0x8016 /* B32730 800BB590 AFA20024 */ sw $v0, 0x24($sp) @@ -34,7 +34,7 @@ glabel func_800BB570 /* B32760 800BB5C0 248412F0 */ addiu $a0, %lo(D_801612F0) # addiu $a0, $a0, 0x12f0 /* B32764 800BB5C4 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32768 800BB5C8 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B3276C 800BB5CC 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B3276C 800BB5CC 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B32770 800BB5D0 8FA50024 */ lw $a1, 0x24($sp) /* B32774 800BB5D4 8FBF0014 */ lw $ra, 0x14($sp) /* B32778 800BB5D8 8FA2001C */ lw $v0, 0x1c($sp) @@ -68,7 +68,7 @@ glabel func_800BB5F8 /* B327D8 800BB638 AFA60070 */ sw $a2, 0x70($sp) /* B327DC 800BB63C 24130001 */ li $s3, 1 /* B327E0 800BB640 0000A825 */ move $s5, $zero -/* B327E4 800BB644 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B327E4 800BB644 0C031C94 */ jal padmgr_LockSerialMesgQ /* B327E8 800BB648 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B327EC 800BB64C 0230082A */ slt $at, $s1, $s0 /* B327F0 800BB650 AFA20064 */ sw $v0, 0x64($sp) @@ -123,7 +123,7 @@ glabel func_800BB5F8 .L800BB708: /* B328A8 800BB708 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B328AC 800BB70C 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B328B0 800BB710 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B328B0 800BB710 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B328B4 800BB714 8FA50064 */ lw $a1, 0x64($sp) /* B328B8 800BB718 3C048014 */ lui $a0, %hi(D_80143D08) # $a0, 0x8014 /* B328BC 800BB71C 24843D08 */ addiu $a0, %lo(D_80143D08) # addiu $a0, $a0, 0x3d08 @@ -154,7 +154,7 @@ glabel func_800BB764 /* B32918 800BB778 AFA60040 */ sw $a2, 0x40($sp) /* B3291C 800BB77C AFA70044 */ sw $a3, 0x44($sp) /* B32920 800BB780 AFA0002C */ sw $zero, 0x2c($sp) -/* B32924 800BB784 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B32924 800BB784 0C031C94 */ jal padmgr_LockSerialMesgQ /* B32928 800BB788 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B3292C 800BB78C 3C0E8016 */ lui $t6, %hi(D_80161358) # $t6, 0x8016 /* B32930 800BB790 8FA80048 */ lw $t0, 0x48($sp) @@ -194,7 +194,7 @@ glabel func_800BB764 .L800BB814: /* B329B4 800BB814 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B329B8 800BB818 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B329BC 800BB81C 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B329BC 800BB81C 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B329C0 800BB820 8FA50034 */ lw $a1, 0x34($sp) /* B329C4 800BB824 8FBF001C */ lw $ra, 0x1c($sp) /* B329C8 800BB828 8FA2002C */ lw $v0, 0x2c($sp) @@ -211,7 +211,7 @@ glabel func_800BB838 /* B329EC 800BB84C AFA60040 */ sw $a2, 0x40($sp) /* B329F0 800BB850 AFA70044 */ sw $a3, 0x44($sp) /* B329F4 800BB854 AFA0002C */ sw $zero, 0x2c($sp) -/* B329F8 800BB858 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B329F8 800BB858 0C031C94 */ jal padmgr_LockSerialMesgQ /* B329FC 800BB85C 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B32A00 800BB860 3C0E8016 */ lui $t6, %hi(D_80161358) # $t6, 0x8016 /* B32A04 800BB864 8FA80048 */ lw $t0, 0x48($sp) @@ -251,7 +251,7 @@ glabel func_800BB838 .L800BB8E8: /* B32A88 800BB8E8 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32A8C 800BB8EC 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B32A90 800BB8F0 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B32A90 800BB8F0 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B32A94 800BB8F4 8FA50034 */ lw $a1, 0x34($sp) /* B32A98 800BB8F8 8FBF001C */ lw $ra, 0x1c($sp) /* B32A9C 800BB8FC 8FA2002C */ lw $v0, 0x2c($sp) @@ -268,7 +268,7 @@ glabel func_800BB90C /* B32AC0 800BB920 00A08025 */ move $s0, $a1 /* B32AC4 800BB924 AFA60048 */ sw $a2, 0x48($sp) /* B32AC8 800BB928 AFA00034 */ sw $zero, 0x34($sp) -/* B32ACC 800BB92C 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B32ACC 800BB92C 0C031C94 */ jal padmgr_LockSerialMesgQ /* B32AD0 800BB930 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B32AD4 800BB934 AFA2003C */ sw $v0, 0x3c($sp) /* B32AD8 800BB938 92030000 */ lbu $v1, ($s0) @@ -413,7 +413,7 @@ glabel func_800BB90C .L800BBB48: /* B32CE8 800BBB48 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32CEC 800BBB4C 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B32CF0 800BBB50 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B32CF0 800BBB50 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B32CF4 800BBB54 8FA5003C */ lw $a1, 0x3c($sp) /* B32CF8 800BBB58 8FBF002C */ lw $ra, 0x2c($sp) /* B32CFC 800BBB5C 8FA20034 */ lw $v0, 0x34($sp) @@ -428,7 +428,7 @@ glabel func_800BBB6C /* B32D18 800BBB78 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32D1C 800BBB7C AFA50034 */ sw $a1, 0x34($sp) /* B32D20 800BBB80 AFA00024 */ sw $zero, 0x24($sp) -/* B32D24 800BBB84 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B32D24 800BBB84 0C031C94 */ jal padmgr_LockSerialMesgQ /* B32D28 800BBB88 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B32D2C 800BBB8C 93A30037 */ lbu $v1, 0x37($sp) /* B32D30 800BBB90 3C088013 */ lui $t0, %hi(D_8012D198) # $t0, 0x8013 @@ -458,7 +458,7 @@ glabel func_800BBB6C /* B32D8C 800BBBEC 8FA50020 */ lw $a1, 0x20($sp) /* B32D90 800BBBF0 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32D94 800BBBF4 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B32D98 800BBBF8 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B32D98 800BBBF8 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B32D9C 800BBBFC 8FA5002C */ lw $a1, 0x2c($sp) /* B32DA0 800BBC00 8FBF001C */ lw $ra, 0x1c($sp) /* B32DA4 800BBC04 8FA20024 */ lw $v0, 0x24($sp) @@ -472,7 +472,7 @@ glabel func_800BBC14 /* B32DBC 800BBC1C AFBF0014 */ sw $ra, 0x14($sp) /* B32DC0 800BBC20 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32DC4 800BBC24 AFA5004C */ sw $a1, 0x4c($sp) -/* B32DC8 800BBC28 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B32DC8 800BBC28 0C031C94 */ jal padmgr_LockSerialMesgQ /* B32DCC 800BBC2C 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B32DD0 800BBC30 93AE004F */ lbu $t6, 0x4f($sp) /* B32DD4 800BBC34 3C058016 */ lui $a1, %hi(D_8016125C) @@ -487,7 +487,7 @@ glabel func_800BBC14 /* B32DF8 800BBC58 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B32DFC 800BBC5C AFA20020 */ sw $v0, 0x20($sp) /* B32E00 800BBC60 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 -/* B32E04 800BBC64 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B32E04 800BBC64 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B32E08 800BBC68 8FA50044 */ lw $a1, 0x44($sp) /* B32E0C 800BBC6C 8FB80020 */ lw $t8, 0x20($sp) /* B32E10 800BBC70 8FBF0014 */ lw $ra, 0x14($sp) diff --git a/asm/code_800EC960.s b/asm/code_800EC960.s index ef024d9a7d..452c099f2f 100644 --- a/asm/code_800EC960.s +++ b/asm/code_800EC960.s @@ -62,7 +62,7 @@ glabel func_800ECA00 /* B63BB4 800ECA14 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B63BB8 800ECA18 27A50020 */ addiu $a1, $sp, 0x20 /* B63BBC 800ECA1C 00003025 */ move $a2, $zero -/* B63BC0 800ECA20 0C031F82 */ jal func_800C7E08 +/* B63BC0 800ECA20 0C031F82 */ jal padmgr_RequestPadData /* B63BC4 800ECA24 AFAE0018 */ sw $t6, 0x18($sp) /* B63BC8 800ECA28 97AF0020 */ lhu $t7, 0x20($sp) /* B63BCC 800ECA2C 8FB80018 */ lw $t8, 0x18($sp) @@ -2307,7 +2307,7 @@ glabel func_800EE97C /* B65B24 800EE984 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B65B28 800EE988 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B65B2C 800EE98C 27A50020 */ addiu $a1, $sp, 0x20 -/* B65B30 800EE990 0C031F82 */ jal func_800C7E08 +/* B65B30 800EE990 0C031F82 */ jal padmgr_RequestPadData /* B65B34 800EE994 00003025 */ move $a2, $zero /* B65B38 800EE998 97AE0068 */ lhu $t6, 0x68($sp) /* B65B3C 800EE99C 3C038017 */ lui $v1, %hi(D_8016BAB4) # $v1, 0x8017 diff --git a/asm/game.s b/asm/game.s index 794d7972bb..96196e9fa8 100644 --- a/asm/game.s +++ b/asm/game.s @@ -656,7 +656,7 @@ glabel func_800C4A98 /* B3BC44 800C4AA4 3C048016 */ lui $a0, %hi(gPadMgr) # $a0, 0x8016 /* B3BC48 800C4AA8 248468C0 */ addiu $a0, %lo(gPadMgr) # addiu $a0, $a0, 0x68c0 /* B3BC4C 800C4AAC 24E50014 */ addiu $a1, $a3, 0x14 -/* B3BC50 800C4AB0 0C031F82 */ jal func_800C7E08 +/* B3BC50 800C4AB0 0C031F82 */ jal padmgr_RequestPadData /* B3BC54 800C4AB4 24060001 */ li $a2, 1 /* B3BC58 800C4AB8 8FBF0014 */ lw $ra, 0x14($sp) /* B3BC5C 800C4ABC 27BD0018 */ addiu $sp, $sp, 0x18 diff --git a/asm/code_80105F40.s b/asm/non_matchings/code/code_80105F40/code_80105F40.s similarity index 96% rename from asm/code_80105F40.s rename to asm/non_matchings/code/code_80105F40/code_80105F40.s index 813f58a113..40aeceef78 100644 --- a/asm/code_80105F40.s +++ b/asm/non_matchings/code/code_80105F40/code_80105F40.s @@ -1,14 +1,3 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purposee registers - -.section .text - -.align 4 - glabel func_80105F40 /* B7D0E0 80105F40 27BDFFA0 */ addiu $sp, $sp, -0x60 /* B7D0E4 80105F44 AFBF003C */ sw $ra, 0x3c($sp) diff --git a/asm/non_matchings/code/code_80105F40/code_80105F40_edited.s b/asm/non_matchings/code/code_80105F40/code_80105F40_edited.s new file mode 100644 index 0000000000..0c6c6ecd8c --- /dev/null +++ b/asm/non_matchings/code/code_80105F40/code_80105F40_edited.s @@ -0,0 +1,152 @@ +glabel func_80105F40 +/* B7D0E0 80105F40 27BDFFA0 */ addiu $sp, $sp, -0x60 +/* B7D0E4 80105F44 AFBF003C */ sw $ra, 0x3c($sp) +/* B7D0E8 80105F48 AFB60030 */ sw $s6, 0x30($sp) +/* B7D0EC 80105F4C AFB5002C */ sw $s5, 0x2c($sp) +/* B7D0F0 80105F50 AFB1001C */ sw $s1, 0x1c($sp) +/* B7D0F4 80105F54 00A08825 */ move $s1, $a1 +/* B7D0F8 80105F58 0080B025 */ move $s6, $a0 +/* B7D0FC 80105F5C AFBE0038 */ sw $fp, 0x38($sp) +/* B7D100 80105F60 AFB70034 */ sw $s7, 0x34($sp) +/* B7D104 80105F64 AFB40028 */ sw $s4, 0x28($sp) +/* B7D108 80105F68 AFB30024 */ sw $s3, 0x24($sp) +/* B7D10C 80105F6C AFB20020 */ sw $s2, 0x20($sp) +/* B7D110 80105F70 AFB00018 */ sw $s0, 0x18($sp) +/* B7D114 80105F74 AFA60068 */ sw $a2, 0x68($sp) +/* B7D118 80105F78 AFA7006C */ sw $a3, 0x6c($sp) +/* B7D11C 80105F7C 0C0402E8 */ jal __osSiGetAccess +/* B7D120 80105F80 24150002 */ li $s5, 2 +/* B7D124 80105F84 97A5006A */ lhu $a1, 0x6a($sp) +/* B7D128 80105F88 3C1E8013 */ lui $fp, %hi(D_80134D20) # $fp, 0x8013 +/* B7D12C 80105F8C 3C178017 */ lui $s7, %hi(_osCont_lastPollType) # $s7, 0x8017 +/* B7D130 80105F90 3C148017 */ lui $s4, %hi(D_80175960) # $s4, 0x8017 +/* B7D134 80105F94 000570C3 */ sra $t6, $a1, 3 +/* B7D138 80105F98 00057940 */ sll $t7, $a1, 5 +/* B7D13C 80105F9C AFAF0040 */ sw $t7, 0x40($sp) +/* B7D140 80105FA0 AFAE0044 */ sw $t6, 0x44($sp) +/* B7D144 80105FA4 26945960 */ addiu $s4, %lo(D_80175960) # addiu $s4, $s4, 0x5960 +/* B7D148 80105FA8 26F75810 */ addiu $s7, %lo(_osCont_lastPollType) # addiu $s7, $s7, 0x5810 +/* B7D14C 80105FAC 27DE4D20 */ addiu $fp, %lo(D_80134D20) # addiu $fp, $fp, 0x4d20 +.L80105FB0: +/* B7D150 80105FB0 92F80000 */ lbu $t8, ($s7) +/* B7D154 80105FB4 24010002 */ li $at, 2 +/* B7D158 80105FB8 97A5006A */ lhu $a1, 0x6a($sp) +/* B7D15C 80105FBC 17010003 */ bne $t8, $at, .L80105FCC +/* B7D160 80105FC0 02808025 */ move $s0, $s4 +/* B7D164 80105FC4 8FD90000 */ lw $t9, ($fp) +/* B7D168 80105FC8 12390023 */ beq $s1, $t9, .L80106058 +/* B7D16C 80105FCC 24080002 */ li $t0, 2 +.L80105FCC: +/* B7D16C 80105FCC 24080002 */ li $t0, 2 +/* B7D170 80105FD0 A2E80000 */ sb $t0, ($s7) +/* B7D174 80105FD4 AFD10000 */ sw $s1, ($fp) +/* B7D178 80105FD8 1A200010 */ blez $s1, .L8010601C +/* B7D17C 80105FDC 00001025 */ move $v0, $zero +/* B7D180 80105FE0 32240003 */ andi $a0, $s1, 3 +/* B7D1A0 80106000 24420004 */ addiu $v0, $v0, 4 +/* B7D184 80105FE4 10800006 */ beqz $a0, .L80106000 +/* B7D188 80105FE8 00801825 */ move $v1, $a0 +.L80105FEC: +/* B7D18C 80105FEC 24420001 */ addiu $v0, $v0, 1 +/* B7D190 80105FF0 A2000000 */ sb $zero, ($s0) +/* B7D194 80105FF4 1462FFFD */ bne $v1, $v0, .L80105FEC +/* B7D198 80105FF8 26100001 */ addiu $s0, $s0, 1 +/* B7D19C 80105FFC 10510007 */ beq $v0, $s1, .L8010601C +/* B7D1A0 80106000 24420004 */ addiu $v0, $v0, 4 +.L80106000: +/* B7D1A4 80106004 A2000000 */ sb $zero, ($s0) +/* B7D1A8 80106008 A2000001 */ sb $zero, 1($s0) +/* B7D1AC 8010600C A2000002 */ sb $zero, 2($s0) +/* B7D1B0 80106010 A2000003 */ sb $zero, 3($s0) +/* B7D1A0 80106000 24420004 */ addiu $v0, $v0, 4 +/* B7D1B4 80106014 1451FFFA */ bne $v0, $s1, .L80106000 +/* B7D1B8 80106018 26100004 */ addiu $s0, $s0, 4 +.L8010601C: +/* B7D1BC 8010601C 24090001 */ li $t1, 1 +/* B7D1C0 80106020 AE89003C */ sw $t1, 0x3c($s4) +/* B7D1C4 80106024 240A00FF */ li $t2, 255 +/* B7D1C8 80106028 240B0003 */ li $t3, 3 +/* B7D1CC 8010602C 240C0021 */ li $t4, 33 +/* B7D1D0 80106030 240D0002 */ li $t5, 2 +/* B7D1D4 80106034 240E00FF */ li $t6, 255 +/* B7D1D8 80106038 240F00FE */ li $t7, 254 +/* B7D1DC 8010603C A20A0000 */ sb $t2, ($s0) +/* B7D1E0 80106040 A20B0001 */ sb $t3, 1($s0) +/* B7D1E4 80106044 A20C0002 */ sb $t4, 2($s0) +/* B7D1E8 80106048 A20D0003 */ sb $t5, 3($s0) +/* B7D1EC 8010604C A20E0026 */ sb $t6, 0x26($s0) +/* B7D1F0 80106050 10000002 */ b .L8010605C +/* B7D1F4 80106054 A20F0027 */ sb $t7, 0x27($s0) +.L80106058: +/* B7D1F8 80106058 02918021 */ addu $s0, $s4, $s1 +.L8010605C: +/* B7D1FC 8010605C 8FB80044 */ lw $t8, 0x44($sp) +/* B7D200 80106060 30A4FFFF */ andi $a0, $a1, 0xffff +/* B7D204 80106064 0C04185C */ jal func_80106170 +/* B7D208 80106068 A2180004 */ sb $t8, 4($s0) +/* B7D20C 8010606C 8FB90040 */ lw $t9, 0x40($sp) +/* B7D210 80106070 24040001 */ li $a0, 1 +/* B7D214 80106074 02802825 */ move $a1, $s4 +/* B7D218 80106078 00594025 */ or $t0, $v0, $t9 +/* B7D21C 8010607C 0C0404FC */ jal __osSiRawStartDma /*(s32 dir, void *addr)*/ +/* B7D220 80106080 A2080005 */ sb $t0, 5($s0) +/* B7D224 80106084 02C02025 */ move $a0, $s6 +/* B7D228 80106088 00002825 */ move $a1, $zero +/* B7D22C 8010608C 0C000CA0 */ jal osRecvMesg +/* B7D230 80106090 24060001 */ li $a2, 1 +/* B7D234 80106094 00002025 */ move $a0, $zero +/* B7D238 80106098 0C0404FC */ jal __osSiRawStartDma /*(s32 dir, void *addr)*/ +/* B7D23C 8010609C 02802825 */ move $a1, $s4 +/* B7D240 801060A0 02C02025 */ move $a0, $s6 +/* B7D244 801060A4 00002825 */ move $a1, $zero +/* B7D248 801060A8 0C000CA0 */ jal osRecvMesg +/* B7D24C 801060AC 24060001 */ li $a2, 1 +/* B7D250 801060B0 92130002 */ lbu $s3, 2($s0) +/* B7D254 801060B4 26120006 */ addiu $s2, $s0, 6 +/* B7D258 801060B8 326900C0 */ andi $t1, $s3, 0xc0 +/* B7D25C 801060BC 00099903 */ sra $s3, $t1, 4 +/* B7D260 801060C0 56600014 */ bnezl $s3, .L80106114 +/* B7D264 801060C4 24130001 */ li $s3, 1 +/* B7D268 801060C8 0C041890 */ jal func_80106240 +/* B7D26C 801060CC 02402025 */ move $a0, $s2 +/* B7D270 801060D0 920B0026 */ lbu $t3, 0x26($s0) +/* B7D274 801060D4 02402025 */ move $a0, $s2 +/* B7D278 801060D8 8FA5006C */ lw $a1, 0x6c($sp) +/* B7D27C 801060DC 11620008 */ beq $t3, $v0, .L80106100 +/* B7D280 801060E0 00000000 */ nop +/* B7D284 801060E4 02C02025 */ move $a0, $s6 +/* B7D288 801060E8 0C040644 */ jal func_80101910 +/* B7D28C 801060EC 02202825 */ move $a1, $s1 +/* B7D290 801060F0 1440000D */ bnez $v0, .L80106128 +/* B7D294 801060F4 00409825 */ move $s3, $v0 +/* B7D298 801060F8 10000006 */ b .L80106114 +/* B7D29C 801060FC 24130004 */ li $s3, 4 +.L80106100: +/* B7D2A0 80106100 0C001BC4 */ jal bcopy +/* B7D2A4 80106104 24060020 */ li $a2, 32 +/* B7D2A8 80106108 10000003 */ b .L80106118 +/* B7D2AC 8010610C 24010004 */ li $at, 4 +/* B7D2B0 80106110 24130001 */ li $s3, 1 +.L80106114: +/* B7D2B4 80106114 24010004 */ li $at, 4 +.L80106118: +/* B7D2B8 80106118 16610003 */ bne $s3, $at, .L80106128 +/* B7D2BC 8010611C 2AA20000 */ slti $v0, $s5, 0 +/* B7D2C0 80106120 1040FFA3 */ beqz $v0, .L80105FB0 +/* B7D2C4 80106124 26B5FFFF */ addiu $s5, $s5, -1 +.L80106128: +/* B7D2C8 80106128 0C0402F9 */ jal __osSiRelAccess +/* B7D2CC 8010612C 00000000 */ nop +/* B7D2D0 80106130 8FBF003C */ lw $ra, 0x3c($sp) +/* B7D2D4 80106134 02601025 */ move $v0, $s3 +/* B7D2D8 80106138 8FB30024 */ lw $s3, 0x24($sp) +/* B7D2DC 8010613C 8FB00018 */ lw $s0, 0x18($sp) +/* B7D2E0 80106140 8FB1001C */ lw $s1, 0x1c($sp) +/* B7D2E4 80106144 8FB20020 */ lw $s2, 0x20($sp) +/* B7D2E8 80106148 8FB40028 */ lw $s4, 0x28($sp) +/* B7D2EC 8010614C 8FB5002C */ lw $s5, 0x2c($sp) +/* B7D2F0 80106150 8FB60030 */ lw $s6, 0x30($sp) +/* B7D2F4 80106154 8FB70034 */ lw $s7, 0x34($sp) +/* B7D2F8 80106158 8FBE0038 */ lw $fp, 0x38($sp) +/* B7D2FC 8010615C 03E00008 */ jr $ra +/* B7D300 80106160 27BD0060 */ addiu $sp, $sp, 0x60 diff --git a/asm/non_matchings/code/padmgr/func_800C7948.s b/asm/non_matchings/code/padmgr/func_800C7948.s deleted file mode 100644 index 23b8c47d39..0000000000 --- a/asm/non_matchings/code/padmgr/func_800C7948.s +++ /dev/null @@ -1,13 +0,0 @@ -glabel func_800C7948 -/* B3EAE8 800C7948 90AE0000 */ lbu $t6, ($a1) -/* B3EAEC 800C794C 240800F0 */ li $t0, 240 -/* B3EAF0 800C7950 A08E02B2 */ sb $t6, 0x2b2($a0) -/* B3EAF4 800C7954 90AF0001 */ lbu $t7, 1($a1) -/* B3EAF8 800C7958 A08F02B3 */ sb $t7, 0x2b3($a0) -/* B3EAFC 800C795C 90B80002 */ lbu $t8, 2($a1) -/* B3EB00 800C7960 A09802B4 */ sb $t8, 0x2b4($a0) -/* B3EB04 800C7964 90B90003 */ lbu $t9, 3($a1) -/* B3EB08 800C7968 A09902B5 */ sb $t9, 0x2b5($a0) -/* B3EB0C 800C796C 03E00008 */ jr $ra -/* B3EB10 800C7970 A088045D */ sb $t0, 0x45d($a0) - diff --git a/asm/non_matchings/code/padmgr/func_800C7974.s b/asm/non_matchings/code/padmgr/func_800C7974.s index 9e00788dd7..1364ddcd2a 100644 --- a/asm/non_matchings/code/padmgr/func_800C7974.s +++ b/asm/non_matchings/code/padmgr/func_800C7974.s @@ -82,7 +82,7 @@ glabel func_800C7974 /* B3EB24 800C7984 AFB30024 */ sw $s3, 0x24($sp) /* B3EB28 800C7988 AFB20020 */ sw $s2, 0x20($sp) /* B3EB2C 800C798C AFB1001C */ sw $s1, 0x1c($sp) -/* B3EB30 800C7990 0C031CEF */ jal PadMgr_Lock2 +/* B3EB30 800C7990 0C031CEF */ jal padmgr_LockContData /* B3EB34 800C7994 AFB00018 */ sw $s0, 0x18($sp) /* B3EB38 800C7998 928E02A9 */ lbu $t6, 0x2a9($s4) /* B3EB3C 800C799C 26900230 */ addiu $s0, $s4, 0x230 @@ -243,7 +243,7 @@ glabel func_800C7974 /* B3ED84 800C7BE4 1420FF71 */ bnez $at, .L800C79AC /* B3ED88 800C7BE8 26730006 */ addiu $s3, $s3, 6 .L800C7BEC: -/* B3ED8C 800C7BEC 0C031CF9 */ jal PadMgr_Unlock2 +/* B3ED8C 800C7BEC 0C031CF9 */ jal padmgr_UnlockContData /* B3ED90 800C7BF0 02802025 */ move $a0, $s4 /* B3ED94 800C7BF4 8FBF002C */ lw $ra, 0x2c($sp) /* B3ED98 800C7BF8 8FB00018 */ lw $s0, 0x18($sp) diff --git a/asm/non_matchings/code/padmgr/func_800C7C14.s b/asm/non_matchings/code/padmgr/func_800C7C14.s deleted file mode 100644 index 8dd392ac02..0000000000 --- a/asm/non_matchings/code/padmgr/func_800C7C14.s +++ /dev/null @@ -1,137 +0,0 @@ -.rdata -glabel D_80145BE4 - .asciz "../padmgr.c" - .balign 4 - -glabel D_80145BF0 - .asciz "this->pad_status[i].type = %x\n" - .balign 4 - -glabel D_80145C10 - .asciz "知らない種類のコントローラが接続されています\n" - # EUC-JP: 知らない種類のコントローラが接続されています | An unknown type of controller is connected - .balign 4 - -.text -glabel func_800C7C14 -/* B3EDB4 800C7C14 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* B3EDB8 800C7C18 AFBF0024 */ sw $ra, 0x24($sp) -/* B3EDBC 800C7C1C AFB30020 */ sw $s3, 0x20($sp) -/* B3EDC0 800C7C20 00809825 */ move $s3, $a0 -/* B3EDC4 800C7C24 AFB2001C */ sw $s2, 0x1c($sp) -/* B3EDC8 800C7C28 AFB10018 */ sw $s1, 0x18($sp) -/* B3EDCC 800C7C2C 0C031C94 */ jal PadMgr_LockGetControllerQueue -/* B3EDD0 800C7C30 AFB00014 */ sw $s0, 0x14($sp) -/* B3EDD4 800C7C34 00408825 */ move $s1, $v0 -/* B3EDD8 800C7C38 0C0403BC */ jal osContStartReadData /*(OSMesgQueue *mq)*/ -/* B3EDDC 800C7C3C 00402025 */ move $a0, $v0 -/* B3EDE0 800C7C40 8E630460 */ lw $v1, 0x460($s3) -/* B3EDE4 800C7C44 10600003 */ beqz $v1, .L800C7C54 -/* B3EDE8 800C7C48 02602025 */ move $a0, $s3 -/* B3EDEC 800C7C4C 0060F809 */ jalr $v1 -/* B3EDF0 800C7C50 8E650464 */ lw $a1, 0x464($s3) -.L800C7C54: -/* B3EDF4 800C7C54 02202025 */ move $a0, $s1 -/* B3EDF8 800C7C58 00002825 */ move $a1, $zero -/* B3EDFC 800C7C5C 0C000CA0 */ jal osRecvMesg -/* B3EE00 800C7C60 24060001 */ li $a2, 1 -/* B3EE04 800C7C64 26700290 */ addiu $s0, $s3, 0x290 -/* B3EE08 800C7C68 0C0403DD */ jal osContGetReadData /*(OSContPad *pad)*/ -/* B3EE0C 800C7C6C 02002025 */ move $a0, $s0 -/* B3EE10 800C7C70 926E045E */ lbu $t6, 0x45e($s3) -/* B3EE14 800C7C74 02002025 */ move $a0, $s0 -/* B3EE18 800C7C78 11C00003 */ beqz $t6, .L800C7C88 -/* B3EE1C 800C7C7C 00000000 */ nop -/* B3EE20 800C7C80 0C001114 */ jal bzero -/* B3EE24 800C7C84 24050018 */ li $a1, 24 -.L800C7C88: -/* B3EE28 800C7C88 0C031E5D */ jal func_800C7974 -/* B3EE2C 800C7C8C 02602025 */ move $a0, $s3 -/* B3EE30 800C7C90 0C040C84 */ jal func_80103210 -/* B3EE34 800C7C94 02202025 */ move $a0, $s1 -/* B3EE38 800C7C98 02202025 */ move $a0, $s1 -/* B3EE3C 800C7C9C 00002825 */ move $a1, $zero -/* B3EE40 800C7CA0 0C000CA0 */ jal osRecvMesg -/* B3EE44 800C7CA4 24060001 */ li $a2, 1 -/* B3EE48 800C7CA8 0C040CA3 */ jal func_8010328C -/* B3EE4C 800C7CAC 02602025 */ move $a0, $s3 -/* B3EE50 800C7CB0 02602025 */ move $a0, $s3 -/* B3EE54 800C7CB4 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue -/* B3EE58 800C7CB8 02202825 */ move $a1, $s1 -/* B3EE5C 800C7CBC 00009025 */ move $s2, $zero -/* B3EE60 800C7CC0 00008825 */ move $s1, $zero -/* B3EE64 800C7CC4 02608025 */ move $s0, $s3 -.L800C7CC8: -/* B3EE68 800C7CC8 920F0003 */ lbu $t7, 3($s0) -/* B3EE6C 800C7CCC 55E00014 */ bnezl $t7, .L800C7D20 -/* B3EE70 800C7CD0 26310001 */ addiu $s1, $s1, 1 -/* B3EE74 800C7CD4 96180000 */ lhu $t8, ($s0) -/* B3EE78 800C7CD8 24010005 */ li $at, 5 -/* B3EE7C 800C7CDC 3C048014 */ lui $a0, %hi(D_80145BE4) # $a0, 0x8014 -/* B3EE80 800C7CE0 17010005 */ bne $t8, $at, .L800C7CF8 -/* B3EE84 800C7CE4 24845BE4 */ addiu $a0, %lo(D_80145BE4) # addiu $a0, $a0, 0x5be4 -/* B3EE88 800C7CE8 24190001 */ li $t9, 1 -/* B3EE8C 800C7CEC 02394004 */ sllv $t0, $t9, $s1 -/* B3EE90 800C7CF0 1000000A */ b .L800C7D1C -/* B3EE94 800C7CF4 02489025 */ or $s2, $s2, $t0 -.L800C7CF8: -/* B3EE98 800C7CF8 0C000B84 */ jal LogUtils_LogThreadId -/* B3EE9C 800C7CFC 240501CA */ li $a1, 458 -/* B3EEA0 800C7D00 3C048014 */ lui $a0, %hi(D_80145BF0) # $a0, 0x8014 -/* B3EEA4 800C7D04 24845BF0 */ addiu $a0, %lo(D_80145BF0) # addiu $a0, $a0, 0x5bf0 -/* B3EEA8 800C7D08 0C00084C */ jal osSyncPrintf -/* B3EEAC 800C7D0C 96050000 */ lhu $a1, ($s0) -/* B3EEB0 800C7D10 3C048014 */ lui $a0, %hi(D_80145C10) # $a0, 0x8014 -/* B3EEB4 800C7D14 0C00084C */ jal osSyncPrintf -/* B3EEB8 800C7D18 24845C10 */ addiu $a0, %lo(D_80145C10) # addiu $a0, $a0, 0x5c10 -.L800C7D1C: -/* B3EEBC 800C7D1C 26310001 */ addiu $s1, $s1, 1 -.L800C7D20: -/* B3EEC0 800C7D20 24010004 */ li $at, 4 -/* B3EEC4 800C7D24 1621FFE8 */ bne $s1, $at, .L800C7CC8 -/* B3EEC8 800C7D28 26100004 */ addiu $s0, $s0, 4 -/* B3EECC 800C7D2C A27202A8 */ sb $s2, 0x2a8($s3) -/* B3EED0 800C7D30 3C098017 */ lui $t1, %hi(gFaultStruct+0x7CD) # $t1, 0x8017 -/* B3EED4 800C7D34 9129B5F5 */ lbu $t1, %lo(gFaultStruct+0x7CD)($t1) -/* B3EED8 800C7D38 51200006 */ beql $t1, $zero, .L800C7D54 -/* B3EEDC 800C7D3C 926A045C */ lbu $t2, 0x45c($s3) -/* B3EEE0 800C7D40 0C031E06 */ jal func_800C7818 -/* B3EEE4 800C7D44 02602025 */ move $a0, $s3 -/* B3EEE8 800C7D48 1000001B */ b .L800C7DB8 -/* B3EEEC 800C7D4C 8FBF0024 */ lw $ra, 0x24($sp) -/* B3EEF0 800C7D50 926A045C */ lbu $t2, 0x45c($s3) -.L800C7D54: -/* B3EEF4 800C7D54 59400009 */ blezl $t2, .L800C7D7C -/* B3EEF8 800C7D58 926D045D */ lbu $t5, 0x45d($s3) -/* B3EEFC 800C7D5C 926B045C */ lbu $t3, 0x45c($s3) -/* B3EF00 800C7D60 02602025 */ move $a0, $s3 -/* B3EF04 800C7D64 256CFFFF */ addiu $t4, $t3, -1 -/* B3EF08 800C7D68 0C031E06 */ jal func_800C7818 -/* B3EF0C 800C7D6C A26C045C */ sb $t4, 0x45c($s3) -/* B3EF10 800C7D70 10000011 */ b .L800C7DB8 -/* B3EF14 800C7D74 8FBF0024 */ lw $ra, 0x24($sp) -/* B3EF18 800C7D78 926D045D */ lbu $t5, 0x45d($s3) -.L800C7D7C: -/* B3EF1C 800C7D7C 55A00006 */ bnezl $t5, .L800C7D98 -/* B3EF20 800C7D80 926E045E */ lbu $t6, 0x45e($s3) -/* B3EF24 800C7D84 0C031E06 */ jal func_800C7818 -/* B3EF28 800C7D88 02602025 */ move $a0, $s3 -/* B3EF2C 800C7D8C 1000000A */ b .L800C7DB8 -/* B3EF30 800C7D90 8FBF0024 */ lw $ra, 0x24($sp) -/* B3EF34 800C7D94 926E045E */ lbu $t6, 0x45e($s3) -.L800C7D98: -/* B3EF38 800C7D98 55C00007 */ bnezl $t6, .L800C7DB8 -/* B3EF3C 800C7D9C 8FBF0024 */ lw $ra, 0x24($sp) -/* B3EF40 800C7DA0 0C031D03 */ jal func_800C740C -/* B3EF44 800C7DA4 02602025 */ move $a0, $s3 -/* B3EF48 800C7DA8 926F045D */ lbu $t7, 0x45d($s3) -/* B3EF4C 800C7DAC 25F8FFFF */ addiu $t8, $t7, -1 -/* B3EF50 800C7DB0 A278045D */ sb $t8, 0x45d($s3) -/* B3EF54 800C7DB4 8FBF0024 */ lw $ra, 0x24($sp) -.L800C7DB8: -/* B3EF58 800C7DB8 8FB00014 */ lw $s0, 0x14($sp) -/* B3EF5C 800C7DBC 8FB10018 */ lw $s1, 0x18($sp) -/* B3EF60 800C7DC0 8FB2001C */ lw $s2, 0x1c($sp) -/* B3EF64 800C7DC4 8FB30020 */ lw $s3, 0x20($sp) -/* B3EF68 800C7DC8 03E00008 */ jr $ra -/* B3EF6C 800C7DCC 27BD0028 */ addiu $sp, $sp, 0x28 diff --git a/asm/non_matchings/code/padmgr/func_800C7E08.s b/asm/non_matchings/code/padmgr/padmgr_RequestPadData.s similarity index 97% rename from asm/non_matchings/code/padmgr/func_800C7E08.s rename to asm/non_matchings/code/padmgr/padmgr_RequestPadData.s index 0279f7f372..a2b2b02f63 100644 --- a/asm/non_matchings/code/padmgr/func_800C7E08.s +++ b/asm/non_matchings/code/padmgr/padmgr_RequestPadData.s @@ -1,4 +1,4 @@ -glabel func_800C7E08 +glabel padmgr_RequestPadData /* B3EFA8 800C7E08 27BDFFD0 */ addiu $sp, $sp, -0x30 /* B3EFAC 800C7E0C AFBF002C */ sw $ra, 0x2c($sp) /* B3EFB0 800C7E10 AFB40028 */ sw $s4, 0x28($sp) @@ -8,7 +8,7 @@ glabel func_800C7E08 /* B3EFC0 800C7E20 AFB20020 */ sw $s2, 0x20($sp) /* B3EFC4 800C7E24 AFB1001C */ sw $s1, 0x1c($sp) /* B3EFC8 800C7E28 AFB00018 */ sw $s0, 0x18($sp) -/* B3EFCC 800C7E2C 0C031CEF */ jal PadMgr_Lock2 +/* B3EFCC 800C7E2C 0C031CEF */ jal padmgr_LockContData /* B3EFD0 800C7E30 AFA40030 */ sw $a0, 0x30($sp) /* B3EFD4 800C7E34 8FB10030 */ lw $s1, 0x30($sp) /* B3EFD8 800C7E38 02608025 */ move $s0, $s3 @@ -86,7 +86,7 @@ glabel func_800C7E08 /* B3F0EC 800C7F4C 26310018 */ addiu $s1, $s1, 0x18 /* B3F0F0 800C7F50 1653FFBD */ bne $s2, $s3, .L800C7E48 /* B3F0F4 800C7F54 26100018 */ addiu $s0, $s0, 0x18 -/* B3F0F8 800C7F58 0C031CF9 */ jal PadMgr_Unlock2 +/* B3F0F8 800C7F58 0C031CF9 */ jal padmgr_UnlockContData /* B3F0FC 800C7F5C 8FA40030 */ lw $a0, 0x30($sp) /* B3F100 800C7F60 8FBF002C */ lw $ra, 0x2c($sp) /* B3F104 800C7F64 8FB00018 */ lw $s0, 0x18($sp) diff --git a/asm/non_matchings/code/padmgr/func_800C740C.s b/asm/non_matchings/code/padmgr/padmgr_RumbleControl.s similarity index 99% rename from asm/non_matchings/code/padmgr/func_800C740C.s rename to asm/non_matchings/code/padmgr/padmgr_RumbleControl.s index 41a6f18458..e43ca98215 100644 --- a/asm/non_matchings/code/padmgr/func_800C740C.s +++ b/asm/non_matchings/code/padmgr/padmgr_RumbleControl.s @@ -152,7 +152,7 @@ glabel D_80145ABC .balign 4 .text -glabel func_800C740C +glabel padmgr_RumbleControl /* B3E5AC 800C740C 27BDFFB8 */ addiu $sp, $sp, -0x48 /* B3E5B0 800C7410 AFBF0034 */ sw $ra, 0x34($sp) /* B3E5B4 800C7414 AFB40028 */ sw $s4, 0x28($sp) @@ -162,7 +162,7 @@ glabel func_800C740C /* B3E5C4 800C7424 AFB30024 */ sw $s3, 0x24($sp) /* B3E5C8 800C7428 AFB20020 */ sw $s2, 0x20($sp) /* B3E5CC 800C742C AFB1001C */ sw $s1, 0x1c($sp) -/* B3E5D0 800C7430 0C031C94 */ jal PadMgr_LockGetControllerQueue +/* B3E5D0 800C7430 0C031C94 */ jal padmgr_LockSerialMesgQ /* B3E5D4 800C7434 AFB00018 */ sw $s0, 0x18($sp) /* B3E5D8 800C7438 AFA2003C */ sw $v0, 0x3c($sp) /* B3E5DC 800C743C 0000A825 */ move $s5, $zero @@ -411,7 +411,7 @@ glabel func_800C740C /* B3E97C 800C77DC 02802025 */ move $a0, $s4 /* B3E980 800C77E0 252A0001 */ addiu $t2, $t1, 1 /* B3E984 800C77E4 AC2AA4F0 */ sw $t2, %lo(D_8016A4F0)($at) -/* B3E988 800C77E8 0C031CBF */ jal PadMgr_UnlockReleaseControllerQueue +/* B3E988 800C77E8 0C031CBF */ jal padmgr_UnlockSerialMesgQ /* B3E98C 800C77EC 8FA5003C */ lw $a1, 0x3c($sp) /* B3E990 800C77F0 8FBF0034 */ lw $ra, 0x34($sp) /* B3E994 800C77F4 8FB00018 */ lw $s0, 0x18($sp) diff --git a/docs/guides/-O2 decompilation (for IDO 5.3).md b/docs/guides/-O2 decompilation (for IDO 5.3).md index 25af668102..d662b0436e 100644 --- a/docs/guides/-O2 decompilation (for IDO 5.3).md +++ b/docs/guides/-O2 decompilation (for IDO 5.3).md @@ -245,6 +245,8 @@ Conditions like `if (glob.singleBitField)` are sometimes (but not always) emitte Copying a struct generates reorderings compared to copying each data member separately. It might also copy padding data (?), and if the size is 3 (mod 4) it may also generate `lwr`/`swr` instructions (like array initialization). +Sometimes, copying small structs with members that fit nicely into primitive types will use normal `lw`, `lh`, etc. instructions. But, usually copying larger structs will use `lwl`/`lwr` instructions, regardless of the internal data. Also, regalloc for struct copying is different between IDO V5.3 and V7.1. If this is the only non-matching in your function, try the other compiler. + ### Register allocation TODO: we really need to figure this out. diff --git a/include/functions.h b/include/functions.h index d4b4502b67..dd3d8b1399 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1538,19 +1538,19 @@ void ListAlloc_Free(ListAlloc* this, void* data); void ListAlloc_FreeAll(ListAlloc* this); void Main_LogSystemHeap(); void Main(void*); -// OSMesgQueue* PadMgr_LockGetControllerQueue(PadMgr* padmgr); -// void PadMgr_UnlockReleaseControllerQueue(PadMgr* padmgr, OSMesgQueue* ctrlrqueue); -// void PadMgr_Lock2(PadMgr* padmgr); -// void PadMgr_Unlock2(PadMgr* padmgr) -// ? func_800C740C(?); -// ? func_800C7818(?); -// ? func_800C7928(?); -// ? func_800C7948(?); +// OSMesgQueue* padmgr_LockSerialMesgQ(PadMgr* padmgr); +// void padmgr_UnlockSerialMesgQ(PadMgr* padmgr, OSMesgQueue* ctrlrqueue); +// void padmgr_LockContData(PadMgr* padmgr); +// void padmgr_UnlockContData(PadMgr* padmgr); +// void padmgr_RumbleControl(PadMgr* padmgr); +// void padmgr_RumbleStop(PadMgr* padmgr); +// void padmgr_RumbleReset(PadMgr* padmgr); +// void padmgr_RumbleSet(PadMgr* padmgr, u8* ctrlr_rumbles); // ? func_800C7974(?); -// ? func_800C7C14(?); -// ? func_800C7DD0(?); -void func_800C7E08(Input*, u32); -// void PadMgr_Init(PadMgr* padmgr, OSMesg mesg, UNK_TYPE arg2, OSId id, OSPri priority, void* stack); +// void padmgr_HandleRetraceMsg(PadMgr* padmgr); +// void padmgr_HandlePreNMI(PadMgr* padmgr); +//void padmgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 mode); +//void padmgr_Init(PadMgr* padmgr, OSMesg mesg, UNK_TYPE arg2, OSId id, OSPri priority, void* stack); // ? func_800C82A0(?); // ? func_800C84E4(?); // ? func_800C8534(?); diff --git a/include/padmgr.h b/include/padmgr.h index dda4b210fc..a7fa391f75 100644 --- a/include/padmgr.h +++ b/include/padmgr.h @@ -19,21 +19,22 @@ typedef struct { /* 0x0078 */ UNK_TYPE unk_78; /* 0x007C */ UNK_TYPE unk_7C; /* 0x0080 */ OSThread thread; - /* 0x0230 */ char unk_230[0x78]; - /* 0x02A8 */ u8 unk_2A8; - /* 0x02A9 */ u8 unk_2A9; - /* 0x02AA */ u8 unk_2AA[4]; - /* 0x02AA */ u8 unk_2AE[4]; // Looks like 1 if vibration pack, 2 if (maybe controller pack)? - /* 0x02B2 */ u8 unk_2B2[4]; - /* 0x02B6 */ u8 unk_2B6[4]; - /* 0x02BA */ char unk_2BA[0x02]; // probably padding + /* 0x0230 */ Input inputs[4]; //0x18 each = 0x60 total + /* 0x0290 */ PadState pads[4]; //0x6 each = 0x18 total + /* 0x02A8 */ u8 valid_ctrlrs_mask; + /* 0x02A9 */ u8 ncontrollers; + /* 0x02AA */ u8 Key_switch[4]; //means the controller is connected + /* 0x02AE */ u8 pak_type[4]; //1 if vibration pack, 2 if (maybe controller pack)? + /* 0x02B2 */ u8 rumble_enable[4]; + /* 0x02B6 */ u8 rumble_counter[4]; //not clear exact meaning + /* 0x02BA */ char unk_2BA[0x02]; //probably padding /* 0x02BC */ unk_controller_t unk_controller[4]; - /* 0x045C */ u8 unk_45C; - /* 0x045D */ u8 unk_45D; - /* 0x045E */ u8 unk_45E; + /* 0x045C */ u8 rumble_off_frames; + /* 0x045D */ u8 rumble_on_frames; + /* 0x045E */ u8 prenmi_shutdown; /* 0x045F */ u8 unk_45F; - /* 0x0460 */ void(*unk_460)(s32 a, s32 b); - /* 0x0464 */ s32 unk_464; + /* 0x0460 */ void (*unk_460)(void* padmgr, u32 unk464); + /* 0x0464 */ u32 unk_464; } PadMgr; // size = 0x468 diff --git a/include/ultra64/controller.h b/include/ultra64/controller.h index cf66ce0a5b..1521f4e8eb 100644 --- a/include/ultra64/controller.h +++ b/include/ultra64/controller.h @@ -2,11 +2,37 @@ #define _ULTRA64_CONTROLLER_H_ #include -#include #include #include +typedef struct +{ + /* 0x00 */ union{ + u16 button; + struct{ + u16 a : 1; + u16 b : 1; + u16 z : 1; + u16 s : 1; + u16 du : 1; + u16 dd : 1; + u16 dl : 1; + u16 dr : 1; + u16 illegal_h : 1; + u16 illegal_l : 1; + u16 l : 1; + u16 r : 1; + u16 cu : 1; + u16 cd : 1; + u16 cl : 1; + u16 cr : 1; + }; + }; + /* 0x02 */ s8 x; + /* 0x03 */ s8 y; +} PadInput; // size = 0x4 + typedef struct { u8 slot_type; //0xFF for valid command, 0x00 for don't read this controller, 0xFE for end of commands @@ -19,11 +45,7 @@ typedef struct { PIF_header_t hdr; union{ - struct{ - u16 button; - s8 rawStickX; - s8 rawStickY; - }; + PadInput input; struct{ u8 ctl_type_lo; u8 ctl_type_hi; diff --git a/include/z64.h b/include/z64.h index c6ff0a1723..8839ff5a6e 100644 --- a/include/z64.h +++ b/include/z64.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -244,30 +245,25 @@ typedef struct { } GraphicsContext; typedef struct { - /* 0x00 */ union { - struct { - u16 a : 1; - u16 b : 1; - u16 z : 1; - u16 s : 1; - u16 du : 1; - u16 dd : 1; - u16 dl : 1; - u16 dr : 1; - u16 : 2; - u16 l : 1; - u16 r : 1; - u16 cu : 1; - u16 cd : 1; - u16 cl : 1; - u16 cr : 1; + PadInput input; + union{ + u16 status; + struct{ + u8 errno; + u8 status_lo; }; - u16 pad; }; - /* 0x02 */ s8 x; - /* 0x03 */ s8 y; -} RawInput; // size = 0x4 +} PadState; +typedef struct +{ + /* 0x00 */ PadState current; + /* 0x06 */ PadState prev; + /* 0x0C */ PadState pressed_diff; + /* 0x12 */ PadState released_adj; +} Input; // size = 0x18 + +#if 0 typedef struct { /* 0x00 */ RawInput raw; /* 0x04 */ u16 status; @@ -282,6 +278,7 @@ typedef struct { /* 0x15 */ s8 yAdjusted; /* 0x16 */ char unk_16[0x02]; } Input; // size = 0x18 +#endif typedef struct { /* 0x0000 */ char unk_00[0x28]; diff --git a/spec b/spec index 5c9f3c8cc7..aac4515bf6 100644 --- a/spec +++ b/spec @@ -570,7 +570,7 @@ beginseg include "build/asm/code_80105C20.o" include "build/asm/code_80105CF0.o" include "build/data/code_80105CF0.data.o" - include "build/asm/code_80105F40.o" + include "build/src/code/code_80105F40.o" include "build/asm/code_80106170.o" include "build/asm/osSetTimer.o" include "build/src/libultra_code/__osSpGetStatus.o" diff --git a/src/boot/z_locale.c b/src/boot/z_locale.c index 4d2956e3ed..749ef5c586 100644 --- a/src/boot/z_locale.c +++ b/src/boot/z_locale.c @@ -45,7 +45,7 @@ u32 func_80001F48() { return 0; } - if (padMgr->unk_2A8 & 4) { + if (padMgr->valid_ctrlrs_mask & 4) { return 0; } @@ -59,7 +59,7 @@ u32 func_80001F8C() { return 0; } - if (padMgr->unk_2A8 & 4) { + if (padMgr->valid_ctrlrs_mask & 4) { return 1; } diff --git a/src/code/code_800A9F30.c b/src/code/code_800A9F30.c index ddc8c02238..8d283d4b11 100644 --- a/src/code/code_800A9F30.c +++ b/src/code/code_800A9F30.c @@ -7,7 +7,7 @@ extern PadMgr gPadMgr; void func_800A9F30(s32 a, s32 b) { func_800D2E30(&D_80160FD0); - func_800C7948(a, &D_80160FD0); + padmgr_RumbleSet(a, &D_80160FD0); } void func_800A9F6C(f32 a, u8 b, u8 c, u8 d) { @@ -44,7 +44,7 @@ void func_800AA0B4(void) { void func_800AA0F0(void) { PadMgr* padmgr = &gPadMgr; - if ((padmgr->unk_460 == func_800A9F30) && (padmgr->unk_464 == 0)) { + if (((void*)padmgr->unk_460 == (void*)func_800A9F30) && (padmgr->unk_464 == 0)) { padmgr->unk_460 = NULL; padmgr->unk_464 = 0; } @@ -53,7 +53,7 @@ void func_800AA0F0(void) { } u32 func_800AA148(void) { - return ((gPadMgr.unk_2AE[0] ^ 1) == 0); + return ((gPadMgr.pak_type[0] ^ 1) == 0); } void func_800AA15C(void) { diff --git a/src/code/code_80105F40.c b/src/code/code_80105F40.c new file mode 100644 index 0000000000..a78e7bfdfc --- /dev/null +++ b/src/code/code_80105F40.c @@ -0,0 +1,6 @@ +#include +#include + +#include + +#pragma GLOBAL_ASM("asm/non_matchings/code/code_80105F40/code_80105F40.s") diff --git a/src/code/fault.c b/src/code/fault.c index 05bee87d51..9eb2e88ea8 100644 --- a/src/code/fault.c +++ b/src/code/fault.c @@ -249,7 +249,7 @@ void Fault_Sleep(u32 duration) { void Fault_PadCallback(Input* input) { // BUG: this function is not called correctly and thus will crash from reading a bad pointer at 0x800C7E4C - func_800C7E08(input, 0); + padmgr_RequestPadData(input, 0); } void Fault_UpdatePadImpl() { diff --git a/src/code/main.c b/src/code/main.c index 5e2b9a89e9..b69358b96b 100644 --- a/src/code/main.c +++ b/src/code/main.c @@ -89,7 +89,7 @@ void Main(void* arg0) { func_800C3FEC(&gAudioMgr, sAudioStack + sizeof(sAudioStack), 0xc, 0xa, &gSchedContext, &gIrqMgr); StackCheck_Init(&sPadMgrStackInfo, sPadMgrStack, sPadMgrStack + sizeof(sPadMgrStack), 0, 0x100, "padmgr"); - PadMgr_Init(&gPadMgr, &sSiIntMsgQ, &gIrqMgr, 7, 0xe, &sIrqMgrStack); + padmgr_Init(&gPadMgr, &sSiIntMsgQ, &gIrqMgr, 7, 0xe, &sIrqMgrStack); func_800C3FC4(&gAudioMgr); diff --git a/src/code/padmgr.c b/src/code/padmgr.c index 5cc539dbf0..64a67c3745 100644 --- a/src/code/padmgr.c +++ b/src/code/padmgr.c @@ -1,290 +1,469 @@ #include #include -#include #include #include #include -s32 D_8012D280 = 1; +/* +Absent: padmgr_force_stop_ON padmgr.o +Absent: padmgr_force_stop_OFF padmgr.o +padmgr_PakConnectCheck padmgr.o +padmgr_HandleDoneReadPadMsg padmgr.o +padmgr_ConnectCheck padmgr.o +Absent: padmgr_RequestPadData_NonLock padmgr.o +Absent: padmgr_ClearPadData padmgr.o +Absent: padmgr_Create padmgr.o +Absent: padmgr_isConnectedController padmgr.o +*/ -OSMesgQueue* PadMgr_LockGetControllerQueue(PadMgr* padmgr) { +OSMesgQueue* padmgr_LockSerialMesgQ(PadMgr* padmgr) +{ OSMesgQueue* ctrlrqueue = NULL; - if (D_8012D280 > 2) { - // EUC-JP: ロック待ち | Waiting for lock - osSyncPrintf("%2d %d serialMsgQロック待ち %08x %08x %08x\n", osGetThreadId(NULL), - padmgr->queue1.validCount, padmgr, &padmgr->queue1, &ctrlrqueue); - } + if (D_8012D280 > 2) + osSyncPrintf(D_801457B0, osGetThreadId(NULL), padmgr->queue1.validCount, padmgr, &padmgr->queue1, &ctrlrqueue); osRecvMesg(&padmgr->queue1, &ctrlrqueue, OS_MESG_BLOCK); - if (D_8012D280 > 2) { - // EUC-JP: をロックしました | Locked - osSyncPrintf("%2d %d serialMsgQをロックしました %08x\n", osGetThreadId(NULL), - padmgr->queue1.validCount, ctrlrqueue); - } + if (D_8012D280 > 2) + osSyncPrintf(D_801457F0, osGetThreadId(NULL), padmgr->queue1.validCount, ctrlrqueue); return ctrlrqueue; } -void PadMgr_UnlockReleaseControllerQueue(PadMgr* padmgr, OSMesgQueue* ctrlrqueue) { - if (D_8012D280 > 2) { - // EUC-JP: ロック解除します | Unlock - osSyncPrintf("%2d %d serialMsgQロック解除します %08x %08x %08x\n", osGetThreadId(NULL), - padmgr->queue1.validCount, padmgr, &padmgr->queue1, ctrlrqueue); - } +void padmgr_UnlockSerialMesgQ(PadMgr* padmgr, OSMesgQueue* ctrlrqueue) +{ + if (D_8012D280 > 2) + osSyncPrintf(D_8014582C, osGetThreadId(NULL), padmgr->queue1.validCount, padmgr, &padmgr->queue1, ctrlrqueue); osSendMesg(&padmgr->queue1, ctrlrqueue, OS_MESG_BLOCK); - if (D_8012D280 > 2) { - // EUC-JP: ロック解除しました | Unlocked - osSyncPrintf("%2d %d serialMsgQロック解除しました %08x %08x %08x\n", osGetThreadId(NULL), - padmgr->queue1.validCount, padmgr, &padmgr->queue1, ctrlrqueue); - } + if (D_8012D280 > 2) + osSyncPrintf(D_80145860, osGetThreadId(NULL), padmgr->queue1.validCount, padmgr, &padmgr->queue1, ctrlrqueue); } -void PadMgr_Lock2(PadMgr* padmgr) { +void padmgr_LockContData(PadMgr* padmgr) +{ osRecvMesg(&padmgr->queue2, NULL, OS_MESG_BLOCK); } -void PadMgr_Unlock2(PadMgr* padmgr) { +void padmgr_UnlockContData(PadMgr* padmgr) +{ osSendMesg(&padmgr->queue2, NULL, OS_MESG_BLOCK); } #ifdef NON_MATCHING -// regalloc and minor ordering differences -void func_800C740C(PadMgr* padmgr) { - static u32 D_8012D284 = 0; - static u32 D_8016A4F0; - s32 temp; - s32 var1; +void padmgr_RumbleControl(PadMgr* padmgr) +{ + s32 tried_rumble_comm; OSMesgQueue* ctrlrqueue; - s32 var3; + s32 ctrlr; s32 var4; s32 i; - temp = 1; - ctrlrqueue = PadMgr_LockGetControllerQueue(padmgr); - var1 = 0; + ctrlrqueue = padmgr_LockSerialMesgQ(padmgr); + tried_rumble_comm = 0; - for (i = 0; i < 4; i++) { - if (padmgr->unk_2AA[i] != 0) { - if (padmgr->pad_status[i].status & 1) { - if (padmgr->unk_2AE[i] == temp) { - if (padmgr->unk_2B2[i] != 0) { - if (padmgr->unk_2B6[i] < 3) { - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パック ぶるぶるぶるぶる"); - osSyncPrintf(VT_RST); - - if (osSetVibration(&padmgr->unk_controller[i], temp) != 0) { - padmgr->unk_2AE[i] = 0; - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックで通信エラーが発生しました"); - osSyncPrintf(VT_RST); - } else { - padmgr->unk_2B6[i] = 3; + for (i = 0; i < 4; i++){ + if (padmgr->Key_switch[i] != 0){ + if (padmgr->pad_status[i].status & 1){ + if (padmgr->pak_type[i] == 1){ + + if (padmgr->rumble_enable[i]){ + if (padmgr->rumble_counter[i] < 3){ + osSyncPrintf(D_80145894); //"\x1b[33m" (probably formatting/debugger interface) + osSyncPrintf(D_8014589C, i + 1, D_801458B0); //"padmgr: %d[JPN]Con: ", "[JPN]Vibration pack jumble jumble" + osSyncPrintf(D_801458CC); //"\x1b[m" (probably formatting/debugger interface) + if (osSetVibration(&padmgr->unk_controller[i], 1) != 0){ + padmgr->pak_type[i] = 0; + osSyncPrintf(D_801458D0); + osSyncPrintf(D_801458D8, i + 1, D_801458EC); //"A communication error has occurred with the vibraton pack" + osSyncPrintf(D_80145914); + }else{ + padmgr->rumble_counter[i] = 3; } - - var1 = 1; + tried_rumble_comm = 1; } - } else { - if (padmgr->unk_2B6[i] != 0) { - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パック 停止"); - osSyncPrintf(VT_RST); - - if (osSetVibration(&padmgr->unk_controller[i], 0) != 0) { - padmgr->unk_2AE[i] = 0; - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックで通信エラーが発生しました"); - osSyncPrintf(VT_RST); - } else { - padmgr->unk_2B6[i]--; + }else{ + if (padmgr->rumble_counter[i] != 0){ + osSyncPrintf(D_80145918); + osSyncPrintf(D_80145920, i + 1, D_80145934); //"Stop vibration pack" + osSyncPrintf(D_80145944); + if (osSetVibration(&padmgr->unk_controller[i], 0) != 0){ + padmgr->pak_type[i] = 0; + osSyncPrintf(D_80145948); + osSyncPrintf(D_80145950, i + 1, D_80145964); //"A communication error has occurred with the vibration pack" + osSyncPrintf(D_8014598C); + }else{ + padmgr->rumble_counter[i]--; } - - var1 = 1; + tried_rumble_comm = 1; } } + } - } else { - if (padmgr->unk_2AE[i] != 0) { - if (padmgr->unk_2AE[i] == 1) { - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックが抜かれたようです"); - osSyncPrintf(VT_RST); - padmgr->unk_2AE[i] = 0; - } else { - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, - "振動パックではないコントローラパックが抜かれたようです"); - osSyncPrintf(VT_RST); - padmgr->unk_2AE[i] = 0; + }else{ + if (padmgr->pak_type[i] != 0){ + if (padmgr->pak_type[i] == 1){ + osSyncPrintf(D_80145990); + osSyncPrintf(D_80145998, i + 1, D_801459AC); //"Vibration pack seems to be pulled out" + osSyncPrintf(D_801459CC); + padmgr->pak_type[i] = 0; + }else{ + osSyncPrintf(D_801459D0); + osSyncPrintf(D_80145A24); + osSyncPrintf(D_801459D8, i + 1, D_801459EC); //"It seems that a controller pack that is not a vibration pack was pulled out" + padmgr->pak_type[i] = 0; } } } } } - if (!var1) { - var3 = D_8016A4F0 % 4; + if (!tried_rumble_comm) + { + ctrlr = D_8016A4F0 % 4; - if ((padmgr->unk_2AA[var3] != 0) && (padmgr->pad_status[var3].status & 1) && (padmgr->unk_2AE[var3] != 1)) { - var4 = osProbeVibrationPack(ctrlrqueue, &padmgr->unk_controller[var3], var3); + if ((padmgr->Key_switch[ctrlr] != 0) && (padmgr->pad_status[ctrlr].status & 1) && (padmgr->pak_type[ctrlr] != 1)) + { + var4 = osProbeVibrationPack(ctrlrqueue, &padmgr->unk_controller[ctrlr], ctrlr); - if (var4 == 0) { - padmgr->unk_2AE[var3] = 1; - osSetVibration(&padmgr->unk_controller[var3], 1); - osSetVibration(&padmgr->unk_controller[var3], 0); - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", var3 + 1, "振動パックを認識しました"); - osSyncPrintf(VT_RST); - } else if (var4 == 11) { - padmgr->unk_2AE[var3] = 2; - } else if (var4 == 4) { - LogUtils_LogThreadId("../padmgr.c", 282); - osSyncPrintf("++errcnt = %d\n", ++D_8012D284); - osSyncPrintf(VT_FGCOL(YELLOW)); - osSyncPrintf("padmgr: %dコン: %s\n", var3 + 1, "コントローラパックの通信エラー"); - osSyncPrintf(VT_RST); + if (var4 == 0) + { + padmgr->pak_type[ctrlr] = 1; + osSetVibration(&padmgr->unk_controller[ctrlr], 1); + osSetVibration(&padmgr->unk_controller[ctrlr], 0); + osSyncPrintf(D_80145A28); + osSyncPrintf(D_80145A30, ctrlr + 1, D_80145A44); //"Recognized vibration pack" + osSyncPrintf(D_80145A60); + } + else if (var4 == 11) + { + padmgr->pak_type[ctrlr] = 2; + } + else if (var4 == 4) + { + LogUtils_LogThreadId(D_80145A64, 282); + ++D_8012D284; + osSyncPrintf(D_80145A70, D_8012D284); //"++errcnt = %d" + osSyncPrintf(D_80145A80); + osSyncPrintf(D_80145A88, ctrlr + 1, D_80145A9C); //"Controller pack communication error" + osSyncPrintf(D_80145ABC); } } } D_8016A4F0++; - PadMgr_UnlockReleaseControllerQueue(padmgr, ctrlrqueue); + padmgr_UnlockSerialMesgQ(padmgr, ctrlrqueue); } #else -u32 D_8012D284 = 0; -u32 D_8016A4F0; -#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_800C740C.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/padmgr_RumbleControl.s") #endif -// func_800A2300 in 1.0 -void func_800C7818(PadMgr* padmgr) { +//func_800A2300 in 1.0 +void padmgr_RumbleStop(PadMgr* padmgr) +{ s32 i; OSMesgQueue* ctrlrqueue; - ctrlrqueue = PadMgr_LockGetControllerQueue(padmgr); + ctrlrqueue = padmgr_LockSerialMesgQ(padmgr); - for (i = 0; i < 4; i++) { - if (osProbeVibrationPack(ctrlrqueue, &padmgr->unk_controller[i], i) == 0) { - if ((gFaultStruct.msgId == 0) && (padmgr->unk_45D != 0)) { - osSyncPrintf(VT_FGCOL(YELLOW)); - // EUC-JP: コン | 'Con'? , EUC-JP: 振動パック 停止 | Stop vibration pack - osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パック 停止"); - osSyncPrintf(VT_RST); + for (i = 0; i < 4; i++) + { + if (osProbeVibrationPack(ctrlrqueue, &padmgr->unk_controller[i], i) == 0) + { + if ((gFaultStruct.msgId == 0) && (padmgr->rumble_on_frames != 0)) + { + osSyncPrintf(D_80145AC0); + osSyncPrintf(D_80145AC8, i + 1, D_80145ADC); //"Stop vibration pack" + osSyncPrintf(D_80145AEC); } osSetVibration(&padmgr->unk_controller[i], 0); } } - PadMgr_UnlockReleaseControllerQueue(padmgr, ctrlrqueue); + padmgr_UnlockSerialMesgQ(padmgr, ctrlrqueue); } -void func_800C7928(PadMgr* padmgr) { - padmgr->unk_45C = 3; +void padmgr_RumbleReset(PadMgr* padmgr) +{ + padmgr->rumble_off_frames = 3; } -void func_800C7934(PadMgr* padmgr, u32 a1, u32 a2) { - padmgr->unk_2B2[a1] = a2; - padmgr->unk_45D = 0xF0; +void padmgr_RumbleSetSingle(PadMgr* padmgr, u32 ctrlr, u32 rumble) +{ + padmgr->rumble_enable[ctrlr] = rumble; + padmgr->rumble_on_frames = 0xF0; +} + +void padmgr_RumbleSet(PadMgr* padmgr, u8* ctrlr_rumbles) +{ + //This volatile nonsense is probably not what they wrote-- + //padmgr_RumbleSetSingle above is never called and its symbol isn't exported, + //so it looks like that was probably inlined. But we couldn't get any of that + //to work or match. This, however, does match. + s32 i; + for(i=0; i<4; ++i){ + *(volatile u8*)&padmgr->rumble_enable[i] = ctrlr_rumbles[i]; + } + *(volatile u8*)&padmgr->rumble_on_frames = 0xF0; } #ifdef NON_MATCHING -// minor ordering difference -// 800A23CC in 1.0 -void func_800C7948(PadMgr* padmgr, u8* a1) { - padmgr->unk_2B2[0] = a1[0]; - padmgr->unk_2B2[1] = a1[1]; - padmgr->unk_2B2[2] = a1[2]; - padmgr->unk_2B2[3] = a1[3]; +void func_800C7974(PadMgr* padmgr) +{ + /* + void *sp34; + s32 temp_s1; + s32 temp_v0_5; + u16 temp_a1; + u16 temp_v1_2; + u8 temp_v0; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v1; + void *phi_s0; + void *phi_s3; + s32 phi_s2; + s32 phi_s1; + */ + Input* input; + PadState* padnow1; //name from debug string + s32 i; - padmgr->unk_45D = 0xF0; // NON MATCHING - T0 and T9 are reordered for some reason + padmgr_LockContData(); + input = padmgr->inputs; //s0 + padnow1 = padmgr->pads; //s3 + for(i=0; incontrollers; ++i, ++input, ++padnow1){ //TODO with an extra if (padmgr->ncontrollers > 0) + input->prev.input = input->current.input; + input->prev.status = input->current.status; + temp_v0 = phi_s3->unk4; + switch(padnow1->errno){ + case 0: + input->current.input = padnow1->input; + input->current.status = padnow1->status; + if (padmgr->Key_switch[i] == 0) { + padmgr->Key_switch[i] = 1; + osSyncPrintf(&D_80145AF0); //"\x1b[33m" + osSyncPrintf(&D_80145AF8, phi_s2 + 1, &D_80145B0C); //"padmgr: %dCon: %s\n" : "Recognized" + osSyncPrintf(&D_80145B1C); //"\x1b[m" + } + break; + case 4: + input->current.input = input->prev.input; + input->current.status = input->prev.status; + LogUtils_LogThreadId(&D_80145B20, 0x17c); //"../padmgr.c" + osSyncPrintf(&D_80145B2C, padmgr->Key_switch[i]); //"this->Key_switch[i] = %d\n" + osSyncPrintf(&D_80145B48); //"\x1b[33m" + osSyncPrintf(&D_80145B50, temp_s1, &D_80145B64); //"padmgr: %dCon: %s\n" : "Overrun error occurred" + osSyncPrintf(&D_80145B80); //"\x1b[m" + break; + case 8: + input->current.input.button = 0; + input->current.input.x = 0; + input->current.input.y = 0; + temp_v0_2 = arg0 + phi_s2; + input->current.errno = padnow1->errno; + if (temp_v0_2->Key_switch != 0){ + temp_v0_2->Key_switch = 0; + temp_v0_2->pak_type = 0; + temp_v0_2->rumble_counter = 0xff; + osSyncPrintf(&D_80145B84); //"\x1b[33m" + osSyncPrintf(&D_80145B8C, phi_s2 + 1, &D_80145BA0); //"padmgr: %dCon: %s\n" : "Do not respond" + osSyncPrintf(&D_80145BB0); //"\x1b[m" + } + break; + default: + LogUtils_LogThreadId(&D_80145BB4, 0x18c); //"../padmgr.c" + osSyncPrintf(&D_80145BC0, padnow1->errno); //"padnow1->errno = %x\n" + Fault_AddHungupAndCrash(&D_80145BD8, 0x18d); //"../padmgr.c" + } + + temp_v1_2 = phi_s0->unk6; + temp_a1 = phi_s0->unk0; + temp_v0_5 = temp_v1_2 ^ temp_a1; + phi_s0->unkC = (u16) (phi_s0->unkC | (temp_v0_5 & temp_a1)); + phi_s0->unk12 = (u16) (phi_s0->unk12 | (temp_v0_5 & temp_v1_2)); + func_800FCC6C(phi_s0, temp_a1); + phi_s0->unkE = (s8) (phi_s0->unkE + (phi_s0->unk2 - phi_s0->unk8)); + phi_s0->unkF = (s8) (phi_s0->unkF + (phi_s0->unk3 - phi_s0->unk9)); + } + padmgr_UnlockContData(arg0); } #else -#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_800C7948.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_800C7974.s") #endif -#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_800C7974.s") +void padmgr_HandleRetraceMsg(PadMgr *padmgr) +{ + OSMesgQueue *queue; //s1 + u32 i; + u32 mask; -#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_800C7C14.s") - -void func_800C7DD0(PadMgr* padmgr) { - osSyncPrintf("padmgr_HandlePreNMI()\n"); - padmgr->unk_45E = 1; - func_800C7928(padmgr); + queue = padmgr_LockSerialMesgQ(padmgr); + osContStartReadData(queue); + if (padmgr->unk_460 != NULL){ + padmgr->unk_460(padmgr, padmgr->unk_464); + } + osRecvMesg(queue, NULL, OS_MESG_BLOCK); + osContGetReadData(&padmgr->pads[0]); + if (padmgr->prenmi_shutdown){ + bzero(&padmgr->pads[0], 0x18); + } + func_800C7974(padmgr); + func_80103210(queue); + osRecvMesg(queue, NULL, OS_MESG_BLOCK); + func_8010328C(padmgr); + padmgr_UnlockSerialMesgQ(padmgr, queue); + + mask = 0; //s2 + for(i=0; i-4!=0; ++i){ //s1 + if(padmgr->pad_status[i].errno == 0){ + if(padmgr->pad_status[i].type - 5 == 0){ + mask |= 1 << i; + }else{ + LogUtils_LogThreadId(D_80145BE4, 0x1ca); //"../padmgr.c", line 0x1CA + osSyncPrintf(D_80145BF0, padmgr->pad_status[i].type); //"this->pad_status[i].type = %x\n" + osSyncPrintf(D_80145C10); //"An unknown type of controller is connected" + } + } + } + padmgr->valid_ctrlrs_mask = mask; + + if (gFaultStruct.msgId){ + padmgr_RumbleStop(padmgr); + return; + } + if ((s32)(padmgr->rumble_off_frames) > 0){ + padmgr->rumble_off_frames = *(volatile u8*)&padmgr->rumble_off_frames - 1; + padmgr_RumbleStop(padmgr); + return; + } + if (padmgr->rumble_on_frames == 0){ + padmgr_RumbleStop(padmgr); + return; + } + if (!padmgr->prenmi_shutdown){ + padmgr_RumbleControl(padmgr); + --padmgr->rumble_on_frames; + } } -#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/func_800C7E08.s") -// void func_800C7E08(Input*, u32); +void padmgr_HandlePreNMI(PadMgr* padmgr) +{ + osSyncPrintf(D_80145C40); //"padmgr_HandlePreNMI()\n" + padmgr->prenmi_shutdown = 1; + padmgr_RumbleReset(padmgr); +} -// 800A2918 in 1.0 -void PadMgr_Run(PadMgr* padmgr) { +#ifdef NON_MATCHING +//Regalloc differences +void padmgr_RequestPadData(PadMgr *padmgr, Input *inputs, s32 mode) +{ + u32 i; + Input *pm_inputs; + Input *newin; + + padmgr_LockContData(padmgr); + pm_inputs = padmgr->inputs; + newin = inputs; + for(i=0; i<4; ++i){ + if(mode){ + *newin = *pm_inputs; + pm_inputs->pressed_diff.input.button = 0; + pm_inputs->pressed_diff.input.x = 0; + pm_inputs->pressed_diff.input.y = 0; + pm_inputs->released_adj.input.button = 0; + }else{ + newin->prev = newin->current; + newin->current = pm_inputs->current; + newin->pressed_diff.input.button = newin->current.input.button & (newin->prev.input.button ^ newin->current.input.button); + newin->released_adj.input.button = newin->prev.input.button & (newin->prev.input.button ^ newin->current.input.button); + func_800FCC6C(newin); + newin->pressed_diff.input.x = (newin->current.input.x - newin->prev.input.x) + newin->pressed_diff.input.x; + newin->pressed_diff.input.y = (newin->current.input.y - newin->prev.input.y) + newin->pressed_diff.input.y; + /* + //Correct instructions, wrong regalloc + newin->prev = newin->current; + newin->current = pm_inputs->current; + newin->pressed_diff.input.button = newin->current.input.button & (newin->prev.input.button ^ newin->current.input.button); + newin->released_adj.input.button = newin->prev.input.button & (newin->prev.input.button ^ newin->current.input.button); + func_800FCC6C(newin); + newin->pressed_diff.input.x = (newin->current.input.x - newin->prev.input.x) + newin->pressed_diff.input.x; + newin->pressed_diff.input.y = (newin->current.input.y - newin->prev.input.y) + newin->pressed_diff.input.y; + */ + } + ++pm_inputs; + ++newin; + } + padmgr_UnlockContData(padmgr); +} +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/padmgr/padmgr_RequestPadData.s") +#endif + +//800A2918 in 1.0 +void padmgr_MainProc(PadMgr* padmgr) //probably static +{ s16* mesg; - s32 bVar2; + s32 exit; mesg = NULL; - // EUC-JP: コントローラスレッド実行開始 | Start of controller thread execution - osSyncPrintf("コントローラスレッド実行開始\n"); - bVar2 = 0; + osSyncPrintf(D_80145C58); //"Start of controller thread execution" + exit = 0; - while (bVar2 == 0) { - if ((D_8012D280 > 2) && (padmgr->queue3.validCount == 0)) { - // EUC-JP: コントローラスレッドイベント待ち | Waiting for controller thread event - osSyncPrintf("コントローラスレッドイベント待ち %lld\n", (osGetTime() * 64) / 3000); - } + while (!exit){ + if ((D_8012D280 > 2) && (padmgr->queue3.validCount == 0)) + osSyncPrintf(D_80145C78, (osGetTime() * 64) / 3000); //"Waiting for controller thread event" osRecvMesg(&padmgr->queue3, &mesg, OS_MESG_BLOCK); - LogUtils_CheckNullPointer("msg", mesg, "../padmgr.c", 563); + LogUtils_CheckNullPointer(D_80145CA0, mesg, D_80145CA4, 563); //"msg", "../padmgr.c", line 563 - switch (*mesg) { - case OS_SC_RETRACE_MSG: - if (D_8012D280 > 2) { - osSyncPrintf("padmgr_HandleRetraceMsg START %lld\n", (osGetTime() * 64) / 3000); - } + switch (*mesg){ + case 1: + if (D_8012D280 > 2) + osSyncPrintf(D_80145CB0, (osGetTime() * 64) / 3000); //"padmgr_HandleRetraceMsg START %lld\n" - func_800C7C14(padmgr); + padmgr_HandleRetraceMsg(padmgr); - if (D_8012D280 > 2) { - osSyncPrintf("padmgr_HandleRetraceMsg END %lld\n", (osGetTime() * 64) / 3000); - } + if (D_8012D280 > 2) + osSyncPrintf(D_80145CD4, (osGetTime() * 64) / 3000); //"padmgr_HandleRetraceMsg END %lld\n" break; - case OS_SC_PRE_NMI_MSG: - func_800C7DD0(padmgr); + case 4: + padmgr_HandlePreNMI(padmgr); break; - case OS_SC_NMI_MSG: - bVar2 = 1; + case 3: + exit = 1; break; } } - IrqMgr_RemoveClient(padmgr->unk_78, &padmgr->unk_70); - // EUC-JP: コントローラスレッド実行終了 | Controller thread execution end - osSyncPrintf("コントローラスレッド実行終了\n"); + func_800D3300(padmgr->unk_78, &padmgr->unk_70); + osSyncPrintf(D_80145CF8); //Not translated, probably "End of controller thread execution" } -// func_800A2A14 in 1.0 -void PadMgr_Init(PadMgr* padmgr, OSMesgQueue* ctrlrqueue, UNK_TYPE arg2, OSId id, OSPri priority, void* stack) { - // EUC-JP: パッドマネージャ作成 | Create pad manager - osSyncPrintf("パッドマネージャ作成 padmgr_Create()\n"); +//func_800A2A14 in 1.0 +void padmgr_Init(PadMgr* padmgr, OSMesgQueue* ctrlrqueue, UNK_TYPE arg2, OSId id, OSPri priority, void* stack) +{ + osSyncPrintf(D_80145D18); //"Create pad manager" bzero(padmgr, sizeof(PadMgr)); padmgr->unk_78 = arg2; osCreateMesgQueue(&padmgr->queue3, padmgr->msgbuf3, 4); - IrqMgr_AddClient(padmgr->unk_78, &padmgr->unk_70, &padmgr->queue3); + func_800D3220(padmgr->unk_78, &padmgr->unk_70, &padmgr->queue3); osCreateMesgQueue(&padmgr->queue1, padmgr->msgbuf1, 1); - PadMgr_UnlockReleaseControllerQueue(padmgr, ctrlrqueue); + padmgr_UnlockSerialMesgQ(padmgr, ctrlrqueue); osCreateMesgQueue(&padmgr->queue2, padmgr->msgbuf2, 1); - PadMgr_Unlock2(padmgr); - func_800FCD40(ctrlrqueue, &padmgr->unk_2A8, padmgr); + padmgr_UnlockContData(padmgr); + func_800FCD40(ctrlrqueue, &padmgr->valid_ctrlrs_mask, padmgr); - padmgr->unk_2A9 = 4; - func_80104D00(padmgr->unk_2A9); + padmgr->ncontrollers = 4; + func_80104D00(padmgr->ncontrollers); - osCreateThread(&padmgr->thread, id, PadMgr_Run, padmgr, stack, priority); + osCreateThread(&padmgr->thread, id, padmgr_MainProc, padmgr, stack, priority); osStartThread(&padmgr->thread); } diff --git a/src/code/z_demo.c b/src/code/z_demo.c index dd47227d41..25247a8159 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -100,14 +100,14 @@ void func_80064558(GlobalContext* globalCtx, CutsceneContext* csCtx) { void func_800645A0(GlobalContext* globalCtx, CutsceneContext* csCtx) { CutsceneStateHandler handler; - if (!~(globalCtx->state.input[0].padPressed | -0x201) && (csCtx->state == CS_STATE_IDLE) && + if (!~(globalCtx->state.input[0].pressed_diff.input.button | -0x201) && (csCtx->state == CS_STATE_IDLE) && (gSaveContext.scene_setup_index >= 4)) { D_8015FCC8 = 0; gSaveContext.cutscene_index = 0xFFFD; gSaveContext.cutscene_trigger = 1; } - if (!~(globalCtx->state.input[0].padPressed | -0x801) && (csCtx->state == CS_STATE_IDLE) && + if (!~(globalCtx->state.input[0].pressed_diff.input.button | -0x801) && (csCtx->state == CS_STATE_IDLE) && (gSaveContext.scene_setup_index >= 4) && (D_8011D394 == 0)) { D_8015FCC8 = 1; gSaveContext.cutscene_index = 0xFFFD; @@ -456,15 +456,15 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt if ((gSaveContext.game_mode != 0) && (gSaveContext.game_mode != 3) && (globalCtx->sceneNum != SCENE_SPOT00) && (csCtx->frames > 20) && - (!~(globalCtx->state.input[0].padPressed | 0xFFFF7FFF) || !~(globalCtx->state.input[0].padPressed | -0x4001) || - !~(globalCtx->state.input[0].padPressed | -0x1001)) && + (!~(globalCtx->state.input[0].pressed_diff.input.button | 0xFFFF7FFF) || !~(globalCtx->state.input[0].pressed_diff.input.button | -0x4001) || + !~(globalCtx->state.input[0].pressed_diff.input.button | -0x1001)) && (gSaveContext.file_num != 0xFEDC) && (globalCtx->sceneLoadFlag == 0)) { Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); temp = 1; } if ((csCtx->frames == cmd->startFrame) || (temp != 0) || - ((csCtx->frames > 20) && (!~(globalCtx->state.input[0].padPressed | -0x1001)) && + ((csCtx->frames > 20) && (!~(globalCtx->state.input[0].pressed_diff.input.button | -0x1001)) && (gSaveContext.file_num != 0xFEDC))) { csCtx->state = CS_STATE_UNSKIPPABLE_EXEC; func_800F68BC(0); @@ -1536,7 +1536,7 @@ void Cutscene_ProcessCommands(GlobalContext* globalCtx, CutsceneContext* csCtx, return; } - if (!~(globalCtx->state.input[0].padPressed | -0x101)) { + if (!~(globalCtx->state.input[0].pressed_diff.input.button | -0x101)) { csCtx->state = CS_STATE_UNSKIPPABLE_INIT; return; } diff --git a/src/libultra_code/code_80105F40.c b/src/libultra_code/code_80105F40.c new file mode 100644 index 0000000000..681ed8805a --- /dev/null +++ b/src/libultra_code/code_80105F40.c @@ -0,0 +1,139 @@ +#include +#include + +#include + +#if 0 +//#ifdef NON_MATCHING + +typedef struct { + u8 unk[0x20]; +} unk_t; + +//TODO check SM64 +s32 func_80105F40(OSMesgQueue* ctrlrqueue, u32 ctrlridx, u16 Oxfourhundred, unk_t* arg3) +{ + s32 sp44; + s32 sp40; + s32 temp_a0; + s32 temp_ret; + s32 temp_s2; + s32 temp_s3; + s32 temp_v0; + s32 temp_v0_2; + s32 temp_v0_3; + void *temp_s0; + void *temp_s0_2; + void *phi_s0; + s32 phi_v0; + void *phi_s0_2; + s32 phi_v0_2; + void *phi_s0_3; + void *phi_s0_4; + s32 phi_s3; + s32 phi_s5; + s32 phi_s3_2; + + __osSiGetAccess(); + sp40 = (s32) (Oxfourhundred << 5); + sp44 = (s32) (Oxfourhundred >> 3); + phi_s5 = 2; +loop_1: + if ((_osCont_lastPollType != 2) || (ctrlridx != D_80134D20)) + { + _osCont_lastPollType = (u8)2U; + D_80134D20 = ctrlridx; + phi_s0_3 = &D_80175960; + if (ctrlridx > 0) + { + temp_a0 = ctrlridx & 3; + temp_v0 = 0 + 4; + phi_s0 = &D_80175960; + phi_v0 = temp_v0; + phi_s0_2 = &D_80175960; + phi_v0_2 = temp_v0; + if (((temp_a0 == 0) || (temp_a0 != temp_v0_3)) || (temp_v0_3 != ctrlridx)) + { +loop_7: + phi_s0_2->unk0 = (u8)0; + phi_s0_2->unk1 = (u8)0; + phi_s0_2->unk2 = (u8)0; + phi_s0_2->unk3 = (u8)0; + temp_v0_2 = phi_v0_2 + 4; + temp_s0 = phi_s0_2 + 4; + phi_s0_2 = temp_s0; + phi_v0_2 = temp_v0_2; + phi_s0_3 = temp_s0; + if (temp_v0_2 != ctrlridx) + { + goto loop_7; + } + } + else + { + + } + } + D_80175960.unk3C = 1; + phi_s0_3->unk0 = (u8)0xff; + phi_s0_3->unk1 = (u8)3; + phi_s0_3->unk2 = (u8)0x21; + phi_s0_3->unk3 = (u8)2; + phi_s0_3->unk26 = (u8)0xff; + phi_s0_3->unk27 = (u8)0xfe; + phi_s0_4 = phi_s0_3; + } + else + { + phi_s0_4 = &D_80175960 + ctrlridx; + } + phi_s0_4->unk4 = sp44; + phi_s0_4->unk5 = (s8) (func_80106170(Oxfourhundred & 0xffff, Oxfourhundred) | sp40); + __osSiRawStartDma(1, &D_80175960); + osRecvMesg(ctrlrqueue, 0, 1); + __osSiRawStartDma(0, &D_80175960); + osRecvMesg(ctrlrqueue, 0, 1); + temp_s2 = phi_s0_4 + 6; + temp_s3 = (s32) (phi_s0_4->unk2 & 0xc0) >> 4; + if (temp_s3 == 0) + { + if (phi_s0_4->unk26 != func_80106240(temp_s2)) + { + temp_ret = func_80101910(ctrlrqueue, ctrlridx); + phi_s3_2 = temp_ret; + if (temp_ret == 0) + { + phi_s3 = 4; +block_16: +block_17: + phi_s3_2 = phi_s3; + if (phi_s3 == 4) + { + phi_s5 = phi_s5 - 1; + phi_s3_2 = phi_s3; + if (phi_s5 >= 0) + { + goto loop_1; + } + } + } + } + else + { + bcopy(temp_s2, arg3, 0x20); + phi_s3 = temp_s3; + goto block_17; + } + } + else + { + phi_s3 = 1; + goto block_16; + } + __osSiRelAccess(); + return phi_s3_2; +} + +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/code_80105F40/code_80105F40.s") +#endif diff --git a/src/libultra_code/osContStartReadData.c b/src/libultra_code/osContStartReadData.c index 9bd0bfbd23..60e415028a 100644 --- a/src/libultra_code/osContStartReadData.c +++ b/src/libultra_code/osContStartReadData.c @@ -26,9 +26,9 @@ void osContGetReadData(OSContPad* pad) { slot = *slot_ptr; pad->errno = (slot.hdr.status_hi_bytes_rec_lo & 0xc0) >> 4; if (pad->errno == 0) { - pad->button = slot.button; - pad->stick_x = slot.rawStickX; - pad->stick_y = slot.rawStickY; + pad->button = slot.input.button; + pad->stick_x = slot.input.x; + pad->stick_y = slot.input.y; } }; } @@ -46,9 +46,9 @@ void __osPackReadData() { slot.hdr.bytes_send = 1; slot.hdr.status_hi_bytes_rec_lo = 4; slot.hdr.command = 1; - slot.button = 0xFFFF; - slot.rawStickX = 0xFF; - slot.rawStickY = 0xFF; + slot.input.button = 0xFFFF; + slot.input.x = 0xFF; + slot.input.y = 0xFF; for (i = 0; i < _osCont_numControllers; i++) { *slot_ptr++ = slot; }