diff options
-rw-r--r-- | asm/librfu.s | 3255 | ||||
-rw-r--r-- | include/librfu.h | 75 | ||||
-rw-r--r-- | src/librfu_rfu.c | 1095 |
3 files changed, 1139 insertions, 3286 deletions
diff --git a/asm/librfu.s b/asm/librfu.s index d3b48f07e..c98ee854c 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,3261 +5,6 @@ .text - thumb_func_start rfu_REQBN_watchLink -rfu_REQBN_watchLink: @ 81E13F0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - mov r8, r1 - str r2, [sp] - str r3, [sp, 0x4] - lsls r0, 16 - lsrs r5, r0, 16 - movs r0, 0 - str r0, [sp, 0x8] - movs r1, 0 - str r1, [sp, 0xC] - mov r2, r8 - strb r1, [r2] - mov r0, sp - ldrb r1, [r0, 0xC] - ldr r0, [sp] - strb r1, [r0] - mov r2, sp - ldrb r0, [r2, 0xC] - ldr r2, [sp, 0x4] - strb r0, [r2] - ldr r4, _081E1490 @ =gRfuLinkStatus - ldr r0, [r4] - ldrb r0, [r0] - cmp r0, 0xFF - bne _081E142E - b _081E178E -_081E142E: - ldr r0, _081E1494 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0x14] - cmp r0, 0 - bne _081E143A - b _081E178E -_081E143A: - ldr r3, _081E1498 @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _081E144E - movs r0, 0xB4 - lsls r0, 1 - strh r0, [r2, 0x20] -_081E144E: - ldr r1, [r3] - ldrb r0, [r1, 0x6] - cmp r0, 0 - bne _081E1460 - ldr r0, [r4] - ldrb r0, [r0, 0x9] - strb r0, [r1, 0x6] - movs r1, 0x1 - str r1, [sp, 0x8] -_081E1460: - lsls r0, r5, 24 - lsrs r0, 24 - cmp r0, 0x29 - bne _081E14A0 - ldr r0, _081E149C @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrb r0, [r1, 0x4] - mov r2, r8 - strb r0, [r2] - ldrb r0, [r1, 0x5] - ldr r1, [sp] - strb r0, [r1] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _081E148A - ldr r0, [r4] - ldrb r0, [r0, 0x2] - strb r0, [r2] -_081E148A: - movs r2, 0x2 - str r2, [sp, 0x8] - b _081E14F8 - .align 2, 0 -_081E1490: .4byte gRfuLinkStatus -_081E1494: .4byte gRfuState -_081E1498: .4byte gRfuStatic -_081E149C: .4byte gRfuFixed -_081E14A0: - movs r0, 0x9B - lsls r0, 1 - cmp r5, r0 - bne _081E14F0 - ldr r0, _081E154C @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r6, [r0, 0x5] - ldr r0, [r4] - ldrb r0, [r0, 0x2] - eors r6, r0 - ands r6, r0 - mov r0, r8 - strb r6, [r0] - movs r0, 0x1 - ldr r1, [sp] - strb r0, [r1] - movs r5, 0 -_081E14C6: - mov r2, r8 - ldrb r0, [r2] - asrs r0, r5 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E14E6 - ldr r0, _081E1550 @ =gRfuLinkStatus - ldr r0, [r0] - adds r0, 0xA - adds r0, r5 - movs r1, 0 - strb r1, [r0] - adds r0, r5, 0 - bl rfu_STC_removeLinkData -_081E14E6: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E14C6 -_081E14F0: - ldr r0, [sp, 0x8] - cmp r0, 0 - bne _081E14F8 - b _081E178E -_081E14F8: - ldr r4, _081E154C @ =gRfuFixed - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - ldr r1, [r0] - str r1, [sp, 0x10] - ldr r0, [r0, 0x4] - str r0, [sp, 0x14] - ldr r0, _081E1554 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_LinkStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0xC] - cmp r0, 0 - bne _081E1558 - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - adds r2, r0, 0x4 - movs r5, 0 - ldr r3, _081E1550 @ =gRfuLinkStatus -_081E152C: - ldr r0, [r3] - adds r0, 0xA - adds r0, r5 - ldrb r1, [r2] - strb r1, [r0] - adds r2, 0x1 - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E152C - movs r2, 0 - mov r9, r2 - movs r5, 0 - b _081E1564 - .align 2, 0 -_081E154C: .4byte gRfuFixed -_081E1550: .4byte gRfuLinkStatus -_081E1554: .4byte rfu_CB_defaultCallback -_081E1558: - movs r0, 0x11 - ldr r1, [sp, 0xC] - bl rfu_STC_REQ_callback - ldr r0, [sp, 0xC] - b _081E1790 -_081E1564: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r5 - lsrs r6, r0, 24 - adds r0, r5, 0x1 - mov r10, r0 - ldr r1, [sp, 0xC] - cmp r1, 0 - beq _081E1578 - b _081E1742 -_081E1578: - ldr r2, [sp, 0x8] - cmp r2, 0x1 - bne _081E164E - ldr r4, _081E15B8 @ =gRfuLinkStatus - ldr r1, [r4] - ldrb r0, [r1, 0x2] - ands r0, r6 - cmp r0, 0 - beq _081E164E - adds r0, r1, 0 - adds r0, 0xA - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0 - bne _081E1640 - ldrb r0, [r1] - cmp r0, 0x1 - bne _081E15C0 - ldr r2, _081E15BC @ =gRfuStatic - ldr r1, [r2] - adds r1, 0xA - adds r1, r5 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - ldr r0, [r2] - adds r0, 0xA - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0x3 - bls _081E164E - b _081E1626 - .align 2, 0 -_081E15B8: .4byte gRfuLinkStatus -_081E15BC: .4byte gRfuStatic -_081E15C0: - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E164E - ldr r0, _081E15F0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E15F4 - mov r2, r8 - ldrb r1, [r2] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2] - mov r0, sp - ldrb r1, [r0, 0x8] - ldr r0, [sp] - b _081E164C - .align 2, 0 -_081E15F0: .4byte gRfuFixed -_081E15F4: - ldr r2, _081E163C @ =gRfuStatic - ldr r1, [r2] - adds r1, 0xA - adds r1, r5 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - lsls r0, 24 - ldr r2, [r2] - lsrs r0, 24 - ldrh r1, [r2, 0x1A] - cmp r0, r1 - bls _081E164E - adds r0, r2, 0 - adds r0, 0xA - adds r0, r5 - mov r2, sp - ldrb r2, [r2, 0xC] - strb r2, [r0] - ldr r0, [r4] - ldrb r0, [r0, 0x2] - bl STWI_send_DisconnectREQ - bl STWI_poll_CommandEnd -_081E1626: - mov r0, r8 - ldrb r1, [r0] - adds r0, r6, 0 - orrs r0, r1 - mov r1, r8 - strb r0, [r1] - mov r2, sp - ldrb r0, [r2, 0x8] - ldr r2, [sp] - strb r0, [r2] - b _081E164E - .align 2, 0 -_081E163C: .4byte gRfuStatic -_081E1640: - ldr r0, _081E16B0 @ =gRfuStatic - ldr r0, [r0] - adds r0, 0xA - adds r0, r5 - mov r1, sp - ldrb r1, [r1, 0xC] -_081E164C: - strb r1, [r0] -_081E164E: - ldr r2, _081E16B4 @ =gRfuLinkStatus - mov r12, r2 - ldr r1, [r2] - ldrb r7, [r1] - adds r0, r5, 0x1 - mov r10, r0 - cmp r7, 0x1 - bne _081E1742 - adds r0, r1, 0 - adds r0, 0xA - adds r4, r0, r5 - ldrb r3, [r4] - cmp r3, 0 - beq _081E1742 - ldrb r2, [r1, 0x3] - adds r0, r6, 0 - ands r0, r2 - cmp r0, 0 - beq _081E16BE - cmp r3, 0xA - bls _081E16B8 - ldr r2, [sp, 0x4] - ldrb r1, [r2] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2] - mov r0, r12 - ldr r2, [r0] - ldrb r1, [r2, 0x2] - adds r0, r6, 0 - orrs r0, r1 - movs r3, 0 - strb r0, [r2, 0x2] - mov r2, r12 - ldr r1, [r2] - ldrb r0, [r1, 0x3] - bics r0, r6 - strb r0, [r1, 0x3] - ldr r1, [r2] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r0, _081E16B0 @ =gRfuStatic - ldr r0, [r0] - adds r0, 0xA - adds r0, r5 - strb r3, [r0] - b _081E1742 - .align 2, 0 -_081E16B0: .4byte gRfuStatic -_081E16B4: .4byte gRfuLinkStatus -_081E16B8: - movs r0, 0 - strb r0, [r4] - b _081E1742 -_081E16BE: - ldrb r0, [r1, 0x2] - orrs r0, r2 - ands r0, r6 - cmp r0, 0 - bne _081E1742 - bl STWI_send_SlotStatusREQ - bl STWI_poll_CommandEnd - ldr r0, _081E1708 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r2, [r0] - ldrb r0, [r2, 0x1] - subs r0, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - adds r2, 0x8 - cmp r3, 0 - beq _081E1742 - ldrh r4, [r2] - ldrb r0, [r2, 0x2] - cmp r0, r5 - bne _081E1710 - ldr r0, _081E170C @ =gRfuStatic - ldr r0, [r0] - lsls r1, r5, 1 - adds r0, 0x12 - adds r0, r1 - ldrh r0, [r0] - cmp r4, r0 - bne _081E1710 - lsls r7, r5 - mov r0, r9 - orrs r0, r7 - lsls r0, 24 - b _081E173E - .align 2, 0 -_081E1708: .4byte gRfuFixed -_081E170C: .4byte gRfuStatic -_081E1710: - adds r2, 0x4 - subs r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0 - beq _081E1742 - ldrh r4, [r2] - ldrb r0, [r2, 0x2] - cmp r0, r5 - bne _081E1710 - ldr r0, _081E17A0 @ =gRfuStatic - ldr r0, [r0] - lsls r1, r5, 1 - adds r0, 0x12 - adds r0, r1 - ldrh r0, [r0] - cmp r4, r0 - bne _081E1710 - movs r0, 0x1 - lsls r0, r5 - mov r1, r9 - orrs r1, r0 - lsls r0, r1, 24 -_081E173E: - lsrs r0, 24 - mov r9, r0 -_081E1742: - ldr r0, _081E17A4 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r1, [r0, 0x2] - mov r2, r8 - ldrb r0, [r2] - ands r0, r1 - ands r6, r0 - cmp r6, 0 - beq _081E175C - adds r0, r5, 0 - movs r1, 0 - bl rfu_STC_removeLinkData -_081E175C: - mov r1, r10 - lsls r0, r1, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bhi _081E1768 - b _081E1564 -_081E1768: - mov r2, r9 - cmp r2, 0 - beq _081E1778 - mov r0, r9 - bl STWI_send_DisconnectREQ - bl STWI_poll_CommandEnd -_081E1778: - ldr r1, _081E17A8 @ =gRfuFixed - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldr r2, [sp, 0x10] - str r2, [r0] - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldr r1, [sp, 0x14] - str r1, [r0, 0x4] -_081E178E: - movs r0, 0 -_081E1790: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E17A0: .4byte gRfuStatic -_081E17A4: .4byte gRfuLinkStatus -_081E17A8: .4byte gRfuFixed - thumb_func_end rfu_REQBN_watchLink - - thumb_func_start rfu_STC_removeLinkData -rfu_STC_removeLinkData: @ 81E17AC - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r7, r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r12, r1 - movs r0, 0x80 - lsls r0, 17 - lsls r0, r7 - lsrs r5, r0, 24 - ldr r1, _081E1850 @ =gRfuLinkStatus - ldr r4, [r1] - ldrb r0, [r4, 0x2] - ands r0, r5 - mov r8, r1 - cmp r0, 0 - beq _081E17DE - ldrb r0, [r4, 0x1] - cmp r0, 0 - beq _081E17DE - subs r0, 0x1 - strb r0, [r4, 0x1] -_081E17DE: - mov r3, r8 - ldr r2, [r3] - mvns r6, r5 - ldrb r1, [r2, 0x2] - adds r0, r6, 0 - ands r0, r1 - strb r0, [r2, 0x2] - ldr r2, [r3] - ldrb r1, [r2, 0x3] - adds r0, r5, 0 - orrs r0, r1 - strb r0, [r2, 0x3] - ldr r3, [r3] - ldr r0, [r3] - ldr r1, _081E1854 @ =0x00ff00ff - ands r0, r1 - cmp r0, 0 - bne _081E1806 - movs r0, 0xFF - strb r0, [r3] -_081E1806: - mov r0, r12 - cmp r0, 0 - beq _081E1844 - mov r1, sp - movs r4, 0 - movs r0, 0 - strh r0, [r1] - lsls r0, r7, 5 - adds r0, 0x14 - mov r2, r8 - ldr r1, [r2] - adds r1, r0 - ldr r2, _081E1858 @ =0x01000010 - mov r0, sp - bl CpuSet - mov r0, r8 - ldr r2, [r0] - ldrb r1, [r2, 0x3] - adds r0, r6, 0 - ands r0, r1 - strb r0, [r2, 0x3] - mov r2, r8 - ldr r1, [r2] - ldrb r0, [r1, 0x7] - ands r6, r0 - strb r6, [r1, 0x7] - ldr r0, [r2] - adds r0, 0xA - adds r0, r7 - strb r4, [r0] -_081E1844: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E1850: .4byte gRfuLinkStatus -_081E1854: .4byte 0x00ff00ff -_081E1858: .4byte 0x01000010 - thumb_func_end rfu_STC_removeLinkData - - thumb_func_start rfu_REQ_disconnect -rfu_REQ_disconnect: @ 81E185C - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r2, _081E18A0 @ =gRfuLinkStatus - ldr r1, [r2] - ldrb r0, [r1, 0x2] - ldrb r1, [r1, 0x3] - orrs r0, r1 - ands r0, r4 - cmp r0, 0 - beq _081E18E0 - ldr r0, _081E18A4 @ =gRfuStatic - ldr r1, [r0] - strb r4, [r1, 0x5] - ldr r2, [r2] - ldrb r1, [r2] - adds r3, r0, 0 - cmp r1, 0xFF - bne _081E18A8 - ldr r0, [r3] - ldrb r1, [r0] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _081E18A8 - ldrb r0, [r2, 0x3] - ands r0, r4 - cmp r0, 0 - beq _081E18E0 - movs r0, 0x30 - movs r1, 0 - bl rfu_CB_disconnect - b _081E18E0 - .align 2, 0 -_081E18A0: .4byte gRfuLinkStatus -_081E18A4: .4byte gRfuStatic -_081E18A8: - ldr r0, [r3] - ldrb r0, [r0, 0x9] - cmp r0, 0 - beq _081E18D4 - ldr r0, _081E18D0 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SC_EndREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - beq _081E18D4 - movs r0, 0x1B - bl rfu_STC_REQ_callback - b _081E18E0 - .align 2, 0 -_081E18D0: .4byte rfu_CB_defaultCallback -_081E18D4: - ldr r0, _081E18E8 @ =rfu_CB_disconnect - bl STWI_set_Callback_M - adds r0, r4, 0 - bl STWI_send_DisconnectREQ -_081E18E0: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081E18E8: .4byte rfu_CB_disconnect - thumb_func_end rfu_REQ_disconnect - - thumb_func_start rfu_CB_disconnect -rfu_CB_disconnect: @ 81E18EC - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 16 - lsrs r5, r1, 16 - cmp r5, 0x3 - bne _081E1928 - ldr r0, _081E19BC @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0 - bne _081E1928 - ldr r0, _081E19C0 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E1928 - ldr r0, _081E19C4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E1928 - movs r5, 0 -_081E1928: - ldr r3, _081E19C8 @ =gRfuStatic - ldr r2, [r3] - ldr r0, _081E19BC @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1, 0x2] - ldrb r1, [r1, 0x3] - orrs r0, r1 - ldrb r1, [r2, 0x5] - ands r0, r1 - strb r0, [r2, 0x5] - ldr r0, _081E19C4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldr r0, [r3] - ldrb r0, [r0, 0x5] - strb r0, [r1, 0x8] - cmp r5, 0 - bne _081E1976 - movs r4, 0 -_081E1950: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r4 - lsrs r0, 24 - ldr r1, _081E19C8 @ =gRfuStatic - ldr r1, [r1] - ldrb r1, [r1, 0x5] - ands r0, r1 - cmp r0, 0 - beq _081E196C - adds r0, r4, 0 - movs r1, 0x1 - bl rfu_STC_removeLinkData -_081E196C: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E1950 -_081E1976: - ldr r0, _081E19BC @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2, 0x2] - ldrb r0, [r2, 0x3] - orrs r0, r1 - cmp r0, 0 - bne _081E1988 - movs r0, 0xFF - strb r0, [r2] -_081E1988: - adds r0, r6, 0 - adds r1, r5, 0 - bl rfu_STC_REQ_callback - ldr r0, _081E19C8 @ =gRfuStatic - ldr r0, [r0] - ldrb r0, [r0, 0x9] - cmp r0, 0 - beq _081E19B6 - ldr r0, _081E19C0 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SC_StartREQ - bl STWI_poll_CommandEnd - adds r5, r0, 0 - cmp r5, 0 - beq _081E19B6 - movs r0, 0x19 - adds r1, r5, 0 - bl rfu_STC_REQ_callback -_081E19B6: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E19BC: .4byte gRfuLinkStatus -_081E19C0: .4byte rfu_CB_defaultCallback -_081E19C4: .4byte gRfuFixed -_081E19C8: .4byte gRfuStatic - thumb_func_end rfu_CB_disconnect - - thumb_func_start rfu_REQ_CHILD_startConnectRecovery -rfu_REQ_CHILD_startConnectRecovery: @ 81E19CC - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _081E1A1C @ =gRfuStatic - ldr r0, [r0] - strb r5, [r0, 0x5] - movs r4, 0 - movs r0, 0x1 - ands r0, r5 - ldr r2, _081E1A20 @ =rfu_STC_REQ_callback - cmp r0, 0 - bne _081E19FA - movs r1, 0x1 -_081E19E6: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bhi _081E19FA - adds r0, r5, 0 - asrs r0, r4 - ands r0, r1 - cmp r0, 0 - beq _081E19E6 -_081E19FA: - adds r0, r2, 0 - bl STWI_set_Callback_M - ldr r0, _081E1A24 @ =gRfuLinkStatus - ldr r1, [r0] - lsls r0, r4, 5 - adds r0, r1, r0 - ldrh r0, [r0, 0x14] - adds r1, 0x94 - ldrh r1, [r1] - adds r2, r5, 0 - bl STWI_send_CPR_StartREQ - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E1A1C: .4byte gRfuStatic -_081E1A20: .4byte rfu_STC_REQ_callback -_081E1A24: .4byte gRfuLinkStatus - thumb_func_end rfu_REQ_CHILD_startConnectRecovery - - thumb_func_start rfu_REQ_CHILD_pollConnectRecovery -rfu_REQ_CHILD_pollConnectRecovery: @ 81E1A28 - push {lr} - ldr r0, _081E1A38 @ =rfu_CB_CHILD_pollConnectRecovery - bl STWI_set_Callback_M - bl STWI_send_CPR_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E1A38: .4byte rfu_CB_CHILD_pollConnectRecovery - thumb_func_end rfu_REQ_CHILD_pollConnectRecovery - - thumb_func_start rfu_CB_CHILD_pollConnectRecovery -rfu_CB_CHILD_pollConnectRecovery: @ 81E1A3C - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E1AC0 - ldr r0, _081E1AD4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x4] - cmp r0, 0 - bne _081E1AC0 - ldr r0, _081E1AD8 @ =gRfuStatic - ldr r1, [r0] - ldrb r1, [r1, 0x5] - adds r6, r0, 0 - cmp r1, 0 - beq _081E1AC0 - ldr r1, _081E1ADC @ =gRfuLinkStatus - ldr r0, [r1] - strb r7, [r0] - movs r4, 0 - adds r5, r1, 0 - mov r12, r4 -_081E1A76: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r4 - lsrs r3, r0, 24 - ldr r2, [r5] - ldr r0, [r6] - ldrb r0, [r0, 0x5] - ands r0, r3 - ldrb r1, [r2, 0x3] - ands r0, r1 - cmp r0, 0 - beq _081E1AB0 - ldrb r1, [r2, 0x2] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2, 0x2] - ldr r1, [r5] - ldrb r0, [r1, 0x3] - bics r0, r3 - strb r0, [r1, 0x3] - ldr r1, [r5] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r0, [r6] - adds r0, 0xA - adds r0, r4 - mov r1, r12 - strb r1, [r0] -_081E1AB0: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E1A76 - ldr r1, [r6] - movs r0, 0 - strb r0, [r1, 0x5] -_081E1AC0: - mov r0, r8 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E1AD4: .4byte gRfuFixed -_081E1AD8: .4byte gRfuStatic -_081E1ADC: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_CHILD_pollConnectRecovery - - thumb_func_start rfu_CHILD_getConnectRecoveryStatus -rfu_CHILD_getConnectRecoveryStatus: @ 81E1AE0 - push {lr} - adds r2, r0, 0 - movs r0, 0xFF - strb r0, [r2] - ldr r0, _081E1B00 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrb r0, [r1] - adds r0, 0x4D - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _081E1B04 - movs r0, 0x10 - b _081E1B0A - .align 2, 0 -_081E1B00: .4byte gRfuFixed -_081E1B04: - ldrb r0, [r1, 0x4] - strb r0, [r2] - movs r0, 0 -_081E1B0A: - pop {r1} - bx r1 - thumb_func_end rfu_CHILD_getConnectRecoveryStatus - - thumb_func_start rfu_REQ_CHILD_endConnectRecovery -rfu_REQ_CHILD_endConnectRecovery: @ 81E1B10 - push {lr} - ldr r0, _081E1B20 @ =rfu_CB_CHILD_pollConnectRecovery - bl STWI_set_Callback_M - bl STWI_send_CPR_EndREQ - pop {r0} - bx r0 - .align 2, 0 -_081E1B20: .4byte rfu_CB_CHILD_pollConnectRecovery - thumb_func_end rfu_REQ_CHILD_endConnectRecovery - - thumb_func_start rfu_STC_fastCopy -rfu_STC_fastCopy: @ 81E1B24 - push {r4-r6,lr} - adds r5, r0, 0 - adds r6, r1, 0 - ldr r3, [r5] - ldr r1, [r6] - subs r2, 0x1 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - beq _081E1B48 - adds r4, r0, 0 -_081E1B3A: - ldrb r0, [r3] - strb r0, [r1] - adds r3, 0x1 - adds r1, 0x1 - subs r2, 0x1 - cmp r2, r4 - bne _081E1B3A -_081E1B48: - str r3, [r5] - str r1, [r6] - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end rfu_STC_fastCopy - - thumb_func_start rfu_REQ_changeMasterSlave -rfu_REQ_changeMasterSlave: @ 81E1B54 - push {lr} - movs r0, 0x1 - bl STWI_read_status - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bne _081E1B74 - ldr r0, _081E1B70 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_MS_ChangeREQ - b _081E1B7C - .align 2, 0 -_081E1B70: .4byte rfu_STC_REQ_callback -_081E1B74: - movs r0, 0x27 - movs r1, 0 - bl rfu_STC_REQ_callback -_081E1B7C: - pop {r0} - bx r0 - thumb_func_end rfu_REQ_changeMasterSlave - - thumb_func_start rfu_getMasterSlave -rfu_getMasterSlave: @ 81E1B80 - push {lr} - movs r0, 0x1 - bl STWI_read_status - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x1 - bne _081E1BAE - ldr r0, _081E1BB4 @ =gRfuState - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0 - beq _081E1BAE - ldrb r0, [r1, 0x6] - cmp r0, 0x27 - beq _081E1BAC - cmp r0, 0x25 - beq _081E1BAC - cmp r0, 0x37 - bne _081E1BAE -_081E1BAC: - movs r2, 0 -_081E1BAE: - adds r0, r2, 0 - pop {r1} - bx r1 - .align 2, 0 -_081E1BB4: .4byte gRfuState - thumb_func_end rfu_getMasterSlave - - thumb_func_start rfu_clearAllSlot -rfu_clearAllSlot: @ 81E1BB8 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - ldr r1, _081E1C3C @ =0x04000208 - ldrh r0, [r1] - mov r8, r0 - movs r0, 0 - strh r0, [r1] - movs r5, 0 - mov r0, sp - adds r0, 0x2 - movs r7, 0 - adds r6, r0, 0 -_081E1BD4: - mov r0, sp - strh r7, [r0] - ldr r0, _081E1C40 @ =gRfuSlotStatusNI - lsls r4, r5, 2 - adds r0, r4, r0 - ldr r1, [r0] - mov r0, sp - ldr r2, _081E1C44 @ =0x01000034 - bl CpuSet - strh r7, [r6] - ldr r0, _081E1C48 @ =gRfuSlotStatusUNI - adds r4, r0 - ldr r1, [r4] - adds r0, r6, 0 - ldr r2, _081E1C4C @ =0x0100000a - bl CpuSet - ldr r3, _081E1C50 @ =gRfuLinkStatus - ldr r0, [r3] - adds r0, 0x10 - adds r0, r5 - movs r1, 0x10 - strb r1, [r0] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _081E1BD4 - ldr r2, [r3] - movs r1, 0 - movs r0, 0x57 - strb r0, [r2, 0xF] - ldr r0, [r3] - strb r1, [r0, 0x4] - ldr r0, [r3] - strb r1, [r0, 0x5] - ldr r0, [r3] - strb r1, [r0, 0x6] - ldr r0, _081E1C54 @ =gRfuStatic - ldr r0, [r0] - strb r1, [r0, 0x2] - ldr r0, _081E1C3C @ =0x04000208 - mov r1, r8 - strh r1, [r0] - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E1C3C: .4byte 0x04000208 -_081E1C40: .4byte gRfuSlotStatusNI -_081E1C44: .4byte 0x01000034 -_081E1C48: .4byte gRfuSlotStatusUNI -_081E1C4C: .4byte 0x0100000a -_081E1C50: .4byte gRfuLinkStatus -_081E1C54: .4byte gRfuStatic - thumb_func_end rfu_clearAllSlot - - thumb_func_start rfu_STC_releaseFrame -rfu_STC_releaseFrame: @ 81E1C58 - push {r4-r6,lr} - adds r4, r2, 0 - lsls r0, 24 - lsrs r2, r0, 24 - adds r5, r2, 0 - lsls r1, 24 - lsrs r3, r1, 24 - ldr r0, _081E1C90 @ =gRfuStatic - ldr r0, [r0] - ldrb r1, [r0] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _081E1C98 - ldr r6, _081E1C94 @ =gRfuLinkStatus - cmp r3, 0 - bne _081E1C84 - ldr r1, [r6] - ldrb r0, [r1, 0xF] - ldrh r4, [r4, 0x2E] - adds r0, r4 - strb r0, [r1, 0xF] -_081E1C84: - ldr r1, [r6] - ldrb r0, [r1, 0xF] - adds r0, 0x3 - strb r0, [r1, 0xF] - b _081E1CB8 - .align 2, 0 -_081E1C90: .4byte gRfuStatic -_081E1C94: .4byte gRfuLinkStatus -_081E1C98: - ldr r6, _081E1CC0 @ =gRfuLinkStatus - cmp r3, 0 - bne _081E1CAC - ldr r1, [r6] - adds r1, 0x10 - adds r1, r2 - ldrb r0, [r1] - ldrh r4, [r4, 0x2E] - adds r0, r4 - strb r0, [r1] -_081E1CAC: - ldr r1, [r6] - adds r1, 0x10 - adds r1, r5 - ldrb r0, [r1] - adds r0, 0x2 - strb r0, [r1] -_081E1CB8: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E1CC0: .4byte gRfuLinkStatus - thumb_func_end rfu_STC_releaseFrame - - thumb_func_start rfu_clearSlot -rfu_clearSlot: @ 81E1CC4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r1, 24 - lsrs r7, r1, 24 - cmp r7, 0x3 - bls _081E1CE4 - movs r0, 0x80 - lsls r0, 3 - b _081E1E5C -_081E1CE4: - movs r0, 0xF - mov r1, r8 - ands r0, r1 - cmp r0, 0 - bne _081E1CF4 - movs r0, 0xC0 - lsls r0, 3 - b _081E1E5C -_081E1CF4: - ldr r1, _081E1D38 @ =0x04000208 - ldrh r0, [r1] - mov r10, r0 - movs r0, 0 - strh r0, [r1] - movs r0, 0xC - mov r2, r8 - ands r0, r2 - cmp r0, 0 - beq _081E1DBC - movs r3, 0 - ldr r1, _081E1D3C @ =gRfuSlotStatusNI - lsls r0, r7, 2 - adds r0, r1 - mov r9, r0 -_081E1D12: - movs r4, 0 - cmp r3, 0 - bne _081E1D44 - movs r0, 0x4 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _081E1D64 - mov r2, r9 - ldr r4, [r2] - ldr r0, _081E1D40 @ =gRfuLinkStatus - ldr r2, [r0] - adds r0, r4, 0 - adds r0, 0x2C - ldrb r1, [r0] - ldrb r0, [r2, 0x4] - bics r0, r1 - strb r0, [r2, 0x4] - b _081E1D64 - .align 2, 0 -_081E1D38: .4byte 0x04000208 -_081E1D3C: .4byte gRfuSlotStatusNI -_081E1D40: .4byte gRfuLinkStatus -_081E1D44: - movs r0, 0x8 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _081E1D64 - mov r2, r9 - ldr r0, [r2] - adds r4, r0, 0 - adds r4, 0x34 - ldr r0, _081E1DF8 @ =gRfuLinkStatus - ldr r2, [r0] - movs r1, 0x1 - lsls r1, r7 - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] -_081E1D64: - adds r6, r3, 0x1 - cmp r4, 0 - beq _081E1DB4 - ldrh r0, [r4] - movs r2, 0x80 - lsls r2, 8 - adds r1, r2, 0 - ands r0, r1 - cmp r0, 0 - beq _081E1DA4 - lsls r1, r3, 24 - lsrs r1, 24 - adds r0, r7, 0 - adds r2, r4, 0 - bl rfu_STC_releaseFrame - movs r1, 0 - adds r2, r4, 0 - adds r2, 0x2C - movs r5, 0x1 - movs r3, 0 -_081E1D8E: - ldrb r0, [r2] - asrs r0, r1 - ands r0, r5 - cmp r0, 0 - beq _081E1D9A - strh r3, [r4, 0x2] -_081E1D9A: - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0x3 - bls _081E1D8E -_081E1DA4: - mov r1, sp - movs r0, 0 - strh r0, [r1] - mov r0, sp - adds r1, r4, 0 - ldr r2, _081E1DFC @ =0x0100001a - bl CpuSet -_081E1DB4: - lsls r0, r6, 16 - lsrs r3, r0, 16 - cmp r3, 0x1 - bls _081E1D12 -_081E1DBC: - movs r0, 0x1 - mov r4, r8 - ands r0, r4 - cmp r0, 0 - beq _081E1E32 - ldr r1, _081E1E00 @ =gRfuSlotStatusUNI - lsls r0, r7, 2 - adds r0, r1 - ldr r3, [r0] - ldrh r1, [r3] - movs r0, 0x80 - lsls r0, 8 - ands r0, r1 - cmp r0, 0 - beq _081E1E24 - ldr r0, _081E1E04 @ =gRfuStatic - ldr r0, [r0] - ldrb r1, [r0] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _081E1E08 - ldr r2, _081E1DF8 @ =gRfuLinkStatus - ldr r1, [r2] - ldrb r0, [r1, 0xF] - adds r0, 0x3 - ldrb r4, [r3, 0x4] - adds r0, r4 - strb r0, [r1, 0xF] - b _081E1E1A - .align 2, 0 -_081E1DF8: .4byte gRfuLinkStatus -_081E1DFC: .4byte 0x0100001a -_081E1E00: .4byte gRfuSlotStatusUNI -_081E1E04: .4byte gRfuStatic -_081E1E08: - ldr r2, _081E1E6C @ =gRfuLinkStatus - ldr r1, [r2] - adds r1, 0x10 - adds r1, r7 - ldrb r0, [r1] - adds r0, 0x2 - ldrb r4, [r3, 0x4] - adds r0, r4 - strb r0, [r1] -_081E1E1A: - ldr r2, [r2] - ldrb r1, [r3, 0x3] - ldrb r0, [r2, 0x6] - bics r0, r1 - strb r0, [r2, 0x6] -_081E1E24: - mov r0, sp - movs r1, 0 - strh r1, [r0] - ldr r2, _081E1E70 @ =0x01000006 - adds r1, r3, 0 - bl CpuSet -_081E1E32: - movs r0, 0x2 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _081E1E54 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r1, _081E1E74 @ =gRfuSlotStatusUNI - lsls r0, r7, 2 - adds r0, r1 - ldr r1, [r0] - adds r1, 0xC - ldr r2, _081E1E78 @ =0x01000004 - mov r0, sp - bl CpuSet -_081E1E54: - ldr r0, _081E1E7C @ =0x04000208 - mov r2, r10 - strh r2, [r0] - movs r0, 0 -_081E1E5C: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E1E6C: .4byte gRfuLinkStatus -_081E1E70: .4byte 0x01000006 -_081E1E74: .4byte gRfuSlotStatusUNI -_081E1E78: .4byte 0x01000004 -_081E1E7C: .4byte 0x04000208 - thumb_func_end rfu_clearSlot - - thumb_func_start rfu_setRecvBuffer -rfu_setRecvBuffer: @ 81E1E80 - push {r4-r6,lr} - adds r5, r2, 0 - adds r6, r3, 0 - lsls r0, 24 - lsrs r3, r0, 24 - adds r2, r3, 0 - lsls r1, 24 - lsrs r1, 24 - adds r4, r1, 0 - cmp r1, 0x3 - bls _081E1E9C - movs r0, 0x80 - lsls r0, 3 - b _081E1ED4 -_081E1E9C: - movs r0, 0x20 - ands r0, r3 - cmp r0, 0 - beq _081E1EB8 - ldr r0, _081E1EB4 @ =gRfuSlotStatusNI - lsls r1, 2 - adds r1, r0 - ldr r0, [r1] - str r5, [r0, 0x68] - str r6, [r0, 0x6C] - b _081E1ED2 - .align 2, 0 -_081E1EB4: .4byte gRfuSlotStatusNI -_081E1EB8: - movs r0, 0x10 - ands r2, r0 - cmp r2, 0 - bne _081E1EC6 - movs r0, 0xC0 - lsls r0, 3 - b _081E1ED4 -_081E1EC6: - ldr r0, _081E1EDC @ =gRfuSlotStatusUNI - lsls r1, r4, 2 - adds r1, r0 - ldr r0, [r1] - str r5, [r0, 0x14] - str r6, [r0, 0x18] -_081E1ED2: - movs r0, 0 -_081E1ED4: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_081E1EDC: .4byte gRfuSlotStatusUNI - thumb_func_end rfu_setRecvBuffer - - thumb_func_start rfu_NI_setSendData -rfu_NI_setSendData: @ 81E1EE0 - push {r4-r6,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - lsls r4, 24 - lsrs r4, 24 - lsls r5, 24 - lsrs r5, 24 - str r3, [sp] - movs r0, 0x20 - adds r1, r4, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl rfu_STC_setSendData_org - lsls r0, 16 - lsrs r0, 16 - add sp, 0x4 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end rfu_NI_setSendData - - thumb_func_start rfu_UNI_setSendData -rfu_UNI_setSendData: @ 81E1F0C - push {lr} - sub sp, 0x4 - adds r3, r1, 0 - lsls r0, 24 - lsrs r1, r0, 24 - lsls r2, 24 - lsrs r2, 24 - ldr r0, _081E1F28 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E1F2C - adds r0, r2, 0x3 - b _081E1F2E - .align 2, 0 -_081E1F28: .4byte gRfuLinkStatus -_081E1F2C: - adds r0, r2, 0x2 -_081E1F2E: - lsls r0, 24 - lsrs r2, r0, 24 - movs r0, 0 - str r0, [sp] - movs r0, 0x10 - bl rfu_STC_setSendData_org - lsls r0, 16 - lsrs r0, 16 - add sp, 0x4 - pop {r1} - bx r1 - thumb_func_end rfu_UNI_setSendData - - thumb_func_start rfu_NI_CHILD_setSendGameName -rfu_NI_CHILD_setSendGameName: @ 81E1F48 - push {lr} - sub sp, 0x4 - adds r2, r1, 0 - lsls r0, 24 - lsrs r0, 24 - lsls r2, 24 - lsrs r2, 24 - movs r1, 0x80 - lsls r1, 17 - lsls r1, r0 - lsrs r1, 24 - ldr r0, _081E1F78 @ =gRfuLinkStatus - ldr r3, [r0] - adds r3, 0x98 - movs r0, 0x1A - str r0, [sp] - movs r0, 0x40 - bl rfu_STC_setSendData_org - lsls r0, 16 - lsrs r0, 16 - add sp, 0x4 - pop {r1} - bx r1 - .align 2, 0 -_081E1F78: .4byte gRfuLinkStatus - thumb_func_end rfu_NI_CHILD_setSendGameName - - thumb_func_start rfu_STC_setSendData_org -rfu_STC_setSendData_org: @ 81E1F7C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - str r3, [sp] - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 24 - lsrs r3, r1, 24 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - ldr r0, _081E1FA8 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2] - mov r10, r0 - cmp r1, 0xFF - bne _081E1FB0 - ldr r0, _081E1FAC @ =0x00000301 - b _081E2166 - .align 2, 0 -_081E1FA8: .4byte gRfuLinkStatus -_081E1FAC: .4byte 0x00000301 -_081E1FB0: - movs r0, 0xF - ands r0, r3 - cmp r0, 0 - bne _081E1FBE - movs r0, 0x80 - lsls r0, 3 - b _081E2166 -_081E1FBE: - ldrb r0, [r2, 0x2] - ldrb r1, [r2, 0x3] - orrs r0, r1 - ands r0, r3 - cmp r0, r3 - beq _081E1FD4 - ldr r0, _081E1FD0 @ =0x00000401 - b _081E2166 - .align 2, 0 -_081E1FD0: .4byte 0x00000401 -_081E1FD4: - movs r0, 0x10 - ands r0, r6 - cmp r0, 0 - beq _081E1FE0 - ldrb r0, [r2, 0x6] - b _081E1FE2 -_081E1FE0: - ldrb r0, [r2, 0x4] -_081E1FE2: - ands r0, r3 - cmp r0, 0 - beq _081E1FF0 - ldr r0, _081E1FEC @ =0x00000402 - b _081E2166 - .align 2, 0 -_081E1FEC: .4byte 0x00000402 -_081E1FF0: - movs r2, 0 - movs r0, 0x1 - ands r0, r3 - ldr r4, _081E2020 @ =_Str_RfuHeader - cmp r0, 0 - bne _081E2012 - movs r1, 0x1 -_081E1FFE: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bhi _081E2012 - adds r0, r3, 0 - asrs r0, r2 - ands r0, r1 - cmp r0, 0 - beq _081E1FFE -_081E2012: - mov r0, r10 - ldr r1, [r0] - ldrb r0, [r1] - cmp r0, 0x1 - bne _081E2024 - adds r1, 0xF - b _081E202E - .align 2, 0 -_081E2020: .4byte _Str_RfuHeader -_081E2024: - cmp r0, 0 - bne _081E2030 - adds r0, r2, 0 - adds r0, 0x10 - adds r1, r0 -_081E202E: - mov r9, r1 -_081E2030: - mov r1, r10 - ldr r0, [r1] - ldrb r0, [r0] - lsls r0, 4 - adds r0, r4 - ldrb r4, [r0] - mov r0, r9 - ldrb r0, [r0] - cmp r8, r0 - bhi _081E2048 - cmp r8, r4 - bhi _081E204E -_081E2048: - movs r0, 0xA0 - lsls r0, 3 - b _081E2166 -_081E204E: - ldr r1, _081E209C @ =0x04000208 - ldrh r0, [r1] - str r0, [sp, 0x4] - movs r7, 0 - strh r7, [r1] - movs r0, 0x20 - ands r0, r6 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - bne _081E2068 - cmp r6, 0x40 - bne _081E2124 -_081E2068: - ldr r1, _081E20A0 @ =gRfuSlotStatusNI - lsls r0, r2, 2 - adds r0, r1 - ldr r0, [r0] - mov r12, r0 - movs r1, 0 - strh r1, [r0, 0x18] - mov r1, r12 - adds r1, 0x2D - mov r2, r12 - str r1, [r2, 0x4] - movs r0, 0x7 - str r0, [r2, 0x14] - mov r0, r12 - adds r0, 0x2C - strb r3, [r0] - strb r3, [r2, 0x1A] - mov r2, r8 - subs r0, r2, r4 - mov r2, r12 - strh r0, [r2, 0x2E] - cmp r5, 0 - beq _081E20A4 - strb r7, [r1] - b _081E20A8 - .align 2, 0 -_081E209C: .4byte 0x04000208 -_081E20A0: .4byte gRfuSlotStatusNI -_081E20A4: - movs r0, 0x1 - strb r0, [r1] -_081E20A8: - ldr r0, [sp, 0x28] - mov r1, r12 - str r0, [r1, 0x30] - ldr r2, [sp] - str r2, [r1, 0x28] - movs r1, 0 - mov r0, r12 - strb r1, [r0, 0x1F] - adds r0, 0x20 - strb r1, [r0] - mov r4, r12 - adds r4, 0x1B - movs r6, 0 - mov r2, r12 - adds r2, 0x21 - movs r5, 0x1 -_081E20C8: - adds r0, r4, r1 - strb r6, [r0] - adds r0, r2, r1 - strb r5, [r0] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x3 - bls _081E20C8 - movs r2, 0 - movs r5, 0x1 - ldr r4, _081E211C @ =gRfuSlotStatusNI - movs r1, 0 -_081E20E2: - adds r0, r3, 0 - asrs r0, r2 - ands r0, r5 - cmp r0, 0 - beq _081E20F4 - lsls r0, r2, 2 - adds r0, r4 - ldr r0, [r0] - strh r1, [r0, 0x2] -_081E20F4: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E20E2 - mov r1, r10 - ldr r2, [r1] - ldrb r1, [r2, 0x4] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2, 0x4] - mov r2, r9 - ldrb r0, [r2] - mov r1, r8 - subs r0, r1 - strb r0, [r2] - ldr r0, _081E2120 @ =0x00008021 - mov r2, r12 - strh r0, [r2] - b _081E215C - .align 2, 0 -_081E211C: .4byte gRfuSlotStatusNI -_081E2120: .4byte 0x00008021 -_081E2124: - movs r0, 0x10 - ands r0, r6 - cmp r0, 0 - beq _081E215C - ldr r1, _081E2178 @ =gRfuSlotStatusUNI - lsls r0, r2, 2 - adds r0, r1 - ldr r1, [r0] - strb r3, [r1, 0x3] - ldr r0, [sp] - str r0, [r1, 0x8] - mov r2, r8 - subs r0, r2, r4 - strh r0, [r1, 0x4] - mov r2, r9 - ldrb r0, [r2] - mov r2, r8 - subs r0, r2 - mov r2, r9 - strb r0, [r2] - ldr r0, _081E217C @ =0x00008024 - strh r0, [r1] - mov r0, r10 - ldr r2, [r0] - ldrb r1, [r2, 0x6] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2, 0x6] -_081E215C: - ldr r0, _081E2180 @ =0x04000208 - mov r1, sp - ldrh r1, [r1, 0x4] - strh r1, [r0] - movs r0, 0 -_081E2166: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E2178: .4byte gRfuSlotStatusUNI -_081E217C: .4byte 0x00008024 -_081E2180: .4byte 0x04000208 - thumb_func_end rfu_STC_setSendData_org - - thumb_func_start rfu_changeSendTarget -rfu_changeSendTarget: @ 81E2184 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - adds r3, r0, 0 - lsls r1, 24 - lsrs r7, r1, 24 - lsls r2, 24 - lsrs r6, r2, 24 - cmp r7, 0x3 - bls _081E21A8 - movs r0, 0x80 - lsls r0, 3 - b _081E22DC -_081E21A8: - cmp r0, 0x20 - bne _081E2248 - ldr r0, _081E2238 @ =gRfuSlotStatusNI - mov r12, r0 - lsls r0, r7, 2 - add r0, r12 - ldr r5, [r0] - ldrh r2, [r5] - ldr r1, _081E223C @ =0x00008020 - adds r0, r1, 0 - ands r0, r2 - cmp r0, r1 - bne _081E225E - ldrb r0, [r5, 0x1A] - adds r3, r6, 0 - eors r3, r0 - adds r2, r3, 0 - ands r2, r6 - cmp r2, 0 - bne _081E2296 - cmp r3, 0 - bne _081E21D6 - b _081E22DA -_081E21D6: - ldr r1, _081E2240 @ =0x04000208 - ldrh r0, [r1] - mov r8, r0 - strh r2, [r1] - movs r2, 0 - mvns r1, r3 - str r1, [sp] - lsls r4, r6, 24 - mov r10, r4 - movs r0, 0x1 - mov r9, r0 - movs r1, 0 -_081E21EE: - adds r0, r3, 0 - asrs r0, r2 - mov r4, r9 - ands r0, r4 - cmp r0, 0 - beq _081E2202 - lsls r0, r2, 2 - add r0, r12 - ldr r0, [r0] - strh r1, [r0, 0x2] -_081E2202: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E21EE - ldr r0, _081E2244 @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1, 0x4] - ldr r2, [sp] - ands r2, r0 - strb r2, [r1, 0x4] - strb r6, [r5, 0x1A] - mov r0, r10 - cmp r0, 0 - bne _081E222E - adds r0, r7, 0 - movs r1, 0 - adds r2, r5, 0 - bl rfu_STC_releaseFrame - movs r0, 0x27 - strh r0, [r5] -_081E222E: - ldr r0, _081E2240 @ =0x04000208 - mov r1, r8 - strh r1, [r0] - b _081E22DA - .align 2, 0 -_081E2238: .4byte gRfuSlotStatusNI -_081E223C: .4byte 0x00008020 -_081E2240: .4byte 0x04000208 -_081E2244: .4byte gRfuLinkStatus -_081E2248: - cmp r3, 0x10 - bne _081E22D4 - ldr r3, _081E2264 @ =gRfuSlotStatusUNI - lsls r1, r7, 2 - adds r0, r1, r3 - ldr r0, [r0] - ldrh r2, [r0] - ldr r0, _081E2268 @ =0x00008024 - adds r5, r3, 0 - cmp r2, r0 - beq _081E2270 -_081E225E: - ldr r0, _081E226C @ =0x00000403 - b _081E22DC - .align 2, 0 -_081E2264: .4byte gRfuSlotStatusUNI -_081E2268: .4byte 0x00008024 -_081E226C: .4byte 0x00000403 -_081E2270: - movs r3, 0 - movs r2, 0 - adds r4, r5, 0 -_081E2276: - cmp r2, r7 - beq _081E2284 - lsls r0, r2, 2 - adds r0, r4 - ldr r0, [r0] - ldrb r0, [r0, 0x3] - orrs r3, r0 -_081E2284: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E2276 - adds r2, r6, 0 - ands r2, r3 - cmp r2, 0 - beq _081E22A0 -_081E2296: - ldr r0, _081E229C @ =0x00000404 - b _081E22DC - .align 2, 0 -_081E229C: .4byte 0x00000404 -_081E22A0: - ldr r3, _081E22CC @ =0x04000208 - ldrh r0, [r3] - mov r8, r0 - strh r2, [r3] - ldr r4, _081E22D0 @ =gRfuLinkStatus - ldr r2, [r4] - adds r5, r1, r5 - ldr r0, [r5] - ldrb r1, [r0, 0x3] - ldrb r0, [r2, 0x6] - bics r0, r1 - strb r0, [r2, 0x6] - ldr r2, [r4] - ldrb r1, [r2, 0x6] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2, 0x6] - ldr r0, [r5] - strb r6, [r0, 0x3] - mov r2, r8 - strh r2, [r3] - b _081E22DA - .align 2, 0 -_081E22CC: .4byte 0x04000208 -_081E22D0: .4byte gRfuLinkStatus -_081E22D4: - movs r0, 0xC0 - lsls r0, 3 - b _081E22DC -_081E22DA: - movs r0, 0 -_081E22DC: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_changeSendTarget - - thumb_func_start rfu_NI_stopReceivingData -rfu_NI_stopReceivingData: @ 81E22EC - push {r4,r5,lr} - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x3 - bls _081E22FC - movs r0, 0x80 - lsls r0, 3 - b _081E2356 -_081E22FC: - ldr r1, _081E2328 @ =gRfuSlotStatusNI - lsls r0, r3, 2 - adds r0, r1 - ldr r2, [r0] - adds r5, r2, 0 - adds r5, 0x34 - ldr r1, _081E232C @ =0x04000208 - ldrh r0, [r1] - adds r4, r0, 0 - movs r0, 0 - strh r0, [r1] - ldrh r1, [r2, 0x34] - movs r0, 0x80 - lsls r0, 8 - ands r0, r1 - cmp r0, 0 - beq _081E2350 - ldr r0, _081E2330 @ =0x00008043 - cmp r1, r0 - bne _081E2334 - movs r0, 0x48 - b _081E2336 - .align 2, 0 -_081E2328: .4byte gRfuSlotStatusNI -_081E232C: .4byte 0x04000208 -_081E2330: .4byte 0x00008043 -_081E2334: - movs r0, 0x47 -_081E2336: - strh r0, [r2, 0x34] - ldr r0, _081E235C @ =gRfuLinkStatus - ldr r2, [r0] - movs r1, 0x1 - lsls r1, r3 - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] - adds r0, r3, 0 - movs r1, 0x1 - adds r2, r5, 0 - bl rfu_STC_releaseFrame -_081E2350: - ldr r0, _081E2360 @ =0x04000208 - strh r4, [r0] - movs r0, 0 -_081E2356: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_081E235C: .4byte gRfuLinkStatus -_081E2360: .4byte 0x04000208 - thumb_func_end rfu_NI_stopReceivingData - - thumb_func_start rfu_UNI_changeAndReadySendData -rfu_UNI_changeAndReadySendData: @ 81E2364 - push {r4-r7,lr} - adds r7, r1, 0 - lsls r0, 24 - lsrs r0, 24 - adds r3, r0, 0 - lsls r2, 24 - lsrs r5, r2, 24 - cmp r0, 0x3 - bls _081E237C - movs r0, 0x80 - lsls r0, 3 - b _081E23F0 -_081E237C: - ldr r1, _081E2390 @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r4, [r0] - ldrh r1, [r4] - ldr r0, _081E2394 @ =0x00008024 - cmp r1, r0 - beq _081E239C - ldr r0, _081E2398 @ =0x00000403 - b _081E23F0 - .align 2, 0 -_081E2390: .4byte gRfuSlotStatusUNI -_081E2394: .4byte 0x00008024 -_081E2398: .4byte 0x00000403 -_081E239C: - ldr r0, _081E23B0 @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1] - cmp r0, 0x1 - bne _081E23B4 - adds r6, r1, 0 - adds r6, 0xF - ldrb r0, [r4, 0x4] - ldrb r1, [r1, 0xF] - b _081E23C2 - .align 2, 0 -_081E23B0: .4byte gRfuLinkStatus -_081E23B4: - adds r0, r3, 0 - adds r0, 0x10 - adds r6, r1, r0 - adds r1, 0x10 - adds r1, r3 - ldrb r0, [r4, 0x4] - ldrb r1, [r1] -_081E23C2: - adds r0, r1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, r5 - bcc _081E23EC - ldr r2, _081E23E8 @ =0x04000208 - ldrh r1, [r2] - movs r0, 0 - strh r0, [r2] - str r7, [r4, 0x8] - subs r0, r3, r5 - strb r0, [r6] - strh r5, [r4, 0x4] - movs r0, 0x1 - strb r0, [r4, 0x2] - strh r1, [r2] - movs r0, 0 - b _081E23F0 - .align 2, 0 -_081E23E8: .4byte 0x04000208 -_081E23EC: - movs r0, 0xA0 - lsls r0, 3 -_081E23F0: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_UNI_changeAndReadySendData - - thumb_func_start rfu_UNI_readySendData -rfu_UNI_readySendData: @ 81E23F8 - push {lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _081E2416 - ldr r1, _081E241C @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r2, [r0] - ldrh r1, [r2] - ldr r0, _081E2420 @ =0x00008024 - cmp r1, r0 - bne _081E2416 - movs r0, 0x1 - strb r0, [r2, 0x2] -_081E2416: - pop {r0} - bx r0 - .align 2, 0 -_081E241C: .4byte gRfuSlotStatusUNI -_081E2420: .4byte 0x00008024 - thumb_func_end rfu_UNI_readySendData - - thumb_func_start rfu_UNI_clearRecvNewDataFlag -rfu_UNI_clearRecvNewDataFlag: @ 81E2424 - push {lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _081E243A - ldr r1, _081E2440 @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - movs r0, 0 - strb r0, [r1, 0x12] -_081E243A: - pop {r0} - bx r0 - .align 2, 0 -_081E2440: .4byte gRfuSlotStatusUNI - thumb_func_end rfu_UNI_clearRecvNewDataFlag - - thumb_func_start rfu_REQ_sendData -rfu_REQ_sendData: @ 81E2444 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _081E2490 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2] - adds r4, r0, 0 - cmp r1, 0xFF - bne _081E2458 - b _081E257E -_081E2458: - cmp r1, 0x1 - bne _081E24E8 - ldrb r0, [r2, 0x4] - ldrb r1, [r2, 0x5] - adds r3, r0, 0 - orrs r3, r1 - ldrb r0, [r2, 0x6] - orrs r3, r0 - cmp r3, 0 - bne _081E24E8 - ldr r0, _081E2494 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2, 0x3] - adds r4, r0, 0 - cmp r1, 0 - beq _081E2480 - movs r0, 0x10 - strb r0, [r2, 0x8] - ldr r0, [r4] - strb r3, [r0, 0x7] -_081E2480: - ldr r1, [r4] - ldrb r0, [r1, 0x8] - cmp r0, 0 - beq _081E2498 - subs r0, 0x1 - strb r0, [r1, 0x8] - b _081E249E - .align 2, 0 -_081E2490: .4byte gRfuLinkStatus -_081E2494: .4byte gRfuStatic -_081E2498: - ldrb r0, [r1, 0x7] - adds r0, 0x1 - strb r0, [r1, 0x7] -_081E249E: - ldr r1, [r4] - ldrb r0, [r1, 0x8] - cmp r0, 0 - bne _081E24B0 - ldrb r1, [r1, 0x7] - movs r0, 0xF - ands r0, r1 - cmp r0, 0 - bne _081E2542 -_081E24B0: - ldr r4, _081E24D4 @ =gRfuFixed - ldr r1, [r4] - movs r0, 0x1 - str r0, [r1, 0x68] - movs r0, 0xFF - str r0, [r1, 0x78] - ldr r0, _081E24D8 @ =rfu_CB_sendData3 - bl STWI_set_Callback_M - cmp r5, 0 - bne _081E24DC - ldr r0, [r4] - adds r0, 0x68 - movs r1, 0x1 - bl STWI_send_DataTxREQ - b _081E257E - .align 2, 0 -_081E24D4: .4byte gRfuFixed -_081E24D8: .4byte rfu_CB_sendData3 -_081E24DC: - ldr r0, [r4] - adds r0, 0x68 - movs r1, 0x1 - bl STWI_send_DataTxAndChangeREQ - b _081E257E -_081E24E8: - ldr r0, [r4] - ldrb r0, [r0, 0xE] - cmp r0, 0 - bne _081E24F4 - bl rfu_constructSendLLFrame -_081E24F4: - ldr r0, [r4] - ldrb r0, [r0, 0xE] - cmp r0, 0 - beq _081E2542 - ldr r0, _081E2520 @ =rfu_CB_sendData - bl STWI_set_Callback_M - cmp r5, 0 - beq _081E252C - ldr r0, _081E2524 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0x68 - ldr r1, _081E2528 @ =gRfuStatic - ldr r1, [r1] - ldr r1, [r1, 0x24] - adds r1, 0x4 - lsls r1, 24 - lsrs r1, 24 - bl STWI_send_DataTxAndChangeREQ - b _081E257E - .align 2, 0 -_081E2520: .4byte rfu_CB_sendData -_081E2524: .4byte gRfuFixed -_081E2528: .4byte gRfuStatic -_081E252C: - ldr r0, _081E2564 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0x68 - ldr r1, _081E2568 @ =gRfuStatic - ldr r1, [r1] - ldr r1, [r1, 0x24] - adds r1, 0x4 - lsls r1, 24 - lsrs r1, 24 - bl STWI_send_DataTxREQ -_081E2542: - cmp r5, 0 - beq _081E257E - ldr r0, _081E256C @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E2574 - ldr r0, _081E2570 @ =gRfuState - ldr r0, [r0] - ldr r1, [r0, 0x1C] - cmp r1, 0 - beq _081E257E - movs r0, 0x27 - bl _call_via_r1 - b _081E257E - .align 2, 0 -_081E2564: .4byte gRfuFixed -_081E2568: .4byte gRfuStatic -_081E256C: .4byte gRfuLinkStatus -_081E2570: .4byte gRfuState -_081E2574: - ldr r0, _081E2584 @ =rfu_CB_sendData2 - bl STWI_set_Callback_M - bl STWI_send_MS_ChangeREQ -_081E257E: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E2584: .4byte rfu_CB_sendData2 - thumb_func_end rfu_REQ_sendData - - thumb_func_start rfu_CB_sendData -rfu_CB_sendData: @ 81E2588 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E25F2 - movs r6, 0 - ldr r0, _081E2610 @ =0x00008020 - mov r8, r0 -_081E259C: - ldr r0, _081E2614 @ =gRfuSlotStatusUNI - lsls r2, r6, 2 - adds r0, r2, r0 - ldr r1, [r0] - ldrb r0, [r1, 0x2] - cmp r0, 0 - beq _081E25AE - movs r0, 0 - strb r0, [r1, 0x2] -_081E25AE: - ldr r0, _081E2618 @ =gRfuSlotStatusNI - adds r0, r2, r0 - ldr r4, [r0] - ldrh r0, [r4] - cmp r0, r8 - bne _081E25E8 - adds r0, r6, 0 - movs r1, 0 - adds r2, r4, 0 - bl rfu_STC_releaseFrame - ldr r5, _081E261C @ =gRfuLinkStatus - ldr r2, [r5] - ldrb r1, [r4, 0x1A] - ldrb r0, [r2, 0x4] - bics r0, r1 - strb r0, [r2, 0x4] - adds r0, r4, 0 - adds r0, 0x2D - ldrb r3, [r0] - cmp r3, 0x1 - bne _081E25E4 - ldr r1, [r5] - lsls r3, r6 - ldrb r0, [r1, 0x7] - orrs r3, r0 - strb r3, [r1, 0x7] -_081E25E4: - movs r0, 0x26 - strh r0, [r4] -_081E25E8: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bls _081E259C -_081E25F2: - ldr r0, _081E261C @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1, 0xE] - movs r0, 0 - strb r0, [r1, 0xE] - movs r0, 0x24 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2610: .4byte 0x00008020 -_081E2614: .4byte gRfuSlotStatusUNI -_081E2618: .4byte gRfuSlotStatusNI -_081E261C: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_sendData - - thumb_func_start rfu_CB_sendData2 -rfu_CB_sendData2: @ 81E2620 - push {lr} - lsls r1, 16 - lsrs r1, 16 - movs r0, 0x24 - bl rfu_STC_REQ_callback - pop {r0} - bx r0 - thumb_func_end rfu_CB_sendData2 - - thumb_func_start rfu_CB_sendData3 -rfu_CB_sendData3: @ 81E2630 - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 16 - lsrs r1, 16 - cmp r1, 0 - beq _081E2646 - movs r0, 0x24 - bl rfu_STC_REQ_callback - b _081E2652 -_081E2646: - cmp r0, 0xFF - bne _081E2652 - movs r0, 0xFF - movs r1, 0 - bl rfu_STC_REQ_callback -_081E2652: - pop {r0} - bx r0 - thumb_func_end rfu_CB_sendData3 - - thumb_func_start rfu_constructSendLLFrame -rfu_constructSendLLFrame: @ 81E2658 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - ldr r0, _081E2704 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2] - cmp r0, 0xFF - bne _081E2670 - b _081E2774 -_081E2670: - ldrb r0, [r2, 0x4] - ldrb r1, [r2, 0x5] - orrs r0, r1 - ldrb r1, [r2, 0x6] - orrs r0, r1 - cmp r0, 0 - beq _081E2774 - ldrb r0, [r2, 0xE] - movs r0, 0 - strb r0, [r2, 0xE] - mov r8, r0 - ldr r0, _081E2708 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0x6C - str r0, [sp] - movs r6, 0 - movs r0, 0x80 - lsls r0, 8 - mov r9, r0 - ldr r1, _081E270C @ =0x00008024 - mov r10, r1 -_081E269A: - movs r5, 0 - ldr r0, _081E2710 @ =gRfuSlotStatusNI - lsls r7, r6, 2 - adds r4, r7, r0 - ldr r2, [r4] - ldrh r1, [r2] - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _081E26BA - adds r0, r6, 0 - mov r1, sp - bl rfu_STC_NI_constructLLSF - lsls r0, 16 - lsrs r5, r0, 16 -_081E26BA: - ldr r2, [r4] - ldrh r1, [r2, 0x34] - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _081E26D6 - adds r2, 0x34 - adds r0, r6, 0 - mov r1, sp - bl rfu_STC_NI_constructLLSF - lsls r0, 16 - lsrs r0, 16 - adds r5, r0 -_081E26D6: - ldr r0, _081E2714 @ =gRfuSlotStatusUNI - adds r0, r7, r0 - ldr r0, [r0] - ldrh r0, [r0] - cmp r0, r10 - bne _081E26F0 - adds r0, r6, 0 - mov r1, sp - bl rfu_STC_UNI_constructLLSF - lsls r0, 16 - lsrs r0, 16 - adds r5, r0 -_081E26F0: - cmp r5, 0 - beq _081E2724 - ldr r0, _081E2704 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E2718 - add r8, r5 - b _081E2724 - .align 2, 0 -_081E2704: .4byte gRfuLinkStatus -_081E2708: .4byte gRfuFixed -_081E270C: .4byte 0x00008024 -_081E2710: .4byte gRfuSlotStatusNI -_081E2714: .4byte gRfuSlotStatusUNI -_081E2718: - adds r0, r7, r6 - adds r0, 0x8 - lsls r5, r0 - mov r2, r8 - orrs r2, r5 - mov r8, r2 -_081E2724: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bls _081E269A - ldr r6, _081E2784 @ =gRfuStatic - mov r0, r8 - cmp r0, 0 - beq _081E276E - ldr r2, [sp] - movs r0, 0x3 - ands r0, r2 - ldr r5, _081E2788 @ =gRfuLinkStatus - ldr r1, _081E278C @ =gRfuFixed - cmp r0, 0 - beq _081E2756 - movs r4, 0 - movs r3, 0x3 -_081E2748: - strb r4, [r2] - adds r0, r2, 0x1 - str r0, [sp] - adds r2, r0, 0 - ands r0, r3 - cmp r0, 0 - bne _081E2748 -_081E2756: - ldr r0, [r1] - mov r2, r8 - str r2, [r0, 0x68] - ldr r0, [r5] - ldrb r0, [r0] - cmp r0, 0 - bne _081E276E - ldr r0, [sp] - subs r0, 0x6C - ldr r1, [r1] - subs r0, r1 - mov r8, r0 -_081E276E: - ldr r0, [r6] - mov r1, r8 - str r1, [r0, 0x24] -_081E2774: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2784: .4byte gRfuStatic -_081E2788: .4byte gRfuLinkStatus -_081E278C: .4byte gRfuFixed - thumb_func_end rfu_constructSendLLFrame - - thumb_func_start rfu_STC_NI_constructLLSF -rfu_STC_NI_constructLLSF: @ 81E2790 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - mov r12, r1 - adds r4, r2, 0 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldr r2, _081E280C @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r0, [r0] - lsls r0, 4 - ldr r1, _081E2810 @ =_Str_RfuHeader - adds r0, r1 - mov r8, r0 - ldrh r1, [r4] - ldr r0, _081E2814 @ =0x00008022 - cmp r1, r0 - bne _081E27FA - adds r3, r4, 0 - adds r3, 0x20 - ldrb r1, [r3] - lsls r1, 2 - adds r5, r4, 0x4 - adds r1, r5, r1 - ldr r2, [r4, 0x28] - ldr r0, [r4, 0x30] - adds r2, r0 - ldr r0, [r1] - adds r6, r3, 0 - cmp r0, r2 - bcc _081E27FA - movs r7, 0 -_081E27D8: - ldrb r0, [r3] - adds r0, 0x1 - strb r0, [r3] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bne _081E27E8 - strb r7, [r6] -_081E27E8: - ldrb r1, [r3] - lsls r1, 2 - adds r1, r5, r1 - ldr r2, [r4, 0x28] - ldr r0, [r4, 0x30] - adds r2, r0 - ldr r0, [r1] - cmp r0, r2 - bcs _081E27D8 -_081E27FA: - ldrh r1, [r4] - movs r0, 0x40 - ands r0, r1 - mov r9, r1 - cmp r0, 0 - beq _081E2818 - movs r5, 0 - b _081E285C - .align 2, 0 -_081E280C: .4byte gRfuLinkStatus -_081E2810: .4byte _Str_RfuHeader -_081E2814: .4byte 0x00008022 -_081E2818: - ldr r0, _081E2844 @ =0x00008022 - cmp r9, r0 - bne _081E284C - adds r3, r4, 0 - adds r3, 0x20 - ldrb r0, [r3] - lsls r0, 2 - adds r1, r4, 0x4 - adds r1, r0 - ldrh r7, [r4, 0x2E] - ldr r5, [r1] - adds r2, r5, r7 - ldr r1, [r4, 0x28] - ldr r0, [r4, 0x30] - adds r0, r1, r0 - adds r6, r3, 0 - cmp r2, r0 - bls _081E2848 - subs r0, r5 - lsls r0, 16 - lsrs r5, r0, 16 - b _081E2860 - .align 2, 0 -_081E2844: .4byte 0x00008022 -_081E2848: - adds r5, r7, 0 - b _081E2860 -_081E284C: - ldrh r2, [r4, 0x2E] - ldr r0, [r4, 0x14] - cmp r0, r2 - bcc _081E2858 - adds r5, r2, 0 - b _081E285C -_081E2858: - lsls r0, 16 - lsrs r5, r0, 16 -_081E285C: - adds r6, r4, 0 - adds r6, 0x20 -_081E2860: - movs r3, 0xF - mov r0, r9 - ands r3, r0 - mov r1, r8 - ldrb r1, [r1, 0x3] - lsls r3, r1 - ldrb r0, [r4, 0x1F] - mov r2, r8 - ldrb r2, [r2, 0x4] - lsls r0, r2 - orrs r3, r0 - ldrb r1, [r6] - adds r0, r1, 0 - mov r7, r8 - ldrb r7, [r7, 0x5] - lsls r0, r7 - orrs r3, r0 - adds r0, r4, 0 - adds r0, 0x21 - adds r0, r1 - ldrb r0, [r0] - mov r1, r8 - ldrb r1, [r1, 0x6] - lsls r0, r1 - orrs r3, r0 - orrs r3, r5 - str r3, [sp] - ldr r2, _081E291C @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E28A8 - ldrb r0, [r4, 0x1A] - lsls r0, 18 - orrs r3, r0 - str r3, [sp] -_081E28A8: - mov r2, sp - movs r3, 0 - mov r7, r8 - ldrb r7, [r7] - cmp r3, r7 - bcs _081E28D2 -_081E28B4: - mov r0, r12 - ldr r1, [r0] - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r1, 0x1 - mov r7, r12 - str r1, [r7] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - mov r0, r8 - ldrb r0, [r0] - cmp r3, r0 - bcc _081E28B4 -_081E28D2: - cmp r5, 0 - beq _081E28F2 - ldrb r1, [r6] - lsls r1, 2 - adds r0, r4, 0x4 - adds r0, r1 - ldr r0, [r0] - str r0, [sp, 0x4] - ldr r0, _081E2920 @ =gRfuFixed - ldr r1, [r0] - add r0, sp, 0x4 - ldr r3, [r1, 0x4] - mov r1, r12 - adds r2, r5, 0 - bl _call_via_r3 -_081E28F2: - ldrh r1, [r4] - ldr r0, _081E2924 @ =0x00008022 - cmp r1, r0 - bne _081E290C - ldrb r0, [r6] - adds r0, 0x1 - strb r0, [r6] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bne _081E290C - movs r0, 0 - strb r0, [r6] -_081E290C: - ldr r0, _081E291C @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2] - cmp r1, 0x1 - bne _081E2928 - ldrb r0, [r2, 0xE] - strb r1, [r2, 0xE] - b _081E2936 - .align 2, 0 -_081E291C: .4byte gRfuLinkStatus -_081E2920: .4byte gRfuFixed -_081E2924: .4byte 0x00008022 -_081E2928: - movs r0, 0x1 - mov r1, r10 - lsls r0, r1 - ldrb r1, [r2, 0xE] - orrs r0, r1 - ldrb r1, [r2, 0xE] - strb r0, [r2, 0xE] -_081E2936: - mov r2, r8 - ldrb r0, [r2] - adds r0, r5, r0 - lsls r0, 16 - lsrs r0, 16 - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_STC_NI_constructLLSF - - thumb_func_start rfu_STC_UNI_constructLLSF -rfu_STC_UNI_constructLLSF: @ 81E2950 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x8 - adds r6, r1, 0 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - ldr r1, _081E2978 @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r4, [r0] - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _081E2974 - ldrb r0, [r4, 0x3] - cmp r0, 0 - bne _081E297C -_081E2974: - movs r0, 0 - b _081E2A18 - .align 2, 0 -_081E2978: .4byte gRfuSlotStatusUNI -_081E297C: - ldr r0, _081E29F4 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2] - lsls r0, 4 - ldr r1, _081E29F8 @ =_Str_RfuHeader - adds r5, r0, r1 - ldrh r0, [r4] - movs r1, 0xF - ands r1, r0 - ldrb r0, [r5, 0x3] - lsls r1, r0 - ldrh r0, [r4, 0x4] - orrs r1, r0 - str r1, [sp] - ldrb r0, [r2] - cmp r0, 0x1 - bne _081E29A6 - ldrb r0, [r4, 0x3] - lsls r0, 18 - orrs r1, r0 - str r1, [sp] -_081E29A6: - mov r2, sp - movs r3, 0 - ldr r1, _081E29FC @ =gRfuFixed - mov r12, r1 - add r7, sp, 0x4 - ldrb r0, [r5] - cmp r3, r0 - bcs _081E29CE -_081E29B6: - ldr r1, [r6] - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r1, 0x1 - str r1, [r6] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - ldrb r1, [r5] - cmp r3, r1 - bcc _081E29B6 -_081E29CE: - ldr r0, [r4, 0x8] - str r0, [sp, 0x4] - mov r2, r12 - ldr r0, [r2] - ldrh r2, [r4, 0x4] - ldr r3, [r0, 0x4] - adds r0, r7, 0 - adds r1, r6, 0 - bl _call_via_r3 - ldr r0, _081E29F4 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2] - cmp r0, 0x1 - bne _081E2A00 - ldrb r0, [r2, 0xE] - movs r0, 0x10 - b _081E2A0C - .align 2, 0 -_081E29F4: .4byte gRfuLinkStatus -_081E29F8: .4byte _Str_RfuHeader -_081E29FC: .4byte gRfuFixed -_081E2A00: - movs r0, 0x10 - mov r1, r8 - lsls r0, r1 - ldrb r1, [r2, 0xE] - orrs r0, r1 - ldrb r1, [r2, 0xE] -_081E2A0C: - strb r0, [r2, 0xE] - ldrh r0, [r4, 0x4] - ldrb r5, [r5] - adds r0, r5 - lsls r0, 16 - lsrs r0, 16 -_081E2A18: - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_STC_UNI_constructLLSF - - thumb_func_start rfu_REQ_recvData -rfu_REQ_recvData: @ 81E2A24 - push {r4,lr} - ldr r0, _081E2A58 @ =gRfuLinkStatus - ldr r4, [r0] - ldrb r0, [r4] - cmp r0, 0xFF - beq _081E2A50 - ldr r2, _081E2A5C @ =gRfuStatic - ldr r3, [r2] - ldrb r0, [r4, 0x4] - ldrb r1, [r4, 0x5] - orrs r0, r1 - ldrb r1, [r4, 0x6] - orrs r0, r1 - movs r1, 0 - strb r0, [r3, 0x3] - ldr r0, [r2] - strb r1, [r0, 0x4] - ldr r0, _081E2A60 @ =rfu_CB_recvData - bl STWI_set_Callback_M - bl STWI_send_DataRxREQ -_081E2A50: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081E2A58: .4byte gRfuLinkStatus -_081E2A5C: .4byte gRfuStatic -_081E2A60: .4byte rfu_CB_recvData - thumb_func_end rfu_REQ_recvData - - thumb_func_start rfu_CB_recvData -rfu_CB_recvData: @ 81E2A64 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E2B28 - ldr r0, _081E2AA0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x1] - cmp r0, 0 - beq _081E2B28 - ldr r0, _081E2AA4 @ =gRfuStatic - ldr r0, [r0] - strb r7, [r0, 0x1] - ldr r0, _081E2AA8 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E2AAC - bl rfu_STC_PARENT_analyzeRecvPacket - b _081E2AB0 - .align 2, 0 -_081E2AA0: .4byte gRfuFixed -_081E2AA4: .4byte gRfuStatic -_081E2AA8: .4byte gRfuLinkStatus -_081E2AAC: - bl rfu_STC_CHILD_analyzeRecvPacket -_081E2AB0: - movs r6, 0 - ldr r0, _081E2B40 @ =0x00008043 - mov r8, r0 - ldr r3, _081E2B44 @ =gRfuLinkStatus -_081E2AB8: - ldr r0, _081E2B48 @ =gRfuSlotStatusNI - lsls r1, r6, 2 - adds r1, r0 - ldr r4, [r1] - ldrh r0, [r4, 0x34] - cmp r0, r8 - bne _081E2B0A - ldr r0, _081E2B4C @ =gRfuStatic - ldr r0, [r0] - ldrb r0, [r0, 0x1] - asrs r0, r6 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - bne _081E2B0A - adds r5, r4, 0 - adds r5, 0x34 - adds r0, r4, 0 - adds r0, 0x61 - ldrb r2, [r0] - cmp r2, 0x1 - bne _081E2AEE - ldr r1, [r3] - lsls r2, r6 - ldrb r0, [r1, 0x7] - orrs r2, r0 - strb r2, [r1, 0x7] -_081E2AEE: - adds r0, r6, 0 - movs r1, 0x1 - adds r2, r5, 0 - str r3, [sp] - bl rfu_STC_releaseFrame - ldr r3, [sp] - ldr r2, [r3] - ldrb r1, [r5, 0x1A] - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] - movs r0, 0x46 - strh r0, [r4, 0x34] -_081E2B0A: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bls _081E2AB8 - ldr r0, _081E2B4C @ =gRfuStatic - ldr r1, [r0] - ldrb r0, [r1, 0x4] - cmp r0, 0 - beq _081E2B28 - adds r7, r0, 0 - movs r1, 0xE0 - lsls r1, 3 - adds r0, r1, 0 - orrs r7, r0 -_081E2B28: - mov r0, r9 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2B40: .4byte 0x00008043 -_081E2B44: .4byte gRfuLinkStatus -_081E2B48: .4byte gRfuSlotStatusNI -_081E2B4C: .4byte gRfuStatic - thumb_func_end rfu_CB_recvData - - thumb_func_start rfu_STC_PARENT_analyzeRecvPacket -rfu_STC_PARENT_analyzeRecvPacket: @ 81E2B50 - push {r4-r7,lr} - sub sp, 0x4 - ldr r1, _081E2BE0 @ =gRfuFixed - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldr r0, [r0, 0x4] - lsrs r3, r0, 8 - movs r5, 0 - mov r12, r1 - movs r7, 0x1F - ldr r4, _081E2BE4 @ =gRfuStatic - movs r6, 0x1 -_081E2B6A: - mov r0, sp - adds r1, r0, r5 - adds r0, r3, 0 - ands r0, r7 - strb r0, [r1] - lsrs r3, 5 - cmp r0, 0 - bne _081E2B86 - ldr r0, [r4] - adds r1, r6, 0 - lsls r1, r5 - ldrb r2, [r0, 0x1] - orrs r1, r2 - strb r1, [r0, 0x1] -_081E2B86: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E2B6A - mov r1, r12 - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - adds r6, r0, 0 - adds r6, 0x8 - movs r5, 0 -_081E2B9E: - mov r0, sp - adds r1, r0, r5 - ldrb r0, [r1] - adds r7, r5, 0x1 - cmp r0, 0 - beq _081E2BD0 - adds r4, r1, 0 -_081E2BAC: - ldrb r2, [r4] - adds r0, r5, 0 - adds r1, r6, 0 - bl rfu_STC_analyzeLLSF - lsls r0, 24 - lsrs r0, 24 - adds r6, r0 - ldrb r1, [r4] - subs r1, r0 - strb r1, [r4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _081E2BD0 - lsls r0, r1, 24 - cmp r0, 0 - bne _081E2BAC -_081E2BD0: - lsls r0, r7, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E2B9E - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2BE0: .4byte gRfuFixed -_081E2BE4: .4byte gRfuStatic - thumb_func_end rfu_STC_PARENT_analyzeRecvPacket - - thumb_func_start rfu_STC_CHILD_analyzeRecvPacket -rfu_STC_CHILD_analyzeRecvPacket: @ 81E2BE8 - push {r4-r6,lr} - ldr r0, _081E2C38 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrh r0, [r1, 0x4] - movs r4, 0x7F - ands r4, r0 - adds r5, r1, 0 - adds r5, 0x8 - cmp r4, 0 - bne _081E2C08 - ldr r0, _081E2C3C @ =gRfuStatic - ldr r1, [r0] - movs r0, 0xF - strb r0, [r1, 0x1] -_081E2C08: - movs r0, 0x80 - lsls r0, 8 - adds r6, r0, 0 -_081E2C0E: - cmp r4, 0 - beq _081E2C30 - movs r0, 0 - adds r1, r5, 0 - adds r2, r4, 0 - bl rfu_STC_analyzeLLSF - lsls r0, 16 - lsrs r0, 16 - adds r5, r0 - subs r0, r4, r0 - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r4, 0 - ands r0, r6 - cmp r0, 0 - beq _081E2C0E -_081E2C30: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E2C38: .4byte gRfuFixed -_081E2C3C: .4byte gRfuStatic - thumb_func_end rfu_STC_CHILD_analyzeRecvPacket - thumb_func_start rfu_STC_analyzeLLSF rfu_STC_analyzeLLSF: @ 81E2C40 push {r4-r7,lr} diff --git a/include/librfu.h b/include/librfu.h index 9482b94c4..ff160e207 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -3,6 +3,12 @@ #include "main.h" +/* TODOs: + * - documentation + * - check if any field needs to be volatile + * - decompile librfu_intr.s once arm support is back again + */ + enum { RFU_RESET = 0x10, @@ -134,16 +140,25 @@ struct RfuIntrStruct struct RfuSlotStatusUNI { - u16 sendState; - u8 dataReadyFlag; - u8 bmSlot; - u16 payloadSize; - void *src; // TODO: is it correct? - u16 recvState; - u16 errorCode; - u16 dataSize; - u8 newDataFlag; - u8 dataBlockFlag; + struct + { + struct UNISend + { + u16 state; + u8 dataReadyFlag; + u8 bmSlot; + u16 payloadSize; + const void *src; + } send; + struct UNIRecv + { + u16 state; + u16 errorCode; + u16 dataSize; + u8 newDataFlag; + u8 dataBlockFlag; + } recv; + } sub; void *recvBuffer; u32 recvBufferSize; }; @@ -152,16 +167,15 @@ struct NIComm { u16 state; u16 failCounter; - u32 nowP[4]; // ??? + const u8 *nowP[4]; u32 remainSize; u16 errorCode; u8 bmSlot; - u8 unk_1b; u8 recvAckFlag[4]; u8 ack; u8 phase; - u8 n[4]; // ??? - void *src; + u8 n[4]; + const void *src; u8 bmSlotOrg; u8 dataType; u16 payloadSize; @@ -170,16 +184,19 @@ struct NIComm struct RfuSlotStatusNI { - struct NIComm send; - struct NIComm recv; + struct + { + struct NIComm send; + struct NIComm recv; + } sub; void *recvBuffer; - void *recvBufferSize; + u32 recvBufferSize; }; struct RfuFixed { void (*reqCallback)(u16, u16); - void *fastCopyPtr; + void (*fastCopyPtr)(const u8 **, u8 **, s32); u16 fastCopyBuffer[24]; u32 fastCopyBuffer2[12]; u32 LLFBuffer[29]; @@ -190,7 +207,7 @@ struct RfuStatic { u8 flags; u8 NIEndRecvFlag; - u8 RecvRenewalFlag; + u8 recvRenewalFlag; u8 commExistFlag; u8 recvErrorFlag; u8 recoveryBmSlot; @@ -231,7 +248,7 @@ struct RfuLinkStatus u8 findParentCount; u8 watchInterval; u8 strength[4]; - u8 LLFReadyFlag; + vu8 LLFReadyFlag; u8 remainLLFrameSizeParent; u8 remainLLFrameSizeChild[4]; struct RfuTgtData partner[4]; @@ -275,7 +292,7 @@ void rfu_REQ_sendData(u8); void rfu_setMSCCallback(void (*func)(u16)); void rfu_setREQCallback(void (*func)(u16, u16)); bool8 rfu_getMasterSlave(void); -void rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); +s32 rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); u16 rfu_syncVBlank(void); void rfu_REQ_reset(void); void rfu_REQ_configSystem(u16, u8, u8); @@ -296,24 +313,24 @@ void rfu_REQ_changeMasterSlave(void); void rfu_REQ_RFUStatus(void); u32 rfu_getRFUStatus(u8 *status); struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void); -u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); -void rfu_clearSlot(u8 a0, u8 a1); +s32 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); +s32 rfu_clearSlot(u8 a0, u8 a1); void rfu_clearAllSlot(void); -bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); +u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); u16 rfu_getConnectParentStatus(u8 *status, u8 *a1); bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0); void rfu_REQ_disconnect(u8 who); -void rfu_changeSendTarget(u8 a0, u8 who, u8 a2); -void rfu_NI_stopReceivingData(u8 who); +s32 rfu_changeSendTarget(u8 a0, u8 who, u8 a2); +s32 rfu_NI_stopReceivingData(u8 who); u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_setTimerInterrupt(u8 which, IntrFunc *intr); -void rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); -bool16 rfu_UNI_setSendData(u8 flag, void *ptr, u8 size); +s32 rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); +s32 rfu_UNI_setSendData(u8 flag, const void *ptr, u8 size); void rfu_REQ_recvData(void); void rfu_UNI_readySendData(u8 a0); void rfu_UNI_clearRecvNewDataFlag(u8 a0); void rfu_REQ_PARENT_resumeRetransmitAndChange(void); -void rfu_NI_setSendData(u8, u8, const void *, u32); +s32 rfu_NI_setSendData(u8, u8, const void *, u32); // librfu_intr void IntrSIO32(void); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 96f4e9519..3bfa3b601 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -11,17 +11,31 @@ void rfu_CB_startSearchParent(u8, u16); void rfu_CB_pollSearchParent(u8, u16); void rfu_CB_pollConnectParent(u8, u16); void rfu_CB_pollConnectParent(u8, u16); +void rfu_CB_disconnect(u8, u16); +void rfu_CB_CHILD_pollConnectRecovery(u8, u16); +void rfu_CB_sendData(UNUSED u8, u16); +void rfu_CB_sendData2(UNUSED u8, u16); +void rfu_CB_sendData3(u8, u16); +void rfu_CB_recvData(u8, u16); s32 sub_81E349C(u8); void rfu_enableREQCallback(bool8); void rfu_STC_readChildList(void); void rfu_STC_readParentCandidateList(void); void rfu_STC_REQ_callback(u8, u16); void rfu_STC_removeLinkData(u8, u8); -void rfu_STC_fastCopy(u8 **a1, u8 **a2, s32 a3); +void rfu_STC_fastCopy(const u8 **, u8 **, s32); void rfu_STC_clearLinkStatus(u8); void rfu_NI_checkCommFailCounter(void); +u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32); +void rfu_constructSendLLFrame(void); +u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); +u16 rfu_STC_UNI_constructLLSF(u8, u8 **); +void rfu_STC_PARENT_analyzeRecvPacket(void); +void rfu_STC_CHILD_analyzeRecvPacket(void); +u16 rfu_STC_analyzeLLSF(u8, u8 *, u16); extern const char _Str_RFU_MBOOT[]; +extern const u8 _Str_RfuHeader[]; struct RfuStruct *gRfuState; ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; @@ -89,7 +103,7 @@ u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, b // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy for (r3 = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --r3; r3 != 0xFFFF; --r3) *dst++ = *src++; - gRfuFixed->fastCopyPtr = (u8 *)gRfuFixed->fastCopyBuffer + 1; + gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1; return 0; } @@ -734,3 +748,1080 @@ u16 rfu_syncVBlank(void) --gRfuStatic->watchdogTimer; return 0; } + +s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) +{ + u8 sp08 = 0; + u8 sp0C = 0; + u8 i; + s32 sp10, sp14; + u8 *r2; + u8 r9, r6, r3, r1, r0; + + *r8 = 0; + *sp00 = 0; + *sp04 = 0; + if (gRfuLinkStatus->connMode == 0xFF || gRfuState->msMode == 0) + return 0; + if (gRfuStatic->flags & 4) + gRfuStatic->watchdogTimer = 360; + if (gRfuStatic->nowWatchInterval == 0) + { + gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval; + sp08 = 1; + } + if ((u8)r5 == 41) + { + u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + + *r8 = r1[4]; + *sp00 = r1[5]; + if (*sp00 == 1) + *r8 = gRfuLinkStatus->connSlotFlag; + sp08 = 2; + } + else + { + if (r5 == 310) + { + r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; + r6 ^= gRfuLinkStatus->connSlotFlag; + *r8 = r6 & gRfuLinkStatus->connSlotFlag; + *sp00 = 1; + for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + { + if ((*r8 >> i) & 1) + { + gRfuLinkStatus->strength[i] = 0; + rfu_STC_removeLinkData(i, 0); + } + } + } + if (sp08 == 0) + return 0; + } + sp10 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; + sp14 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_LinkStatusREQ(); + sp0C = STWI_poll_CommandEnd(); + if (sp0C == 0) + { + r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + gRfuLinkStatus->strength[i] = *r2++; + r9 = 0; + i = 0; + } + else + { + rfu_STC_REQ_callback(17, sp0C); + return sp0C; + } + for (; i < 4; ++i) + { + r6 = 1 << i; + if (sp0C == 0) + { + if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6)) + { + if (gRfuLinkStatus->strength[i] == 0) + { + if (gRfuLinkStatus->connMode == 1) + { + ++gRfuStatic->linkEmergencyFlag[i]; + if (gRfuStatic->linkEmergencyFlag[i] > 3) + { + *r8 |= r6; + *sp00 = sp08; // why not directly use 1? + } + } + else + { + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + { + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + { + *r8 |= r6; + *sp00 = sp08; + } + else + { + if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->unk_1a) + { + gRfuStatic->linkEmergencyFlag[i] = 0; + STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); + STWI_poll_CommandEnd(); + *r8 |= r6; + *sp00 = sp08; // why not directly use 1? + } + } + } + } + } + else + { + gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? + } + } + if (gRfuLinkStatus->connMode == 1 && gRfuLinkStatus->strength[i] != 0) + { + if (r6 & gRfuLinkStatus->linkLossSlotFlag) + { + if (gRfuLinkStatus->strength[i] > 10) + { + *sp04 |= r6; + gRfuLinkStatus->connSlotFlag |= r6; + gRfuLinkStatus->linkLossSlotFlag &= ~r6; + ++gRfuLinkStatus->connCount; + gRfuStatic->linkEmergencyFlag[i] = 0; + } + else + { + gRfuLinkStatus->strength[i] = 0; + } + } + else + { + if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r6)) + { + STWI_send_SlotStatusREQ(); + STWI_poll_CommandEnd(); + r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + r3 = r2[1] - 1; + for (r2 += 8; r3 != 0; r2 += 4, --r3) + { + u16 r4 = *(u16 *)r2; + + if (r2[2] == i && r4 == gRfuStatic->cidBak[i]) + { + r9 |= 1 << i; + break; + } + } + } + } + } + } + r1 = gRfuLinkStatus->connSlotFlag; + r0 = *r8; + r0 &= r1; + if (r6 & r0) + rfu_STC_removeLinkData(i, 0); + } + if (r9 != 0) + { + STWI_send_DisconnectREQ(r9); + STWI_poll_CommandEnd(); + } + // equivalent to: + // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = sp10; + *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = sp10; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = sp14; + return 0; +} + +void rfu_STC_removeLinkData(u8 r7, u8 r12) +{ + u8 r5 = 1 << r7; + s32 r6; + + if ((gRfuLinkStatus->connSlotFlag & r5) && gRfuLinkStatus->connCount != 0) + --gRfuLinkStatus->connCount; + gRfuLinkStatus->connSlotFlag &= r6 = ~r5; + gRfuLinkStatus->linkLossSlotFlag |= r5; + if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) + gRfuLinkStatus->connMode = 0xFF; + if (r12 != 0) + { + CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); + gRfuLinkStatus->linkLossSlotFlag &= r6; + gRfuLinkStatus->getNameFlag &= r6; + gRfuLinkStatus->strength[r7] = 0; + } +} + +void rfu_REQ_disconnect(u8 who) +{ + u16 r1; + + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & who) + { + gRfuStatic->recoveryBmSlot = who; + if (gRfuLinkStatus->connMode == 0xFF && gRfuStatic->flags & 0x80) + { + if (gRfuLinkStatus->linkLossSlotFlag & who) + rfu_CB_disconnect(48, 0); + } + else if (gRfuStatic->SCStartFlag + && (STWI_set_Callback_M(rfu_CB_defaultCallback), + STWI_send_SC_EndREQ(), + (r1 = STWI_poll_CommandEnd()) != 0)) + { + rfu_STC_REQ_callback(27, r1); + } + else + { + STWI_set_Callback_M(rfu_CB_disconnect); + STWI_send_DisconnectREQ(who); + } + } +} + +void rfu_CB_disconnect(u8 r6, u16 r5) +{ + u8 r4, r0; + + if (r5 == 3 && gRfuLinkStatus->connMode == 0) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + r5 = 0; + } + gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; + if (r5 == 0) + { + for (r4 = 0; r4 < 4; ++r4) + { + r0 = 1 << r4; + if (r0 & gRfuStatic->recoveryBmSlot) + rfu_STC_removeLinkData(r4, 1); + } + } + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) + gRfuLinkStatus->connMode = 0xFF; + rfu_STC_REQ_callback(r6, r5); + if (gRfuStatic->SCStartFlag) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SC_StartREQ(); + r5 = STWI_poll_CommandEnd(); + if (r5 != 0) + rfu_STC_REQ_callback(25, r5); + } +} + +void rfu_REQ_CHILD_startConnectRecovery(u8 r5) +{ + u8 i; + + gRfuStatic->recoveryBmSlot = r5; + for (i = 0; i < 4 && !((r5 >> i) & 1); ++i) + ; + STWI_set_Callback_M(rfu_STC_REQ_callback); + // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id + STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, r5); +} + +void rfu_REQ_CHILD_pollConnectRecovery(void) +{ + STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); + STWI_send_CPR_PollingREQ(); +} + +void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) +{ + u8 r3, r4; + struct RfuLinkStatus *r2; + + if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) + { + gRfuLinkStatus->connMode = 0; + for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) + { + r3 = 1 << r4; + r2 = gRfuLinkStatus; // ??? + if (gRfuStatic->recoveryBmSlot & r3 & r2->linkLossSlotFlag) + { + gRfuLinkStatus->connSlotFlag |= r3; + gRfuLinkStatus->linkLossSlotFlag &= ~r3; + ++gRfuLinkStatus->connCount; + gRfuStatic->linkEmergencyFlag[r4] = 0; + } + } + gRfuStatic->recoveryBmSlot = 0; + } + rfu_STC_REQ_callback(r8, r7); +} + +u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) +{ + u8 r0; + + *status = 0xFF; + r0 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] + 77; + if (r0 <= 1) + { + *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + return 0; + } + return 0x10; +} + +void rfu_REQ_CHILD_endConnectRecovery(void) +{ + STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); + STWI_send_CPR_EndREQ(); +} + +void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) +{ + const u8 *src = *src_p; + u8 *dst = *dst_p; + s32 i; + + for (i = size - 1; i != -1; --i) + *dst++ = *src++; + *src_p = src; + *dst_p = dst; +} + +void rfu_REQ_changeMasterSlave(void) +{ + if (STWI_read_status(1) == 1) + { + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_MS_ChangeREQ(); + } + else + { + rfu_STC_REQ_callback(39, 0); + } +} + +bool8 rfu_getMasterSlave(void) +{ + bool8 r2 = STWI_read_status(1); + + if (r2 == 1) + { + if (gRfuState->unk_2c) + { + if (gRfuState->reqActiveCommand == 39 + || gRfuState->reqActiveCommand == 37 + || gRfuState->reqActiveCommand == 55) + r2 = 0; + } + } + return r2; +} + +void rfu_clearAllSlot(void) +{ + u16 i; + u16 IMEBackup = REG_IME; + + REG_IME = 0; + for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i) + { + CpuFill16(0, gRfuSlotStatusNI[i], sizeof(gRfuSlotStatusNI[i]->sub)); + CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(gRfuSlotStatusUNI[i]->sub)); + gRfuLinkStatus->remainLLFrameSizeChild[i] = 16; + } + gRfuLinkStatus->remainLLFrameSizeParent = 87; + gRfuLinkStatus->sendSlotNIFlag = 0; + gRfuLinkStatus->recvSlotNIFlag = 0; + gRfuLinkStatus->sendSlotUNIFlag = 0; + gRfuStatic->recvRenewalFlag = 0; + REG_IME = IMEBackup; +} + +void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) +{ + + if (!(gRfuStatic->flags & 0x80)) + { + if (r3 == 0) + gRfuLinkStatus->remainLLFrameSizeParent += r4->payloadSize; + gRfuLinkStatus->remainLLFrameSizeParent += 3; + } + else + { + if (r3 == 0) + gRfuLinkStatus->remainLLFrameSizeChild[r5] += r4->payloadSize; + gRfuLinkStatus->remainLLFrameSizeChild[r5] += 2; + } +} + +s32 rfu_clearSlot(u8 r8, u8 r7) +{ + u16 r10, r3, r1; + struct NIComm *r4; + + if (r7 > 3) + return 0x400; + if ((r8 & 0xF) == 0) + return 0x600; + r10 = REG_IME; + REG_IME = 0; + if (r8 & 0xC) + { + for (r3 = 0; r3 < 2; ++r3) + { + r4 = NULL; + if (r3 == 0) + { + if (r8 & 4) + { + r4 = &gRfuSlotStatusNI[r7]->sub.send; + gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg; + } + } + else + { + if (r8 & 8) + { + r4 = &gRfuSlotStatusNI[r7]->sub.recv; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << r7); + } + } + if (r4 != NULL) + { + if (r4->state & 0x8000) + { + rfu_STC_releaseFrame(r7, r3, r4); + for (r1 = 0; r1 < 4; ++r1) + if ((r4->bmSlotOrg >> r1) & 1) + r4->failCounter = 0; + } + CpuFill16(0, r4, sizeof(struct NIComm)); + } + } + } + if (r8 & 1) + { + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; + + if (r3->sub.send.state & 0x8000) + { + if (!(gRfuStatic->flags & 0x80)) + gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->sub.send.payloadSize; + else + gRfuLinkStatus->remainLLFrameSizeChild[r7] += 2 + (u8)r3->sub.send.payloadSize; + gRfuLinkStatus->sendSlotUNIFlag &= ~r3->sub.send.bmSlot; + } + CpuFill16(0, &r3->sub.send, sizeof(struct UNISend)); + } + if (r8 & 2) + { + CpuFill16(0, &gRfuSlotStatusUNI[r7]->sub.recv, sizeof(struct UNIRecv)); + } + REG_IME = r10; + return 0; +} + +s32 rfu_setRecvBuffer(u8 r3, u8 r4, void *r5, size_t r6) +{ + if (r4 > 3) + return 0x400; + if (r3 & 0x20) + { + gRfuSlotStatusNI[r4]->recvBuffer = r5; + gRfuSlotStatusNI[r4]->recvBufferSize = r6; + } + else if (!(r3 & 0x10)) + { + return 0x600; + } + else + { + gRfuSlotStatusUNI[r4]->recvBuffer = r5; + gRfuSlotStatusUNI[r4]->recvBufferSize = r6; + } + return 0; +} + +s32 rfu_NI_setSendData(u8 a1, u8 a2, const void *a3, u32 a4) +{ + return rfu_STC_setSendData_org(32, a1, a2, a3, a4); +} + +s32 rfu_UNI_setSendData(u8 flag, const void *ptr, u8 size) +{ + u8 r0; + + if (gRfuLinkStatus->connMode == 1) + r0 = size + 3; + else + r0 = size + 2; + return rfu_STC_setSendData_org(16, flag, r0, ptr, 0); +} + +s32 rfu_NI_CHILD_setSendGameName(u8 a1, u8 a2) +{ + return rfu_STC_setSendData_org(64, 1 << a1, a2, &gRfuLinkStatus->my.serialNum, 26); +} + +u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) +{ + u8 r2, r0; + u8 r4; + u8 *r9; + u8 r5; + u8 i; + u16 sp04; + struct RfuSlotStatusUNI *r1; + struct RfuSlotStatusNI *r12; + + if (gRfuLinkStatus->connMode == 0xFF) + return 0x301; + if (!(r3 & 0xF)) + return 0x400; + if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r3) != r3) + return 0x401; + if (r6 & 0x10) + r0 = gRfuLinkStatus->sendSlotUNIFlag; + else + r0 = gRfuLinkStatus->sendSlotNIFlag; + if (r0 & r3) + return 0x402; + for (r2 = 0; r2 < 4 && !((r3 >> r2) & 1); ++r2) + ; + if (gRfuLinkStatus->connMode == 1) + r9 = &gRfuLinkStatus->remainLLFrameSizeParent; + else if (gRfuLinkStatus->connMode == 0) + r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; + r4 = _Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + if (r8 > *r9 || r8 <= r4) + return 0x500; + sp04 = REG_IME; + REG_IME = 0; + r5 = r6 & 0x20; + if (r5 || r6 == 0x40) + { + u8 *r1; // a hack to swap instructions + + r12 = gRfuSlotStatusNI[r2]; + r1 = NULL; + r12->sub.send.errorCode = 0; + *r12->sub.send.nowP = r1 = &r12->sub.send.dataType; + r12->sub.send.remainSize = 7; + r12->sub.send.bmSlotOrg = r3; + r12->sub.send.bmSlot = r3; + r12->sub.send.payloadSize = r8 - r4; + if (r5 != 0) + *r1 = 0; + else + *r1 = 1; + r12->sub.send.dataSize = sp28; + r12->sub.send.src = sp00; + r12->sub.send.ack = 0; + r12->sub.send.phase = 0; + #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette + asm("":::"r2"); + #endif + for (i = 0; i < NELEMS(r12->sub.send.recvAckFlag); ++i) + { + r12->sub.send.recvAckFlag[i] = 0; + r12->sub.send.n[i] = 1; + } + for (r2 = 0; r2 < NELEMS(gRfuSlotStatusNI); ++r2) + if ((r3 >> r2) & 1) + gRfuSlotStatusNI[r2]->sub.send.failCounter = 0; + gRfuLinkStatus->sendSlotNIFlag |= r3; + *r9 -= r8; + r12->sub.send.state = 0x8021; + } + else if (r6 & 0x10) + { + r1 = gRfuSlotStatusUNI[r2]; + r1->sub.send.bmSlot = r3; + r1->sub.send.src = sp00; + r1->sub.send.payloadSize = r8 - r4; + *r9 -= r8; + r1->sub.send.state = 0x8024; + gRfuLinkStatus->sendSlotUNIFlag |= r3; + } + REG_IME = sp04; + return 0; +} + +s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) +{ + struct RfuSlotStatusNI *r5; + u16 r8; + u8 r2; + + if (r7 >= NELEMS(gRfuSlotStatusNI)) + return 0x400; + if (r3 == 0x20) + { + r5 = gRfuSlotStatusNI[r7]; + if ((r5->sub.send.state & 0x8000) + && (r5->sub.send.state & 0x20)) + { + r3 = r6 ^ r5->sub.send.bmSlot; + + if (!(r3 & r6)) + { + if (r3) + { + r8 = REG_IME; + REG_IME = 0; + for (r2 = 0; r2 < NELEMS(gRfuSlotStatusNI); ++r2) + { + if ((r3 >> r2) & 1) + gRfuSlotStatusNI[r2]->sub.send.failCounter = 0; + } + gRfuLinkStatus->sendSlotNIFlag &= ~r3; + r5->sub.send.bmSlot = r6; + if ((r6 << 24) == 0) // The shift doesn't make any sense. + { + rfu_STC_releaseFrame(r7, 0, &r5->sub.send); + r5->sub.send.state = 39; + } + REG_IME = r8; + } + } + else + { + return 0x404; + } + } + else + { + return 0x403; + } + } + else + { + if (r3 == 16) + { + s32 r3; + + if (gRfuSlotStatusUNI[r7]->sub.send.state != 0x8024) + return 0x403; + for (r3 = 0, r2 = 0; r2 < NELEMS(gRfuSlotStatusUNI); ++r2) + if (r2 != r7) + r3 |= gRfuSlotStatusUNI[r2]->sub.send.bmSlot; + if (r6 & r3) + return 0x404; + r8 = REG_IME; + REG_IME = 0; + gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[r7]->sub.send.bmSlot; + gRfuLinkStatus->sendSlotUNIFlag |= r6; + gRfuSlotStatusUNI[r7]->sub.send.bmSlot = r6; + REG_IME = r8; + } + else + { + return 0x600; + } + } + return 0; +} + +s32 rfu_NI_stopReceivingData(u8 who) +{ +#ifndef NONMATCHING // r4, r5 register swap + register struct NIComm *r5 asm("r5"); +#else + struct NIComm *r5; +#endif + u16 r4, r1; + + if (who > 3) + return 0x400; + r5 = &gRfuSlotStatusNI[who]->sub.recv; + r4 = REG_IME; + REG_IME = 0; + if (gRfuSlotStatusNI[who]->sub.recv.state & 0x8000) + { + if (gRfuSlotStatusNI[who]->sub.recv.state == 0x8043) + gRfuSlotStatusNI[who]->sub.recv.state = 72; + else + gRfuSlotStatusNI[who]->sub.recv.state = 71; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << who); + rfu_STC_releaseFrame(who, 1, r5); + } + REG_IME = r4; + return 0; +} + +s32 rfu_UNI_changeAndReadySendData(u8 r3, const void *r7, u8 r5) +{ + struct UNISend *r4; + u8 *r6; + u16 r1; + u8 r3_; + + if (r3 >= 4) + return 0x400; + r4 = &gRfuSlotStatusUNI[r3]->sub.send; + if (r4->state != 0x8024) + return 0x403; + if (gRfuLinkStatus->connMode == 1) + { + r6 = &gRfuLinkStatus->remainLLFrameSizeParent; + r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize; + } + else + { + r6 = &gRfuLinkStatus->remainLLFrameSizeChild[r3]; + r3_ = gRfuLinkStatus->remainLLFrameSizeChild[r3] + (u8)r4->payloadSize; + } + if (r3_ < r5) + return 0x500; + r1 = REG_IME; + REG_IME = 0; + r4->src = r7; + *r6 = r3_ - r5; + r4->payloadSize = r5; + r4->dataReadyFlag = 1; + REG_IME = r1; + return 0; +} + +void rfu_UNI_readySendData(u8 a1) +{ + if (a1 < NELEMS(gRfuSlotStatusUNI)) + { + if (gRfuSlotStatusUNI[a1]->sub.send.state == 0x8024) + gRfuSlotStatusUNI[a1]->sub.send.dataReadyFlag = 1; + } +} + +void rfu_UNI_clearRecvNewDataFlag(u8 a1) +{ + if (a1 < NELEMS(gRfuSlotStatusUNI)) + gRfuSlotStatusUNI[a1]->sub.recv.newDataFlag = 0; +} + +void rfu_REQ_sendData(u8 r5) +{ + if (gRfuLinkStatus->connMode != 0xFF) + { + if (gRfuLinkStatus->connMode == 1 + && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)) + { + if (gRfuStatic->commExistFlag) + { + gRfuStatic->emberCount = 16; + gRfuStatic->nullFrameCount = 0; + } + if (gRfuStatic->emberCount) + --gRfuStatic->emberCount; + else + ++gRfuStatic->nullFrameCount; + if (gRfuStatic->emberCount + || !(gRfuStatic->nullFrameCount & 0xF)) + { + gRfuFixed->LLFBuffer[0] = 1; + gRfuFixed->LLFBuffer[4] = 0xFF; + STWI_set_Callback_M(rfu_CB_sendData3); + if (r5 == 0) + STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, 1); + else + STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, 1); + return; + } + } + else + { + if (!gRfuLinkStatus->LLFReadyFlag) + rfu_constructSendLLFrame(); + if (gRfuLinkStatus->LLFReadyFlag) + { + STWI_set_Callback_M(rfu_CB_sendData); + if (r5 != 0) + { + STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); + return; + } + STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); + } + } + if (r5 != 0) + { + if (gRfuLinkStatus->connMode == 1) + { + if (gRfuState->callbackS != NULL) + gRfuState->callbackS(39); + } + else + { + STWI_set_Callback_M(rfu_CB_sendData2); + STWI_send_MS_ChangeREQ(); + } + } + } +} + +void rfu_CB_sendData(UNUSED u8 r0, u16 r7) +{ + u8 r6; + struct NIComm *r4; + + if (r7 == 0) + { + for (r6 = 0; r6 < NELEMS(gRfuSlotStatusNI); ++r6) + { + if (gRfuSlotStatusUNI[r6]->sub.send.dataReadyFlag) + gRfuSlotStatusUNI[r6]->sub.send.dataReadyFlag = 0; + r4 = &gRfuSlotStatusNI[r6]->sub.send; + if (r4->state == 0x8020) + { + rfu_STC_releaseFrame(r6, 0, r4); + gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot; + if (r4->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << r6; + r4->state = 38; + } + } + } + gRfuLinkStatus->LLFReadyFlag = 0; + rfu_STC_REQ_callback(36, r7); +} + +void rfu_CB_sendData2(UNUSED u8 r0, u16 r1) +{ + rfu_STC_REQ_callback(36, r1); +} + +void rfu_CB_sendData3(u8 r0, u16 r1) +{ + if (r1 != 0) + rfu_STC_REQ_callback(36, r1); + else if (r0 == 0xFF) + rfu_STC_REQ_callback(0xFF, 0); +} + +void rfu_constructSendLLFrame(void) +{ + u32 r8, r5; + u8 r6; + u8 *sp00; + struct RfuSlotStatusNI *r2; + + if (gRfuLinkStatus->connMode != 0xFF + && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) + { + gRfuLinkStatus->LLFReadyFlag = 0; + r8 = 0; + sp00 = (u8 *)&gRfuFixed->LLFBuffer[1]; + for (r6 = 0; r6 < NELEMS(gRfuSlotStatusUNI); ++r6) + { + r5 = 0; + if (gRfuSlotStatusNI[r6]->sub.send.state & 0x8000) + r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->sub.send); + if (gRfuSlotStatusNI[r6]->sub.recv.state & 0x8000) + r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->sub.recv); + if (gRfuSlotStatusUNI[r6]->sub.send.state == 0x8024) + r5 += rfu_STC_UNI_constructLLSF(r6, &sp00); + if (r5 != 0) + { + if (gRfuLinkStatus->connMode == 1) + r8 += r5; + else + r8 |= r5 << (5 * r6 + 8); + } + } + if (r8 != 0) + { + while ((u32)sp00 & 3) + *sp00++ = 0; + gRfuFixed->LLFBuffer[0] = r8; + if (gRfuLinkStatus->connMode == 0) + { + u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]); + + // Does the volatile qualifier make sense? + // It's the same as: + // asm("":::"memory"); + r8 = r0 - *(u8 *volatile *)&gRfuFixed; + } + } + gRfuStatic->totalPacketSize = r8; + } +} + +u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) +{ + u16 r5; + u32 sp00; + u8 i; + u8 *r2; + const u8 *r8 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + + if (r4->state == 0x8022) + { + while (r4->nowP[r4->phase] >= (const u8 *)r4->src + r4->dataSize) + { + ++r4->phase; + if (r4->phase == 4) + r4->phase = 0; + } + } + if (r4->state & 0x40) + { + r5 = 0; + } + else if (r4->state == 0x8022) + { + if (r4->nowP[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) + r5 = (const u8 *)r4->src + r4->dataSize - r4->nowP[r4->phase]; + else + r5 = r4->payloadSize; + } + else + { + if (r4->remainSize >= r4->payloadSize) + r5 = r4->payloadSize; + else + r5 = r4->remainSize; + } + sp00 = (r4->state & 0xF) << r8[3] + | r4->ack << r8[4] + | r4->phase << r8[5] + | r4->n[r4->phase] << r8[6] + | r5; + if (gRfuLinkStatus->connMode == 1) + sp00 |= r4->bmSlot << 18; + r2 = (u8 *)&sp00; + for (i = 0; i < *r8; ++i) + *(*r12)++ = *r2++; + if (r5 != 0) + { + const u8 *sp04 = r4->nowP[r4->phase]; + + gRfuFixed->fastCopyPtr(&sp04, r12, r5); + } + if (r4->state == 0x8022) + { + ++r4->phase; + if (r4->phase == 4) + r4->phase = 0; + } + if (gRfuLinkStatus->connMode == 1) + gRfuLinkStatus->LLFReadyFlag = 1; + else + gRfuLinkStatus->LLFReadyFlag |= 1 << r10; + return r5 + *r8; +} + +u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) +{ + const u8 *r5; + const u8 *sp04; + u32 sp00; + u8 *r2; + u8 i; + struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->sub.send; + + if (!r4->dataReadyFlag || !r4->bmSlot) + return 0; + r5 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + sp00 = (r4->state & 0xF) << r5[3] + | r4->payloadSize; + if (gRfuLinkStatus->connMode == 1) + sp00 |= r4->bmSlot << 18; + r2 = (u8 *)&sp00; + for (i = 0; i < *r5; ++i) + *(*r6)++ = *r2++; + sp04 = r4->src; + gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); + if (gRfuLinkStatus->connMode == 1) + gRfuLinkStatus->LLFReadyFlag = 16; + else + gRfuLinkStatus->LLFReadyFlag |= 16 << r8; + return *r5 + r4->payloadSize; +} + +void rfu_REQ_recvData(void) +{ + if (gRfuLinkStatus->connMode != 0xFF) + { + gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag; + gRfuStatic->recvErrorFlag = 0; + STWI_set_Callback_M(rfu_CB_recvData); + STWI_send_DataRxREQ(); + } +} + +void rfu_CB_recvData(u8 r9, u16 r7) +{ + u8 r6; + struct RfuSlotStatusNI *r4; + struct NIComm *r5; + + if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) + { + gRfuStatic->NIEndRecvFlag = 0; + if (gRfuLinkStatus->connMode == 1) + rfu_STC_PARENT_analyzeRecvPacket(); + else + rfu_STC_CHILD_analyzeRecvPacket(); + for (r6 = 0; r6 < NELEMS(gRfuSlotStatusNI); ++r6) + { + r4 = gRfuSlotStatusNI[r6]; + if (r4->sub.recv.state == 0x8043 && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) + { + r5 = &r4->sub.recv; + if (r5->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << r6; + rfu_STC_releaseFrame(r6, 1, r5); + gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot; + r4->sub.recv.state = 70; + } + } + if ( gRfuStatic->recvErrorFlag ) + r7 = gRfuStatic->recvErrorFlag | 0x700; + } + rfu_STC_REQ_callback(r9, r7); +} + +void rfu_STC_PARENT_analyzeRecvPacket(void) +{ + u32 r3; + u8 r5; + u8 sp[4]; + u8 *r6; + + r3 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; + for (r5 = 0; r5 < NELEMS(sp); ++r5) + { + sp[r5] = r3 & 0x1F; + r3 >>= 5; + if (sp[r5] == 0) + gRfuStatic->NIEndRecvFlag |= 1 << r5; + } + r6 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + for (r5 = 0; r5 < NELEMS(sp); ++r5) + { + if (sp[r5]) + { + u8 *r4 = &sp[r5]; + + do + { + u8 r0 = rfu_STC_analyzeLLSF(r5, r6, *r4); + + r6 += r0; + *r4 -= r0; + } while (!(*r4 & 0x80) && (*r4)); + } + } +} + +void rfu_STC_CHILD_analyzeRecvPacket(void) +{ + u16 r4; + u8 *r5; + u16 r0; + + r4 = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F; + r5 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + if (r4 == 0) + gRfuStatic->NIEndRecvFlag = 15; + do + { + if (r4 == 0) + break; + r0 = rfu_STC_analyzeLLSF(0, r5, r4); + r5 += r0; + r4 -= r0; + } while (!(r4 & 0x8000)); +} |