summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-06 21:08:53 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-06 21:08:53 -0400
commite73e1172aa2bfa52b5fd5bcf89cd7b12decf5676 (patch)
tree066cc182661833df786c64fd386be934ebd00233
parent23d011b04b641a4b3dc7cf92898fc60d6377e82f (diff)
link through ResetSerial
-rw-r--r--asm/link.s831
-rw-r--r--asm/link_rfu_2.s14
-rw-r--r--asm/overworld.s10
-rw-r--r--baserom.ipsbin1992005 -> 1991957 bytes
-rw-r--r--data/data.s12
-rw-r--r--data/strings.s10
-rw-r--r--include/link.h2
-rw-r--r--include/link_rfu.h5
-rw-r--r--include/overworld.h2
-rw-r--r--include/strings.h7
-rw-r--r--src/link.c379
11 files changed, 413 insertions, 859 deletions
diff --git a/asm/link.s b/asm/link.s
index b0de10227..4b5b0e6b5 100644
--- a/asm/link.s
+++ b/asm/link.s
@@ -5,837 +5,6 @@
.text
- thumb_func_start sub_800ACBC
-sub_800ACBC: @ 800ACBC
- push {r4,lr}
- ldr r4, _0800ACD0 @ =sLinkErrorBuffer
- str r0, [r4]
- strb r1, [r4, 0x5]
- strb r2, [r4, 0x4]
- strb r3, [r4, 0x6]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800ACD0: .4byte sLinkErrorBuffer
- thumb_func_end sub_800ACBC
-
- thumb_func_start CB2_LinkError
-CB2_LinkError: @ 800ACD4
- push {r4,lr}
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- ldr r0, _0800ADE0 @ =gMPlayInfo_SE1
- bl m4aMPlayStop
- ldr r0, _0800ADE4 @ =gMPlayInfo_SE2
- bl m4aMPlayStop
- ldr r0, _0800ADE8 @ =gMPlayInfo_SE3
- bl m4aMPlayStop
- ldr r0, _0800ADEC @ =gHeap
- movs r1, 0xE0
- lsls r1, 9
- bl InitHeap
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl ResetPaletteFadeControl
- movs r0, 0
- movs r1, 0
- movs r2, 0x2
- bl FillPalette
- bl ResetTasks
- bl ScanlineEffect_Stop
- ldr r1, _0800ADF0 @ =gWirelessCommType
- ldrb r0, [r1]
- cmp r0, 0
- beq _0800AD30
- ldr r0, _0800ADF4 @ =sLinkErrorBuffer
- ldrb r0, [r0, 0x6]
- cmp r0, 0
- bne _0800AD2C
- movs r0, 0x3
- strb r0, [r1]
-_0800AD2C:
- bl sub_80F85F8
-_0800AD30:
- ldr r0, _0800ADF8 @ =sub_800978C
- bl SetVBlankCallback
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _0800ADFC @ =gUnknown_82345E8
- movs r0, 0
- movs r2, 0x2
- bl InitBgsFromTemplates
- ldr r4, _0800AE00 @ =gUnknown_2022860
- movs r0, 0x80
- lsls r0, 4
- bl Alloc
- adds r1, r0, 0
- str r1, [r4]
- movs r0, 0x1
- bl SetBgTilemapBuffer
- ldr r0, _0800AE04 @ =gUnknown_82345F0
- bl InitWindows
- lsls r0, 16
- cmp r0, 0
- beq _0800ADD8
- bl DeactivateAllTextPrinters
- bl ResetTempTileDataBuffers
- movs r0, 0x52
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x10
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x12
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x16
- movs r1, 0
- bl SetGpuReg
- movs r1, 0xE0
- lsls r1, 8
- movs r0, 0
- bl ClearGpuRegBits
- ldr r0, _0800AE08 @ =gTMCaseMainWindowPalette
- movs r1, 0xF0
- movs r2, 0x20
- bl LoadPalette
- ldr r1, _0800AE0C @ =gSoftResetDisabled
- movs r0, 0
- strb r0, [r1]
- ldr r0, _0800AE10 @ =Task_DestroySelf
- movs r1, 0
- bl CreateTask
- bl StopMapMusic
- ldr r1, _0800AE14 @ =gMain
- movs r0, 0
- str r0, [r1]
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- ldr r0, _0800AE18 @ =sub_800AF2C
- bl SetMainCallback2
-_0800ADD8:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800ADE0: .4byte gMPlayInfo_SE1
-_0800ADE4: .4byte gMPlayInfo_SE2
-_0800ADE8: .4byte gMPlayInfo_SE3
-_0800ADEC: .4byte gHeap
-_0800ADF0: .4byte gWirelessCommType
-_0800ADF4: .4byte sLinkErrorBuffer
-_0800ADF8: .4byte sub_800978C
-_0800ADFC: .4byte gUnknown_82345E8
-_0800AE00: .4byte gUnknown_2022860
-_0800AE04: .4byte gUnknown_82345F0
-_0800AE08: .4byte gTMCaseMainWindowPalette
-_0800AE0C: .4byte gSoftResetDisabled
-_0800AE10: .4byte Task_DestroySelf
-_0800AE14: .4byte gMain
-_0800AE18: .4byte sub_800AF2C
- thumb_func_end CB2_LinkError
-
- thumb_func_start sub_800AE1C
-sub_800AE1C: @ 800AE1C
- push {r4,r5,lr}
- sub sp, 0xC
- ldr r1, _0800AEB8 @ =gWirelessLinkDisplay4bpp
- movs r5, 0
- str r5, [sp]
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl DecompressAndLoadBgGfxUsingHeap
- ldr r1, _0800AEBC @ =gWirelessLinkDisplayBin
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl CopyToBgTilemapBuffer
- movs r0, 0x1
- bl CopyBgTilemapBufferToVram
- ldr r0, _0800AEC0 @ =gWirelessLinkDisplayPal
- movs r1, 0
- movs r2, 0x20
- bl LoadPalette
- movs r0, 0
- movs r1, 0
- bl FillWindowPixelBuffer
- movs r0, 0x2
- movs r1, 0
- bl FillWindowPixelBuffer
- ldr r4, _0800AEC4 @ =gUnknown_8234610
- str r4, [sp]
- str r5, [sp, 0x4]
- ldr r0, _0800AEC8 @ =gUnknown_841DEF0
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0x3
- movs r2, 0x2
- movs r3, 0x5
- bl AddTextPrinterParameterized3
- str r4, [sp]
- str r5, [sp, 0x4]
- ldr r0, _0800AECC @ =gUnknown_841DF05
- str r0, [sp, 0x8]
- movs r0, 0x2
- movs r1, 0x3
- movs r2, 0x2
- movs r3, 0x2
- bl AddTextPrinterParameterized3
- movs r0, 0
- bl PutWindowTilemap
- movs r0, 0x2
- bl PutWindowTilemap
- movs r0, 0
- movs r1, 0
- bl CopyWindowToVram
- movs r0, 0x2
- movs r1, 0x3
- bl CopyWindowToVram
- movs r0, 0
- bl ShowBg
- movs r0, 0x1
- bl ShowBg
- add sp, 0xC
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800AEB8: .4byte gWirelessLinkDisplay4bpp
-_0800AEBC: .4byte gWirelessLinkDisplayBin
-_0800AEC0: .4byte gWirelessLinkDisplayPal
-_0800AEC4: .4byte gUnknown_8234610
-_0800AEC8: .4byte gUnknown_841DEF0
-_0800AECC: .4byte gUnknown_841DF05
- thumb_func_end sub_800AE1C
-
- thumb_func_start sub_800AED0
-sub_800AED0: @ 800AED0
- push {lr}
- sub sp, 0xC
- movs r0, 0x1
- movs r1, 0
- bl FillWindowPixelBuffer
- movs r0, 0x2
- movs r1, 0
- bl FillWindowPixelBuffer
- ldr r0, _0800AF24 @ =gUnknown_8234610
- str r0, [sp]
- movs r0, 0
- str r0, [sp, 0x4]
- ldr r0, _0800AF28 @ =gUnknown_841DE9D
- str r0, [sp, 0x8]
- movs r0, 0x1
- movs r1, 0x3
- movs r2, 0x2
- movs r3, 0
- bl AddTextPrinterParameterized3
- movs r0, 0x1
- bl PutWindowTilemap
- movs r0, 0x2
- bl PutWindowTilemap
- movs r0, 0x1
- movs r1, 0
- bl CopyWindowToVram
- movs r0, 0x2
- movs r1, 0x3
- bl CopyWindowToVram
- movs r0, 0
- bl ShowBg
- add sp, 0xC
- pop {r0}
- bx r0
- .align 2, 0
-_0800AF24: .4byte gUnknown_8234610
-_0800AF28: .4byte gUnknown_841DE9D
- thumb_func_end sub_800AED0
-
- thumb_func_start sub_800AF2C
-sub_800AF2C: @ 800AF2C
- push {r4,lr}
- sub sp, 0xC
- ldr r0, _0800AF4C @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x3C
- beq _0800AF72
- cmp r0, 0x3C
- bgt _0800AF50
- cmp r0, 0
- beq _0800AF5A
- cmp r0, 0x1E
- beq _0800AF72
- b _0800AFC4
- .align 2, 0
-_0800AF4C: .4byte gMain
-_0800AF50:
- cmp r0, 0x5A
- beq _0800AF72
- cmp r0, 0x82
- beq _0800AF7A
- b _0800AFC4
-_0800AF5A:
- ldr r0, _0800AF68 @ =sLinkErrorBuffer
- ldrb r0, [r0, 0x6]
- cmp r0, 0
- beq _0800AF6C
- bl sub_800AE1C
- b _0800AFC4
- .align 2, 0
-_0800AF68: .4byte sLinkErrorBuffer
-_0800AF6C:
- bl sub_800AED0
- b _0800AFC4
-_0800AF72:
- movs r0, 0x16
- bl PlaySE
- b _0800AFC4
-_0800AF7A:
- ldr r0, _0800AF9C @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0x2
- bne _0800AFA8
- ldr r0, _0800AFA0 @ =gUnknown_8234610
- str r0, [sp]
- movs r0, 0
- str r0, [sp, 0x4]
- ldr r0, _0800AFA4 @ =gUnknown_841DF6B
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0x3
- movs r2, 0x2
- movs r3, 0x14
- bl AddTextPrinterParameterized3
- b _0800AFC4
- .align 2, 0
-_0800AF9C: .4byte gWirelessCommType
-_0800AFA0: .4byte gUnknown_8234610
-_0800AFA4: .4byte gUnknown_841DF6B
-_0800AFA8:
- cmp r0, 0x1
- bne _0800AFC4
- ldr r0, _0800AFFC @ =gUnknown_8234610
- str r0, [sp]
- movs r0, 0
- str r0, [sp, 0x4]
- ldr r0, _0800B000 @ =gUnknown_841DF4C
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0x3
- movs r2, 0x2
- movs r3, 0x14
- bl AddTextPrinterParameterized3
-_0800AFC4:
- ldr r0, _0800B004 @ =gMain
- movs r2, 0x87
- lsls r2, 3
- adds r1, r0, r2
- ldrb r1, [r1]
- cmp r1, 0xA0
- bne _0800B03C
- ldr r4, _0800B008 @ =gWirelessCommType
- ldrb r2, [r4]
- cmp r2, 0x1
- bne _0800B010
- ldrh r0, [r0, 0x2E]
- ands r2, r0
- cmp r2, 0
- beq _0800B02E
- bl sub_812B484
- movs r0, 0x15
- bl PlaySE
- movs r0, 0
- strb r0, [r4]
- ldr r1, _0800B00C @ =sLinkErrorBuffer
- movs r0, 0
- strb r0, [r1, 0x6]
- bl sub_8079B7C
- b _0800B02E
- .align 2, 0
-_0800AFFC: .4byte gUnknown_8234610
-_0800B000: .4byte gUnknown_841DF4C
-_0800B004: .4byte gMain
-_0800B008: .4byte gWirelessCommType
-_0800B00C: .4byte sLinkErrorBuffer
-_0800B010:
- cmp r2, 0x2
- bne _0800B02E
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _0800B02E
- bl sub_812B484
- bl rfu_REQ_stopMode
- bl rfu_waitREQComplete
- bl DoSoftReset
-_0800B02E:
- ldr r0, _0800B050 @ =gMain
- movs r2, 0x87
- lsls r2, 3
- adds r1, r0, r2
- ldrb r1, [r1]
- cmp r1, 0xA0
- beq _0800B048
-_0800B03C:
- movs r2, 0x87
- lsls r2, 3
- adds r1, r0, r2
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
-_0800B048:
- add sp, 0xC
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B050: .4byte gMain
- thumb_func_end sub_800AF2C
-
- thumb_func_start GetSioMultiSI
-GetSioMultiSI: @ 800B054
- ldr r0, _0800B060 @ =0x04000128
- ldrh r0, [r0]
- lsrs r0, 2
- movs r1, 0x1
- ands r0, r1
- bx lr
- .align 2, 0
-_0800B060: .4byte 0x04000128
- thumb_func_end GetSioMultiSI
-
- thumb_func_start IsSioMultiMaster
-IsSioMultiMaster: @ 800B064
- push {lr}
- movs r3, 0
- ldr r2, _0800B088 @ =0x04000128
- ldrh r1, [r2]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _0800B080
- ldrh r1, [r2]
- movs r0, 0x4
- ands r0, r1
- cmp r0, 0
- bne _0800B080
- movs r3, 0x1
-_0800B080:
- adds r0, r3, 0
- pop {r1}
- bx r1
- .align 2, 0
-_0800B088: .4byte 0x04000128
- thumb_func_end IsSioMultiMaster
-
- thumb_func_start IsLinkConnectionEstablished
-IsLinkConnectionEstablished: @ 800B08C
- ldr r0, _0800B098 @ =gLinkStatus
- ldr r0, [r0]
- lsrs r0, 6
- movs r1, 0x1
- ands r0, r1
- bx lr
- .align 2, 0
-_0800B098: .4byte gLinkStatus
- thumb_func_end IsLinkConnectionEstablished
-
- thumb_func_start SetSuppressLinkErrorMessage
-SetSuppressLinkErrorMessage: @ 800B09C
- ldr r1, _0800B0A4 @ =gSuppressLinkErrorMessage
- strb r0, [r1]
- bx lr
- .align 2, 0
-_0800B0A4: .4byte gSuppressLinkErrorMessage
- thumb_func_end SetSuppressLinkErrorMessage
-
- thumb_func_start HasLinkErrorOccurred
-HasLinkErrorOccurred: @ 800B0A8
- ldr r0, _0800B0B0 @ =gLinkErrorOccurred
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_0800B0B0: .4byte gLinkErrorOccurred
- thumb_func_end HasLinkErrorOccurred
-
- thumb_func_start sub_800B0B4
-sub_800B0B4: @ 800B0B4
- push {r4-r6,lr}
- bl InitLocalLinkPlayer
- ldr r1, _0800B100 @ =gLocalLinkPlayerBlock
- adds r2, r1, 0
- adds r2, 0x10
- ldr r0, _0800B104 @ =gLocalLinkPlayer
- ldm r0!, {r3-r5}
- stm r2!, {r3-r5}
- ldm r0!, {r3,r4,r6}
- stm r2!, {r3,r4,r6}
- ldr r0, [r0]
- str r0, [r2]
- ldr r3, _0800B108 @ =gASCIIGameFreakInc
- adds r2, r1, 0
- adds r0, r3, 0
- ldm r0!, {r4-r6}
- stm r2!, {r4-r6}
- ldrh r4, [r0]
- strh r4, [r2]
- ldrb r0, [r0, 0x2]
- strb r0, [r2, 0x2]
- adds r0, r1, 0
- adds r0, 0x2C
- ldm r3!, {r2,r5,r6}
- stm r0!, {r2,r5,r6}
- ldrh r2, [r3]
- strh r2, [r0]
- ldrb r2, [r3, 0x2]
- strb r2, [r0, 0x2]
- ldr r0, _0800B10C @ =gBlockSendBuffer
- movs r2, 0x3C
- bl memcpy
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B100: .4byte gLocalLinkPlayerBlock
-_0800B104: .4byte gLocalLinkPlayer
-_0800B108: .4byte gASCIIGameFreakInc
-_0800B10C: .4byte gBlockSendBuffer
- thumb_func_end sub_800B0B4
-
- thumb_func_start sub_800B110
-sub_800B110: @ 800B110
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r2, r0, 8
- ldr r1, _0800B168 @ =gBlockRecvBuffer
- adds r4, r2, r1
- lsls r2, r0, 3
- subs r2, r0
- lsls r2, 2
- ldr r0, _0800B16C @ =gLinkPlayers
- adds r2, r0
- adds r1, r2, 0
- adds r0, r4, 0
- adds r0, 0x10
- ldm r0!, {r3,r5,r6}
- stm r1!, {r3,r5,r6}
- ldm r0!, {r3,r5,r6}
- stm r1!, {r3,r5,r6}
- ldr r0, [r0]
- str r0, [r1]
- adds r0, r2, 0
- bl sub_800B284
- ldr r5, _0800B170 @ =gASCIIGameFreakInc
- adds r0, r4, 0
- adds r1, r5, 0
- bl strcmp
- cmp r0, 0
- bne _0800B15A
- adds r0, r4, 0
- adds r0, 0x2C
- adds r1, r5, 0
- bl strcmp
- cmp r0, 0
- beq _0800B160
-_0800B15A:
- ldr r0, _0800B174 @ =CB2_LinkError
- bl SetMainCallback2
-_0800B160:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B168: .4byte gBlockRecvBuffer
-_0800B16C: .4byte gLinkPlayers
-_0800B170: .4byte gASCIIGameFreakInc
-_0800B174: .4byte CB2_LinkError
- thumb_func_end sub_800B110
-
- thumb_func_start HandleLinkConnection
-HandleLinkConnection: @ 800B178
- push {r4,r5,lr}
- ldr r0, _0800B1B0 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800B1C8
- ldr r0, _0800B1B4 @ =gShouldAdvanceLinkState
- ldr r1, _0800B1B8 @ =gSendCmd
- ldr r2, _0800B1BC @ =gRecvCmds
- bl LinkMain1
- ldr r4, _0800B1C0 @ =gLinkStatus
- str r0, [r4]
- ldr r0, _0800B1C4 @ =gMain + 0x2C
- bl LinkMain2
- ldr r0, [r4]
- movs r1, 0x80
- lsls r1, 1
- ands r0, r1
- cmp r0, 0
- beq _0800B1EC
- bl sub_8058318
- cmp r0, 0x1
- bne _0800B1EC
-_0800B1AA:
- movs r0, 0x1
- b _0800B1EE
- .align 2, 0
-_0800B1B0: .4byte gWirelessCommType
-_0800B1B4: .4byte gShouldAdvanceLinkState
-_0800B1B8: .4byte gSendCmd
-_0800B1BC: .4byte gRecvCmds
-_0800B1C0: .4byte gLinkStatus
-_0800B1C4: .4byte gMain + 0x2C
-_0800B1C8:
- bl sub_80FAE94
- adds r4, r0, 0
- bl sub_80FAEF0
- adds r5, r0, 0
- bl sub_8058318
- cmp r0, 0x1
- bne _0800B1EC
- cmp r4, 0x1
- beq _0800B1AA
- bl sub_80F90DC
- cmp r0, 0
- bne _0800B1AA
- cmp r5, 0
- bne _0800B1AA
-_0800B1EC:
- movs r0, 0
-_0800B1EE:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end HandleLinkConnection
-
- thumb_func_start sub_800B1F4
-sub_800B1F4: @ 800B1F4
- push {lr}
- ldr r0, _0800B208 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800B204
- ldr r1, _0800B20C @ =gWirelessCommType
- movs r0, 0x1
- strb r0, [r1]
-_0800B204:
- pop {r0}
- bx r0
- .align 2, 0
-_0800B208: .4byte gReceivedRemoteLinkPlayers
-_0800B20C: .4byte gWirelessCommType
- thumb_func_end sub_800B1F4
-
- thumb_func_start sub_800B210
-sub_800B210: @ 800B210
- push {lr}
- ldr r0, _0800B224 @ =gReceivedRemoteLinkPlayers
- ldrb r1, [r0]
- cmp r1, 0
- bne _0800B21E
- ldr r0, _0800B228 @ =gWirelessCommType
- strb r1, [r0]
-_0800B21E:
- pop {r0}
- bx r0
- .align 2, 0
-_0800B224: .4byte gReceivedRemoteLinkPlayers
-_0800B228: .4byte gWirelessCommType
- thumb_func_end sub_800B210
-
- thumb_func_start sub_800B22C
-sub_800B22C: @ 800B22C
- push {lr}
- ldr r0, _0800B240 @ =gReceivedRemoteLinkPlayers
- ldrb r1, [r0]
- cmp r1, 0
- bne _0800B23A
- ldr r0, _0800B244 @ =gWirelessCommType
- strb r1, [r0]
-_0800B23A:
- pop {r0}
- bx r0
- .align 2, 0
-_0800B240: .4byte gReceivedRemoteLinkPlayers
-_0800B244: .4byte gWirelessCommType
- thumb_func_end sub_800B22C
-
- thumb_func_start sub_800B248
-sub_800B248: @ 800B248
- push {lr}
- ldr r0, _0800B25C @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800B268
- ldr r0, _0800B260 @ =gLink
- ldr r1, _0800B264 @ =0x00000fbd
- adds r0, r1
- ldrb r0, [r0]
- b _0800B26C
- .align 2, 0
-_0800B25C: .4byte gWirelessCommType
-_0800B260: .4byte gLink
-_0800B264: .4byte 0x00000fbd
-_0800B268:
- bl sub_80FC460
-_0800B26C:
- pop {r1}
- bx r1
- thumb_func_end sub_800B248
-
- thumb_func_start sub_800B270
-sub_800B270: @ 800B270
- push {lr}
- bl sub_800B248
- cmp r0, 0x2
- bhi _0800B27E
- movs r0, 0
- b _0800B280
-_0800B27E:
- movs r0, 0x1
-_0800B280:
- pop {r1}
- bx r1
- thumb_func_end sub_800B270
-
- thumb_func_start sub_800B284
-sub_800B284: @ 800B284
- push {lr}
- ldrb r1, [r0, 0x10]
- strb r1, [r0, 0x12]
- adds r2, r0, 0
- adds r2, 0x8
- ldrb r1, [r0, 0x1A]
- adds r0, r2, 0
- bl ConvertInternationalString
- pop {r0}
- bx r0
- thumb_func_end sub_800B284
-
- thumb_func_start DisableSerial
-DisableSerial: @ 800B29C
- push {lr}
- sub sp, 0x4
- movs r0, 0xC0
- bl DisableInterrupts
- ldr r1, _0800B2DC @ =0x04000128
- movs r2, 0x80
- lsls r2, 6
- adds r0, r2, 0
- strh r0, [r1]
- ldr r0, _0800B2E0 @ =0x0400010e
- movs r2, 0
- strh r2, [r0]
- adds r1, 0xDA
- movs r0, 0xC0
- strh r0, [r1]
- ldr r0, _0800B2E4 @ =0x0400012a
- strh r2, [r0]
- ldr r2, _0800B2E8 @ =0x04000120
- movs r0, 0
- movs r1, 0
- str r0, [r2]
- str r1, [r2, 0x4]
- str r0, [sp]
- ldr r1, _0800B2EC @ =gLink
- ldr r2, _0800B2F0 @ =0x050003f0
- mov r0, sp
- bl CpuSet
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_0800B2DC: .4byte 0x04000128
-_0800B2E0: .4byte 0x0400010e
-_0800B2E4: .4byte 0x0400012a
-_0800B2E8: .4byte 0x04000120
-_0800B2EC: .4byte gLink
-_0800B2F0: .4byte 0x050003f0
- thumb_func_end DisableSerial
-
- thumb_func_start EnableSerial
-EnableSerial: @ 800B2F4
- push {r4,r5,lr}
- sub sp, 0x4
- movs r0, 0xC0
- bl DisableInterrupts
- ldr r0, _0800B354 @ =0x04000134
- movs r4, 0
- strh r4, [r0]
- ldr r2, _0800B358 @ =0x04000128
- movs r1, 0x80
- lsls r1, 6
- adds r0, r1, 0
- strh r0, [r2]
- ldrh r0, [r2]
- ldr r3, _0800B35C @ =0x00004003
- adds r1, r3, 0
- orrs r0, r1
- strh r0, [r2]
- movs r0, 0x80
- bl EnableInterrupts
- ldr r0, _0800B360 @ =0x0400012a
- strh r4, [r0]
- movs r5, 0
- str r5, [sp]
- ldr r1, _0800B364 @ =gLink
- ldr r2, _0800B368 @ =0x050003f0
- mov r0, sp
- bl CpuSet
- ldr r0, _0800B36C @ =sNumVBlanksWithoutSerialIntr
- strb r4, [r0]
- ldr r0, _0800B370 @ =sSendNonzeroCheck
- strh r5, [r0]
- ldr r0, _0800B374 @ =sRecvNonzeroCheck
- strh r5, [r0]
- ldr r0, _0800B378 @ =sChecksumAvailable
- strb r4, [r0]
- ldr r0, _0800B37C @ =sHandshakePlayerCount
- strb r4, [r0]
- ldr r0, _0800B380 @ =gLastSendQueueCount
- strb r4, [r0]
- ldr r0, _0800B384 @ =gLastRecvQueueCount
- strb r4, [r0]
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B354: .4byte 0x04000134
-_0800B358: .4byte 0x04000128
-_0800B35C: .4byte 0x00004003
-_0800B360: .4byte 0x0400012a
-_0800B364: .4byte gLink
-_0800B368: .4byte 0x050003f0
-_0800B36C: .4byte sNumVBlanksWithoutSerialIntr
-_0800B370: .4byte sSendNonzeroCheck
-_0800B374: .4byte sRecvNonzeroCheck
-_0800B378: .4byte sChecksumAvailable
-_0800B37C: .4byte sHandshakePlayerCount
-_0800B380: .4byte gLastSendQueueCount
-_0800B384: .4byte gLastRecvQueueCount
- thumb_func_end EnableSerial
-
- thumb_func_start ResetSerial
-ResetSerial: @ 800B388
- push {lr}
- bl EnableSerial
- bl DisableSerial
- pop {r0}
- bx r0
- thumb_func_end ResetSerial
-
thumb_func_start LinkMain1
LinkMain1: @ 800B398
push {r4-r7,lr}
diff --git a/asm/link_rfu_2.s b/asm/link_rfu_2.s
index 04c4621e7..fd1cf3dc6 100644
--- a/asm/link_rfu_2.s
+++ b/asm/link_rfu_2.s
@@ -1360,8 +1360,8 @@ _080F90D4: .4byte 0x000008d4
_080F90D8: .4byte 0x000008f2
thumb_func_end sub_80F906C
- thumb_func_start sub_80F90DC
-sub_80F90DC: @ 80F90DC
+ thumb_func_start IsRfuRecvQueueEmpty
+IsRfuRecvQueueEmpty: @ 80F90DC
push {r4,lr}
ldr r0, _080F90EC @ =gUnknown_3007460
ldr r0, [r0]
@@ -1398,7 +1398,7 @@ _080F9110:
bx r1
.align 2, 0
_080F9118: .4byte gRecvCmds
- thumb_func_end sub_80F90DC
+ thumb_func_end IsRfuRecvQueueEmpty
thumb_func_start sub_80F911C
sub_80F911C: @ 80F911C
@@ -2029,7 +2029,7 @@ _080F9618:
cmp r1, 0x6
bls _080F9618
_080F9628:
- bl sub_80F90DC
+ bl IsRfuRecvQueueEmpty
add sp, 0x58
pop {r3}
mov r8, r3
@@ -8105,8 +8105,8 @@ _080FC458: .4byte gUnknown_3005450
_080FC45C: .4byte 0x000008d2
thumb_func_end sub_80FC44C
- thumb_func_start sub_80FC460
-sub_80FC460: @ 80FC460
+ thumb_func_start GetRfuRecvQueueLength
+GetRfuRecvQueueLength: @ 80FC460
ldr r0, _080FC46C @ =gUnknown_3005450
ldr r1, _080FC470 @ =0x0000069e
adds r0, r1
@@ -8115,7 +8115,7 @@ sub_80FC460: @ 80FC460
.align 2, 0
_080FC46C: .4byte gUnknown_3005450
_080FC470: .4byte 0x0000069e
- thumb_func_end sub_80FC460
+ thumb_func_end GetRfuRecvQueueLength
thumb_func_start nullsub_89
nullsub_89: @ 80FC474
diff --git a/asm/overworld.s b/asm/overworld.s
index ef63df6bb..ec8a03ddd 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -5640,7 +5640,7 @@ c1_link_related: @ 8057884
ldrb r0, [r0]
cmp r0, 0
beq _0805789E
- bl sub_80F90DC
+ bl IsRfuRecvQueueEmpty
cmp r0, 0
beq _0805789E
bl IsSendingKeysToLink
@@ -6289,7 +6289,7 @@ sub_8057D5C: @ 8057D5C
movs r0, 0x11
b _08057D92
_08057D70:
- bl sub_800B248
+ bl GetLinkRecvQueueLength
cmp r0, 0x4
bls _08057D7C
movs r0, 0x1B
@@ -6344,7 +6344,7 @@ _08057DC4: .4byte sub_8057D98
thumb_func_start sub_8057DC8
sub_8057DC8: @ 8057DC8
push {r4,lr}
- bl sub_800B248
+ bl GetLinkRecvQueueLength
movs r4, 0x11
cmp r0, 0x2
bhi _08057DE0
@@ -6982,7 +6982,7 @@ sub_8058244: @ 8058244
movs r0, 0
b _0805826C
_08058252:
- bl sub_800B248
+ bl GetLinkRecvQueueLength
cmp r0, 0x2
bls _08058264
ldr r1, _08058260 @ =gUnknown_3000E88
@@ -7006,7 +7006,7 @@ _08058270: .4byte gUnknown_3000E88
thumb_func_start sub_8058274
sub_8058274: @ 8058274
push {lr}
- bl sub_800B248
+ bl GetLinkRecvQueueLength
cmp r0, 0x1
bls _080582D8
bl IsUpdateLinkStateCBActive
diff --git a/baserom.ips b/baserom.ips
index 362a80b84..ae98df165 100644
--- a/baserom.ips
+++ b/baserom.ips
Binary files differ
diff --git a/data/data.s b/data/data.s
index 5a5580d37..fa97f6dea 100644
--- a/data/data.s
+++ b/data/data.s
@@ -7,15 +7,9 @@
.section .rodata
.align 2, 0
-gUnknown_82345E8:: @ 82345E8
- .incbin "baserom.gba", 0x2345E8, 0x8
-
-gUnknown_82345F0:: @ 82345F0
- .incbin "baserom.gba", 0x2345F0, 0x20
-
-gUnknown_8234610:: @ 8234610
- .incbin "baserom.gba", 0x234610, 0x8
-
+ .string "$"
+ .string "\n$"
+ .align 2, 0
gUnknown_8234618:: @ 8234618
.incbin "baserom.gba", 0x234618, 0x8
diff --git a/data/strings.s b/data/strings.s
index 98b137425..be47054b5 100644
--- a/data/strings.s
+++ b/data/strings.s
@@ -3714,22 +3714,22 @@ gUnknown_841DE9B:: @ 841DE9B
gUnknown_841DE9C:: @ 841DE9C
.string "$"
-gUnknown_841DE9D:: @ 841DE9D
+gText_CommErrorCheckConnections:: @ 841DE9D
.string "Communication error…\n"
.string "Please check all connections,\n"
.string "then turn the power OFF and ON.$"
-gUnknown_841DEF0:: @ 841DEF0
+gText_CommErrorEllipsis:: @ 841DEF0
.string "Communication error…$"
-gUnknown_841DF05:: @ 841DF05
+gText_MoveCloserToLinkPartner:: @ 841DF05
.string "Move closer to your link partner(s).\n"
.string "Avoid obstacles between partners.$"
-gUnknown_841DF4C:: @ 841DF4C
+gText_ABtnRegistrationCounter:: @ 841DF4C
.string "A Button: Registration Counter$"
-gUnknown_841DF6B:: @ 841DF6B
+gText_ABtnTitleScreen:: @ 841DF6B
.string "A Button: Title Screen$"
gUnknown_841DF82:: @ 841DF82
diff --git a/include/link.h b/include/link.h
index 1360ce8cc..b8c6bcd59 100644
--- a/include/link.h
+++ b/include/link.h
@@ -215,7 +215,7 @@ bool8 IsLinkConnectionEstablished(void);
void SetSuppressLinkErrorMessage(bool8);
bool8 HasLinkErrorOccurred(void);
void ResetSerial(void);
-u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
+u32 LinkMain1(u8 *, u16 *, u16[MAX_RFU_PLAYERS][CMD_LENGTH]);
void RFUVSync(void);
void Timer3Intr(void);
void SerialCB(void);
diff --git a/include/link_rfu.h b/include/link_rfu.h
index e64c0ed59..bfea690ae 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -33,5 +33,10 @@ u8 Rfu_GetBlockReceivedStatus(void);
void Rfu_SetBlockReceivedFlag(u8 who);
void Rfu_ResetBlockReceivedFlag(u8 who);
bool8 Rfu_IsMaster(void);
+void sub_80F85F8(void);
+bool32 sub_80FAE94(void);
+bool32 sub_80FAEF0(void);
+bool32 IsRfuRecvQueueEmpty(void);
+u32 GetRfuRecvQueueLength(void);
#endif //GUARD_LINK_RFU_H
diff --git a/include/overworld.h b/include/overworld.h
index f2ef24e9e..77cacff94 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -142,4 +142,6 @@ void ResetGameStats(void);
void Overworld_CreditsMainCB(void);
bool32 Overworld_DoScrollSceneForCredits(u8 *, const struct CreditsOverworldCmd *, u8);
+bool32 sub_8058318(void);
+
#endif //GUARD_OVERWORLD_H
diff --git a/include/strings.h b/include/strings.h
index 9ddce6044..1bafbacbe 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -329,4 +329,11 @@ extern const u8 gText_ItemfinderResponding[];
extern const u8 gText_ItemfinderShakingWildly[];
extern const u8 gText_NopeTheresNoResponse[];
+// link
+extern const u8 gText_CommErrorEllipsis[];
+extern const u8 gText_MoveCloserToLinkPartner[];
+extern const u8 gText_CommErrorCheckConnections[];
+extern const u8 gText_ABtnTitleScreen[];
+extern const u8 gText_ABtnRegistrationCounter[];
+
#endif //GUARD_STRINGS_H
diff --git a/src/link.c b/src/link.c
index fce0026c6..385538e5e 100644
--- a/src/link.c
+++ b/src/link.c
@@ -1,5 +1,8 @@
#include "global.h"
#include "palette.h"
+#include "bg.h"
+#include "m4a.h"
+#include "scanline_effect.h"
#include "bg_regs.h"
#include "gpu_regs.h"
#include "decompress.h"
@@ -15,8 +18,19 @@
#include "string_util.h"
#include "item_menu.h"
#include "trade.h"
+#include "text.h"
+#include "sound.h"
+#include "menu.h"
+#include "overworld.h"
+#include "new_menu_helpers.h"
#include "link.h"
+#include "window.h"
+#include "graphics.h"
+#include "strings.h"
+#include "help_system.h"
+#include "reset_save_heap.h"
#include "constants/battle.h"
+#include "constants/songs.h"
extern u16 gHeldKeyCodeToSend;
@@ -136,6 +150,7 @@ void sub_800AB38(void);
void sub_800ABD4(void);
void sub_800AC00(void);
void CheckErrorStatus(void);
+void CB2_PrintErrorMessage(void);
void EnableSerial(void);
void sub_800B210(void);
void sub_80F8DC0(void);
@@ -163,6 +178,50 @@ const char gASCIITestPrint[] = "TEST PRINT\n"
"P2\n"
"P3";
+const struct BgTemplate gUnknown_82345E8[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .priority = 0
+ }, {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 8,
+ .priority = 1
+ }
+};
+
+const struct WindowTemplate gUnknown_82345F0[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 30,
+ .height = 5,
+ .paletteNum = 15,
+ .baseBlock = 0x002
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 6,
+ .width = 30,
+ .height = 7,
+ .paletteNum = 15,
+ .baseBlock = 0x098
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 13,
+ .width = 30,
+ .height = 7,
+ .paletteNum = 15,
+ .baseBlock = 0x16A
+ }, DUMMY_WIN_TEMPLATE
+};
+
+const u8 gUnknown_8234610[4] = { 0x00, 0x01, 0x02 };
+
bool8 IsWirelessAdapterConnected(void)
{
if (gUnknown_203ADFA == 2 || gUnknown_203ADFA == 3)
@@ -1382,4 +1441,322 @@ void CheckErrorStatus(void)
gLinkErrorOccurred = TRUE;
CloseLink();
}
-} \ No newline at end of file
+}
+
+void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
+{
+ sLinkErrorBuffer.status = status;
+ sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
+ sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount;
+ sLinkErrorBuffer.unk_06 = unk_06;
+}
+
+void CB2_LinkError(void)
+{
+ u8 *tilemapBuffer;
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE3);
+ InitHeap(gHeap, HEAP_SIZE);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetPaletteFadeControl();
+ FillPalette(0, 0, 2);
+ ResetTasks();
+ ScanlineEffect_Stop();
+ if (gWirelessCommType)
+ {
+ if (!sLinkErrorBuffer.unk_06)
+ {
+ gWirelessCommType = 3;
+ }
+ sub_80F85F8();
+ }
+ SetVBlankCallback(sub_800978C);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_82345E8, 2);
+ gUnknown_2022860 = tilemapBuffer = malloc(0x800);
+ SetBgTilemapBuffer(1, tilemapBuffer);
+ if (InitWindows(gUnknown_82345F0))
+ {
+ DeactivateAllTextPrinters();
+ ResetTempTileDataBuffers();
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON);
+ LoadPalette(gTMCaseMainWindowPalette, 0xf0, 0x20);
+ gSoftResetDisabled = FALSE;
+ CreateTask(Task_DestroySelf, 0);
+ StopMapMusic();
+ gMain.callback1 = NULL;
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ SetMainCallback2(CB2_PrintErrorMessage);
+ }
+}
+
+void sub_800AE1C(void)
+{
+ DecompressAndLoadBgGfxUsingHeap(1, gWirelessLinkDisplay4bpp, FALSE, 0, 0);
+ CopyToBgTilemapBuffer(1, gWirelessLinkDisplayBin, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ LoadPalette(gWirelessLinkDisplayPal, 0, 0x20);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
+ AddTextPrinterParameterized3(0, 3, 2, 5, gUnknown_8234610, 0, gText_CommErrorEllipsis);
+ AddTextPrinterParameterized3(2, 3, 2, 2, gUnknown_8234610, 0, gText_MoveCloserToLinkPartner);
+ PutWindowTilemap(0);
+ PutWindowTilemap(2);
+ CopyWindowToVram(0, 0);
+ CopyWindowToVram(2, 3);
+ ShowBg(0);
+ ShowBg(1);
+}
+
+void sub_800AED0(void)
+{
+ FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
+ AddTextPrinterParameterized3(1, 3, 2, 0, gUnknown_8234610, 0, gText_CommErrorCheckConnections);
+ PutWindowTilemap(1);
+ PutWindowTilemap(2);
+ CopyWindowToVram(1, 0);
+ CopyWindowToVram(2, 3);
+ ShowBg(0);
+}
+
+void CB2_PrintErrorMessage(void)
+{
+ switch (gMain.state)
+ {
+ case 00:
+ if (sLinkErrorBuffer.unk_06)
+ {
+ sub_800AE1C();
+ }
+ else
+ {
+ sub_800AED0();
+ }
+ break;
+ case 30:
+ PlaySE(SE_BOO);
+ break;
+ case 60:
+ PlaySE(SE_BOO);
+ break;
+ case 90:
+ PlaySE(SE_BOO);
+ break;
+ case 130:
+ if (gWirelessCommType == 2)
+ {
+ AddTextPrinterParameterized3(0, 3, 2, 20, gUnknown_8234610, 0, gText_ABtnTitleScreen);
+ }
+ else if (gWirelessCommType == 1)
+ {
+ AddTextPrinterParameterized3(0, 3, 2, 20, gUnknown_8234610, 0, gText_ABtnRegistrationCounter);
+ }
+ break;
+ }
+ if (gMain.state == 160)
+ {
+ if (gWirelessCommType == 1)
+ {
+ if (JOY_NEW(A_BUTTON))
+ {
+ sub_812B484();
+ PlaySE(SE_PIN);
+ gWirelessCommType = 0;
+ sLinkErrorBuffer.unk_06 = 0;
+ sub_8079B7C();
+ }
+ }
+ else if (gWirelessCommType == 2)
+ {
+ if (JOY_NEW(A_BUTTON))
+ {
+ sub_812B484();
+ rfu_REQ_stopMode();
+ rfu_waitREQComplete();
+ DoSoftReset();
+ }
+ }
+ }
+ if (gMain.state != 160)
+ {
+ gMain.state++;
+ }
+}
+
+bool8 GetSioMultiSI(void)
+{
+ return (REG_SIOCNT & 0x04) != 0;
+}
+
+bool8 IsSioMultiMaster(void)
+{
+ return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04);
+}
+
+bool8 IsLinkConnectionEstablished(void)
+{
+ return EXTRACT_CONN_ESTABLISHED(gLinkStatus);
+}
+
+void SetSuppressLinkErrorMessage(bool8 flag)
+{
+ gSuppressLinkErrorMessage = flag;
+}
+
+bool8 HasLinkErrorOccurred(void)
+{
+ return gLinkErrorOccurred;
+}
+
+void sub_800B0B4(void)
+{
+ struct LinkPlayerBlock *block;
+
+ InitLocalLinkPlayer();
+ block = &gLocalLinkPlayerBlock;
+ block->linkPlayer = gLocalLinkPlayer;
+ memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1);
+ memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1);
+ memcpy(gBlockSendBuffer, block, sizeof(*block));
+}
+
+void sub_800B110(u32 who)
+{
+ u8 who_ = who;
+ struct LinkPlayerBlock *block;
+ struct LinkPlayer *player;
+
+ block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];
+ player = &gLinkPlayers[who_];
+ *player = block->linkPlayer;
+ sub_800B284(player);
+ if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 || strcmp(block->magic2, gASCIIGameFreakInc) != 0)
+ {
+ SetMainCallback2(CB2_LinkError);
+ }
+}
+
+bool8 HandleLinkConnection(void)
+{
+ bool32 r4;
+ bool32 r5;
+
+ if (gWirelessCommType == 0)
+ {
+ gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds);
+ LinkMain2(&gMain.heldKeys);
+ if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && sub_8058318() == TRUE)
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ r4 = sub_80FAE94();
+ r5 = sub_80FAEF0();
+ if (sub_8058318() == TRUE)
+ {
+ if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5)
+ {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void sub_800B1F4(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gWirelessCommType = 1;
+ }
+}
+
+void sub_800B210(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gWirelessCommType = 0;
+ }
+}
+
+void sub_800B22C(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gWirelessCommType = 0;
+ }
+}
+
+u32 GetLinkRecvQueueLength(void)
+{
+ if (gWirelessCommType != 0)
+ {
+ return GetRfuRecvQueueLength();
+ }
+ return gLink.recvQueue.count;
+}
+
+bool32 sub_800B270(void)
+{
+ if (GetLinkRecvQueueLength() > 2)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_800B284(struct LinkPlayer *player)
+{
+ player->name[10] = player->name[8];
+ ConvertInternationalString(player->name, player->language);
+}
+
+void DisableSerial(void)
+{
+ DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_SIOCNT = SIO_MULTI_MODE;
+ REG_TM3CNT_H = 0;
+ REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
+ REG_SIOMLT_SEND = 0;
+ REG_SIOMLT_RECV = 0;
+ CpuFill32(0, &gLink, sizeof(gLink));
+}
+
+void EnableSerial(void)
+{
+ DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_RCNT = 0;
+ REG_SIOCNT = SIO_MULTI_MODE;
+ REG_SIOCNT |= SIO_115200_BPS | SIO_INTR_ENABLE;
+ EnableInterrupts(INTR_FLAG_SERIAL);
+ REG_SIOMLT_SEND = 0;
+ CpuFill32(0, &gLink, sizeof(gLink));
+ sNumVBlanksWithoutSerialIntr = 0;
+ sSendNonzeroCheck = 0;
+ sRecvNonzeroCheck = 0;
+ sChecksumAvailable = 0;
+ sHandshakePlayerCount = 0;
+ gLastSendQueueCount = 0;
+ gLastRecvQueueCount = 0;
+}
+
+void ResetSerial(void)
+{
+ EnableSerial();
+ DisableSerial();
+}