summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-06 20:04:37 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-06 20:04:37 -0400
commit76fd98fffee901012c1e41580aff23d70a977330 (patch)
tree46aa6bc48bae06330e04ec42fd19095e31733a23
parent736b89ae3d4ffb335ef9e073556bc630c5541b70 (diff)
link through CheckErrorStatus
-rw-r--r--asm/battle_2.s2
-rw-r--r--asm/cable_club.s22
-rw-r--r--asm/link.s1787
-rw-r--r--asm/link_rfu_2.s60
-rw-r--r--asm/overworld.s10
-rw-r--r--asm/trade.s10
-rw-r--r--include/link.h27
-rw-r--r--include/link_rfu.h13
-rw-r--r--include/trade.h6
-rw-r--r--src/field_fadetransition.c2
-rw-r--r--src/link.c757
-rw-r--r--src/mystery_gift_menu.c4
12 files changed, 847 insertions, 1853 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s
index 344325ff4..90c429e19 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -1645,7 +1645,7 @@ _08010B2A:
ldrb r0, [r0]
cmp r0, 0
beq _08010B64
- bl IsNoOneConnected
+ bl IsRfuTaskFinished
lsls r0, 24
cmp r0, 0
beq _08010B82
diff --git a/asm/cable_club.s b/asm/cable_club.s
index 03105bc3d..d7432e2c2 100644
--- a/asm/cable_club.s
+++ b/asm/cable_club.s
@@ -142,7 +142,7 @@ sub_8080844: @ 8080844
lsrs r0, 24
lsls r1, 24
lsrs r1, 24
- bl sub_800A0D0
+ bl GetLinkPlayerDataExchangeStatusTimed
lsls r0, 24
lsrs r0, 24
subs r0, 0x1
@@ -384,9 +384,9 @@ sub_80809F8: @ 80809F8
ldrsh r2, [r4, r3]
cmp r2, 0
bne _08080A30
- bl sub_800A0B4
+ bl OpenLinkTimed
bl sub_800AA24
- bl sub_800A270
+ bl ResetLinkPlayers
ldr r0, _08080A2C @ =gUnknown_83C6AB0
bl AddWindow
strh r0, [r4, 0xA]
@@ -608,7 +608,7 @@ sub_8080BC8: @ 8080BC8
lsls r0, 24
cmp r0, 0
bne _08080C5C
- bl sub_800A944
+ bl GetSavedPlayerCount
adds r4, r0, 0
bl GetLinkPlayerCount_2
lsls r4, 24
@@ -685,7 +685,7 @@ sub_8080C6C: @ 8080C6C
beq _08080CCE
bl GetLinkPlayerCount_2
adds r4, r0, 0
- bl sub_800A944
+ bl GetSavedPlayerCount
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -1368,7 +1368,7 @@ sub_80811FC: @ 80811FC
cmp r2, 0
bne _08081230
bl OpenLink
- bl sub_800A270
+ bl ResetLinkPlayers
ldr r0, _0808122C @ =sub_8081A90
movs r1, 0x50
bl CreateTask
@@ -1443,7 +1443,7 @@ sub_80812A0: @ 80812A0
push {r4,r5,lr}
lsls r0, 24
lsrs r5, r0, 24
- bl sub_800A944
+ bl GetSavedPlayerCount
adds r4, r0, 0
bl GetLinkPlayerCount_2
lsls r4, 24
@@ -1541,7 +1541,7 @@ _0808135C:
ldr r2, _08081378 @ =0x00002211
adds r0, r2, 0
strh r0, [r1]
- bl sub_800A068
+ bl ClearLinkCallback_2
b _080813AA
.align 2, 0
_08081374: .4byte gLinkType
@@ -1698,7 +1698,7 @@ _080814A0:
ldr r2, _080814C0 @ =0x00002211
adds r1, r2, 0
strh r1, [r0]
- bl sub_800A068
+ bl ClearLinkCallback_2
movs r0, 0x1
strh r0, [r6]
b _0808160A
@@ -2180,7 +2180,7 @@ _08081882:
movs r0, 0x1
movs r1, 0
bl fade_screen
- bl sub_800A068
+ bl ClearLinkCallback_2
b _080818B8
_08081894:
ldr r0, _080818A4 @ =gPaletteFade
@@ -2256,7 +2256,7 @@ _0808191A:
movs r0, 0x1
movs r1, 0
bl fade_screen
- bl sub_80F985C
+ bl Rfu_set_zero
b _08081950
_0808192C:
ldr r0, _0808193C @ =gPaletteFade
diff --git a/asm/link.s b/asm/link.s
index 14131af9e..b0de10227 100644
--- a/asm/link.s
+++ b/asm/link.s
@@ -5,1793 +5,6 @@
.text
- thumb_func_start sub_8009FE8
-sub_8009FE8: @ 8009FE8
- push {lr}
- ldr r0, _0800A000 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- beq _08009FF6
- bl sub_80F9828
-_08009FF6:
- ldr r1, _0800A004 @ =gLinkCallback
- ldr r0, _0800A008 @ =sub_800A040
- str r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_0800A000: .4byte gWirelessCommType
-_0800A004: .4byte gLinkCallback
-_0800A008: .4byte sub_800A040
- thumb_func_end sub_8009FE8
-
- thumb_func_start sub_800A00C
-sub_800A00C: @ 800A00C
- push {lr}
- ldr r0, _0800A01C @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- beq _0800A020
- bl sub_80F9808
- b _0800A03A
- .align 2, 0
-_0800A01C: .4byte gWirelessCommType
-_0800A020:
- ldr r0, _0800A030 @ =gLinkCallback
- ldr r1, [r0]
- ldr r0, _0800A034 @ =sub_800A040
- cmp r1, r0
- beq _0800A038
- movs r0, 0
- b _0800A03A
- .align 2, 0
-_0800A030: .4byte gLinkCallback
-_0800A034: .4byte sub_800A040
-_0800A038:
- movs r0, 0x1
-_0800A03A:
- pop {r1}
- bx r1
- thumb_func_end sub_800A00C
-
- thumb_func_start sub_800A040
-sub_800A040: @ 800A040
- push {lr}
- ldr r0, _0800A054 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800A050
- ldr r0, _0800A058 @ =0x0000cafe
- bl BuildSendCmd
-_0800A050:
- pop {r0}
- bx r0
- .align 2, 0
-_0800A054: .4byte gReceivedRemoteLinkPlayers
-_0800A058: .4byte 0x0000cafe
- thumb_func_end sub_800A040
-
- thumb_func_start sub_800A05C
-sub_800A05C: @ 800A05C
- ldr r1, _0800A064 @ =gLinkCallback
- movs r0, 0
- str r0, [r1]
- bx lr
- .align 2, 0
-_0800A064: .4byte gLinkCallback
- thumb_func_end sub_800A05C
-
- thumb_func_start sub_800A068
-sub_800A068: @ 800A068
- push {lr}
- ldr r0, _0800A078 @ =gWirelessCommType
- ldrb r1, [r0]
- cmp r1, 0
- beq _0800A07C
- bl sub_80F985C
- b _0800A080
- .align 2, 0
-_0800A078: .4byte gWirelessCommType
-_0800A07C:
- ldr r0, _0800A084 @ =gLinkCallback
- str r1, [r0]
-_0800A080:
- pop {r0}
- bx r0
- .align 2, 0
-_0800A084: .4byte gLinkCallback
- thumb_func_end sub_800A068
-
- thumb_func_start GetLinkPlayerCount
-GetLinkPlayerCount: @ 800A088
- push {lr}
- ldr r0, _0800A0A0 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800A0A8
- ldr r0, _0800A0A4 @ =gLinkStatus
- ldr r0, [r0]
- movs r1, 0x1C
- ands r0, r1
- lsrs r0, 2
- b _0800A0B0
- .align 2, 0
-_0800A0A0: .4byte gWirelessCommType
-_0800A0A4: .4byte gLinkStatus
-_0800A0A8:
- bl sub_80FA4EC
- lsls r0, 24
- lsrs r0, 24
-_0800A0B0:
- pop {r1}
- bx r1
- thumb_func_end GetLinkPlayerCount
-
- thumb_func_start sub_800A0B4
-sub_800A0B4: @ 800A0B4
- push {lr}
- ldr r0, _0800A0C8 @ =sPlayerDataExchangeStatus
- movs r1, 0
- str r1, [r0]
- ldr r0, _0800A0CC @ =gLinkTimeOutCounter
- strh r1, [r0]
- bl OpenLink
- pop {r0}
- bx r0
- .align 2, 0
-_0800A0C8: .4byte sPlayerDataExchangeStatus
-_0800A0CC: .4byte gLinkTimeOutCounter
- thumb_func_end sub_800A0B4
-
- thumb_func_start sub_800A0D0
-sub_800A0D0: @ 800A0D0
- push {r4-r7,lr}
- adds r5, r0, 0
- adds r6, r1, 0
- movs r7, 0
- ldr r0, _0800A0F8 @ =gReceivedRemoteLinkPlayers
- ldrb r4, [r0]
- cmp r4, 0x1
- bne _0800A1C8
- bl GetLinkPlayerCount_2
- lsls r0, 24
- lsrs r0, 24
- cmp r5, r0
- bgt _0800A0F0
- cmp r0, r6
- ble _0800A100
-_0800A0F0:
- ldr r1, _0800A0FC @ =sPlayerDataExchangeStatus
- movs r0, 0x6
- str r0, [r1]
- b _0800A1E2
- .align 2, 0
-_0800A0F8: .4byte gReceivedRemoteLinkPlayers
-_0800A0FC: .4byte sPlayerDataExchangeStatus
-_0800A100:
- bl GetLinkPlayerCount
- lsls r0, 24
- cmp r0, 0
- bne _0800A112
- ldr r0, _0800A11C @ =gLinkErrorOccurred
- strb r4, [r0]
- bl CloseLink
-_0800A112:
- movs r6, 0
- ldr r4, _0800A120 @ =gLinkPlayers
- movs r5, 0
- b _0800A138
- .align 2, 0
-_0800A11C: .4byte gLinkErrorOccurred
-_0800A120: .4byte gLinkPlayers
-_0800A124:
- adds r0, r4, 0
- adds r0, 0x14
- adds r0, r5, r0
- ldr r1, [r0]
- ldr r0, [r4, 0x14]
- cmp r1, r0
- bne _0800A134
- adds r7, 0x1
-_0800A134:
- adds r5, 0x1C
- adds r6, 0x1
-_0800A138:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r6, r0
- blt _0800A124
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r7, r0
- bne _0800A1B8
- ldr r0, _0800A170 @ =gLinkPlayers
- ldr r1, [r0, 0x14]
- ldr r0, _0800A174 @ =0x00001133
- cmp r1, r0
- bne _0800A1AC
- bl sub_804FB34
- cmp r0, 0x1
- beq _0800A194
- cmp r0, 0x1
- bgt _0800A17C
- cmp r0, 0
- beq _0800A188
- ldr r2, _0800A178 @ =sPlayerDataExchangeStatus
- b _0800A1E0
- .align 2, 0
-_0800A170: .4byte gLinkPlayers
-_0800A174: .4byte 0x00001133
-_0800A178: .4byte sPlayerDataExchangeStatus
-_0800A17C:
- cmp r0, 0x2
- beq _0800A1A0
- ldr r2, _0800A184 @ =sPlayerDataExchangeStatus
- b _0800A1E0
- .align 2, 0
-_0800A184: .4byte sPlayerDataExchangeStatus
-_0800A188:
- ldr r1, _0800A190 @ =sPlayerDataExchangeStatus
- movs r0, 0x1
- b _0800A1BC
- .align 2, 0
-_0800A190: .4byte sPlayerDataExchangeStatus
-_0800A194:
- ldr r1, _0800A19C @ =sPlayerDataExchangeStatus
- movs r0, 0x4
- b _0800A1BC
- .align 2, 0
-_0800A19C: .4byte sPlayerDataExchangeStatus
-_0800A1A0:
- ldr r1, _0800A1A8 @ =sPlayerDataExchangeStatus
- movs r0, 0x5
- b _0800A1BC
- .align 2, 0
-_0800A1A8: .4byte sPlayerDataExchangeStatus
-_0800A1AC:
- ldr r1, _0800A1B4 @ =sPlayerDataExchangeStatus
- movs r0, 0x1
- b _0800A1BC
- .align 2, 0
-_0800A1B4: .4byte sPlayerDataExchangeStatus
-_0800A1B8:
- ldr r1, _0800A1C4 @ =sPlayerDataExchangeStatus
- movs r0, 0x3
-_0800A1BC:
- str r0, [r1]
- adds r2, r1, 0
- b _0800A1E0
- .align 2, 0
-_0800A1C4: .4byte sPlayerDataExchangeStatus
-_0800A1C8:
- ldr r0, _0800A1E8 @ =gLinkTimeOutCounter
- ldrh r1, [r0]
- adds r1, 0x1
- strh r1, [r0]
- lsls r1, 16
- movs r0, 0x96
- lsls r0, 18
- ldr r2, _0800A1EC @ =sPlayerDataExchangeStatus
- cmp r1, r0
- bls _0800A1E0
- movs r0, 0x2
- str r0, [r2]
-_0800A1E0:
- ldrb r0, [r2]
-_0800A1E2:
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0800A1E8: .4byte gLinkTimeOutCounter
-_0800A1EC: .4byte sPlayerDataExchangeStatus
- thumb_func_end sub_800A0D0
-
- thumb_func_start IsLinkPlayerDataExchangeComplete
-IsLinkPlayerDataExchangeComplete: @ 800A1F0
- push {r4-r6,lr}
- movs r6, 0
- movs r4, 0
- ldr r5, _0800A1FC @ =gLinkPlayers
- b _0800A220
- .align 2, 0
-_0800A1FC: .4byte gLinkPlayers
-_0800A200:
- lsls r0, r4, 3
- subs r0, r4
- lsls r0, 2
- adds r1, r5, 0
- adds r1, 0x14
- adds r0, r1
- ldr r1, [r0]
- ldr r0, [r5, 0x14]
- cmp r1, r0
- bne _0800A21A
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
-_0800A21A:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
-_0800A220:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r4, r0
- bcc _0800A200
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r6, r0
- bne _0800A244
- movs r2, 0x1
- ldr r0, _0800A240 @ =sPlayerDataExchangeStatus
- str r2, [r0]
- b _0800A24C
- .align 2, 0
-_0800A240: .4byte sPlayerDataExchangeStatus
-_0800A244:
- movs r2, 0
- ldr r1, _0800A254 @ =sPlayerDataExchangeStatus
- movs r0, 0x3
- str r0, [r1]
-_0800A24C:
- adds r0, r2, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0800A254: .4byte sPlayerDataExchangeStatus
- thumb_func_end IsLinkPlayerDataExchangeComplete
-
- thumb_func_start GetLinkPlayerTrainerId
-GetLinkPlayerTrainerId: @ 800A258
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0800A26C @ =gLinkPlayers
- lsls r1, r0, 3
- subs r1, r0
- lsls r1, 2
- adds r2, 0x4
- adds r1, r2
- ldr r0, [r1]
- bx lr
- .align 2, 0
-_0800A26C: .4byte gLinkPlayers
- thumb_func_end GetLinkPlayerTrainerId
-
- thumb_func_start sub_800A270
-sub_800A270: @ 800A270
- push {r4,r5,lr}
- ldr r5, _0800A290 @ =gLinkPlayers
- movs r4, 0x4
-_0800A276:
- adds r0, r5, 0
- movs r1, 0
- movs r2, 0x1C
- bl memset
- adds r5, 0x1C
- subs r4, 0x1
- cmp r4, 0
- bge _0800A276
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A290: .4byte gLinkPlayers
- thumb_func_end sub_800A270
-
- thumb_func_start ResetBlockSend
-ResetBlockSend: @ 800A294
- ldr r1, _0800A2A4 @ =sBlockSend
- movs r0, 0
- strb r0, [r1, 0x8]
- strh r0, [r1]
- strh r0, [r1, 0x2]
- str r0, [r1, 0x4]
- bx lr
- .align 2, 0
-_0800A2A4: .4byte sBlockSend
- thumb_func_end ResetBlockSend
-
- thumb_func_start InitBlockSend
-InitBlockSend: @ 800A2A8
- push {r4-r7,lr}
- adds r7, r0, 0
- adds r6, r1, 0
- ldr r4, _0800A2BC @ =sBlockSend
- ldrb r5, [r4, 0x8]
- cmp r5, 0
- beq _0800A2C0
- movs r0, 0
- b _0800A2FE
- .align 2, 0
-_0800A2BC: .4byte sBlockSend
-_0800A2C0:
- bl GetMultiplayerId
- strb r0, [r4, 0x9]
- movs r0, 0x1
- strb r0, [r4, 0x8]
- strh r6, [r4, 0x2]
- strh r5, [r4]
- adds r0, 0xFF
- cmp r6, r0
- bls _0800A2D8
- str r7, [r4, 0x4]
- b _0800A2EA
-_0800A2D8:
- ldr r5, _0800A304 @ =gBlockSendBuffer
- cmp r7, r5
- beq _0800A2E8
- adds r0, r5, 0
- adds r1, r7, 0
- adds r2, r6, 0
- bl memcpy
-_0800A2E8:
- str r5, [r4, 0x4]
-_0800A2EA:
- ldr r0, _0800A308 @ =0x0000bbbb
- bl BuildSendCmd
- ldr r1, _0800A30C @ =gLinkCallback
- ldr r0, _0800A310 @ =LinkCB_BlockSendBegin
- str r0, [r1]
- ldr r1, _0800A314 @ =sBlockSendDelayCounter
- movs r0, 0
- str r0, [r1]
- movs r0, 0x1
-_0800A2FE:
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0800A304: .4byte gBlockSendBuffer
-_0800A308: .4byte 0x0000bbbb
-_0800A30C: .4byte gLinkCallback
-_0800A310: .4byte LinkCB_BlockSendBegin
-_0800A314: .4byte sBlockSendDelayCounter
- thumb_func_end InitBlockSend
-
- thumb_func_start LinkCB_BlockSendBegin
-LinkCB_BlockSendBegin: @ 800A318
- push {lr}
- ldr r1, _0800A330 @ =sBlockSendDelayCounter
- ldr r0, [r1]
- adds r0, 0x1
- str r0, [r1]
- cmp r0, 0x2
- bls _0800A32C
- ldr r1, _0800A334 @ =gLinkCallback
- ldr r0, _0800A338 @ =LinkCB_BlockSend
- str r0, [r1]
-_0800A32C:
- pop {r0}
- bx r0
- .align 2, 0
-_0800A330: .4byte sBlockSendDelayCounter
-_0800A334: .4byte gLinkCallback
-_0800A338: .4byte LinkCB_BlockSend
- thumb_func_end LinkCB_BlockSendBegin
-
- thumb_func_start LinkCB_BlockSend
-LinkCB_BlockSend: @ 800A33C
- push {r4-r6,lr}
- ldr r0, _0800A38C @ =sBlockSend
- ldr r5, [r0, 0x4]
- ldr r2, _0800A390 @ =gSendCmd
- ldr r1, _0800A394 @ =0x00008888
- strh r1, [r2]
- movs r3, 0
- adds r4, r0, 0
- adds r6, r4, 0
- adds r2, 0x2
-_0800A350:
- lsls r0, r3, 1
- ldrh r1, [r6]
- adds r0, r1
- adds r0, r5
- ldrb r1, [r0, 0x1]
- lsls r1, 8
- ldrb r0, [r0]
- orrs r0, r1
- strh r0, [r2]
- adds r2, 0x2
- adds r3, 0x1
- cmp r3, 0x6
- ble _0800A350
- ldrh r0, [r4]
- adds r0, 0xE
- strh r0, [r4]
- ldrh r1, [r4, 0x2]
- lsls r0, 16
- lsrs r0, 16
- cmp r1, r0
- bhi _0800A384
- movs r0, 0
- strb r0, [r4, 0x8]
- ldr r1, _0800A398 @ =gLinkCallback
- ldr r0, _0800A39C @ =sub_800A3A0
- str r0, [r1]
-_0800A384:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A38C: .4byte sBlockSend
-_0800A390: .4byte gSendCmd
-_0800A394: .4byte 0x00008888
-_0800A398: .4byte gLinkCallback
-_0800A39C: .4byte sub_800A3A0
- thumb_func_end LinkCB_BlockSend
-
- thumb_func_start sub_800A3A0
-sub_800A3A0: @ 800A3A0
- ldr r1, _0800A3A8 @ =gLinkCallback
- movs r0, 0
- str r0, [r1]
- bx lr
- .align 2, 0
-_0800A3A8: .4byte gLinkCallback
- thumb_func_end sub_800A3A0
-
- thumb_func_start sub_800A3AC
-sub_800A3AC: @ 800A3AC
- push {lr}
- bl GetMultiplayerId
- ldr r0, _0800A3C4 @ =0x00004444
- bl BuildSendCmd
- ldr r1, _0800A3C8 @ =gUnknown_2022114
- ldr r0, [r1]
- adds r0, 0x1
- str r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_0800A3C4: .4byte 0x00004444
-_0800A3C8: .4byte gUnknown_2022114
- thumb_func_end sub_800A3AC
-
- thumb_func_start sub_800A3CC
-sub_800A3CC: @ 800A3CC
- ldr r1, _0800A3DC @ =gUnknown_2022114
- movs r0, 0
- str r0, [r1]
- ldr r1, _0800A3E0 @ =gLinkCallback
- ldr r0, _0800A3E4 @ =sub_800A3AC
- str r0, [r1]
- bx lr
- .align 2, 0
-_0800A3DC: .4byte gUnknown_2022114
-_0800A3E0: .4byte gLinkCallback
-_0800A3E4: .4byte sub_800A3AC
- thumb_func_end sub_800A3CC
-
- thumb_func_start sub_800A3E8
-sub_800A3E8: @ 800A3E8
- ldr r0, _0800A3F0 @ =gUnknown_2022114
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_0800A3F0: .4byte gUnknown_2022114
- thumb_func_end sub_800A3E8
-
- thumb_func_start sub_800A3F4
-sub_800A3F4: @ 800A3F4
- push {lr}
- ldr r0, _0800A400 @ =0x0000aaaa
- bl BuildSendCmd
- pop {r0}
- bx r0
- .align 2, 0
-_0800A400: .4byte 0x0000aaaa
- thumb_func_end sub_800A3F4
-
- thumb_func_start GetMultiplayerId
-GetMultiplayerId: @ 800A404
- push {lr}
- ldr r0, _0800A418 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _0800A420
- ldr r0, _0800A41C @ =0x04000128
- ldr r0, [r0]
- lsls r0, 26
- lsrs r0, 30
- b _0800A428
- .align 2, 0
-_0800A418: .4byte gWirelessCommType
-_0800A41C: .4byte 0x04000128
-_0800A420:
- bl rfu_get_multiplayer_id
- lsls r0, 24
- lsrs r0, 24
-_0800A428:
- pop {r1}
- bx r1
- thumb_func_end GetMultiplayerId
-
- thumb_func_start bitmask_all_link_players_but_self
-bitmask_all_link_players_but_self: @ 800A42C
- push {lr}
- bl GetMultiplayerId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- movs r0, 0x1
- lsls r0, r1
- movs r1, 0xF
- eors r0, r1
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end bitmask_all_link_players_but_self
-
- thumb_func_start SendBlock
-SendBlock: @ 800A448
- push {lr}
- adds r3, r1, 0
- lsls r2, 16
- lsrs r1, r2, 16
- ldr r0, _0800A460 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _0800A464
- adds r0, r3, 0
- bl InitBlockSend
- b _0800A46A
- .align 2, 0
-_0800A460: .4byte gWirelessCommType
-_0800A464:
- adds r0, r3, 0
- bl sub_80F9E60
-_0800A46A:
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end SendBlock
-
- thumb_func_start sub_800A474
-sub_800A474: @ 800A474
- push {lr}
- lsls r0, 24
- lsrs r1, r0, 24
- adds r2, r1, 0
- ldr r0, _0800A490 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800A494
- adds r0, r1, 0
- bl sub_80FA0F8
- lsls r0, 24
- lsrs r0, 24
- b _0800A4B0
- .align 2, 0
-_0800A490: .4byte gWirelessCommType
-_0800A494:
- ldr r0, _0800A4A0 @ =gLinkCallback
- ldr r0, [r0]
- cmp r0, 0
- beq _0800A4A4
- movs r0, 0
- b _0800A4B0
- .align 2, 0
-_0800A4A0: .4byte gLinkCallback
-_0800A4A4:
- ldr r0, _0800A4B4 @ =gBlockRequestType
- strb r2, [r0]
- ldr r0, _0800A4B8 @ =0x0000cccc
- bl BuildSendCmd
- movs r0, 0x1
-_0800A4B0:
- pop {r1}
- bx r1
- .align 2, 0
-_0800A4B4: .4byte gBlockRequestType
-_0800A4B8: .4byte 0x0000cccc
- thumb_func_end sub_800A474
-
- thumb_func_start IsLinkTaskFinished
-IsLinkTaskFinished: @ 800A4BC
- push {lr}
- ldr r0, _0800A4D0 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800A4D4
- bl IsNoOneConnected
- lsls r0, 24
- lsrs r0, 24
- b _0800A4E2
- .align 2, 0
-_0800A4D0: .4byte gWirelessCommType
-_0800A4D4:
- movs r1, 0
- ldr r0, _0800A4E8 @ =gLinkCallback
- ldr r0, [r0]
- cmp r0, 0
- bne _0800A4E0
- movs r1, 0x1
-_0800A4E0:
- adds r0, r1, 0
-_0800A4E2:
- pop {r1}
- bx r1
- .align 2, 0
-_0800A4E8: .4byte gLinkCallback
- thumb_func_end IsLinkTaskFinished
-
- thumb_func_start GetBlockReceivedStatus
-GetBlockReceivedStatus: @ 800A4EC
- push {lr}
- ldr r0, _0800A510 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _0800A518
- ldr r2, _0800A514 @ =gBlockReceivedStatus
- ldrb r0, [r2, 0x3]
- lsls r0, 3
- ldrb r1, [r2, 0x2]
- lsls r1, 2
- orrs r0, r1
- ldrb r1, [r2, 0x1]
- lsls r1, 1
- orrs r0, r1
- ldrb r1, [r2]
- orrs r0, r1
- b _0800A51C
- .align 2, 0
-_0800A510: .4byte gWirelessCommType
-_0800A514: .4byte gBlockReceivedStatus
-_0800A518:
- bl sub_80F9CC8
-_0800A51C:
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end GetBlockReceivedStatus
-
- thumb_func_start SetBlockReceivedFlag
-SetBlockReceivedFlag: @ 800A524
- push {lr}
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r0, _0800A53C @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800A540
- adds r0, r1, 0
- bl sub_80F9720
- b _0800A548
- .align 2, 0
-_0800A53C: .4byte gWirelessCommType
-_0800A540:
- ldr r0, _0800A54C @ =gBlockReceivedStatus
- adds r0, r1, r0
- movs r1, 0x1
- strb r1, [r0]
-_0800A548:
- pop {r0}
- bx r0
- .align 2, 0
-_0800A54C: .4byte gBlockReceivedStatus
- thumb_func_end SetBlockReceivedFlag
-
- thumb_func_start ResetBlockReceivedFlags
-ResetBlockReceivedFlags: @ 800A550
- push {r4,lr}
- ldr r0, _0800A56C @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800A570
- movs r4, 0
-_0800A55C:
- lsls r0, r4, 24
- lsrs r0, 24
- bl sub_80F974C
- adds r4, 0x1
- cmp r4, 0x4
- ble _0800A55C
- b _0800A57E
- .align 2, 0
-_0800A56C: .4byte gWirelessCommType
-_0800A570:
- ldr r1, _0800A584 @ =gBlockReceivedStatus
- movs r2, 0
- adds r0, r1, 0x3
-_0800A576:
- strb r2, [r0]
- subs r0, 0x1
- cmp r0, r1
- bge _0800A576
-_0800A57E:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A584: .4byte gBlockReceivedStatus
- thumb_func_end ResetBlockReceivedFlags
-
- thumb_func_start ResetBlockReceivedFlag
-ResetBlockReceivedFlag: @ 800A588
- push {lr}
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r0, _0800A5A0 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800A5A4
- adds r0, r1, 0
- bl sub_80F974C
- b _0800A5B2
- .align 2, 0
-_0800A5A0: .4byte gWirelessCommType
-_0800A5A4:
- ldr r0, _0800A5B8 @ =gBlockReceivedStatus
- adds r1, r0
- ldrb r0, [r1]
- cmp r0, 0
- beq _0800A5B2
- movs r0, 0
- strb r0, [r1]
-_0800A5B2:
- pop {r0}
- bx r0
- .align 2, 0
-_0800A5B8: .4byte gBlockReceivedStatus
- thumb_func_end ResetBlockReceivedFlag
-
- thumb_func_start CheckShouldAdvanceLinkState
-CheckShouldAdvanceLinkState: @ 800A5BC
- push {lr}
- ldr r0, _0800A5DC @ =gLinkStatus
- ldr r1, [r0]
- movs r0, 0x20
- ands r0, r1
- cmp r0, 0
- beq _0800A5D8
- movs r0, 0x1C
- ands r1, r0
- cmp r1, 0x4
- bls _0800A5D8
- ldr r1, _0800A5E0 @ =gShouldAdvanceLinkState
- movs r0, 0x1
- strb r0, [r1]
-_0800A5D8:
- pop {r0}
- bx r0
- .align 2, 0
-_0800A5DC: .4byte gLinkStatus
-_0800A5E0: .4byte gShouldAdvanceLinkState
- thumb_func_end CheckShouldAdvanceLinkState
-
- thumb_func_start LinkTestCalcBlockChecksum
-LinkTestCalcBlockChecksum: @ 800A5E4
- push {r4,lr}
- adds r4, r0, 0
- lsls r1, 16
- movs r3, 0
- movs r2, 0
- lsrs r1, 17
- cmp r3, r1
- bcs _0800A60A
-_0800A5F4:
- lsls r0, r2, 1
- adds r0, r4
- ldrh r0, [r0]
- adds r0, r3, r0
- lsls r0, 16
- lsrs r3, r0, 16
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r1
- bcc _0800A5F4
-_0800A60A:
- adds r0, r3, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end LinkTestCalcBlockChecksum
-
- thumb_func_start PrintHexDigit
-PrintHexDigit: @ 800A614
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- ldr r4, _0800A648 @ =gLinkTestBGInfo
- ldr r3, [r4]
- lsls r3, 11
- movs r5, 0xC0
- lsls r5, 19
- adds r3, r5
- lsrs r2, 19
- adds r2, r1
- lsls r2, 1
- adds r2, r3
- ldr r3, [r4, 0x4]
- lsls r3, 12
- ldr r1, [r4, 0x8]
- adds r1, 0x1
- adds r0, r1
- orrs r3, r0
- strh r3, [r2]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A648: .4byte gLinkTestBGInfo
- thumb_func_end PrintHexDigit
-
- thumb_func_start sub_800A64C
-sub_800A64C: @ 800A64C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- ldr r4, _0800A680 @ =gLinkTestBGInfo
- ldr r3, [r4]
- lsls r3, 11
- movs r5, 0xC0
- lsls r5, 19
- adds r3, r5
- lsrs r2, 19
- adds r2, r1
- lsls r2, 1
- adds r2, r3
- ldr r3, [r4, 0x4]
- lsls r3, 12
- ldr r1, [r4, 0x8]
- adds r1, r0
- orrs r3, r1
- strh r3, [r2]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A680: .4byte gLinkTestBGInfo
- thumb_func_end sub_800A64C
-
- thumb_func_start LinkTest_prnthex
-LinkTest_prnthex: @ 800A684
- push {r4-r7,lr}
- sub sp, 0x10
- adds r5, r0, 0
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r7, r2, 24
- lsls r3, 24
- lsrs r3, 24
- movs r4, 0
- cmp r4, r3
- bge _0800A6B0
- movs r2, 0xF
-_0800A69E:
- mov r0, sp
- adds r1, r0, r4
- adds r0, r5, 0
- ands r0, r2
- strb r0, [r1]
- lsrs r5, 4
- adds r4, 0x1
- cmp r4, r3
- blt _0800A69E
-_0800A6B0:
- subs r4, r3, 0x1
- cmp r4, 0
- blt _0800A6D0
-_0800A6B6:
- mov r1, sp
- adds r0, r1, r4
- ldrb r0, [r0]
- adds r1, r6, 0
- adds r2, r7, 0
- bl PrintHexDigit
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
- subs r4, 0x1
- cmp r4, 0
- bge _0800A6B6
-_0800A6D0:
- add sp, 0x10
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end LinkTest_prnthex
-
- thumb_func_start sub_800A6D8
-sub_800A6D8: @ 800A6D8
- push {r4-r7,lr}
- adds r3, r0, 0
- lsls r1, 24
- lsrs r7, r1, 24
- lsls r2, 24
- lsrs r2, 24
- movs r6, 0
- ldrb r0, [r3]
- cmp r0, 0
- beq _0800A718
- adds r4, r3, 0
- lsls r5, r2, 24
-_0800A6F0:
- ldrb r0, [r4]
- cmp r0, 0xA
- bne _0800A700
- movs r0, 0x80
- lsls r0, 17
- adds r5, r0
- movs r6, 0
- b _0800A710
-_0800A700:
- ldrb r0, [r4]
- adds r1, r7, r6
- lsls r1, 24
- lsrs r1, 24
- lsrs r2, r5, 24
- bl sub_800A64C
- adds r6, 0x1
-_0800A710:
- adds r4, 0x1
- ldrb r0, [r4]
- cmp r0, 0
- bne _0800A6F0
-_0800A718:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_800A6D8
-
- thumb_func_start LinkCB_RequestPlayerDataExchange
-LinkCB_RequestPlayerDataExchange: @ 800A720
- push {lr}
- ldr r0, _0800A740 @ =gLinkStatus
- ldr r0, [r0]
- movs r1, 0x20
- ands r0, r1
- cmp r0, 0
- beq _0800A734
- ldr r0, _0800A744 @ =0x00002222
- bl BuildSendCmd
-_0800A734:
- ldr r1, _0800A748 @ =gLinkCallback
- movs r0, 0
- str r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_0800A740: .4byte gLinkStatus
-_0800A744: .4byte 0x00002222
-_0800A748: .4byte gLinkCallback
- thumb_func_end LinkCB_RequestPlayerDataExchange
-
- thumb_func_start task00_link_test
-task00_link_test: @ 800A74C
- push {r4-r6,lr}
- sub sp, 0x20
- ldr r1, _0800A86C @ =gASCIITestPrint
- mov r0, sp
- bl strcpy
- mov r0, sp
- movs r1, 0x5
- movs r2, 0x2
- bl sub_800A6D8
- ldr r0, _0800A870 @ =gShouldAdvanceLinkState
- ldrb r0, [r0]
- movs r1, 0x2
- movs r2, 0x1
- movs r3, 0x2
- bl LinkTest_prnthex
- ldr r4, _0800A874 @ =gLinkStatus
- ldr r0, [r4]
- movs r1, 0xF
- movs r2, 0x1
- movs r3, 0x8
- bl LinkTest_prnthex
- ldr r0, _0800A878 @ =gLink
- ldrb r0, [r0, 0x1]
- movs r1, 0x2
- movs r2, 0xA
- movs r3, 0x2
- bl LinkTest_prnthex
- ldr r0, [r4]
- movs r1, 0x1C
- ands r0, r1
- lsrs r0, 2
- movs r1, 0xF
- movs r2, 0xA
- movs r3, 0x2
- bl LinkTest_prnthex
- bl GetMultiplayerId
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0xF
- movs r2, 0xC
- movs r3, 0x2
- bl LinkTest_prnthex
- ldr r0, _0800A87C @ =gLastSendQueueCount
- ldrb r0, [r0]
- movs r1, 0x19
- movs r2, 0x1
- movs r3, 0x2
- bl LinkTest_prnthex
- ldr r0, _0800A880 @ =gLastRecvQueueCount
- ldrb r0, [r0]
- movs r1, 0x19
- movs r2, 0x2
- movs r3, 0x2
- bl LinkTest_prnthex
- bl GetBlockReceivedStatus
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0xF
- movs r2, 0x5
- movs r3, 0x2
- bl LinkTest_prnthex
- ldr r0, _0800A884 @ =gLinkDebugSeed
- ldr r0, [r0]
- movs r1, 0x2
- movs r2, 0xC
- movs r3, 0x8
- bl LinkTest_prnthex
- ldr r0, _0800A888 @ =gLinkDebugFlags
- ldr r0, [r0]
- movs r1, 0x2
- movs r2, 0xD
- movs r3, 0x8
- bl LinkTest_prnthex
- bl GetSioMultiSI
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x5
- movs r3, 0x1
- bl LinkTest_prnthex
- bl IsSioMultiMaster
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x6
- movs r3, 0x1
- bl LinkTest_prnthex
- bl IsLinkConnectionEstablished
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x7
- movs r3, 0x1
- bl LinkTest_prnthex
- bl HasLinkErrorOccurred
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x19
- movs r2, 0x8
- movs r3, 0x1
- bl LinkTest_prnthex
- movs r6, 0
- movs r5, 0x80
- lsls r5, 19
- ldr r4, _0800A88C @ =gLinkTestBlockChecksums
-_0800A84A:
- ldrh r0, [r4]
- lsrs r2, r5, 24
- movs r1, 0xA
- movs r3, 0x4
- bl LinkTest_prnthex
- movs r0, 0x80
- lsls r0, 17
- adds r5, r0
- adds r4, 0x2
- adds r6, 0x1
- cmp r6, 0x3
- ble _0800A84A
- add sp, 0x20
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A86C: .4byte gASCIITestPrint
-_0800A870: .4byte gShouldAdvanceLinkState
-_0800A874: .4byte gLinkStatus
-_0800A878: .4byte gLink
-_0800A87C: .4byte gLastSendQueueCount
-_0800A880: .4byte gLastRecvQueueCount
-_0800A884: .4byte gLinkDebugSeed
-_0800A888: .4byte gLinkDebugFlags
-_0800A88C: .4byte gLinkTestBlockChecksums
- thumb_func_end task00_link_test
-
- thumb_func_start SetLinkDebugValues
-SetLinkDebugValues: @ 800A890
- ldr r2, _0800A89C @ =gLinkDebugSeed
- str r0, [r2]
- ldr r0, _0800A8A0 @ =gLinkDebugFlags
- str r1, [r0]
- bx lr
- .align 2, 0
-_0800A89C: .4byte gLinkDebugSeed
-_0800A8A0: .4byte gLinkDebugFlags
- thumb_func_end SetLinkDebugValues
-
- thumb_func_start sub_800A8A4
-sub_800A8A4: @ 800A8A4
- push {r4,lr}
- movs r1, 0
- movs r2, 0
- ldr r0, _0800A8D0 @ =gSavedLinkPlayerCount
- ldrb r0, [r0]
- cmp r1, r0
- bge _0800A8C6
- movs r4, 0x1
- adds r3, r0, 0
-_0800A8B6:
- adds r0, r4, 0
- lsls r0, r2
- orrs r1, r0
- lsls r0, r1, 24
- lsrs r1, r0, 24
- adds r2, 0x1
- cmp r2, r3
- blt _0800A8B6
-_0800A8C6:
- adds r0, r1, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_0800A8D0: .4byte gSavedLinkPlayerCount
- thumb_func_end sub_800A8A4
-
- thumb_func_start sub_800A8D4
-sub_800A8D4: @ 800A8D4
- push {r4-r6,lr}
- movs r4, 0
- movs r5, 0
- movs r6, 0x1
- b _0800A8EA
-_0800A8DE:
- adds r0, r6, 0
- lsls r0, r5
- orrs r4, r0
- lsls r0, r4, 24
- lsrs r4, r0, 24
- adds r5, 0x1
-_0800A8EA:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r5, r0
- blt _0800A8DE
- adds r0, r4, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_800A8D4
-
- thumb_func_start sub_800A900
-sub_800A900: @ 800A900
- push {r4-r7,lr}
- ldr r1, _0800A934 @ =gSavedLinkPlayerCount
- strb r0, [r1]
- bl GetMultiplayerId
- ldr r1, _0800A938 @ =gSavedMultiplayerId
- strb r0, [r1]
- ldr r4, _0800A93C @ =gLinkPlayers
- ldr r3, _0800A940 @ =gSavedLinkPlayers
- movs r2, 0x4
-_0800A914:
- adds r0, r3, 0
- adds r1, r4, 0
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldr r1, [r1]
- str r1, [r0]
- adds r4, 0x1C
- adds r3, 0x1C
- subs r2, 0x1
- cmp r2, 0
- bge _0800A914
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A934: .4byte gSavedLinkPlayerCount
-_0800A938: .4byte gSavedMultiplayerId
-_0800A93C: .4byte gLinkPlayers
-_0800A940: .4byte gSavedLinkPlayers
- thumb_func_end sub_800A900
-
- thumb_func_start sub_800A944
-sub_800A944: @ 800A944
- ldr r0, _0800A94C @ =gSavedLinkPlayerCount
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_0800A94C: .4byte gSavedLinkPlayerCount
- thumb_func_end sub_800A944
-
- thumb_func_start sub_800A950
-sub_800A950: @ 800A950
- ldr r0, _0800A958 @ =gSavedMultiplayerId
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_0800A958: .4byte gSavedMultiplayerId
- thumb_func_end sub_800A950
-
- thumb_func_start sub_800A95C
-sub_800A95C: @ 800A95C
- push {r4-r6,lr}
- movs r5, 0
- ldr r0, _0800A990 @ =gSavedLinkPlayerCount
- ldrb r2, [r0]
- adds r6, r0, 0
- cmp r5, r2
- bge _0800A986
- ldr r1, _0800A994 @ =gLinkPlayers
- ldr r0, _0800A998 @ =gSavedLinkPlayers
- adds r4, r0, 0x4
- adds r3, r1, 0x4
-_0800A972:
- ldr r1, [r3]
- ldr r0, [r4]
- cmp r1, r0
- bne _0800A97C
- adds r5, 0x1
-_0800A97C:
- adds r4, 0x1C
- adds r3, 0x1C
- subs r2, 0x1
- cmp r2, 0
- bne _0800A972
-_0800A986:
- ldrb r6, [r6]
- cmp r5, r6
- beq _0800A99C
- movs r0, 0
- b _0800A99E
- .align 2, 0
-_0800A990: .4byte gSavedLinkPlayerCount
-_0800A994: .4byte gLinkPlayers
-_0800A998: .4byte gSavedLinkPlayers
-_0800A99C:
- movs r0, 0x1
-_0800A99E:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_800A95C
-
- thumb_func_start sub_800A9A4
-sub_800A9A4: @ 800A9A4
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- movs r4, 0
- ldr r0, _0800AA10 @ =gSavedLinkPlayerCount
- ldrb r0, [r0]
- cmp r4, r0
- bcs _0800AA04
- ldr r6, _0800AA14 @ =gSavedLinkPlayers
- ldr r5, _0800AA18 @ =gLinkPlayers
- movs r0, 0x8
- adds r0, r6
- mov r8, r0
- adds r7, r5, 0
- adds r7, 0x8
-_0800A9C2:
- lsls r0, r4, 3
- subs r0, r4
- lsls r2, r0, 2
- adds r1, r6, 0x4
- adds r1, r2, r1
- adds r0, r5, 0x4
- adds r0, r2, r0
- ldr r1, [r1]
- ldr r0, [r0]
- cmp r1, r0
- bne _0800A9E6
- mov r1, r8
- adds r0, r2, r1
- adds r1, r2, r7
- bl StringCompare
- cmp r0, 0
- beq _0800A9F6
-_0800A9E6:
- ldr r1, _0800AA1C @ =gLinkErrorOccurred
- movs r0, 0x1
- strb r0, [r1]
- bl CloseLink
- ldr r0, _0800AA20 @ =CB2_LinkError
- bl SetMainCallback2
-_0800A9F6:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _0800AA10 @ =gSavedLinkPlayerCount
- ldrb r0, [r0]
- cmp r4, r0
- bcc _0800A9C2
-_0800AA04:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800AA10: .4byte gSavedLinkPlayerCount
-_0800AA14: .4byte gSavedLinkPlayers
-_0800AA18: .4byte gLinkPlayers
-_0800AA1C: .4byte gLinkErrorOccurred
-_0800AA20: .4byte CB2_LinkError
- thumb_func_end sub_800A9A4
-
- thumb_func_start sub_800AA24
-sub_800AA24: @ 800AA24
- ldr r0, _0800AA30 @ =gSavedLinkPlayerCount
- movs r1, 0
- strb r1, [r0]
- ldr r0, _0800AA34 @ =gSavedMultiplayerId
- strb r1, [r0]
- bx lr
- .align 2, 0
-_0800AA30: .4byte gSavedLinkPlayerCount
-_0800AA34: .4byte gSavedMultiplayerId
- thumb_func_end sub_800AA24
-
- thumb_func_start GetLinkPlayerCount_2
-GetLinkPlayerCount_2: @ 800AA38
- ldr r0, _0800AA44 @ =gLinkStatus
- ldr r0, [r0]
- movs r1, 0x1C
- ands r0, r1
- lsrs r0, 2
- bx lr
- .align 2, 0
-_0800AA44: .4byte gLinkStatus
- thumb_func_end GetLinkPlayerCount_2
-
- thumb_func_start IsLinkMaster
-IsLinkMaster: @ 800AA48
- push {lr}
- ldr r0, _0800AA60 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800AA68
- ldr r0, _0800AA64 @ =gLinkStatus
- ldr r0, [r0]
- lsrs r0, 5
- movs r1, 0x1
- ands r0, r1
- b _0800AA70
- .align 2, 0
-_0800AA60: .4byte gWirelessCommType
-_0800AA64: .4byte gLinkStatus
-_0800AA68:
- bl sub_80FBA2C
- lsls r0, 24
- lsrs r0, 24
-_0800AA70:
- pop {r1}
- bx r1
- thumb_func_end IsLinkMaster
-
- thumb_func_start sub_800AA74
-sub_800AA74: @ 800AA74
- ldr r0, _0800AA7C @ =gUnknown_3000E50
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_0800AA7C: .4byte gUnknown_3000E50
- thumb_func_end sub_800AA74
-
- thumb_func_start sub_800AA80
-sub_800AA80: @ 800AA80
- push {lr}
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, _0800AA94 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800AA98
- bl task_add_05_task_del_08FA224_when_no_RfuFunc
- b _0800AAAC
- .align 2, 0
-_0800AA94: .4byte gWirelessCommType
-_0800AA98:
- ldr r2, _0800AAB0 @ =gLinkCallback
- ldr r1, [r2]
- cmp r1, 0
- bne _0800AAAC
- ldr r0, _0800AAB4 @ =sub_800AB0C
- str r0, [r2]
- ldr r0, _0800AAB8 @ =gUnknown_3003F24
- strb r1, [r0]
- ldr r0, _0800AABC @ =gUnknown_3003F34
- strh r3, [r0]
-_0800AAAC:
- pop {r0}
- bx r0
- .align 2, 0
-_0800AAB0: .4byte gLinkCallback
-_0800AAB4: .4byte sub_800AB0C
-_0800AAB8: .4byte gUnknown_3003F24
-_0800AABC: .4byte gUnknown_3003F34
- thumb_func_end sub_800AA80
-
- thumb_func_start sub_800AAC0
-sub_800AAC0: @ 800AAC0
- push {lr}
- ldr r0, _0800AAD0 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800AAD4
- bl task_add_05_task_del_08FA224_when_no_RfuFunc
- b _0800AAFC
- .align 2, 0
-_0800AAD0: .4byte gWirelessCommType
-_0800AAD4:
- ldr r2, _0800AAE8 @ =gLinkCallback
- ldr r1, [r2]
- cmp r1, 0
- beq _0800AAF0
- ldr r1, _0800AAEC @ =gUnknown_202285C
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- b _0800AAFC
- .align 2, 0
-_0800AAE8: .4byte gLinkCallback
-_0800AAEC: .4byte gUnknown_202285C
-_0800AAF0:
- ldr r0, _0800AB00 @ =sub_800AB0C
- str r0, [r2]
- ldr r0, _0800AB04 @ =gUnknown_3003F24
- strb r1, [r0]
- ldr r0, _0800AB08 @ =gUnknown_3003F34
- strh r1, [r0]
-_0800AAFC:
- pop {r0}
- bx r0
- .align 2, 0
-_0800AB00: .4byte sub_800AB0C
-_0800AB04: .4byte gUnknown_3003F24
-_0800AB08: .4byte gUnknown_3003F34
- thumb_func_end sub_800AAC0
-
- thumb_func_start sub_800AB0C
-sub_800AB0C: @ 800AB0C
- push {lr}
- ldr r0, _0800AB28 @ =gLastRecvQueueCount
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800AB22
- ldr r0, _0800AB2C @ =0x00005fff
- bl BuildSendCmd
- ldr r1, _0800AB30 @ =gLinkCallback
- ldr r0, _0800AB34 @ =sub_800AB38
- str r0, [r1]
-_0800AB22:
- pop {r0}
- bx r0
- .align 2, 0
-_0800AB28: .4byte gLastRecvQueueCount
-_0800AB2C: .4byte 0x00005fff
-_0800AB30: .4byte gLinkCallback
-_0800AB34: .4byte sub_800AB38
- thumb_func_end sub_800AB0C
-
- thumb_func_start sub_800AB38
-sub_800AB38: @ 800AB38
- push {r4,lr}
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r2, r0, 24
- movs r3, 0
- movs r1, 0
- cmp r3, r2
- bge _0800AB5C
- ldr r4, _0800AB84 @ =gUnknown_3003F30
-_0800AB4C:
- adds r0, r1, r4
- ldrb r0, [r0]
- cmp r0, 0
- beq _0800AB56
- adds r3, 0x1
-_0800AB56:
- adds r1, 0x1
- cmp r1, r2
- blt _0800AB4C
-_0800AB5C:
- cmp r3, r2
- bne _0800AB7E
- ldr r2, _0800AB88 @ =gBattleTypeFlags
- ldr r0, [r2]
- ldr r1, _0800AB8C @ =0x0000ffdf
- ands r0, r1
- str r0, [r2]
- ldr r0, _0800AB90 @ =gLinkVSyncDisabled
- movs r4, 0x1
- strb r4, [r0]
- bl CloseLink
- ldr r1, _0800AB94 @ =gLinkCallback
- movs r0, 0
- str r0, [r1]
- ldr r0, _0800AB98 @ =gUnknown_3003F24
- strb r4, [r0]
-_0800AB7E:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800AB84: .4byte gUnknown_3003F30
-_0800AB88: .4byte gBattleTypeFlags
-_0800AB8C: .4byte 0x0000ffdf
-_0800AB90: .4byte gLinkVSyncDisabled
-_0800AB94: .4byte gLinkCallback
-_0800AB98: .4byte gUnknown_3003F24
- thumb_func_end sub_800AB38
-
- thumb_func_start sub_800AB9C
-sub_800AB9C: @ 800AB9C
- push {lr}
- ldr r0, _0800ABAC @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800ABB0
- bl sub_80FA42C
- b _0800ABC2
- .align 2, 0
-_0800ABAC: .4byte gWirelessCommType
-_0800ABB0:
- ldr r1, _0800ABC8 @ =gLinkCallback
- ldr r0, [r1]
- cmp r0, 0
- bne _0800ABBC
- ldr r0, _0800ABCC @ =sub_800ABD4
- str r0, [r1]
-_0800ABBC:
- ldr r1, _0800ABD0 @ =gUnknown_3003F24
- movs r0, 0
- strb r0, [r1]
-_0800ABC2:
- pop {r0}
- bx r0
- .align 2, 0
-_0800ABC8: .4byte gLinkCallback
-_0800ABCC: .4byte sub_800ABD4
-_0800ABD0: .4byte gUnknown_3003F24
- thumb_func_end sub_800AB9C
-
- thumb_func_start sub_800ABD4
-sub_800ABD4: @ 800ABD4
- push {lr}
- ldr r0, _0800ABF0 @ =gLastRecvQueueCount
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800ABEA
- ldr r0, _0800ABF4 @ =0x00002ffe
- bl BuildSendCmd
- ldr r1, _0800ABF8 @ =gLinkCallback
- ldr r0, _0800ABFC @ =sub_800AC00
- str r0, [r1]
-_0800ABEA:
- pop {r0}
- bx r0
- .align 2, 0
-_0800ABF0: .4byte gLastRecvQueueCount
-_0800ABF4: .4byte 0x00002ffe
-_0800ABF8: .4byte gLinkCallback
-_0800ABFC: .4byte sub_800AC00
- thumb_func_end sub_800ABD4
-
- thumb_func_start sub_800AC00
-sub_800AC00: @ 800AC00
- push {r4,lr}
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r2, r0, 24
- movs r1, 0
- cmp r1, r2
- bcs _0800AC2A
- ldr r3, _0800AC50 @ =gUnknown_3003F2C
- ldrb r0, [r3]
- cmp r0, 0
- beq _0800AC2A
-_0800AC18:
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, r2
- bcs _0800AC2A
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800AC18
-_0800AC2A:
- cmp r1, r2
- bne _0800AC48
- movs r1, 0
- ldr r4, _0800AC54 @ =gLinkCallback
- ldr r3, _0800AC50 @ =gUnknown_3003F2C
- movs r2, 0
-_0800AC36:
- adds r0, r1, r3
- strb r2, [r0]
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x3
- bls _0800AC36
- movs r0, 0
- str r0, [r4]
-_0800AC48:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800AC50: .4byte gUnknown_3003F2C
-_0800AC54: .4byte gLinkCallback
- thumb_func_end sub_800AC00
-
- thumb_func_start CheckErrorStatus
-CheckErrorStatus: @ 800AC58
- push {lr}
- ldr r0, _0800AC9C @ =gLinkOpen
- ldrb r0, [r0]
- cmp r0, 0
- beq _0800AC98
- ldr r0, _0800ACA0 @ =gLinkStatus
- ldr r2, [r0]
- movs r0, 0xFE
- lsls r0, 11
- ands r0, r2
- cmp r0, 0
- beq _0800AC98
- ldr r0, _0800ACA4 @ =gSuppressLinkErrorMessage
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800AC8E
- ldr r1, _0800ACA8 @ =sLinkErrorBuffer
- str r2, [r1]
- ldr r0, _0800ACAC @ =gLastRecvQueueCount
- ldrb r0, [r0]
- strb r0, [r1, 0x4]
- ldr r0, _0800ACB0 @ =gLastSendQueueCount
- ldrb r0, [r0]
- strb r0, [r1, 0x5]
- ldr r0, _0800ACB4 @ =CB2_LinkError
- bl SetMainCallback2
-_0800AC8E:
- ldr r1, _0800ACB8 @ =gLinkErrorOccurred
- movs r0, 0x1
- strb r0, [r1]
- bl CloseLink
-_0800AC98:
- pop {r0}
- bx r0
- .align 2, 0
-_0800AC9C: .4byte gLinkOpen
-_0800ACA0: .4byte gLinkStatus
-_0800ACA4: .4byte gSuppressLinkErrorMessage
-_0800ACA8: .4byte sLinkErrorBuffer
-_0800ACAC: .4byte gLastRecvQueueCount
-_0800ACB0: .4byte gLastSendQueueCount
-_0800ACB4: .4byte CB2_LinkError
-_0800ACB8: .4byte gLinkErrorOccurred
- thumb_func_end CheckErrorStatus
-
thumb_func_start sub_800ACBC
sub_800ACBC: @ 800ACBC
push {r4,lr}
diff --git a/asm/link_rfu_2.s b/asm/link_rfu_2.s
index 3b6ec730f..04c4621e7 100644
--- a/asm/link_rfu_2.s
+++ b/asm/link_rfu_2.s
@@ -2148,8 +2148,8 @@ _080F9718: .4byte gUnknown_3005AF0
_080F971C: .4byte gUnknown_30054BE
thumb_func_end sub_80F965C
- thumb_func_start sub_80F9720
-sub_80F9720: @ 80F9720
+ thumb_func_start Rfu_SetBlockReceivedFlag
+Rfu_SetBlockReceivedFlag: @ 80F9720
push {lr}
lsls r0, 24
lsrs r1, r0, 24
@@ -2173,10 +2173,10 @@ _080F9740:
_080F9748:
pop {r0}
bx r0
- thumb_func_end sub_80F9720
+ thumb_func_end Rfu_SetBlockReceivedFlag
- thumb_func_start sub_80F974C
-sub_80F974C: @ 80F974C
+ thumb_func_start Rfu_ResetBlockReceivedFlag
+Rfu_ResetBlockReceivedFlag: @ 80F974C
lsls r0, 24
lsrs r0, 24
ldr r3, _080F976C @ =gUnknown_3005450
@@ -2194,7 +2194,7 @@ sub_80F974C: @ 80F974C
bx lr
.align 2, 0
_080F976C: .4byte gUnknown_3005450
- thumb_func_end sub_80F974C
+ thumb_func_end Rfu_ResetBlockReceivedFlag
thumb_func_start sub_80F9770
sub_80F9770: @ 80F9770
@@ -2281,8 +2281,8 @@ sub_80F9800: @ 80F9800
_080F9804: .4byte gUnknown_3005440
thumb_func_end sub_80F9800
- thumb_func_start sub_80F9808
-sub_80F9808: @ 80F9808
+ thumb_func_start IsSendingKeysToRfu
+IsSendingKeysToRfu: @ 80F9808
push {lr}
movs r2, 0
ldr r0, _080F9820 @ =gUnknown_3005450
@@ -2298,7 +2298,7 @@ _080F9818:
.align 2, 0
_080F9820: .4byte gUnknown_3005450
_080F9824: .4byte rfu_func_080F97B8
- thumb_func_end sub_80F9808
+ thumb_func_end IsSendingKeysToRfu
thumb_func_start sub_80F9828
sub_80F9828: @ 80F9828
@@ -2326,15 +2326,15 @@ _080F9854: .4byte gUnknown_843EDC4
_080F9858: .4byte rfu_func_080F97B8
thumb_func_end sub_80F9828
- thumb_func_start sub_80F985C
-sub_80F985C: @ 80F985C
+ thumb_func_start Rfu_set_zero
+Rfu_set_zero: @ 80F985C
ldr r1, _080F9864 @ =gUnknown_3005450
movs r0, 0
str r0, [r1]
bx lr
.align 2, 0
_080F9864: .4byte gUnknown_3005450
- thumb_func_end sub_80F985C
+ thumb_func_end Rfu_set_zero
thumb_func_start sub_80F9868
sub_80F9868: @ 80F9868
@@ -2597,7 +2597,7 @@ _080F9A4C:
mov r1, r8
lsls r0, r1, 24
lsrs r0, 24
- bl sub_80F9720
+ bl Rfu_SetBlockReceivedFlag
bl sub_80F9800
ldrb r1, [r0, 0xA]
movs r0, 0x7F
@@ -2637,7 +2637,7 @@ _080F9A9C:
adds r2, 0x4
adds r1, r2
ldrh r1, [r1]
- bl sub_80F9E60
+ bl Rfu_InitBlockSend
b _080F9BF4
.align 2, 0
_080F9AB8: .4byte gUnknown_843EC64
@@ -2909,8 +2909,8 @@ sub_80F9CB4: @ 80F9CB4
bx lr
thumb_func_end sub_80F9CB4
- thumb_func_start sub_80F9CC8
-sub_80F9CC8: @ 80F9CC8
+ thumb_func_start Rfu_GetBlockReceivedStatus
+Rfu_GetBlockReceivedStatus: @ 80F9CC8
push {r4,lr}
movs r2, 0
movs r1, 0
@@ -2942,7 +2942,7 @@ _080F9CEE:
bx r1
.align 2, 0
_080F9D00: .4byte gUnknown_3005450
- thumb_func_end sub_80F9CC8
+ thumb_func_end Rfu_GetBlockReceivedStatus
thumb_func_start sub_80F9D04
sub_80F9D04: @ 80F9D04
@@ -3126,8 +3126,8 @@ _080F9E58: .4byte gSendCmd
_080F9E5C: .4byte gUnknown_3005542
thumb_func_end sub_80F9E2C
- thumb_func_start sub_80F9E60
-sub_80F9E60: @ 80F9E60
+ thumb_func_start Rfu_InitBlockSend
+Rfu_InitBlockSend: @ 80F9E60
push {r4-r7,lr}
mov r7, r9
mov r6, r8
@@ -3235,7 +3235,7 @@ _080F9F2A:
_080F9F38: .4byte gBlockSendBuffer
_080F9F3C: .4byte gUnknown_3005450
_080F9F40: .4byte rfufunc_80F9F44
- thumb_func_end sub_80F9E60
+ thumb_func_end Rfu_InitBlockSend
thumb_func_start rfufunc_80F9F44
rfufunc_80F9F44: @ 80F9F44
@@ -4003,17 +4003,17 @@ _080FA4E6:
bx r1
thumb_func_end rfu_get_multiplayer_id
- thumb_func_start sub_80FA4EC
-sub_80FA4EC: @ 80FA4EC
+ thumb_func_start GetRfuPlayerCount
+GetRfuPlayerCount: @ 80FA4EC
ldr r0, _080FA4F4 @ =gUnknown_3005450
ldrb r0, [r0, 0xD]
bx lr
.align 2, 0
_080FA4F4: .4byte gUnknown_3005450
- thumb_func_end sub_80FA4EC
+ thumb_func_end GetRfuPlayerCount
- thumb_func_start IsNoOneConnected
-IsNoOneConnected: @ 80FA4F8
+ thumb_func_start IsRfuTaskFinished
+IsRfuTaskFinished: @ 80FA4F8
push {lr}
movs r1, 0
ldr r0, _080FA50C @ =gUnknown_3005450
@@ -4027,7 +4027,7 @@ _080FA506:
bx r1
.align 2, 0
_080FA50C: .4byte gUnknown_3005450
- thumb_func_end IsNoOneConnected
+ thumb_func_end IsRfuTaskFinished
thumb_func_start sub_80FA510
sub_80FA510: @ 80FA510
@@ -4590,7 +4590,7 @@ _080FA940:
bl sub_800B110
lsls r0, r4, 24
lsrs r0, 24
- bl sub_80F974C
+ bl Rfu_ResetBlockReceivedFlag
adds r4, 0x1
ldrb r2, [r5, 0xD]
cmp r4, r2
@@ -6812,14 +6812,14 @@ sub_80FBA1C: @ 80FBA1C
_080FBA28: .4byte gUnknown_3005450
thumb_func_end sub_80FBA1C
- thumb_func_start sub_80FBA2C
-sub_80FBA2C: @ 80FBA2C
+ thumb_func_start Rfu_IsMaster
+Rfu_IsMaster: @ 80FBA2C
ldr r0, _080FBA34 @ =gUnknown_3005450
ldrb r0, [r0, 0xC]
bx lr
.align 2, 0
_080FBA34: .4byte gUnknown_3005450
- thumb_func_end sub_80FBA2C
+ thumb_func_end Rfu_IsMaster
thumb_func_start RFUVSync
RFUVSync: @ 80FBA38
diff --git a/asm/overworld.s b/asm/overworld.s
index 10d1b4ee8..ef63df6bb 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -5643,7 +5643,7 @@ c1_link_related: @ 8057884
bl sub_80F90DC
cmp r0, 0
beq _0805789E
- bl sub_800A00C
+ bl IsSendingKeysToLink
cmp r0, 0
bne _080578C0
_0805789E:
@@ -6147,7 +6147,7 @@ _08057C72:
bl IsUpdateLinkStateCBActive
cmp r0, 0x1
bne _08057CA8
- bl sub_800A00C
+ bl IsSendingKeysToLink
cmp r0, 0x1
bne _08057CA8
cmp r4, 0x11
@@ -7012,7 +7012,7 @@ sub_8058274: @ 8058274
bl IsUpdateLinkStateCBActive
cmp r0, 0x1
bne _080582D8
- bl sub_800A00C
+ bl IsSendingKeysToLink
cmp r0, 0x1
bne _080582D8
ldr r0, _080582C4 @ =gUnknown_3000E84
@@ -7065,7 +7065,7 @@ sub_80582E0: @ 80582E0
bl IsUpdateLinkStateCBActive
cmp r0, 0x1
bne _08058304
- bl sub_800A00C
+ bl IsSendingKeysToLink
cmp r0, 0x1
bne _08058304
ldr r0, _08058308 @ =gUnknown_3000E84
@@ -7093,7 +7093,7 @@ sub_8058318: @ 8058318
ldrb r0, [r0]
cmp r0, 0
bne _08058334
- bl sub_800A00C
+ bl IsSendingKeysToLink
cmp r0, 0
beq _08058334
movs r0, 0x1
diff --git a/asm/trade.s b/asm/trade.s
index 52db4c7d2..0c1c168cc 100644
--- a/asm/trade.s
+++ b/asm/trade.s
@@ -334,7 +334,7 @@ _0804C8F0: .4byte gUnknown_2031DA8
_0804C8F4:
bl GetLinkPlayerCount_2
adds r4, r0, 0
- bl sub_800A944
+ bl GetSavedPlayerCount
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -422,7 +422,7 @@ _0804C9B0:
ldrb r0, [r0]
cmp r0, 0
beq _0804C9E8
- bl IsNoOneConnected
+ bl IsRfuTaskFinished
lsls r0, 24
cmp r0, 0
bne _0804C9C4
@@ -1832,7 +1832,7 @@ sub_804D5A4: @ 804D5A4
ldrb r0, [r0]
cmp r0, 0
beq _0804D5FC
- bl IsNoOneConnected
+ bl IsRfuTaskFinished
lsls r0, 24
cmp r0, 0
beq _0804D620
@@ -7557,7 +7557,7 @@ _080502A8:
_080502B4:
bl GetLinkPlayerCount_2
adds r4, r0, 0
- bl sub_800A944
+ bl GetSavedPlayerCount
lsls r4, 24
lsls r0, 24
cmp r4, r0
@@ -14745,7 +14745,7 @@ _0805434C:
ldr r0, _08054378 @ =sub_804C718
cmp r1, r0
bne _08054384
- bl IsNoOneConnected
+ bl IsRfuTaskFinished
lsls r0, 24
cmp r0, 0
beq _08054396
diff --git a/include/link.h b/include/link.h
index 220465046..1360ce8cc 100644
--- a/include/link.h
+++ b/include/link.h
@@ -19,6 +19,20 @@
#define LINK_STAT_RECEIVED_NOTHING 0x00000100
#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8
#define LINK_STAT_ERRORS 0x0007F000
+#define LINK_STAT_ERRORS_SHIFT 12
+
+#define LINK_STAT_ERROR_HARDWARE 0x00001000
+#define LINK_STAT_ERROR_HARDWARE_SHIFT 12
+#define LINK_STAT_ERROR_CHECKSUM 0x00002000
+#define LINK_STAT_ERROR_CHECKSUM_SHIFT 13
+#define LINK_STAT_ERROR_QUEUE_FULL 0x00004000
+#define LINK_STAT_ERROR_QUEUE_FULL_SHIFT 14
+#define LINK_STAT_ERROR_LAG_MASTER 0x00010000
+#define LINK_STAT_ERROR_LAG_MASTER_SHIFT 16
+#define LINK_STAT_ERROR_INVALID_ID 0x00020000
+#define LINK_STAT_ERROR_INVALID_ID_SHIFT 17
+#define LINK_STAT_ERROR_LAG_SLAVE 0x00040000
+#define LINK_STAT_ERROR_LAG_SLAVE_SHIFT 18
#define EXTRACT_PLAYER_COUNT(status) \
(((status) & LINK_STAT_PLAYER_COUNT) >> LINK_STAT_PLAYER_COUNT_SHIFT)
@@ -28,6 +42,8 @@
(((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1)
#define EXTRACT_RECEIVED_NOTHING(status) \
(((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1)
+#define EXTRACT_LINK_ERRORS(status) \
+(((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT)
#define LINKCMD_SEND_LINK_TYPE 0x2222
#define LINKCMD_0x2FFE 0x2FFE
@@ -62,6 +78,10 @@ enum
EXCHANGE_COMPLETE,
EXCHANGE_TIMED_OUT,
EXCHANGE_IN_PROGRESS,
+ EXCHANGE_STAT_4,
+ EXCHANGE_STAT_5,
+ EXCHANGE_STAT_6,
+ EXCHANGE_STAT_7
};
enum
@@ -174,7 +194,7 @@ void ClearLinkCallback(void);
void ClearLinkCallback_2(void);
u8 GetLinkPlayerCount(void);
void OpenLinkTimed(void);
-u8 GetLinkPlayerDataExchangeStatusTimed(void);
+u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int higher);
bool8 IsLinkPlayerDataExchangeComplete(void);
u32 GetLinkPlayerTrainerId(u8);
void ResetLinkPlayers(void);
@@ -217,7 +237,7 @@ void sub_800AAC0(void);
void OpenLink(void);
bool8 IsLinkMaster(void);
void CheckShouldAdvanceLinkState(void);
-void sub_800AA80(u8);
+void sub_800AA80(u16 a0);
void sub_80098D8(void);
void CloseLink(void);
bool8 IsLinkTaskFinished(void);
@@ -228,6 +248,7 @@ void sub_800B1F4(void);
void LoadWirelessStatusIndicatorSpriteGfx(void);
void CreateWirelessStatusIndicatorSprite(u8, u8);
void sub_8009FE8(void);
-void sub_800A068(void);
+void ClearLinkCallback_2(void);
+void sub_80FA42C(void);
#endif // GUARD_LINK_H
diff --git a/include/link_rfu.h b/include/link_rfu.h
index e7fa2a848..e64c0ed59 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -11,7 +11,7 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 * cmdPtr, const u8 * src);
void sub_80FA190(void);
void MG_DrawCheckerboardPattern(void);
void task_add_05_task_del_08FA224_when_no_RfuFunc(void);
-bool8 IsNoOneConnected(void);
+bool8 IsRfuTaskFinished(void);
void DestroyWirelessStatusIndicatorSprite(void);
void MEvent_CreateTask_CardOrNewsWithFriend(u8);
void MEvent_CreateTask_CardOrNewsOverWireless(u8);
@@ -22,5 +22,16 @@ void sub_80FBB4C(void);
void sub_80F86F4(void);
void sub_80FB128(bool32 a0);
u32 sub_80FD3A4(void);
+bool32 IsSendingKeysToRfu(void);
+void Rfu_set_zero(void);
+u8 GetRfuPlayerCount(void);
+void sub_80F9828(void);
+u8 rfu_get_multiplayer_id(void);
+bool8 Rfu_InitBlockSend(const void * src, u16 size);
+bool8 sub_80FA0F8(u8 a0);
+u8 Rfu_GetBlockReceivedStatus(void);
+void Rfu_SetBlockReceivedFlag(u8 who);
+void Rfu_ResetBlockReceivedFlag(u8 who);
+bool8 Rfu_IsMaster(void);
#endif //GUARD_LINK_RFU_H
diff --git a/include/trade.h b/include/trade.h
new file mode 100644
index 000000000..02ed7d8c4
--- /dev/null
+++ b/include/trade.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_TRADE_H
+#define GUARD_TRADE_H
+
+s32 sub_804FB34(void);
+
+#endif //GUARD_TRADE_H
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c
index b8ed41c06..2ed3b80b9 100644
--- a/src/field_fadetransition.c
+++ b/src/field_fadetransition.c
@@ -654,7 +654,7 @@ static void sub_807E678(u8 taskId)
switch (data[0])
{
case 0:
- sub_800A068();
+ ClearLinkCallback_2();
fade_screen(1, 0);
sub_8055F88();
PlaySE(SE_KAIDAN);
diff --git a/src/link.c b/src/link.c
index 6f28f78c8..fce0026c6 100644
--- a/src/link.c
+++ b/src/link.c
@@ -5,6 +5,7 @@
#include "decompress.h"
#include "malloc.h"
#include "save.h"
+#include "battle.h"
#include "quest_log.h"
#include "link_rfu.h"
#include "librfu.h"
@@ -13,7 +14,9 @@
#include "event_data.h"
#include "string_util.h"
#include "item_menu.h"
+#include "trade.h"
#include "link.h"
+#include "constants/battle.h"
extern u16 gHeldKeyCodeToSend;
@@ -116,20 +119,29 @@ void InitLocalLinkPlayer(void);
void sub_800978C(void);
void CB2_LinkTest(void);
void ProcessRecvCmds(u8 id);
-void InitBlockSend(const void * src, size_t size);
+void sub_800A040(void);
+void ResetBlockSend(void);
+bool32 InitBlockSend(const void * src, size_t size);
+void LinkCB_BlockSendBegin(void);
+void LinkCB_BlockSend(void);
+void LinkCB_BlockSendEnd(void);
+void sub_800A3CC(void);
+void SetBlockReceivedFlag(u8 id);
u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
void LinkCB_RequestPlayerDataExchange(void);
-void ResetBlockSend(void);
-void task00_link_test(u8 taskId);
+void Task_PrintTestData(u8 taskId);
+void sub_800AB0C(void);
+void sub_800AB38(void);
+void sub_800ABD4(void);
+void sub_800AC00(void);
+void CheckErrorStatus(void);
void EnableSerial(void);
void sub_800B210(void);
void sub_80F8DC0(void);
void DisableSerial(void);
-void CheckErrorStatus(void);
void sub_800B284(struct LinkPlayer * linkPlayer);
-void SetBlockReceivedFlag(u8 id);
-void sub_800A3CC(void);
+bool8 IsSioMultiMaster(void);
ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal");
const u16 gWirelessLinkDisplay4bpp[] = INCBIN_U16("graphics/interface/wireless_link_display.4bpp.lz");
@@ -234,7 +246,7 @@ void LinkTestScreen(void)
UpdatePaletteFade();
gUnknown_3000E58 = 0;
InitLocalLinkPlayer();
- CreateTask(task00_link_test, 0);
+ CreateTask(Task_PrintTestData, 0);
SetMainCallback2(CB2_LinkTest);
}
@@ -640,3 +652,734 @@ void BuildSendCmd(u16 command)
break;
}
}
+
+void sub_8009FE8(void)
+{
+ if (gWirelessCommType)
+ {
+ sub_80F9828();
+ }
+ gLinkCallback = sub_800A040;
+}
+
+bool32 IsSendingKeysToLink(void)
+{
+ if (gWirelessCommType)
+ {
+ return IsSendingKeysToRfu();
+ }
+ if (gLinkCallback == sub_800A040)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_800A040(void)
+{
+ if (gReceivedRemoteLinkPlayers == TRUE)
+ {
+ BuildSendCmd(LINKCMD_SEND_HELD_KEYS_2);
+ }
+}
+
+void ClearLinkCallback(void)
+{
+ gLinkCallback = NULL;
+}
+
+void ClearLinkCallback_2(void)
+{
+ if (gWirelessCommType)
+ {
+ Rfu_set_zero();
+ }
+ else
+ {
+ gLinkCallback = NULL;
+ }
+}
+
+u8 GetLinkPlayerCount(void)
+{
+ if (gWirelessCommType)
+ {
+ return GetRfuPlayerCount();
+ }
+ return EXTRACT_PLAYER_COUNT(gLinkStatus);
+}
+
+void OpenLinkTimed(void)
+{
+ sPlayerDataExchangeStatus = 0;
+ gLinkTimeOutCounter = 0;
+ OpenLink();
+}
+
+u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
+{
+ int i;
+ int count;
+ u32 index;
+ u8 cmpVal;
+ u32 linkType1;
+ u32 linkType2;
+
+ count = 0;
+ if (gReceivedRemoteLinkPlayers == TRUE)
+ {
+ cmpVal = GetLinkPlayerCount_2();
+ if (lower > cmpVal || cmpVal > upper)
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_STAT_6;
+ return 6;
+ }
+ else
+ {
+ if (GetLinkPlayerCount() == 0)
+ {
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ }
+ for (i = 0, index = 0; i < GetLinkPlayerCount(); index++, i++)
+ {
+ if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType)
+ {
+ count++;
+ }
+ }
+ if (count == GetLinkPlayerCount())
+ {
+ if (gLinkPlayers[0].linkType == 0x1133)
+ {
+ switch (sub_804FB34())
+ {
+ case 0:
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ break;
+ case 1:
+ sPlayerDataExchangeStatus = EXCHANGE_STAT_4;
+ break;
+ case 2:
+ sPlayerDataExchangeStatus = EXCHANGE_STAT_5;
+ break;
+ }
+ }
+ else
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ }
+ }
+ else
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ }
+ }
+ }
+ else if (++gLinkTimeOutCounter > 600)
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT;
+ }
+ return sPlayerDataExchangeStatus;
+}
+
+bool8 IsLinkPlayerDataExchangeComplete(void)
+{
+ u8 i;
+ u8 count;
+ bool8 retval;
+
+ count = 0;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType)
+ {
+ count++;
+ }
+ }
+ if (count == GetLinkPlayerCount())
+ {
+ retval = TRUE;
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ }
+ else
+ {
+ retval = FALSE;
+ sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ }
+ return retval;
+}
+
+u32 GetLinkPlayerTrainerId(u8 who)
+{
+ return gLinkPlayers[who].trainerId;
+}
+
+void ResetLinkPlayers(void)
+{
+ int i;
+
+ for (i = 0; i <= MAX_LINK_PLAYERS; i++)
+ {
+ gLinkPlayers[i] = (struct LinkPlayer){};
+ }
+}
+
+void ResetBlockSend(void)
+{
+ sBlockSend.active = FALSE;
+ sBlockSend.pos = 0;
+ sBlockSend.size = 0;
+ sBlockSend.src = NULL;
+}
+
+bool32 InitBlockSend(const void *src, size_t size)
+{
+ if (sBlockSend.active)
+ {
+ return FALSE;
+ }
+ sBlockSend.multiplayerId = GetMultiplayerId();
+ sBlockSend.active = TRUE;
+ sBlockSend.size = size;
+ sBlockSend.pos = 0;
+ if (size > 0x100)
+ {
+ sBlockSend.src = src;
+ }
+ else
+ {
+ if (src != gBlockSendBuffer)
+ {
+ memcpy(gBlockSendBuffer, src, size);
+ }
+ sBlockSend.src = gBlockSendBuffer;
+ }
+ BuildSendCmd(LINKCMD_INIT_BLOCK);
+ gLinkCallback = LinkCB_BlockSendBegin;
+ sBlockSendDelayCounter = 0;
+ return TRUE;
+}
+
+void LinkCB_BlockSendBegin(void)
+{
+ if (++sBlockSendDelayCounter > 2)
+ {
+ gLinkCallback = LinkCB_BlockSend;
+ }
+}
+
+void LinkCB_BlockSend(void)
+{
+ int i;
+ const u8 *src;
+
+ src = sBlockSend.src;
+ gSendCmd[0] = LINKCMD_CONT_BLOCK;
+ for (i = 0; i < 7; i++)
+ {
+ gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2];
+ }
+ sBlockSend.pos += 14;
+ if (sBlockSend.size <= sBlockSend.pos)
+ {
+ sBlockSend.active = FALSE;
+ gLinkCallback = LinkCB_BlockSendEnd;
+ }
+}
+
+void LinkCB_BlockSendEnd(void)
+{
+ gLinkCallback = NULL;
+}
+void sub_800A3AC(void)
+{
+ GetMultiplayerId();
+ BuildSendCmd(LINKCMD_SEND_HELD_KEYS);
+ gUnknown_2022114++;
+}
+
+void sub_800A3CC(void)
+{
+ gUnknown_2022114 = 0;
+ gLinkCallback = sub_800A3AC;
+}
+
+
+u32 sub_800A3E8(void)
+{
+ return gUnknown_2022114;
+}
+
+void sub_800A3F4(void)
+{
+ BuildSendCmd(LINKCMD_0xAAAA);
+}
+
+u8 GetMultiplayerId(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return rfu_get_multiplayer_id();
+ }
+ return SIO_MULTI_CNT->id;
+}
+
+u8 bitmask_all_link_players_but_self(void)
+{
+ u8 mpId;
+
+ mpId = GetMultiplayerId();
+ return ((1 << MAX_LINK_PLAYERS) - 1) ^ (1 << mpId);
+}
+
+bool8 SendBlock(u8 unused, const void *src, u16 size)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return Rfu_InitBlockSend(src, size);
+ }
+ return InitBlockSend(src, size);
+}
+
+bool8 sub_800A474(u8 a0)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return sub_80FA0F8(a0);
+ }
+ if (gLinkCallback == NULL)
+ {
+ gBlockRequestType = a0;
+ BuildSendCmd(LINKCMD_0xCCCC);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 IsLinkTaskFinished(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return IsRfuTaskFinished();
+ }
+ return gLinkCallback == NULL;
+}
+
+u8 GetBlockReceivedStatus(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return Rfu_GetBlockReceivedStatus();
+ }
+ return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0);
+}
+
+void SetBlockReceivedFlag(u8 who)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ Rfu_SetBlockReceivedFlag(who);
+ }
+ else
+ {
+ gBlockReceivedStatus[who] = TRUE;
+ }
+}
+
+void ResetBlockReceivedFlags(void)
+{
+ int i;
+
+ if (gWirelessCommType == TRUE)
+ {
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ Rfu_ResetBlockReceivedFlag(i);
+ }
+ }
+ else
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gBlockReceivedStatus[i] = FALSE;
+ }
+ }
+}
+
+void ResetBlockReceivedFlag(u8 who)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ Rfu_ResetBlockReceivedFlag(who);
+ }
+ else if (gBlockReceivedStatus[who])
+ {
+ gBlockReceivedStatus[who] = FALSE;
+ }
+}
+
+void CheckShouldAdvanceLinkState(void)
+{
+ if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1)
+ {
+ gShouldAdvanceLinkState = 1;
+ }
+}
+
+u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)
+{
+ u16 chksum;
+ u16 i;
+
+ chksum = 0;
+ for (i = 0; i < size / 2; i++)
+ {
+ chksum += src[i];
+ }
+ return chksum;
+}
+
+void LinkTest_prnthexchar(char a0, u8 a1, u8 a2)
+{
+ u16 *vAddr;
+
+ vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
+ vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + 1 + gLinkTestBGInfo.dummy_8);
+}
+
+void LinkTest_prntchar(char a0, u8 a1, u8 a2)
+{
+ u16 *vAddr;
+
+ vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
+ vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + gLinkTestBGInfo.dummy_8);
+}
+
+void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2)
+{
+ char sp[32 / 2];
+ int i;
+
+ for (i = 0; i < a2; i++)
+ {
+ sp[i] = pos & 0xf;
+ pos >>= 4;
+ }
+ for (i = a2 - 1; i >= 0; i--)
+ {
+ LinkTest_prnthexchar(sp[i], a0, a1);
+ a0++;
+ }
+}
+
+void LinkTest_prntstr(const char *a0, u8 a1, u8 a2)
+{
+ int r6;
+ int i;
+ int r5;
+
+ r5 = 0;
+ r6 = 0;
+ for (i = 0; a0[i] != 0; a0++)
+ {
+ if (a0[i] == *"\n")
+ {
+ r5++;
+ r6 = 0;
+ }
+ else
+ {
+ LinkTest_prntchar(a0[i], a1 + r6, a2 + r5);
+ r6++;
+ }
+ }
+}
+
+void LinkCB_RequestPlayerDataExchange(void)
+{
+ if (gLinkStatus & LINK_STAT_MASTER)
+ {
+ BuildSendCmd(LINKCMD_SEND_LINK_TYPE);
+ }
+ gLinkCallback = NULL;
+}
+
+void Task_PrintTestData(u8 taskId)
+{
+ char sp[32];
+ int i;
+
+ strcpy(sp, gASCIITestPrint);
+ LinkTest_prntstr(sp, 5, 2);
+ LinkTest_prnthex(gShouldAdvanceLinkState, 2, 1, 2);
+ LinkTest_prnthex(gLinkStatus, 15, 1, 8);
+ LinkTest_prnthex(gLink.state, 2, 10, 2);
+ LinkTest_prnthex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2);
+ LinkTest_prnthex(GetMultiplayerId(), 15, 12, 2);
+ LinkTest_prnthex(gLastSendQueueCount, 25, 1, 2);
+ LinkTest_prnthex(gLastRecvQueueCount, 25, 2, 2);
+ LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2);
+ LinkTest_prnthex(gLinkDebugSeed, 2, 12, 8);
+ LinkTest_prnthex(gLinkDebugFlags, 2, 13, 8);
+ LinkTest_prnthex(GetSioMultiSI(), 25, 5, 1);
+ LinkTest_prnthex(IsSioMultiMaster(), 25, 6, 1);
+ LinkTest_prnthex(IsLinkConnectionEstablished(), 25, 7, 1);
+ LinkTest_prnthex(HasLinkErrorOccurred(), 25, 8, 1);
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4);
+ }
+}
+
+void SetLinkDebugValues(u32 seed, u32 flags)
+{
+ gLinkDebugSeed = seed;
+ gLinkDebugFlags = flags;
+}
+
+u8 sub_800A8A4(void)
+{
+ int i;
+ u8 flags;
+
+ flags = 0;
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ flags |= (1 << i);
+ }
+ return flags;
+}
+
+u8 sub_800A8D4(void)
+{
+ int i;
+ u8 flags;
+
+ flags = 0;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ flags |= (1 << i);
+ }
+ return flags;
+}
+
+void sub_800A900(u8 a0)
+{
+ int i;
+
+ gSavedLinkPlayerCount = a0;
+ gSavedMultiplayerId = GetMultiplayerId();
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ gSavedLinkPlayers[i] = gLinkPlayers[i];
+ }
+}
+
+// The number of players when trading began. This is frequently compared against the
+// current number of connected players to check if anyone dropped out.
+u8 GetSavedPlayerCount(void)
+{
+ return gSavedLinkPlayerCount;
+}
+
+u8 GetSavedMultiplayerId(void)
+{
+ return gSavedMultiplayerId;
+}
+
+bool8 sub_800A95C(void)
+{
+ int i;
+ unsigned count;
+
+ count = 0;
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)
+ {
+ count++;
+ }
+ }
+ if (count == gSavedLinkPlayerCount)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_800A9A4(void)
+{
+ u8 i;
+
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)
+ {
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ }
+ }
+}
+
+void sub_800AA24(void)
+{
+ gSavedLinkPlayerCount = 0;
+ gSavedMultiplayerId = 0;
+}
+
+u8 GetLinkPlayerCount_2(void)
+{
+ return EXTRACT_PLAYER_COUNT(gLinkStatus);
+}
+
+bool8 IsLinkMaster(void)
+{
+ if (gWirelessCommType)
+ {
+ return Rfu_IsMaster();
+ }
+ return EXTRACT_MASTER(gLinkStatus);
+}
+
+u8 sub_800AA74(void)
+{
+ return gUnknown_3000E50;
+}
+
+void sub_800AA80(u16 a0)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ }
+ else
+ {
+ if (gLinkCallback == NULL)
+ {
+ gLinkCallback = sub_800AB0C;
+ gUnknown_3003F24 = FALSE;
+ gUnknown_3003F34 = a0;
+ }
+ }
+}
+
+void sub_800AAC0(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ }
+ else
+ {
+ if (gLinkCallback != NULL)
+ {
+ gUnknown_202285C++;
+ }
+ else
+ {
+ gLinkCallback = sub_800AB0C;
+ gUnknown_3003F24 = FALSE;
+ gUnknown_3003F34 = 0;
+ }
+ }
+}
+
+void sub_800AB0C(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(LINKCMD_0x5FFF);
+ gLinkCallback = sub_800AB38;
+ }
+}
+
+void sub_800AB38(void)
+{
+ int i;
+ unsigned count;
+ u8 linkPlayerCount;
+
+ linkPlayerCount = GetLinkPlayerCount();
+ count = 0;
+ for (i = 0; i < linkPlayerCount; i++)
+ {
+ if (gUnknown_3003F30[i])
+ {
+ count++;
+ }
+ }
+ if (count == linkPlayerCount)
+ {
+ gBattleTypeFlags &= ~(BATTLE_TYPE_20 | 0xFFFF0000);
+ gLinkVSyncDisabled = TRUE;
+ CloseLink();
+ gLinkCallback = NULL;
+ gUnknown_3003F24 = TRUE;
+ }
+}
+
+void sub_800AB9C(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ sub_80FA42C();
+ }
+ else
+ {
+ if (gLinkCallback == NULL)
+ {
+ gLinkCallback = sub_800ABD4;
+ }
+ gUnknown_3003F24 = FALSE;
+ }
+}
+
+void sub_800ABD4(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(LINKCMD_0x2FFE);
+ gLinkCallback = sub_800AC00;
+ }
+}
+
+void sub_800AC00(void)
+{
+ u8 i;
+ u8 linkPlayerCount;
+
+ linkPlayerCount = GetLinkPlayerCount();
+ for (i = 0; i < linkPlayerCount; i++)
+ {
+ if (!gUnknown_3003F2C[i])
+ {
+ break;
+ }
+ }
+ if (i == linkPlayerCount)
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gUnknown_3003F2C[i] = FALSE;
+ }
+ gLinkCallback = NULL;
+ }
+}
+
+void CheckErrorStatus(void)
+{
+ if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus))
+ {
+ if (!gSuppressLinkErrorMessage)
+ {
+ sLinkErrorBuffer.status = gLinkStatus;
+ sLinkErrorBuffer.lastRecvQueueCount = gLastRecvQueueCount;
+ sLinkErrorBuffer.lastSendQueueCount = gLastSendQueueCount;
+ SetMainCallback2(CB2_LinkError);
+ }
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ }
+} \ No newline at end of file
diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c
index 57bc07f33..dbc685602 100644
--- a/src/mystery_gift_menu.c
+++ b/src/mystery_gift_menu.c
@@ -1436,7 +1436,7 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 13:
- if (IsNoOneConnected())
+ if (IsRfuTaskFinished())
{
DestroyWirelessStatusIndicatorSprite();
data->state = 14;
@@ -1712,7 +1712,7 @@ void task00_mystery_gift(u8 taskId)
data->state = 34;
break;
case 34:
- if (IsNoOneConnected())
+ if (IsRfuTaskFinished())
{
DestroyWirelessStatusIndicatorSprite();
data->state = 35;