summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/librfu.s1943
-rw-r--r--common_syms/librfu_rfu.txt7
-rw-r--r--data/librfu_rodata.s1
-rw-r--r--include/constants/trade.h4
-rw-r--r--include/gba/io_reg.h2
-rw-r--r--include/gba/syscall.h2
-rw-r--r--include/librfu.h37
-rw-r--r--ld_script.txt1
-rw-r--r--src/agb_flash.c2
-rw-r--r--src/librfu_rfu.c736
-rw-r--r--src/librfu_stwi.c21
-rw-r--r--sym_common.txt23
12 files changed, 782 insertions, 1997 deletions
diff --git a/asm/librfu.s b/asm/librfu.s
index 2e17aef23..d3b48f07e 100644
--- a/asm/librfu.s
+++ b/asm/librfu.s
@@ -5,1949 +5,6 @@
.text
- thumb_func_start rfu_initializeAPI
-rfu_initializeAPI: @ 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 @ =gRfuLinkStatus
- str r4, [r0]
- ldr r1, _081E06D0 @ =gRfuStatic
- adds r0, r4, 0
- adds r0, 0xB4
- str r0, [r1]
- ldr r1, _081E06D4 @ =gRfuFixed
- adds r0, 0x28
- str r0, [r1]
- ldr r2, _081E06D8 @ =gRfuSlotStatusNI
- movs r1, 0xDE
- lsls r1, 1
- adds r0, r4, r1
- str r0, [r2]
- ldr r1, _081E06DC @ =gRfuSlotStatusUNI
- 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 @ =gRfuFixed
- ldr r1, [r0]
- adds r1, 0xDC
- ldr r4, _081E06DC @ =gRfuSlotStatusUNI
- 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 @ =gRfuSlotStatusNI
- 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 @ =rfu_STC_fastCopy
- movs r5, 0x2
- negs r5, r5
- ands r5, r1
- ldr r2, _081E06D4 @ =gRfuFixed
- 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 gRfuLinkStatus
-_081E06D0: .4byte gRfuStatic
-_081E06D4: .4byte gRfuFixed
-_081E06D8: .4byte gRfuSlotStatusNI
-_081E06DC: .4byte gRfuSlotStatusUNI
-_081E06E0: .4byte rfu_STC_fastCopy
-_081E06E4: .4byte rfu_REQ_changeMasterSlave
-_081E06E8: .4byte 0x0000ffff
- thumb_func_end rfu_initializeAPI
-
- 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 @ =gRfuStatic
- 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 @ =gRfuLinkStatus
- 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 gRfuStatic
-_081E0768: .4byte 0x01000014
-_081E076C: .4byte gRfuLinkStatus
-_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 @ =gRfuLinkStatus
- ldr r0, [r5]
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _081E07A4
- movs r0, 0xC0
- lsls r0, 2
- b _081E07CA
- .align 2, 0
-_081E07A0: .4byte gRfuLinkStatus
-_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 @ =gRfuFixed
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_081E07F0: .4byte gRfuFixed
- 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 @ =gRfuFixed
- 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 gRfuFixed
- 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 @ =gRfuStatic
- ldr r2, [r0]
- ldrb r1, [r2]
- movs r0, 0x8
- orrs r0, r1
- b _081E083E
- .align 2, 0
-_081E0830: .4byte gRfuStatic
-_081E0834:
- ldr r0, _081E0844 @ =gRfuStatic
- 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 gRfuStatic
- 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 @ =gRfuStatic
- ldr r0, [r0]
- strh r4, [r0, 0x1C]
- ldrb r1, [r0]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _081E0876
- ldr r0, _081E0884 @ =gRfuFixed
- 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 gRfuStatic
-_081E0884: .4byte gRfuFixed
- 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 @ =gRfuStatic
- ldr r0, [r0]
- ldrb r1, [r0]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _081E08B2
- ldr r0, _081E08F0 @ =gRfuFixed
- ldr r0, [r0]
- ldr r2, [r0]
- movs r0, 0xFF
- adds r1, r3, 0
- bl _call_via_r2
-_081E08B2:
- ldr r0, _081E08F4 @ =gRfuLinkStatus
- 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 @ =gRfuLinkStatus
- ldr r1, [r0]
- movs r0, 0xFF
- strb r0, [r1]
-_081E08E4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081E08EC: .4byte gRfuStatic
-_081E08F0: .4byte gRfuFixed
-_081E08F4: .4byte gRfuLinkStatus
- thumb_func_end rfu_CB_defaultCallback
-
- thumb_func_start rfu_waitREQComplete
-rfu_waitREQComplete: @ 81E08F8
- push {lr}
- bl STWI_poll_CommandEnd
- ldr r0, _081E0908 @ =gRfuStatic
- ldr r0, [r0]
- ldrh r0, [r0, 0x1C]
- pop {r1}
- bx r1
- .align 2, 0
-_081E0908: .4byte gRfuStatic
- 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 @ =gRfuFixed
- 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 gRfuFixed
-_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 rfu_MBOOT_CHILD_inheritanceLinkStatus
-rfu_MBOOT_CHILD_inheritanceLinkStatus: @ 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 @ =gRfuLinkStatus
- ldr r1, [r1]
- movs r2, 0x5A
- bl CpuSet
- ldr r0, _081E09C8 @ =gRfuStatic
- 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 gRfuLinkStatus
-_081E09C8: .4byte gRfuStatic
-_081E09CC:
- movs r0, 0x1
-_081E09CE:
- pop {r1}
- bx r1
- thumb_func_end rfu_MBOOT_CHILD_inheritanceLinkStatus
-
- 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 @ =gRfuStatic
- ldr r1, [r0]
- movs r0, 0x1
- strh r0, [r1, 0x1A]
- b _081E0B76
- .align 2, 0
-_081E0B54: .4byte rfu_STC_REQ_callback
-_081E0B58: .4byte gRfuStatic
-_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 @ =gRfuStatic
- 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 gRfuStatic
- 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 @ =gRfuLinkStatus
- 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 gRfuLinkStatus
-_081E0C5C:
- adds r1, r6, 0
- adds r1, 0x97
- movs r0, 0
-_081E0C62:
- strb r0, [r1]
- movs r2, 0
- ldr r3, _081E0CA8 @ =gRfuLinkStatus
-_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 @ =gRfuLinkStatus
-_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 gRfuLinkStatus
- thumb_func_end rfu_CB_configGameData
-
- thumb_func_start rfu_REQ_startSearchChild
-rfu_REQ_startSearchChild: @ 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 @ =gRfuFixed
- 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 gRfuFixed
-_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 rfu_REQ_startSearchChild
-
- 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 @ =gRfuStatic
- 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 gRfuStatic
- 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 @ =gRfuLinkStatus
- 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 @ =gRfuLinkStatus
- 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 gRfuLinkStatus
-_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 rfu_STC_readChildList
-_081E0DC2:
- cmp r4, 0x1A
- bne _081E0E04
- ldr r5, _081E0DF8 @ =gRfuLinkStatus
- 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 @ =gRfuFixed
- 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 gRfuLinkStatus
-_081E0DFC: .4byte rfu_CB_defaultCallback
-_081E0E00: .4byte gRfuFixed
-_081E0E04:
- cmp r4, 0x1B
- bne _081E0E20
- ldr r0, _081E0E30 @ =gRfuLinkStatus
- ldr r1, [r0]
- ldrb r0, [r1]
- cmp r0, 0xFF
- bne _081E0E18
- adds r1, 0x94
- movs r0, 0
- strh r0, [r1]
-_081E0E18:
- ldr r0, _081E0E34 @ =gRfuStatic
- 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 gRfuLinkStatus
-_081E0E34: .4byte gRfuStatic
- thumb_func_end rfu_CB_pollAndEndSearchChild
-
- thumb_func_start rfu_STC_readChildList
-rfu_STC_readChildList: @ 81E0E38
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- ldr r1, _081E0F64 @ =gRfuFixed
- 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 @ =gRfuFixed
- 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 @ =gRfuStatic
- mov r9, r2
- ldr r7, _081E0F70 @ =gRfuLinkStatus
- 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 gRfuFixed
-_081E0F68: .4byte rfu_CB_defaultCallback
-_081E0F6C: .4byte gRfuStatic
-_081E0F70: .4byte gRfuLinkStatus
- thumb_func_end rfu_STC_readChildList
-
- 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 @ =rfu_CB_pollSearchParent
- bl STWI_set_Callback_M
- bl STWI_send_SP_PollingREQ
- pop {r0}
- bx r0
- .align 2, 0
-_081E0FBC: .4byte rfu_CB_pollSearchParent
- thumb_func_end rfu_REQ_pollSearchParent
-
- thumb_func_start rfu_CB_pollSearchParent
-rfu_CB_pollSearchParent: @ 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 rfu_CB_pollSearchParent
-
- 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 @ =gRfuLinkStatus
- ldr r1, [r5]
- adds r1, 0x14
- ldr r2, _081E10A4 @ =0x01000040
- bl CpuSet
- ldr r0, _081E10A8 @ =gRfuFixed
- 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 gRfuLinkStatus
-_081E10A4: .4byte 0x01000040
-_081E10A8: .4byte gRfuFixed
-_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 @ =gRfuLinkStatus
- 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 @ =gRfuStatic
- 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 gRfuLinkStatus
-_081E1158: .4byte gRfuStatic
-_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 @ =gRfuFixed
- 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 @ =gRfuLinkStatus
- 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 @ =gRfuStatic
- 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 gRfuFixed
-_081E1244: .4byte gRfuLinkStatus
-_081E1248: .4byte gRfuStatic
-_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 @ =gRfuLinkStatus
- 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 gRfuLinkStatus
- 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 @ =gRfuFixed
- 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 gRfuFixed
-_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 @ =gRfuFixed
- ldr r0, [r0]
- adds r0, 0xDC
- ldr r1, [r0]
- ldrb r0, [r1, 0x6]
- cmp r0, 0x3
- bhi _081E1300
- ldr r0, _081E130C @ =gRfuStatic
- 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 gRfuFixed
-_081E130C: .4byte gRfuStatic
- 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 @ =gRfuLinkStatus
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0xFF
- beq _081E13E8
- ldr r4, _081E135C @ =gRfuStatic
- 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 gRfuLinkStatus
-_081E135C: .4byte gRfuStatic
-_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 @ =gRfuStatic
- ldr r2, [r3]
- ldrb r1, [r2]
- movs r0, 0xFD
- ands r0, r1
- b _081E138A
- .align 2, 0
-_081E137C: .4byte gRfuStatic
-_081E1380:
- ldr r3, _081E13DC @ =gRfuStatic
- 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 @ =gRfuLinkStatus
- 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 @ =gRfuLinkStatus
- ldr r1, [r0]
- movs r0, 0xFF
- strb r0, [r1]
- movs r0, 0x1
- b _081E13EA
- .align 2, 0
-_081E13DC: .4byte gRfuStatic
-_081E13E0: .4byte gRfuLinkStatus
-_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 rfu_REQBN_watchLink
rfu_REQBN_watchLink: @ 81E13F0
push {r4-r7,lr}
diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt
new file mode 100644
index 000000000..142895733
--- /dev/null
+++ b/common_syms/librfu_rfu.txt
@@ -0,0 +1,7 @@
+gRfuState
+gRfuSlotStatusUNI
+gRfuSlotStatusNI
+gRfuLinkStatus
+gRfuStatic
+gRfuFixed
+gUnknown_3007470
diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s
index c6ca84f4b..d5e847aa3 100644
--- a/data/librfu_rodata.s
+++ b/data/librfu_rodata.s
@@ -25,4 +25,3 @@ _Str_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 8eacc8aa7..548e27163 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -461,7 +461,7 @@
#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)
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 709074f9c..9482b94c4 100644
--- a/include/librfu.h
+++ b/include/librfu.h
@@ -117,7 +117,7 @@ struct RfuStruct
u8 unk_16;
u8 unk_17;
void (*callbackM)();
- void (*callbackS)();
+ void (*callbackS)(u16);
u32 callbackId;
union RfuPacket *txPacket;
union RfuPacket *rxPacket;
@@ -145,7 +145,7 @@ struct RfuSlotStatusUNI
u8 newDataFlag;
u8 dataBlockFlag;
void *recvBuffer;
- u32 recvBuffSize;
+ u32 recvBufferSize;
};
struct NIComm
@@ -178,12 +178,12 @@ struct RfuSlotStatusNI
struct RfuFixed
{
- void *reqCallback;
+ void (*reqCallback)(u16, u16);
void *fastCopyPtr;
u16 fastCopyBuffer[24];
u32 fastCopyBuffer2[12];
u32 LLFBuffer[29];
- u8 *STWIBuffer;
+ struct RfuIntrStruct *STWIBuffer;
};
struct RfuStatic
@@ -204,7 +204,7 @@ struct RfuStatic
u16 unk_1a;
u16 reqResult;
u16 tryPid;
- u32 watchdogTimer;
+ u16 watchdogTimer;
u32 totalPacketSize;
};
@@ -230,7 +230,7 @@ struct RfuLinkStatus
u8 getNameFlag;
u8 findParentCount;
u8 watchInterval;
- u8 stength[4];
+ u8 strength[4];
u8 LLFReadyFlag;
u8 remainLLFrameSizeParent;
u8 remainLLFrameSizeChild[4];
@@ -266,19 +266,20 @@ extern struct RfuSlotStatusNI *gRfuSlotStatusNI[4];
extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4];
extern struct Unk_3007470 gUnknown_3007470;
+// librfu_rfu
void rfu_STC_clearAPIVariables(void);
void rfu_REQ_stopMode(void);
-void rfu_waitREQComplete(void);
-u32 rfu_REQBN_softReset_and_checkID(void);
+u16 rfu_waitREQComplete(void);
+s32 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);
+u16 rfu_syncVBlank(void);
void rfu_REQ_reset(void);
void rfu_REQ_configSystem(u16, u8, u8);
-void rfu_REQ_configGameData(u8, u16, struct UnkLinkRfuStruct_02022B14 *, u8 *);
+void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7);
void rfu_REQ_startSearchChild(void);
void rfu_REQ_pollSearchChild(void);
void rfu_REQ_endSearchChild(void);
@@ -293,18 +294,18 @@ void rfu_REQ_CHILD_pollConnectRecovery(void);
void rfu_REQ_CHILD_endConnectRecovery(void);
void rfu_REQ_changeMasterSlave(void);
void rfu_REQ_RFUStatus(void);
-void rfu_getRFUStatus(u8 *status);
-u8 *rfu_getSTWIRecvBuffer(void);
+u32 rfu_getRFUStatus(u8 *status);
+struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void);
u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1);
void rfu_clearSlot(u8 a0, u8 a1);
void rfu_clearAllSlot(void);
bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status);
-bool16 rfu_getConnectParentStatus(u8 *status, u8 *a1);
+u16 rfu_getConnectParentStatus(u8 *status, u8 *a1);
bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0);
void rfu_REQ_disconnect(u8 who);
void rfu_changeSendTarget(u8 a0, u8 who, u8 a2);
void rfu_NI_stopReceivingData(u8 who);
-u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam);
+u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam);
void rfu_setTimerInterrupt(u8 which, IntrFunc *intr);
void rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3);
bool16 rfu_UNI_setSendData(u8 flag, void *ptr, u8 size);
@@ -318,12 +319,12 @@ void rfu_NI_setSendData(u8, u8, const void *, u32);
void IntrSIO32(void);
// librfu_stwi
-void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam);
+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)());
+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(u32 id);
@@ -333,7 +334,7 @@ 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(u8 *unk1, u8 *data);
+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);
diff --git a/ld_script.txt b/ld_script.txt
index c57b7b4a0..89bf60c16 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -319,6 +319,7 @@ SECTIONS {
src/agb_flash_le.o(.text);
src/librfu_stwi.o(.text);
asm/librfu_intr.o(.text);
+ src/librfu_rfu.o(.text);
asm/librfu.o(.text);
src/isagbprn.o(.text);
asm/libagbsyscall.o(.text);
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..96f4e9519
--- /dev/null
+++ b/src/librfu_rfu.c
@@ -0,0 +1,736 @@
+#include "global.h"
+#include "librfu.h"
+
+void rfu_CB_defaultCallback(u8, u16);
+void rfu_CB_reset(u8, u16);
+void rfu_CB_configGameData(u8, u16);
+void rfu_CB_stopMode(u8, u16);
+void rfu_CB_startSearchChild(u8, u16);
+void rfu_CB_pollAndEndSearchChild(u8, u16);
+void rfu_CB_startSearchParent(u8, u16);
+void rfu_CB_pollSearchParent(u8, u16);
+void rfu_CB_pollConnectParent(u8, u16);
+void rfu_CB_pollConnectParent(u8, u16);
+s32 sub_81E349C(u8);
+void rfu_enableREQCallback(bool8);
+void rfu_STC_readChildList(void);
+void rfu_STC_readParentCandidateList(void);
+void rfu_STC_REQ_callback(u8, u16);
+void rfu_STC_removeLinkData(u8, u8);
+void rfu_STC_fastCopy(u8 **a1, u8 **a2, s32 a3);
+void rfu_STC_clearLinkStatus(u8);
+void rfu_NI_checkCommFailCounter(void);
+
+extern const char _Str_RFU_MBOOT[];
+
+struct RfuStruct *gRfuState;
+ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4];
+struct RfuSlotStatusNI *gRfuSlotStatusNI[4];
+struct RfuLinkStatus *gRfuLinkStatus;
+struct RfuStatic *gRfuStatic;
+struct RfuFixed *gRfuFixed;
+ALIGNED(8) struct Unk_3007470 gUnknown_3007470;
+
+u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam)
+{
+ u16 i;
+ u16 *dst;
+ const u16 *src;
+ u16 r3;
+
+ // is in EWRAM?
+ if (((u32)unk0 & 0xF000000) == 0x2000000 && copyInterruptToRam)
+ return 2;
+ // is not 4-byte aligned?
+ if ((u32)unk0 & 3)
+ return 2;
+ // Nintendo pls, just use a ternary for once
+ if (copyInterruptToRam)
+ {
+ // An assert/debug print may have existed before, ie
+ // printf("%s %u < %u", "somefile.c:12345", unk1, num)
+ // to push this into r3?
+ r3 = 0xe64;
+ if (unk1 < r3)
+ return 1;
+ }
+ if (!copyInterruptToRam)
+ {
+ r3 = 0x504; // same as above, this should be r3 not r0
+ if (unk1 < r3)
+ return 1;
+ }
+ gRfuLinkStatus = &unk0->linkStatus;
+ gRfuStatic = &unk0->static_;
+ gRfuFixed = &unk0->fixed;
+ gRfuSlotStatusNI[0] = &unk0->NI[0];
+ gRfuSlotStatusUNI[0] = &unk0->UNI[0];
+ for (i = 1; i < NELEMS(gRfuSlotStatusNI); ++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 = &unk0->intr;
+ // STWI_init_all(&unk0->intr, interrupt, copyInterruptToRam);
+ gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1];
+ STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], interrupt, copyInterruptToRam);
+ rfu_STC_clearAPIVariables();
+ for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i)
+ {
+ gRfuSlotStatusNI[i]->recvBuffer = 0;
+ gRfuSlotStatusNI[i]->recvBufferSize = 0;
+ gRfuSlotStatusUNI[i]->recvBuffer = 0;
+ 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 = (u8 *)gRfuFixed->fastCopyBuffer + 1;
+ return 0;
+}
+
+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->connMode = 0xFF;
+ 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->connMode != 1)
+ return 0x300;
+ 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 0x10;
+ }
+}
+
+void rfu_setTimerInterrupt(u8 which, IntrFunc *intr)
+{
+ STWI_init_timer(intr, which);
+}
+
+struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void)
+{
+ return gRfuFixed->STWIBuffer;
+}
+
+void rfu_setMSCCallback(void (*callback)(u16))
+{
+ STWI_set_Callback_S(callback);
+}
+
+void rfu_setREQCallback(void (*callback)(u16, u16))
+{
+ gRfuFixed->reqCallback = callback;
+ rfu_enableREQCallback(callback != NULL);
+}
+
+void rfu_enableREQCallback(bool8 enable)
+{
+ if (enable)
+ gRfuStatic->flags |= 8;
+ else
+ gRfuStatic->flags &= 0xF7;
+}
+
+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);
+}
+
+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 < 4; ++i)
+ if ((r5 >> i) & 1)
+ rfu_STC_removeLinkData(i, 1);
+ gRfuLinkStatus->connMode = 0xFF;
+ }
+}
+
+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();
+}
+
+u32 rfu_getRFUStatus(u8 *status)
+{
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93)
+ return 0x10;
+ if (STWI_poll_CommandEnd() == 0)
+ *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7];
+ else
+ *status = 0xFF;
+ return 0;
+}
+
+s32 rfu_MBOOT_CHILD_inheritanceLinkStatus(void)
+{
+ const char *s1 = _Str_RFU_MBOOT;
+ 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);
+ gRfuState->error = 6;
+ }
+ else
+ {
+ AgbRFU_SoftReset();
+ rfu_STC_clearAPIVariables();
+ if (sub_81E349C(8) == 0x8001)
+ {
+ timerReg = &REG_TMCNT(gRfuState->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);
+ }
+ }
+}
+
+void rfu_CB_stopMode(u8 a1, u16 reqResult)
+{
+ if (reqResult == 0)
+ REG_SIOCNT = SIO_MULTI_MODE;
+ rfu_STC_REQ_callback(a1, reqResult);
+}
+
+s32 rfu_REQBN_softReset_and_checkID(void)
+{
+ s32 r2;
+
+ if (REG_IME == 0)
+ return -1;
+ AgbRFU_SoftReset();
+ rfu_STC_clearAPIVariables();
+ if ((r2 = sub_81E349C(30)) == 0)
+ REG_SIOCNT = SIO_MULTI_MODE;
+ return r2;
+}
+
+void rfu_REQ_reset(void)
+{
+ STWI_set_Callback_M(rfu_CB_reset);
+ STWI_send_ResetREQ();
+}
+
+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 r4, u8 r5, u8 r6)
+{
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_SystemConfigREQ((r4 & 3) | 0x3C, r5, r6);
+ if (r6 == 0)
+ {
+ gRfuStatic->unk_1a = 1;
+ }
+ else
+ {
+ u16 IMEBackup = REG_IME;
+
+ REG_IME = 0;
+ gRfuStatic->unk_1a = Div(600, r6);
+ REG_IME = IMEBackup;
+ }
+}
+
+void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7)
+{
+ u8 sp[16];
+ u8 i;
+ u8 r3;
+ const u8 *r5 = r4;
+ const u8 *r1;
+
+ sp[0] = r2;
+ sp[1] = r2 >> 8;
+ if (r6 != 0)
+ sp[1] = (r2 >> 8) | 0x80;
+ for (i = 2; i < 15; ++i)
+ sp[i] = *r4++;
+ r3 = 0;
+ r1 = r7;
+ for (i = 0; i < 8; ++i)
+ {
+ r3 += *r1++;
+ r3 += *r5++;
+ }
+ sp[15] = ~r3;
+ if (r6 != 0)
+ sp[14] = 0;
+ STWI_set_Callback_M(rfu_CB_configGameData);
+ STWI_send_GameConfigREQ(sp, r7);
+}
+
+void rfu_CB_configGameData(u8 ip, u16 r7)
+{
+ s32 r2, r3;
+ u8 *r4;
+ u8 i;
+ u8 *r1;
+
+ if (r7 == 0)
+ {
+ r1 = gRfuState->txPacket->rfuPacket8.data;
+ r2 = gRfuLinkStatus->my.serialNum = r1[4];
+ gRfuLinkStatus->my.serialNum = (r1[5] << 8) | r2;
+ r4 = &r1[6];
+ if (gRfuLinkStatus->my.serialNum & 0x8000)
+ {
+ gRfuLinkStatus->my.serialNum = gRfuLinkStatus->my.serialNum ^ 0x8000;
+ gRfuLinkStatus->my.multibootFlag = 1;
+ }
+ else
+ {
+ gRfuLinkStatus->my.multibootFlag = 0;
+ }
+ for (i = 0; i < NELEMS(gRfuLinkStatus->my.gname) - 2; ++i)
+ gRfuLinkStatus->my.gname[i] = *r4++;
+ ++r4;
+ for (i = 0; i < NELEMS(gRfuLinkStatus->my.uname) - 1; ++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();
+}
+
+void rfu_CB_startSearchChild(u8 r3, u16 reqResult)
+{
+ if (reqResult == 0)
+ gRfuStatic->SCStartFlag = 1;
+ rfu_STC_REQ_callback(r3, reqResult);
+}
+
+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 < NELEMS(gRfuLinkStatus->strength); ++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();
+}
+
+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->connMode == 255)
+ gRfuLinkStatus->my.id = 0;
+ gRfuStatic->SCStartFlag = 0;
+ }
+ rfu_STC_REQ_callback(r4, reqResult);
+}
+
+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 < 4 && !((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->connMode = 1;
+ 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();
+}
+
+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();
+}
+
+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();
+}
+
+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_->serialNum = *(u16 *)r2 & 0x7FFF;
+ if (*(u16 *)r2 & 0x8000)
+ r4_->multibootFlag = 1;
+ else
+ r4_->multibootFlag = 0;
+ r2 += 2;
+ for (r3 = 0; r3 < NELEMS(r4_->gname) - 2; ++r3)
+ r4_->gname[r3] = *r2++;
+ ++r2;
+ for (r3 = 0; r3 < NELEMS(r4_->uname) - 1; ++r3)
+ r4_->uname[r3] = *r2++;
+ ++gRfuLinkStatus->findParentCount;
+ }
+ }
+}
+
+void rfu_REQ_startConnectParent(u16 r4)
+{
+ u16 r3 = 0;
+ u8 i;
+ for (i = 0; i < NELEMS(gRfuLinkStatus->partner) && gRfuLinkStatus->partner[i].id != r4; ++i)
+ ;
+ if (i == 4)
+ r3 = 256;
+ if (r3 == 0)
+ {
+ gRfuStatic->tryPid = r4;
+ STWI_set_Callback_M(rfu_STC_REQ_callback);
+ STWI_send_CP_StartREQ(r4);
+ }
+ else
+ {
+ rfu_STC_REQ_callback(31, r3);
+ }
+}
+
+void rfu_REQ_pollConnectParent(void)
+{
+ STWI_set_Callback_M(rfu_CB_pollConnectParent);
+ STWI_send_CP_PollingREQ();
+}
+
+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->connMode = 0;
+ gRfuStatic->flags |= 0x80;
+ for (r5 = 0; r5 < NELEMS(gRfuLinkStatus->partner); ++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 < 4)
+ {
+ 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 *r1)
+{
+ u8 r0, *r2;
+
+ *status = 0xFF;
+ r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
+ r0 = r2[0] + 96;
+ if (r0 <= 1)
+ {
+ r2 += 6;
+ *r1 = r2[0];
+ *status = r2[1];
+ return 0;
+ }
+ return 0x10;
+}
+
+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->connMode == 0xFF)
+ 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 < 4; ++r4)
+ if ((r5 >> r4) & 1)
+ rfu_STC_removeLinkData(r4, 1);
+ gRfuLinkStatus->connMode = 0xFF;
+ return 1;
+ }
+ --gRfuStatic->watchdogTimer;
+ return 0;
+}
diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c
index fe8a4ef76..c8df0ccfa 100644
--- a/src/librfu_stwi.c
+++ b/src/librfu_stwi.c
@@ -64,7 +64,7 @@ void AgbRFU_SoftReset(void)
timerH = &REG_TMCNT_H(gRfuState->timerSelect);
*timerH = 0;
*timerL = 0;
- *timerH = 0x83;
+ *timerH = TIMER_ENABLE | TIMER_1024CLK;
while (*timerL <= 0x11)
REG_RCNT = 0x80A2;
*timerH = 3;
@@ -117,12 +117,13 @@ void STWI_init_Callback_S(void)
STWI_set_Callback_S(NULL);
}
-void STWI_set_Callback_M(void (*callbackM)())
+// The callback can take 2 or 3 arguments.
+void STWI_set_Callback_M(void *callbackM)
{
gRfuState->callbackM = callbackM;
}
-void STWI_set_Callback_S(void (*callbackS)())
+void STWI_set_Callback_S(void (*callbackS)(u16))
{
gRfuState->callbackS = callbackS;
}
@@ -193,7 +194,7 @@ void STWI_send_ConfigStatusREQ(void)
}
}
-void STWI_send_GameConfigREQ(u8 *unk1, u8 *data)
+void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
{
u8 *packetBytes;
s32 i;
@@ -496,7 +497,7 @@ static void STWI_intr_timer(void)
gRfuState->timerActive = 1;
STWI_stop_timer();
STWI_reset_ClockCounter();
- if (gRfuState->callbackM)
+ if (gRfuState->callbackM != NULL)
gRfuState->callbackM(255, 0);
break;
}
@@ -546,7 +547,7 @@ static u16 STWI_init(u8 request)
if (!REG_IME)
{
gRfuState->error = 6;
- if (gRfuState->callbackM)
+ if (gRfuState->callbackM != NULL)
gRfuState->callbackM(request, gRfuState->error);
return TRUE;
}
@@ -554,14 +555,14 @@ static u16 STWI_init(u8 request)
{
gRfuState->error = 2;
gRfuState->unk_2c = FALSE;
- if (gRfuState->callbackM)
+ if (gRfuState->callbackM != NULL)
gRfuState->callbackM(request, gRfuState->error);
return TRUE;
}
else if(!gRfuState->msMode)
{
gRfuState->error = 4;
- if (gRfuState->callbackM)
+ if (gRfuState->callbackM != NULL)
gRfuState->callbackM(request, gRfuState->error, gRfuState);
return TRUE;
}
@@ -617,14 +618,14 @@ static s32 STWI_restart_Command(void)
{
gRfuState->error = 1;
gRfuState->unk_2c = 0;
- if (gRfuState->callbackM)
+ if (gRfuState->callbackM != NULL)
gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error);
}
else
{
gRfuState->error = 1;
gRfuState->unk_2c = 0;
- if (gRfuState->callbackM)
+ if (gRfuState->callbackM != NULL)
gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error);
gRfuState->state = 4; // TODO: what's 4
}
diff --git a/sym_common.txt b/sym_common.txt
index e72f9a03c..444c2a7af 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -159,24 +159,5 @@ gUnknown_3005E94: @ 3005E94
.include "berry_fix_program.o"
.include "m4a.o"
.include "agb_flash.o"
-
-gRfuState: @ 3007438
- .space 0x8
-
-gRfuSlotStatusUNI: @ 3007440
- .space 0x10
-
-gRfuSlotStatusNI: @ 3007450
- .space 0x10
-
-gRfuLinkStatus: @ 3007460
- .space 0x4
-
-gRfuStatic: @ 3007464
- .space 0x4
-
-gRfuFixed: @ 3007468
- .space 0x8
-
-gUnknown_3007470: @ 3007470
- .space 0xC
+ .align 2
+ .include "librfu_rfu.o"