diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-06 20:04:37 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-06 20:04:37 -0400 |
commit | 76fd98fffee901012c1e41580aff23d70a977330 (patch) | |
tree | 46aa6bc48bae06330e04ec42fd19095e31733a23 | |
parent | 736b89ae3d4ffb335ef9e073556bc630c5541b70 (diff) |
link through CheckErrorStatus
-rw-r--r-- | asm/battle_2.s | 2 | ||||
-rw-r--r-- | asm/cable_club.s | 22 | ||||
-rw-r--r-- | asm/link.s | 1787 | ||||
-rw-r--r-- | asm/link_rfu_2.s | 60 | ||||
-rw-r--r-- | asm/overworld.s | 10 | ||||
-rw-r--r-- | asm/trade.s | 10 | ||||
-rw-r--r-- | include/link.h | 27 | ||||
-rw-r--r-- | include/link_rfu.h | 13 | ||||
-rw-r--r-- | include/trade.h | 6 | ||||
-rw-r--r-- | src/field_fadetransition.c | 2 | ||||
-rw-r--r-- | src/link.c | 757 | ||||
-rw-r--r-- | src/mystery_gift_menu.c | 4 |
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; |