summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2020-01-09 15:20:58 -0500
committerGitHub <noreply@github.com>2020-01-09 15:20:58 -0500
commit5e3f6495c44ff5e857df2e9ad7f86ae40a0b8d14 (patch)
tree6bf12c647db0c4dd6bf7f8f19d0b60f97b2abda9
parent7e2330e7fd01f5eebb7fdeb157d3dd29b4da3f0f (diff)
parentaa9843199592012301931381bd2fe1396fe29c82 (diff)
Merge pull request #205 from jiangzhengwenjz/librfu
librfu
-rw-r--r--asm/crt0.s2
-rw-r--r--asm/librfu.s6697
-rw-r--r--asm/librfu_intr.s28
-rw-r--r--asm/librfu_stwi.s1560
-rw-r--r--asm/link_rfu.s134
-rw-r--r--asm/link_rfu_2.s132
-rw-r--r--asm/link_rfu_3.s4
-rw-r--r--common_syms/librfu_rfu.txt5
-rw-r--r--common_syms/librfu_s32id.txt1
-rw-r--r--common_syms/librfu_stwi.txt1
-rw-r--r--data/librfu_rodata.s28
-rw-r--r--include/constants/trade.h4
-rw-r--r--include/gba/io_reg.h8
-rw-r--r--include/gba/macro.h12
-rw-r--r--include/gba/syscall.h2
-rw-r--r--include/librfu.h776
-rw-r--r--ld_script.txt8
-rw-r--r--src/agb_flash.c2
-rw-r--r--src/librfu_rfu.c2222
-rw-r--r--src/librfu_s32id.c164
-rw-r--r--src/librfu_stwi.c647
-rw-r--r--src/trade.c10
-rw-r--r--sym_bss.txt2
-rw-r--r--sym_common.txt27
24 files changed, 3826 insertions, 8650 deletions
diff --git a/asm/crt0.s b/asm/crt0.s
index 28855d504..7f9626251 100644
--- a/asm/crt0.s
+++ b/asm/crt0.s
@@ -204,7 +204,7 @@ loop:
jump_intr:
strh r0, [r3, OFFSET_REG_IF - 0x200]
bic r2, r2, r0
- ldr r0, =gRfuState
+ ldr r0, =gSTWIStatus
ldr r0, [r0]
ldrb r0, [r0, 0xA]
mov r1, 0x8
diff --git a/asm/librfu.s b/asm/librfu.s
deleted file mode 100644
index 03bf3eeb8..000000000
--- a/asm/librfu.s
+++ /dev/null
@@ -1,6697 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_81E05B0
-sub_81E05B0: @ 81E05B0
- push {r4-r7,lr}
- adds r4, r0, 0
- mov r12, r2
- lsls r1, 16
- lsrs r2, r1, 16
- lsls r3, 24
- lsrs r7, r3, 24
- movs r0, 0xF0
- lsls r0, 20
- ands r0, r4
- movs r1, 0x80
- lsls r1, 18
- cmp r0, r1
- bne _081E05D0
- cmp r7, 0
- bne _081E05D8
-_081E05D0:
- movs r0, 0x3
- ands r0, r4
- cmp r0, 0
- beq _081E05DC
-_081E05D8:
- movs r0, 0x2
- b _081E06C6
-_081E05DC:
- cmp r7, 0
- beq _081E05E8
- ldr r3, _081E05E4 @ =0x00000e64
- b _081E05EA
- .align 2, 0
-_081E05E4: .4byte 0x00000e64
-_081E05E8:
- ldr r3, _081E05F4 @ =0x00000504
-_081E05EA:
- cmp r2, r3
- bcs _081E05F8
- movs r0, 0x1
- b _081E06C6
- .align 2, 0
-_081E05F4: .4byte 0x00000504
-_081E05F8:
- ldr r0, _081E06CC @ =gUnknown_3007460
- str r4, [r0]
- ldr r1, _081E06D0 @ =gUnknown_3007464
- adds r0, r4, 0
- adds r0, 0xB4
- str r0, [r1]
- ldr r1, _081E06D4 @ =gUnknown_3007468
- adds r0, 0x28
- str r0, [r1]
- ldr r2, _081E06D8 @ =gUnknown_3007450
- movs r1, 0xDE
- lsls r1, 1
- adds r0, r4, r1
- str r0, [r2]
- ldr r1, _081E06DC @ =gUnknown_3007440
- movs r3, 0xDF
- lsls r3, 2
- adds r0, r4, r3
- str r0, [r1]
- movs r5, 0x1
- adds r6, r2, 0
- adds r4, r1, 0
-_081E0624:
- lsls r2, r5, 2
- adds r3, r2, r6
- subs r1, r5, 0x1
- lsls r1, 2
- adds r0, r1, r6
- ldr r0, [r0]
- adds r0, 0x70
- str r0, [r3]
- adds r2, r4
- adds r1, r4
- ldr r0, [r1]
- adds r0, 0x1C
- str r0, [r2]
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, 0x3
- bls _081E0624
- ldr r0, _081E06D4 @ =gUnknown_3007468
- ldr r1, [r0]
- adds r1, 0xDC
- ldr r4, _081E06DC @ =gUnknown_3007440
- ldr r0, [r4, 0xC]
- adds r0, 0x1C
- str r0, [r1]
- mov r1, r12
- adds r2, r7, 0
- bl STWI_init_all
- bl rfu_STC_clearAPIVariables
- movs r5, 0
- ldr r3, _081E06D8 @ =gUnknown_3007450
- movs r2, 0
-_081E0668:
- lsls r1, r5, 2
- adds r0, r1, r3
- ldr r0, [r0]
- str r2, [r0, 0x68]
- str r2, [r0, 0x6C]
- adds r1, r4
- ldr r0, [r1]
- str r2, [r0, 0x14]
- str r2, [r0, 0x18]
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, 0x3
- bls _081E0668
- ldr r1, _081E06E0 @ =sub_81E1B24
- movs r5, 0x2
- negs r5, r5
- ands r5, r1
- ldr r2, _081E06D4 @ =gUnknown_3007468
- ldr r0, [r2]
- adds r4, r0, 0
- adds r4, 0x8
- ldr r0, _081E06E4 @ =rfu_REQ_changeMasterSlave
- subs r0, r1
- lsls r0, 15
- lsrs r3, r0, 16
- subs r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, _081E06E8 @ =0x0000ffff
- cmp r3, r0
- beq _081E06BC
- adds r6, r0, 0
-_081E06AA:
- ldrh r0, [r5]
- strh r0, [r4]
- adds r5, 0x2
- adds r4, 0x2
- subs r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, r6
- bne _081E06AA
-_081E06BC:
- ldr r1, [r2]
- adds r0, r1, 0
- adds r0, 0x9
- str r0, [r1, 0x4]
- movs r0, 0
-_081E06C6:
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_081E06CC: .4byte gUnknown_3007460
-_081E06D0: .4byte gUnknown_3007464
-_081E06D4: .4byte gUnknown_3007468
-_081E06D8: .4byte gUnknown_3007450
-_081E06DC: .4byte gUnknown_3007440
-_081E06E0: .4byte sub_81E1B24
-_081E06E4: .4byte rfu_REQ_changeMasterSlave
-_081E06E8: .4byte 0x0000ffff
- thumb_func_end sub_81E05B0
-
- thumb_func_start rfu_STC_clearAPIVariables
-rfu_STC_clearAPIVariables: @ 81E06EC
- push {r4-r7,lr}
- sub sp, 0x4
- ldr r1, _081E0760 @ =0x04000208
- ldrh r0, [r1]
- adds r7, r0, 0
- movs r6, 0
- strh r6, [r1]
- ldr r5, _081E0764 @ =gUnknown_3007464
- ldr r1, [r5]
- ldrb r4, [r1]
- mov r0, sp
- strh r6, [r0]
- ldr r2, _081E0768 @ =0x01000014
- bl CpuSet
- ldr r2, [r5]
- movs r0, 0x8
- ands r4, r0
- movs r1, 0
- strb r4, [r2]
- mov r0, sp
- adds r0, 0x2
- strh r1, [r0]
- ldr r4, _081E076C @ =gUnknown_3007460
- ldr r1, [r4]
- ldr r2, _081E0770 @ =0x0100005a
- bl CpuSet
- ldr r1, [r4]
- movs r0, 0x4
- strb r0, [r1, 0x9]
- ldr r0, [r5]
- strb r6, [r0, 0x6]
- ldr r1, [r4]
- movs r0, 0xFF
- strb r0, [r1]
- bl rfu_clearAllSlot
- ldr r0, [r5]
- strb r6, [r0, 0x9]
- movs r2, 0
- movs r3, 0
-_081E0740:
- ldr r0, [r5]
- lsls r1, r2, 1
- adds r0, 0x12
- adds r0, r1
- strh r3, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bls _081E0740
- ldr r0, _081E0760 @ =0x04000208
- strh r7, [r0]
- add sp, 0x4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0760: .4byte 0x04000208
-_081E0764: .4byte gUnknown_3007464
-_081E0768: .4byte 0x01000014
-_081E076C: .4byte gUnknown_3007460
-_081E0770: .4byte 0x0100005a
- thumb_func_end rfu_STC_clearAPIVariables
-
- thumb_func_start rfu_REQ_PARENT_resumeRetransmitAndChange
-rfu_REQ_PARENT_resumeRetransmitAndChange: @ 81E0774
- push {lr}
- ldr r0, _081E0784 @ =rfu_STC_REQ_callback
- bl STWI_set_Callback_M
- bl STWI_send_ResumeRetransmitAndChangeREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0784: .4byte rfu_STC_REQ_callback
- thumb_func_end rfu_REQ_PARENT_resumeRetransmitAndChange
-
- thumb_func_start rfu_UNI_PARENT_getDRAC_ACK
-rfu_UNI_PARENT_getDRAC_ACK: @ 81E0788
- push {r4,r5,lr}
- adds r4, r0, 0
- movs r0, 0
- strb r0, [r4]
- ldr r5, _081E07A0 @ =gUnknown_3007460
- ldr r0, [r5]
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _081E07A4
- movs r0, 0xC0
- lsls r0, 2
- b _081E07CA
- .align 2, 0
-_081E07A0: .4byte gUnknown_3007460
-_081E07A4:
- bl rfu_getSTWIRecvBuffer
- adds r1, r0, 0
- ldrb r0, [r1]
- cmp r0, 0x28
- beq _081E07B4
- cmp r0, 0x36
- bne _081E07C8
-_081E07B4:
- ldrb r0, [r1, 0x1]
- cmp r0, 0
- bne _081E07C0
- ldr r0, [r5]
- ldrb r0, [r0, 0x2]
- b _081E07C2
-_081E07C0:
- ldrb r0, [r1, 0x4]
-_081E07C2:
- strb r0, [r4]
- movs r0, 0
- b _081E07CA
-_081E07C8:
- movs r0, 0x10
-_081E07CA:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end rfu_UNI_PARENT_getDRAC_ACK
-
- thumb_func_start rfu_setTimerInterrupt
-rfu_setTimerInterrupt: @ 81E07D0
- push {lr}
- adds r2, r0, 0
- adds r0, r1, 0
- lsls r2, 24
- lsrs r2, 24
- adds r1, r2, 0
- bl STWI_init_timer
- pop {r0}
- bx r0
- thumb_func_end rfu_setTimerInterrupt
-
- thumb_func_start rfu_getSTWIRecvBuffer
-rfu_getSTWIRecvBuffer: @ 81E07E4
- ldr r0, _081E07F0 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_081E07F0: .4byte gUnknown_3007468
- thumb_func_end rfu_getSTWIRecvBuffer
-
- thumb_func_start rfu_setMSCCallback
-rfu_setMSCCallback: @ 81E07F4
- push {lr}
- bl STWI_set_Callback_S
- pop {r0}
- bx r0
- thumb_func_end rfu_setMSCCallback
-
- thumb_func_start rfu_setREQCallback
-rfu_setREQCallback: @ 81E0800
- push {lr}
- adds r1, r0, 0
- ldr r0, _081E0818 @ =gUnknown_3007468
- ldr r0, [r0]
- str r1, [r0]
- negs r0, r1
- orrs r0, r1
- lsrs r0, 31
- bl rfu_enableREQCallback
- pop {r0}
- bx r0
- .align 2, 0
-_081E0818: .4byte gUnknown_3007468
- thumb_func_end rfu_setREQCallback
-
- thumb_func_start rfu_enableREQCallback
-rfu_enableREQCallback: @ 81E081C
- push {lr}
- lsls r0, 24
- cmp r0, 0
- beq _081E0834
- ldr r0, _081E0830 @ =gUnknown_3007464
- ldr r2, [r0]
- ldrb r1, [r2]
- movs r0, 0x8
- orrs r0, r1
- b _081E083E
- .align 2, 0
-_081E0830: .4byte gUnknown_3007464
-_081E0834:
- ldr r0, _081E0844 @ =gUnknown_3007464
- ldr r2, [r0]
- ldrb r1, [r2]
- movs r0, 0xF7
- ands r0, r1
-_081E083E:
- strb r0, [r2]
- pop {r0}
- bx r0
- .align 2, 0
-_081E0844: .4byte gUnknown_3007464
- thumb_func_end rfu_enableREQCallback
-
- thumb_func_start rfu_STC_REQ_callback
-rfu_STC_REQ_callback: @ 81E0848
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 16
- lsrs r4, r1, 16
- ldr r0, _081E087C @ =rfu_CB_defaultCallback
- bl STWI_set_Callback_M
- ldr r0, _081E0880 @ =gUnknown_3007464
- ldr r0, [r0]
- strh r4, [r0, 0x1C]
- ldrb r1, [r0]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _081E0876
- ldr r0, _081E0884 @ =gUnknown_3007468
- ldr r0, [r0]
- ldr r2, [r0]
- adds r0, r5, 0
- adds r1, r4, 0
- bl _call_via_r2
-_081E0876:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081E087C: .4byte rfu_CB_defaultCallback
-_081E0880: .4byte gUnknown_3007464
-_081E0884: .4byte gUnknown_3007468
- thumb_func_end rfu_STC_REQ_callback
-
- thumb_func_start rfu_CB_defaultCallback
-rfu_CB_defaultCallback: @ 81E0888
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 16
- lsrs r3, r1, 16
- cmp r0, 0xFF
- bne _081E08E4
- ldr r0, _081E08EC @ =gUnknown_3007464
- ldr r0, [r0]
- ldrb r1, [r0]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _081E08B2
- ldr r0, _081E08F0 @ =gUnknown_3007468
- ldr r0, [r0]
- ldr r2, [r0]
- movs r0, 0xFF
- adds r1, r3, 0
- bl _call_via_r2
-_081E08B2:
- ldr r0, _081E08F4 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r1, [r0, 0x2]
- ldrb r0, [r0, 0x3]
- adds r5, r0, 0
- orrs r5, r1
- movs r4, 0
-_081E08C0:
- adds r0, r5, 0
- asrs r0, r4
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081E08D2
- adds r0, r4, 0
- bl rfu_STC_removeLinkData
-_081E08D2:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bls _081E08C0
- ldr r0, _081E08F4 @ =gUnknown_3007460
- ldr r1, [r0]
- movs r0, 0xFF
- strb r0, [r1]
-_081E08E4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081E08EC: .4byte gUnknown_3007464
-_081E08F0: .4byte gUnknown_3007468
-_081E08F4: .4byte gUnknown_3007460
- thumb_func_end rfu_CB_defaultCallback
-
- thumb_func_start rfu_waitREQComplete
-rfu_waitREQComplete: @ 81E08F8
- push {lr}
- bl STWI_poll_CommandEnd
- ldr r0, _081E0908 @ =gUnknown_3007464
- ldr r0, [r0]
- ldrh r0, [r0, 0x1C]
- pop {r1}
- bx r1
- .align 2, 0
-_081E0908: .4byte gUnknown_3007464
- thumb_func_end rfu_waitREQComplete
-
- thumb_func_start rfu_REQ_RFUStatus
-rfu_REQ_RFUStatus: @ 81E090C
- push {lr}
- ldr r0, _081E091C @ =rfu_STC_REQ_callback
- bl STWI_set_Callback_M
- bl STWI_send_SystemStatusREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E091C: .4byte rfu_STC_REQ_callback
- thumb_func_end rfu_REQ_RFUStatus
-
- thumb_func_start rfu_getRFUStatus
-rfu_getRFUStatus: @ 81E0920
- push {r4,r5,lr}
- adds r4, r0, 0
- ldr r5, _081E0938 @ =gUnknown_3007468
- ldr r0, [r5]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0x93
- beq _081E093C
- movs r0, 0x10
- b _081E0956
- .align 2, 0
-_081E0938: .4byte gUnknown_3007468
-_081E093C:
- bl STWI_poll_CommandEnd
- lsls r0, 16
- cmp r0, 0
- bne _081E0950
- ldr r0, [r5]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrb r0, [r0, 0x7]
- b _081E0952
-_081E0950:
- movs r0, 0xFF
-_081E0952:
- strb r0, [r4]
- movs r0, 0
-_081E0956:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end rfu_getRFUStatus
-
- thumb_func_start sub_81E095C
-sub_81E095C: @ 81E095C
- push {lr}
- ldr r2, _081E0964 @ =_Str_RFU_MBOOT
- ldr r3, _081E0968 @ =0x30000F0
- b _081E0976
- .align 2, 0
-_081E0964: .4byte _Str_RFU_MBOOT
-_081E0968: .4byte 0x30000F0
-_081E096C:
- ldrb r0, [r3]
- adds r3, 0x1
- adds r2, 0x1
- cmp r1, r0
- bne _081E09CC
-_081E0976:
- ldrb r1, [r2]
- cmp r1, 0
- bne _081E096C
- movs r2, 0xC0
- lsls r2, 18
- movs r3, 0
- movs r1, 0
-_081E0984:
- ldrh r0, [r2]
- adds r0, r3, r0
- lsls r0, 16
- lsrs r3, r0, 16
- adds r2, 0x2
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x59
- bls _081E0984
- ldr r0, _081E09C0 @ =0x30000FA
- ldrh r0, [r0]
- cmp r3, r0
- bne _081E09CC
- movs r0, 0xC0
- lsls r0, 18
- ldr r1, _081E09C4 @ =gUnknown_3007460
- ldr r1, [r1]
- movs r2, 0x5A
- bl CpuSet
- ldr r0, _081E09C8 @ =gUnknown_3007464
- ldr r2, [r0]
- ldrb r1, [r2]
- movs r0, 0x80
- orrs r0, r1
- strb r0, [r2]
- movs r0, 0
- b _081E09CE
- .align 2, 0
-_081E09C0: .4byte 0x30000FA
-_081E09C4: .4byte gUnknown_3007460
-_081E09C8: .4byte gUnknown_3007464
-_081E09CC:
- movs r0, 0x1
-_081E09CE:
- pop {r1}
- bx r1
- thumb_func_end sub_81E095C
-
- thumb_func_start rfu_REQ_stopMode
-rfu_REQ_stopMode: @ 81E09D4
- push {lr}
- ldr r0, _081E09F4 @ =0x04000208
- ldrh r0, [r0]
- cmp r0, 0
- bne _081E09FC
- movs r0, 0x3D
- movs r1, 0x6
- bl rfu_STC_REQ_callback
- ldr r0, _081E09F8 @ =gRfuState
- ldr r1, [r0]
- ldrh r0, [r1, 0x12]
- movs r0, 0x6
- strh r0, [r1, 0x12]
- b _081E0A72
- .align 2, 0
-_081E09F4: .4byte 0x04000208
-_081E09F8: .4byte gRfuState
-_081E09FC:
- bl AgbRFU_SoftReset
- bl rfu_STC_clearAPIVariables
- movs r0, 0x8
- bl sub_81E349C
- ldr r1, _081E0A4C @ =0x00008001
- cmp r0, r1
- bne _081E0A60
- ldr r0, _081E0A50 @ =gRfuState
- ldr r0, [r0]
- ldrb r0, [r0, 0xA]
- lsls r0, 2
- ldr r2, _081E0A54 @ =0x04000100
- adds r1, r0, r2
- movs r0, 0
- str r0, [r1]
- movs r0, 0x83
- lsls r0, 16
- str r0, [r1]
- ldr r0, [r1]
- lsls r0, 16
- ldr r2, _081E0A58 @ =0x0105ffff
- ldr r3, _081E0A5C @ =rfu_CB_stopMode
- cmp r0, r2
- bhi _081E0A3A
-_081E0A32:
- ldr r0, [r1]
- lsls r0, 16
- cmp r0, r2
- bls _081E0A32
-_081E0A3A:
- movs r0, 0
- str r0, [r1]
- adds r0, r3, 0
- bl STWI_set_Callback_M
- bl STWI_send_StopModeREQ
- b _081E0A72
- .align 2, 0
-_081E0A4C: .4byte 0x00008001
-_081E0A50: .4byte gRfuState
-_081E0A54: .4byte 0x04000100
-_081E0A58: .4byte 0x0105ffff
-_081E0A5C: .4byte rfu_CB_stopMode
-_081E0A60:
- ldr r1, _081E0A78 @ =0x04000128
- movs r2, 0x80
- lsls r2, 6
- adds r0, r2, 0
- strh r0, [r1]
- movs r0, 0x3D
- movs r1, 0
- bl rfu_STC_REQ_callback
-_081E0A72:
- pop {r0}
- bx r0
- .align 2, 0
-_081E0A78: .4byte 0x04000128
- thumb_func_end rfu_REQ_stopMode
-
- thumb_func_start rfu_CB_stopMode
-rfu_CB_stopMode: @ 81E0A7C
- push {r4,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r1, 16
- lsrs r1, 16
- adds r2, r1, 0
- cmp r2, 0
- bne _081E0A96
- ldr r1, _081E0AA4 @ =0x04000128
- movs r4, 0x80
- lsls r4, 6
- adds r0, r4, 0
- strh r0, [r1]
-_081E0A96:
- adds r0, r3, 0
- adds r1, r2, 0
- bl rfu_STC_REQ_callback
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0AA4: .4byte 0x04000128
- thumb_func_end rfu_CB_stopMode
-
- thumb_func_start rfu_REQBN_softReset_and_checkID
-rfu_REQBN_softReset_and_checkID: @ 81E0AA8
- push {lr}
- ldr r0, _081E0AB8 @ =0x04000208
- ldrh r0, [r0]
- cmp r0, 0
- bne _081E0ABC
- movs r0, 0x1
- negs r0, r0
- b _081E0ADC
- .align 2, 0
-_081E0AB8: .4byte 0x04000208
-_081E0ABC:
- bl AgbRFU_SoftReset
- bl rfu_STC_clearAPIVariables
- movs r0, 0x1E
- bl sub_81E349C
- adds r2, r0, 0
- cmp r2, 0
- bne _081E0ADA
- ldr r1, _081E0AE0 @ =0x04000128
- movs r3, 0x80
- lsls r3, 6
- adds r0, r3, 0
- strh r0, [r1]
-_081E0ADA:
- adds r0, r2, 0
-_081E0ADC:
- pop {r1}
- bx r1
- .align 2, 0
-_081E0AE0: .4byte 0x04000128
- thumb_func_end rfu_REQBN_softReset_and_checkID
-
- thumb_func_start rfu_REQ_reset
-rfu_REQ_reset: @ 81E0AE4
- push {lr}
- ldr r0, _081E0AF4 @ =rfu_CB_reset
- bl STWI_set_Callback_M
- bl STWI_send_ResetREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0AF4: .4byte rfu_CB_reset
- thumb_func_end rfu_REQ_reset
-
- thumb_func_start rfu_CB_reset
-rfu_CB_reset: @ 81E0AF8
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 16
- lsrs r1, 16
- adds r4, r1, 0
- cmp r4, 0
- bne _081E0B0C
- bl rfu_STC_clearAPIVariables
-_081E0B0C:
- adds r0, r5, 0
- adds r1, r4, 0
- bl rfu_STC_REQ_callback
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end rfu_CB_reset
-
- thumb_func_start rfu_REQ_configSystem
-rfu_REQ_configSystem: @ 81E0B1C
- push {r4-r6,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 24
- lsrs r5, 24
- lsls r2, 24
- lsrs r6, r2, 24
- ldr r0, _081E0B54 @ =rfu_STC_REQ_callback
- bl STWI_set_Callback_M
- movs r0, 0x3
- ands r4, r0
- movs r0, 0x3C
- orrs r4, r0
- adds r0, r4, 0
- adds r1, r5, 0
- adds r2, r6, 0
- bl STWI_send_SystemConfigREQ
- cmp r6, 0
- bne _081E0B5C
- ldr r0, _081E0B58 @ =gUnknown_3007464
- ldr r1, [r0]
- movs r0, 0x1
- strh r0, [r1, 0x1A]
- b _081E0B76
- .align 2, 0
-_081E0B54: .4byte rfu_STC_REQ_callback
-_081E0B58: .4byte gUnknown_3007464
-_081E0B5C:
- ldr r5, _081E0B7C @ =0x04000208
- ldrh r4, [r5]
- movs r0, 0
- strh r0, [r5]
- movs r0, 0x96
- lsls r0, 2
- adds r1, r6, 0
- bl Div
- ldr r1, _081E0B80 @ =gUnknown_3007464
- ldr r1, [r1]
- strh r0, [r1, 0x1A]
- strh r4, [r5]
-_081E0B76:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0B7C: .4byte 0x04000208
-_081E0B80: .4byte gUnknown_3007464
- thumb_func_end rfu_REQ_configSystem
-
- thumb_func_start rfu_REQ_configGameData
-rfu_REQ_configGameData: @ 81E0B84
- push {r4-r7,lr}
- sub sp, 0x10
- adds r4, r2, 0
- adds r7, r3, 0
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r2, r1, 16
- adds r5, r4, 0
- mov r0, sp
- strb r1, [r0]
- lsrs r2, 24
- strb r2, [r0, 0x1]
- cmp r6, 0
- beq _081E0BAA
- movs r1, 0x80
- orrs r2, r1
- movs r1, 0
- orrs r2, r1
- strb r2, [r0, 0x1]
-_081E0BAA:
- movs r2, 0x2
- ldr r0, _081E0C0C @ =rfu_CB_configGameData
- mov r12, r0
-_081E0BB0:
- mov r3, sp
- adds r1, r3, r2
- ldrb r0, [r4]
- strb r0, [r1]
- adds r4, 0x1
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xE
- bls _081E0BB0
- movs r3, 0
- adds r1, r7, 0
- movs r2, 0
-_081E0BCA:
- ldrb r0, [r1]
- adds r0, r3, r0
- lsls r0, 24
- adds r1, 0x1
- lsrs r0, 24
- ldrb r3, [r5]
- adds r0, r3
- lsls r0, 24
- lsrs r3, r0, 24
- adds r5, 0x1
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x7
- bls _081E0BCA
- mov r1, sp
- mvns r0, r3
- strb r0, [r1, 0xF]
- cmp r6, 0
- beq _081E0BF6
- movs r0, 0
- strb r0, [r1, 0xE]
-_081E0BF6:
- mov r0, r12
- bl STWI_set_Callback_M
- mov r0, sp
- adds r1, r7, 0
- bl STWI_send_GameConfigREQ
- add sp, 0x10
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0C0C: .4byte rfu_CB_configGameData
- thumb_func_end rfu_REQ_configGameData
-
- thumb_func_start rfu_CB_configGameData
-rfu_CB_configGameData: @ 81E0C10
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r0, 24
- mov r12, r0
- lsls r1, 16
- lsrs r7, r1, 16
- cmp r7, 0
- bne _081E0C9A
- ldr r0, _081E0C54 @ =gRfuState
- ldr r0, [r0]
- ldr r1, [r0, 0x24]
- ldr r0, _081E0C58 @ =gUnknown_3007460
- ldr r6, [r0]
- ldrb r2, [r1, 0x4]
- adds r5, r6, 0
- adds r5, 0x98
- strh r2, [r5]
- ldrb r0, [r1, 0x5]
- lsls r3, r0, 8
- orrs r3, r2
- strh r3, [r5]
- adds r4, r1, 0x6
- movs r1, 0x80
- lsls r1, 8
- adds r0, r3, 0
- ands r0, r1
- cmp r0, 0
- beq _081E0C5C
- eors r3, r1
- strh r3, [r5]
- adds r1, r6, 0
- adds r1, 0x97
- movs r0, 0x1
- b _081E0C62
- .align 2, 0
-_081E0C54: .4byte gRfuState
-_081E0C58: .4byte gUnknown_3007460
-_081E0C5C:
- adds r1, r6, 0
- adds r1, 0x97
- movs r0, 0
-_081E0C62:
- strb r0, [r1]
- movs r2, 0
- ldr r3, _081E0CA8 @ =gUnknown_3007460
-_081E0C68:
- ldr r0, [r3]
- adds r0, 0x9A
- adds r0, r2
- ldrb r1, [r4]
- strb r1, [r0]
- adds r4, 0x1
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xC
- bls _081E0C68
- adds r4, 0x1
- movs r2, 0
- ldr r3, _081E0CA8 @ =gUnknown_3007460
-_081E0C84:
- ldr r0, [r3]
- adds r0, 0xA9
- adds r0, r2
- ldrb r1, [r4]
- strb r1, [r0]
- adds r4, 0x1
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x7
- bls _081E0C84
-_081E0C9A:
- mov r0, r12
- adds r1, r7, 0
- bl rfu_STC_REQ_callback
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0CA8: .4byte gUnknown_3007460
- thumb_func_end rfu_CB_configGameData
-
- thumb_func_start sub_81E0CAC
-sub_81E0CAC: @ 81E0CAC
- push {lr}
- ldr r0, _081E0CDC @ =rfu_CB_defaultCallback
- bl STWI_set_Callback_M
- bl STWI_send_SystemStatusREQ
- bl STWI_poll_CommandEnd
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081E0CE4
- ldr r0, _081E0CE0 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrb r0, [r0, 0x7]
- cmp r0, 0
- bne _081E0CEA
- movs r0, 0x1
- bl rfu_STC_clearLinkStatus
- b _081E0CEA
- .align 2, 0
-_081E0CDC: .4byte rfu_CB_defaultCallback
-_081E0CE0: .4byte gUnknown_3007468
-_081E0CE4:
- movs r0, 0x19
- bl rfu_STC_REQ_callback
-_081E0CEA:
- ldr r0, _081E0CF8 @ =rfu_CB_startSearchChild
- bl STWI_set_Callback_M
- bl STWI_send_SC_StartREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0CF8: .4byte rfu_CB_startSearchChild
- thumb_func_end sub_81E0CAC
-
- thumb_func_start rfu_CB_startSearchChild
-rfu_CB_startSearchChild: @ 81E0CFC
- push {lr}
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r1, 16
- lsrs r1, 16
- adds r2, r1, 0
- cmp r2, 0
- bne _081E0D14
- ldr r0, _081E0D20 @ =gUnknown_3007464
- ldr r1, [r0]
- movs r0, 0x1
- strb r0, [r1, 0x9]
-_081E0D14:
- adds r0, r3, 0
- adds r1, r2, 0
- bl rfu_STC_REQ_callback
- pop {r0}
- bx r0
- .align 2, 0
-_081E0D20: .4byte gUnknown_3007464
- thumb_func_end rfu_CB_startSearchChild
-
- thumb_func_start rfu_STC_clearLinkStatus
-rfu_STC_clearLinkStatus: @ 81E0D24
- push {r4,r5,lr}
- sub sp, 0x4
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl rfu_clearAllSlot
- cmp r4, 0
- beq _081E0D4C
- mov r0, sp
- movs r5, 0
- strh r5, [r0]
- ldr r4, _081E0D80 @ =gUnknown_3007460
- ldr r1, [r4]
- adds r1, 0x14
- ldr r2, _081E0D84 @ =0x01000040
- bl CpuSet
- ldr r0, [r4]
- strb r5, [r0, 0x8]
-_081E0D4C:
- movs r1, 0
- ldr r2, _081E0D80 @ =gUnknown_3007460
- adds r4, r2, 0
- movs r3, 0
-_081E0D54:
- ldr r0, [r4]
- adds r0, 0xA
- adds r0, r1
- strb r3, [r0]
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x3
- bls _081E0D54
- ldr r0, [r2]
- movs r1, 0
- strb r1, [r0, 0x1]
- ldr r0, [r2]
- strb r1, [r0, 0x2]
- ldr r0, [r2]
- strb r1, [r0, 0x3]
- ldr r0, [r2]
- strb r1, [r0, 0x7]
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0D80: .4byte gUnknown_3007460
-_081E0D84: .4byte 0x01000040
- thumb_func_end rfu_STC_clearLinkStatus
-
- thumb_func_start rfu_REQ_pollSearchChild
-rfu_REQ_pollSearchChild: @ 81E0D88
- push {lr}
- ldr r0, _081E0D98 @ =rfu_CB_pollAndEndSearchChild
- bl STWI_set_Callback_M
- bl STWI_send_SC_PollingREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0D98: .4byte rfu_CB_pollAndEndSearchChild
- thumb_func_end rfu_REQ_pollSearchChild
-
- thumb_func_start rfu_REQ_endSearchChild
-rfu_REQ_endSearchChild: @ 81E0D9C
- push {lr}
- ldr r0, _081E0DAC @ =rfu_CB_pollAndEndSearchChild
- bl STWI_set_Callback_M
- bl STWI_send_SC_EndREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0DAC: .4byte rfu_CB_pollAndEndSearchChild
- thumb_func_end rfu_REQ_endSearchChild
-
- thumb_func_start rfu_CB_pollAndEndSearchChild
-rfu_CB_pollAndEndSearchChild: @ 81E0DB0
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 16
- lsrs r6, r1, 16
- cmp r6, 0
- bne _081E0DC2
- bl sub_81E0E38
-_081E0DC2:
- cmp r4, 0x1A
- bne _081E0E04
- ldr r5, _081E0DF8 @ =gUnknown_3007460
- ldr r0, [r5]
- adds r0, 0x94
- ldrh r0, [r0]
- cmp r0, 0
- bne _081E0E20
- ldr r0, _081E0DFC @ =rfu_CB_defaultCallback
- bl STWI_set_Callback_M
- bl STWI_send_SystemStatusREQ
- bl STWI_poll_CommandEnd
- lsls r0, 16
- cmp r0, 0
- bne _081E0E20
- ldr r1, [r5]
- ldr r0, _081E0E00 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrh r0, [r0, 0x4]
- adds r1, 0x94
- strh r0, [r1]
- b _081E0E20
- .align 2, 0
-_081E0DF8: .4byte gUnknown_3007460
-_081E0DFC: .4byte rfu_CB_defaultCallback
-_081E0E00: .4byte gUnknown_3007468
-_081E0E04:
- cmp r4, 0x1B
- bne _081E0E20
- ldr r0, _081E0E30 @ =gUnknown_3007460
- ldr r1, [r0]
- ldrb r0, [r1]
- cmp r0, 0xFF
- bne _081E0E18
- adds r1, 0x94
- movs r0, 0
- strh r0, [r1]
-_081E0E18:
- ldr r0, _081E0E34 @ =gUnknown_3007464
- ldr r1, [r0]
- movs r0, 0
- strb r0, [r1, 0x9]
-_081E0E20:
- adds r0, r4, 0
- adds r1, r6, 0
- bl rfu_STC_REQ_callback
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081E0E30: .4byte gUnknown_3007460
-_081E0E34: .4byte gUnknown_3007464
- thumb_func_end rfu_CB_pollAndEndSearchChild
-
- thumb_func_start sub_81E0E38
-sub_81E0E38: @ 81E0E38
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- ldr r1, _081E0F64 @ =gUnknown_3007468
- ldr r0, [r1]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrb r2, [r0, 0x1]
- mov r8, r2
- adds r4, r1, 0
- cmp r2, 0
- beq _081E0E96
- ldr r5, [r0, 0x4]
- ldr r0, _081E0F68 @ =rfu_CB_defaultCallback
- bl STWI_set_Callback_M
- bl STWI_send_LinkStatusREQ
- bl STWI_poll_CommandEnd
- lsls r0, 16
- cmp r0, 0
- bne _081E0E8A
- ldr r0, [r4]
- adds r0, 0xDC
- ldr r0, [r0]
- adds r4, r0, 0x4
- movs r2, 0
-_081E0E76:
- mov r0, sp
- adds r1, r0, r2
- ldrb r0, [r4]
- strb r0, [r1]
- adds r4, 0x1
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bls _081E0E76
-_081E0E8A:
- ldr r0, _081E0F64 @ =gUnknown_3007468
- ldr r1, [r0]
- adds r1, 0xDC
- ldr r1, [r1]
- str r5, [r1, 0x4]
- adds r4, r0, 0
-_081E0E96:
- ldr r0, [r4]
- adds r0, 0xDC
- ldr r0, [r0]
- adds r4, r0, 0x4
- mov r1, r8
- cmp r1, 0
- beq _081E0F52
- ldr r2, _081E0F6C @ =gUnknown_3007464
- mov r9, r2
- ldr r7, _081E0F70 @ =gUnknown_3007460
- mov r10, r9
-_081E0EAC:
- ldrb r2, [r4, 0x2]
- adds r5, r2, 0
- cmp r2, 0x3
- bhi _081E0F42
- ldr r1, [r7]
- ldrb r0, [r1, 0x2]
- asrs r0, r2
- movs r6, 0x1
- ands r0, r6
- cmp r0, 0
- bne _081E0F42
- ldrb r3, [r1, 0x3]
- asrs r3, r2
- ands r3, r6
- cmp r3, 0
- bne _081E0F42
- mov r1, sp
- adds r0, r1, r2
- ldrb r0, [r0]
- mov r12, r10
- cmp r0, 0
- beq _081E0EE6
- mov r0, r9
- ldr r1, [r0]
- adds r1, 0xE
- adds r1, r2
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
-_081E0EE6:
- mov r1, r9
- ldr r0, [r1]
- adds r0, 0xE
- adds r1, r0, r5
- ldrb r0, [r1]
- cmp r0, 0x3
- bls _081E0F42
- strb r3, [r1]
- ldr r0, [r7]
- adds r0, 0xA
- adds r0, r5
- movs r1, 0xFF
- strb r1, [r0]
- ldr r2, [r7]
- adds r0, r6, 0
- lsls r0, r5
- ldrb r1, [r2, 0x2]
- orrs r0, r1
- strb r0, [r2, 0x2]
- ldr r1, [r7]
- ldrb r0, [r1, 0x1]
- adds r0, 0x1
- strb r0, [r1, 0x1]
- ldr r1, [r7]
- lsls r3, r5, 5
- adds r1, r3
- ldrh r0, [r4]
- strh r0, [r1, 0x14]
- strb r5, [r1, 0x16]
- ldr r0, [r7]
- strb r6, [r0]
- mov r0, r12
- ldr r2, [r0]
- ldrb r1, [r2]
- movs r0, 0x7F
- ands r0, r1
- strb r0, [r2]
- mov r2, r12
- ldr r1, [r2]
- lsls r0, r5, 1
- adds r1, 0x12
- adds r1, r0
- ldr r0, [r7]
- adds r0, r3
- ldrh r0, [r0, 0x14]
- strh r0, [r1]
-_081E0F42:
- mov r0, r8
- subs r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- adds r4, 0x4
- cmp r0, 0
- bne _081E0EAC
-_081E0F52:
- 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
-_081E0F64: .4byte gUnknown_3007468
-_081E0F68: .4byte rfu_CB_defaultCallback
-_081E0F6C: .4byte gUnknown_3007464
-_081E0F70: .4byte gUnknown_3007460
- thumb_func_end sub_81E0E38
-
- thumb_func_start rfu_REQ_startSearchParent
-rfu_REQ_startSearchParent: @ 81E0F74
- push {lr}
- ldr r0, _081E0F84 @ =rfu_CB_startSearchParent
- bl STWI_set_Callback_M
- bl STWI_send_SP_StartREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0F84: .4byte rfu_CB_startSearchParent
- thumb_func_end rfu_REQ_startSearchParent
-
- thumb_func_start rfu_CB_startSearchParent
-rfu_CB_startSearchParent: @ 81E0F88
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 16
- lsrs r1, 16
- adds r4, r1, 0
- cmp r4, 0
- bne _081E0F9E
- movs r0, 0
- bl rfu_STC_clearLinkStatus
-_081E0F9E:
- adds r0, r5, 0
- adds r1, r4, 0
- bl rfu_STC_REQ_callback
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end rfu_CB_startSearchParent
-
- thumb_func_start rfu_REQ_pollSearchParent
-rfu_REQ_pollSearchParent: @ 81E0FAC
- push {lr}
- ldr r0, _081E0FBC @ =sub_81E0FC0
- bl STWI_set_Callback_M
- bl STWI_send_SP_PollingREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0FBC: .4byte sub_81E0FC0
- thumb_func_end rfu_REQ_pollSearchParent
-
- thumb_func_start sub_81E0FC0
-sub_81E0FC0: @ 81E0FC0
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 16
- lsrs r1, 16
- adds r4, r1, 0
- cmp r4, 0
- bne _081E0FD4
- bl rfu_STC_readParentCandidateList
-_081E0FD4:
- adds r0, r5, 0
- adds r1, r4, 0
- bl rfu_STC_REQ_callback
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81E0FC0
-
- thumb_func_start rfu_REQ_endSearchParent
-rfu_REQ_endSearchParent: @ 81E0FE4
- push {lr}
- ldr r0, _081E0FF4 @ =rfu_STC_REQ_callback
- bl STWI_set_Callback_M
- bl STWI_send_SP_EndREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0FF4: .4byte rfu_STC_REQ_callback
- thumb_func_end rfu_REQ_endSearchParent
-
- thumb_func_start rfu_STC_readParentCandidateList
-rfu_STC_readParentCandidateList: @ 81E0FF8
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x4
- mov r0, sp
- movs r4, 0
- strh r4, [r0]
- ldr r5, _081E10A0 @ =gUnknown_3007460
- ldr r1, [r5]
- adds r1, 0x14
- ldr r2, _081E10A4 @ =0x01000040
- bl CpuSet
- ldr r0, _081E10A8 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r2, [r0]
- ldrb r7, [r2, 0x1]
- adds r2, 0x4
- ldr r0, [r5]
- strb r4, [r0, 0x8]
- movs r6, 0
- cmp r7, 0
- beq _081E10FC
- mov r12, r5
- ldr r0, _081E10AC @ =0x00007fff
- mov r8, r0
-_081E102E:
- subs r0, r7, 0x7
- lsls r0, 24
- lsrs r7, r0, 24
- adds r1, r2, 0x6
- adds r2, 0x13
- ldrb r0, [r2]
- mvns r0, r0
- lsls r0, 24
- lsrs r5, r0, 24
- adds r2, 0x1
- movs r4, 0
- movs r3, 0
- adds r6, 0x1
-_081E1048:
- ldrb r0, [r2]
- adds r0, r4, r0
- lsls r0, 24
- adds r2, 0x1
- lsrs r0, 24
- ldrb r4, [r1]
- adds r0, r4
- lsls r0, 24
- lsrs r4, r0, 24
- adds r1, 0x1
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x7
- bls _081E1048
- cmp r4, r5
- bne _081E10F0
- subs r2, 0x1C
- mov r0, r12
- ldr r1, [r0]
- ldrb r0, [r1, 0x8]
- lsls r0, 5
- adds r0, 0x14
- adds r4, r1, r0
- ldrh r0, [r2]
- movs r3, 0
- strh r0, [r4]
- adds r2, 0x2
- ldrb r0, [r2]
- strb r0, [r4, 0x2]
- adds r2, 0x2
- ldrh r1, [r2]
- mov r0, r8
- ands r0, r1
- strh r0, [r4, 0x4]
- ldrh r1, [r2]
- movs r0, 0x80
- lsls r0, 8
- ands r0, r1
- cmp r0, 0
- beq _081E10B0
- movs r0, 0x1
- strb r0, [r4, 0x3]
- b _081E10B2
- .align 2, 0
-_081E10A0: .4byte gUnknown_3007460
-_081E10A4: .4byte 0x01000040
-_081E10A8: .4byte gUnknown_3007468
-_081E10AC: .4byte 0x00007fff
-_081E10B0:
- strb r3, [r4, 0x3]
-_081E10B2:
- adds r2, 0x2
- movs r3, 0
- adds r5, r4, 0
- adds r5, 0x15
- adds r4, 0x6
-_081E10BC:
- adds r1, r4, r3
- ldrb r0, [r2]
- strb r0, [r1]
- adds r2, 0x1
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0xC
- bls _081E10BC
- adds r2, 0x1
- movs r3, 0
- adds r4, r5, 0
-_081E10D4:
- adds r1, r4, r3
- ldrb r0, [r2]
- strb r0, [r1]
- adds r2, 0x1
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x7
- bls _081E10D4
- mov r4, r12
- ldr r1, [r4]
- ldrb r0, [r1, 0x8]
- adds r0, 0x1
- strb r0, [r1, 0x8]
-_081E10F0:
- lsls r0, r6, 24
- lsrs r6, r0, 24
- cmp r6, 0x3
- bhi _081E10FC
- cmp r7, 0
- bne _081E102E
-_081E10FC:
- add sp, 0x4
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end rfu_STC_readParentCandidateList
-
- thumb_func_start rfu_REQ_startConnectParent
-rfu_REQ_startConnectParent: @ 81E1108
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- movs r3, 0
- movs r2, 0
- ldr r1, _081E1154 @ =gUnknown_3007460
- ldr r0, [r1]
- ldrh r0, [r0, 0x14]
- cmp r0, r4
- beq _081E1134
- adds r5, r1, 0
-_081E111E:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bhi _081E1134
- ldr r0, [r5]
- lsls r1, r2, 5
- adds r0, r1
- ldrh r0, [r0, 0x14]
- cmp r0, r4
- bne _081E111E
-_081E1134:
- cmp r2, 0x4
- bne _081E113C
- movs r3, 0x80
- lsls r3, 1
-_081E113C:
- cmp r3, 0
- bne _081E1160
- ldr r0, _081E1158 @ =gUnknown_3007464
- ldr r0, [r0]
- strh r4, [r0, 0x1E]
- ldr r0, _081E115C @ =rfu_STC_REQ_callback
- bl STWI_set_Callback_M
- adds r0, r4, 0
- bl STWI_send_CP_StartREQ
- b _081E1168
- .align 2, 0
-_081E1154: .4byte gUnknown_3007460
-_081E1158: .4byte gUnknown_3007464
-_081E115C: .4byte rfu_STC_REQ_callback
-_081E1160:
- movs r0, 0x1F
- adds r1, r3, 0
- bl rfu_STC_REQ_callback
-_081E1168:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end rfu_REQ_startConnectParent
-
- thumb_func_start rfu_REQ_pollConnectParent
-rfu_REQ_pollConnectParent: @ 81E1170
- push {lr}
- ldr r0, _081E1180 @ =rfu_CB_pollConnectParent
- bl STWI_set_Callback_M
- bl STWI_send_CP_PollingREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E1180: .4byte rfu_CB_pollConnectParent
- thumb_func_end rfu_REQ_pollConnectParent
-
- thumb_func_start rfu_CB_pollConnectParent
-rfu_CB_pollConnectParent: @ 81E1184
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x2C
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x24]
- lsls r1, 16
- lsrs r1, 16
- str r1, [sp, 0x28]
- cmp r1, 0
- bne _081E1286
- ldr r0, _081E1240 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrh r5, [r0, 0x4]
- ldrb r1, [r0, 0x6]
- mov r10, r1
- ldrb r0, [r0, 0x7]
- cmp r0, 0
- bne _081E1286
- movs r0, 0x80
- lsls r0, 17
- lsls r0, r1
- lsrs r2, r0, 24
- ldr r4, _081E1244 @ =gUnknown_3007460
- ldr r3, [r4]
- ldrb r1, [r3, 0x2]
- adds r0, r2, 0
- ands r0, r1
- cmp r0, 0
- bne _081E1286
- adds r0, r2, 0
- orrs r0, r1
- strb r0, [r3, 0x2]
- ldr r1, [r4]
- ldrb r0, [r1, 0x3]
- bics r0, r2
- strb r0, [r1, 0x3]
- ldr r1, [r4]
- adds r0, r1, 0
- adds r0, 0x94
- movs r2, 0
- strh r5, [r0]
- ldrb r0, [r1, 0x1]
- adds r0, 0x1
- strb r0, [r1, 0x1]
- ldr r0, [r4]
- strb r2, [r0]
- ldr r3, _081E1248 @ =gUnknown_3007464
- ldr r2, [r3]
- ldrb r1, [r2]
- movs r0, 0x80
- orrs r0, r1
- strb r0, [r2]
- movs r5, 0
- adds r7, r4, 0
- add r6, sp, 0x20
- movs r0, 0
- mov r8, r0
-_081E1202:
- ldr r2, [r7]
- lsls r4, r5, 5
- adds r0, r2, r4
- ldr r1, [r3]
- ldrh r0, [r0, 0x14]
- ldrh r1, [r1, 0x1E]
- cmp r0, r1
- bne _081E125A
- ldrb r0, [r2, 0x8]
- cmp r0, 0
- beq _081E1250
- mov r9, sp
- adds r0, r4, 0
- adds r0, 0x14
- adds r0, r2, r0
- mov r1, sp
- movs r2, 0x10
- bl CpuSet
- mov r1, r8
- strh r1, [r6]
- ldr r1, [r7]
- adds r1, 0x14
- adds r0, r6, 0
- ldr r2, _081E124C @ =0x01000040
- bl CpuSet
- ldr r0, [r7]
- mov r1, r8
- strb r1, [r0, 0x8]
- b _081E1264
- .align 2, 0
-_081E1240: .4byte gUnknown_3007468
-_081E1244: .4byte gUnknown_3007460
-_081E1248: .4byte gUnknown_3007464
-_081E124C: .4byte 0x01000040
-_081E1250:
- adds r0, r4, 0
- adds r0, 0x14
- adds r2, r0
- mov r9, r2
- b _081E1264
-_081E125A:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x3
- bls _081E1202
-_081E1264:
- cmp r5, 0x3
- bhi _081E1286
- ldr r4, _081E12A0 @ =gUnknown_3007460
- mov r0, r10
- lsls r5, r0, 5
- adds r0, r5, 0
- adds r0, 0x14
- ldr r1, [r4]
- adds r1, r0
- mov r0, r9
- movs r2, 0x10
- bl CpuSet
- ldr r0, [r4]
- adds r0, r5
- mov r1, r10
- strb r1, [r0, 0x16]
-_081E1286:
- ldr r0, [sp, 0x24]
- ldr r1, [sp, 0x28]
- bl rfu_STC_REQ_callback
- add sp, 0x2C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E12A0: .4byte gUnknown_3007460
- thumb_func_end rfu_CB_pollConnectParent
-
- thumb_func_start rfu_getConnectParentStatus
-rfu_getConnectParentStatus: @ 81E12A4
- push {lr}
- adds r3, r0, 0
- movs r0, 0xFF
- strb r0, [r3]
- ldr r0, _081E12C4 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r2, [r0]
- ldrb r0, [r2]
- adds r0, 0x60
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bls _081E12C8
- movs r0, 0x10
- b _081E12D4
- .align 2, 0
-_081E12C4: .4byte gUnknown_3007468
-_081E12C8:
- adds r2, 0x6
- ldrb r0, [r2]
- strb r0, [r1]
- ldrb r0, [r2, 0x1]
- strb r0, [r3]
- movs r0, 0
-_081E12D4:
- pop {r1}
- bx r1
- thumb_func_end rfu_getConnectParentStatus
-
- thumb_func_start rfu_REQ_endConnectParent
-rfu_REQ_endConnectParent: @ 81E12D8
- push {lr}
- ldr r0, _081E1304 @ =rfu_CB_pollConnectParent
- bl STWI_set_Callback_M
- bl STWI_send_CP_EndREQ
- ldr r0, _081E1308 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r1, [r0]
- ldrb r0, [r1, 0x6]
- cmp r0, 0x3
- bhi _081E1300
- ldr r0, _081E130C @ =gUnknown_3007464
- ldr r0, [r0]
- adds r0, 0xA
- ldrb r1, [r1, 0x6]
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_081E1300:
- pop {r0}
- bx r0
- .align 2, 0
-_081E1304: .4byte rfu_CB_pollConnectParent
-_081E1308: .4byte gUnknown_3007468
-_081E130C: .4byte gUnknown_3007464
- thumb_func_end rfu_REQ_endConnectParent
-
- thumb_func_start rfu_syncVBlank
-rfu_syncVBlank: @ 81E1310
- push {r4,r5,lr}
- bl rfu_NI_checkCommFailCounter
- ldr r0, _081E1358 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0xFF
- beq _081E13E8
- ldr r4, _081E135C @ =gUnknown_3007464
- ldr r1, [r4]
- ldrb r0, [r1, 0x6]
- cmp r0, 0
- beq _081E132E
- subs r0, 0x1
- strb r0, [r1, 0x6]
-_081E132E:
- bl rfu_getMasterSlave
- lsls r0, 24
- lsrs r3, r0, 24
- ldr r2, [r4]
- ldrb r1, [r2]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- bne _081E1360
- cmp r3, 0
- bne _081E136E
- movs r0, 0x4
- orrs r0, r1
- strb r0, [r2]
- ldr r1, [r4]
- movs r0, 0xB4
- lsls r0, 1
- strh r0, [r1, 0x20]
- b _081E136A
- .align 2, 0
-_081E1358: .4byte gUnknown_3007460
-_081E135C: .4byte gUnknown_3007464
-_081E1360:
- cmp r3, 0
- beq _081E1380
- movs r0, 0xFB
- ands r0, r1
- strb r0, [r2]
-_081E136A:
- cmp r3, 0
- beq _081E1380
-_081E136E:
- ldr r3, _081E137C @ =gUnknown_3007464
- ldr r2, [r3]
- ldrb r1, [r2]
- movs r0, 0xFD
- ands r0, r1
- b _081E138A
- .align 2, 0
-_081E137C: .4byte gUnknown_3007464
-_081E1380:
- ldr r3, _081E13DC @ =gUnknown_3007464
- ldr r2, [r3]
- ldrb r1, [r2]
- movs r0, 0x2
- orrs r0, r1
-_081E138A:
- strb r0, [r2]
- ldr r3, [r3]
- ldrb r1, [r3]
- movs r0, 0x4
- ands r0, r1
- cmp r0, 0
- beq _081E13E8
- ldrh r0, [r3, 0x20]
- cmp r0, 0
- bne _081E13E4
- movs r0, 0xFB
- ands r0, r1
- strb r0, [r3]
- ldr r0, _081E13E0 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r1, [r0, 0x2]
- ldrb r0, [r0, 0x3]
- adds r5, r0, 0
- orrs r5, r1
- movs r4, 0
-_081E13B2:
- adds r0, r5, 0
- asrs r0, r4
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081E13C4
- adds r0, r4, 0
- bl rfu_STC_removeLinkData
-_081E13C4:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bls _081E13B2
- ldr r0, _081E13E0 @ =gUnknown_3007460
- ldr r1, [r0]
- movs r0, 0xFF
- strb r0, [r1]
- movs r0, 0x1
- b _081E13EA
- .align 2, 0
-_081E13DC: .4byte gUnknown_3007464
-_081E13E0: .4byte gUnknown_3007460
-_081E13E4:
- subs r0, 0x1
- strh r0, [r3, 0x20]
-_081E13E8:
- movs r0, 0
-_081E13EA:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end rfu_syncVBlank
-
- thumb_func_start sub_81E13F0
-sub_81E13F0: @ 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- 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 @ =gUnknown_3007468
- 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 gUnknown_3007460
-_081E1494: .4byte gRfuState
-_081E1498: .4byte gUnknown_3007464
-_081E149C: .4byte gUnknown_3007468
-_081E14A0:
- movs r0, 0x9B
- lsls r0, 1
- cmp r5, r0
- bne _081E14F0
- ldr r0, _081E154C @ =gUnknown_3007468
- 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007460
-_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 gUnknown_3007468
-_081E1550: .4byte gUnknown_3007460
-_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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007460
-_081E15BC: .4byte gUnknown_3007464
-_081E15C0:
- bl STWI_send_SystemStatusREQ
- bl STWI_poll_CommandEnd
- lsls r0, 16
- cmp r0, 0
- bne _081E164E
- ldr r0, _081E15F0 @ =gUnknown_3007468
- 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 gUnknown_3007468
-_081E15F4:
- ldr r2, _081E163C @ =gUnknown_3007464
- 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 gUnknown_3007464
-_081E1640:
- ldr r0, _081E16B0 @ =gUnknown_3007464
- ldr r0, [r0]
- adds r0, 0xA
- adds r0, r5
- mov r1, sp
- ldrb r1, [r1, 0xC]
-_081E164C:
- strb r1, [r0]
-_081E164E:
- ldr r2, _081E16B4 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- ldr r0, [r0]
- adds r0, 0xA
- adds r0, r5
- strb r3, [r0]
- b _081E1742
- .align 2, 0
-_081E16B0: .4byte gUnknown_3007464
-_081E16B4: .4byte gUnknown_3007460
-_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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007468
-_081E170C: .4byte gUnknown_3007464
-_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 @ =gUnknown_3007464
- 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 gUnknown_3007464
-_081E17A4: .4byte gUnknown_3007460
-_081E17A8: .4byte gUnknown_3007468
- thumb_func_end sub_81E13F0
-
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007460
-_081E18A4: .4byte gUnknown_3007464
-_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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007464
- ldr r2, [r3]
- ldr r0, _081E19BC @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007464
- 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007460
-_081E19C0: .4byte rfu_CB_defaultCallback
-_081E19C4: .4byte gUnknown_3007468
-_081E19C8: .4byte gUnknown_3007464
- 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 @ =gUnknown_3007464
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007464
-_081E1A20: .4byte rfu_STC_REQ_callback
-_081E1A24: .4byte gUnknown_3007460
- 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 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrb r0, [r0, 0x4]
- cmp r0, 0
- bne _081E1AC0
- ldr r0, _081E1AD8 @ =gUnknown_3007464
- ldr r1, [r0]
- ldrb r1, [r1, 0x5]
- adds r6, r0, 0
- cmp r1, 0
- beq _081E1AC0
- ldr r1, _081E1ADC @ =gUnknown_3007460
- 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 gUnknown_3007468
-_081E1AD8: .4byte gUnknown_3007464
-_081E1ADC: .4byte gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 gUnknown_3007468
-_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 sub_81E1B24
-sub_81E1B24: @ 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 sub_81E1B24
-
- 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 @ =gUnknown_3007450
- 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 @ =gUnknown_3007440
- adds r4, r0
- ldr r1, [r4]
- adds r0, r6, 0
- ldr r2, _081E1C4C @ =0x0100000a
- bl CpuSet
- ldr r3, _081E1C50 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007450
-_081E1C44: .4byte 0x01000034
-_081E1C48: .4byte gUnknown_3007440
-_081E1C4C: .4byte 0x0100000a
-_081E1C50: .4byte gUnknown_3007460
-_081E1C54: .4byte gUnknown_3007464
- 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 @ =gUnknown_3007464
- ldr r0, [r0]
- ldrb r1, [r0]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _081E1C98
- ldr r6, _081E1C94 @ =gUnknown_3007460
- 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 gUnknown_3007464
-_081E1C94: .4byte gUnknown_3007460
-_081E1C98:
- ldr r6, _081E1CC0 @ =gUnknown_3007460
- 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 gUnknown_3007460
- 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 @ =gUnknown_3007450
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007450
-_081E1D40: .4byte gUnknown_3007460
-_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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007440
- 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 @ =gUnknown_3007464
- ldr r0, [r0]
- ldrb r1, [r0]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _081E1E08
- ldr r2, _081E1DF8 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_081E1DFC: .4byte 0x0100001a
-_081E1E00: .4byte gUnknown_3007440
-_081E1E04: .4byte gUnknown_3007464
-_081E1E08:
- ldr r2, _081E1E6C @ =gUnknown_3007460
- 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 @ =gUnknown_3007440
- 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 gUnknown_3007460
-_081E1E70: .4byte 0x01000006
-_081E1E74: .4byte gUnknown_3007440
-_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 @ =gUnknown_3007450
- lsls r1, 2
- adds r1, r0
- ldr r0, [r1]
- str r5, [r0, 0x68]
- str r6, [r0, 0x6C]
- b _081E1ED2
- .align 2, 0
-_081E1EB4: .4byte gUnknown_3007450
-_081E1EB8:
- movs r0, 0x10
- ands r2, r0
- cmp r2, 0
- bne _081E1EC6
- movs r0, 0xC0
- lsls r0, 3
- b _081E1ED4
-_081E1EC6:
- ldr r0, _081E1EDC @ =gUnknown_3007440
- 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 gUnknown_3007440
- 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 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _081E1F2C
- adds r0, r2, 0x3
- b _081E1F2E
- .align 2, 0
-_081E1F28: .4byte gUnknown_3007460
-_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 @ =gUnknown_3007460
- 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 gUnknown_3007460
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_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 @ =gUnknown_3007450
- 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 gUnknown_3007450
-_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 @ =gUnknown_3007450
- 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 gUnknown_3007450
-_081E2120: .4byte 0x00008021
-_081E2124:
- movs r0, 0x10
- ands r0, r6
- cmp r0, 0
- beq _081E215C
- ldr r1, _081E2178 @ =gUnknown_3007440
- 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 gUnknown_3007440
-_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 @ =gUnknown_3007450
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007450
-_081E223C: .4byte 0x00008020
-_081E2240: .4byte 0x04000208
-_081E2244: .4byte gUnknown_3007460
-_081E2248:
- cmp r3, 0x10
- bne _081E22D4
- ldr r3, _081E2264 @ =gUnknown_3007440
- 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 gUnknown_3007440
-_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 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_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 @ =gUnknown_3007450
- 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 gUnknown_3007450
-_081E232C: .4byte 0x04000208
-_081E2330: .4byte 0x00008043
-_081E2334:
- movs r0, 0x47
-_081E2336:
- strh r0, [r2, 0x34]
- ldr r0, _081E235C @ =gUnknown_3007460
- 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 gUnknown_3007460
-_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 @ =gUnknown_3007440
- 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 gUnknown_3007440
-_081E2394: .4byte 0x00008024
-_081E2398: .4byte 0x00000403
-_081E239C:
- ldr r0, _081E23B0 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_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 @ =gUnknown_3007440
- 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 gUnknown_3007440
-_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 @ =gUnknown_3007440
- 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 gUnknown_3007440
- 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007460
-_081E2494: .4byte gUnknown_3007464
-_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 @ =gUnknown_3007468
- ldr r1, [r4]
- movs r0, 0x1
- str r0, [r1, 0x68]
- movs r0, 0xFF
- str r0, [r1, 0x78]
- ldr r0, _081E24D8 @ =sub_81E2630
- 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 gUnknown_3007468
-_081E24D8: .4byte sub_81E2630
-_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 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0x68
- ldr r1, _081E2528 @ =gUnknown_3007464
- 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 gUnknown_3007468
-_081E2528: .4byte gUnknown_3007464
-_081E252C:
- ldr r0, _081E2564 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0x68
- ldr r1, _081E2568 @ =gUnknown_3007464
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007468
-_081E2568: .4byte gUnknown_3007464
-_081E256C: .4byte gUnknown_3007460
-_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 @ =gUnknown_3007440
- 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 @ =gUnknown_3007450
- 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007440
-_081E2618: .4byte gUnknown_3007450
-_081E261C: .4byte gUnknown_3007460
- 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 sub_81E2630
-sub_81E2630: @ 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 sub_81E2630
-
- 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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007450
- 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 @ =gUnknown_3007440
- 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 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _081E2718
- add r8, r5
- b _081E2724
- .align 2, 0
-_081E2704: .4byte gUnknown_3007460
-_081E2708: .4byte gUnknown_3007468
-_081E270C: .4byte 0x00008024
-_081E2710: .4byte gUnknown_3007450
-_081E2714: .4byte gUnknown_3007440
-_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 @ =gUnknown_3007464
- mov r0, r8
- cmp r0, 0
- beq _081E276E
- ldr r2, [sp]
- movs r0, 0x3
- ands r0, r2
- ldr r5, _081E2788 @ =gUnknown_3007460
- ldr r1, _081E278C @ =gUnknown_3007468
- 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 gUnknown_3007464
-_081E2788: .4byte gUnknown_3007460
-_081E278C: .4byte gUnknown_3007468
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_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 @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_081E2920: .4byte gUnknown_3007468
-_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 @ =gUnknown_3007440
- 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 gUnknown_3007440
-_081E297C:
- ldr r0, _081E29F4 @ =gUnknown_3007460
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007460
- 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 gUnknown_3007460
-_081E29F8: .4byte _Str_RfuHeader
-_081E29FC: .4byte gUnknown_3007468
-_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 @ =gUnknown_3007460
- ldr r4, [r0]
- ldrb r0, [r4]
- cmp r0, 0xFF
- beq _081E2A50
- ldr r2, _081E2A5C @ =gUnknown_3007464
- 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 gUnknown_3007460
-_081E2A5C: .4byte gUnknown_3007464
-_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 @ =gUnknown_3007468
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- ldrb r0, [r0, 0x1]
- cmp r0, 0
- beq _081E2B28
- ldr r0, _081E2AA4 @ =gUnknown_3007464
- ldr r0, [r0]
- strb r7, [r0, 0x1]
- ldr r0, _081E2AA8 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _081E2AAC
- bl rfu_STC_PARENT_analyzeRecvPacket
- b _081E2AB0
- .align 2, 0
-_081E2AA0: .4byte gUnknown_3007468
-_081E2AA4: .4byte gUnknown_3007464
-_081E2AA8: .4byte gUnknown_3007460
-_081E2AAC:
- bl rfu_STC_CHILD_analyzeRecvPacket
-_081E2AB0:
- movs r6, 0
- ldr r0, _081E2B40 @ =0x00008043
- mov r8, r0
- ldr r3, _081E2B44 @ =gUnknown_3007460
-_081E2AB8:
- ldr r0, _081E2B48 @ =gUnknown_3007450
- lsls r1, r6, 2
- adds r1, r0
- ldr r4, [r1]
- ldrh r0, [r4, 0x34]
- cmp r0, r8
- bne _081E2B0A
- ldr r0, _081E2B4C @ =gUnknown_3007464
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007460
-_081E2B48: .4byte gUnknown_3007450
-_081E2B4C: .4byte gUnknown_3007464
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007468
-_081E2BE4: .4byte gUnknown_3007464
- 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 @ =gUnknown_3007468
- 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 @ =gUnknown_3007464
- 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 gUnknown_3007468
-_081E2C3C: .4byte gUnknown_3007464
- thumb_func_end rfu_STC_CHILD_analyzeRecvPacket
-
- thumb_func_start rfu_STC_analyzeLLSF
-rfu_STC_analyzeLLSF: @ 81E2C40
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x8
- adds r7, r1, 0
- lsls r0, 24
- lsrs r0, 24
- mov r12, r0
- lsls r2, 16
- lsrs r3, r2, 16
- ldr r2, _081E2C74 @ =gUnknown_3007460
- ldr r0, [r2]
- ldrb r0, [r0]
- mvns r0, r0
- movs r1, 0x1
- ands r0, r1
- lsls r0, 4
- ldr r1, _081E2C78 @ =_Str_RfuHeader
- adds r6, r0, r1
- ldrb r0, [r6]
- cmp r3, r0
- bcs _081E2C7C
- adds r0, r3, 0
- b _081E2E6E
- .align 2, 0
-_081E2C74: .4byte gUnknown_3007460
-_081E2C78: .4byte _Str_RfuHeader
-_081E2C7C:
- movs r5, 0
- movs r4, 0
- ldrb r3, [r6, 0x1]
- ldrb r1, [r6, 0x7]
- mov r8, r1
- ldr r2, [sp]
- mov r9, r2
- cmp r4, r0
- bcs _081E2CA4
- adds r2, r0, 0
-_081E2C90:
- ldrb r0, [r7]
- lsls r1, r4, 3
- lsls r0, r1
- orrs r5, r0
- adds r7, 0x1
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, r2
- bcc _081E2C90
-_081E2CA4:
- adds r0, r5, 0
- lsrs r0, r3
- mov r3, r8
- ands r0, r3
- ldr r1, _081E2D7C @ =0xffffff00
- mov r10, r1
- mov r3, r10
- mov r2, r9
- ands r3, r2
- orrs r3, r0
- str r3, [sp]
- adds r0, r5, 0
- ldrb r1, [r6, 0x2]
- lsrs r0, r1
- ldrb r1, [r6, 0x8]
- ands r0, r1
- lsls r0, 8
- ldr r4, _081E2D80 @ =0xffff00ff
- adds r2, r4, 0
- ands r2, r3
- orrs r2, r0
- str r2, [sp]
- adds r0, r5, 0
- ldrb r3, [r6, 0x3]
- lsrs r0, r3
- ldrb r1, [r6, 0x9]
- ands r0, r1
- lsls r0, 16
- ldr r3, _081E2D84 @ =0xff00ffff
- ands r3, r2
- orrs r3, r0
- str r3, [sp]
- adds r0, r5, 0
- ldrb r1, [r6, 0x4]
- lsrs r0, r1
- ldrb r1, [r6, 0xA]
- ands r0, r1
- lsls r0, 24
- ldr r2, _081E2D88 @ =0x00ffffff
- mov r8, r2
- mov r1, r8
- ands r1, r3
- orrs r1, r0
- mov r8, r1
- str r1, [sp]
- adds r1, r5, 0
- ldrb r2, [r6, 0x5]
- lsrs r1, r2
- ldrb r0, [r6, 0xB]
- ands r1, r0
- mov r9, sp
- ldr r2, [sp, 0x4]
- mov r3, r10
- ands r2, r3
- orrs r2, r1
- str r2, [sp, 0x4]
- adds r0, r5, 0
- ldrb r1, [r6, 0x6]
- lsrs r0, r1
- ldrb r1, [r6, 0xC]
- ands r0, r1
- lsls r0, 8
- ands r4, r2
- orrs r4, r0
- str r4, [sp, 0x4]
- ldrh r0, [r6, 0xE]
- ands r5, r0
- lsls r1, r5, 16
- ldr r0, _081E2D8C @ =0x0000ffff
- ands r0, r4
- orrs r0, r1
- str r0, [sp, 0x4]
- lsrs r0, 16
- ldrb r6, [r6]
- adds r0, r6
- lsls r0, 16
- lsrs r0, 16
- mov r10, r0
- mov r0, sp
- ldrb r0, [r0]
- cmp r0, 0
- beq _081E2D4A
- b _081E2E6C
-_081E2D4A:
- ldr r2, _081E2D90 @ =gUnknown_3007460
- ldr r3, [r2]
- ldrb r2, [r3]
- cmp r2, 0x1
- bne _081E2E08
- ldrb r0, [r3, 0x2]
- mov r5, r12
- asrs r0, r5
- ands r0, r2
- cmp r0, 0
- bne _081E2D62
- b _081E2E6C
-_081E2D62:
- mov r1, r8
- lsrs r0, r1, 16
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bne _081E2D94
- mov r0, r12
- mov r1, sp
- adds r2, r7, 0
- bl rfu_STC_UNI_receive
- b _081E2E6C
- .align 2, 0
-_081E2D7C: .4byte 0xffffff00
-_081E2D80: .4byte 0xffff00ff
-_081E2D84: .4byte 0xff00ffff
-_081E2D88: .4byte 0x00ffffff
-_081E2D8C: .4byte 0x0000ffff
-_081E2D90: .4byte gUnknown_3007460
-_081E2D94:
- mov r5, r9
- ldrb r0, [r5, 0x3]
- cmp r0, 0
- bne _081E2DA8
- mov r0, r12
- mov r1, sp
- adds r2, r7, 0
- bl rfu_STC_NI_receive_Receiver
- b _081E2E6C
-_081E2DA8:
- movs r4, 0
- ldr r1, _081E2DC0 @ =gUnknown_3007450
- ldr r0, [r1]
- ldrb r0, [r0, 0x1A]
- mov r5, r12
- asrs r0, r5
- ands r0, r2
- cmp r0, 0
- beq _081E2DC4
- ldrb r0, [r3, 0x4]
- b _081E2DEA
- .align 2, 0
-_081E2DC0: .4byte gUnknown_3007450
-_081E2DC4:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bhi _081E2E6C
- lsls r0, r4, 2
- adds r0, r1
- ldr r0, [r0]
- ldrb r0, [r0, 0x1A]
- mov r2, r12
- asrs r0, r2
- movs r2, 0x1
- ands r0, r2
- cmp r0, 0
- beq _081E2DC4
- ldr r3, _081E2E04 @ =gUnknown_3007460
- ldr r0, [r3]
- ldrb r0, [r0, 0x4]
- mov r5, r12
-_081E2DEA:
- asrs r0, r5
- ands r0, r2
- cmp r0, 0
- beq _081E2DC4
- cmp r4, 0x3
- bhi _081E2E6C
- adds r0, r4, 0
- mov r1, r12
- mov r2, sp
- adds r3, r7, 0
- bl rfu_STC_NI_receive_Sender
- b _081E2E6C
- .align 2, 0
-_081E2E04: .4byte gUnknown_3007460
-_081E2E08:
- ldrb r1, [r3, 0x2]
- mov r2, r9
- ldrb r0, [r2, 0x1]
- adds r5, r1, 0
- ands r5, r0
- cmp r5, 0
- beq _081E2E6C
- movs r4, 0
- movs r6, 0x1
-_081E2E1A:
- adds r0, r5, 0
- asrs r0, r4
- ands r0, r6
- cmp r0, 0
- beq _081E2E62
- mov r1, sp
- ldrb r0, [r1, 0x2]
- cmp r0, 0x4
- bne _081E2E36
- adds r0, r4, 0
- adds r2, r7, 0
- bl rfu_STC_UNI_receive
- b _081E2E62
-_081E2E36:
- ldrb r0, [r1, 0x3]
- cmp r0, 0
- bne _081E2E48
- adds r0, r4, 0
- mov r1, sp
- adds r2, r7, 0
- bl rfu_STC_NI_receive_Receiver
- b _081E2E62
-_081E2E48:
- ldr r0, _081E2E80 @ =gUnknown_3007460
- ldr r0, [r0]
- ldrb r0, [r0, 0x4]
- asrs r0, r4
- ands r0, r6
- cmp r0, 0
- beq _081E2E62
- adds r0, r4, 0
- adds r1, r4, 0
- mov r2, sp
- adds r3, r7, 0
- bl rfu_STC_NI_receive_Sender
-_081E2E62:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bls _081E2E1A
-_081E2E6C:
- mov r0, r10
-_081E2E6E:
- 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
-_081E2E80: .4byte gUnknown_3007460
- thumb_func_end rfu_STC_analyzeLLSF
-
- thumb_func_start rfu_STC_UNI_receive
-rfu_STC_UNI_receive: @ 81E2E84
- push {r4-r7,lr}
- sub sp, 0x8
- adds r6, r1, 0
- str r2, [sp]
- lsls r0, 24
- lsrs r7, r0, 24
- ldr r2, _081E2EB8 @ =gUnknown_3007440
- lsls r1, r7, 2
- adds r1, r2
- ldr r3, [r1]
- adds r5, r3, 0
- adds r5, 0xC
- movs r4, 0
- movs r0, 0
- strh r0, [r5, 0x2]
- ldr r0, [r1]
- ldr r0, [r0, 0x18]
- adds r1, r2, 0
- ldrh r2, [r6, 0x6]
- cmp r0, r2
- bcs _081E2EC0
- movs r0, 0x49
- strh r0, [r3, 0xC]
- ldr r0, _081E2EBC @ =0x00000701
- strh r0, [r5, 0x2]
- b _081E2F0E
- .align 2, 0
-_081E2EB8: .4byte gUnknown_3007440
-_081E2EBC: .4byte 0x00000701
-_081E2EC0:
- ldrb r0, [r5, 0x7]
- cmp r0, 0
- beq _081E2ED8
- ldrb r0, [r5, 0x6]
- cmp r0, 0
- beq _081E2EE4
- ldr r0, _081E2ED4 @ =0x00000709
- strh r0, [r5, 0x2]
- b _081E2F0E
- .align 2, 0
-_081E2ED4: .4byte 0x00000709
-_081E2ED8:
- ldrb r0, [r5, 0x6]
- cmp r0, 0
- beq _081E2EE4
- movs r0, 0xE1
- lsls r0, 3
- strh r0, [r5, 0x2]
-_081E2EE4:
- movs r4, 0
- ldr r0, _081E2F2C @ =0x00008042
- strh r0, [r5]
- ldrh r0, [r6, 0x6]
- strh r0, [r5, 0x4]
- ldrh r2, [r6, 0x6]
- lsls r0, r7, 2
- adds r0, r1
- ldr r0, [r0]
- ldr r0, [r0, 0x14]
- str r0, [sp, 0x4]
- ldr r0, _081E2F30 @ =gUnknown_3007468
- ldr r0, [r0]
- add r1, sp, 0x4
- ldr r3, [r0, 0x4]
- mov r0, sp
- bl _call_via_r3
- movs r0, 0x1
- strb r0, [r5, 0x6]
- strh r4, [r5]
-_081E2F0E:
- ldrh r0, [r5, 0x2]
- cmp r0, 0
- beq _081E2F22
- ldr r0, _081E2F34 @ =gUnknown_3007464
- ldr r2, [r0]
- movs r0, 0x10
- lsls r0, r7
- ldrb r1, [r2, 0x4]
- orrs r0, r1
- strb r0, [r2, 0x4]
-_081E2F22:
- add sp, 0x8
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E2F2C: .4byte 0x00008042
-_081E2F30: .4byte gUnknown_3007468
-_081E2F34: .4byte gUnknown_3007464
- thumb_func_end rfu_STC_UNI_receive
-
- thumb_func_start rfu_STC_NI_receive_Sender
-rfu_STC_NI_receive_Sender: @ 81E2F38
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- adds r6, r2, 0
- lsls r0, 24
- lsls r1, 24
- lsrs r1, 24
- mov r10, r1
- ldr r1, _081E3004 @ =gUnknown_3007450
- lsrs r0, 22
- adds r0, r1
- ldr r0, [r0]
- mov r12, r0
- ldrh r0, [r0]
- mov r9, r0
- mov r0, r12
- adds r0, 0x21
- ldrb r2, [r6, 0x4]
- adds r0, r2
- ldrb r0, [r0]
- str r0, [sp]
- ldrb r2, [r6, 0x2]
- cmp r2, 0x2
- bne _081E2F74
- ldr r0, _081E3008 @ =0x00008022
- cmp r9, r0
- beq _081E2F8E
-_081E2F74:
- cmp r2, 0x1
- bne _081E2F7E
- ldr r0, _081E300C @ =0x00008021
- cmp r9, r0
- beq _081E2F8E
-_081E2F7E:
- movs r3, 0x1B
- add r3, r12
- mov r8, r3
- cmp r2, 0x3
- bne _081E2FB2
- ldr r0, _081E3010 @ =0x00008023
- cmp r9, r0
- bne _081E2FB2
-_081E2F8E:
- ldrb r1, [r6, 0x4]
- mov r0, r12
- adds r0, 0x21
- adds r0, r1
- ldrb r0, [r0]
- movs r7, 0x1B
- add r7, r12
- mov r8, r7
- ldrb r2, [r6, 0x5]
- cmp r0, r2
- bne _081E2FB2
- adds r0, r7, r1
- movs r1, 0x1
- mov r3, r10
- lsls r1, r3
- ldrb r2, [r0]
- orrs r1, r2
- strb r1, [r0]
-_081E2FB2:
- ldrb r2, [r6, 0x4]
- mov r7, r8
- adds r0, r7, r2
- ldrb r0, [r0]
- mov r3, r12
- ldrb r1, [r3, 0x1A]
- ands r0, r1
- cmp r0, r1
- bne _081E30AE
- adds r3, 0x21
- adds r2, r3, r2
- ldrb r0, [r2]
- adds r0, 0x1
- movs r1, 0x3
- ands r0, r1
- movs r1, 0
- strb r0, [r2]
- ldrb r0, [r6, 0x4]
- add r0, r8
- strb r1, [r0]
- mov r7, r12
- ldrh r1, [r7]
- ldr r2, _081E3014 @ =0x00007fdf
- adds r0, r1, r2
- lsls r0, 16
- lsrs r0, 16
- adds r5, r3, 0
- cmp r0, 0x1
- bhi _081E30A0
- ldr r0, _081E300C @ =0x00008021
- cmp r1, r0
- bne _081E3018
- ldrb r1, [r6, 0x4]
- lsls r1, 2
- subs r3, 0x1D
- adds r1, r3, r1
- ldrh r2, [r7, 0x2E]
- ldr r0, [r1]
- adds r0, r2
- str r0, [r1]
- b _081E302E
- .align 2, 0
-_081E3004: .4byte gUnknown_3007450
-_081E3008: .4byte 0x00008022
-_081E300C: .4byte 0x00008021
-_081E3010: .4byte 0x00008023
-_081E3014: .4byte 0x00007fdf
-_081E3018:
- ldrb r2, [r6, 0x4]
- lsls r2, 2
- mov r3, r12
- adds r3, 0x4
- adds r2, r3, r2
- mov r7, r12
- ldrh r1, [r7, 0x2E]
- lsls r1, 2
- ldr r0, [r2]
- adds r0, r1
- str r0, [r2]
-_081E302E:
- mov r0, r12
- ldrh r1, [r0, 0x2E]
- ldr r0, [r0, 0x14]
- subs r0, r1
- mov r1, r12
- str r0, [r1, 0x14]
- cmp r0, 0
- beq _081E3042
- cmp r0, 0
- bge _081E30AE
-_081E3042:
- mov r0, r12
- adds r0, 0x20
- movs r2, 0
- strb r2, [r0]
- mov r7, r12
- ldrh r1, [r7]
- ldr r0, _081E3084 @ =0x00008021
- cmp r1, r0
- bne _081E308C
- movs r4, 0
-_081E3056:
- adds r0, r5, r4
- movs r1, 0x1
- strb r1, [r0]
- lsls r1, r4, 2
- adds r1, r3, r1
- mov r2, r12
- ldrh r0, [r2, 0x2E]
- adds r2, r0, 0
- muls r2, r4
- mov r7, r12
- ldr r0, [r7, 0x28]
- adds r0, r2
- str r0, [r1]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bls _081E3056
- ldr r0, [r7, 0x30]
- str r0, [r7, 0x14]
- ldr r0, _081E3088 @ =0x00008022
- strh r0, [r7]
- b _081E30AE
- .align 2, 0
-_081E3084: .4byte 0x00008021
-_081E3088: .4byte 0x00008022
-_081E308C:
- strb r2, [r5]
- mov r0, r12
- str r2, [r0, 0x14]
- ldr r0, _081E309C @ =0x00008023
- mov r1, r12
- strh r0, [r1]
- b _081E30AE
- .align 2, 0
-_081E309C: .4byte 0x00008023
-_081E30A0:
- lsls r1, 16
- ldr r0, _081E3110 @ =0x80230000
- cmp r1, r0
- bne _081E30AE
- ldr r0, _081E3114 @ =0x00008020
- mov r2, r12
- strh r0, [r2]
-_081E30AE:
- mov r3, r12
- ldrh r0, [r3]
- cmp r0, r9
- bne _081E30D8
- ldrb r2, [r6, 0x4]
- mov r0, r12
- adds r0, 0x21
- adds r0, r2
- ldrb r0, [r0]
- ldr r7, [sp]
- cmp r0, r7
- bne _081E30D8
- mov r1, r8
- adds r0, r1, r2
- ldrb r0, [r0]
- mov r2, r10
- asrs r0, r2
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081E30FE
-_081E30D8:
- ldr r4, _081E3118 @ =0x04000208
- ldrh r2, [r4]
- movs r0, 0
- strh r0, [r4]
- ldr r0, _081E311C @ =gUnknown_3007464
- ldr r3, [r0]
- movs r0, 0x10
- mov r7, r10
- lsls r0, r7
- ldrb r1, [r3, 0x2]
- orrs r0, r1
- movs r1, 0
- strb r0, [r3, 0x2]
- lsls r0, r7, 2
- ldr r3, _081E3120 @ =gUnknown_3007450
- adds r0, r3
- ldr r0, [r0]
- strh r1, [r0, 0x2]
- strh r2, [r4]
-_081E30FE:
- 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
-_081E3110: .4byte 0x80230000
-_081E3114: .4byte 0x00008020
-_081E3118: .4byte 0x04000208
-_081E311C: .4byte gUnknown_3007464
-_081E3120: .4byte gUnknown_3007450
- thumb_func_end rfu_STC_NI_receive_Sender
-
- thumb_func_start rfu_STC_NI_receive_Receiver
-rfu_STC_NI_receive_Receiver: @ 81E3124
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- adds r6, r1, 0
- str r2, [sp]
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- movs r7, 0
- ldr r1, _081E3184 @ =gUnknown_3007450
- lsls r0, 2
- adds r0, r1
- ldr r4, [r0]
- adds r5, r4, 0
- adds r5, 0x34
- ldrh r0, [r4, 0x34]
- mov r9, r0
- ldrb r0, [r6, 0x4]
- adds r3, r4, 0
- adds r3, 0x55
- adds r0, r3, r0
- ldrb r0, [r0]
- mov r10, r0
- ldrb r0, [r6, 0x2]
- cmp r0, 0x3
- bne _081E3194
- ldr r0, _081E3188 @ =gUnknown_3007464
- ldr r2, [r0]
- movs r0, 0x1
- mov r1, r8
- lsls r0, r1
- ldrb r1, [r2, 0x1]
- orrs r0, r1
- strb r0, [r2, 0x1]
- ldrh r1, [r4, 0x34]
- ldr r0, _081E318C @ =0x00008042
- cmp r1, r0
- bne _081E31DA
- adds r0, r4, 0
- adds r0, 0x54
- strb r7, [r0]
- strb r7, [r3]
- ldr r0, _081E3190 @ =0x00008043
- strh r0, [r4, 0x34]
- b _081E31DA
- .align 2, 0
-_081E3184: .4byte gUnknown_3007450
-_081E3188: .4byte gUnknown_3007464
-_081E318C: .4byte 0x00008042
-_081E3190: .4byte 0x00008043
-_081E3194:
- cmp r0, 0x2
- bne _081E31C0
- ldr r0, _081E31B8 @ =0x00008041
- cmp r9, r0
- bne _081E31AC
- ldr r0, [r5, 0x14]
- cmp r0, 0
- bne _081E31AC
- mov r0, r8
- adds r1, r5, 0
- bl rfu_STC_NI_initSlot_asRecvDataEntity
-_081E31AC:
- ldrh r1, [r5]
- ldr r0, _081E31BC @ =0x00008042
- cmp r1, r0
- bne _081E31DA
- b _081E31DE
- .align 2, 0
-_081E31B8: .4byte 0x00008041
-_081E31BC: .4byte 0x00008042
-_081E31C0:
- cmp r0, 0x1
- bne _081E31DA
- ldr r7, _081E328C @ =0x00008041
- cmp r9, r7
- beq _081E31DE
- mov r0, r8
- adds r1, r5, 0
- bl rfu_STC_NI_initSlot_asRecvControllData
- ldrh r0, [r4, 0x34]
- cmp r0, r7
- bne _081E327A
- movs r7, 0x1
-_081E31DA:
- cmp r7, 0
- beq _081E3234
-_081E31DE:
- ldrb r2, [r6, 0x5]
- ldrb r3, [r6, 0x4]
- adds r4, r5, 0
- adds r4, 0x21
- adds r0, r4, r3
- ldrb r0, [r0]
- adds r0, 0x1
- movs r1, 0x3
- ands r0, r1
- cmp r2, r0
- bne _081E3234
- ldr r0, _081E3290 @ =gUnknown_3007468
- ldr r0, [r0]
- lsls r1, r3, 2
- adds r1, 0x4
- adds r1, r5, r1
- ldrh r2, [r6, 0x6]
- ldr r3, [r0, 0x4]
- mov r0, sp
- bl _call_via_r3
- ldrh r1, [r5]
- ldr r0, _081E3294 @ =0x00008042
- cmp r1, r0
- bne _081E3224
- ldrb r0, [r6, 0x4]
- lsls r0, 2
- adds r2, r5, 0x4
- adds r2, r0
- ldrh r0, [r5, 0x2E]
- lsls r1, r0, 1
- adds r1, r0
- ldr r0, [r2]
- adds r0, r1
- str r0, [r2]
-_081E3224:
- ldrh r1, [r6, 0x6]
- ldr r0, [r5, 0x14]
- subs r0, r1
- str r0, [r5, 0x14]
- ldrb r0, [r6, 0x4]
- adds r0, r4, r0
- ldrb r1, [r6, 0x5]
- strb r1, [r0]
-_081E3234:
- ldrh r0, [r5, 0x18]
- cmp r0, 0
- bne _081E327A
- ldrb r0, [r6, 0x4]
- adds r1, r5, 0
- adds r1, 0x20
- strb r0, [r1]
- ldrh r0, [r5]
- cmp r0, r9
- bne _081E325C
- adds r0, r5, 0
- adds r0, 0x21
- ldrb r2, [r6, 0x4]
- adds r0, r2
- ldrb r0, [r0]
- cmp r0, r10
- bne _081E325C
- ldrb r6, [r6, 0x5]
- cmp r0, r6
- bne _081E327A
-_081E325C:
- ldr r3, _081E3298 @ =0x04000208
- ldrh r2, [r3]
- movs r0, 0
- strh r0, [r3]
- ldr r0, _081E329C @ =gUnknown_3007464
- ldr r4, [r0]
- movs r0, 0x1
- mov r1, r8
- lsls r0, r1
- ldrb r1, [r4, 0x2]
- orrs r0, r1
- movs r1, 0
- strb r0, [r4, 0x2]
- strh r1, [r5, 0x2]
- strh r2, [r3]
-_081E327A:
- 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
-_081E328C: .4byte 0x00008041
-_081E3290: .4byte gUnknown_3007468
-_081E3294: .4byte 0x00008042
-_081E3298: .4byte 0x04000208
-_081E329C: .4byte gUnknown_3007464
- thumb_func_end rfu_STC_NI_receive_Receiver
-
- thumb_func_start rfu_STC_NI_initSlot_asRecvControllData
-rfu_STC_NI_initSlot_asRecvControllData: @ 81E32A0
- push {r4-r7,lr}
- adds r2, r1, 0
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _081E32BC @ =gUnknown_3007460
- ldr r3, [r0]
- ldrb r1, [r3]
- mov r12, r0
- cmp r1, 0x1
- bne _081E32C0
- movs r5, 0x3
- adds r1, r3, 0
- adds r1, 0xF
- b _081E32C8
- .align 2, 0
-_081E32BC: .4byte gUnknown_3007460
-_081E32C0:
- movs r5, 0x2
- adds r0, r4, 0
- adds r0, 0x10
- adds r1, r3, r0
-_081E32C8:
- movs r7, 0x1
- adds r0, r7, 0
- lsls r0, r4
- lsls r0, 24
- lsrs r6, r0, 24
- adds r4, r6, 0
- ldrh r3, [r2]
- cmp r3, 0
- bne _081E3326
- ldrb r0, [r1]
- cmp r0, r5
- bcs _081E3300
- movs r0, 0x49
- strh r0, [r2]
- ldr r0, _081E32F8 @ =0x00000702
- strh r0, [r2, 0x18]
- ldr r0, _081E32FC @ =gUnknown_3007464
- ldr r2, [r0]
- ldrb r1, [r2, 0x4]
- adds r0, r6, 0
- orrs r0, r1
- strb r0, [r2, 0x4]
- b _081E3326
- .align 2, 0
-_081E32F8: .4byte 0x00000702
-_081E32FC: .4byte gUnknown_3007464
-_081E3300:
- strh r3, [r2, 0x18]
- ldrb r0, [r1]
- subs r0, r5
- strb r0, [r1]
- adds r0, r2, 0
- adds r0, 0x2D
- str r0, [r2, 0x4]
- movs r0, 0x7
- str r0, [r2, 0x14]
- strb r7, [r2, 0x1F]
- strh r3, [r2, 0x2E]
- strb r4, [r2, 0x1A]
- ldr r0, _081E332C @ =0x00008041
- strh r0, [r2]
- mov r0, r12
- ldr r1, [r0]
- ldrb r0, [r1, 0x5]
- orrs r4, r0
- strb r4, [r1, 0x5]
-_081E3326:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E332C: .4byte 0x00008041
- thumb_func_end rfu_STC_NI_initSlot_asRecvControllData
-
- thumb_func_start rfu_STC_NI_initSlot_asRecvDataEntity
-rfu_STC_NI_initSlot_asRecvDataEntity: @ 81E3330
- push {r4-r7,lr}
- adds r4, r1, 0
- lsls r0, 24
- lsrs r5, r0, 24
- adds r0, r4, 0
- adds r0, 0x2D
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _081E3354
- ldr r0, _081E3350 @ =gUnknown_3007460
- lsls r1, r5, 5
- adds r1, 0x14
- ldr r0, [r0]
- adds r0, r1
- adds r0, 0x4
- b _081E33AA
- .align 2, 0
-_081E3350: .4byte gUnknown_3007460
-_081E3354:
- ldr r1, _081E3398 @ =gUnknown_3007450
- lsls r0, r5, 2
- adds r0, r1
- ldr r2, [r0]
- ldr r1, [r4, 0x30]
- ldr r0, [r2, 0x6C]
- cmp r1, r0
- bls _081E33A8
- movs r1, 0x80
- lsls r1, 17
- lsls r1, r5
- lsrs r1, 24
- ldr r0, _081E339C @ =gUnknown_3007464
- ldr r3, [r0]
- ldrb r2, [r3, 0x4]
- adds r0, r1, 0
- orrs r0, r2
- strb r0, [r3, 0x4]
- ldr r0, _081E33A0 @ =gUnknown_3007460
- ldr r2, [r0]
- ldrb r0, [r2, 0x5]
- bics r0, r1
- strb r0, [r2, 0x5]
- ldr r0, _081E33A4 @ =0x00000701
- strh r0, [r4, 0x18]
- movs r0, 0x47
- strh r0, [r4]
- adds r0, r5, 0
- movs r1, 0x1
- adds r2, r4, 0
- bl rfu_STC_releaseFrame
- b _081E33DC
- .align 2, 0
-_081E3398: .4byte gUnknown_3007450
-_081E339C: .4byte gUnknown_3007464
-_081E33A0: .4byte gUnknown_3007460
-_081E33A4: .4byte 0x00000701
-_081E33A8:
- ldr r0, [r2, 0x68]
-_081E33AA:
- str r0, [r4, 0x4]
- movs r3, 0
- adds r6, r4, 0
- adds r6, 0x21
- movs r7, 0
- adds r5, r4, 0x4
-_081E33B6:
- adds r0, r6, r3
- strb r7, [r0]
- lsls r1, r3, 2
- adds r1, r5, r1
- ldrh r0, [r4, 0x2E]
- adds r2, r0, 0
- muls r2, r3
- ldr r0, [r4, 0x4]
- adds r0, r2
- str r0, [r1]
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x3
- bls _081E33B6
- ldr r0, [r4, 0x30]
- str r0, [r4, 0x14]
- ldr r0, _081E33E4 @ =0x00008042
- strh r0, [r4]
-_081E33DC:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E33E4: .4byte 0x00008042
- thumb_func_end rfu_STC_NI_initSlot_asRecvDataEntity
-
- thumb_func_start rfu_NI_checkCommFailCounter
-rfu_NI_checkCommFailCounter: @ 81E33E8
- push {r4-r7,lr}
- ldr r2, _081E3474 @ =gUnknown_3007460
- ldr r0, [r2]
- ldrb r1, [r0, 0x4]
- ldrb r0, [r0, 0x5]
- orrs r0, r1
- cmp r0, 0
- beq _081E346E
- ldr r1, _081E3478 @ =0x04000208
- ldrh r0, [r1]
- mov r12, r0
- movs r0, 0
- strh r0, [r1]
- ldr r1, _081E347C @ =gUnknown_3007464
- ldr r0, [r1]
- ldrb r0, [r0, 0x2]
- lsrs r7, r0, 4
- movs r3, 0
- adds r6, r1, 0
- adds r5, r2, 0
- ldr r4, _081E3480 @ =gUnknown_3007450
-_081E3412:
- movs r0, 0x80
- lsls r0, 17
- lsls r0, r3
- lsrs r2, r0, 24
- ldr r0, [r5]
- ldrb r0, [r0, 0x4]
- ands r0, r2
- cmp r0, 0
- beq _081E343A
- ldr r0, [r6]
- ldrb r0, [r0, 0x2]
- ands r0, r2
- cmp r0, 0
- bne _081E343A
- lsls r0, r3, 2
- adds r0, r4
- ldr r1, [r0]
- ldrh r0, [r1, 0x2]
- adds r0, 0x1
- strh r0, [r1, 0x2]
-_081E343A:
- ldr r0, [r5]
- ldrb r0, [r0, 0x5]
- ands r0, r2
- cmp r0, 0
- beq _081E3458
- adds r0, r7, 0
- ands r0, r2
- cmp r0, 0
- bne _081E3458
- lsls r0, r3, 2
- adds r0, r4
- ldr r1, [r0]
- ldrh r0, [r1, 0x36]
- adds r0, 0x1
- strh r0, [r1, 0x36]
-_081E3458:
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x3
- bls _081E3412
- ldr r0, [r6]
- movs r1, 0
- strb r1, [r0, 0x2]
- ldr r0, _081E3478 @ =0x04000208
- mov r1, r12
- strh r1, [r0]
-_081E346E:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081E3474: .4byte gUnknown_3007460
-_081E3478: .4byte 0x04000208
-_081E347C: .4byte gUnknown_3007464
-_081E3480: .4byte gUnknown_3007450
- thumb_func_end rfu_NI_checkCommFailCounter
-
- thumb_func_start rfu_REQ_noise
-rfu_REQ_noise: @ 81E3484
- push {lr}
- ldr r0, _081E3498 @ =rfu_STC_REQ_callback
- bl STWI_set_Callback_M
- movs r0, 0x1
- movs r1, 0
- bl STWI_send_TestModeREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E3498: .4byte rfu_STC_REQ_callback
- thumb_func_end rfu_REQ_noise
-
- thumb_func_start sub_81E349C
-sub_81E349C: @ 81E349C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r0, _081E34B4 @ =0x04000208
- ldrh r0, [r0]
- cmp r0, 0
- bne _081E34B8
- movs r0, 0x1
- negs r0, r0
- b _081E3538
- .align 2, 0
-_081E34B4: .4byte 0x04000208
-_081E34B8:
- ldr r0, _081E34E4 @ =0x04000200
- ldrh r0, [r0]
- mov r8, r0
- ldr r4, _081E34E8 @ =gRfuState
- ldr r1, [r4]
- movs r0, 0xA
- str r0, [r1]
- ldr r0, _081E34EC @ =sub_81E36B8
- bl STWI_set_Callback_ID
- bl sub_81E3550
- ldr r0, [r4]
- ldrb r0, [r0, 0xA]
- lsls r0, 2
- ldr r1, _081E34F0 @ =0x04000100
- adds r4, r0, r1
- lsls r0, r5, 27
- lsrs r5, r0, 24
- movs r7, 0
- b _081E3506
- .align 2, 0
-_081E34E4: .4byte 0x04000200
-_081E34E8: .4byte gRfuState
-_081E34EC: .4byte sub_81E36B8
-_081E34F0: .4byte 0x04000100
-_081E34F4:
- strh r6, [r4, 0x2]
- strh r6, [r4]
- movs r0, 0x83
- strh r0, [r4, 0x2]
-_081E34FC:
- ldrh r0, [r4]
- cmp r0, 0x1F
- bls _081E34FC
- strh r7, [r4, 0x2]
- strh r7, [r4]
-_081E3506:
- subs r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0xFF
- beq _081E351A
- bl sub_81E35C4
- adds r6, r0, 0
- cmp r6, 0
- beq _081E34F4
-_081E351A:
- ldr r1, _081E3544 @ =0x04000208
- movs r0, 0
- strh r0, [r1]
- ldr r0, _081E3548 @ =0x04000200
- mov r2, r8
- strh r2, [r0]
- movs r0, 0x1
- strh r0, [r1]
- ldr r0, _081E354C @ =gRfuState
- ldr r1, [r0]
- movs r0, 0
- str r0, [r1]
- bl STWI_set_Callback_ID
- adds r0, r6, 0
-_081E3538:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_081E3544: .4byte 0x04000208
-_081E3548: .4byte 0x04000200
-_081E354C: .4byte gRfuState
- thumb_func_end sub_81E349C
-
- thumb_func_start sub_81E3550
-sub_81E3550: @ 81E3550
- push {r4,r5,lr}
- sub sp, 0x4
- ldr r3, _081E35A8 @ =0x04000208
- movs r4, 0
- strh r4, [r3]
- ldr r2, _081E35AC @ =0x04000200
- ldr r0, _081E35B0 @ =gRfuState
- ldr r0, [r0]
- movs r1, 0x8
- ldrb r0, [r0, 0xA]
- lsls r1, r0
- movs r5, 0x80
- orrs r1, r5
- ldrh r0, [r2]
- bics r0, r1
- strh r0, [r2]
- movs r0, 0x1
- strh r0, [r3]
- ldr r0, _081E35B4 @ =0x04000134
- strh r4, [r0]
- subs r2, 0xD8
- movs r1, 0x80
- lsls r1, 5
- adds r0, r1, 0
- strh r0, [r2]
- ldrh r0, [r2]
- movs r3, 0x81
- lsls r3, 7
- adds r1, r3, 0
- orrs r0, r1
- strh r0, [r2]
- movs r0, 0
- str r0, [sp]
- ldr r1, _081E35B8 @ =gUnknown_3007470
- ldr r2, _081E35BC @ =0x05000003
- mov r0, sp
- bl CpuSet
- ldr r0, _081E35C0 @ =0x04000202
- strh r5, [r0]
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081E35A8: .4byte 0x04000208
-_081E35AC: .4byte 0x04000200
-_081E35B0: .4byte gRfuState
-_081E35B4: .4byte 0x04000134
-_081E35B8: .4byte gUnknown_3007470
-_081E35BC: .4byte 0x05000003
-_081E35C0: .4byte 0x04000202
- thumb_func_end sub_81E3550
-
- thumb_func_start sub_81E35C4
-sub_81E35C4: @ 81E35C4
- push {r4-r7,lr}
- ldr r0, _081E35D8 @ =gUnknown_3007470
- ldrb r1, [r0, 0x1]
- mov r12, r1
- adds r7, r0, 0
- cmp r1, 0
- beq _081E35DC
- cmp r1, 0x1
- beq _081E3614
- b _081E36AC
- .align 2, 0
-_081E35D8: .4byte gUnknown_3007470
-_081E35DC:
- movs r6, 0x1
- strb r6, [r7]
- ldr r3, _081E3608 @ =0x04000128
- ldrh r0, [r3]
- movs r5, 0x1
- orrs r0, r5
- strh r0, [r3]
- ldr r4, _081E360C @ =0x04000208
- mov r0, r12
- strh r0, [r4]
- ldr r2, _081E3610 @ =0x04000200
- ldrh r0, [r2]
- movs r1, 0x80
- orrs r0, r1
- strh r0, [r2]
- strh r6, [r4]
- strb r5, [r7, 0x1]
- ldrb r0, [r3]
- orrs r0, r1
- strb r0, [r3]
- b _081E36B0
- .align 2, 0
-_081E3608: .4byte 0x04000128
-_081E360C: .4byte 0x04000208
-_081E3610: .4byte 0x04000200
-_081E3614:
- ldrh r0, [r7, 0xA]
- cmp r0, 0
- bne _081E36A8
- ldrb r0, [r7]
- cmp r0, 0x1
- bne _081E3644
- ldrh r0, [r7, 0x2]
- cmp r0, 0
- bne _081E36B0
- ldr r3, _081E363C @ =0x04000208
- strh r0, [r3]
- ldr r2, _081E3640 @ =0x04000128
- ldrh r0, [r2]
- movs r1, 0x80
- orrs r0, r1
- strh r0, [r2]
- mov r1, r12
- strh r1, [r3]
- b _081E36B0
- .align 2, 0
-_081E363C: .4byte 0x04000208
-_081E3640: .4byte 0x04000128
-_081E3644:
- ldrh r1, [r7, 0x4]
- ldr r0, _081E3690 @ =0x00008001
- cmp r1, r0
- beq _081E36B0
- ldrh r6, [r7, 0x2]
- cmp r6, 0
- bne _081E36B0
- ldr r4, _081E3694 @ =0x04000208
- strh r6, [r4]
- ldr r3, _081E3698 @ =0x04000200
- ldrh r1, [r3]
- ldr r0, _081E369C @ =0x0000ff7f
- ands r0, r1
- strh r0, [r3]
- mov r7, r12
- strh r7, [r4]
- ldr r2, _081E36A0 @ =0x04000128
- strh r6, [r2]
- movs r1, 0x80
- lsls r1, 5
- adds r0, r1, 0
- strh r0, [r2]
- ldr r0, _081E36A4 @ =0x04000202
- movs r5, 0x80
- strh r5, [r0]
- ldrh r0, [r2]
- movs r7, 0x81
- lsls r7, 7
- adds r1, r7, 0
- orrs r0, r1
- strh r0, [r2]
- strh r6, [r4]
- ldrh r0, [r3]
- orrs r0, r5
- strh r0, [r3]
- mov r0, r12
- strh r0, [r4]
- b _081E36B0
- .align 2, 0
-_081E3690: .4byte 0x00008001
-_081E3694: .4byte 0x04000208
-_081E3698: .4byte 0x04000200
-_081E369C: .4byte 0x0000ff7f
-_081E36A0: .4byte 0x04000128
-_081E36A4: .4byte 0x04000202
-_081E36A8:
- movs r0, 0x2
- strb r0, [r7, 0x1]
-_081E36AC:
- ldrh r0, [r7, 0xA]
- b _081E36B2
-_081E36B0:
- movs r0, 0
-_081E36B2:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81E35C4
-
- thumb_func_start sub_81E36B8
-sub_81E36B8: @ 81E36B8
- push {r4,r5,lr}
- ldr r0, _081E3700 @ =0x04000120
- ldr r5, [r0]
- ldr r0, _081E3704 @ =gUnknown_3007470
- ldrb r1, [r0]
- adds r4, r0, 0
- cmp r1, 0x1
- beq _081E36D2
- ldr r0, _081E3708 @ =0x04000128
- ldrh r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- strh r1, [r0]
-_081E36D2:
- ldrb r2, [r4]
- lsls r1, r2, 4
- adds r0, r5, 0
- lsls r0, r1
- lsrs r1, r0, 16
- movs r0, 0x1
- subs r0, r2
- lsls r0, 4
- lsls r5, r0
- adds r0, r5, 0
- lsrs r5, r0, 16
- ldrh r0, [r4, 0xA]
- cmp r0, 0
- bne _081E3726
- ldrh r2, [r4, 0x6]
- cmp r1, r2
- bne _081E3724
- ldrh r3, [r4, 0x2]
- cmp r3, 0x3
- bls _081E370C
- strh r5, [r4, 0xA]
- b _081E3726
- .align 2, 0
-_081E3700: .4byte 0x04000120
-_081E3704: .4byte gUnknown_3007470
-_081E3708: .4byte 0x04000128
-_081E370C:
- ldrh r0, [r4, 0x4]
- mvns r0, r0
- lsls r0, 16
- lsrs r0, 16
- cmp r1, r0
- bne _081E3726
- mvns r0, r2
- lsls r0, 16
- lsrs r0, 16
- cmp r5, r0
- bne _081E3726
- adds r0, r3, 0x1
-_081E3724:
- strh r0, [r4, 0x2]
-_081E3726:
- ldrh r0, [r4, 0x2]
- cmp r0, 0x3
- bhi _081E373C
- lsls r0, 1
- ldr r1, _081E3738 @ =_Str_Sio32ID
- adds r0, r1
- ldrh r0, [r0]
- b _081E373E
- .align 2, 0
-_081E3738: .4byte _Str_Sio32ID
-_081E373C:
- ldr r0, _081E3794 @ =0x00008001
-_081E373E:
- strh r0, [r4, 0x4]
- mvns r0, r5
- strh r0, [r4, 0x6]
- ldr r3, _081E3798 @ =0x04000120
- ldrh r2, [r4, 0x4]
- ldrb r1, [r4]
- movs r0, 0x1
- subs r0, r1
- lsls r0, 4
- lsls r2, r0
- ldrh r0, [r4, 0x6]
- lsls r1, 4
- lsls r0, r1
- adds r2, r0
- str r2, [r3]
- ldrb r0, [r4]
- cmp r0, 0x1
- bne _081E378C
- ldrh r0, [r4, 0x2]
- cmp r0, 0
- bne _081E376E
- ldr r0, _081E379C @ =0x0000494e
- cmp r5, r0
- bne _081E378C
-_081E376E:
- movs r0, 0
- ldr r1, _081E37A0 @ =0x00000257
-_081E3772:
- adds r0, 0x1
- lsls r0, 16
- lsrs r0, 16
- cmp r0, r1
- bls _081E3772
- ldrh r0, [r4, 0xA]
- cmp r0, 0
- bne _081E378C
- ldr r0, _081E37A4 @ =0x04000128
- ldrh r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- strh r1, [r0]
-_081E378C:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081E3794: .4byte 0x00008001
-_081E3798: .4byte 0x04000120
-_081E379C: .4byte 0x0000494e
-_081E37A0: .4byte 0x00000257
-_081E37A4: .4byte 0x04000128
- thumb_func_end sub_81E36B8
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/librfu_intr.s b/asm/librfu_intr.s
index 63aa88f3e..10ee02e7b 100644
--- a/asm/librfu_intr.s
+++ b/asm/librfu_intr.s
@@ -9,7 +9,7 @@
IntrSIO32: @ 81DFC50
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
- ldr r3, _081DFCB0 @ =gRfuState
+ ldr r3, _081DFCB0 @ =gSTWIStatus
ldr r0, [r3]
ldr r2, [r0]
sub r11, r12, 0x4
@@ -34,7 +34,7 @@ _081DFCA4:
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
-_081DFCB0: .4byte gRfuState
+_081DFCB0: .4byte gSTWIStatus
arm_func_end IntrSIO32
arm_func_start sio32intr_clock_master
@@ -45,7 +45,7 @@ sio32intr_clock_master: @ 81DFCB4
sub r11, r12, 0x4
bl STWI_set_timer_in_RAM
mov r4, 0x120
- ldr r2, _081DFF28 @ =gRfuState
+ ldr r2, _081DFF28 @ =gSTWIStatus
add r4, r4, 0x4000000
ldr lr, [r4]
ldr r12, [r2]
@@ -208,7 +208,7 @@ _081DFEFC:
bl sub_81E05A4
b _081DFF3C
.align 2, 0
-_081DFF28: .4byte gRfuState
+_081DFF28: .4byte gSTWIStatus
_081DFF2C:
add r3, r5, 0x3
strh r3, [r4]
@@ -223,7 +223,7 @@ _081DFF3C:
sio32intr_clock_slave: @ 81DFF44
mov r12, sp
stmdb sp!, {r4-r6,r11,r12,lr,pc}
- ldr r4, _081E02F0 @ =gRfuState
+ ldr r4, _081E02F0 @ =gSTWIStatus
mov r0, 0x64
ldr r3, [r4]
mov r6, 0
@@ -473,7 +473,7 @@ _081E02E0:
bhi _081E02E0
b _081E031C
.align 2, 0
-_081E02F0: .4byte gRfuState
+_081E02F0: .4byte gSTWIStatus
_081E02F4: .4byte 0x996601ee
_081E02F8:
mov r2, 0xFF00
@@ -510,7 +510,7 @@ handshake_wait: @ 81E0350
mov r1, 0x128
add r1, r1, 0x4000000
mov r0, r0, lsl 16
- ldr r2, _081E03B4 @ =gRfuState
+ ldr r2, _081E03B4 @ =gSTWIStatus
sub r11, r12, 0x4
mov lr, r0, lsr 14
ldr r12, [r2]
@@ -533,7 +533,7 @@ _081E03A0:
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
-_081E03B4: .4byte gRfuState
+_081E03B4: .4byte gSTWIStatus
arm_func_end handshake_wait
arm_func_start STWI_set_timer_in_RAM
@@ -544,7 +544,7 @@ STWI_set_timer_in_RAM: @ 81E03B8
add r1, r1, 0x4000000
mov r3, 0
sub r11, r12, 0x4
- ldr r12, _081E0470 @ =gRfuState
+ ldr r12, _081E0470 @ =gSTWIStatus
and lr, r0, 0xFF
ldr r2, [r12]
cmp lr, 0x50
@@ -589,7 +589,7 @@ _081E0458:
mov r3, 0x3
b _081E0488
.align 2, 0
-_081E0470: .4byte gRfuState
+_081E0470: .4byte gSTWIStatus
_081E0474:
mvn r3, 0x850
sub r3, r3, 0x2
@@ -621,7 +621,7 @@ STWI_stop_timer_in_RAM: @ 81E04C8
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
mov r1, 0x100
- ldr lr, _081E0514 @ =gRfuState
+ ldr lr, _081E0514 @ =gSTWIStatus
add r0, r1, 0x4000000
ldr r2, [lr]
sub r11, r12, 0x4
@@ -638,14 +638,14 @@ STWI_stop_timer_in_RAM: @ 81E04C8
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
-_081E0514: .4byte gRfuState
+_081E0514: .4byte gSTWIStatus
arm_func_end STWI_stop_timer_in_RAM
arm_func_start STWI_init_slave
STWI_init_slave: @ 81E0518
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
- ldr r0, _081E05A0 @ =gRfuState
+ ldr r0, _081E05A0 @ =gSTWIStatus
ldr r2, [r0]
mov r3, 0x5
str r3, [r2]
@@ -678,7 +678,7 @@ STWI_init_slave: @ 81E0518
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
-_081E05A0: .4byte gRfuState
+_081E05A0: .4byte gSTWIStatus
arm_func_end STWI_init_slave
arm_func_start sub_81E05A4
diff --git a/asm/librfu_stwi.s b/asm/librfu_stwi.s
deleted file mode 100644
index 5434d037f..000000000
--- a/asm/librfu_stwi.s
+++ /dev/null
@@ -1,1560 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start STWI_init_all
-STWI_init_all: @ 81DF114
- push {r4,lr}
- adds r3, r0, 0
- lsls r2, 24
- lsrs r2, 24
- cmp r2, 0x1
- bne _081DF150
- adds r2, r3, 0
- adds r2, 0xE8
- str r2, [r1]
- ldr r1, _081DF13C @ =0x040000d4
- ldr r0, _081DF140 @ =IntrSIO32
- str r0, [r1]
- str r2, [r1, 0x4]
- ldr r0, _081DF144 @ =0x800004b0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- ldr r1, _081DF148 @ =gRfuState
- ldr r2, _081DF14C @ =0x00000a48
- adds r0, r3, r2
- b _081DF15A
- .align 2, 0
-_081DF13C: .4byte 0x040000d4
-_081DF140: .4byte IntrSIO32
-_081DF144: .4byte 0x800004b0
-_081DF148: .4byte gRfuState
-_081DF14C: .4byte 0x00000a48
-_081DF150:
- ldr r0, _081DF1D4 @ =IntrSIO32
- str r0, [r1]
- ldr r1, _081DF1D8 @ =gRfuState
- adds r0, r3, 0
- adds r0, 0xE8
-_081DF15A:
- str r0, [r1]
- adds r2, r1, 0
- ldr r1, [r2]
- str r3, [r1, 0x28]
- adds r0, r3, 0
- adds r0, 0x74
- str r0, [r1, 0x24]
- ldrb r0, [r1, 0x14]
- movs r4, 0
- movs r0, 0x1
- strb r0, [r1, 0x14]
- ldr r0, [r2]
- str r4, [r0]
- strb r4, [r0, 0x4]
- ldr r0, [r2]
- strb r4, [r0, 0x5]
- ldr r0, [r2]
- strb r4, [r0, 0x7]
- ldr r0, [r2]
- strb r4, [r0, 0x8]
- ldr r0, [r2]
- strb r4, [r0, 0x9]
- ldr r0, [r2]
- str r4, [r0, 0xC]
- ldrb r1, [r0, 0x10]
- strb r4, [r0, 0x10]
- ldr r0, [r2]
- ldrh r1, [r0, 0x12]
- movs r1, 0
- strh r4, [r0, 0x12]
- strb r1, [r0, 0x15]
- ldr r0, [r2]
- adds r0, 0x2C
- ldrb r2, [r0]
- strb r1, [r0]
- ldr r1, _081DF1DC @ =0x04000134
- movs r2, 0x80
- lsls r2, 1
- adds r0, r2, 0
- strh r0, [r1]
- subs r1, 0xC
- ldr r2, _081DF1E0 @ =0x00005003
- adds r0, r2, 0
- strh r0, [r1]
- bl STWI_init_Callback_M
- bl STWI_init_Callback_S
- ldr r3, _081DF1E4 @ =0x04000208
- ldrh r2, [r3]
- strh r4, [r3]
- ldr r4, _081DF1E8 @ =0x04000200
- ldrh r0, [r4]
- movs r1, 0x80
- orrs r0, r1
- strh r0, [r4]
- strh r2, [r3]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF1D4: .4byte IntrSIO32
-_081DF1D8: .4byte gRfuState
-_081DF1DC: .4byte 0x04000134
-_081DF1E0: .4byte 0x00005003
-_081DF1E4: .4byte 0x04000208
-_081DF1E8: .4byte 0x04000200
- thumb_func_end STWI_init_all
-
- thumb_func_start STWI_init_timer
-STWI_init_timer: @ 81DF1EC
- push {r4,r5,lr}
- ldr r2, _081DF218 @ =STWI_intr_timer
- str r2, [r0]
- ldr r5, _081DF21C @ =gRfuState
- ldr r0, [r5]
- movs r4, 0
- strb r1, [r0, 0xA]
- ldr r3, _081DF220 @ =0x04000208
- ldrh r2, [r3]
- strh r4, [r3]
- ldr r4, _081DF224 @ =0x04000200
- ldr r1, [r5]
- movs r0, 0x8
- ldrb r1, [r1, 0xA]
- lsls r0, r1
- ldrh r1, [r4]
- orrs r0, r1
- strh r0, [r4]
- strh r2, [r3]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF218: .4byte STWI_intr_timer
-_081DF21C: .4byte gRfuState
-_081DF220: .4byte 0x04000208
-_081DF224: .4byte 0x04000200
- thumb_func_end STWI_init_timer
-
- thumb_func_start AgbRFU_SoftReset
-AgbRFU_SoftReset: @ 81DF228
- push {r4,r5,lr}
- ldr r5, _081DF2C0 @ =0x04000134
- movs r1, 0x80
- lsls r1, 8
- adds r0, r1, 0
- strh r0, [r5]
- ldr r2, _081DF2C4 @ =0x000080a0
- adds r0, r2, 0
- strh r0, [r5]
- ldr r1, _081DF2C8 @ =gRfuState
- ldr r0, [r1]
- ldrb r0, [r0, 0xA]
- lsls r0, 2
- ldr r3, _081DF2CC @ =0x04000100
- adds r2, r0, r3
- ldr r4, _081DF2D0 @ =0x04000102
- adds r3, r0, r4
- movs r0, 0
- strh r0, [r3]
- strh r0, [r2]
- movs r0, 0x83
- strh r0, [r3]
- ldrh r0, [r2]
- adds r4, r1, 0
- cmp r0, 0x11
- bhi _081DF268
- ldr r0, _081DF2D4 @ =0x000080a2
- adds r1, r0, 0
-_081DF260:
- strh r1, [r5]
- ldrh r0, [r2]
- cmp r0, 0x11
- bls _081DF260
-_081DF268:
- movs r0, 0x3
- strh r0, [r3]
- ldr r1, _081DF2C0 @ =0x04000134
- ldr r2, _081DF2C4 @ =0x000080a0
- adds r0, r2, 0
- strh r0, [r1]
- subs r1, 0xC
- ldr r3, _081DF2D8 @ =0x00005003
- adds r0, r3, 0
- strh r0, [r1]
- ldr r0, [r4]
- movs r2, 0
- str r2, [r0]
- strb r2, [r0, 0x4]
- ldr r0, [r4]
- strb r2, [r0, 0x5]
- ldr r0, [r4]
- strb r2, [r0, 0x6]
- ldr r0, [r4]
- strb r2, [r0, 0x7]
- ldr r0, [r4]
- strb r2, [r0, 0x8]
- ldr r0, [r4]
- strb r2, [r0, 0x9]
- ldr r0, [r4]
- str r2, [r0, 0xC]
- ldrb r1, [r0, 0x10]
- strb r2, [r0, 0x10]
- ldr r1, [r4]
- ldrh r0, [r1, 0x12]
- movs r3, 0
- strh r2, [r1, 0x12]
- ldrb r0, [r1, 0x14]
- movs r0, 0x1
- strb r0, [r1, 0x14]
- ldr r0, [r4]
- strb r3, [r0, 0x15]
- ldr r0, [r4]
- adds r0, 0x2C
- ldrb r1, [r0]
- strb r3, [r0]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF2C0: .4byte 0x04000134
-_081DF2C4: .4byte 0x000080a0
-_081DF2C8: .4byte gRfuState
-_081DF2CC: .4byte 0x04000100
-_081DF2D0: .4byte 0x04000102
-_081DF2D4: .4byte 0x000080a2
-_081DF2D8: .4byte 0x00005003
- thumb_func_end AgbRFU_SoftReset
-
- thumb_func_start STWI_set_MS_mode
-STWI_set_MS_mode: @ 81DF2DC
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _081DF2EC @ =gRfuState
- ldr r1, [r1]
- ldrb r2, [r1, 0x14]
- strb r0, [r1, 0x14]
- bx lr
- .align 2, 0
-_081DF2EC: .4byte gRfuState
- thumb_func_end STWI_set_MS_mode
-
- thumb_func_start STWI_read_status
-STWI_read_status: @ 81DF2F0
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- adds r1, r0, 0
- cmp r0, 0x1
- beq _081DF31C
- cmp r0, 0x1
- bgt _081DF306
- cmp r0, 0
- beq _081DF310
- b _081DF344
-_081DF306:
- cmp r1, 0x2
- beq _081DF328
- cmp r1, 0x3
- beq _081DF338
- b _081DF344
-_081DF310:
- ldr r0, _081DF318 @ =gRfuState
- ldr r0, [r0]
- ldrh r0, [r0, 0x12]
- b _081DF346
- .align 2, 0
-_081DF318: .4byte gRfuState
-_081DF31C:
- ldr r0, _081DF324 @ =gRfuState
- ldr r0, [r0]
- ldrb r0, [r0, 0x14]
- b _081DF346
- .align 2, 0
-_081DF324: .4byte gRfuState
-_081DF328:
- ldr r0, _081DF334 @ =gRfuState
- ldr r0, [r0]
- ldr r0, [r0]
- lsls r0, 16
- lsrs r0, 16
- b _081DF346
- .align 2, 0
-_081DF334: .4byte gRfuState
-_081DF338:
- ldr r0, _081DF340 @ =gRfuState
- ldr r0, [r0]
- ldrb r0, [r0, 0x6]
- b _081DF346
- .align 2, 0
-_081DF340: .4byte gRfuState
-_081DF344:
- ldr r0, _081DF34C @ =0x0000ffff
-_081DF346:
- pop {r1}
- bx r1
- .align 2, 0
-_081DF34C: .4byte 0x0000ffff
- thumb_func_end STWI_read_status
-
- thumb_func_start STWI_init_Callback_M
-STWI_init_Callback_M: @ 81DF350
- push {lr}
- movs r0, 0
- bl STWI_set_Callback_M
- pop {r0}
- bx r0
- thumb_func_end STWI_init_Callback_M
-
- thumb_func_start STWI_init_Callback_S
-STWI_init_Callback_S: @ 81DF35C
- push {lr}
- movs r0, 0
- bl STWI_set_Callback_S
- pop {r0}
- bx r0
- thumb_func_end STWI_init_Callback_S
-
- thumb_func_start STWI_set_Callback_M
-STWI_set_Callback_M: @ 81DF368
- ldr r1, _081DF370 @ =gRfuState
- ldr r1, [r1]
- str r0, [r1, 0x18]
- bx lr
- .align 2, 0
-_081DF370: .4byte gRfuState
- thumb_func_end STWI_set_Callback_M
-
- thumb_func_start STWI_set_Callback_S
-STWI_set_Callback_S: @ 81DF374
- ldr r1, _081DF37C @ =gRfuState
- ldr r1, [r1]
- str r0, [r1, 0x1C]
- bx lr
- .align 2, 0
-_081DF37C: .4byte gRfuState
- thumb_func_end STWI_set_Callback_S
-
- thumb_func_start STWI_set_Callback_ID
-STWI_set_Callback_ID: @ 81DF380
- ldr r1, _081DF388 @ =gRfuState
- ldr r1, [r1]
- str r0, [r1, 0x20]
- bx lr
- .align 2, 0
-_081DF388: .4byte gRfuState
- thumb_func_end STWI_set_Callback_ID
-
- thumb_func_start STWI_poll_CommandEnd
-STWI_poll_CommandEnd: @ 81DF38C
- push {lr}
- ldr r0, _081DF3B0 @ =gRfuState
- ldr r1, [r0]
- adds r2, r1, 0
- adds r2, 0x2C
- ldrb r1, [r2]
- adds r3, r0, 0
- cmp r1, 0x1
- bne _081DF3A6
- adds r1, r2, 0
-_081DF3A0:
- ldrb r0, [r1]
- cmp r0, 0x1
- beq _081DF3A0
-_081DF3A6:
- ldr r0, [r3]
- ldrh r0, [r0, 0x12]
- pop {r1}
- bx r1
- .align 2, 0
-_081DF3B0: .4byte gRfuState
- thumb_func_end STWI_poll_CommandEnd
-
- thumb_func_start STWI_send_ResetREQ
-STWI_send_ResetREQ: @ 81DF3B4
- push {lr}
- movs r0, 0x10
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF3CE
- ldr r0, _081DF3D4 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF3CE:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF3D4: .4byte gRfuState
- thumb_func_end STWI_send_ResetREQ
-
- thumb_func_start STWI_send_LinkStatusREQ
-STWI_send_LinkStatusREQ: @ 81DF3D8
- push {lr}
- movs r0, 0x11
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF3F2
- ldr r0, _081DF3F8 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF3F2:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF3F8: .4byte gRfuState
- thumb_func_end STWI_send_LinkStatusREQ
-
- thumb_func_start STWI_send_VersionStatusREQ
-STWI_send_VersionStatusREQ: @ 81DF3FC
- push {lr}
- movs r0, 0x12
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF416
- ldr r0, _081DF41C @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF416:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF41C: .4byte gRfuState
- thumb_func_end STWI_send_VersionStatusREQ
-
- thumb_func_start STWI_send_SystemStatusREQ
-STWI_send_SystemStatusREQ: @ 81DF420
- push {lr}
- movs r0, 0x13
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF43A
- ldr r0, _081DF440 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF43A:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF440: .4byte gRfuState
- thumb_func_end STWI_send_SystemStatusREQ
-
- thumb_func_start STWI_send_SlotStatusREQ
-STWI_send_SlotStatusREQ: @ 81DF444
- push {lr}
- movs r0, 0x14
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF45E
- ldr r0, _081DF464 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF45E:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF464: .4byte gRfuState
- thumb_func_end STWI_send_SlotStatusREQ
-
- thumb_func_start STWI_send_ConfigStatusREQ
-STWI_send_ConfigStatusREQ: @ 81DF468
- push {lr}
- movs r0, 0x15
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF482
- ldr r0, _081DF488 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF482:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF488: .4byte gRfuState
- thumb_func_end STWI_send_ConfigStatusREQ
-
- thumb_func_start STWI_send_GameConfigREQ
-STWI_send_GameConfigREQ: @ 81DF48C
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- movs r0, 0x16
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF4D8
- ldr r2, _081DF4E0 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x6
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r1, [r0, 0x24]
- adds r1, 0x4
- ldrh r0, [r4]
- strh r0, [r1]
- adds r1, 0x2
- adds r4, 0x2
- movs r2, 0xD
-_081DF4B6:
- ldrb r0, [r4]
- strb r0, [r1]
- adds r1, 0x1
- adds r4, 0x1
- subs r2, 0x1
- cmp r2, 0
- bge _081DF4B6
- movs r2, 0x7
-_081DF4C6:
- ldrb r0, [r5]
- strb r0, [r1]
- adds r1, 0x1
- adds r5, 0x1
- subs r2, 0x1
- cmp r2, 0
- bge _081DF4C6
- bl STWI_start_Command
-_081DF4D8:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF4E0: .4byte gRfuState
- thumb_func_end STWI_send_GameConfigREQ
-
- thumb_func_start STWI_send_SystemConfigREQ
-STWI_send_SystemConfigREQ: @ 81DF4E4
- push {r4-r6,lr}
- lsls r0, 16
- lsrs r6, r0, 16
- lsls r1, 24
- lsrs r5, r1, 24
- lsls r2, 24
- lsrs r4, r2, 24
- movs r0, 0x17
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF51A
- ldr r2, _081DF520 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r0, [r0, 0x24]
- adds r0, 0x4
- strb r4, [r0]
- adds r0, 0x1
- strb r5, [r0]
- adds r0, 0x1
- strh r6, [r0]
- bl STWI_start_Command
-_081DF51A:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF520: .4byte gRfuState
- thumb_func_end STWI_send_SystemConfigREQ
-
- thumb_func_start STWI_send_SC_StartREQ
-STWI_send_SC_StartREQ: @ 81DF524
- push {lr}
- movs r0, 0x19
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF53E
- ldr r0, _081DF544 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF53E:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF544: .4byte gRfuState
- thumb_func_end STWI_send_SC_StartREQ
-
- thumb_func_start STWI_send_SC_PollingREQ
-STWI_send_SC_PollingREQ: @ 81DF548
- push {lr}
- movs r0, 0x1A
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF562
- ldr r0, _081DF568 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF562:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF568: .4byte gRfuState
- thumb_func_end STWI_send_SC_PollingREQ
-
- thumb_func_start STWI_send_SC_EndREQ
-STWI_send_SC_EndREQ: @ 81DF56C
- push {lr}
- movs r0, 0x1B
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF586
- ldr r0, _081DF58C @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF586:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF58C: .4byte gRfuState
- thumb_func_end STWI_send_SC_EndREQ
-
- thumb_func_start STWI_send_SP_StartREQ
-STWI_send_SP_StartREQ: @ 81DF590
- push {lr}
- movs r0, 0x1C
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF5AA
- ldr r0, _081DF5B0 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF5AA:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF5B0: .4byte gRfuState
- thumb_func_end STWI_send_SP_StartREQ
-
- thumb_func_start STWI_send_SP_PollingREQ
-STWI_send_SP_PollingREQ: @ 81DF5B4
- push {lr}
- movs r0, 0x1D
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF5CE
- ldr r0, _081DF5D4 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF5CE:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF5D4: .4byte gRfuState
- thumb_func_end STWI_send_SP_PollingREQ
-
- thumb_func_start STWI_send_SP_EndREQ
-STWI_send_SP_EndREQ: @ 81DF5D8
- push {lr}
- movs r0, 0x1E
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF5F2
- ldr r0, _081DF5F8 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF5F2:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF5F8: .4byte gRfuState
- thumb_func_end STWI_send_SP_EndREQ
-
- thumb_func_start STWI_send_CP_StartREQ
-STWI_send_CP_StartREQ: @ 81DF5FC
- push {r4,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- movs r0, 0x1F
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF620
- ldr r2, _081DF628 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r0, [r0, 0x24]
- str r4, [r0, 0x4]
- bl STWI_start_Command
-_081DF620:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF628: .4byte gRfuState
- thumb_func_end STWI_send_CP_StartREQ
-
- thumb_func_start STWI_send_CP_PollingREQ
-STWI_send_CP_PollingREQ: @ 81DF62C
- push {lr}
- movs r0, 0x20
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF646
- ldr r0, _081DF64C @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF646:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF64C: .4byte gRfuState
- thumb_func_end STWI_send_CP_PollingREQ
-
- thumb_func_start STWI_send_CP_EndREQ
-STWI_send_CP_EndREQ: @ 81DF650
- push {lr}
- movs r0, 0x21
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF66A
- ldr r0, _081DF670 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF66A:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF670: .4byte gRfuState
- thumb_func_end STWI_send_CP_EndREQ
-
- thumb_func_start STWI_send_DataTxREQ
-STWI_send_DataTxREQ: @ 81DF674
- push {r4-r6,lr}
- adds r6, r0, 0
- lsls r4, r1, 24
- lsrs r5, r4, 24
- movs r0, 0x24
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF6B2
- lsrs r2, r4, 26
- movs r0, 0x3
- ands r0, r5
- cmp r0, 0
- beq _081DF694
- adds r2, 0x1
-_081DF694:
- ldr r1, _081DF6B8 @ =gRfuState
- ldr r0, [r1]
- strb r2, [r0, 0x4]
- ldr r0, [r1]
- ldr r1, [r0, 0x24]
- adds r1, 0x4
- ldrb r2, [r0, 0x4]
- movs r0, 0x80
- lsls r0, 19
- orrs r2, r0
- adds r0, r6, 0
- bl CpuSet
- bl STWI_start_Command
-_081DF6B2:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF6B8: .4byte gRfuState
- thumb_func_end STWI_send_DataTxREQ
-
- thumb_func_start STWI_send_DataTxAndChangeREQ
-STWI_send_DataTxAndChangeREQ: @ 81DF6BC
- push {r4-r6,lr}
- adds r6, r0, 0
- lsls r4, r1, 24
- lsrs r5, r4, 24
- movs r0, 0x25
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF6FA
- lsrs r2, r4, 26
- movs r0, 0x3
- ands r0, r5
- cmp r0, 0
- beq _081DF6DC
- adds r2, 0x1
-_081DF6DC:
- ldr r1, _081DF700 @ =gRfuState
- ldr r0, [r1]
- strb r2, [r0, 0x4]
- ldr r0, [r1]
- ldr r1, [r0, 0x24]
- adds r1, 0x4
- ldrb r2, [r0, 0x4]
- movs r0, 0x80
- lsls r0, 19
- orrs r2, r0
- adds r0, r6, 0
- bl CpuSet
- bl STWI_start_Command
-_081DF6FA:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF700: .4byte gRfuState
- thumb_func_end STWI_send_DataTxAndChangeREQ
-
- thumb_func_start STWI_send_DataRxREQ
-STWI_send_DataRxREQ: @ 81DF704
- push {lr}
- movs r0, 0x26
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF71E
- ldr r0, _081DF724 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF71E:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF724: .4byte gRfuState
- thumb_func_end STWI_send_DataRxREQ
-
- thumb_func_start STWI_send_MS_ChangeREQ
-STWI_send_MS_ChangeREQ: @ 81DF728
- push {lr}
- movs r0, 0x27
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF742
- ldr r0, _081DF748 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF742:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF748: .4byte gRfuState
- thumb_func_end STWI_send_MS_ChangeREQ
-
- thumb_func_start STWI_send_DataReadyAndChangeREQ
-STWI_send_DataReadyAndChangeREQ: @ 81DF74C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r5, r4, 0
- movs r0, 0x28
- bl STWI_init
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, 0
- bne _081DF792
- cmp r4, 0
- bne _081DF774
- ldr r0, _081DF770 @ =gRfuState
- ldr r0, [r0]
- strb r3, [r0, 0x4]
- b _081DF78E
- .align 2, 0
-_081DF770: .4byte gRfuState
-_081DF774:
- ldr r2, _081DF798 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r0, [r0, 0x24]
- adds r0, 0x4
- strb r5, [r0]
- adds r0, 0x1
- strb r3, [r0]
- adds r0, 0x1
- strb r3, [r0]
- strb r3, [r0, 0x1]
-_081DF78E:
- bl STWI_start_Command
-_081DF792:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF798: .4byte gRfuState
- thumb_func_end STWI_send_DataReadyAndChangeREQ
-
- thumb_func_start STWI_send_DisconnectedAndChangeREQ
-STWI_send_DisconnectedAndChangeREQ: @ 81DF79C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r5, r1, 24
- movs r0, 0x29
- bl STWI_init
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, 0
- bne _081DF7D2
- ldr r2, _081DF7D8 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r0, [r0, 0x24]
- adds r0, 0x4
- strb r4, [r0]
- adds r0, 0x1
- strb r5, [r0]
- adds r0, 0x1
- strb r3, [r0]
- strb r3, [r0, 0x1]
- bl STWI_start_Command
-_081DF7D2:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF7D8: .4byte gRfuState
- thumb_func_end STWI_send_DisconnectedAndChangeREQ
-
- thumb_func_start STWI_send_ResumeRetransmitAndChangeREQ
-STWI_send_ResumeRetransmitAndChangeREQ: @ 81DF7DC
- push {lr}
- movs r0, 0x37
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF7F6
- ldr r0, _081DF7FC @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF7F6:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF7FC: .4byte gRfuState
- thumb_func_end STWI_send_ResumeRetransmitAndChangeREQ
-
- thumb_func_start STWI_send_DisconnectREQ
-STWI_send_DisconnectREQ: @ 81DF800
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- movs r0, 0x30
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF824
- ldr r2, _081DF82C @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r0, [r0, 0x24]
- str r4, [r0, 0x4]
- bl STWI_start_Command
-_081DF824:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF82C: .4byte gRfuState
- thumb_func_end STWI_send_DisconnectREQ
-
- thumb_func_start STWI_send_TestModeREQ
-STWI_send_TestModeREQ: @ 81DF830
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 24
- lsrs r4, r1, 24
- movs r0, 0x31
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF85C
- ldr r2, _081DF864 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x1
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- ldr r1, [r0, 0x24]
- lsls r0, r4, 8
- orrs r0, r5
- str r0, [r1, 0x4]
- bl STWI_start_Command
-_081DF85C:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF864: .4byte gRfuState
- thumb_func_end STWI_send_TestModeREQ
-
- thumb_func_start STWI_send_CPR_StartREQ
-STWI_send_CPR_StartREQ: @ 81DF868
- push {r4-r6,lr}
- lsls r0, 16
- lsrs r5, r0, 16
- lsls r1, 16
- lsrs r4, r1, 16
- lsls r2, 24
- lsrs r6, r2, 24
- movs r0, 0x32
- bl STWI_init
- lsls r0, 16
- cmp r0, 0
- bne _081DF89A
- ldr r2, _081DF8A0 @ =gRfuState
- ldr r1, [r2]
- movs r0, 0x2
- strb r0, [r1, 0x4]
- lsls r0, r5, 16
- orrs r0, r4
- ldr r1, [r2]
- ldr r1, [r1, 0x24]
- str r0, [r1, 0x4]
- str r6, [r1, 0x8]
- bl STWI_start_Command
-_081DF89A:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081DF8A0: .4byte gRfuState
- thumb_func_end STWI_send_CPR_StartREQ
-
- thumb_func_start STWI_send_CPR_PollingREQ
-STWI_send_CPR_PollingREQ: @ 81DF8A4
- push {lr}
- movs r0, 0x33
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF8BE
- ldr r0, _081DF8C4 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF8BE:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF8C4: .4byte gRfuState
- thumb_func_end STWI_send_CPR_PollingREQ
-
- thumb_func_start STWI_send_CPR_EndREQ
-STWI_send_CPR_EndREQ: @ 81DF8C8
- push {lr}
- movs r0, 0x34
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF8E2
- ldr r0, _081DF8E8 @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF8E2:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF8E8: .4byte gRfuState
- thumb_func_end STWI_send_CPR_EndREQ
-
- thumb_func_start STWI_send_StopModeREQ
-STWI_send_StopModeREQ: @ 81DF8EC
- push {lr}
- movs r0, 0x3D
- bl STWI_init
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- bne _081DF906
- ldr r0, _081DF90C @ =gRfuState
- ldr r0, [r0]
- strb r1, [r0, 0x4]
- bl STWI_start_Command
-_081DF906:
- pop {r0}
- bx r0
- .align 2, 0
-_081DF90C: .4byte gRfuState
- thumb_func_end STWI_send_StopModeREQ
-
- thumb_func_start STWI_intr_timer
-STWI_intr_timer: @ 81DF910
- push {r4,lr}
- ldr r4, _081DF928 @ =gRfuState
- ldr r1, [r4]
- ldr r0, [r1, 0xC]
- cmp r0, 0x2
- beq _081DF936
- cmp r0, 0x2
- bhi _081DF92C
- cmp r0, 0x1
- beq _081DF944
- b _081DF96C
- .align 2, 0
-_081DF928: .4byte gRfuState
-_081DF92C:
- cmp r0, 0x3
- beq _081DF94E
- cmp r0, 0x4
- beq _081DF944
- b _081DF96C
-_081DF936:
- ldrb r0, [r1, 0x10]
- movs r0, 0x1
- strb r0, [r1, 0x10]
- movs r0, 0x32
- bl STWI_set_timer
- b _081DF96C
-_081DF944:
- bl STWI_stop_timer
- bl STWI_restart_Command
- b _081DF96C
-_081DF94E:
- ldrb r0, [r1, 0x10]
- movs r0, 0x1
- strb r0, [r1, 0x10]
- bl STWI_stop_timer
- bl STWI_reset_ClockCounter
- ldr r0, [r4]
- ldr r2, [r0, 0x18]
- cmp r2, 0
- beq _081DF96C
- movs r0, 0xFF
- movs r1, 0
- bl _call_via_r2
-_081DF96C:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end STWI_intr_timer
-
- thumb_func_start STWI_set_timer
-STWI_set_timer: @ 81DF974
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- adds r5, r3, 0
- ldr r2, _081DF9A4 @ =gRfuState
- ldr r0, [r2]
- ldrb r0, [r0, 0xA]
- lsls r0, 2
- ldr r1, _081DF9A8 @ =0x04000100
- adds r4, r0, r1
- adds r1, 0x2
- adds r7, r0, r1
- ldr r1, _081DF9AC @ =0x04000208
- movs r0, 0
- strh r0, [r1]
- adds r6, r2, 0
- cmp r3, 0x50
- beq _081DF9CC
- cmp r3, 0x50
- bgt _081DF9B0
- cmp r3, 0x32
- beq _081DF9BA
- b _081DF9F8
- .align 2, 0
-_081DF9A4: .4byte gRfuState
-_081DF9A8: .4byte 0x04000100
-_081DF9AC: .4byte 0x04000208
-_081DF9B0:
- cmp r5, 0x64
- beq _081DF9DC
- cmp r5, 0x82
- beq _081DF9EC
- b _081DF9F8
-_081DF9BA:
- ldr r1, _081DF9C8 @ =0x0000fccb
- adds r0, r1, 0
- strh r0, [r4]
- ldr r1, [r6]
- movs r0, 0x1
- b _081DF9F6
- .align 2, 0
-_081DF9C8: .4byte 0x0000fccb
-_081DF9CC:
- ldr r1, _081DF9D8 @ =0x0000fae0
- adds r0, r1, 0
- strh r0, [r4]
- ldr r1, [r6]
- movs r0, 0x2
- b _081DF9F6
- .align 2, 0
-_081DF9D8: .4byte 0x0000fae0
-_081DF9DC:
- ldr r1, _081DF9E8 @ =0x0000f996
- adds r0, r1, 0
- strh r0, [r4]
- ldr r1, [r6]
- movs r0, 0x3
- b _081DF9F6
- .align 2, 0
-_081DF9E8: .4byte 0x0000f996
-_081DF9EC:
- ldr r1, _081DFA14 @ =0x0000f7ad
- adds r0, r1, 0
- strh r0, [r4]
- ldr r1, [r6]
- movs r0, 0x4
-_081DF9F6:
- str r0, [r1, 0xC]
-_081DF9F8:
- movs r0, 0xC3
- strh r0, [r7]
- ldr r2, _081DFA18 @ =0x04000202
- ldr r1, [r6]
- movs r0, 0x8
- ldrb r1, [r1, 0xA]
- lsls r0, r1
- strh r0, [r2]
- ldr r1, _081DFA1C @ =0x04000208
- movs r0, 0x1
- strh r0, [r1]
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081DFA14: .4byte 0x0000f7ad
-_081DFA18: .4byte 0x04000202
-_081DFA1C: .4byte 0x04000208
- thumb_func_end STWI_set_timer
-
- thumb_func_start STWI_stop_timer
-STWI_stop_timer: @ 81DFA20
- ldr r2, _081DFA40 @ =gRfuState
- ldr r0, [r2]
- movs r1, 0
- str r1, [r0, 0xC]
- ldrb r0, [r0, 0xA]
- lsls r0, 2
- ldr r3, _081DFA44 @ =0x04000100
- adds r0, r3
- strh r1, [r0]
- ldr r0, [r2]
- ldrb r0, [r0, 0xA]
- lsls r0, 2
- ldr r2, _081DFA48 @ =0x04000102
- adds r0, r2
- strh r1, [r0]
- bx lr
- .align 2, 0
-_081DFA40: .4byte gRfuState
-_081DFA44: .4byte 0x04000100
-_081DFA48: .4byte 0x04000102
- thumb_func_end STWI_stop_timer
-
- thumb_func_start STWI_init
-STWI_init: @ 81DFA4C
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- adds r6, r5, 0
- ldr r0, _081DFA78 @ =0x04000208
- ldrh r0, [r0]
- cmp r0, 0
- bne _081DFA80
- ldr r0, _081DFA7C @ =gRfuState
- ldr r1, [r0]
- ldrh r0, [r1, 0x12]
- movs r0, 0x6
- strh r0, [r1, 0x12]
- ldr r2, [r1, 0x18]
- cmp r2, 0
- beq _081DFACA
- ldrh r1, [r1, 0x12]
- adds r0, r5, 0
- bl _call_via_r2
- b _081DFACA
- .align 2, 0
-_081DFA78: .4byte 0x04000208
-_081DFA7C: .4byte gRfuState
-_081DFA80:
- ldr r4, _081DFAAC @ =gRfuState
- ldr r2, [r4]
- adds r3, r2, 0
- adds r3, 0x2C
- ldrb r0, [r3]
- cmp r0, 0x1
- bne _081DFAB0
- ldrh r0, [r2, 0x12]
- movs r1, 0
- movs r0, 0x2
- strh r0, [r2, 0x12]
- ldrb r0, [r3]
- strb r1, [r3]
- ldr r0, [r4]
- ldr r2, [r0, 0x18]
- cmp r2, 0
- beq _081DFACA
- ldrh r1, [r0, 0x12]
- adds r0, r5, 0
- bl _call_via_r2
- b _081DFACA
- .align 2, 0
-_081DFAAC: .4byte gRfuState
-_081DFAB0:
- ldrb r0, [r2, 0x14]
- cmp r0, 0
- bne _081DFACE
- ldrh r0, [r2, 0x12]
- movs r0, 0x4
- strh r0, [r2, 0x12]
- ldr r3, [r2, 0x18]
- cmp r3, 0
- beq _081DFACA
- ldrh r1, [r2, 0x12]
- adds r0, r5, 0
- bl _call_via_r3
-_081DFACA:
- movs r0, 0x1
- b _081DFB16
-_081DFACE:
- ldrb r0, [r3]
- movs r1, 0
- movs r0, 0x1
- strb r0, [r3]
- ldr r0, [r4]
- strb r6, [r0, 0x6]
- ldr r0, [r4]
- str r1, [r0]
- strb r1, [r0, 0x4]
- ldr r0, [r4]
- strb r1, [r0, 0x5]
- ldr r0, [r4]
- strb r1, [r0, 0x7]
- ldr r0, [r4]
- strb r1, [r0, 0x8]
- ldr r0, [r4]
- strb r1, [r0, 0x9]
- ldr r0, [r4]
- str r1, [r0, 0xC]
- ldrb r2, [r0, 0x10]
- strb r1, [r0, 0x10]
- ldr r0, [r4]
- ldrh r2, [r0, 0x12]
- movs r2, 0
- strh r1, [r0, 0x12]
- strb r2, [r0, 0x15]
- ldr r1, _081DFB1C @ =0x04000134
- movs r2, 0x80
- lsls r2, 1
- adds r0, r2, 0
- strh r0, [r1]
- subs r1, 0xC
- ldr r2, _081DFB20 @ =0x00005003
- adds r0, r2, 0
- strh r0, [r1]
- movs r0, 0
-_081DFB16:
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_081DFB1C: .4byte 0x04000134
-_081DFB20: .4byte 0x00005003
- thumb_func_end STWI_init
-
- thumb_func_start STWI_start_Command
-STWI_start_Command: @ 81DFB24
- push {r4,r5,lr}
- ldr r5, _081DFB7C @ =gRfuState
- ldr r0, [r5]
- ldr r3, [r0, 0x24]
- ldrb r1, [r0, 0x4]
- lsls r1, 8
- ldrb r0, [r0, 0x6]
- ldr r2, _081DFB80 @ =0x99660000
- orrs r0, r2
- orrs r1, r0
- str r1, [r3]
- ldr r2, _081DFB84 @ =0x04000120
- ldr r1, [r5]
- ldr r0, [r1, 0x24]
- ldr r0, [r0]
- str r0, [r2]
- movs r2, 0
- str r2, [r1]
- movs r0, 0x1
- strb r0, [r1, 0x5]
- ldr r4, _081DFB88 @ =0x04000208
- ldrh r3, [r4]
- strh r2, [r4]
- ldr r2, _081DFB8C @ =0x04000200
- ldr r1, [r5]
- movs r0, 0x8
- ldrb r1, [r1, 0xA]
- lsls r0, r1
- ldrh r1, [r2]
- orrs r0, r1
- strh r0, [r2]
- ldrh r0, [r2]
- movs r1, 0x80
- orrs r0, r1
- strh r0, [r2]
- strh r3, [r4]
- ldr r1, _081DFB90 @ =0x04000128
- ldr r2, _081DFB94 @ =0x00005083
- adds r0, r2, 0
- strh r0, [r1]
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_081DFB7C: .4byte gRfuState
-_081DFB80: .4byte 0x99660000
-_081DFB84: .4byte 0x04000120
-_081DFB88: .4byte 0x04000208
-_081DFB8C: .4byte 0x04000200
-_081DFB90: .4byte 0x04000128
-_081DFB94: .4byte 0x00005083
- thumb_func_end STWI_start_Command
-
- thumb_func_start STWI_restart_Command
-STWI_restart_Command: @ 81DFB98
- push {r4,lr}
- ldr r4, _081DFBB0 @ =gRfuState
- ldr r2, [r4]
- ldrb r0, [r2, 0x15]
- adds r3, r4, 0
- cmp r0, 0x1
- bhi _081DFBB4
- adds r0, 0x1
- strb r0, [r2, 0x15]
- bl STWI_start_Command
- b _081DFC0E
- .align 2, 0
-_081DFBB0: .4byte gRfuState
-_081DFBB4:
- ldrb r0, [r2, 0x6]
- cmp r0, 0x27
- beq _081DFBC6
- cmp r0, 0x25
- beq _081DFBC6
- cmp r0, 0x35
- beq _081DFBC6
- cmp r0, 0x37
- bne _081DFBE8
-_081DFBC6:
- ldr r0, [r3]
- ldrh r1, [r0, 0x12]
- movs r2, 0
- movs r1, 0x1
- strh r1, [r0, 0x12]
- adds r0, 0x2C
- ldrb r1, [r0]
- strb r2, [r0]
- ldr r1, [r3]
- ldr r2, [r1, 0x18]
- cmp r2, 0
- beq _081DFC0E
- ldrb r0, [r1, 0x6]
- ldrh r1, [r1, 0x12]
- bl _call_via_r2
- b _081DFC0E
-_081DFBE8:
- ldrh r0, [r2, 0x12]
- movs r1, 0
- movs r0, 0x1
- strh r0, [r2, 0x12]
- adds r0, r2, 0
- adds r0, 0x2C
- ldrb r2, [r0]
- strb r1, [r0]
- ldr r1, [r4]
- ldr r2, [r1, 0x18]
- cmp r2, 0
- beq _081DFC08
- ldrb r0, [r1, 0x6]
- ldrh r1, [r1, 0x12]
- bl _call_via_r2
-_081DFC08:
- ldr r1, [r4]
- movs r0, 0x4
- str r0, [r1]
-_081DFC0E:
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end STWI_restart_Command
-
- thumb_func_start STWI_reset_ClockCounter
-STWI_reset_ClockCounter: @ 81DFC18
- ldr r3, _081DFC44 @ =gRfuState
- ldr r1, [r3]
- movs r0, 0x5
- str r0, [r1]
- movs r2, 0
- strb r2, [r1, 0x4]
- ldr r0, [r3]
- strb r2, [r0, 0x5]
- ldr r1, _081DFC48 @ =0x04000120
- movs r0, 0x80
- lsls r0, 24
- str r0, [r1]
- adds r1, 0x8
- strh r2, [r1]
- ldr r2, _081DFC4C @ =0x00005003
- adds r0, r2, 0
- strh r0, [r1]
- adds r2, 0x7F
- adds r0, r2, 0
- strh r0, [r1]
- movs r0, 0
- bx lr
- .align 2, 0
-_081DFC44: .4byte gRfuState
-_081DFC48: .4byte 0x04000120
-_081DFC4C: .4byte 0x00005003
- thumb_func_end STWI_reset_ClockCounter
diff --git a/asm/link_rfu.s b/asm/link_rfu.s
index 7c1485466..49fe3aef5 100644
--- a/asm/link_rfu.s
+++ b/asm/link_rfu.s
@@ -50,7 +50,7 @@ rfu_REQ_sendData_wrapper: @ 80FD3F0
push {lr}
lsls r0, 24
lsrs r2, r0, 24
- ldr r0, _080FD410 @ =gUnknown_3007460
+ ldr r0, _080FD410 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0
@@ -63,7 +63,7 @@ rfu_REQ_sendData_wrapper: @ 80FD3F0
movs r2, 0x1
b _080FD420
.align 2, 0
-_080FD410: .4byte gUnknown_3007460
+_080FD410: .4byte gRfuLinkStatus
_080FD414: .4byte gUnknown_3005E10
_080FD418:
ldr r0, _080FD42C @ =gUnknown_3005E10
@@ -383,7 +383,7 @@ _080FD648:
_080FD664: .4byte gUnknown_3005E10
_080FD668:
movs r2, 0
- ldr r0, _080FD6B4 @ =gUnknown_3007460
+ ldr r0, _080FD6B4 @ =gRfuLinkStatus
ldr r1, [r0]
ldrb r3, [r1, 0x8]
ldr r5, _080FD6B8 @ =gUnknown_3005E10
@@ -422,7 +422,7 @@ _080FD6A2:
movs r0, 0x3
b _080FD6E8
.align 2, 0
-_080FD6B4: .4byte gUnknown_3007460
+_080FD6B4: .4byte gRfuLinkStatus
_080FD6B8: .4byte gUnknown_3005E10
_080FD6BC:
ldrb r0, [r5, 0x4]
@@ -476,7 +476,7 @@ sub_80FD6F4: @ 80FD6F4
bics r0, r1
strb r0, [r3]
movs r4, 0
- ldr r7, _080FD75C @ =gUnknown_3007460
+ ldr r7, _080FD75C @ =gRfuLinkStatus
movs r5, 0x1
adds r3, 0x4
movs r2, 0
@@ -514,7 +514,7 @@ _080FD750:
bx r0
.align 2, 0
_080FD758: .4byte gUnknown_3005E10
-_080FD75C: .4byte gUnknown_3007460
+_080FD75C: .4byte gRfuLinkStatus
thumb_func_end sub_80FD6F4
thumb_func_start sub_80FD760
@@ -601,7 +601,7 @@ _080FD80A:
strb r0, [r5, 0x4]
ldrb r0, [r5, 0x12]
strb r0, [r5, 0x5]
- ldr r4, _080FD82C @ =gUnknown_3007460
+ ldr r4, _080FD82C @ =gRfuLinkStatus
ldr r0, [r4]
ldrb r0, [r0, 0x3]
bl sub_80FE818
@@ -613,7 +613,7 @@ _080FD80A:
bl sub_80FE7F0
b _080FD84A
.align 2, 0
-_080FD82C: .4byte gUnknown_3007460
+_080FD82C: .4byte gRfuLinkStatus
_080FD830:
movs r0, 0x12
strb r0, [r5, 0x4]
@@ -653,7 +653,7 @@ sub_80FD850: @ 80FD850
mov r1, sp
adds r2, r5, 0
adds r3, r4, 0
- bl sub_81E13F0
+ bl rfu_REQBN_watchLink
mov r0, sp
ldrb r0, [r0]
adds r7, r4, 0
@@ -743,7 +743,7 @@ _080FD90A:
_080FD91E:
bl sub_80FEAF4
_080FD922:
- ldr r0, _080FDA0C @ =gUnknown_3007460
+ ldr r0, _080FDA0C @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0x1
@@ -866,7 +866,7 @@ _080FD9FC:
pop {r1}
bx r1
.align 2, 0
-_080FDA0C: .4byte gUnknown_3007460
+_080FDA0C: .4byte gRfuLinkStatus
_080FDA10: .4byte gUnknown_3005E10
thumb_func_end sub_80FD850
@@ -1025,7 +1025,7 @@ _080FDB5C:
.align 2, 0
_080FDB70: .4byte gUnknown_3005E10
_080FDB74:
- bl sub_81E0CAC
+ bl rfu_REQ_startSearchChild
b _080FDBDA
_080FDB7A:
bl rfu_REQ_pollSearchChild
@@ -1056,13 +1056,13 @@ _080FDBAE:
bl rfu_REQ_endConnectParent
b _080FDBDA
_080FDBB4:
- ldr r0, _080FDBC0 @ =gUnknown_3007460
+ ldr r0, _080FDBC0 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x3]
bl rfu_REQ_CHILD_startConnectRecovery
b _080FDBDA
.align 2, 0
-_080FDBC0: .4byte gUnknown_3007460
+_080FDBC0: .4byte gRfuLinkStatus
_080FDBC4:
bl rfu_REQ_CHILD_pollConnectRecovery
b _080FDBDA
@@ -1089,7 +1089,7 @@ _080FDBE4:
bhi _080FDBF4
b _080FDA5A
_080FDBF4:
- ldr r0, _080FDC24 @ =gUnknown_3007460
+ ldr r0, _080FDC24 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0x1
@@ -1110,7 +1110,7 @@ _080FDC1A:
bx r0
.align 2, 0
_080FDC20: .4byte gUnknown_3005E10
-_080FDC24: .4byte gUnknown_3007460
+_080FDC24: .4byte gRfuLinkStatus
thumb_func_end sub_80FDA30
thumb_func_start sub_80FDC28
@@ -1387,7 +1387,7 @@ _080FDE64:
ldrh r0, [r4, 0x1A]
cmp r0, 0x1
beq _080FDE8A
- ldr r0, _080FDEB0 @ =gUnknown_3007460
+ ldr r0, _080FDEB0 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x8]
cmp r0, 0x4
@@ -1419,7 +1419,7 @@ _080FDEA0:
b _080FE16E
.align 2, 0
_080FDEAC: .4byte gUnknown_3005E10
-_080FDEB0: .4byte gUnknown_3007460
+_080FDEB0: .4byte gRfuLinkStatus
_080FDEB4:
cmp r6, 0
beq _080FDEBA
@@ -1563,7 +1563,7 @@ _080FDFB4:
beq _080FDFBA
b _080FE16E
_080FDFBA:
- ldr r2, _080FDFFC @ =gUnknown_3007460
+ ldr r2, _080FDFFC @ =gRfuLinkStatus
ldr r3, [r2]
ldrb r0, [r3, 0x3]
movs r1, 0
@@ -1600,7 +1600,7 @@ _080FDFEC:
beq _080FDFDC
b _080FE16E
.align 2, 0
-_080FDFFC: .4byte gUnknown_3007460
+_080FDFFC: .4byte gRfuLinkStatus
_080FE000:
cmp r6, 0
bne _080FE01E
@@ -1670,7 +1670,7 @@ _080FE078:
ldr r4, _080FE0B4 @ =gUnknown_3005E10
strb r6, [r4, 0x5]
strb r6, [r4, 0x4]
- ldr r0, _080FE0B8 @ =gUnknown_3007460
+ ldr r0, _080FE0B8 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x3]
bl sub_80FE818
@@ -1697,7 +1697,7 @@ _080FE08C:
b _080FE16E
.align 2, 0
_080FE0B4: .4byte gUnknown_3005E10
-_080FE0B8: .4byte gUnknown_3007460
+_080FE0B8: .4byte gRfuLinkStatus
_080FE0BC:
cmp r6, 0
bne _080FE16E
@@ -1758,7 +1758,7 @@ _080FE0E8:
strb r7, [r5, 0x5]
strb r7, [r5, 0x4]
bl sub_80FEAF4
- ldr r0, _080FE158 @ =gUnknown_3007460
+ ldr r0, _080FE158 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r1, [r0, 0x2]
ldrb r0, [r0, 0x3]
@@ -1772,7 +1772,7 @@ _080FE0E8:
bl sub_80FE7F0
b _080FE16E
.align 2, 0
-_080FE158: .4byte gUnknown_3007460
+_080FE158: .4byte gRfuLinkStatus
_080FE15C:
cmp r6, 0
bne _080FE16E
@@ -1811,7 +1811,7 @@ _080FE194:
ldrb r0, [r0]
cmp r0, 0
bne _080FE1CA
- ldr r4, _080FE1E0 @ =gUnknown_3007460
+ ldr r4, _080FE1E0 @ =gRfuLinkStatus
ldr r0, [r4]
ldrb r0, [r0]
cmp r0, 0
@@ -1839,7 +1839,7 @@ _080FE1D2:
_080FE1DC:
b _080FE322
.align 2, 0
-_080FE1E0: .4byte gUnknown_3007460
+_080FE1E0: .4byte gRfuLinkStatus
_080FE1E4:
mov r0, r8
cmp r0, 0x30
@@ -1906,7 +1906,7 @@ _080FE24E:
strb r0, [r3]
movs r3, 0
adds r7, r1, 0
- ldr r2, _080FE2AC @ =gUnknown_3007460
+ ldr r2, _080FE2AC @ =gRfuLinkStatus
mov r1, sp
movs r5, 0x1
adds r4, r7, 0
@@ -1947,7 +1947,7 @@ _080FE27A:
b _080FE2C2
.align 2, 0
_080FE2A8: .4byte gUnknown_3005E10
-_080FE2AC: .4byte gUnknown_3007460
+_080FE2AC: .4byte gRfuLinkStatus
_080FE2B0:
ldrb r0, [r7, 0x4]
subs r0, 0x6
@@ -1980,7 +1980,7 @@ _080FE2D6:
b _080FE322
_080FE2E6:
bl sub_80FE6F0
- ldr r0, _080FE300 @ =gUnknown_3007460
+ ldr r0, _080FE300 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0xFF
@@ -1990,7 +1990,7 @@ _080FE2E6:
bl sub_80FE7F0
b _080FE322
.align 2, 0
-_080FE300: .4byte gUnknown_3007460
+_080FE300: .4byte gRfuLinkStatus
_080FE304:
cmp r6, 0
bne _080FE326
@@ -2018,7 +2018,7 @@ _080FE326:
ldrb r0, [r7, 0x7]
cmp r0, 0x4
bne _080FE358
- ldr r2, _080FE354 @ =gUnknown_3007460
+ ldr r2, _080FE354 @ =gRfuLinkStatus
ldr r1, [r2]
movs r0, 0x1
strb r0, [r1]
@@ -2030,7 +2030,7 @@ _080FE326:
b _080FE388
.align 2, 0
_080FE350: .4byte gUnknown_3005E10
-_080FE354: .4byte gUnknown_3007460
+_080FE354: .4byte gRfuLinkStatus
_080FE358:
movs r1, 0
mov r3, r8
@@ -2075,7 +2075,7 @@ sub_80FE394: @ 80FE394
strb r0, [r4, 0xE]
movs r0, 0x1
strb r0, [r4, 0xF]
- ldr r0, _080FE3CC @ =gUnknown_3007460
+ ldr r0, _080FE3CC @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r5, [r0]
cmp r5, 0
@@ -2091,7 +2091,7 @@ sub_80FE394: @ 80FE394
b _080FE40C
.align 2, 0
_080FE3C8: .4byte gUnknown_3005E10
-_080FE3CC: .4byte gUnknown_3007460
+_080FE3CC: .4byte gRfuLinkStatus
_080FE3D0:
mov r0, sp
bl rfu_UNI_PARENT_getDRAC_ACK
@@ -2148,7 +2148,7 @@ sub_80FE418: @ 80FE418
bls _080FE436
b _080FE62A
_080FE436:
- ldr r0, _080FE4A0 @ =gUnknown_3007460
+ ldr r0, _080FE4A0 @ =gRfuLinkStatus
ldr r2, [r0]
ldrb r1, [r2, 0x2]
ldrb r0, [r3, 0xC]
@@ -2201,7 +2201,7 @@ _080FE46C:
b _080FE574
.align 2, 0
_080FE49C: .4byte gUnknown_3005E10
-_080FE4A0: .4byte gUnknown_3007460
+_080FE4A0: .4byte gRfuLinkStatus
_080FE4A4:
ldrb r1, [r7]
adds r0, r4, 0
@@ -2224,7 +2224,7 @@ _080FE4BE:
mov r10, r2
cmp r0, 0
beq _080FE574
- ldr r0, _080FE518 @ =gUnknown_3007450
+ ldr r0, _080FE518 @ =gRfuSlotStatusNI
lsls r1, r6, 2
adds r1, r0
ldr r1, [r1]
@@ -2242,7 +2242,7 @@ _080FE4BE:
ldr r0, _080FE51C @ =0x0000ffff
cmp r2, r0
beq _080FE508
- ldr r0, _080FE520 @ =gUnknown_3007460
+ ldr r0, _080FE520 @ =gRfuLinkStatus
ldr r0, [r0]
lsls r1, r6, 5
adds r0, r1
@@ -2264,9 +2264,9 @@ _080FE508:
orrs r5, r0
b _080FE53C
.align 2, 0
-_080FE518: .4byte gUnknown_3007450
+_080FE518: .4byte gRfuSlotStatusNI
_080FE51C: .4byte 0x0000ffff
-_080FE520: .4byte gUnknown_3007460
+_080FE520: .4byte gRfuLinkStatus
_080FE524:
lsls r1, r6, 1
adds r0, r3, 0
@@ -2331,7 +2331,7 @@ _080FE592:
cmp r0, 0
beq _080FE5CE
movs r5, 0x1
- ldr r0, _080FE600 @ =gUnknown_3007460
+ ldr r0, _080FE600 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x6]
cmp r0, 0
@@ -2378,7 +2378,7 @@ _080FE5CE:
.align 2, 0
_080FE5F8: .4byte 0x0000ffff
_080FE5FC: .4byte gUnknown_3005E10
-_080FE600: .4byte gUnknown_3007460
+_080FE600: .4byte gRfuLinkStatus
_080FE604:
cmp r0, 0x2
bne _080FE610
@@ -2435,7 +2435,7 @@ sub_80FE63C: @ 80FE63C
lsls r0, 16
cmp r0, 0
beq _080FE676
- ldr r1, _080FE6E8 @ =gUnknown_3007450
+ ldr r1, _080FE6E8 @ =gRfuSlotStatusNI
ldrb r0, [r4, 0x10]
lsls r0, 2
adds r0, r1
@@ -2481,7 +2481,7 @@ _080FE6B6:
bne _080FE6DA
strb r4, [r5, 0x5]
strb r4, [r5, 0x4]
- ldr r0, _080FE6EC @ =gUnknown_3007460
+ ldr r0, _080FE6EC @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r1, [r0, 0x2]
ldrb r0, [r0, 0x3]
@@ -2498,8 +2498,8 @@ _080FE6DA:
.align 2, 0
_080FE6E0: .4byte 0x04000208
_080FE6E4: .4byte gUnknown_3005E10
-_080FE6E8: .4byte gUnknown_3007450
-_080FE6EC: .4byte gUnknown_3007460
+_080FE6E8: .4byte gRfuSlotStatusNI
+_080FE6EC: .4byte gRfuLinkStatus
thumb_func_end sub_80FE63C
thumb_func_start sub_80FE6F0
@@ -2509,7 +2509,7 @@ sub_80FE6F0: @ 80FE6F0
ldrb r0, [r5, 0x4]
cmp r0, 0xF
bne _080FE73C
- ldr r1, _080FE748 @ =gUnknown_3007450
+ ldr r1, _080FE748 @ =gRfuSlotStatusNI
ldrb r2, [r5, 0x10]
lsls r0, r2, 2
adds r0, r1
@@ -2546,7 +2546,7 @@ _080FE73C:
bx r0
.align 2, 0
_080FE744: .4byte gUnknown_3005E10
-_080FE748: .4byte gUnknown_3007450
+_080FE748: .4byte gRfuSlotStatusNI
thumb_func_end sub_80FE6F0
thumb_func_start sub_80FE74C
@@ -2585,7 +2585,7 @@ sub_80FE778: @ 80FE778
push {r5-r7}
movs r6, 0
movs r5, 0
- ldr r1, _080FE7E4 @ =gUnknown_3007460
+ ldr r1, _080FE7E4 @ =gRfuLinkStatus
ldr r0, [r1]
ldrb r0, [r0, 0x8]
cmp r6, r0
@@ -2638,7 +2638,7 @@ _080FE7D4:
pop {r1}
bx r1
.align 2, 0
-_080FE7E4: .4byte gUnknown_3007460
+_080FE7E4: .4byte gRfuLinkStatus
_080FE7E8: .4byte gUnknown_3005E10
_080FE7EC: .4byte 0x0000ffff
thumb_func_end sub_80FE778
@@ -2690,14 +2690,14 @@ sub_80FE83C: @ 80FE83C
push {r4-r7,lr}
lsls r0, 24
lsrs r5, r0, 24
- ldr r0, _080FE908 @ =gUnknown_3007460
+ ldr r0, _080FE908 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x4]
cmp r0, 0
beq _080FE884
movs r4, 0
_080FE84E:
- ldr r1, _080FE90C @ =gUnknown_3007450
+ ldr r1, _080FE90C @ =gRfuSlotStatusNI
lsls r0, r4, 2
adds r0, r1
ldr r2, [r0]
@@ -2725,14 +2725,14 @@ _080FE87A:
cmp r4, 0x3
bls _080FE84E
_080FE884:
- ldr r0, _080FE908 @ =gUnknown_3007460
+ ldr r0, _080FE908 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x5]
cmp r0, 0
beq _080FE8C2
movs r4, 0
_080FE890:
- ldr r1, _080FE90C @ =gUnknown_3007450
+ ldr r1, _080FE90C @ =gRfuSlotStatusNI
lsls r0, r4, 2
adds r0, r1
ldr r2, [r0]
@@ -2758,7 +2758,7 @@ _080FE8B8:
cmp r4, 0x3
bls _080FE890
_080FE8C2:
- ldr r0, _080FE908 @ =gUnknown_3007460
+ ldr r0, _080FE908 @ =gRfuLinkStatus
ldr r3, [r0]
ldrb r2, [r3, 0x6]
cmp r2, 0
@@ -2768,7 +2768,7 @@ _080FE8C2:
ands r0, r2
strb r0, [r3, 0x6]
movs r4, 0
- ldr r7, _080FE910 @ =gUnknown_3007440
+ ldr r7, _080FE910 @ =gRfuSlotStatusUNI
ldr r6, _080FE914 @ =0x00008024
_080FE8DA:
lsls r0, r4, 2
@@ -2796,9 +2796,9 @@ _080FE900:
pop {r0}
bx r0
.align 2, 0
-_080FE908: .4byte gUnknown_3007460
-_080FE90C: .4byte gUnknown_3007450
-_080FE910: .4byte gUnknown_3007440
+_080FE908: .4byte gRfuLinkStatus
+_080FE90C: .4byte gRfuSlotStatusNI
+_080FE910: .4byte gRfuSlotStatusUNI
_080FE914: .4byte 0x00008024
thumb_func_end sub_80FE83C
@@ -2814,14 +2814,14 @@ sub_80FE918: @ 80FE918
ldrh r0, [r0, 0x18]
cmp r0, 0
beq _080FE9F4
- ldr r0, _080FEA08 @ =gUnknown_3007460
+ ldr r0, _080FEA08 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x4]
cmp r0, 0
beq _080FE9B8
movs r6, 0
_080FE938:
- ldr r3, _080FEA0C @ =gUnknown_3007450
+ ldr r3, _080FEA0C @ =gRfuSlotStatusNI
lsls r2, r6, 2
adds r0, r2, r3
ldr r0, [r0]
@@ -2889,14 +2889,14 @@ _080FE9AE:
cmp r6, 0x3
bls _080FE938
_080FE9B8:
- ldr r0, _080FEA08 @ =gUnknown_3007460
+ ldr r0, _080FEA08 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x5]
cmp r0, 0
beq _080FE9F4
movs r6, 0
_080FE9C4:
- ldr r1, _080FEA0C @ =gUnknown_3007450
+ ldr r1, _080FEA0C @ =gRfuSlotStatusNI
lsls r0, r6, 2
adds r0, r1
ldr r2, [r0]
@@ -2931,8 +2931,8 @@ _080FE9F4:
bx r0
.align 2, 0
_080FEA04: .4byte gUnknown_3005E10
-_080FEA08: .4byte gUnknown_3007460
-_080FEA0C: .4byte gUnknown_3007450
+_080FEA08: .4byte gRfuLinkStatus
+_080FEA0C: .4byte gRfuSlotStatusNI
thumb_func_end sub_80FE918
thumb_func_start sub_80FEA10
@@ -3002,7 +3002,7 @@ sub_80FEA78: @ 80FEA78
push {lr}
lsls r0, 16
lsrs r2, r0, 16
- ldr r0, _080FEA94 @ =gUnknown_3007460
+ ldr r0, _080FEA94 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r1, [r0, 0x4]
ldrb r0, [r0, 0x5]
@@ -3014,7 +3014,7 @@ sub_80FEA78: @ 80FEA78
movs r0, 0
b _080FEAAC
.align 2, 0
-_080FEA94: .4byte gUnknown_3007460
+_080FEA94: .4byte gRfuLinkStatus
_080FEA98: .4byte gUnknown_3005E10
_080FEA9C:
ldr r1, _080FEAB0 @ =gUnknown_3005E10
diff --git a/asm/link_rfu_2.s b/asm/link_rfu_2.s
index f37313210..10d4fd03d 100644
--- a/asm/link_rfu_2.s
+++ b/asm/link_rfu_2.s
@@ -132,12 +132,12 @@ _080F86F0: .4byte 0x04000208
thumb_func_start sub_80F86F4
sub_80F86F4: @ 80F86F4
push {r4,lr}
- ldr r0, _080F8728 @ =gUnknown_3001190
+ ldr r0, _080F8728 @ =gRfuAPIBuffer
ldr r1, _080F872C @ =0x00000e64
ldr r4, _080F8730 @ =gIntrTable + 0x4
adds r2, r4, 0
movs r3, 0x1
- bl sub_81E05B0
+ bl rfu_initializeAPI
lsls r0, 16
lsrs r1, r0, 16
cmp r1, 0
@@ -155,7 +155,7 @@ _080F8722:
pop {r0}
bx r0
.align 2, 0
-_080F8728: .4byte gUnknown_3001190
+_080F8728: .4byte gRfuAPIBuffer
_080F872C: .4byte 0x00000e64
_080F8730: .4byte gIntrTable + 0x4
_080F8734: .4byte gLinkType
@@ -871,7 +871,7 @@ _080F8D2A:
bge _080F8D2A
bl rfu_REQ_recvData
bl rfu_waitREQComplete
- ldr r1, _080F8D94 @ =gUnknown_3007440
+ ldr r1, _080F8D94 @ =gRfuSlotStatusUNI
ldr r3, _080F8D90 @ =gUnknown_3005450
ldr r0, _080F8D98 @ =0x000008f6
adds r4, r3, r0
@@ -911,7 +911,7 @@ _080F8D84:
bx r0
.align 2, 0
_080F8D90: .4byte gUnknown_3005450
-_080F8D94: .4byte gUnknown_3007440
+_080F8D94: .4byte gRfuSlotStatusUNI
_080F8D98: .4byte 0x000008f6
_080F8D9C: .4byte 0x00000988
_080F8DA0: .4byte 0x000008f7
@@ -1074,7 +1074,7 @@ sub_80F8ECC: @ 80F8ECC
ldrh r0, [r4, 0x4]
cmp r0, 0x7
bne _080F8F08
- ldr r0, _080F8F00 @ =gUnknown_3007460
+ ldr r0, _080F8F00 @ =gRfuLinkStatus
ldr r1, [r0]
ldr r2, _080F8F04 @ =0x000008f5
adds r0, r4, r2
@@ -1093,7 +1093,7 @@ sub_80F8ECC: @ 80F8ECC
b _080F8F0A
.align 2, 0
_080F8EFC: .4byte gUnknown_3005450
-_080F8F00: .4byte gUnknown_3007460
+_080F8F00: .4byte gRfuLinkStatus
_080F8F04: .4byte 0x000008f5
_080F8F08:
movs r0, 0
@@ -1363,7 +1363,7 @@ _080F90D8: .4byte 0x000008f2
thumb_func_start IsRfuRecvQueueEmpty
IsRfuRecvQueueEmpty: @ 80F90DC
push {r4,lr}
- ldr r0, _080F90EC @ =gUnknown_3007460
+ ldr r0, _080F90EC @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x6]
cmp r0, 0
@@ -1372,7 +1372,7 @@ _080F90E8:
movs r0, 0
b _080F9110
.align 2, 0
-_080F90EC: .4byte gUnknown_3007460
+_080F90EC: .4byte gRfuLinkStatus
_080F90F0:
movs r3, 0
ldr r4, _080F9118 @ =gRecvCmds
@@ -1422,7 +1422,7 @@ _080F913C:
strb r0, [r1]
ldr r0, _080F919C @ =0x0000099a
adds r1, r6, r0
- ldr r0, _080F91A0 @ =gUnknown_3007460
+ ldr r0, _080F91A0 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r1, [r1]
ldrb r0, [r0, 0x2]
@@ -1460,7 +1460,7 @@ _080F913C:
.align 2, 0
_080F9198: .4byte 0x00000993
_080F919C: .4byte 0x0000099a
-_080F91A0: .4byte gUnknown_3007460
+_080F91A0: .4byte gRfuLinkStatus
_080F91A4: .4byte 0x00000994
_080F91A8: .4byte 0x0000099b
_080F91AC: .4byte 0x0000099c
@@ -1815,7 +1815,7 @@ _080F947E:
adds r0, r6, r1
ldrb r0, [r0]
adds r1, r0, 0
- ldr r0, _080F94A0 @ =gUnknown_3007460
+ ldr r0, _080F94A0 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x6]
cmp r0, 0
@@ -1826,7 +1826,7 @@ _080F947E:
.align 2, 0
_080F9498: .4byte 0x00000994
_080F949C: .4byte gUnknown_3005450
-_080F94A0: .4byte gUnknown_3007460
+_080F94A0: .4byte gRfuLinkStatus
_080F94A4:
movs r0, 0
b _080F94AA
@@ -1950,7 +1950,7 @@ _080F9538:
ldrb r0, [r0]
cmp r0, 0
beq _080F95E4
- ldr r0, _080F964C @ =gUnknown_3007460
+ ldr r0, _080F964C @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r1, [r0, 0x2]
ldrb r0, [r0, 0x3]
@@ -2042,7 +2042,7 @@ _080F963C: .4byte gRecvCmds
_080F9640: .4byte gUnknown_3005E10
_080F9644: .4byte gUnknown_3005450
_080F9648: .4byte 0x0000099c
-_080F964C: .4byte gUnknown_3007460
+_080F964C: .4byte gRfuLinkStatus
_080F9650: .4byte gReceivedRemoteLinkPlayers
_080F9654: .4byte 0x00000988
_080F9658: .4byte gSendCmd
@@ -2435,7 +2435,7 @@ _080F9902:
beq _080F9914
b _080F9C40
_080F9914:
- ldr r0, _080F9944 @ =gUnknown_3007460
+ ldr r0, _080F9944 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
mov r6, r8
@@ -2458,7 +2458,7 @@ _080F9924:
.align 2, 0
_080F993C: .4byte gUnknown_3005450
_080F9940: .4byte gReceivedRemoteLinkPlayers
-_080F9944: .4byte gUnknown_3007460
+_080F9944: .4byte gRfuLinkStatus
_080F9948: .4byte gRecvCmds + 2
_080F994C: .4byte gRecvCmds + 4
_080F9950: .4byte gUnknown_3005DD6
@@ -2688,7 +2688,7 @@ _080F9B00:
ldr r0, _080F9B54 @ =gRecvCmds + 2
adds r4, r5, r0
ldrh r1, [r4]
- ldr r0, _080F9B58 @ =gUnknown_3007460
+ ldr r0, _080F9B58 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0, 0x2]
ands r1, r0
@@ -2715,7 +2715,7 @@ _080F9B38:
_080F9B4C: .4byte gUnknown_3005450
_080F9B50: .4byte gReceivedRemoteLinkPlayers
_080F9B54: .4byte gRecvCmds + 2
-_080F9B58: .4byte gUnknown_3007460
+_080F9B58: .4byte gRfuLinkStatus
_080F9B5C: .4byte gRecvCmds + 4
_080F9B60: .4byte 0x0000099c
_080F9B64: .4byte gRecvCmds
@@ -3502,7 +3502,7 @@ _080FA13C: .4byte gUnknown_3005450
thumb_func_start sub_80FA140
sub_80FA140: @ 80FA140
push {lr}
- ldr r0, _080FA15C @ =gUnknown_3007460
+ ldr r0, _080FA15C @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r1, [r0, 0x2]
ldrb r0, [r0, 0x3]
@@ -3513,7 +3513,7 @@ sub_80FA140: @ 80FA140
pop {r0}
bx r0
.align 2, 0
-_080FA15C: .4byte gUnknown_3007460
+_080FA15C: .4byte gRfuLinkStatus
thumb_func_end sub_80FA140
thumb_func_start sub_80FA160
@@ -3552,7 +3552,7 @@ sub_80FA190: @ 80FA190
adds r1, r2, r0
movs r0, 0x1
strb r0, [r1]
- ldr r0, _080FA1BC @ =gUnknown_3007460
+ ldr r0, _080FA1BC @ =gRfuLinkStatus
ldr r1, [r0]
ldrb r0, [r1, 0x2]
ldrb r1, [r1, 0x3]
@@ -3565,7 +3565,7 @@ sub_80FA190: @ 80FA190
.align 2, 0
_080FA1B4: .4byte gUnknown_3005450
_080FA1B8: .4byte 0x0000099c
-_080FA1BC: .4byte gUnknown_3007460
+_080FA1BC: .4byte gRfuLinkStatus
_080FA1C0: .4byte 0x0000099b
thumb_func_end sub_80FA190
@@ -4065,7 +4065,7 @@ _080FA53A:
lsrs r0, 24
cmp r0, 0x1
bls _080FA5C2
- ldr r1, _080FA5A0 @ =gUnknown_3007450
+ ldr r1, _080FA5A0 @ =gRfuSlotStatusNI
lsls r0, r5, 2
adds r0, r1
ldr r0, [r0]
@@ -4103,7 +4103,7 @@ _080FA55E:
_080FA594: .4byte gUnknown_3005450
_080FA598: .4byte 0x000008f6
_080FA59C: .4byte 0x00000989
-_080FA5A0: .4byte gUnknown_3007450
+_080FA5A0: .4byte gRfuSlotStatusNI
_080FA5A4: .4byte 0x0000098d
_080FA5A8:
mov r2, r8
@@ -4300,7 +4300,7 @@ sub_80FA6FC: @ 80FA6FC
movs r0, 0x2
b _080FA732
_080FA718:
- ldr r1, _080FA72C @ =gUnknown_3007450
+ ldr r1, _080FA72C @ =gRfuSlotStatusNI
lsls r0, 2
adds r0, r1
ldr r0, [r0]
@@ -4310,7 +4310,7 @@ _080FA718:
movs r0, 0
b _080FA732
.align 2, 0
-_080FA72C: .4byte gUnknown_3007450
+_080FA72C: .4byte gRfuSlotStatusNI
_080FA730:
movs r0, 0x1
_080FA732:
@@ -4327,7 +4327,7 @@ sub_80FA738: @ 80FA738
ldr r1, _080FA780 @ =0x0000098d
adds r5, r0, r1
_080FA746:
- ldr r1, _080FA784 @ =gUnknown_3007450
+ ldr r1, _080FA784 @ =gRfuSlotStatusNI
lsls r0, r4, 2
adds r0, r1
ldr r0, [r0]
@@ -4358,7 +4358,7 @@ _080FA770:
.align 2, 0
_080FA77C: .4byte gUnknown_3005450
_080FA780: .4byte 0x0000098d
-_080FA784: .4byte gUnknown_3007450
+_080FA784: .4byte gRfuSlotStatusNI
thumb_func_end sub_80FA738
thumb_func_start sub_80FA788
@@ -4371,7 +4371,7 @@ sub_80FA788: @ 80FA788
ldrb r0, [r0]
cmp r0, 0x8
bne _080FA7C2
- ldr r2, _080FA808 @ =gUnknown_3007450
+ ldr r2, _080FA808 @ =gRfuSlotStatusNI
ldr r0, _080FA80C @ =0x000008f6
adds r1, r0
ldrb r0, [r1]
@@ -4393,7 +4393,7 @@ _080FA7BA:
movs r0, 0x4
bl rfu_clearSlot
_080FA7C2:
- ldr r2, _080FA808 @ =gUnknown_3007450
+ ldr r2, _080FA808 @ =gRfuSlotStatusNI
ldr r5, _080FA800 @ =gUnknown_3005450
ldr r0, _080FA80C @ =0x000008f6
adds r1, r5, r0
@@ -4425,7 +4425,7 @@ _080FA7E6:
.align 2, 0
_080FA800: .4byte gUnknown_3005450
_080FA804: .4byte 0x0000093d
-_080FA808: .4byte gUnknown_3007450
+_080FA808: .4byte gRfuSlotStatusNI
_080FA80C: .4byte 0x000008f6
_080FA810: .4byte 0x0000093e
_080FA814:
@@ -5772,7 +5772,7 @@ _080FB21E:
ands r0, r1
cmp r0, 0
beq _080FB286
- ldr r0, _080FB274 @ =gUnknown_3007460
+ ldr r0, _080FB274 @ =gRfuLinkStatus
lsls r1, r5, 5
adds r1, 0x14
ldr r0, [r0]
@@ -5803,7 +5803,7 @@ _080FB21E:
_080FB268: .4byte gUnknown_3005E10
_080FB26C: .4byte gUnknown_3005450
_080FB270: .4byte 0x0000098d
-_080FB274: .4byte gUnknown_3007460
+_080FB274: .4byte gRfuLinkStatus
_080FB278: .4byte 0x00000989
_080FB27C:
mov r0, r8
@@ -6216,7 +6216,7 @@ sub_80FB5A0: @ 80FB5A0
movs r3, 0
movs r2, 0
movs r4, 0x1
- ldr r6, _080FB5E8 @ =gUnknown_3007460
+ ldr r6, _080FB5E8 @ =gRfuLinkStatus
movs r7, 0x7F
_080FB5AE:
adds r0, r5, 0
@@ -6249,7 +6249,7 @@ _080FB5D4:
pop {r1}
bx r1
.align 2, 0
-_080FB5E8: .4byte gUnknown_3007460
+_080FB5E8: .4byte gRfuLinkStatus
thumb_func_end sub_80FB5A0
thumb_func_start sub_80FB5EC
@@ -6601,7 +6601,7 @@ _080FB894:
adds r1, 0xF0
movs r0, 0x3
strb r0, [r1]
- ldr r0, _080FB8B8 @ =gUnknown_3007460
+ ldr r0, _080FB8B8 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0
@@ -6615,7 +6615,7 @@ _080FB8AA:
b _080FB9C0
.align 2, 0
_080FB8B4: .4byte gUnknown_3005450
-_080FB8B8: .4byte gUnknown_3007460
+_080FB8B8: .4byte gRfuLinkStatus
_080FB8BC: .4byte 0x000008f4
_080FB8C0:
ldr r0, _080FB900 @ =gUnknown_3005450
@@ -6674,7 +6674,7 @@ _080FB916:
movs r0, 0
bl sub_80FD760
_080FB934:
- ldr r0, _080FB96C @ =gUnknown_3007460
+ ldr r0, _080FB96C @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0xFF
@@ -6700,7 +6700,7 @@ _080FB95A:
.align 2, 0
_080FB964: .4byte 0x0000099c
_080FB968: .4byte gReceivedRemoteLinkPlayers
-_080FB96C: .4byte gUnknown_3007460
+_080FB96C: .4byte gRfuLinkStatus
_080FB970: .4byte gUnknown_3005E10
_080FB974: .4byte sub_80F8B34
_080FB978: .4byte gUnknown_3005450
@@ -7108,7 +7108,7 @@ sub_80FBC70: @ 80FBC70
movs r0, 0xFF
mov r9, r0
movs r7, 0
- ldr r1, _080FBCF4 @ =gUnknown_3007460
+ ldr r1, _080FBCF4 @ =gRfuLinkStatus
mov r8, r1
_080FBC8E:
lsls r4, r7, 5
@@ -7162,7 +7162,7 @@ _080FBCE2:
pop {r1}
bx r1
.align 2, 0
-_080FBCF4: .4byte gUnknown_3007460
+_080FBCF4: .4byte gRfuLinkStatus
thumb_func_end sub_80FBC70
thumb_func_start sub_80FBCF8
@@ -7391,7 +7391,7 @@ sub_80FBE80: @ 80FBE80
lsrs r2, r0, 24
cmp r2, 0xFF
beq _080FBF18
- ldr r0, _080FBEDC @ =gUnknown_3007460
+ ldr r0, _080FBEDC @ =gRfuLinkStatus
ldr r0, [r0]
lsls r1, r2, 5
adds r0, r1
@@ -7408,7 +7408,7 @@ sub_80FBE80: @ 80FBE80
b _080FBF10
.align 2, 0
_080FBED8: .4byte gTasks+0x8
-_080FBEDC: .4byte gUnknown_3007460
+_080FBEDC: .4byte gRfuLinkStatus
_080FBEE0: .4byte gUnknown_3005450
_080FBEE4: .4byte 0x000008f5
_080FBEE8:
@@ -7638,7 +7638,7 @@ _080FC070:
beq _080FC108
movs r1, 0xA
ldrsh r0, [r4, r1]
- ldr r7, _080FC0F4 @ =gUnknown_3007460
+ ldr r7, _080FC0F4 @ =gRfuLinkStatus
lsls r4, r2, 5
adds r2, r4, 0
adds r2, 0x14
@@ -7670,7 +7670,7 @@ _080FC0E4: .4byte gTasks
_080FC0E8: .4byte 0x00000985
_080FC0EC: .4byte gUnknown_3005E10
_080FC0F0: .4byte 0x00000119
-_080FC0F4: .4byte gUnknown_3007460
+_080FC0F4: .4byte gRfuLinkStatus
_080FC0F8:
movs r1, 0xE0
lsls r1, 7
@@ -7845,7 +7845,7 @@ sub_80FC228: @ 80FC228
movs r2, 0x13
movs r3, 0x2
bl nullsub_88
- ldr r4, _080FC2F8 @ =gUnknown_3007460
+ ldr r4, _080FC2F8 @ =gRfuLinkStatus
ldr r0, [r4]
ldrb r0, [r0, 0x2]
movs r1, 0x14
@@ -7934,7 +7934,7 @@ _080FC2CE:
bl nullsub_87
b _080FC436
.align 2, 0
-_080FC2F8: .4byte gUnknown_3007460
+_080FC2F8: .4byte gRfuLinkStatus
_080FC2FC: .4byte gUnknown_3005450
_080FC300: .4byte gUnknown_843EE64
_080FC304:
@@ -7969,7 +7969,7 @@ _080FC318:
adds r6, 0x1
cmp r6, 0x3
ble _080FC318
- ldr r5, _080FC394 @ =gUnknown_3007460
+ ldr r5, _080FC394 @ =gRfuLinkStatus
ldr r1, [r5]
ldr r4, _080FC398 @ =gUnknown_3005450
ldr r0, _080FC39C @ =0x000008f6
@@ -8004,12 +8004,12 @@ _080FC318:
.align 2, 0
_080FC38C: .4byte gUnknown_843EE47
_080FC390: .4byte gUnknown_843EE57
-_080FC394: .4byte gUnknown_3007460
+_080FC394: .4byte gRfuLinkStatus
_080FC398: .4byte gUnknown_3005450
_080FC39C: .4byte 0x000008f6
_080FC3A0:
movs r6, 0
- ldr r1, _080FC440 @ =gUnknown_3007460
+ ldr r1, _080FC440 @ =gRfuLinkStatus
ldr r0, [r1]
ldrb r0, [r0, 0x8]
cmp r6, r0
@@ -8088,7 +8088,7 @@ _080FC436:
pop {r0}
bx r0
.align 2, 0
-_080FC440: .4byte gUnknown_3007460
+_080FC440: .4byte gRfuLinkStatus
_080FC444: .4byte gUnknown_843EE47
_080FC448: .4byte gUnknown_843EE57
thumb_func_end sub_80FC228
@@ -9032,7 +9032,7 @@ sub_80FCADC: @ 80FCADC
lsls r0, 24
lsrs r5, r0, 24
movs r6, 0
- ldr r0, _080FCB04 @ =gUnknown_3007460
+ ldr r0, _080FCB04 @ =gRfuLinkStatus
ldr r4, [r0]
ldrb r2, [r4, 0x2]
ldrb r1, [r4]
@@ -9048,7 +9048,7 @@ sub_80FCADC: @ 80FCADC
ldrb r0, [r4, 0xA]
b _080FCB4C
.align 2, 0
-_080FCB04: .4byte gUnknown_3007460
+_080FCB04: .4byte gRfuLinkStatus
_080FCB08:
adds r0, r6, 0x1
lsls r0, 24
@@ -9234,7 +9234,7 @@ sub_80FCC3C: @ 80FCC3C
bne _080FCC98
movs r0, 0x1
mov r9, r0
- ldr r6, _080FCC94 @ =gUnknown_3007460
+ ldr r6, _080FCC94 @ =gRfuLinkStatus
ldr r0, [r6]
lsls r4, r5, 5
adds r0, r4
@@ -9261,11 +9261,11 @@ _080FCC78:
b _080FCCE4
.align 2, 0
_080FCC90: .4byte gUnknown_3005E10
-_080FCC94: .4byte gUnknown_3007460
+_080FCC94: .4byte gRfuLinkStatus
_080FCC98:
movs r0, 0
mov r9, r0
- ldr r6, _080FCCCC @ =gUnknown_3007460
+ ldr r6, _080FCCCC @ =gRfuLinkStatus
ldr r0, [r6]
lsls r4, r5, 5
adds r0, r4
@@ -9288,7 +9288,7 @@ _080FCCB0:
bl memcpy
b _080FCCE4
.align 2, 0
-_080FCCCC: .4byte gUnknown_3007460
+_080FCCCC: .4byte gRfuLinkStatus
_080FCCD0:
adds r0, r7, 0
movs r1, 0
@@ -9315,7 +9315,7 @@ sub_80FCCF4: @ 80FCCF4
adds r5, r1, 0
lsls r2, 24
movs r7, 0
- ldr r6, _080FCD2C @ =gUnknown_3007460
+ ldr r6, _080FCD2C @ =gRfuLinkStatus
ldr r0, [r6]
lsrs r4, r2, 19
adds r2, r0, r4
@@ -9337,7 +9337,7 @@ sub_80FCCF4: @ 80FCCF4
movs r7, 0x1
b _080FCD48
.align 2, 0
-_080FCD2C: .4byte gUnknown_3007460
+_080FCD2C: .4byte gRfuLinkStatus
_080FCD30: .4byte 0x00007f7d
_080FCD34:
adds r0, r3, 0
@@ -9388,7 +9388,7 @@ CreateWirelessStatusIndicatorSprite: @ 80FCD74
movs r3, 0xE7
movs r2, 0x8
_080FCD8A:
- ldr r0, _080FCDCC @ =gUnknown_3007460
+ ldr r0, _080FCDCC @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0x1
@@ -9420,7 +9420,7 @@ _080FCD8A:
strb r5, [r0]
b _080FCE2A
.align 2, 0
-_080FCDCC: .4byte gUnknown_3007460
+_080FCDCC: .4byte gRfuLinkStatus
_080FCDD0: .4byte gUnknown_843F284
_080FCDD4: .4byte gSprites
_080FCDD8: .4byte 0x00001234
@@ -9551,7 +9551,7 @@ _080FCEE0: .4byte gUnknown_203ACE4
thumb_func_start sub_80FCEE4
sub_80FCEE4: @ 80FCEE4
push {r4,lr}
- ldr r1, _080FCF04 @ =gUnknown_3007460
+ ldr r1, _080FCF04 @ =gRfuLinkStatus
ldr r0, [r1]
ldrb r2, [r0, 0x2]
movs r3, 0
@@ -9567,7 +9567,7 @@ _080FCEF0:
ldrb r0, [r0]
b _080FCF16
.align 2, 0
-_080FCF04: .4byte gUnknown_3007460
+_080FCF04: .4byte gRfuLinkStatus
_080FCF08:
lsrs r2, 1
adds r0, r3, 0x1
@@ -9626,7 +9626,7 @@ _080FCF5C:
adds r6, r2, 0
movs r5, 0xFF
movs r4, 0
- ldr r0, _080FCF84 @ =gUnknown_3007460
+ ldr r0, _080FCF84 @ =gRfuLinkStatus
ldr r0, [r0]
ldrb r0, [r0]
cmp r0, 0x1
@@ -9641,7 +9641,7 @@ _080FCF5C:
_080FCF78: .4byte gUnknown_203ACE4
_080FCF7C: .4byte gSprites
_080FCF80: .4byte 0x00001234
-_080FCF84: .4byte gUnknown_3007460
+_080FCF84: .4byte gRfuLinkStatus
_080FCF88:
adds r0, r4, 0x1
lsls r0, 24
diff --git a/asm/link_rfu_3.s b/asm/link_rfu_3.s
index 3b76df047..1f47f7214 100644
--- a/asm/link_rfu_3.s
+++ b/asm/link_rfu_3.s
@@ -10493,7 +10493,7 @@ _0811AFF8:
_0811AFFA:
cmp r4, 0x3
bgt _0811B030
- ldr r0, _0811B044 @ =gUnknown_3007460
+ ldr r0, _0811B044 @ =gRfuLinkStatus
ldr r0, [r0]
lsls r1, r4, 5
adds r0, r1
@@ -10526,7 +10526,7 @@ _0811B030:
bl StringCopy
b _0811B080
.align 2, 0
-_0811B044: .4byte gUnknown_3007460
+_0811B044: .4byte gRfuLinkStatus
_0811B048: .4byte gSpeciesNames
_0811B04C: .4byte gUnknown_8457DB8
_0811B050:
diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt
new file mode 100644
index 000000000..4b742dcd2
--- /dev/null
+++ b/common_syms/librfu_rfu.txt
@@ -0,0 +1,5 @@
+gRfuSlotStatusUNI
+gRfuSlotStatusNI
+gRfuLinkStatus
+gRfuStatic
+gRfuFixed
diff --git a/common_syms/librfu_s32id.txt b/common_syms/librfu_s32id.txt
new file mode 100644
index 000000000..6c24cc4a4
--- /dev/null
+++ b/common_syms/librfu_s32id.txt
@@ -0,0 +1 @@
+gRfuS32Id
diff --git a/common_syms/librfu_stwi.txt b/common_syms/librfu_stwi.txt
new file mode 100644
index 000000000..a1f773553
--- /dev/null
+++ b/common_syms/librfu_stwi.txt
@@ -0,0 +1 @@
+gSTWIStatus
diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s
deleted file mode 100644
index c6ca84f4b..000000000
--- a/data/librfu_rodata.s
+++ /dev/null
@@ -1,28 +0,0 @@
- .section .rodata
-
- .set VERSION_MAJOR, 1
- .set VERSION_MINOR, 0
- .set VERSION_REVISION, 24
-
- .align 2
-_Str_RfuHeader::
- .byte 2, 14, 0, 10, 9, 5, 7, 2
- .byte 0, 15, 1, 3, 3, 0, 31, 0
- .byte 3, 22, 18, 14, 13, 9, 11, 3
- .byte 15, 15, 1, 3, 3, 0, 0x7f, 0
-
- .ascii "RFU_V"
- .byte VERSION_MAJOR + 0x30
- .byte VERSION_MINOR + 0x30
- .byte (VERSION_REVISION / 10) + 0x30
- .byte (VERSION_REVISION % 10) + 0x30
- .byte 0
-
- .align 2
-_Str_RFU_MBOOT::
- .asciz "RFU-MBOOT"
-
- .align 2
-_Str_Sio32ID::
- .asciz "NINTENDOSio32ID_030820"
-
diff --git a/include/constants/trade.h b/include/constants/trade.h
index b1371caab..b22cd26d2 100644
--- a/include/constants/trade.h
+++ b/include/constants/trade.h
@@ -1,4 +1,4 @@
- #ifndef GUARD_CONSTANTS_TRADE_H
+#ifndef GUARD_CONSTANTS_TRADE_H
#define GUARD_CONSTANTS_TRADE_H
// TODO: document trade.c and trade_scene.c with corresponding macros
@@ -115,4 +115,4 @@
#define CANT_REGISTER_MON 1
#define CANT_REGISTER_EGG 2
-#endif //GUARD_CONSTANTS_TRADE_H
+#endif // GUARD_CONSTANTS_TRADE_H
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 6d54bc5fb..548e27163 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -137,6 +137,8 @@
#define REG_OFFSET_DMA3CNT_H 0xde
#define REG_OFFSET_TMCNT 0x100
+#define REG_OFFSET_TMCNT_L 0x100
+#define REG_OFFSET_TMCNT_H 0x102
#define REG_OFFSET_TM0CNT 0x100
#define REG_OFFSET_TM0CNT_L 0x100
#define REG_OFFSET_TM0CNT_H 0x102
@@ -298,6 +300,8 @@
#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H)
#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT)
+#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L)
+#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H)
#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT)
#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L)
#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H)
@@ -457,7 +461,9 @@
#define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L)
#define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H)
-#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4)))
+#define REG_TMCNT(n) (*(vu32 *)(REG_ADDR_TMCNT + ((n) * 4)))
+#define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4)))
+#define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4)))
#define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT)
#define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L)
#define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H)
diff --git a/include/gba/macro.h b/include/gba/macro.h
index e416c3577..a3e870210 100644
--- a/include/gba/macro.h
+++ b/include/gba/macro.h
@@ -105,7 +105,7 @@
} \
}
-#define DmaClearLarge(dmaNum, dest, size, block, bit) \
+#define DmaClearLarge(dmaNum, dest, size, block, bit) \
{ \
u32 _size = size; \
while (1) \
@@ -170,4 +170,14 @@
#define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16)
#define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32)
+#define IntrEnable(flags) \
+{ \
+ u16 imeTemp; \
+ \
+ imeTemp = REG_IME; \
+ REG_IME = 0; \
+ REG_IE |= flags; \
+ REG_IME = imeTemp; \
+}
+
#endif // GUARD_GBA_MACRO_H
diff --git a/include/gba/syscall.h b/include/gba/syscall.h
index deddec5ba..22fdf09fa 100644
--- a/include/gba/syscall.h
+++ b/include/gba/syscall.h
@@ -45,4 +45,6 @@ void RLUnCompVram(const void *src, void *dest);
int MultiBoot(struct MultiBootParam *mp);
+s32 Div(s32 num, s32 denom);
+
#endif // GUARD_GBA_SYSCALL_H
diff --git a/include/librfu.h b/include/librfu.h
index 69f0bb695..f5a7b4d96 100644
--- a/include/librfu.h
+++ b/include/librfu.h
@@ -1,84 +1,290 @@
#ifndef GUARD_LIBRFU_H
#define GUARD_LIBRFU_H
+#include "global.h"
#include "main.h"
-enum
-{
- RFU_RESET = 0x10,
- RFU_LINK_STATUS,
- RFU_VERSION_STATUS,
- RFU_SYSTEM_STATUS,
- RFU_SLOT_STATUS,
- RFU_CONFIG_STATUS,
- RFU_GAME_CONFIG,
- RFU_SYSTEM_CONFIG,
- RFU_UNK18,
- RFU_SC_START,
- RFU_SC_POLLING,
- RFU_SC_END,
- RFU_SP_START,
- RFU_SP_POLLING,
- RFU_SP_END,
- RFU_CP_START,
- RFU_CP_POLLING,
- RFU_CP_END,
- RFU_UNK22,
- RFU_UNK23,
- RFU_DATA_TX,
- RFU_DATA_TX_AND_CHANGE,
- RFU_DATA_RX,
- RFU_MS_CHANGE,
- RFU_DATA_READY_AND_CHANGE,
- RFU_DISCONNECTED_AND_CHANGE,
- RFU_UNK2A,
- RFU_UNK2B,
- RFU_UNK2C,
- RFU_UNK2D,
- RFU_UNK2E,
- RFU_UNK2F,
- RFU_DISCONNECT,
- RFU_TEST_MODE,
- RFU_CPR_START,
- RFU_CPR_POLLING,
- RFU_CPR_END,
- RFU_UNK35,
- RFU_UNK36,
- RFU_RESUME_RETRANSMIT_AND_CHANGE,
- RFU_UNK38,
- RFU_UNK39,
- RFU_UNK3A,
- RFU_UNK3B,
- RFU_UNK3C,
- RFU_STOP_MODE, //3D
-};
+/* TODOs:
+ * - split files
+ * - documentation
+ * - decompile librfu_intr.s once arm support is back again
+ (for internal structs not documented in SDK)
+ * - check if any field needs to be volatile
+ * - check if field names make sense
+ */
-struct RfuPacket8
-{
- u8 data[0x74];
-};
+// --------------------------------------------------------------------------
+//
+// Restrictions When Using RFU
+//
+// --------------------------------------------------------------------------
+/*
+ The following restrictions apply when using RFU.
-struct RfuPacket32
-{
- u32 command;
- u32 data[0x1C];
-};
+ <Restrictions for Direct Sound>
+ (a) The timer for Sound DMA uses only 0
+ (b) The prescaler for the timer count for the Sound DMA uses 59.5 ns.
+ (c) The sound sampling rate is Max36.314KHz.
-union RfuPacket
-{
- struct RfuPacket32 rfuPacket32;
- struct RfuPacket8 rfuPacket8;
-};
+ <Restrictions for H-DMA or DMA started with V-Blank>
+ These types of DMA can be operated on a maximum CPU cycle of 42 cycles.
+ Calculate the number of the transferable DMA count based on this 42 cycles and the access cycles of the destination and source.
+ For example, if both the CPU internal RAM --> VRAM have a one cycle access, then a 21 count DMA can occur.
+
+
+ If RFU is used outside of these restrictions, problems, such as the loss of data caused by the failure of the AGB, as a clock slave,
+ to notify that data has been received from the RFU, will occur.
+ When this problem occurs, the REQ callback will send a REQ_commandID=ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ notification.
+ (When using Link Manager, the LMAN call back will send a LMAN_msg=LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA notification.)
+
+*/
+
+// REQ-COMMAND (STWI) ID CODE LIST
+
+// REQ Command ID returned by the REQ callback
+#define ID_RESET_REQ 0x0010
+#define ID_LINK_STATUS_REQ 0x0011
+#define ID_VERSION_STATUS_REQ 0x0012 // not defined in SDK header
+#define ID_SYSTEM_STATUS_REQ 0x0013
+#define ID_SLOT_STATUS_REQ 0x0014 // not defined in SDK header
+#define ID_CONFIG_STATUS_REQ 0x0015 // not defined in SDK header
+#define ID_GAME_CONFIG_REQ 0x0016
+#define ID_SYSTEM_CONFIG_REQ 0x0017
+#define ID_SC_START_REQ 0x0019
+#define ID_SC_POLL_REQ 0x001a
+#define ID_SC_END_REQ 0x001b
+#define ID_SP_START_REQ 0x001c
+#define ID_SP_POLL_REQ 0x001d
+#define ID_SP_END_REQ 0x001e
+#define ID_CP_START_REQ 0x001f
+#define ID_CP_POLL_REQ 0x0020
+#define ID_CP_END_REQ 0x0021
+#define ID_DATA_TX_REQ 0x0024
+#define ID_DATA_TX_AND_CHANGE_REQ 0x0025
+#define ID_DATA_RX_REQ 0x0026
+#define ID_MS_CHANGE_REQ 0x0027 // When returned by the REQ callback, this ID indicates that execution of rfu_REQ_changeMasterSlave has finished.
+ // This ID is returned by both the REQ callback and the MSC callback.
+ // When returned by the MSC callback, this is notification that after the AGB has been made into the clock slave, the MC_Timer expired and the RFU returned the AGB to be the clock master.
+#define ID_DISCONNECT_REQ 0x0030
+#define ID_TEST_MODE_REQ 0x0031 // not defined in SDK header
+#define ID_CPR_START_REQ 0x0032
+#define ID_CPR_POLL_REQ 0x0033
+#define ID_CPR_END_REQ 0x0034
+#define ID_UNK35_REQ 0x0035 // not defined in SDK header
+#define ID_RESUME_RETRANSMIT_AND_CHANGE_REQ 0x0037
+#define ID_STOP_MODE_REQ 0x003d
+#define ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ 0x00ff // When the AGB is the clock slave, the RFU generates an informational notice, and an automatically started DMA, such as HDMA, is generated at the instant the AGB is being returned as the clock master. This ID is notified by a REQ callback when the exchange of this information (REQ command) fails.
+
+// REQ Command ID returned by the MSC callback
+#define ID_DISCONNECTED_AND_CHANGE_REQ 0x0029
+#define ID_DATA_READY_AND_CHANGE_REQ 0x0028
+#define ID_DRAC_REQ_WITH_ACK_FLAG 0x0128
+
+// --------------------------------------------------------------------------
+//
+// Data Definitions
+//
+// --------------------------------------------------------------------------
+
+#define RFU_ID 0x00008001 // ID number of AGB-RFU device: ID returned by execution of rfu_REQBN_softReset_and_checkID.
+
+#define RFU_MBOOT_DOWNLOADER_SERIAL_NO 0x0000 // The game serial number of the multi-boot downloader (programs that boot without a Game Pak)
+
+#define RFU_API_BUFF_SIZE_RAM 0x0e8c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM)
+#define RFU_API_BUFF_SIZE_ROM 0x052c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM)
+
+#define RFU_CHILD_MAX 4 // Maximum number of slaves that can be connected to one parent device
+
+#define RFU_GAME_NAME_LENGTH 13 // Possible length of game name set by rfu_REQB_configGameData
+#define RFU_USER_NAME_LENGTH 8 // Possible length of user name set by rfu_REQB_configGameData
+
+#define RFU_H_DMA_MAX_CPU_CYCLE 42 // Maximum number of CPU cycles for H-DMA or DMA that starts with V-Blank that can operate when using RFU
+
+// Value to determine the level of the icon that displays the link strength of the wireless status (value of rfuLinkStatus->strength[0-3])
+#define RFU_LINK_ICON_LEVEL4_MAX 255 // 90% -100% (If the value is betwen 229 and 255, the icon level is 4)
+#define RFU_LINK_ICON_LEVEL4_MIN 229
+#define RFU_LINK_ICON_LEVEL3_MAX 228 // 50% - 89% (If the value is betwen 127 and 228, the icon level is 3)
+#define RFU_LINK_ICON_LEVEL3_MIN 127
+#define RFU_LINK_ICON_LEVEL2_MAX 126 // 10% - 49% (If the value is betwen 25 and 126, the icon level is 2)
+#define RFU_LINK_ICON_LEVEL2_MIN 25
+#define RFU_LINK_ICON_LEVEL1_MAX 24 // 0% - 9% (If the value is betwen 0 and 24, the icon level is 1)
+#define RFU_LINK_ICON_LEVEL1_MIN 0
+
+
+// *******************************************************
+// Definition Data for Arguments Used in Library Functions
+// *******************************************************
+// Specified by u16 mbootFlag in rfu_REQ_configGameData
+#define RFU_MBOOT_FLAG 0x01 // Enabling this flag, allows connection to a multi-boot program.
+
+// AvailSlot (number of slots available for connection) used in u16 availSlotFlag in rfu_REQ_configSystem
+#define AVAIL_SLOT4 0x0000
+#define AVAIL_SLOT3 0x0001
+#define AVAIL_SLOT2 0x0002
+#define AVAIL_SLOT1 0x0003
+
+// u8 connTypeFlag specified by rfu_setRecvBuffer
+#define TYPE_UNI 0x10 // UNI-type
+#define TYPE_NI 0x20 // NI-type
+
+// u8 connTypeFlag specified by rfu_clearSlot
+#define TYPE_UNI_SEND 0x01 // UNI-type send
+#define TYPE_UNI_RECV 0x02 // UNI-type receive
+#define TYPE_NI_SEND 0x04 // NI-type send
+#define TYPE_NI_RECV 0x08 // NI-type receive
+
+// *******************************************************
+// Definition Data Returned by Return Values for Library Functions
+// *******************************************************
+
+// The function doesn't have return value.
+// Value of u8 *status for rfu_REQ_pollConnectParent (Connection Trial Status)
+// #define CP_STATUS_DONE 0x00 // Connection successful
+// #define CP_STATUS_IN_PROCESS 0x01 // Connecting
+// #define CP_STATUS_SLOT_CLOSED 0x02 // Parent device is not in connection mode with child device
+// #define CP_STATUS_DISCONNECTED 0x03 // Disconnected by parent device while connecting
+// #define CP_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error
+
+// The function doesn't exist.
+// Value of u8 *status argument for rfu_REQ_pollRecoveryConnect (Link Restore Status)
+// #define RC_STATUS_DONE 0x00 // Connection restore successful
+// #define RC_STATUS_FAILED 0x01 // Connection restore failure (meaningless to try anymore)
+// #define RC_STATUS_SEARCHING_PARENT 0x02 // Searching for parent device
+// #define RC_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error
+
+// Value of u8 *linkLossReason argument for rfu_REQBN_watchLink (Reason for Link Loss)
+#define REASON_DISCONNECTED 0x00 // State of complete disconnection with rfuLL_disconnect and no possibility of restoring the link (can detect only child device)
+#define REASON_LINK_LOSS 0x01 // State of link loss that allows for the possibility for the link to be restored
+
+
+// *******************************************************
+// Definition Data Returned with Return Values for Library Functions
+// *******************************************************
+
+// Value returned by rfu_getMasterSlave
+#define AGB_CLK_SLAVE 0 // AGB clock slave
+#define AGB_CLK_MASTER 1 // AGB clock master
+
+// *******************************************************
+// Error Code Group for Library Functions
+// *******************************************************
+
+// Error codes returned by u16 REQ_result with a REQ callback when a REQ-API function is executed
+#define ERR_REQ_CMD 0x0000
+#define ERR_REQ_CMD_CLOCK_DRIFT (ERR_REQ_CMD | 0x0001) // Clock drift occurs when a REQ command is sent
+#define ERR_REQ_CMD_SENDING (ERR_REQ_CMD | 0x0002) // The next command cannot be issued because a REQ command is being sent
+#define ERR_REQ_CMD_ACK_REJECTION (ERR_REQ_CMD | 0x0003) // The REQ command was refused when issued
+#define ERR_REQ_CMD_CLOCK_SLAVE (ERR_REQ_CMD | 0x0004) // Issuing the REQ command was attempted but failed because the AGB is the clock slave
+#define ERR_REQ_CMD_IME_DISABLE (ERR_REQ_CMD | 0x0006) // Issuing the REQ command was attempted but failed because the IME register is 0
+
+#define ERR_PID_NOT_FOUND 0x0100 // The specified PID does not exist in the gRfuLinkStatus->partner[0-3].id list
+
+// Error code returned by the return value of rfu_initializeAPI
+#define ERR_RFU_API_BUFF_SIZE 0x0001
+#define ERR_RFU_API_BUFF_ADR 0x0002
+
+// Error codes returned by return values for rfu_REQBN_softReset_and_checkID
+#define ERR_ID_CHECK_IME_DISABLE 0xffffffff // ID check could not be executed because REG_IME=0 when executing rfu_REQBN_softReset_and_checkID
+
+// Error codes returned by rfu_getConnectParentStatus and rfu_CHILD_getConnectRecoveryStatus
+#define ERR_REQ_CMD_ID (ERR_REQ_CMD | 0x0010) // A required REQ command was not executed within this function execution
+
+// Error codes returned by rfu_NI_setSendData, rfu_UNI_setSendData, and rfu_NI_CHILD_setSendGameName
+#define ERR_MODE 0x0300
+#define ERR_MODE_NOT_PARENT (ERR_MODE | 0x0000) // not in SDK
+#define ERR_MODE_NOT_CONNECTED (ERR_MODE | 0x0001) // RFU is not in connection mode (parent or child)
+
+#define ERR_SLOT 0x0400
+#define ERR_SLOT_NO (ERR_SLOT | 0x0000) // The specified slot number is not right
+#define ERR_SLOT_NOT_CONNECTED (ERR_SLOT | 0x0001) // The specified slot is not connected
+#define ERR_SLOT_BUSY (ERR_SLOT | 0x0002) // The specified slot is already communicating
+#define ERR_SLOT_NOT_SENDING (ERR_SLOT | 0x0003) // The specified slot is not currently sending (Note: This is returned by rfu_UNI_re_setSendData)
+#define ERR_SLOT_TARGET (ERR_SLOT | 0x0004) // The specified target slot is not right
+
+#define ERR_SUBFRAME_SIZE 0x0500 // The specified subframe size is either larger than the remaining communication frame size or smaller than the link layer subframe header size
+
+// Error code returned by rfu_clearSlot, rfu_setRecvBuffer, and rfu_changeSendTarget
+#define ERR_COMM_TYPE 0x0600 // The specified communication format is not right
+
+// Error code returned by rfu_REQ_recvData (when receiving NI-type or UNI-type data)
+#define ERR_DATA_RECV 0x0700 // Error notification is issued in the following format.
+ // "ERR_DATA_RECV | (slot number issuing error with 0x0010<<UNI) | (slot number issuing error with 0x0001<<NI)"
+ // The actual error code is stored in gRfuSlotStatusNI or gRfuSlotStatusUNI[x]->recv.errorCode.
+
+// Error code during NI-type communication (code entered into gRfuSlotStatusNI[x]->recv.errorCode)
+#define ERR_RECV_BUFF_OVER (ERR_DATA_RECV | 0x0001) // The receive data size is larger than the receive buffer (Note: This error is used for both NI and UNI)
+#define ERR_RECV_REPLY_SUBFRAME_SIZE (ERR_DATA_RECV | 0x0002) // All frames are already in use by other communications, and a subframe for reception response could not be secured
+
+// Error code during UNI-type communication (code entered into gRfuSlotStatusUNI[x]->recv.errorCode)
+#define ERR_RECV_DATA_OVERWRITED (ERR_DATA_RECV | 0x0008) // Received new data when gRfuSlotStatusUNI[x]->recv.newDataFlag=1
+
+// not in SDK header
+#define ERR_RECV_UNK (ERR_DATA_RECV | 0x0001 | 0x0008)
+
+// *******************************************************
+// Definition Data Used by Global Variables in the Library
+// *******************************************************
+
+// gRfuLinkStatus-------------------------------------------
+// Connection status (refer to gRfuLinkStatus->parentChild)
+#define MODE_NEUTRAL 0xff // Initialization
+#define MODE_CHILD 0x00 // Child
+#define MODE_PARENT 0x01 // Parent
+
+
+// gRfuSlotStatusNI,UNI-----------------------------------
+// Definition data for NI-(Numbered Information) and UNI-(Un-Numbered Information) type communication
+
+// Definition data common to NI- and UNI-type communication
+#define LLF_P_SIZE 87 // Maximum link layer communication frame size for the Parent (Maximum number of bytes per transmission)
+#define LLF_C_SIZE 16 // " " for the Child
+#define LLSF_P_HEADER_SIZE 3 // Header size used by one link layer subframe (NI or UNI frame) for the Parent
+#define LLSF_C_HEADER_SIZE 2 // " " for the Child
+
+// Link Layer Communication Code
+#define LCOM_NULL 0x0000
+#define LCOM_NI_START 0x0001
+#define LCOM_NI 0x0002
+#define LCOM_NI_END 0x0003
+#define LCOM_UNI 0x0004
+// Flag for Slot Status Data
+#define SLOT_BUSY_FLAG 0x8000 // Slot in use
+#define SLOT_SEND_FLAG 0x0020 // Send
+#define SLOT_RECV_FLAG 0x0040 // Receive
+
+// NI- and UNI-type shared slot stand-by data (same state as gRfuSlotStatusNI[x]->send or ->recv.state or gRfuSlotStatusUNI)
+#define SLOT_STATE_READY 0x0000 // Slot initialization
+
+// Status data for NI-type communication (gRfuSlotStatusNI[x]->send or ->recv.state)
+#define SLOT_STATE_SEND_START (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_START) // Start transmission
+#define SLOT_STATE_SENDING (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI) // Transmitting
+#define SLOT_STATE_SEND_LAST (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_END) // Verify transmission end
+#define SLOT_STATE_SEND_NULL (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NULL) // Send NULL subframe to notify end of transmission
+#define SLOT_STATE_SEND_SUCCESS ( SLOT_SEND_FLAG | 0x006) // Transmission successful
+#define SLOT_STATE_SEND_FAILED ( SLOT_SEND_FLAG | 0x007) // Transmission failed
+ // Distinction of slot where transmission succeeded/failed compares gRfuSlotStatusNI[x]->send.bmSlot and same bmSlot_org
+#define SLOT_STATE_RECV_START (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_START) // Start reception
+#define SLOT_STATE_RECEIVING (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI) // Receiving
+#define SLOT_STATE_RECV_LAST (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_END) // Verify reception end
+#define SLOT_STATE_RECV_SUCCESS ( SLOT_RECV_FLAG | 0x006) // Reception successful
+#define SLOT_STATE_RECV_FAILED ( SLOT_RECV_FLAG | 0x007) // Reception failed
+#define SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN (SLOT_RECV_FLAG | 0x008) // The data was received successful, but because the end of the communication was incomplete, whether the transmission side status is successful or failed is unknown
+#define SLOT_STATE_RECV_IGNORE ( SLOT_RECV_FLAG | 0x009) // Ignore reception (refer to gRfuSlotStatusNI[x]->recv.errorCode for reason for ignoring)
+
+// Status data for UNI-type communication (refer to gRfuSlotStatusUNI[x]->send.state)
+#define SLOT_STATE_SEND_UNI (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_UNI) // Transmitting
+
+// TODO: move the 2 structs to some other header as they're declared by GF
struct UnkLinkRfuStruct_02022B14Substruct
{
u16 unk_00_0:4;
u16 unk_00_4:1;
u16 unk_00_5:1;
u16 unk_00_6:1;
- u16 unk_00_7:1;
- u16 unk_01_0:1;
- u16 unk_01_1:1;
+ u16 isChampion:1;
+ u16 hasNationalDex:1;
+ u16 gameClear:1;
u16 unk_01_2:4;
u16 unk_01_6:2;
u8 playerTrainerId[2];
@@ -93,176 +299,386 @@ struct __attribute__((packed, aligned(2))) UnkLinkRfuStruct_02022B14
u8 unk_0a_0:7;
u8 unk_0a_7:1;
u8 playerGender:1;
- u8 unk_0b_1:7;
+ u8 level:7;
u8 unk_0c;
};
-struct RfuStruct
+// the following structs are not documented in SDK
+struct RfuPacket8
+{
+ u8 data[0x74];
+};
+
+struct RfuPacket32
+{
+ u32 command;
+ u32 data[0x1C];
+};
+
+union RfuPacket
+{
+ struct RfuPacket32 rfuPacket32;
+ struct RfuPacket8 rfuPacket8;
+};
+
+struct STWIStatus
{
- vs32 unk_0;
- u8 txParams;
- u8 unk_5;
- u8 activeCommand;
- u8 unk_7;
- u8 unk_8;
- u8 unk_9;
+ vs32 state;
+ u8 reqLength;
+ u8 reqNext;
+ u8 reqActiveCommand;
+ u8 ackLength;
+ u8 ackNext;
+ u8 ackActiveCommand;
u8 timerSelect;
u8 unk_b;
- int timerState;
+ u32 timerState; // this field is s32 in emerald
vu8 timerActive;
u8 unk_11;
- vu16 unk_12;
+ vu16 error;
vu8 msMode;
- u8 unk_15;
+ u8 recoveryCount;
u8 unk_16;
u8 unk_17;
void (*callbackM)();
- void (*callbackS)();
- u32 callbackID;
- union RfuPacket * txPacket;
- union RfuPacket * rxPacket;
+ void (*callbackS)(u16);
+ void (*unk_20)(void);
+ union RfuPacket *txPacket;
+ union RfuPacket *rxPacket;
vu8 unk_2c;
- u8 padding[3];
};
+// This struct is used as u8 array in SDK.
struct RfuIntrStruct
{
- u8 rxPacketAlloc[0x74];
- u8 txPacketAlloc[0x74];
- u8 block1[0x960];
- u8 block2[0x30];
+ union RfuPacket rxPacketAlloc;
+ union RfuPacket txPacketAlloc;
+ u8 block1[0x960]; // size of librfu_intr.s binary
+ struct STWIStatus block2;
};
-struct RfuUnk1
+// Data Structure for Transmitting UNI-Type Data
+struct UNISend
{
- u16 unk_0;
- u8 unk_2;
- u8 unk_3;
- u8 fill_4[14];
- u8 unk_12;
- u32 unk_14;
- u32 unk_18;
- struct RfuIntrStruct unk_1c;
+ u16 state; // Slot communication state (SLOT_STATE_READY, SLOT_STATE_SEND_UNI)
+ u8 dataReadyFlag; // Flag indicating transmission data is prepared (0: data sent; 1: transmission data ready)
+ // Set with rfu_UNI_re_setSendData or rfu_UNI_readySendData, cleared when data is sent with rfu_REQ_sendData.
+ u8 bmSlot; // Expresses transmission destination slot as bits
+ u16 payloadSize; // Payload size of 1 transmission. "size" specified by rfu_UNI_setSendData or rfu_UNI_re_setSendData is used.
+ const void *src; // Beginning address of transmission data
};
-struct RfuUnk2
+// Data Structure for Receiving UNI Data
+struct UNIRecv
{
- u16 unk_0;
- u16 unk_2;
- u8 fill_4[0x16];
- u8 unk_1a;
- u8 fill_1b[0x19];
- u16 unk_34;
- u16 unk_36;
- u8 fill_38[0x16];
- u8 unk_4e;
- u8 fill_4f[0x12];
- u8 unk_61;
- u8 fill_62[6];
- void *unk_68;
- void *unk_6c;
- u8 unk_70[0x70];
+ u16 state; // Slot communication state (SLOT_STATE_READY, SLOT_STATE_RECEIVING, SLOT_STATE_RECV_IGNORE)
+ u16 errorCode; // Error code during reception
+ u16 dataSize; // Size of receive data
+ u8 newDataFlag; // Flag indicating whether receive data has newly arrived (0: no newly arrived data; 1: newly arrived data)
+ // The flag is cleared with rfu_UNI_clearRecvNewDataFlag; it is set when data is received with rfu_REQ_recvData.
+ u8 dataBlockFlag; // Flag for unreferenced receive data overwrite block (default is 0 Note: not used)
};
-struct RfuUnk3
+// Slot Status Data Structure for UNI-Type Communication
+struct RfuSlotStatusUNI
{
- u32 unk_0;
- u32 unk_4;
- u8 unk_8[0xD4];
- u32 unk_dc;
+ struct UNISend send; // Transmission Status
+ struct UNIRecv recv; // Reception Status
+ void *recvBuffer; // Reception Buffer Address
+ u32 recvBufferSize; // Reception Buffer Size
};
-struct RfuUnk5Sub
+#define WINDOW_COUNT 4
+
+struct NIComm
{
- u16 unk_00;
- u8 unk_02;
- u16 unk_04;
- struct UnkLinkRfuStruct_02022B14 unk_06;
- u8 fill_13[1];
- u8 playerName[PLAYER_NAME_LENGTH + 1];
+ u16 state; // Communication state of slot
+ u16 failCounter; // Count of failed transmissions/receptions (Count is increased when transmission/reception of data does not succeed within 1PF=16.7 ms)
+ const u8 *now_p[WINDOW_COUNT]; // Address of current send/receive (The data is divided into WINDOW_COUNT blocks and sent in payloadSize units.)
+ // remainSize is u32 in SDK. This is a hack to match ASM
+ s32 remainSize; // Size of remaining communication data
+ u16 errorCode; // Error code
+ u8 bmSlot; // Expresses the current communication slot in bits
+ // (When sending from the Master, because multiple slaves can be specified with bmSlot, communications are terminated based on the failCounter for each child device)
+ // Parameters used inside the Library
+ u8 recvAckFlag[WINDOW_COUNT];
+ u8 ack;
+ u8 phase;
+ u8 n[WINDOW_COUNT];
+ // Parameters indicating the current communication content
+ const void *src; // Start address transmission data (valid only for transmitting device)
+ u8 bmSlotOrg; // Expresses the communication source slot at the beginning of the transmission in bits (valid only for transmitting device)
+ u8 dataType; // Transmission/reception data type (0: User data; 1: Game identification information)
+ u16 payloadSize; // Payload size for one transmission
+ u32 dataSize; // Size of transmission/reception data
+ // Calculated by subtracting link layer header size from subFrameSize specified by the rfu_NI_setSendData function
};
-struct RfuUnk5
+struct RfuSlotStatusNI
{
- u8 unk_00;
- u8 unk_01;
- u8 unk_02;
- u8 unk_03;
- u8 unk_04;
- u8 unk_05;
- u8 unk_06;
- u8 unk_07;
- u8 unk_08;
- u8 filler_09[1];
- u8 unk_0a[4];
- u8 filler_0e[6];
- struct RfuUnk5Sub unk_14[4];
+ struct NIComm send; // Transmission Status
+ struct NIComm recv; // Reception Status
+ void *recvBuffer; // Reception Buffer Address
+ u32 recvBufferSize; // Reception Buffer Size
};
-extern struct RfuStruct * gRfuState;
+// Game Identification Information Data Structure
+struct RfuTgtData
+{
+ u16 id; // ID of parent candidate ID of connection partner
+ u8 slot; // Slot number where parent candidate can enter Connection slot number
+ u8 mbootFlag; // Flag to indicate whether or not the parent candidate Flag to indicate whether or not the connection partner
+ // is multiboot program for download is multiboot program for download
+ u16 serialNo; // Game serial number of parent candidate Game serial number of connection partner
+ u8 gname[RFU_GAME_NAME_LENGTH + 2]; // Game name of parent candidate Game name of connection partner
+ u8 uname[RFU_USER_NAME_LENGTH + 1]; // User name for parent candidate User name for connection partner
+};
+
+struct RfuLinkStatus
+{
+ u8 parentChild; // Connection status (0x01:MODE_PARENT 0x00:MODE_CHILD 0xff:MODE_NEUTRAL)
+ u8 connCount; // Number of connections
+ u8 connSlotFlag; // Flag to indicate in bits the connection slot (0x01<<Connection slot number)
+ u8 linkLossSlotFlag; // Flag to indicate in bits the slot where the link loss was generated (")
+ u8 sendSlotNIFlag; // Flag to indicate in bits the slot where NI-type send is occurring (")
+ u8 recvSlotNIFlag; // Flag to indicate in bits the slot where NI-type receive is occurring (")
+ u8 sendSlotUNIFlag; // Flag to indicate in bits the slot where UNI-type send is occurring (")
+ u8 getNameFlag; // Parent: Flag to indicate whether or not game identification information was obtained from the child connected to this slot (")
+ // Child: Flag to indicate whether or not game identification information was sent to the parent connected to this slot (")
+ u8 findParentCount; // Number of parent candidates discovered with rfu_REQ_xxxSearchParent, valid only with a child device
+ u8 watchInterval; // Link monitor execution interval (16.7 ms unit AGB picture frame)
+ u8 strength[RFU_CHILD_MAX]; // Link strength value (0x00 - 0xff; 0x00 is link loss. Updates with rfu_REQBN_watchLink)
+ vu8 LLFReadyFlag; // Indicates whether the link layer frame to send next has be constructed (Flag is on when calling rfu_constructLLFrame, flag is cleared when sending by rfu_REQ_sendData.)
+ u8 remainLLFrameSizeParent; // Remaining size of the link layer communication frame for the parent device
+ u8 remainLLFrameSizeChild[RFU_CHILD_MAX]; // Remaining size of the link layer communication frame for each slot for child device
+ struct RfuTgtData partner[RFU_CHILD_MAX]; // Parent, Child: When there is a connection, the matrix element corresponding to the number of the connected slot
+ // stores the game identification information for the connection partner.
+ // Child: Stores the game identification information for the parent candidate discovered when executing rfu_REQ_xxxxSearchParent.
+ struct RfuTgtData my; // The device's own game identification information (unrelated to the element slot value)
+};
+
+// the following structs are not documented in SDK
+struct RfuFixed
+{
+ void (*reqCallback)(u16, u16);
+ void (*fastCopyPtr)(const u8 **, u8 **, s32);
+ u16 fastCopyBuffer[24];
+ u32 fastCopyBuffer2[12];
+ u32 LLFBuffer[29];
+ struct RfuIntrStruct *STWIBuffer;
+};
-extern struct RfuUnk5 * gUnknown_3007460;
-extern u32 *gUnknown_3007464;
-extern struct RfuUnk3 * gUnknown_3007468;
-extern struct RfuUnk2 * gUnknown_3007450[4];
-extern struct RfuUnk1 * gUnknown_3007440[4];
-extern struct {
+struct RfuStatic
+{
+ u8 flags;
+ u8 NIEndRecvFlag;
+ u8 recvRenewalFlag;
+ u8 commExistFlag;
+ u8 recvErrorFlag;
+ u8 recoveryBmSlot;
+ u8 nowWatchInterval;
+ u8 nullFrameCount;
+ u8 emberCount;
+ u8 SCStartFlag;
+ u8 linkEmergencyFlag[4];
+ u8 lsFixedCount[4];
+ u16 cidBak[4];
+ u16 unk_1a;
+ u16 reqResult;
+ u16 tryPid;
+ u16 watchdogTimer;
+ u32 totalPacketSize;
+};
+
+struct RfuS32Id
+{
u8 unk0;
u8 unk1;
u16 unk2;
u16 unk4;
- u8 fill6[4];
+ u16 unk6;
+ u16 unk8; // unused
u16 unkA;
-} gUnknown_3007470;
+};
-extern void rfu_STC_clearAPIVariables(void);
+struct RfuAPIBuffer
+{
+ struct RfuLinkStatus linkStatus;
+ struct RfuStatic static_;
+ struct RfuFixed fixed;
+ struct RfuSlotStatusNI NI[RFU_CHILD_MAX];
+ struct RfuSlotStatusUNI UNI[RFU_CHILD_MAX];
+ struct RfuIntrStruct intr;
+};
-void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam);
-void rfu_REQ_stopMode(void);
-void rfu_waitREQComplete(void);
+extern struct STWIStatus *gSTWIStatus;
+extern struct RfuLinkStatus *gRfuLinkStatus;
+extern struct RfuStatic *gRfuStatic;
+extern struct RfuFixed *gRfuFixed;
+extern struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX];
+extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX];
+extern struct RfuS32Id gRfuS32Id;
+
+// librfu_s32id
+s32 AgbRFU_checkID(u8);
+
+// Arguments with "bm..." specify slots of the form (0x01 << slot number) that are the object of a function operation.
+
+// librfu_rfu
+// API Initialization and Initial Settings
+ // API Initialization
+u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam);
+ // Set Timer Interrupt
+void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p);
+ // Resident Function called from within a V-Blank Interrupt
+u16 rfu_syncVBlank(void);
+ // Specify REQ Callback function
+void rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult));
+ // REQ-API Execution Completion Wait
+u16 rfu_waitREQComplete(void);
+
+// RFU Initialization and Initial Settings
+ // RFU Startup and ID Check (Forced RFU reset occurs simultaneously)
u32 rfu_REQBN_softReset_and_checkID(void);
-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);
-bool16 rfu_syncVBlank(void);
+ // RFU Reset
void rfu_REQ_reset(void);
-void rfu_REQ_configSystem(u16, u8, u8);
-void rfu_REQ_configGameData(u8, u16, struct UnkLinkRfuStruct_02022B14 *, u8 *);
+ // Set RFU to Stop Mode (Power Down)
+void rfu_REQ_stopMode(void);
+ // RFU Hardware Settings
+void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer);
+ // Game Identification Information Configuration
+void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname);
+
+// RFU Connection Process
+ // Operate as parent device; search for and connect to child device
void rfu_REQ_startSearchChild(void);
void rfu_REQ_pollSearchChild(void);
void rfu_REQ_endSearchChild(void);
+ // Operate as child device; search for parent device
void rfu_REQ_startSearchParent(void);
void rfu_REQ_pollSearchParent(void);
void rfu_REQ_endSearchParent(void);
-void rfu_REQ_startConnectParent(u16);
+ // Operate as child device; connect to specified parent device
+void rfu_REQ_startConnectParent(u16 pid);
void rfu_REQ_pollConnectParent(void);
void rfu_REQ_endConnectParent(void);
-void rfu_REQ_CHILD_startConnectRecovery(u8);
+u16 rfu_getConnectParentStatus(u8 *status,u8 *connectSlotNo);
+ // Restore link from child device
+void rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot);
void rfu_REQ_CHILD_pollConnectRecovery(void);
void rfu_REQ_CHILD_endConnectRecovery(void);
+u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status);
+
+// RFU Link Management
+ // Link Monitoring
+u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot);
+ // Link Disconnect
+void rfu_REQ_disconnect(u8 bmDisconnectSlot);
+
+// Relation of clock between AGB and RFU
+ // Switch to AGB clock slave
void rfu_REQ_changeMasterSlave(void);
-void rfu_REQ_RFUStatus(void);
-void rfu_getRFUStatus(u8 *status);
-u8 *rfu_getSTWIRecvBuffer(void);
-u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1);
-void rfu_clearSlot(u8 a0, u8 a1);
+ // Acquire either the master or slave clock from the current AGB-RFU
+bool8 rfu_getMasterSlave(void);
+
+// Communication Configuration
+ // MSC Callback Configuration
+void rfu_setMSCCallback(void (*callback)(u16 reqCommandId));
+ // Shared by NI- and UNI-type communications
+ // Clear Communication Status
void rfu_clearAllSlot(void);
-bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status);
-bool16 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);
-u16 rfu_initializeAPI(u32 *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);
-void rfu_REQ_recvData(void);
-void rfu_UNI_readySendData(u8 a0);
-void rfu_UNI_clearRecvNewDataFlag(u8 a0);
+u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex);
+ // Set Receive Buffer
+u16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize);
+
+// Receive/Send Data
+ // UNI-type communication
+ // Set transmission data
+u16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size);
+ // Enable transmission data
+void rfu_UNI_readySendData(u8 slotStatusIndex);
+ // Change address or size of transmission data and enable transmission data
+u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size);
+ // Used only by parent device. At the beginning of a MSC Callback that received notification that the data transmission completed, an ACK flag is obtained.
+u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag);
+ // Clear the flag that indicates newly arrived reception data
+void rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex);
+ // NI-type Communication
+ // Set transmission data
+u16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size);
+ // Used only by child device. After establishing connection at the RFU level, configure transmission of child device game identification information in order to authenticate connection
+u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize);
+ // Stop the NI data currently being received
+u16 rfu_NI_stopReceivingData(u8 slotStatusIndex);
+ // Shared by NI- and UNI-type communications
+ // Narrow transmission targets for transmission data.
+u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot);
+
+ // Functions for sending/receiving data to RFU
+ // Data transmission
+void rfu_REQ_sendData(u8 clockChangeFlag);
+ // Used only by parent device. Resend previous sent data (packet)
void rfu_REQ_PARENT_resumeRetransmitAndChange(void);
-void rfu_NI_setSendData(u8, u8, const void *, u32);
+ // Read receive data
+void rfu_REQ_recvData(void);
+
+// For Multi-boot
+ // Inherits the information about the link established by the downloader just after the program downloaded with multiboot starts up.
+u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void);
+
+// For Debug
+ // Obtain address of the SWTI-layer receive buffer
+struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void);
+ // Obtain RFU state
+void rfu_REQ_RFUStatus(void);
+u16 rfu_getRFUStatus(u8 *rfuState);
+ // Using RFU, generate noise (jamming radio waves) for other RFUs
+void rfu_REQ_noise(void);
+
+// librfu_intr
+void IntrSIO32(void);
+
+// librfu_stwi
+void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam);
+void STWI_set_MS_mode(u8 mode);
+void STWI_init_Callback_M(void);
+void STWI_init_Callback_S(void);
+void STWI_set_Callback_M(void *callbackM);
+void STWI_set_Callback_S(void (*callbackS)(u16));
+void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect);
+void AgbRFU_SoftReset(void);
+void STWI_set_Callback_ID(void (*func)(void));
+u16 STWI_read_status(u8 index);
+u16 STWI_poll_CommandEnd(void);
+void STWI_send_DataRxREQ(void);
+void STWI_send_MS_ChangeREQ(void);
+void STWI_send_StopModeREQ(void);
+void STWI_send_SystemStatusREQ(void);
+void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data);
+void STWI_send_ResetREQ(void);
+void STWI_send_LinkStatusREQ(void);
+void STWI_send_VersionStatusREQ(void);
+void STWI_send_SlotStatusREQ(void);
+void STWI_send_ConfigStatusREQ(void);
+void STWI_send_ResumeRetransmitAndChangeREQ(void);
+void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3);
+void STWI_send_SC_StartREQ(void);
+void STWI_send_SC_PollingREQ(void);
+void STWI_send_SC_EndREQ(void);
+void STWI_send_SP_StartREQ(void);
+void STWI_send_SP_PollingREQ(void);
+void STWI_send_SP_EndREQ(void);
+void STWI_send_CP_StartREQ(u16 unk1);
+void STWI_send_CP_PollingREQ(void);
+void STWI_send_CP_EndREQ(void);
+void STWI_send_DataTxREQ(const void *in, u8 size);
+void STWI_send_DataTxAndChangeREQ(const void *in, u8 size);
+void STWI_send_DataReadyAndChangeREQ(u8 unk);
+void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1);
+void STWI_send_DisconnectREQ(u8 unk);
+void STWI_send_TestModeREQ(u8 unk0, u8 unk1);
+void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2);
+void STWI_send_CPR_PollingREQ(void);
+void STWI_send_CPR_EndREQ(void);
#endif // GUARD_LIBRFU_H
diff --git a/ld_script.txt b/ld_script.txt
index aeb11a271..614bc4c93 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -317,9 +317,10 @@ SECTIONS {
src/agb_flash_1m.o(.text);
src/agb_flash_mx.o(.text);
src/agb_flash_le.o(.text);
- asm/librfu_stwi.o(.text);
+ src/librfu_stwi.o(.text);
asm/librfu_intr.o(.text);
- asm/librfu.o(.text);
+ src/librfu_rfu.o(.text);
+ src/librfu_s32id.o(.text);
src/isagbprn.o(.text);
asm/libagbsyscall.o(.text);
*libgcc.a:_call_via_rX.o(.text);
@@ -939,7 +940,8 @@ SECTIONS {
src/agb_flash_1m.o(.rodata);
src/agb_flash_mx.o(.rodata);
src/agb_flash_le.o(.rodata);
- data/librfu_rodata.o(.rodata);
+ src/librfu_rfu.o(.rodata);
+ src/librfu_s32id.o(.rodata);
src/isagbprn.o(.rodata);
*libgcc.a:_divdi3.o(.rodata);
*libgcc.a:_udivdi3.o(.rodata);
diff --git a/src/agb_flash.c b/src/agb_flash.c
index 5b171abcb..7eb4ae737 100644
--- a/src/agb_flash.c
+++ b/src/agb_flash.c
@@ -74,7 +74,7 @@ u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void))
return 1;
sTimerNum = timerNum;
- sTimerReg = &REG_TMCNT(sTimerNum);
+ sTimerReg = &REG_TMCNT_L(sTimerNum);
*intrFunc = FlashTimerIntr;
return 0;
}
diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c
new file mode 100644
index 000000000..96de99c2a
--- /dev/null
+++ b/src/librfu_rfu.c
@@ -0,0 +1,2222 @@
+#include "librfu.h"
+
+struct LLSFStruct
+{
+ u8 unk00;
+ u8 unk01;
+ u8 unk02;
+ u8 unk03;
+ u8 unk04;
+ u8 unk05;
+ u8 unk06;
+ u8 unk07;
+ u8 unk08;
+ u8 unk09;
+ u8 unk0A;
+ u8 unk0B;
+ u8 unk0C;
+ u16 unk0E;
+};
+
+struct RfuLocalStruct
+{
+ u8 unk00;
+ u8 unk01;
+ u8 unk02;
+ u8 unk03;
+ u8 unk04;
+ u8 unk05;
+ u16 unk06;
+};
+
+static void rfu_CB_defaultCallback(u8, u16);
+static void rfu_CB_reset(u8, u16);
+static void rfu_CB_configGameData(u8, u16);
+static void rfu_CB_stopMode(u8, u16);
+static void rfu_CB_startSearchChild(u8, u16);
+static void rfu_CB_pollAndEndSearchChild(u8, u16);
+static void rfu_CB_startSearchParent(u8, u16);
+static void rfu_CB_pollSearchParent(u8, u16);
+static void rfu_CB_pollConnectParent(u8, u16);
+static void rfu_CB_pollConnectParent(u8, u16);
+static void rfu_CB_disconnect(u8, u16);
+static void rfu_CB_CHILD_pollConnectRecovery(u8, u16);
+static void rfu_CB_sendData(UNUSED u8, u16);
+static void rfu_CB_sendData2(UNUSED u8, u16);
+static void rfu_CB_sendData3(u8, u16);
+static void rfu_CB_recvData(u8, u16);
+static void rfu_enableREQCallback(bool8);
+static void rfu_STC_clearAPIVariables(void);
+static void rfu_STC_readChildList(void);
+static void rfu_STC_readParentCandidateList(void);
+static void rfu_STC_REQ_callback(u8, u16);
+static void rfu_STC_removeLinkData(u8, u8);
+static void rfu_STC_fastCopy(const u8 **, u8 **, s32);
+static void rfu_STC_clearLinkStatus(u8);
+static void rfu_NI_checkCommFailCounter(void);
+static u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32);
+static void rfu_constructSendLLFrame(void);
+static u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *);
+static u16 rfu_STC_UNI_constructLLSF(u8, u8 **);
+static void rfu_STC_PARENT_analyzeRecvPacket(void);
+static void rfu_STC_CHILD_analyzeRecvPacket(void);
+static u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16);
+static void rfu_STC_UNI_receive(u8, const struct RfuLocalStruct *, const u8 *);
+static void rfu_STC_NI_receive_Receiver(u8, const struct RfuLocalStruct *, const u8 *);
+static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, UNUSED const u8 *);
+static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *);
+static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *);
+
+struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX];
+struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX];
+struct RfuLinkStatus *gRfuLinkStatus;
+struct RfuStatic *gRfuStatic;
+struct RfuFixed *gRfuFixed;
+
+static const struct LLSFStruct llsf_struct[2] = {
+ {
+ 2, 14, 0, 10, 9, 5, 7, 2,
+ 0, 15, 1, 3, 3, 0x1f
+ }, {
+ 3, 22, 18, 14, 13, 9, 11, 3,
+ 15, 15, 1, 3, 3, 0x7f
+ }
+};
+
+#ifdef EMERALD
+static const char lib_ver[] = "RFU_V1026";
+#else
+static const char lib_ver[] = "RFU_V1024";
+#endif
+
+static const char str_checkMbootLL[] = "RFU-MBOOT";
+
+u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam)
+{
+ u16 i;
+ u16 *dst;
+ const u16 *src;
+ u16 r3;
+
+ // is in EWRAM?
+ if (((u32)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam)
+ return ERR_RFU_API_BUFF_ADR;
+ // is not 4-byte aligned?
+ if ((u32)APIBuffer & 3)
+ return ERR_RFU_API_BUFF_ADR;
+ if (copyInterruptToRam)
+ {
+ // An assert/debug print may have existed before, ie
+ // printf("%s %u < %u", "somefile.c:12345", buffByteSize, num)
+ // to push this into r3?
+ r3 = sizeof(struct RfuAPIBuffer);
+ if (buffByteSize < r3)
+ return ERR_RFU_API_BUFF_SIZE;
+ }
+ if (!copyInterruptToRam)
+ {
+ r3 = 0x504; // same issue as above
+ if (buffByteSize < r3)
+ return ERR_RFU_API_BUFF_SIZE;
+ }
+ gRfuLinkStatus = &APIBuffer->linkStatus;
+ gRfuStatic = &APIBuffer->static_;
+ gRfuFixed = &APIBuffer->fixed;
+ gRfuSlotStatusNI[0] = &APIBuffer->NI[0];
+ gRfuSlotStatusUNI[0] = &APIBuffer->UNI[0];
+ for (i = 1; i < RFU_CHILD_MAX; ++i)
+ {
+ gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1];
+ gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1];
+ }
+ // TODO: Is it possible to fix the following 2 statements?
+ // It's equivalent to:
+ // gRfuFixed->STWIBuffer = &APIBuffer->intr;
+ // STWI_init_all(&APIBuffer->intr, sioIntrTable_p, copyInterruptToRam);
+ gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1];
+ STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], sioIntrTable_p, copyInterruptToRam);
+ rfu_STC_clearAPIVariables();
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ {
+ gRfuSlotStatusNI[i]->recvBuffer = NULL;
+ gRfuSlotStatusNI[i]->recvBufferSize = 0;
+ gRfuSlotStatusUNI[i]->recvBuffer = NULL;
+ gRfuSlotStatusUNI[i]->recvBufferSize = 0;
+ }
+ src = (const u16 *)((u32)&rfu_STC_fastCopy & ~1);
+ dst = gRfuFixed->fastCopyBuffer;
+ // 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 = (void *)gRfuFixed->fastCopyBuffer + 1;
+ return 0;
+}
+
+static void rfu_STC_clearAPIVariables(void)
+{
+ u16 IMEBackup = REG_IME;
+ u8 i, r4;
+
+ REG_IME = 0;
+ r4 = gRfuStatic->flags;
+ CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic));
+ gRfuStatic->flags = r4 & 8;
+ CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus));
+ gRfuLinkStatus->watchInterval = 4;
+ gRfuStatic->nowWatchInterval = 0;
+ gRfuLinkStatus->parentChild = MODE_NEUTRAL;
+ rfu_clearAllSlot();
+ gRfuStatic->SCStartFlag = 0;
+ for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i)
+ gRfuStatic->cidBak[i] = 0;
+ REG_IME = IMEBackup;
+}
+
+void rfu_REQ_PARENT_resumeRetransmitAndChange(void)
+{
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_ResumeRetransmitAndChangeREQ();
+}
+
+u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag)
+{
+ struct RfuIntrStruct *buf;
+
+ *ackFlag = 0;
+ if (gRfuLinkStatus->parentChild != MODE_PARENT)
+ return ERR_MODE_NOT_PARENT;
+ buf = rfu_getSTWIRecvBuffer();
+ switch (buf->rxPacketAlloc.rfuPacket8.data[0])
+ {
+ case 40:
+ case 54:
+ if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0)
+ *ackFlag = gRfuLinkStatus->connSlotFlag;
+ else
+ *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4];
+ return 0;
+ default:
+ return ERR_REQ_CMD_ID;
+ }
+}
+
+void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p)
+{
+ STWI_init_timer(timerIntrTable_p, timerNo);
+}
+
+struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void)
+{
+ return gRfuFixed->STWIBuffer;
+}
+
+void rfu_setMSCCallback(void (*callback)(u16 reqCommandId))
+{
+ STWI_set_Callback_S(callback);
+}
+
+void rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult))
+{
+ gRfuFixed->reqCallback = callback;
+ rfu_enableREQCallback(callback != NULL);
+}
+
+static void rfu_enableREQCallback(bool8 enable)
+{
+ if (enable)
+ gRfuStatic->flags |= 8;
+ else
+ gRfuStatic->flags &= 0xF7;
+}
+
+static void rfu_STC_REQ_callback(u8 r5, u16 reqResult)
+{
+ STWI_set_Callback_M(rfu_CB_defaultCallback);
+ gRfuStatic->reqResult = reqResult;
+ if (gRfuStatic->flags & 8)
+ gRfuFixed->reqCallback(r5, reqResult);
+}
+
+static void rfu_CB_defaultCallback(u8 r0, u16 reqResult)
+{
+ s32 r5;
+ u8 i;
+
+ if (r0 == 0xFF)
+ {
+ if (gRfuStatic->flags & 8)
+ gRfuFixed->reqCallback(r0, reqResult);
+ r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ if ((r5 >> i) & 1)
+ rfu_STC_removeLinkData(i, 1);
+ gRfuLinkStatus->parentChild = MODE_NEUTRAL;
+ }
+}
+
+u16 rfu_waitREQComplete(void)
+{
+ STWI_poll_CommandEnd();
+ return gRfuStatic->reqResult;
+}
+
+void rfu_REQ_RFUStatus(void)
+{
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_SystemStatusREQ();
+}
+
+u16 rfu_getRFUStatus(u8 *rfuState)
+{
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93)
+ return ERR_REQ_CMD_ID;
+ if (STWI_poll_CommandEnd() == 0)
+ *rfuState = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7];
+ else
+ *rfuState = 0xFF;
+ return 0;
+}
+
+u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void)
+{
+ const char *s1 = str_checkMbootLL;
+ char *s2 = (char *)0x30000F0;
+ u16 checksum;
+ u16 *r2;
+ u8 i;
+
+ while (*s1 != '\0')
+ if (*s1++ != *s2++)
+ return 1;
+ r2 = (u16 *)0x3000000;
+ checksum = 0;
+ for (i = 0; i < 90; ++i)
+ checksum += *r2++;
+ if (checksum != *(u16 *)0x30000FA)
+ return 1;
+ CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus));
+ gRfuStatic->flags |= 0x80;
+ return 0;
+}
+
+void rfu_REQ_stopMode(void)
+{
+ vu32 *timerReg;
+
+ if (REG_IME == 0)
+ {
+ rfu_STC_REQ_callback(61, 6);
+ gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;
+ }
+ else
+ {
+ AgbRFU_SoftReset();
+ rfu_STC_clearAPIVariables();
+ if (AgbRFU_checkID(8) == 0x8001)
+ {
+ timerReg = &REG_TMCNT(gSTWIStatus->timerSelect);
+ *timerReg = 0;
+ *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16;
+ while (*timerReg << 16 < 262 << 16)
+ ;
+ *timerReg = 0;
+ STWI_set_Callback_M(rfu_CB_stopMode);
+ STWI_send_StopModeREQ();
+ }
+ else
+ {
+ REG_SIOCNT = SIO_MULTI_MODE;
+ rfu_STC_REQ_callback(61, 0);
+ }
+ }
+}
+
+static void rfu_CB_stopMode(u8 a1, u16 reqResult)
+{
+ if (reqResult == 0)
+ REG_SIOCNT = SIO_MULTI_MODE;
+ rfu_STC_REQ_callback(a1, reqResult);
+}
+
+u32 rfu_REQBN_softReset_and_checkID(void)
+{
+ u32 r2;
+
+ if (REG_IME == 0)
+ return ERR_ID_CHECK_IME_DISABLE;
+ AgbRFU_SoftReset();
+ rfu_STC_clearAPIVariables();
+ if ((r2 = AgbRFU_checkID(30)) == 0)
+ REG_SIOCNT = SIO_MULTI_MODE;
+ return r2;
+}
+
+void rfu_REQ_reset(void)
+{
+ STWI_set_Callback_M(rfu_CB_reset);
+ STWI_send_ResetREQ();
+}
+
+static void rfu_CB_reset(u8 a1, u16 reqResult)
+{
+ if (reqResult == 0)
+ rfu_STC_clearAPIVariables();
+ rfu_STC_REQ_callback(a1, reqResult);
+}
+
+void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)
+{
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer);
+ if (mcTimer == 0)
+ {
+ gRfuStatic->unk_1a = 1;
+ }
+ else
+ {
+ u16 IMEBackup = REG_IME;
+
+ REG_IME = 0;
+ gRfuStatic->unk_1a = Div(600, mcTimer);
+ REG_IME = IMEBackup;
+ }
+}
+
+void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname)
+{
+ u8 sp[16];
+ u8 i;
+ u8 r3;
+ const u8 *gnameBackup = gname;
+ const u8 *unameBackup;
+
+ sp[0] = serialNo;
+ sp[1] = serialNo >> 8;
+ if (mbootFlag != 0)
+ sp[1] = (serialNo >> 8) | 0x80;
+ for (i = 2; i < 15; ++i)
+ sp[i] = *gname++;
+ r3 = 0;
+ unameBackup = uname;
+ for (i = 0; i < 8; ++i)
+ {
+ r3 += *unameBackup++;
+ r3 += *gnameBackup++;
+ }
+ sp[15] = ~r3;
+ if (mbootFlag != 0)
+ sp[14] = 0;
+ STWI_set_Callback_M(rfu_CB_configGameData);
+ STWI_send_GameConfigREQ(sp, uname);
+}
+
+static void rfu_CB_configGameData(u8 ip, u16 r7)
+{
+ s32 r2, r3;
+ u8 *r4;
+ u8 i;
+ u8 *r1;
+
+ if (r7 == 0)
+ {
+ r1 = gSTWIStatus->txPacket->rfuPacket8.data;
+ r2 = gRfuLinkStatus->my.serialNo = r1[4];
+ gRfuLinkStatus->my.serialNo = (r1[5] << 8) | r2;
+ r4 = &r1[6];
+ if (gRfuLinkStatus->my.serialNo & 0x8000)
+ {
+ gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000;
+ gRfuLinkStatus->my.mbootFlag = 1;
+ }
+ else
+ {
+ gRfuLinkStatus->my.mbootFlag = 0;
+ }
+ for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i)
+ gRfuLinkStatus->my.gname[i] = *r4++;
+ ++r4;
+ for (i = 0; i < RFU_USER_NAME_LENGTH; ++i)
+ gRfuLinkStatus->my.uname[i] = *r4++;
+ }
+ rfu_STC_REQ_callback(ip, r7);
+}
+
+void rfu_REQ_startSearchChild(void)
+{
+ u16 r1;
+
+ STWI_set_Callback_M(rfu_CB_defaultCallback);
+ STWI_send_SystemStatusREQ();
+ r1 = STWI_poll_CommandEnd();
+ if (r1 == 0)
+ {
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
+ rfu_STC_clearLinkStatus(1);
+ }
+ else
+ {
+ rfu_STC_REQ_callback(25, r1);
+ }
+ STWI_set_Callback_M(rfu_CB_startSearchChild);
+ STWI_send_SC_StartREQ();
+}
+
+static void rfu_CB_startSearchChild(u8 r3, u16 reqResult)
+{
+ if (reqResult == 0)
+ gRfuStatic->SCStartFlag = 1;
+ rfu_STC_REQ_callback(r3, reqResult);
+}
+
+static void rfu_STC_clearLinkStatus(u8 r4)
+{
+ u8 i;
+
+ rfu_clearAllSlot();
+ if (r4 != 0)
+ {
+ CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));
+ gRfuLinkStatus->findParentCount = 0;
+ }
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ gRfuLinkStatus->strength[i] = 0;
+ gRfuLinkStatus->connCount = 0;
+ gRfuLinkStatus->connSlotFlag = 0;
+ gRfuLinkStatus->linkLossSlotFlag = 0;
+ gRfuLinkStatus->getNameFlag = 0;
+}
+
+void rfu_REQ_pollSearchChild(void)
+{
+ STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild);
+ STWI_send_SC_PollingREQ();
+}
+
+void rfu_REQ_endSearchChild(void)
+{
+ STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild);
+ STWI_send_SC_EndREQ();
+}
+
+static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult)
+{
+ if (reqResult == 0)
+ rfu_STC_readChildList();
+ if (r4 == 26)
+ {
+ if (gRfuLinkStatus->my.id == 0)
+ {
+ STWI_set_Callback_M(rfu_CB_defaultCallback);
+ STWI_send_SystemStatusREQ();
+ if (STWI_poll_CommandEnd() == 0)
+ gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
+ }
+ }
+ else if (r4 == 27)
+ {
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
+ gRfuLinkStatus->my.id = 0;
+ gRfuStatic->SCStartFlag = 0;
+ }
+ rfu_STC_REQ_callback(r4, reqResult);
+}
+
+static void rfu_STC_readChildList(void)
+{
+ u32 r5;
+ u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1];
+ u8 *r4;
+ u8 i;
+ u8 sp[4];
+ u8 r2;
+
+ if (r8 != 0)
+ {
+ r5 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
+ STWI_set_Callback_M(rfu_CB_defaultCallback);
+ STWI_send_LinkStatusREQ();
+ if (STWI_poll_CommandEnd() == 0)
+ {
+ r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
+ for (i = 0; i < NELEMS(sp); ++i)
+ sp[i] = *r4++;
+ }
+ gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = r5;
+ }
+ for (r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
+ r8 != 0;
+ r4 += 4)
+ {
+ r2 = r4[2];
+ if (r2 < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1))
+ {
+ if (sp[r2] != 0)
+ ++gRfuStatic->lsFixedCount[r2];
+ if (gRfuStatic->lsFixedCount[r2] >= 4)
+ {
+ gRfuStatic->lsFixedCount[r2] = 0;
+ gRfuLinkStatus->strength[r2] = 0xFF;
+ gRfuLinkStatus->connSlotFlag |= 1 << r2;
+ ++gRfuLinkStatus->connCount;
+ gRfuLinkStatus->partner[r2].id = *(u16 *)r4;
+ gRfuLinkStatus->partner[r2].slot = r2;
+ gRfuLinkStatus->parentChild = MODE_PARENT;
+ gRfuStatic->flags &= 0x7F;
+ gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id;
+ }
+ }
+ --r8;
+ }
+}
+
+void rfu_REQ_startSearchParent(void)
+{
+ STWI_set_Callback_M(rfu_CB_startSearchParent);
+ STWI_send_SP_StartREQ();
+}
+
+static void rfu_CB_startSearchParent(u8 r5, u16 reqResult)
+{
+ if (reqResult == 0)
+ rfu_STC_clearLinkStatus(0);
+ rfu_STC_REQ_callback(r5, reqResult);
+}
+
+void rfu_REQ_pollSearchParent(void)
+{
+ STWI_set_Callback_M(rfu_CB_pollSearchParent);
+ STWI_send_SP_PollingREQ();
+}
+
+static void rfu_CB_pollSearchParent(u8 r5, u16 reqResult)
+{
+ if (reqResult == 0)
+ rfu_STC_readParentCandidateList();
+ rfu_STC_REQ_callback(r5, reqResult);
+}
+
+void rfu_REQ_endSearchParent(void)
+{
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_SP_EndREQ();
+}
+
+static void rfu_STC_readParentCandidateList(void)
+{
+ u8 r7, r6, r5, r4, r3;
+ u8 *r1, *r2;
+ struct RfuTgtData *r4_;
+
+ CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));
+ r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0];
+ r7 = r2[1];
+ r2 += 4;
+ gRfuLinkStatus->findParentCount = 0;
+ for (r6 = 0; r6 < 4 && r7 != 0; ++r6)
+ {
+ r7 -= 7;
+ r1 = r2 + 6;
+ r2 += 19;
+ r5 = ~*r2;
+ ++r2;
+ r4 = 0;
+ for (r3 = 0; r3 < 8; ++r3)
+ {
+ r4 += *r2++;
+ r4 += *r1++;
+ }
+ if (r4 == r5)
+ {
+ r2 -= 28;
+ r4_ = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount];
+ r4_->id = *(u16 *)r2;
+ r2 += 2;
+ r4_->slot = *r2;
+ r2 += 2;
+ r4_->serialNo = *(u16 *)r2 & 0x7FFF;
+ if (*(u16 *)r2 & 0x8000)
+ r4_->mbootFlag = 1;
+ else
+ r4_->mbootFlag = 0;
+ r2 += 2;
+ for (r3 = 0; r3 < RFU_GAME_NAME_LENGTH; ++r3)
+ r4_->gname[r3] = *r2++;
+ ++r2;
+ for (r3 = 0; r3 < RFU_USER_NAME_LENGTH; ++r3)
+ r4_->uname[r3] = *r2++;
+ ++gRfuLinkStatus->findParentCount;
+ }
+ }
+}
+
+void rfu_REQ_startConnectParent(u16 pid)
+{
+ u16 r3 = 0;
+ u8 i;
+ for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i)
+ ;
+ if (i == 4)
+ r3 = 256;
+ if (r3 == 0)
+ {
+ gRfuStatic->tryPid = pid;
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_CP_StartREQ(pid);
+ }
+ else
+ {
+ rfu_STC_REQ_callback(31, r3);
+ }
+}
+
+void rfu_REQ_pollConnectParent(void)
+{
+ STWI_set_Callback_M(rfu_CB_pollConnectParent);
+ STWI_send_CP_PollingREQ();
+}
+
+static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28)
+{
+ u16 id;
+ u8 slot;
+ u8 r2, r5;
+ struct RfuTgtData *r9;
+ struct RfuTgtData sp;
+
+ if (sp28 == 0)
+ {
+ id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
+ slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6];
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
+ {
+ r2 = 1 << slot;
+ if (!(r2 & gRfuLinkStatus->connSlotFlag))
+ {
+ gRfuLinkStatus->connSlotFlag |= r2;
+ gRfuLinkStatus->linkLossSlotFlag &= ~r2;
+ gRfuLinkStatus->my.id = id;
+ ++gRfuLinkStatus->connCount;
+ gRfuLinkStatus->parentChild = MODE_CHILD;
+ gRfuStatic->flags |= 0x80;
+ for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5)
+ {
+ if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid)
+ {
+ if (gRfuLinkStatus->findParentCount != 0)
+ {
+ r9 = &sp;
+ CpuCopy16(&gRfuLinkStatus->partner[r5], &sp, sizeof(struct RfuTgtData));
+ CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));
+ gRfuLinkStatus->findParentCount = 0;
+ }
+ else
+ {
+ r9 = &gRfuLinkStatus->partner[r5];
+ }
+ break;
+ }
+ }
+ if (r5 < RFU_CHILD_MAX)
+ {
+ CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData));
+ gRfuLinkStatus->partner[slot].slot = slot;
+ }
+ }
+ }
+ }
+ rfu_STC_REQ_callback(sp24, sp28);
+}
+
+u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo)
+{
+ u8 r0, *r2;
+
+ *status = 0xFF;
+ r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
+ r0 = r2[0] + 96;
+ if (r0 <= 1)
+ {
+ r2 += 6;
+ *connectSlotNo = r2[0];
+ *status = r2[1];
+ return 0;
+ }
+ return ERR_REQ_CMD_ID;
+}
+
+void rfu_REQ_endConnectParent(void)
+{
+ STWI_set_Callback_M(rfu_CB_pollConnectParent);
+ STWI_send_CP_EndREQ();
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6] < 4)
+ gRfuStatic->linkEmergencyFlag[gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]] = 0;
+}
+
+u16 rfu_syncVBlank(void)
+{
+ u8 r3, r4;
+ s32 r5;
+
+ rfu_NI_checkCommFailCounter();
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
+ return 0;
+ if (gRfuStatic->nowWatchInterval != 0)
+ --gRfuStatic->nowWatchInterval;
+ r3 = rfu_getMasterSlave();
+ if (!(gRfuStatic->flags & 2))
+ {
+ if (r3 == 0)
+ {
+ gRfuStatic->flags |= 4;
+ gRfuStatic->watchdogTimer = 360;
+ }
+ }
+ else if (r3 != 0)
+ {
+ gRfuStatic->flags &= 0xFB;
+ }
+ if (r3 != 0)
+ gRfuStatic->flags &= 0xFD;
+ else
+ gRfuStatic->flags |= 2;
+ if (!(gRfuStatic->flags & 4))
+ return 0;
+ if (gRfuStatic->watchdogTimer == 0)
+ {
+ gRfuStatic->flags &= 0xFB;
+ r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
+ for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
+ if ((r5 >> r4) & 1)
+ rfu_STC_removeLinkData(r4, 1);
+ gRfuLinkStatus->parentChild = MODE_NEUTRAL;
+ return 1;
+ }
+ --gRfuStatic->watchdogTimer;
+ return 0;
+}
+
+u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot)
+{
+ u8 sp08 = 0;
+ u8 sp0C = 0;
+ u8 i;
+ s32 sp10, sp14;
+ u8 *r2;
+ u8 r9, r6, r3, connSlotFlag, r0;
+
+ *bmLinkLossSlot = 0;
+ *linkLossReason = REASON_DISCONNECTED;
+ *parentBmLinkRecoverySlot = 0;
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL || gSTWIStatus->msMode == 0)
+ return 0;
+ if (gRfuStatic->flags & 4)
+ gRfuStatic->watchdogTimer = 360;
+ if (gRfuStatic->nowWatchInterval == 0)
+ {
+ gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval;
+ sp08 = 1;
+ }
+ if ((u8)reqCommandId == 41)
+ {
+ u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
+
+ *bmLinkLossSlot = r1[4];
+ *linkLossReason = r1[5];
+ if (*linkLossReason == REASON_LINK_LOSS)
+ *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag;
+ sp08 = 2;
+ }
+ else
+ {
+ if (reqCommandId == 310)
+ {
+ r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5];
+ r6 ^= gRfuLinkStatus->connSlotFlag;
+ *bmLinkLossSlot = r6 & gRfuLinkStatus->connSlotFlag;
+ *linkLossReason = REASON_LINK_LOSS;
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ {
+ if ((*bmLinkLossSlot >> 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 < RFU_CHILD_MAX; ++i)
+ gRfuLinkStatus->strength[i] = *r2++;
+ r9 = 0;
+ i = 0;
+ }
+ else
+ {
+ rfu_STC_REQ_callback(17, sp0C);
+ return sp0C;
+ }
+ for (; i < RFU_CHILD_MAX; ++i)
+ {
+ r6 = 1 << i;
+ if (sp0C == 0)
+ {
+ if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6))
+ {
+ if (gRfuLinkStatus->strength[i] == 0)
+ {
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ ++gRfuStatic->linkEmergencyFlag[i];
+ if (gRfuStatic->linkEmergencyFlag[i] > 3)
+ {
+ *bmLinkLossSlot |= r6;
+ *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS?
+ }
+ }
+ else
+ {
+ STWI_send_SystemStatusREQ();
+ if (STWI_poll_CommandEnd() == 0)
+ {
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
+ {
+ *bmLinkLossSlot |= r6;
+ *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS?
+ }
+ else
+ {
+ if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->unk_1a)
+ {
+ gRfuStatic->linkEmergencyFlag[i] = 0;
+ STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag);
+ STWI_poll_CommandEnd();
+ *bmLinkLossSlot |= r6;
+ *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS?
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0?
+ }
+ }
+ if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0)
+ {
+ if (r6 & gRfuLinkStatus->linkLossSlotFlag)
+ {
+ if (gRfuLinkStatus->strength[i] > 10)
+ {
+ *parentBmLinkRecoverySlot |= 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;
+ }
+ }
+ }
+ }
+ }
+ }
+ connSlotFlag = gRfuLinkStatus->connSlotFlag;
+ r0 = *bmLinkLossSlot;
+ r0 &= connSlotFlag;
+ 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;
+}
+
+static 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->parentChild = MODE_NEUTRAL;
+ 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 bmDisconnectSlot)
+{
+ u16 r1;
+
+ if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot)
+ {
+ gRfuStatic->recoveryBmSlot = bmDisconnectSlot;
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gRfuStatic->flags & 0x80)
+ {
+ if (gRfuLinkStatus->linkLossSlotFlag & bmDisconnectSlot)
+ 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(bmDisconnectSlot);
+ }
+ }
+}
+
+static void rfu_CB_disconnect(u8 r6, u16 r5)
+{
+ u8 r4, r0;
+
+ if (r5 == 3 && gRfuLinkStatus->parentChild == MODE_CHILD)
+ {
+ 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 < RFU_CHILD_MAX; ++r4)
+ {
+ r0 = 1 << r4;
+ if (r0 & gRfuStatic->recoveryBmSlot)
+ rfu_STC_removeLinkData(r4, 1);
+ }
+ }
+ if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0)
+ gRfuLinkStatus->parentChild = MODE_NEUTRAL;
+ 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 bmRecoverySlot)
+{
+ u8 i;
+
+ gRfuStatic->recoveryBmSlot = bmRecoverySlot;
+ for (i = 0; i < RFU_CHILD_MAX && !((bmRecoverySlot >> 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, bmRecoverySlot);
+}
+
+void rfu_REQ_CHILD_pollConnectRecovery(void)
+{
+ STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery);
+ STWI_send_CPR_PollingREQ();
+}
+
+static 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->parentChild = MODE_CHILD;
+ 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 ERR_REQ_CMD_ID;
+}
+
+void rfu_REQ_CHILD_endConnectRecovery(void)
+{
+ STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery);
+ STWI_send_CPR_EndREQ();
+}
+
+static 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 masterSlave = STWI_read_status(1);
+
+ if (masterSlave == AGB_CLK_MASTER)
+ {
+ if (gSTWIStatus->unk_2c)
+ {
+ if (gSTWIStatus->reqActiveCommand == 39
+ || gSTWIStatus->reqActiveCommand == 37
+ || gSTWIStatus->reqActiveCommand == 55)
+ masterSlave = AGB_CLK_SLAVE;
+ }
+ }
+ return masterSlave;
+}
+
+void rfu_clearAllSlot(void)
+{
+ u16 i;
+ u16 IMEBackup = REG_IME;
+
+ REG_IME = 0;
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ {
+ CpuFill16(0, gRfuSlotStatusNI[i], 2 * sizeof(struct NIComm));
+ CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(struct UNISend) + sizeof(struct UNIRecv));
+ gRfuLinkStatus->remainLLFrameSizeChild[i] = 16;
+ }
+ gRfuLinkStatus->remainLLFrameSizeParent = LLF_P_SIZE;
+ gRfuLinkStatus->sendSlotNIFlag = 0;
+ gRfuLinkStatus->recvSlotNIFlag = 0;
+ gRfuLinkStatus->sendSlotUNIFlag = 0;
+ gRfuStatic->recvRenewalFlag = 0;
+ REG_IME = IMEBackup;
+}
+
+static 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;
+ }
+}
+
+u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex)
+{
+ u16 r10, r3, r1;
+ struct NIComm *r4;
+
+ if (slotStatusIndex >= RFU_CHILD_MAX)
+ return ERR_SLOT_NO;
+ if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV)))
+ return ERR_COMM_TYPE;
+ r10 = REG_IME;
+ REG_IME = 0;
+ if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV))
+ {
+ for (r3 = 0; r3 < 2; ++r3)
+ {
+ r4 = NULL;
+ if (r3 == 0)
+ {
+ if (connTypeFlag & TYPE_NI_SEND)
+ {
+ r4 = &gRfuSlotStatusNI[slotStatusIndex]->send;
+ gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg;
+ }
+ }
+ else
+ {
+ if (connTypeFlag & TYPE_NI_RECV)
+ {
+ r4 = &gRfuSlotStatusNI[slotStatusIndex]->recv;
+ gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex);
+ }
+ }
+ if (r4 != NULL)
+ {
+ if (r4->state & SLOT_BUSY_FLAG)
+ {
+ rfu_STC_releaseFrame(slotStatusIndex, r3, r4);
+ for (r1 = 0; r1 < RFU_CHILD_MAX; ++r1)
+ if ((r4->bmSlotOrg >> r1) & 1)
+ r4->failCounter = 0;
+ }
+ CpuFill16(0, r4, sizeof(struct NIComm));
+ }
+ }
+ }
+ if (connTypeFlag & TYPE_UNI_SEND)
+ {
+ struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[slotStatusIndex];
+
+ if (r3->send.state & SLOT_BUSY_FLAG)
+ {
+ if (!(gRfuStatic->flags & 0x80))
+ gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->send.payloadSize;
+ else
+ gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)r3->send.payloadSize;
+ gRfuLinkStatus->sendSlotUNIFlag &= ~r3->send.bmSlot;
+ }
+ CpuFill16(0, &r3->send, sizeof(struct UNISend));
+ }
+ if (connTypeFlag & TYPE_UNI_RECV)
+ {
+ CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv));
+ }
+ REG_IME = r10;
+ return 0;
+}
+
+u16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize)
+{
+ if (slotNo >= RFU_CHILD_MAX)
+ return ERR_SLOT_NO;
+ if (connType & TYPE_NI)
+ {
+ gRfuSlotStatusNI[slotNo]->recvBuffer = buffer;
+ gRfuSlotStatusNI[slotNo]->recvBufferSize = buffSize;
+ }
+ else if (!(connType & TYPE_UNI))
+ {
+ return ERR_COMM_TYPE;
+ }
+ else
+ {
+ gRfuSlotStatusUNI[slotNo]->recvBuffer = buffer;
+ gRfuSlotStatusUNI[slotNo]->recvBufferSize = buffSize;
+ }
+ return 0;
+}
+
+u16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size)
+{
+ return rfu_STC_setSendData_org(32, bmSendSlot, subFrameSize, src, size);
+}
+
+u16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size)
+{
+ u8 subFrameSize;
+
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ subFrameSize = size + 3;
+ else
+ subFrameSize = size + 2;
+ return rfu_STC_setSendData_org(16, bmSendSlot, subFrameSize, src, 0);
+}
+
+u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize)
+{
+ return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26);
+}
+
+static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 sp28)
+{
+ u8 r2, r0;
+ u8 r4;
+ u8 *r9;
+ u8 r5;
+ u8 i;
+ u16 sp04;
+ struct RfuSlotStatusUNI *r1;
+ struct RfuSlotStatusNI *r12;
+
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
+ return ERR_MODE_NOT_CONNECTED;
+ if (!(bmSendSlot & 0xF))
+ return ERR_SLOT_NO;
+ if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot)
+ return ERR_SLOT_NOT_CONNECTED;
+ if (r6 & 0x10)
+ r0 = gRfuLinkStatus->sendSlotUNIFlag;
+ else
+ r0 = gRfuLinkStatus->sendSlotNIFlag;
+ if (r0 & bmSendSlot)
+ return ERR_SLOT_BUSY;
+ for (r2 = 0; r2 < RFU_CHILD_MAX && !((bmSendSlot >> r2) & 1); ++r2)
+ ;
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ r9 = &gRfuLinkStatus->remainLLFrameSizeParent;
+ else if (gRfuLinkStatus->parentChild == MODE_CHILD)
+ r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2];
+ r4 = llsf_struct[gRfuLinkStatus->parentChild].unk00;
+ if (subFrameSize > *r9 || subFrameSize <= r4)
+ return ERR_SUBFRAME_SIZE;
+ 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->send.errorCode = 0;
+ *r12->send.now_p = r1 = &r12->send.dataType;
+ r12->send.remainSize = 7;
+ r12->send.bmSlotOrg = bmSendSlot;
+ r12->send.bmSlot = bmSendSlot;
+ r12->send.payloadSize = subFrameSize - r4;
+ if (r5 != 0)
+ *r1 = 0;
+ else
+ *r1 = 1;
+ r12->send.dataSize = sp28;
+ r12->send.src = src;
+ r12->send.ack = 0;
+ r12->send.phase = 0;
+ #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette
+ asm("":::"r2");
+ #endif
+ for (i = 0; i < WINDOW_COUNT; ++i)
+ {
+ r12->send.recvAckFlag[i] = 0;
+ r12->send.n[i] = 1;
+ }
+ for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2)
+ if ((bmSendSlot >> r2) & 1)
+ gRfuSlotStatusNI[r2]->send.failCounter = 0;
+ gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot;
+ *r9 -= subFrameSize;
+ r12->send.state = SLOT_STATE_SEND_START;
+ }
+ else if (r6 & 0x10)
+ {
+ r1 = gRfuSlotStatusUNI[r2];
+ r1->send.bmSlot = bmSendSlot;
+ r1->send.src = src;
+ r1->send.payloadSize = subFrameSize - r4;
+ *r9 -= subFrameSize;
+ r1->send.state = SLOT_STATE_SEND_UNI;
+ gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot;
+ }
+ REG_IME = sp04;
+ return 0;
+}
+
+u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot)
+{
+ struct RfuSlotStatusNI *r5;
+ u16 r8;
+ u8 r2;
+
+ if (slotStatusIndex >= RFU_CHILD_MAX)
+ return ERR_SLOT_NO;
+ if (connType == 0x20)
+ {
+ r5 = gRfuSlotStatusNI[slotStatusIndex];
+ if ((r5->send.state & SLOT_BUSY_FLAG)
+ && (r5->send.state & SLOT_SEND_FLAG))
+ {
+ connType = bmNewTgtSlot ^ r5->send.bmSlot;
+
+ if (!(connType & bmNewTgtSlot))
+ {
+ if (connType)
+ {
+ r8 = REG_IME;
+ REG_IME = 0;
+ for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2)
+ {
+ if ((connType >> r2) & 1)
+ gRfuSlotStatusNI[r2]->send.failCounter = 0;
+ }
+ gRfuLinkStatus->sendSlotNIFlag &= ~connType;
+ r5->send.bmSlot = bmNewTgtSlot;
+ if (r5->send.bmSlot == 0)
+ {
+ rfu_STC_releaseFrame(slotStatusIndex, 0, &r5->send);
+ r5->send.state = SLOT_STATE_SEND_FAILED;
+ }
+ REG_IME = r8;
+ }
+ }
+ else
+ {
+ return ERR_SLOT_TARGET;
+ }
+ }
+ else
+ {
+ return ERR_SLOT_NOT_SENDING;
+ }
+ }
+ else
+ {
+ if (connType == 16)
+ {
+ s32 r3;
+
+ if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI)
+ return ERR_SLOT_NOT_SENDING;
+ for (r3 = 0, r2 = 0; r2 < RFU_CHILD_MAX; ++r2)
+ if (r2 != slotStatusIndex)
+ r3 |= gRfuSlotStatusUNI[r2]->send.bmSlot;
+ if (bmNewTgtSlot & r3)
+ return ERR_SLOT_TARGET;
+ r8 = REG_IME;
+ REG_IME = 0;
+ gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot;
+ gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot;
+ gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot;
+ REG_IME = r8;
+ }
+ else
+ {
+ return ERR_COMM_TYPE;
+ }
+ }
+ return 0;
+}
+
+u16 rfu_NI_stopReceivingData(u8 slotStatusIndex)
+{
+ struct NIComm *r5;
+ u16 r4, r1;
+
+ if (slotStatusIndex >= RFU_CHILD_MAX)
+ return ERR_SLOT_NO;
+ r5 = &gRfuSlotStatusNI[slotStatusIndex]->recv;
+ r4 = REG_IME;
+ ++r4; --r4; // fix r4, r5 register swap
+ REG_IME = 0;
+ if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG)
+ {
+ if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == SLOT_STATE_RECV_LAST)
+ gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN;
+ else
+ gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED;
+ gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex);
+ rfu_STC_releaseFrame(slotStatusIndex, 1, r5);
+ }
+ REG_IME = r4;
+ return 0;
+}
+
+u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size)
+{
+ struct UNISend *r4;
+ u8 *r6;
+ u16 r1;
+ u8 r3_;
+
+ if (slotStatusIndex >= RFU_CHILD_MAX)
+ return ERR_SLOT_NO;
+ r4 = &gRfuSlotStatusUNI[slotStatusIndex]->send;
+ if (r4->state != SLOT_STATE_SEND_UNI)
+ return ERR_SLOT_NOT_SENDING;
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ r6 = &gRfuLinkStatus->remainLLFrameSizeParent;
+ r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize;
+ }
+ else
+ {
+ r6 = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex];
+ r3_ = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)r4->payloadSize;
+ }
+ if (r3_ < size)
+ return ERR_SUBFRAME_SIZE;
+ r1 = REG_IME;
+ REG_IME = 0;
+ r4->src = src;
+ *r6 = r3_ - size;
+ r4->payloadSize = size;
+ r4->dataReadyFlag = 1;
+ REG_IME = r1;
+ return 0;
+}
+
+void rfu_UNI_readySendData(u8 slotStatusIndex)
+{
+ if (slotStatusIndex < RFU_CHILD_MAX)
+ {
+ if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == SLOT_STATE_SEND_UNI)
+ gRfuSlotStatusUNI[slotStatusIndex]->send.dataReadyFlag = 1;
+ }
+}
+
+void rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex)
+{
+ if (slotStatusIndex < RFU_CHILD_MAX)
+ gRfuSlotStatusUNI[slotStatusIndex]->recv.newDataFlag = 0;
+}
+
+void rfu_REQ_sendData(u8 clockChangeFlag)
+{
+ if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)
+ {
+ if (gRfuLinkStatus->parentChild == 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 (clockChangeFlag == 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 (clockChangeFlag != 0)
+ {
+ STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4);
+ return;
+ }
+ STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4);
+ }
+ }
+ if (clockChangeFlag != 0)
+ {
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ if (gSTWIStatus->callbackS != NULL)
+ gSTWIStatus->callbackS(39);
+ }
+ else
+ {
+ STWI_set_Callback_M(rfu_CB_sendData2);
+ STWI_send_MS_ChangeREQ();
+ }
+ }
+ }
+}
+
+static void rfu_CB_sendData(UNUSED u8 r0, u16 r7)
+{
+ u8 r6;
+ struct NIComm *r4;
+
+ if (r7 == 0)
+ {
+ for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6)
+ {
+ if (gRfuSlotStatusUNI[r6]->send.dataReadyFlag)
+ gRfuSlotStatusUNI[r6]->send.dataReadyFlag = 0;
+ r4 = &gRfuSlotStatusNI[r6]->send;
+ if (r4->state == SLOT_STATE_SEND_NULL)
+ {
+ rfu_STC_releaseFrame(r6, 0, r4);
+ gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot;
+ if (r4->dataType == 1)
+ gRfuLinkStatus->getNameFlag |= 1 << r6;
+ r4->state = SLOT_STATE_SEND_SUCCESS;
+ }
+ }
+ }
+ gRfuLinkStatus->LLFReadyFlag = 0;
+ rfu_STC_REQ_callback(36, r7);
+}
+
+static void rfu_CB_sendData2(UNUSED u8 r0, u16 r1)
+{
+ rfu_STC_REQ_callback(36, r1);
+}
+
+static 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);
+}
+
+static void rfu_constructSendLLFrame(void)
+{
+ u32 r8, r5;
+ u8 r6;
+ u8 *sp00;
+ struct RfuSlotStatusNI *r2;
+
+ if (gRfuLinkStatus->parentChild != MODE_NEUTRAL
+ && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)
+ {
+ gRfuLinkStatus->LLFReadyFlag = 0;
+ r8 = 0;
+ sp00 = (u8 *)&gRfuFixed->LLFBuffer[1];
+ for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6)
+ {
+ r5 = 0;
+ if (gRfuSlotStatusNI[r6]->send.state & SLOT_BUSY_FLAG)
+ r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->send);
+ if (gRfuSlotStatusNI[r6]->recv.state & SLOT_BUSY_FLAG)
+ r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->recv);
+ if (gRfuSlotStatusUNI[r6]->send.state == SLOT_STATE_SEND_UNI)
+ r5 += rfu_STC_UNI_constructLLSF(r6, &sp00);
+ if (r5 != 0)
+ {
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ r8 += r5;
+ else
+ r8 |= r5 << (5 * r6 + 8);
+ }
+ }
+ if (r8 != 0)
+ {
+ while ((u32)sp00 & 3)
+ *sp00++ = 0;
+ gRfuFixed->LLFBuffer[0] = r8;
+ if (gRfuLinkStatus->parentChild == MODE_CHILD)
+ {
+ 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;
+ }
+}
+
+static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4)
+{
+ u16 r5;
+ u32 sp00;
+ u8 i;
+ u8 *r2;
+ const struct LLSFStruct *r8 = &llsf_struct[gRfuLinkStatus->parentChild];
+
+ if (r4->state == SLOT_STATE_SENDING)
+ {
+ while (r4->now_p[r4->phase] >= (const u8 *)r4->src + r4->dataSize)
+ {
+ ++r4->phase;
+ if (r4->phase == 4)
+ r4->phase = 0;
+ }
+ }
+ if (r4->state & SLOT_RECV_FLAG)
+ {
+ r5 = 0;
+ }
+ else if (r4->state == SLOT_STATE_SENDING)
+ {
+ if (r4->now_p[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize)
+ r5 = (const u8 *)r4->src + r4->dataSize - r4->now_p[r4->phase];
+ else
+ r5 = r4->payloadSize;
+ }
+ else
+ {
+ if ((u32)r4->remainSize >= r4->payloadSize)
+ r5 = r4->payloadSize;
+ else
+ r5 = r4->remainSize;
+ }
+ sp00 = (r4->state & 0xF) << r8->unk03
+ | r4->ack << r8->unk04
+ | r4->phase << r8->unk05
+ | r4->n[r4->phase] << r8->unk06
+ | r5;
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ sp00 |= r4->bmSlot << 18;
+ r2 = (u8 *)&sp00;
+ for (i = 0; i < r8->unk00; ++i)
+ *(*r12)++ = *r2++;
+ if (r5 != 0)
+ {
+ const u8 *sp04 = r4->now_p[r4->phase];
+
+ gRfuFixed->fastCopyPtr(&sp04, r12, r5);
+ }
+ if (r4->state == SLOT_STATE_SENDING)
+ {
+ ++r4->phase;
+ if (r4->phase == 4)
+ r4->phase = 0;
+ }
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ gRfuLinkStatus->LLFReadyFlag = 1;
+ else
+ gRfuLinkStatus->LLFReadyFlag |= 1 << r10;
+ return r5 + r8->unk00;
+}
+
+static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6)
+{
+ const struct LLSFStruct *r5;
+ const u8 *sp04;
+ u32 sp00;
+ u8 *r2;
+ u8 i;
+ struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->send;
+
+ if (!r4->dataReadyFlag || !r4->bmSlot)
+ return 0;
+ r5 = &llsf_struct[gRfuLinkStatus->parentChild];
+ sp00 = (r4->state & 0xF) << r5->unk03
+ | r4->payloadSize;
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ sp00 |= r4->bmSlot << 18;
+ r2 = (u8 *)&sp00;
+ for (i = 0; i < r5->unk00; ++i)
+ *(*r6)++ = *r2++;
+ sp04 = r4->src;
+ gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize);
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ gRfuLinkStatus->LLFReadyFlag = 16;
+ else
+ gRfuLinkStatus->LLFReadyFlag |= 16 << r8;
+ return r5->unk00 + r4->payloadSize;
+}
+
+void rfu_REQ_recvData(void)
+{
+ if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)
+ {
+ gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag;
+ gRfuStatic->recvErrorFlag = 0;
+ STWI_set_Callback_M(rfu_CB_recvData);
+ STWI_send_DataRxREQ();
+ }
+}
+
+static 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->parentChild == MODE_PARENT)
+ rfu_STC_PARENT_analyzeRecvPacket();
+ else
+ rfu_STC_CHILD_analyzeRecvPacket();
+ for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6)
+ {
+ r4 = gRfuSlotStatusNI[r6];
+ if (r4->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> r6) & 1))
+ {
+ r5 = &r4->recv;
+ if (r5->dataType == 1)
+ gRfuLinkStatus->getNameFlag |= 1 << r6;
+ rfu_STC_releaseFrame(r6, 1, r5);
+ gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot;
+ r4->recv.state = SLOT_STATE_RECV_SUCCESS;
+ }
+ }
+ if (gRfuStatic->recvErrorFlag)
+ r7 = gRfuStatic->recvErrorFlag | ERR_DATA_RECV;
+ }
+ rfu_STC_REQ_callback(r9, r7);
+}
+
+static 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));
+ }
+ }
+}
+
+static 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));
+}
+
+static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3)
+{
+ struct RfuLocalStruct sp00;
+ const struct LLSFStruct *r6;
+ u32 r5;
+ u8 r4;
+ u32 r0;
+ u16 r10;
+
+ r6 = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)];
+ if (r3 < r6->unk00)
+ return r3;
+ r5 = 0;
+ for (r4 = 0; r4 < r6->unk00; ++r4)
+ r5 |= *r7++ << 8 * r4;
+ sp00.unk00 = (r5 >> r6->unk01) & r6->unk07;
+ sp00.unk01 = (r5 >> r6->unk02) & r6->unk08;
+ sp00.unk02 = (r5 >> r6->unk03) & r6->unk09;
+ sp00.unk03 = (r5 >> r6->unk04) & r6->unk0A;
+ sp00.unk04 = (r5 >> r6->unk05) & r6->unk0B;
+ sp00.unk05 = (r5 >> r6->unk06) & r6->unk0C;
+ sp00.unk06 = (r5 & r6->unk0E) & r5;
+ r10 = sp00.unk06 + r6->unk00;
+ if (sp00.unk00 == 0)
+ {
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ if ((gRfuLinkStatus->connSlotFlag >> r12) & 1)
+ {
+ if (sp00.unk02 == 4)
+ {
+ rfu_STC_UNI_receive(r12, &sp00, r7);
+ }
+ else if (sp00.unk03 == 0)
+ {
+ rfu_STC_NI_receive_Receiver(r12, &sp00, r7);
+ }
+ else
+ {
+ for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
+ if (((gRfuSlotStatusNI[r4]->send.bmSlot >> r12) & 1)
+ && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1))
+ break;
+ if (r4 <= 3)
+ rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7);
+ }
+ }
+ }
+ else
+ {
+ s32 r5 = gRfuLinkStatus->connSlotFlag & sp00.unk01;
+
+ if (r5)
+ {
+ for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
+ {
+ if ((r5 >> r4) & 1)
+ {
+ if (sp00.unk02 == 4)
+ rfu_STC_UNI_receive(r4, &sp00, r7);
+ else if (sp00.unk03 == 0)
+ rfu_STC_NI_receive_Receiver(r4, &sp00, r7);
+ else if ((gRfuLinkStatus->sendSlotNIFlag >> r4) & 1)
+ rfu_STC_NI_receive_Sender(r4, r4, &sp00, r7);
+ }
+ }
+ }
+ }
+ }
+ return r10;
+}
+
+static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 *sp00)
+{
+ u8 *sp04;
+ u32 r2;
+ struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7];
+ struct UNIRecv *r5 = &r3->recv;
+
+ r5->errorCode = 0;
+ if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06)
+ {
+ r3->recv.state = SLOT_STATE_RECV_IGNORE;
+ r5->errorCode = ERR_RECV_BUFF_OVER;
+ }
+ else
+ {
+ if (r5->dataBlockFlag)
+ {
+ if (r5->newDataFlag)
+ {
+ r5->errorCode = ERR_RECV_UNK;
+ goto _081E2F0E;
+ }
+ }
+ else
+ {
+ if (r5->newDataFlag)
+ r5->errorCode = ERR_RECV_DATA_OVERWRITED;
+ }
+ r5->state = SLOT_STATE_RECEIVING;
+ r2 = r5->dataSize = r6->unk06;
+ sp04 = gRfuSlotStatusUNI[r7]->recvBuffer;
+ gRfuFixed->fastCopyPtr(&sp00, &sp04, r2);
+ r5->newDataFlag = 1;
+ r5->state = 0;
+ }
+_081E2F0E:
+ if (r5->errorCode)
+ gRfuStatic->recvErrorFlag |= 16 << r7;
+}
+
+static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct *r6, const u8 *r3)
+{
+ struct NIComm *r12 = &gRfuSlotStatusNI[r0]->send;
+ u16 r9 = r12->state;
+ u8 sp00 = r12->n[r6->unk04];
+ u8 *r8;
+ u8 r4;
+ u16 r2;
+
+ if ((r6->unk02 == 2 && r9 == SLOT_STATE_SENDING)
+ || (r6->unk02 == 1 && r9 == SLOT_STATE_SEND_START)
+ || (r6->unk02 == 3 && r9 == SLOT_STATE_SEND_LAST))
+ {
+ if (r12->n[r6->unk04] == r6->unk05)
+ r12->recvAckFlag[r6->unk04] |= 1 << r10;
+ }
+ if ((r12->recvAckFlag[r6->unk04] & r12->bmSlot) == r12->bmSlot)
+ {
+ r12->n[r6->unk04] = (r12->n[r6->unk04] + 1) & 3;
+ r12->recvAckFlag[r6->unk04] = 0;
+ if ((u16)(r12->state + ~SLOT_STATE_SEND_NULL) <= 1)
+ {
+ if (r12->state == SLOT_STATE_SEND_START)
+ r12->now_p[r6->unk04] += r12->payloadSize;
+ else
+ r12->now_p[r6->unk04] += r12->payloadSize << 2;
+ r12->remainSize -= r12->payloadSize;
+ if (r12->remainSize != 0)
+ if (r12->remainSize >= 0)
+ goto _081E30AE;
+ // Above is a hack to avoid optimization over comparison.
+ // rfu_STC_NI_constructLLSF uses this field as u32.
+ // It's equivalent to the following condition:
+ // if (r12->remainSize == 0 || r12->remainSize < 0)
+ {
+ r12->phase = 0;
+ if (r12->state == SLOT_STATE_SEND_START)
+ {
+ for (r4 = 0; r4 < WINDOW_COUNT; ++r4)
+ {
+ r12->n[r4] = 1;
+ r12->now_p[r4] = r12->src + r12->payloadSize * r4;
+ }
+ r12->remainSize = r12->dataSize;
+ r12->state = SLOT_STATE_SENDING;
+ }
+ else
+ {
+ r12->n[0] = 0;
+ r12->remainSize = 0;
+ r12->state = SLOT_STATE_SEND_LAST;
+ }
+ }
+ _081E30AE:
+ }
+ else if (r12->state == SLOT_STATE_SEND_LAST)
+ {
+ r12->state = SLOT_STATE_SEND_NULL;
+ }
+ }
+ if (r12->state != r9
+ || r12->n[r6->unk04] != sp00
+ || (r12->recvAckFlag[r6->unk04] >> r10) & 1)
+ {
+ r2 = REG_IME;
+ REG_IME = 0;
+ gRfuStatic->recvRenewalFlag |= 16 << r10;
+ gRfuSlotStatusNI[r10]->send.failCounter = 0;
+ REG_IME = r2;
+ }
+}
+
+static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, const u8 *sp00)
+{
+ u16 r2;
+ u32 r7 = 0;
+ struct RfuSlotStatusNI *r4 = gRfuSlotStatusNI[r8];
+ struct NIComm *r5 = &r4->recv;
+ u16 r9 = r4->recv.state;
+ u8 r10 = r4->recv.n[r6->unk04];
+
+ if (r6->unk02 == 3)
+ {
+ gRfuStatic->NIEndRecvFlag |= 1 << r8;
+ if (r4->recv.state == SLOT_STATE_RECEIVING)
+ {
+ r4->recv.phase = 0;
+ r4->recv.n[0] = 0;
+ r4->recv.state = SLOT_STATE_RECV_LAST;
+ }
+ }
+ else if (r6->unk02 == 2)
+ {
+ if (r9 == SLOT_STATE_RECV_START && !r5->remainSize)
+ rfu_STC_NI_initSlot_asRecvDataEntity(r8, r5);
+ if (r5->state == SLOT_STATE_RECEIVING)
+ r7 = 1;
+ }
+ else if (r6->unk02 == 1)
+ {
+ if (r9 == SLOT_STATE_RECV_START)
+ {
+ r7 = 1;
+ }
+ else
+ {
+ rfu_STC_NI_initSlot_asRecvControllData(r8, r5);
+ if (r4->recv.state != SLOT_STATE_RECV_START)
+ return;
+ r7 = 1;
+ }
+ }
+ if (r7 != 0)
+ {
+ if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3))
+ {
+ gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->now_p[r6->unk04], r6->unk06);
+ if (r5->state == SLOT_STATE_RECEIVING)
+ r5->now_p[r6->unk04] += 3 * r5->payloadSize;
+ r5->remainSize -= r6->unk06;
+ r5->n[r6->unk04] = r6->unk05;
+ }
+ }
+ if (r5->errorCode == 0)
+ {
+ r5->phase = r6->unk04;
+ if (r5->state != r9 || r5->n[r6->unk04] != r10 || r5->n[r6->unk04] == r6->unk05)
+ {
+ r2 = REG_IME;
+ REG_IME = 0;
+ gRfuStatic->recvRenewalFlag |= 1 << r8;
+ r5->failCounter = 0;
+ REG_IME = r2;
+ }
+ }
+}
+
+static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2)
+{
+ u8 *r1;
+ u32 r5;
+ u8 r6;
+
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ r5 = 3;
+ r1 = &gRfuLinkStatus->remainLLFrameSizeParent;
+ }
+ else
+ {
+ r5 = 2;
+ r1 = &gRfuLinkStatus->remainLLFrameSizeChild[r4];
+ }
+ r6 = 1 << r4;
+ if (r2->state == 0)
+ {
+ if (*r1 < r5)
+ {
+ r2->state = SLOT_STATE_RECV_IGNORE;
+ r2->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE;
+ gRfuStatic->recvErrorFlag |= r6;
+ }
+ else
+ {
+ r2->errorCode = 0;
+ *r1 -= r5;
+ r2->now_p[0] = &r2->dataType;
+ r2->remainSize = 7;
+ r2->ack = 1;
+ r2->payloadSize = 0;
+ r2->bmSlot = r6;
+ r2->state = SLOT_STATE_RECV_START;
+ gRfuLinkStatus->recvSlotNIFlag |= r6;
+ }
+ }
+}
+
+static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4)
+{
+ u8 r1, r3;
+
+ if (r4->dataType == 1)
+ {
+ r4->now_p[0] = (void *)&gRfuLinkStatus->partner[r5].serialNo;
+ }
+ else
+ {
+ if (r4->dataSize > gRfuSlotStatusNI[r5]->recvBufferSize)
+ {
+ r1 = 1 << r5;
+ gRfuStatic->recvErrorFlag |= r1;
+ gRfuLinkStatus->recvSlotNIFlag &= ~r1;
+ r4->errorCode = ERR_RECV_BUFF_OVER;
+ r4->state = SLOT_STATE_RECV_FAILED;
+ rfu_STC_releaseFrame(r5, 1, r4);
+ return;
+ }
+ r4->now_p[0] = gRfuSlotStatusNI[r5]->recvBuffer;
+ }
+ for (r3 = 0; r3 < WINDOW_COUNT; ++r3)
+ {
+ r4->n[r3] = 0;
+ r4->now_p[r3] = &r4->now_p[0][r4->payloadSize * r3];
+ }
+ r4->remainSize = r4->dataSize;
+ r4->state = SLOT_STATE_RECEIVING;
+}
+
+static void rfu_NI_checkCommFailCounter(void)
+{
+ u16 r12;
+ u32 r7;
+ u8 r2, r3;
+
+ if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag)
+ {
+ r12 = REG_IME;
+ REG_IME = 0;
+ r7 = gRfuStatic->recvRenewalFlag >> 4;
+ for (r3 = 0; r3 < RFU_CHILD_MAX; ++r3)
+ {
+ r2 = 1 << r3;
+ if (gRfuLinkStatus->sendSlotNIFlag & r2
+ && !(gRfuStatic->recvRenewalFlag & r2))
+ ++gRfuSlotStatusNI[r3]->send.failCounter;
+ if (gRfuLinkStatus->recvSlotNIFlag & r2
+ && !(r7 & r2))
+ ++gRfuSlotStatusNI[r3]->recv.failCounter;
+ }
+ gRfuStatic->recvRenewalFlag = 0;
+ REG_IME = r12;
+ }
+}
+
+void rfu_REQ_noise(void)
+{
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_TestModeREQ(1, 0);
+}
diff --git a/src/librfu_s32id.c b/src/librfu_s32id.c
new file mode 100644
index 000000000..ed51dcd12
--- /dev/null
+++ b/src/librfu_s32id.c
@@ -0,0 +1,164 @@
+#include "librfu.h"
+
+static void Sio32IDIntr(void);
+static void Sio32IDInit(void);
+static s32 Sio32IDMain(void);
+
+struct RfuS32Id gRfuS32Id;
+
+static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO
+static const char Sio32IDLib_Var[] = "Sio32ID_030820";
+
+s32 AgbRFU_checkID(u8 r5)
+{
+ u16 r8;
+ vu16 *r4;
+ s32 r6;
+
+ if (REG_IME == 0)
+ return -1;
+ r8 = REG_IE;
+ gSTWIStatus->state = 10;
+ STWI_set_Callback_ID(Sio32IDIntr);
+ Sio32IDInit();
+ r4 = &REG_TMCNT_L(gSTWIStatus->timerSelect);
+ r5 *= 8;
+ while (--r5 != 0xFF)
+ {
+ r6 = Sio32IDMain();
+ if (r6 != 0)
+ break;
+ r4[1] = 0;
+ r4[0] = 0;
+ r4[1] = TIMER_1024CLK | TIMER_ENABLE;
+ while (r4[0] < 32)
+ ;
+ r4[1] = 0;
+ r4[0] = 0;
+ }
+ REG_IME = 0;
+ REG_IE = r8;
+ REG_IME = 1;
+ gSTWIStatus->state = 0;
+ STWI_set_Callback_ID(NULL);
+ return r6;
+}
+
+static void Sio32IDInit(void)
+{
+ REG_IME = 0;
+ REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL);
+ REG_IME = 1;
+ REG_RCNT = 0;
+ REG_SIOCNT = SIO_32BIT_MODE;
+ REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;
+ CpuFill32(0, &gRfuS32Id, sizeof(struct RfuS32Id));
+ REG_IF = INTR_FLAG_SERIAL;
+}
+
+static s32 Sio32IDMain(void)
+{
+ u8 r12;
+
+ switch (r12 = gRfuS32Id.unk1)
+ {
+ case 0:
+ gRfuS32Id.unk0 = 1;
+ REG_SIOCNT |= SIO_38400_BPS;
+ REG_IME = r12;
+ REG_IE |= INTR_FLAG_SERIAL;
+ REG_IME = 1;
+ gRfuS32Id.unk1 = 1;
+ *(vu8 *)&REG_SIOCNT |= SIO_ENABLE;
+ break;
+ case 1:
+ if (gRfuS32Id.unkA == 0)
+ {
+ if (gRfuS32Id.unk0 == 1)
+ {
+ if (gRfuS32Id.unk2 == 0)
+ {
+ REG_IME = gRfuS32Id.unk2;
+ REG_SIOCNT |= SIO_ENABLE;
+ REG_IME = r12;
+ }
+ }
+ else if (gRfuS32Id.unk4 != 0x8001 && !gRfuS32Id.unk2)
+ {
+ REG_IME = gRfuS32Id.unk2;
+ REG_IE &= ~INTR_FLAG_SERIAL;
+ REG_IME = r12;
+ REG_SIOCNT = gRfuS32Id.unk2;
+ REG_SIOCNT = SIO_32BIT_MODE;
+ REG_IF = INTR_FLAG_SERIAL;
+ REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;
+ REG_IME = gRfuS32Id.unk2;
+ REG_IE |= INTR_FLAG_SERIAL;
+ REG_IME = r12;
+ }
+ break;
+ }
+ else
+ {
+ gRfuS32Id.unk1 = 2;
+ // fallthrough
+ }
+ default:
+ return gRfuS32Id.unkA;
+ }
+ return 0;
+}
+
+static void Sio32IDIntr(void)
+{
+ u32 r5;
+ u16 r0;
+#ifndef NONMATCHING
+ register u32 r1 asm("r1");
+ register u16 r0_ asm("r0");
+#else
+ u32 r1;
+ u16 r0_;
+#endif
+
+ r5 = REG_SIODATA32;
+ if (gRfuS32Id.unk0 != 1)
+ REG_SIOCNT |= SIO_ENABLE;
+ r1 = 16 * gRfuS32Id.unk0; // to handle side effect of inline asm
+ r1 = (r5 << r1) >> 16;
+ r5 = (r5 << 16 * (1 - gRfuS32Id.unk0)) >> 16;
+ if (gRfuS32Id.unkA == 0)
+ {
+ if (r1 == gRfuS32Id.unk6)
+ {
+ if (gRfuS32Id.unk2 > 3)
+ {
+ gRfuS32Id.unkA = r5;
+ }
+ else if (r1 == (u16)~gRfuS32Id.unk4)
+ {
+ r0_ = ~gRfuS32Id.unk6;
+ if (r5 == r0_)
+ ++gRfuS32Id.unk2;
+ }
+ }
+ else
+ {
+ gRfuS32Id.unk2 = gRfuS32Id.unkA;
+ }
+ }
+ if (gRfuS32Id.unk2 < 4)
+ gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + Sio32ConnectionData);
+ else
+ gRfuS32Id.unk4 = 0x8001;
+ gRfuS32Id.unk6 = ~r5;
+ REG_SIODATA32 = (gRfuS32Id.unk4 << 16 * (1 - gRfuS32Id.unk0))
+ + (gRfuS32Id.unk6 << 16 * gRfuS32Id.unk0);
+ if (gRfuS32Id.unk0 == 1 && (gRfuS32Id.unk2 || r5 == 0x494E))
+ {
+ for (r0 = 0; r0 < 600; ++r0)
+ ;
+ if (gRfuS32Id.unkA == 0)
+ REG_SIOCNT |= SIO_ENABLE;
+ }
+}
diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c
new file mode 100644
index 000000000..b88f21737
--- /dev/null
+++ b/src/librfu_stwi.c
@@ -0,0 +1,647 @@
+#include "librfu.h"
+
+static void STWI_intr_timer(void);
+static u16 STWI_init(u8 request);
+static s32 STWI_start_Command(void);
+static void STWI_set_timer(u8 unk);
+static void STWI_stop_timer(void);
+static s32 STWI_restart_Command(void);
+static s32 STWI_reset_ClockCounter(void);
+
+struct STWIStatus *gSTWIStatus;
+
+void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam)
+{
+ // If we're copying our interrupt into RAM, DMA it to block1 and use
+ // block2 for our STWIStatus, otherwise block1 holds the STWIStatus.
+ // interrupt usually is a pointer to gIntrTable[1]
+ if (copyInterruptToRam == TRUE)
+ {
+ *interrupt = (IntrFunc)interruptStruct->block1;
+ DmaCopy16(3, &IntrSIO32, interruptStruct->block1, sizeof(interruptStruct->block1));
+ gSTWIStatus = &interruptStruct->block2;
+ }
+ else
+ {
+ *interrupt = IntrSIO32;
+ gSTWIStatus = (struct STWIStatus *)interruptStruct->block1;
+ }
+ gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc;
+ gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc;
+ gSTWIStatus->msMode = 1;
+ gSTWIStatus->state = 0;
+ gSTWIStatus->reqLength = 0;
+ gSTWIStatus->reqNext = 0;
+ gSTWIStatus->ackLength = 0;
+ gSTWIStatus->ackNext = 0;
+ gSTWIStatus->ackActiveCommand = 0;
+ gSTWIStatus->timerState = 0;
+ gSTWIStatus->timerActive = 0;
+ gSTWIStatus->error = 0;
+ gSTWIStatus->recoveryCount = 0;
+ gSTWIStatus->unk_2c = 0;
+ REG_RCNT = 0x100; // TODO: mystery bit?
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ STWI_init_Callback_M();
+ STWI_init_Callback_S();
+ IntrEnable(INTR_FLAG_SERIAL);
+}
+
+void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect)
+{
+ *interrupt = STWI_intr_timer;
+ gSTWIStatus->timerSelect = timerSelect;
+ IntrEnable(INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect);
+}
+
+void AgbRFU_SoftReset(void)
+{
+ vu16 *timerL;
+ vu16 *timerH;
+
+ REG_RCNT = 0x8000;
+ REG_RCNT = 0x80A0; // all these bits are undocumented
+ timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
+ timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
+ *timerH = 0;
+ *timerL = 0;
+ *timerH = TIMER_ENABLE | TIMER_1024CLK;
+ while (*timerL <= 0x11)
+ REG_RCNT = 0x80A2;
+ *timerH = 3;
+ REG_RCNT = 0x80A0;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ gSTWIStatus->state = 0;
+ gSTWIStatus->reqLength = 0;
+ gSTWIStatus->reqNext = 0;
+ gSTWIStatus->reqActiveCommand = 0;
+ gSTWIStatus->ackLength = 0;
+ gSTWIStatus->ackNext = 0;
+ gSTWIStatus->ackActiveCommand = 0;
+ gSTWIStatus->timerState = 0;
+ gSTWIStatus->timerActive = 0;
+ gSTWIStatus->error = 0;
+ gSTWIStatus->msMode = 1;
+ gSTWIStatus->recoveryCount = 0;
+ gSTWIStatus->unk_2c = 0;
+}
+
+void STWI_set_MS_mode(u8 mode)
+{
+ gSTWIStatus->msMode = mode;
+}
+
+u16 STWI_read_status(u8 index)
+{
+ switch (index)
+ {
+ case 0:
+ return gSTWIStatus->error;
+ case 1:
+ return gSTWIStatus->msMode;
+ case 2:
+ return gSTWIStatus->state;
+ case 3:
+ return gSTWIStatus->reqActiveCommand;
+ default:
+ return 0xFFFF;
+ }
+}
+
+void STWI_init_Callback_M(void)
+{
+ STWI_set_Callback_M(NULL);
+}
+
+void STWI_init_Callback_S(void)
+{
+ STWI_set_Callback_S(NULL);
+}
+
+// The callback can take 2 or 3 arguments.
+void STWI_set_Callback_M(void *callbackM)
+{
+ gSTWIStatus->callbackM = callbackM;
+}
+
+void STWI_set_Callback_S(void (*callbackS)(u16))
+{
+ gSTWIStatus->callbackS = callbackS;
+}
+
+void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer
+{
+ gSTWIStatus->unk_20 = func;
+}
+
+u16 STWI_poll_CommandEnd(void)
+{
+ while (gSTWIStatus->unk_2c == TRUE)
+ ;
+ return gSTWIStatus->error;
+}
+
+void STWI_send_ResetREQ(void)
+{
+ if (!STWI_init(ID_RESET_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_LinkStatusREQ(void)
+{
+ if (!STWI_init(ID_LINK_STATUS_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_VersionStatusREQ(void)
+{
+ if (!STWI_init(ID_VERSION_STATUS_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SystemStatusREQ(void)
+{
+ if (!STWI_init(ID_SYSTEM_STATUS_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SlotStatusREQ(void)
+{
+ if (!STWI_init(ID_SLOT_STATUS_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_ConfigStatusREQ(void)
+{
+ if (!STWI_init(ID_CONFIG_STATUS_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
+{
+ u8 *packetBytes;
+ s32 i;
+
+ if (!STWI_init(ID_GAME_CONFIG_REQ))
+ {
+ gSTWIStatus->reqLength = 6;
+ // TODO: what is unk1
+ packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
+ packetBytes += sizeof(u32);
+ *(u16 *)packetBytes = *(u16 *)unk1;
+ packetBytes += sizeof(u16);
+ unk1 += sizeof(u16);
+ for (i = 0; i < 14; ++i)
+ {
+ *packetBytes = *unk1;
+ ++packetBytes;
+ ++unk1;
+ }
+ for (i = 0; i < 8; ++i)
+ {
+ *packetBytes = *data;
+ ++packetBytes;
+ ++data;
+ }
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
+{
+ if (!STWI_init(ID_SYSTEM_CONFIG_REQ))
+ {
+ u8 *packetBytes;
+
+ gSTWIStatus->reqLength = 1;
+ packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
+ packetBytes += sizeof(u32);
+ *packetBytes++ = unk3;
+ *packetBytes++ = unk2;
+ *(u16*)packetBytes = unk1;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SC_StartREQ(void)
+{
+ if (!STWI_init(ID_SC_START_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SC_PollingREQ(void)
+{
+ if (!STWI_init(ID_SC_POLL_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SC_EndREQ(void)
+{
+ if (!STWI_init(ID_SC_END_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SP_StartREQ(void)
+{
+ if (!STWI_init(ID_SP_START_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SP_PollingREQ(void)
+{
+ if (!STWI_init(ID_SP_POLL_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_SP_EndREQ(void)
+{
+ if (!STWI_init(ID_SP_END_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_CP_StartREQ(u16 unk1)
+{
+ if (!STWI_init(ID_CP_START_REQ))
+ {
+ gSTWIStatus->reqLength = 1;
+ gSTWIStatus->txPacket->rfuPacket32.data[0] = unk1;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_CP_PollingREQ(void)
+{
+ if (!STWI_init(ID_CP_POLL_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_CP_EndREQ(void)
+{
+ if (!STWI_init(ID_CP_END_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_DataTxREQ(const void *in, u8 size)
+{
+ if (!STWI_init(ID_DATA_TX_REQ))
+ {
+ u8 reqLength = (size / sizeof(u32));
+ if (size & (sizeof(u32) - 1))
+ reqLength += 1;
+ gSTWIStatus->reqLength = reqLength;
+ CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32));
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_DataTxAndChangeREQ(const void *in, u8 size)
+{
+ if (!STWI_init(ID_DATA_TX_AND_CHANGE_REQ))
+ {
+ u8 reqLength = (size / sizeof(u32));
+ if (size & (sizeof(u32) - 1))
+ reqLength += 1;
+ gSTWIStatus->reqLength = reqLength;
+ CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32));
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_DataRxREQ(void)
+{
+ if (!STWI_init(ID_DATA_RX_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_MS_ChangeREQ(void)
+{
+ if (!STWI_init(ID_MS_CHANGE_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_DataReadyAndChangeREQ(u8 unk)
+{
+ if (!STWI_init(ID_DATA_READY_AND_CHANGE_REQ))
+ {
+ if (!unk)
+ {
+ gSTWIStatus->reqLength = 0;
+ }
+ else
+ {
+ u8 *packetBytes;
+
+ gSTWIStatus->reqLength = 1;
+ packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
+ packetBytes += sizeof(u32);
+ *packetBytes++ = unk;
+ *packetBytes++ = 0;
+ *packetBytes++ = 0;
+ *packetBytes = 0;
+ }
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1)
+{
+ if (!STWI_init(ID_DISCONNECTED_AND_CHANGE_REQ))
+ {
+ u8 *packetBytes;
+
+ gSTWIStatus->reqLength = 1;
+ packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
+ packetBytes += sizeof(u32);
+ *packetBytes++ = unk0;
+ *packetBytes++ = unk1;
+ *packetBytes++ = 0;
+ *packetBytes = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_ResumeRetransmitAndChangeREQ(void)
+{
+ if (!STWI_init(ID_RESUME_RETRANSMIT_AND_CHANGE_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_DisconnectREQ(u8 unk)
+{
+ if (!STWI_init(ID_DISCONNECT_REQ))
+ {
+ gSTWIStatus->reqLength = 1;
+ gSTWIStatus->txPacket->rfuPacket32.data[0] = unk;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_TestModeREQ(u8 unk0, u8 unk1)
+{
+ if (!STWI_init(ID_TEST_MODE_REQ))
+ {
+ gSTWIStatus->reqLength = 1;
+ gSTWIStatus->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8);
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2)
+{
+ u32 *packetData;
+ u32 arg1;
+
+ if (!STWI_init(ID_CPR_START_REQ))
+ {
+ gSTWIStatus->reqLength = 2;
+ arg1 = unk1 | (unk0 << 16);
+ packetData = gSTWIStatus->txPacket->rfuPacket32.data;
+ packetData[0] = arg1;
+ packetData[1] = unk2;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_CPR_PollingREQ(void)
+{
+ if (!STWI_init(ID_CPR_POLL_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_CPR_EndREQ(void)
+{
+ if (!STWI_init(ID_CPR_END_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+void STWI_send_StopModeREQ(void)
+{
+ if (!STWI_init(ID_STOP_MODE_REQ))
+ {
+ gSTWIStatus->reqLength = 0;
+ STWI_start_Command();
+ }
+}
+
+static void STWI_intr_timer(void)
+{
+ switch (gSTWIStatus->timerState)
+ {
+ // TODO: Make an enum for these
+ case 2:
+ gSTWIStatus->timerActive = 1;
+ STWI_set_timer(50);
+ break;
+ case 1:
+ case 4:
+ STWI_stop_timer();
+ STWI_restart_Command();
+ break;
+ case 3:
+ gSTWIStatus->timerActive = 1;
+ STWI_stop_timer();
+ STWI_reset_ClockCounter();
+ if (gSTWIStatus->callbackM != NULL)
+ gSTWIStatus->callbackM(255, 0);
+ break;
+ }
+}
+
+static void STWI_set_timer(u8 unk)
+{
+ vu16 *timerL;
+ vu16 *timerH;
+
+ timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
+ timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
+ REG_IME = 0;
+ switch (unk)
+ {
+ case 50:
+ *timerL = 0xFCCB;
+ gSTWIStatus->timerState = 1;
+ break;
+ case 80:
+ *timerL = 0xFAE0;
+ gSTWIStatus->timerState = 2;
+ break;
+ case 100:
+ *timerL = 0xF996;
+ gSTWIStatus->timerState = 3;
+ break;
+ case 130:
+ *timerL = 0xF7AD;
+ gSTWIStatus->timerState = 4;
+ break;
+ }
+ *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK;
+ REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect;
+ REG_IME = 1;
+}
+
+static void STWI_stop_timer(void)
+{
+ gSTWIStatus->timerState = 0;
+ REG_TMCNT_L(gSTWIStatus->timerSelect) = 0;
+ REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
+}
+
+static u16 STWI_init(u8 request)
+{
+ if (!REG_IME)
+ {
+ gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;
+ if (gSTWIStatus->callbackM != NULL)
+ gSTWIStatus->callbackM(request, gSTWIStatus->error);
+ return TRUE;
+ }
+ else if (gSTWIStatus->unk_2c == TRUE)
+ {
+ gSTWIStatus->error = ERR_REQ_CMD_SENDING;
+ gSTWIStatus->unk_2c = FALSE;
+ if (gSTWIStatus->callbackM != NULL)
+ gSTWIStatus->callbackM(request, gSTWIStatus->error);
+ return TRUE;
+ }
+ else if(!gSTWIStatus->msMode)
+ {
+ gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE;
+ if (gSTWIStatus->callbackM != NULL)
+ gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus);
+ return TRUE;
+ }
+ else
+ {
+ gSTWIStatus->unk_2c = TRUE;
+ gSTWIStatus->reqActiveCommand = request;
+ gSTWIStatus->state = 0;
+ gSTWIStatus->reqLength = 0;
+ gSTWIStatus->reqNext = 0;
+ gSTWIStatus->ackLength = 0;
+ gSTWIStatus->ackNext = 0;
+ gSTWIStatus->ackActiveCommand = 0;
+ gSTWIStatus->timerState = 0;
+ gSTWIStatus->timerActive = 0;
+ gSTWIStatus->error = 0;
+ gSTWIStatus->recoveryCount = 0;
+ REG_RCNT = 0x100;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ return FALSE;
+ }
+}
+
+static s32 STWI_start_Command(void)
+{
+ u16 imeTemp;
+
+ // equivalent to gSTWIStatus->txPacket->rfuPacket32.command,
+ // but the cast here is required to avoid register issue
+ *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand;
+ REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command;
+ gSTWIStatus->state = 0;
+ gSTWIStatus->reqNext = 1;
+ imeTemp = REG_IME;
+ REG_IME = 0;
+ REG_IE |= (INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect);
+ REG_IE |= INTR_FLAG_SERIAL;
+ REG_IME = imeTemp;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS;
+ return 0;
+}
+
+static s32 STWI_restart_Command(void)
+{
+ if (gSTWIStatus->recoveryCount <= 1)
+ {
+ ++gSTWIStatus->recoveryCount;
+ STWI_start_Command();
+ }
+ else
+ {
+ if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
+ {
+ gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
+ gSTWIStatus->unk_2c = 0;
+ if (gSTWIStatus->callbackM != NULL)
+ gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
+ }
+ else
+ {
+ gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
+ gSTWIStatus->unk_2c = 0;
+ if (gSTWIStatus->callbackM != NULL)
+ gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
+ gSTWIStatus->state = 4; // TODO: what's 4
+ }
+ }
+ return 0;
+}
+
+static s32 STWI_reset_ClockCounter(void)
+{
+ gSTWIStatus->state = 5; // TODO: what is 5
+ gSTWIStatus->reqLength = 0;
+ gSTWIStatus->reqNext = 0;
+ REG_SIODATA32 = (1 << 31);
+ REG_SIOCNT = 0;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F;
+ return 0;
+}
diff --git a/src/trade.c b/src/trade.c
index 2f48928ec..10ed51d69 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -2765,10 +2765,10 @@ static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet)
int GetUnionRoomTradeMessageId(struct UnkLinkRfuStruct_02022B14Substruct a0, struct UnkLinkRfuStruct_02022B14Substruct a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
{
- u8 r9 = a0.unk_01_0;
- u8 r4 = a0.unk_00_7;
- u8 r10 = a1.unk_01_0;
- u8 r0 = a1.unk_00_7;
+ u8 r9 = a0.hasNationalDex;
+ u8 r4 = a0.isChampion;
+ u8 r10 = a1.hasNationalDex;
+ u8 r0 = a1.isChampion;
u8 r1 = a1.unk_01_2;
u8 r2;
@@ -2845,7 +2845,7 @@ int GetUnionRoomTradeMessageId(struct UnkLinkRfuStruct_02022B14Substruct a0, str
int CanRegisterMonForTradingBoard(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a2, u8 a3)
{
- u8 canTradeEggAndNational = a0.unk_01_0;
+ u8 canTradeEggAndNational = a0.hasNationalDex;
if (IsDeoxysOrMewUntradable(a2, a3))
{
diff --git a/sym_bss.txt b/sym_bss.txt
index 06502497e..08f390b01 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -74,7 +74,7 @@ gUnknown_3000FE8: @ 3000FE8
gUnknown_3001188: @ 3001188
.space 0x8
-gUnknown_3001190: @ 3001190
+gRfuAPIBuffer: @ 3001190
.space 0xE68
gUnknown_3001FF8: @ 3001FF8
diff --git a/sym_common.txt b/sym_common.txt
index b41ec5ff2..c50f09540 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -159,24 +159,9 @@ gUnknown_3005E94: @ 3005E94
.include "berry_fix_program.o"
.include "m4a.o"
.include "agb_flash.o"
-
-gRfuState: @ 3007438
- .space 0x8
-
-gUnknown_3007440: @ 3007440
- .space 0x10
-
-gUnknown_3007450: @ 3007450
- .space 0x10
-
-gUnknown_3007460: @ 3007460
- .space 0x4
-
-gUnknown_3007464: @ 3007464
- .space 0x4
-
-gUnknown_3007468: @ 3007468
- .space 0x8
-
-gUnknown_3007470: @ 3007470
- .space 0xC
+ .align 2
+ .include "librfu_stwi.o"
+ .align 4
+ .include "librfu_rfu.o"
+ .align 4
+ .include "librfu_s32id.o"