summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/link.s1157
-rw-r--r--common_syms/link.txt35
-rw-r--r--include/link.h6
-rw-r--r--include/link_rfu.h1
-rw-r--r--ld_script.txt1
-rw-r--r--src/link.c621
-rw-r--r--sym_common.txt91
7 files changed, 602 insertions, 1310 deletions
diff --git a/asm/link.s b/asm/link.s
deleted file mode 100644
index 4b5b0e6b5..000000000
--- a/asm/link.s
+++ /dev/null
@@ -1,1157 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start LinkMain1
-LinkMain1: @ 800B398
- push {r4-r7,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- adds r6, r2, 0
- ldr r0, _0800B3B4 @ =gLink
- ldrb r0, [r0, 0x1]
- cmp r0, 0x4
- bhi _0800B44A
- lsls r0, 2
- ldr r1, _0800B3B8 @ =_0800B3BC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0800B3B4: .4byte gLink
-_0800B3B8: .4byte _0800B3BC
- .align 2, 0
-_0800B3BC:
- .4byte _0800B3D0
- .4byte _0800B3E0
- .4byte _0800B3F8
- .4byte _0800B434
- .4byte _0800B43E
-_0800B3D0:
- bl DisableSerial
- ldr r1, _0800B3DC @ =gLink
- movs r0, 0x1
- strb r0, [r1, 0x1]
- b _0800B44A
- .align 2, 0
-_0800B3DC: .4byte gLink
-_0800B3E0:
- ldrb r0, [r4]
- cmp r0, 0x1
- bne _0800B44A
- bl EnableSerial
- ldr r1, _0800B3F4 @ =gLink
- movs r0, 0x2
- strb r0, [r1, 0x1]
- b _0800B44A
- .align 2, 0
-_0800B3F4: .4byte gLink
-_0800B3F8:
- ldrb r1, [r4]
- cmp r1, 0x1
- beq _0800B408
- cmp r1, 0x2
- beq _0800B420
- bl CheckMasterOrSlave
- b _0800B44A
-_0800B408:
- ldr r2, _0800B41C @ =gLink
- ldrb r0, [r2]
- cmp r0, 0x8
- bne _0800B44A
- ldrb r0, [r2, 0x3]
- cmp r0, 0x1
- bls _0800B44A
- strb r1, [r2, 0xE]
- b _0800B44A
- .align 2, 0
-_0800B41C: .4byte gLink
-_0800B420:
- ldr r0, _0800B42C @ =gLink
- movs r1, 0
- strb r1, [r0, 0x1]
- ldr r0, _0800B430 @ =0x0400012a
- strh r1, [r0]
- b _0800B44A
- .align 2, 0
-_0800B42C: .4byte gLink
-_0800B430: .4byte 0x0400012a
-_0800B434:
- bl InitTimer
- ldr r1, _0800B484 @ =gLink
- movs r0, 0x4
- strb r0, [r1, 0x1]
-_0800B43E:
- adds r0, r5, 0
- bl sub_800B520
- adds r0, r6, 0
- bl sub_800B608
-_0800B44A:
- movs r0, 0
- strb r0, [r4]
- ldr r1, _0800B484 @ =gLink
- ldrb r2, [r1, 0x2]
- ldrb r0, [r1, 0x3]
- lsls r0, 2
- orrs r2, r0
- ldrb r0, [r1]
- cmp r0, 0x8
- bne _0800B462
- movs r0, 0x20
- orrs r2, r0
-_0800B462:
- ldrb r0, [r1, 0xC]
- lsls r3, r0, 8
- ldrb r0, [r1, 0xF]
- lsls r4, r0, 9
- ldrb r0, [r1, 0x10]
- lsls r5, r0, 12
- ldrb r0, [r1, 0x11]
- lsls r6, r0, 13
- ldrb r0, [r1, 0x12]
- lsls r7, r0, 14
- ldrb r0, [r1, 0x1]
- cmp r0, 0x4
- bne _0800B488
- movs r0, 0x40
- orrs r0, r3
- orrs r0, r2
- b _0800B48C
- .align 2, 0
-_0800B484: .4byte gLink
-_0800B488:
- adds r0, r2, 0
- orrs r0, r3
-_0800B48C:
- orrs r0, r4
- orrs r0, r5
- orrs r0, r6
- orrs r0, r7
- adds r2, r0, 0
- ldrb r3, [r1, 0x13]
- cmp r3, 0x1
- bne _0800B4A2
- movs r0, 0x80
- lsls r0, 9
- orrs r2, r0
-_0800B4A2:
- ldrb r0, [r1, 0x2]
- cmp r0, 0x3
- bls _0800B4AE
- movs r0, 0x80
- lsls r0, 10
- orrs r2, r0
-_0800B4AE:
- adds r1, r2, 0
- cmp r3, 0x2
- bne _0800B4BA
- movs r0, 0x80
- lsls r0, 11
- orrs r1, r0
-_0800B4BA:
- adds r0, r1, 0
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end LinkMain1
-
- thumb_func_start CheckMasterOrSlave
-CheckMasterOrSlave: @ 800B4C4
- push {lr}
- ldr r0, _0800B4E0 @ =0x04000128
- ldr r1, [r0]
- movs r0, 0xC
- ands r1, r0
- ldr r2, _0800B4E4 @ =gLink
- cmp r1, 0x8
- bne _0800B4E8
- ldrb r0, [r2, 0x2]
- cmp r0, 0
- bne _0800B4E8
- strb r1, [r2]
- b _0800B4EC
- .align 2, 0
-_0800B4E0: .4byte 0x04000128
-_0800B4E4: .4byte gLink
-_0800B4E8:
- movs r0, 0
- strb r0, [r2]
-_0800B4EC:
- pop {r0}
- bx r0
- thumb_func_end CheckMasterOrSlave
-
- thumb_func_start InitTimer
-InitTimer: @ 800B4F0
- push {lr}
- ldr r0, _0800B514 @ =gLink
- ldrb r0, [r0]
- cmp r0, 0
- beq _0800B50E
- ldr r1, _0800B518 @ =0x0400010c
- ldr r2, _0800B51C @ =0x0000ff3b
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x41
- strh r0, [r1]
- movs r0, 0x40
- bl EnableInterrupts
-_0800B50E:
- pop {r0}
- bx r0
- .align 2, 0
-_0800B514: .4byte gLink
-_0800B518: .4byte 0x0400010c
-_0800B51C: .4byte 0x0000ff3b
- thumb_func_end InitTimer
-
- thumb_func_start sub_800B520
-sub_800B520: @ 800B520
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r3, r0, 0
- ldr r2, _0800B598 @ =gLinkSavedIme
- ldr r1, _0800B59C @ =0x04000208
- ldrh r0, [r1]
- strh r0, [r2]
- movs r0, 0
- strh r0, [r1]
- ldr r1, _0800B5A0 @ =gLink
- ldr r4, _0800B5A4 @ =0x00000339
- adds r0, r1, r4
- ldrb r4, [r0]
- adds r6, r1, 0
- cmp r4, 0x31
- bhi _0800B5B0
- movs r1, 0xCE
- lsls r1, 2
- adds r0, r6, r1
- ldrb r0, [r0]
- adds r0, r4, r0
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _0800B55E
- subs r0, 0x32
- lsls r0, 24
- lsrs r0, 24
-_0800B55E:
- movs r2, 0
- ldr r4, _0800B5A8 @ =sSendNonzeroCheck
- mov r9, r4
- ldr r1, _0800B5AC @ =gLastSendQueueCount
- mov r10, r1
- lsls r5, r0, 1
- movs r0, 0x18
- adds r0, r6
- mov r8, r0
- mov r12, r2
- movs r7, 0x64
-_0800B574:
- ldrh r0, [r4]
- ldrh r1, [r3]
- orrs r0, r1
- strh r0, [r4]
- adds r0, r2, 0
- muls r0, r7
- adds r0, r5, r0
- add r0, r8
- strh r1, [r0]
- mov r1, r12
- strh r1, [r3]
- adds r3, 0x2
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x7
- bls _0800B574
- b _0800B5BC
- .align 2, 0
-_0800B598: .4byte gLinkSavedIme
-_0800B59C: .4byte 0x04000208
-_0800B5A0: .4byte gLink
-_0800B5A4: .4byte 0x00000339
-_0800B5A8: .4byte sSendNonzeroCheck
-_0800B5AC: .4byte gLastSendQueueCount
-_0800B5B0:
- movs r0, 0x1
- strb r0, [r6, 0x12]
- ldr r2, _0800B5F4 @ =sSendNonzeroCheck
- mov r9, r2
- ldr r4, _0800B5F8 @ =gLastSendQueueCount
- mov r10, r4
-_0800B5BC:
- mov r1, r9
- ldrh r0, [r1]
- cmp r0, 0
- beq _0800B5D4
- ldr r2, _0800B5FC @ =0x00000339
- adds r0, r6, r2
- ldrb r1, [r0]
- adds r1, 0x1
- movs r2, 0
- strb r1, [r0]
- mov r4, r9
- strh r2, [r4]
-_0800B5D4:
- ldr r1, _0800B600 @ =0x04000208
- ldr r2, _0800B604 @ =gLinkSavedIme
- ldrh r0, [r2]
- strh r0, [r1]
- ldr r4, _0800B5FC @ =0x00000339
- adds r0, r6, r4
- ldrb r0, [r0]
- mov r1, r10
- strb r0, [r1]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B5F4: .4byte sSendNonzeroCheck
-_0800B5F8: .4byte gLastSendQueueCount
-_0800B5FC: .4byte 0x00000339
-_0800B600: .4byte 0x04000208
-_0800B604: .4byte gLinkSavedIme
- thumb_func_end sub_800B520
-
- thumb_func_start sub_800B608
-sub_800B608: @ 800B608
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- mov r9, r0
- ldr r2, _0800B664 @ =gLinkSavedIme
- ldr r1, _0800B668 @ =0x04000208
- ldrh r0, [r1]
- strh r0, [r2]
- movs r0, 0
- strh r0, [r1]
- ldr r1, _0800B66C @ =gLink
- ldr r3, _0800B670 @ =0x00000fbd
- adds r0, r1, r3
- ldrb r0, [r0]
- mov r12, r1
- cmp r0, 0
- bne _0800B674
- movs r3, 0
- ldrb r0, [r1, 0x3]
- cmp r3, r0
- bcs _0800B65A
- movs r5, 0
- adds r6, r0, 0
-_0800B63A:
- movs r2, 0
- lsls r1, r3, 4
- adds r4, r3, 0x1
- add r1, r9
-_0800B642:
- lsls r0, r2, 1
- adds r0, r1
- strh r5, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x7
- bls _0800B642
- lsls r0, r4, 24
- lsrs r3, r0, 24
- cmp r3, r6
- bcc _0800B63A
-_0800B65A:
- movs r0, 0x1
- mov r7, r12
- strb r0, [r7, 0xC]
- b _0800B6F0
- .align 2, 0
-_0800B664: .4byte gLinkSavedIme
-_0800B668: .4byte 0x04000208
-_0800B66C: .4byte gLink
-_0800B670: .4byte 0x00000fbd
-_0800B674:
- movs r3, 0
- mov r0, r12
- ldrb r1, [r0, 0x3]
- cmp r3, r1
- bcs _0800B6CA
- ldr r0, _0800B708 @ =0x00000fbc
- add r0, r12
- ldrb r0, [r0]
- lsls r6, r0, 1
- movs r2, 0xCF
- lsls r2, 2
- add r2, r12
- mov r8, r2
- mov r10, r1
-_0800B690:
- movs r2, 0
- lsls r1, r3, 4
- adds r4, r3, 0x1
- lsls r0, r3, 1
- mov r7, r9
- adds r5, r1, r7
- adds r0, r3
- lsls r0, 3
- adds r0, r3
- lsls r3, r0, 5
-_0800B6A4:
- lsls r1, r2, 1
- adds r1, r5
- movs r7, 0x64
- adds r0, r2, 0
- muls r0, r7
- adds r0, r6, r0
- adds r0, r3
- add r0, r8
- ldrh r0, [r0]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x7
- bls _0800B6A4
- lsls r0, r4, 24
- lsrs r3, r0, 24
- cmp r3, r10
- bcc _0800B690
-_0800B6CA:
- mov r2, r12
- ldr r0, _0800B70C @ =0x00000fbd
- adds r1, r2, r0
- ldrb r0, [r1]
- subs r0, 0x1
- movs r3, 0
- strb r0, [r1]
- ldr r1, _0800B708 @ =0x00000fbc
- adds r2, r1
- ldrb r0, [r2]
- adds r0, 0x1
- strb r0, [r2]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _0800B6EC
- strb r3, [r2]
-_0800B6EC:
- mov r2, r12
- strb r3, [r2, 0xC]
-_0800B6F0:
- ldr r1, _0800B710 @ =0x04000208
- ldr r3, _0800B714 @ =gLinkSavedIme
- ldrh r0, [r3]
- strh r0, [r1]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B708: .4byte 0x00000fbc
-_0800B70C: .4byte 0x00000fbd
-_0800B710: .4byte 0x04000208
-_0800B714: .4byte gLinkSavedIme
- thumb_func_end sub_800B608
-
- thumb_func_start LinkVSync
-LinkVSync: @ 800B718
- push {r4,lr}
- ldr r3, _0800B740 @ =gLink
- ldrb r4, [r3]
- cmp r4, 0
- beq _0800B754
- ldrb r0, [r3, 0x1]
- cmp r0, 0x2
- beq _0800B74E
- cmp r0, 0x4
- bne _0800B77E
- movs r0, 0xD
- ldrsb r0, [r3, r0]
- cmp r0, 0x8
- bgt _0800B744
- ldrb r0, [r3, 0x10]
- cmp r0, 0x1
- beq _0800B74E
- movs r0, 0x1
- strb r0, [r3, 0x13]
- b _0800B77E
- .align 2, 0
-_0800B740: .4byte gLink
-_0800B744:
- ldrb r0, [r3, 0x13]
- cmp r0, 0x1
- beq _0800B77E
- movs r0, 0
- strb r0, [r3, 0xD]
-_0800B74E:
- bl sub_800B820
- b _0800B77E
-_0800B754:
- ldrb r2, [r3, 0x1]
- cmp r2, 0x4
- beq _0800B75E
- cmp r2, 0x2
- bne _0800B77E
-_0800B75E:
- ldr r1, _0800B784 @ =sNumVBlanksWithoutSerialIntr
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xA
- bls _0800B77E
- cmp r2, 0x4
- bne _0800B776
- movs r0, 0x2
- strb r0, [r3, 0x13]
-_0800B776:
- cmp r2, 0x2
- bne _0800B77E
- strb r4, [r3, 0x3]
- strb r4, [r3, 0xF]
-_0800B77E:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B784: .4byte sNumVBlanksWithoutSerialIntr
- thumb_func_end LinkVSync
-
- thumb_func_start Timer3Intr
-Timer3Intr: @ 800B788
- push {lr}
- bl StopTimer
- bl sub_800B820
- pop {r0}
- bx r0
- thumb_func_end Timer3Intr
-
- thumb_func_start SerialCB
-SerialCB: @ 800B798
- push {r4,lr}
- ldr r4, _0800B7C4 @ =gLink
- ldr r0, _0800B7C8 @ =0x04000128
- ldr r1, [r0]
- lsls r0, r1, 26
- lsrs r0, 30
- strb r0, [r4, 0x2]
- ldrb r0, [r4, 0x1]
- cmp r0, 0x2
- beq _0800B7CC
- cmp r0, 0x4
- bne _0800B7EA
- lsls r0, r1, 25
- lsrs r0, 31
- strb r0, [r4, 0x10]
- bl DoRecv
- bl DoSend
- bl SendRecvDone
- b _0800B7EA
- .align 2, 0
-_0800B7C4: .4byte gLink
-_0800B7C8: .4byte 0x04000128
-_0800B7CC:
- bl DoHandshake
- lsls r0, 24
- cmp r0, 0
- beq _0800B7EA
- ldrb r0, [r4]
- cmp r0, 0
- beq _0800B7E6
- movs r0, 0x3
- strb r0, [r4, 0x1]
- movs r0, 0x8
- strb r0, [r4, 0xD]
- b _0800B7EA
-_0800B7E6:
- movs r0, 0x4
- strb r0, [r4, 0x1]
-_0800B7EA:
- ldr r3, _0800B810 @ =gLink
- ldrb r0, [r3, 0xD]
- adds r0, 0x1
- movs r2, 0
- strb r0, [r3, 0xD]
- ldr r1, _0800B814 @ =sNumVBlanksWithoutSerialIntr
- strb r2, [r1]
- lsls r0, 24
- asrs r0, 24
- cmp r0, 0x8
- bne _0800B80A
- ldr r0, _0800B818 @ =gLastRecvQueueCount
- ldr r2, _0800B81C @ =0x00000fbd
- adds r1, r3, r2
- ldrb r1, [r1]
- strb r1, [r0]
-_0800B80A:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B810: .4byte gLink
-_0800B814: .4byte sNumVBlanksWithoutSerialIntr
-_0800B818: .4byte gLastRecvQueueCount
-_0800B81C: .4byte 0x00000fbd
- thumb_func_end SerialCB
-
- thumb_func_start sub_800B820
-sub_800B820: @ 800B820
- ldr r0, _0800B82C @ =0x04000128
- ldrh r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- strh r1, [r0]
- bx lr
- .align 2, 0
-_0800B82C: .4byte 0x04000128
- thumb_func_end sub_800B820
-
- thumb_func_start DoHandshake
-DoHandshake: @ 800B830
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- movs r5, 0
- ldr r6, _0800B84C @ =0x0000ffff
- ldr r0, _0800B850 @ =gLink
- ldrb r1, [r0, 0xE]
- adds r7, r0, 0
- cmp r1, 0x1
- bne _0800B85C
- ldr r1, _0800B854 @ =0x0400012a
- ldr r2, _0800B858 @ =0x00008fff
- b _0800B860
- .align 2, 0
-_0800B84C: .4byte 0x0000ffff
-_0800B850: .4byte gLink
-_0800B854: .4byte 0x0400012a
-_0800B858: .4byte 0x00008fff
-_0800B85C:
- ldr r1, _0800B8B4 @ =0x0400012a
- ldr r2, _0800B8B8 @ =0x0000b9a0
-_0800B860:
- adds r0, r2, 0
- strh r0, [r1]
- ldr r2, _0800B8BC @ =gLink + 4
- ldr r3, _0800B8C0 @ =0x04000120
- ldr r0, [r3]
- ldr r1, [r3, 0x4]
- str r0, [r2]
- str r1, [r2, 0x4]
- movs r0, 0
- movs r1, 0
- str r0, [r3]
- str r1, [r3, 0x4]
- strb r0, [r2, 0xA]
- movs r4, 0
- ldr r0, _0800B8C4 @ =sHandshakePlayerCount
- mov r9, r0
- mov r8, r2
- ldr r2, _0800B8C8 @ =0x00008fff
- ldr r1, _0800B8CC @ =0x0000ffff
- mov r12, r1
-_0800B888:
- lsls r0, r4, 1
- add r0, r8
- ldrh r3, [r0]
- movs r0, 0x4
- negs r0, r0
- ands r0, r3
- ldr r1, _0800B8B8 @ =0x0000b9a0
- cmp r0, r1
- beq _0800B8A0
- adds r0, r3, 0
- cmp r0, r2
- bne _0800B8D0
-_0800B8A0:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- adds r0, r3, 0
- cmp r6, r0
- bls _0800B8D8
- cmp r0, 0
- beq _0800B8D8
- adds r6, r3, 0
- b _0800B8D8
- .align 2, 0
-_0800B8B4: .4byte 0x0400012a
-_0800B8B8: .4byte 0x0000b9a0
-_0800B8BC: .4byte gLink + 4
-_0800B8C0: .4byte 0x04000120
-_0800B8C4: .4byte sHandshakePlayerCount
-_0800B8C8: .4byte 0x00008fff
-_0800B8CC: .4byte 0x0000ffff
-_0800B8D0:
- cmp r0, r12
- beq _0800B8E2
- movs r5, 0
- b _0800B8E2
-_0800B8D8:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x3
- bls _0800B888
-_0800B8E2:
- strb r5, [r7, 0x3]
- adds r0, r5, 0
- cmp r0, 0x1
- bls _0800B912
- mov r2, r9
- ldrb r2, [r2]
- cmp r0, r2
- bne _0800B904
- ldrh r1, [r7, 0x4]
- ldr r0, _0800B900 @ =0x00008fff
- cmp r1, r0
- bne _0800B904
- movs r0, 0x1
- b _0800B91E
- .align 2, 0
-_0800B900: .4byte 0x00008fff
-_0800B904:
- ldrb r0, [r7, 0x3]
- cmp r0, 0x1
- bls _0800B912
- movs r0, 0x3
- ands r6, r0
- adds r0, r6, 0x1
- b _0800B914
-_0800B912:
- movs r0, 0
-_0800B914:
- strb r0, [r7, 0xF]
- ldrb r0, [r7, 0x3]
- mov r1, r9
- strb r0, [r1]
- movs r0, 0
-_0800B91E:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end DoHandshake
-
- thumb_func_start DoRecv
-DoRecv: @ 800B92C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x8
- ldr r0, _0800B984 @ =0x04000120
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp]
- str r1, [sp, 0x4]
- ldr r0, _0800B988 @ =gLink
- ldrb r1, [r0, 0x16]
- adds r6, r0, 0
- cmp r1, 0
- bne _0800B990
- movs r4, 0
- ldr r7, _0800B98C @ =sChecksumAvailable
- ldrb r0, [r6, 0x3]
- cmp r4, r0
- bcs _0800B97A
- adds r5, r6, 0
- ldrh r1, [r6, 0x14]
- adds r3, r7, 0
- adds r2, r6, 0
-_0800B95A:
- lsls r0, r4, 1
- add r0, sp
- ldrh r0, [r0]
- cmp r1, r0
- beq _0800B96E
- ldrb r0, [r3]
- cmp r0, 0
- beq _0800B96E
- movs r0, 0x1
- strb r0, [r5, 0x11]
-_0800B96E:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldrb r0, [r2, 0x3]
- cmp r4, r0
- bcc _0800B95A
-_0800B97A:
- movs r0, 0
- strh r0, [r6, 0x14]
- movs r0, 0x1
- strb r0, [r7]
- b _0800BA30
- .align 2, 0
-_0800B984: .4byte 0x04000120
-_0800B988: .4byte gLink
-_0800B98C: .4byte sChecksumAvailable
-_0800B990:
- ldr r2, _0800BA00 @ =0x00000fbc
- adds r1, r6, r2
- adds r2, 0x1
- adds r0, r6, r2
- ldrb r2, [r0]
- ldrb r1, [r1]
- adds r0, r2, r1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _0800B9AC
- subs r0, 0x32
- lsls r0, 24
- lsrs r0, 24
-_0800B9AC:
- cmp r2, 0x31
- bhi _0800BA08
- movs r4, 0
- ldrb r1, [r6, 0x3]
- cmp r4, r1
- bcs _0800BA0C
- adds r5, r6, 0
- ldr r7, _0800BA04 @ =sRecvNonzeroCheck
- lsls r0, 1
- mov r12, r0
- movs r2, 0xCF
- lsls r2, 2
- adds r2, r6
- mov r8, r2
-_0800B9C8:
- lsls r1, r4, 1
- mov r2, sp
- adds r0, r2, r1
- ldrh r3, [r0]
- ldrh r2, [r5, 0x14]
- adds r0, r3, r2
- strh r0, [r5, 0x14]
- ldrh r0, [r7]
- orrs r0, r3
- strh r0, [r7]
- ldrb r2, [r5, 0x17]
- movs r0, 0x64
- muls r0, r2
- add r0, r12
- adds r1, r4
- lsls r1, 3
- adds r1, r4
- lsls r1, 5
- adds r0, r1
- add r0, r8
- strh r3, [r0]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- ldrb r0, [r5, 0x3]
- cmp r4, r0
- bcc _0800B9C8
- b _0800BA0C
- .align 2, 0
-_0800BA00: .4byte 0x00000fbc
-_0800BA04: .4byte sRecvNonzeroCheck
-_0800BA08:
- movs r0, 0x2
- strb r0, [r6, 0x12]
-_0800BA0C:
- ldrb r0, [r6, 0x17]
- adds r0, 0x1
- strb r0, [r6, 0x17]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x8
- bne _0800BA30
- ldr r2, _0800BA3C @ =sRecvNonzeroCheck
- ldrh r0, [r2]
- cmp r0, 0
- beq _0800BA30
- ldr r1, _0800BA40 @ =0x00000fbd
- adds r0, r6, r1
- ldrb r1, [r0]
- adds r1, 0x1
- strb r1, [r0]
- movs r0, 0
- strh r0, [r2]
-_0800BA30:
- add sp, 0x8
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800BA3C: .4byte sRecvNonzeroCheck
-_0800BA40: .4byte 0x00000fbd
- thumb_func_end DoRecv
-
- thumb_func_start DoSend
-DoSend: @ 800BA44
- push {r4,lr}
- ldr r0, _0800BA80 @ =gLink
- ldrb r1, [r0, 0x16]
- adds r4, r0, 0
- cmp r1, 0x8
- bne _0800BA96
- ldr r1, _0800BA84 @ =0x0400012a
- ldrh r0, [r4, 0x14]
- strh r0, [r1]
- ldr r1, _0800BA88 @ =sSendBufferEmpty
- ldrb r2, [r1]
- cmp r2, 0
- bne _0800BA90
- ldr r0, _0800BA8C @ =0x00000339
- adds r1, r4, r0
- ldrb r0, [r1]
- subs r0, 0x1
- strb r0, [r1]
- movs r0, 0xCE
- lsls r0, 2
- adds r1, r4, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x31
- bls _0800BAEC
- strb r2, [r1]
- b _0800BAEC
- .align 2, 0
-_0800BA80: .4byte gLink
-_0800BA84: .4byte 0x0400012a
-_0800BA88: .4byte sSendBufferEmpty
-_0800BA8C: .4byte 0x00000339
-_0800BA90:
- movs r0, 0
- strb r0, [r1]
- b _0800BAEC
-_0800BA96:
- ldr r1, _0800BABC @ =sSendBufferEmpty
- ldrb r0, [r1]
- cmp r0, 0
- bne _0800BAB2
- ldr r2, _0800BAC0 @ =0x00000339
- adds r0, r4, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0800BAAC
- movs r0, 0x1
- strb r0, [r1]
-_0800BAAC:
- ldrb r0, [r1]
- cmp r0, 0
- beq _0800BAC8
-_0800BAB2:
- ldr r1, _0800BAC4 @ =0x0400012a
- movs r0, 0
- strh r0, [r1]
- b _0800BAE6
- .align 2, 0
-_0800BABC: .4byte sSendBufferEmpty
-_0800BAC0: .4byte 0x00000339
-_0800BAC4: .4byte 0x0400012a
-_0800BAC8:
- ldr r3, _0800BAF4 @ =0x0400012a
- movs r1, 0xCE
- lsls r1, 2
- adds r0, r4, r1
- ldrb r0, [r0]
- lsls r0, 1
- ldrb r2, [r4, 0x16]
- movs r1, 0x64
- muls r1, r2
- adds r0, r1
- adds r1, r4, 0
- adds r1, 0x18
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r3]
-_0800BAE6:
- ldrb r0, [r4, 0x16]
- adds r0, 0x1
- strb r0, [r4, 0x16]
-_0800BAEC:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800BAF4: .4byte 0x0400012a
- thumb_func_end DoSend
-
- thumb_func_start StopTimer
-StopTimer: @ 800BAF8
- push {lr}
- ldr r0, _0800BB18 @ =gLink
- ldrb r0, [r0]
- cmp r0, 0
- beq _0800BB14
- ldr r2, _0800BB1C @ =0x0400010e
- ldrh r1, [r2]
- ldr r0, _0800BB20 @ =0x0000ff7f
- ands r0, r1
- strh r0, [r2]
- ldr r1, _0800BB24 @ =0x0400010c
- ldr r2, _0800BB28 @ =0x0000ff3b
- adds r0, r2, 0
- strh r0, [r1]
-_0800BB14:
- pop {r0}
- bx r0
- .align 2, 0
-_0800BB18: .4byte gLink
-_0800BB1C: .4byte 0x0400010e
-_0800BB20: .4byte 0x0000ff7f
-_0800BB24: .4byte 0x0400010c
-_0800BB28: .4byte 0x0000ff3b
- thumb_func_end StopTimer
-
- thumb_func_start SendRecvDone
-SendRecvDone: @ 800BB2C
- push {lr}
- ldr r1, _0800BB40 @ =gLink
- ldrb r0, [r1, 0x17]
- cmp r0, 0x8
- bne _0800BB44
- movs r0, 0
- strb r0, [r1, 0x16]
- strb r0, [r1, 0x17]
- b _0800BB54
- .align 2, 0
-_0800BB40: .4byte gLink
-_0800BB44:
- ldrb r0, [r1]
- cmp r0, 0
- beq _0800BB54
- ldr r0, _0800BB58 @ =0x0400010e
- ldrh r1, [r0]
- movs r2, 0x80
- orrs r1, r2
- strh r1, [r0]
-_0800BB54:
- pop {r0}
- bx r0
- .align 2, 0
-_0800BB58: .4byte 0x0400010e
- thumb_func_end SendRecvDone
-
- thumb_func_start ResetSendBuffer
-ResetSendBuffer: @ 800BB5C
- push {r4-r6,lr}
- ldr r1, _0800BBA4 @ =gLink
- ldr r2, _0800BBA8 @ =0x00000339
- adds r0, r1, r2
- movs r2, 0
- strb r2, [r0]
- movs r3, 0xCE
- lsls r3, 2
- adds r0, r1, r3
- strb r2, [r0]
- movs r0, 0
- movs r6, 0x64
- adds r5, r1, 0
- adds r5, 0x18
- ldr r4, _0800BBAC @ =0x0000efff
-_0800BB7A:
- movs r2, 0
- adds r1, r0, 0x1
- adds r3, r0, 0
- muls r3, r6
-_0800BB82:
- lsls r0, r2, 1
- adds r0, r3
- adds r0, r5
- strh r4, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x31
- bls _0800BB82
- lsls r0, r1, 24
- lsrs r0, 24
- cmp r0, 0x7
- bls _0800BB7A
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800BBA4: .4byte gLink
-_0800BBA8: .4byte 0x00000339
-_0800BBAC: .4byte 0x0000efff
- thumb_func_end ResetSendBuffer
-
- thumb_func_start ResetRecvBuffer
-ResetRecvBuffer: @ 800BBB0
- push {r4-r7,lr}
- ldr r1, _0800BC10 @ =gLink
- ldr r2, _0800BC14 @ =0x00000fbd
- adds r0, r1, r2
- movs r2, 0
- strb r2, [r0]
- ldr r3, _0800BC18 @ =0x00000fbc
- adds r0, r1, r3
- strb r2, [r0]
- movs r0, 0x64
- mov r12, r0
- movs r3, 0xCF
- lsls r3, 2
- adds r7, r1, r3
- ldr r6, _0800BC1C @ =0x0000efff
-_0800BBCE:
- movs r3, 0
- lsls r0, r2, 1
- adds r5, r2, 0x1
- adds r0, r2
- lsls r0, 3
- adds r0, r2
- lsls r4, r0, 5
-_0800BBDC:
- movs r2, 0
- adds r1, r3, 0x1
- mov r0, r12
- muls r0, r3
- adds r3, r0, 0
-_0800BBE6:
- lsls r0, r2, 1
- adds r0, r3
- adds r0, r4
- adds r0, r7
- strh r6, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x31
- bls _0800BBE6
- lsls r0, r1, 24
- lsrs r3, r0, 24
- cmp r3, 0x7
- bls _0800BBDC
- lsls r0, r5, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bls _0800BBCE
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800BC10: .4byte gLink
-_0800BC14: .4byte 0x00000fbd
-_0800BC18: .4byte 0x00000fbc
-_0800BC1C: .4byte 0x0000efff
- thumb_func_end ResetRecvBuffer
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/common_syms/link.txt b/common_syms/link.txt
new file mode 100644
index 000000000..32c25d708
--- /dev/null
+++ b/common_syms/link.txt
@@ -0,0 +1,35 @@
+gLinkPartnersHeldKeys
+gLinkDebugSeed
+gLocalLinkPlayerBlock
+gLinkErrorOccurred
+gLinkDebugFlags
+gFiller_3003EB4
+gRemoteLinkPlayersNotReceived
+gBlockReceivedStatus
+gFiller_3003EC0
+gLinkHeldKeys
+gRecvCmds
+gLinkStatus
+gUnknown_3003F24
+gUnknown_3003F28
+gUnknown_3003F2C
+gUnknown_3003F30
+gUnknown_3003F34
+gSuppressLinkErrorMessage
+gWirelessCommType
+gSavedLinkPlayerCount
+gSendCmd
+gSavedMultiplayerId
+gReceivedRemoteLinkPlayers
+gLinkTestBGInfo
+gLinkCallback
+gShouldAdvanceLinkState
+gLinkTestBlockChecksums
+gBlockRequestType
+gFiller_3003F94
+gFiller_3003F98
+gFiller_3003F9C
+gLastSendQueueCount
+gLink
+gLastRecvQueueCount
+gLinkSavedIme
diff --git a/include/link.h b/include/link.h
index b8c6bcd59..51f103745 100644
--- a/include/link.h
+++ b/include/link.h
@@ -9,6 +9,9 @@
#define QUEUE_CAPACITY 50
#define BLOCK_BUFFER_SIZE 0x100
+#define LINK_SLAVE 0
+#define LINK_MASTER 8
+
#define LINK_STAT_LOCAL_ID 0x00000003
#define LINK_STAT_PLAYER_COUNT 0x0000001C
#define LINK_STAT_PLAYER_COUNT_SHIFT 2
@@ -18,6 +21,8 @@
#define LINK_STAT_CONN_ESTABLISHED_SHIFT 6
#define LINK_STAT_RECEIVED_NOTHING 0x00000100
#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8
+#define LINK_STAT_UNK_FLAG_9 0x00000200
+#define LINK_STAT_UNK_FLAG_9_SHIFT 9
#define LINK_STAT_ERRORS 0x0007F000
#define LINK_STAT_ERRORS_SHIFT 12
@@ -250,5 +255,6 @@ void CreateWirelessStatusIndicatorSprite(u8, u8);
void sub_8009FE8(void);
void ClearLinkCallback_2(void);
void sub_80FA42C(void);
+void sub_800B284(struct LinkPlayer * linkPlayer);
#endif // GUARD_LINK_H
diff --git a/include/link_rfu.h b/include/link_rfu.h
index bfea690ae..2757e5296 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -38,5 +38,6 @@ bool32 sub_80FAE94(void);
bool32 sub_80FAEF0(void);
bool32 IsRfuRecvQueueEmpty(void);
u32 GetRfuRecvQueueLength(void);
+void sub_80F8DC0(void);
#endif //GUARD_LINK_RFU_H
diff --git a/ld_script.txt b/ld_script.txt
index bd63a0778..fbf00f9c1 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -61,7 +61,6 @@ SECTIONS {
src/sprite.o(.text);
src/string_util.o(.text);
src/link.o(.text);
- asm/link.o(.text);
src/multiboot.o(.text);
asm/main_menu.o(.text);
src/battle_controllers.o(.text);
diff --git a/src/link.c b/src/link.c
index 385538e5e..0bb637881 100644
--- a/src/link.c
+++ b/src/link.c
@@ -53,7 +53,6 @@ struct LinkTestBGInfo
#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
-#define static __attribute__((section(".bss")))
static struct BlockTransfer sBlockSend;
ALIGNED(8) static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];
static u32 sBlockSendDelayCounter;
@@ -63,23 +62,23 @@ static u32 sPlayerDataExchangeStatus;
static u32 gUnknown_3000E58;
static u8 sLinkTestLastBlockSendPos;
ALIGNED(8) static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];
+// File break?
static u8 sNumVBlanksWithoutSerialIntr;
static bool8 sSendBufferEmpty;
static u16 sSendNonzeroCheck;
static u16 sRecvNonzeroCheck;
static u8 sChecksumAvailable;
static u8 sHandshakePlayerCount;
-#undef static
u16 gLinkPartnersHeldKeys[6];
u32 gLinkDebugSeed;
struct LinkPlayerBlock gLocalLinkPlayerBlock;
bool8 gLinkErrorOccurred;
u32 gLinkDebugFlags;
-//u32 gFiller_03003074;
+u32 gFiller_3003EB4;
bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS];
u8 gBlockReceivedStatus[MAX_LINK_PLAYERS];
-//u32 gFiller_03003080;
+u32 gFiller_3003EC0;
u16 gLinkHeldKeys;
u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus;
@@ -99,15 +98,13 @@ void (*gLinkCallback)(void);
u8 gShouldAdvanceLinkState;
u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
u8 gBlockRequestType;
-//u32 gFiller_03003154;
-//u32 gFiller_03003158;
-//u32 gFiller_0300315c;
+u32 gFiller_3003F94; // file
+u32 gFiller_3003F98; // boundary
+u32 gFiller_3003F9C; // here?
u8 gLastSendQueueCount;
struct Link gLink;
u8 gLastRecvQueueCount;
u16 gLinkSavedIme;
-//u32 gFiller_03004138;
-//u32 gFiller_0300413C;
EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = FALSE;
EWRAM_DATA bool8 gUnknown_2022111 = FALSE;
@@ -129,34 +126,42 @@ EWRAM_DATA struct {
EWRAM_DATA u16 gUnknown_202285C = 0;
EWRAM_DATA void *gUnknown_2022860 = NULL;
-void InitLocalLinkPlayer(void);
-void sub_800978C(void);
-void CB2_LinkTest(void);
-void ProcessRecvCmds(u8 id);
-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 Task_PrintTestData(u8 taskId);
-void sub_800AB0C(void);
-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);
-void DisableSerial(void);
-void sub_800B284(struct LinkPlayer * linkPlayer);
-bool8 IsSioMultiMaster(void);
+static void InitLocalLinkPlayer(void);
+static void sub_800978C(void);
+static void CB2_LinkTest(void);
+static void ProcessRecvCmds(u8 id);
+static void sub_800A040(void);
+static void ResetBlockSend(void);
+static bool32 InitBlockSend(const void *src, size_t size);
+static void LinkCB_BlockSendBegin(void);
+static void LinkCB_BlockSend(void);
+static void LinkCB_BlockSendEnd(void);
+static void sub_800A3CC(void);
+static void SetBlockReceivedFlag(u8 id);
+static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
+static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
+static void LinkCB_RequestPlayerDataExchange(void);
+static void Task_PrintTestData(u8 taskId);
+static void sub_800AB0C(void);
+static void sub_800AB38(void);
+static void sub_800ABD4(void);
+static void sub_800AC00(void);
+static void CheckErrorStatus(void);
+static void CB2_PrintErrorMessage(void);
+static void sub_800B210(void);
+static void DisableSerial(void);
+static void EnableSerial(void);
+static bool8 IsSioMultiMaster(void);
+static void CheckMasterOrSlave(void);
+static void InitTimer(void);
+static void EnqueueSendCmd(u16 *sendCmd);
+static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]);
+static void StartTransfer(void);
+static bool8 DoHandshake(void);
+static void DoRecv(void);
+static void DoSend(void);
+static void StopTimer(void);
+static void SendRecvDone(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");
@@ -314,7 +319,7 @@ void SetLocalLinkPlayerId(u8 playerId)
gLocalLinkPlayer.id = playerId;
}
-void InitLocalLinkPlayer(void)
+static void InitLocalLinkPlayer(void)
{
gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName);
@@ -330,7 +335,7 @@ void InitLocalLinkPlayer(void)
}
}
-void sub_800978C(void)
+static void sub_800978C(void)
{
LoadOam();
ProcessSpriteCopyRequests();
@@ -471,7 +476,7 @@ void LinkTestProcessKeyInput(void)
}
}
-void CB2_LinkTest(void)
+static void CB2_LinkTest(void)
{
LinkTestProcessKeyInput();
TestBlockTransfer(1, 1, 0);
@@ -734,7 +739,7 @@ bool32 IsSendingKeysToLink(void)
return FALSE;
}
-void sub_800A040(void)
+static void sub_800A040(void)
{
if (gReceivedRemoteLinkPlayers == TRUE)
{
@@ -884,7 +889,7 @@ void ResetLinkPlayers(void)
}
}
-void ResetBlockSend(void)
+static void ResetBlockSend(void)
{
sBlockSend.active = FALSE;
sBlockSend.pos = 0;
@@ -892,7 +897,7 @@ void ResetBlockSend(void)
sBlockSend.src = NULL;
}
-bool32 InitBlockSend(const void *src, size_t size)
+static bool32 InitBlockSend(const void *src, size_t size)
{
if (sBlockSend.active)
{
@@ -920,7 +925,7 @@ bool32 InitBlockSend(const void *src, size_t size)
return TRUE;
}
-void LinkCB_BlockSendBegin(void)
+static void LinkCB_BlockSendBegin(void)
{
if (++sBlockSendDelayCounter > 2)
{
@@ -928,7 +933,7 @@ void LinkCB_BlockSendBegin(void)
}
}
-void LinkCB_BlockSend(void)
+static void LinkCB_BlockSend(void)
{
int i;
const u8 *src;
@@ -947,7 +952,7 @@ void LinkCB_BlockSend(void)
}
}
-void LinkCB_BlockSendEnd(void)
+static void LinkCB_BlockSendEnd(void)
{
gLinkCallback = NULL;
}
@@ -958,7 +963,7 @@ void sub_800A3AC(void)
gUnknown_2022114++;
}
-void sub_800A3CC(void)
+static void sub_800A3CC(void)
{
gUnknown_2022114 = 0;
gLinkCallback = sub_800A3AC;
@@ -1086,7 +1091,7 @@ void CheckShouldAdvanceLinkState(void)
}
}
-u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)
+static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)
{
u16 chksum;
u16 i;
@@ -1115,7 +1120,7 @@ void LinkTest_prntchar(char a0, u8 a1, u8 a2)
vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + gLinkTestBGInfo.dummy_8);
}
-void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2)
+static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2)
{
char sp[32 / 2];
int i;
@@ -1155,7 +1160,7 @@ void LinkTest_prntstr(const char *a0, u8 a1, u8 a2)
}
}
-void LinkCB_RequestPlayerDataExchange(void)
+static void LinkCB_RequestPlayerDataExchange(void)
{
if (gLinkStatus & LINK_STAT_MASTER)
{
@@ -1164,7 +1169,7 @@ void LinkCB_RequestPlayerDataExchange(void)
gLinkCallback = NULL;
}
-void Task_PrintTestData(u8 taskId)
+static void Task_PrintTestData(u8 taskId)
{
char sp[32];
int i;
@@ -1345,7 +1350,7 @@ void sub_800AAC0(void)
}
}
-void sub_800AB0C(void)
+static void sub_800AB0C(void)
{
if (gLastRecvQueueCount == 0)
{
@@ -1354,7 +1359,7 @@ void sub_800AB0C(void)
}
}
-void sub_800AB38(void)
+static void sub_800AB38(void)
{
int i;
unsigned count;
@@ -1395,7 +1400,7 @@ void sub_800AB9C(void)
}
}
-void sub_800ABD4(void)
+static void sub_800ABD4(void)
{
if (gLastRecvQueueCount == 0)
{
@@ -1404,7 +1409,7 @@ void sub_800ABD4(void)
}
}
-void sub_800AC00(void)
+static void sub_800AC00(void)
{
u8 i;
u8 linkPlayerCount;
@@ -1427,7 +1432,7 @@ void sub_800AC00(void)
}
}
-void CheckErrorStatus(void)
+static void CheckErrorStatus(void)
{
if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus))
{
@@ -1532,7 +1537,7 @@ void sub_800AED0(void)
ShowBg(0);
}
-void CB2_PrintErrorMessage(void)
+static void CB2_PrintErrorMessage(void)
{
switch (gMain.state)
{
@@ -1601,7 +1606,7 @@ bool8 GetSioMultiSI(void)
return (REG_SIOCNT & 0x04) != 0;
}
-bool8 IsSioMultiMaster(void)
+static bool8 IsSioMultiMaster(void)
{
return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04);
}
@@ -1686,7 +1691,7 @@ void sub_800B1F4(void)
}
}
-void sub_800B210(void)
+static void sub_800B210(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1720,13 +1725,15 @@ bool32 sub_800B270(void)
return FALSE;
}
-void sub_800B284(struct LinkPlayer *player)
+void sub_800B284(struct LinkPlayer * player)
{
player->name[10] = player->name[8];
ConvertInternationalString(player->name, player->language);
}
-void DisableSerial(void)
+// File break?
+
+static void DisableSerial(void)
{
DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
REG_SIOCNT = SIO_MULTI_MODE;
@@ -1737,7 +1744,7 @@ void DisableSerial(void)
CpuFill32(0, &gLink, sizeof(gLink));
}
-void EnableSerial(void)
+static void EnableSerial(void)
{
DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
REG_RCNT = 0;
@@ -1760,3 +1767,493 @@ void ResetSerial(void)
EnableSerial();
DisableSerial();
}
+
+u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH])
+{
+ u32 retVal;
+ u32 retVal2;
+
+ switch (gLink.state)
+ {
+ case LINK_STATE_START0:
+ DisableSerial();
+ gLink.state = LINK_STATE_START1;
+ break;
+ case LINK_STATE_START1:
+ if (*shouldAdvanceLinkState == 1)
+ {
+ EnableSerial();
+ gLink.state = LINK_STATE_HANDSHAKE;
+ }
+ break;
+ case LINK_STATE_HANDSHAKE:
+ switch (*shouldAdvanceLinkState)
+ {
+ default:
+ CheckMasterOrSlave();
+ break;
+ case 1:
+ if (gLink.isMaster == LINK_MASTER && gLink.playerCount > 1)
+ {
+ gLink.handshakeAsMaster = TRUE;
+ }
+ break;
+ case 2:
+ gLink.state = LINK_STATE_START0;
+ REG_SIOMLT_SEND = 0;
+ break;
+ }
+ break;
+ case LINK_STATE_INIT_TIMER:
+ InitTimer();
+ gLink.state = LINK_STATE_CONN_ESTABLISHED;
+ // fallthrough
+ case LINK_STATE_CONN_ESTABLISHED:
+ EnqueueSendCmd(sendCmd);
+ DequeueRecvCmds(recvCmds);
+ break;
+ }
+ *shouldAdvanceLinkState = 0;
+ retVal = gLink.localId;
+ retVal |= (gLink.playerCount << LINK_STAT_PLAYER_COUNT_SHIFT);
+ if (gLink.isMaster == LINK_MASTER)
+ {
+ retVal |= LINK_STAT_MASTER;
+ }
+ {
+ u32 receivedNothing = gLink.receivedNothing << LINK_STAT_RECEIVED_NOTHING_SHIFT;
+ u32 link_field_F = gLink.link_field_F << LINK_STAT_UNK_FLAG_9_SHIFT;
+ u32 hardwareError = gLink.hardwareError << LINK_STAT_ERROR_HARDWARE_SHIFT;
+ u32 badChecksum = gLink.badChecksum << LINK_STAT_ERROR_CHECKSUM_SHIFT;
+ u32 queueFull = gLink.queueFull << LINK_STAT_ERROR_QUEUE_FULL_SHIFT;
+ u32 val;
+
+ if (gLink.state == LINK_STATE_CONN_ESTABLISHED)
+ {
+ val = LINK_STAT_CONN_ESTABLISHED;
+ val |= receivedNothing;
+ val |= retVal;
+ val |= link_field_F;
+ val |= hardwareError;
+ val |= badChecksum;
+ val |= queueFull;
+ }
+ else
+ {
+ val = retVal;
+ val |= receivedNothing;
+ val |= link_field_F;
+ val |= hardwareError;
+ val |= badChecksum;
+ val |= queueFull;
+ }
+
+ retVal = val;
+ }
+
+ if (gLink.lag == LAG_MASTER)
+ {
+ retVal |= LINK_STAT_ERROR_LAG_MASTER;
+ }
+
+ if (gLink.localId >= MAX_LINK_PLAYERS)
+ {
+ retVal |= LINK_STAT_ERROR_INVALID_ID;
+ }
+
+ retVal2 = retVal;
+ if (gLink.lag == LAG_SLAVE)
+ {
+ retVal2 |= LINK_STAT_ERROR_LAG_SLAVE;
+ }
+
+ return retVal2;
+}
+
+static void CheckMasterOrSlave(void)
+{
+ u32 terminals;
+
+ terminals = *(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI);
+ if (terminals == SIO_MULTI_SD && gLink.localId == 0)
+ {
+ gLink.isMaster = LINK_MASTER;
+ }
+ else
+ {
+ gLink.isMaster = LINK_SLAVE;
+ }
+}
+
+static void InitTimer(void)
+{
+ if (gLink.isMaster)
+ {
+ REG_TM3CNT_L = -197;
+ REG_TM3CNT_H = TIMER_64CLK | TIMER_INTR_ENABLE;
+ EnableInterrupts(INTR_FLAG_TIMER3);
+ }
+}
+
+static void EnqueueSendCmd(u16 *sendCmd)
+{
+ u8 i;
+ u8 offset;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ if (gLink.sendQueue.count < QUEUE_CAPACITY)
+ {
+ offset = gLink.sendQueue.pos + gLink.sendQueue.count;
+ if (offset >= QUEUE_CAPACITY)
+ {
+ offset -= QUEUE_CAPACITY;
+ }
+ for (i = 0; i < CMD_LENGTH; i++)
+ {
+ sSendNonzeroCheck |= *sendCmd;
+ gLink.sendQueue.data[i][offset] = *sendCmd;
+ *sendCmd = 0;
+ sendCmd++;
+ }
+ }
+ else
+ {
+ gLink.queueFull = QUEUE_FULL_SEND;
+ }
+ if (sSendNonzeroCheck)
+ {
+ gLink.sendQueue.count++;
+ sSendNonzeroCheck = 0;
+ }
+ REG_IME = gLinkSavedIme;
+ gLastSendQueueCount = gLink.sendQueue.count;
+}
+
+static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH])
+{
+ u8 i;
+ u8 j;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ if (gLink.recvQueue.count == 0)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ for (j = 0; j < CMD_LENGTH; j++)
+ {
+ recvCmds[i][j] = 0;
+ }
+ }
+
+ gLink.receivedNothing = TRUE;
+ }
+ else
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ for (j = 0; j < CMD_LENGTH; j++)
+ {
+ recvCmds[i][j] = gLink.recvQueue.data[i][j][gLink.recvQueue.pos];
+ }
+ }
+ gLink.recvQueue.count--;
+ gLink.recvQueue.pos++;
+ if (gLink.recvQueue.pos >= QUEUE_CAPACITY)
+ {
+ gLink.recvQueue.pos = 0;
+ }
+ gLink.receivedNothing = FALSE;
+ }
+ REG_IME = gLinkSavedIme;
+}
+
+void LinkVSync(void)
+{
+ if (gLink.isMaster)
+ {
+ switch (gLink.state)
+ {
+ case LINK_STATE_CONN_ESTABLISHED:
+ if (gLink.serialIntrCounter < 9)
+ {
+ if (gLink.hardwareError != TRUE)
+ {
+ gLink.lag = LAG_MASTER;
+ }
+ else
+ {
+ StartTransfer();
+ }
+ }
+ else if (gLink.lag != LAG_MASTER)
+ {
+ gLink.serialIntrCounter = 0;
+ StartTransfer();
+ }
+ break;
+ case LINK_STATE_HANDSHAKE:
+ StartTransfer();
+ break;
+ }
+ }
+ else if (gLink.state == LINK_STATE_CONN_ESTABLISHED || gLink.state == LINK_STATE_HANDSHAKE)
+ {
+ if (++sNumVBlanksWithoutSerialIntr > 10)
+ {
+ if (gLink.state == LINK_STATE_CONN_ESTABLISHED)
+ {
+ gLink.lag = LAG_SLAVE;
+ }
+ if (gLink.state == LINK_STATE_HANDSHAKE)
+ {
+ gLink.playerCount = 0;
+ gLink.link_field_F = FALSE;
+ }
+ }
+ }
+}
+
+void Timer3Intr(void)
+{
+ StopTimer();
+ StartTransfer();
+}
+
+void SerialCB(void)
+{
+ gLink.localId = SIO_MULTI_CNT->id;
+ switch (gLink.state)
+ {
+ case LINK_STATE_CONN_ESTABLISHED:
+ gLink.hardwareError = SIO_MULTI_CNT->error;
+ DoRecv();
+ DoSend();
+ SendRecvDone();
+ break;
+ case LINK_STATE_HANDSHAKE:
+ if (DoHandshake())
+ {
+ if (gLink.isMaster)
+ {
+ gLink.state = LINK_STATE_INIT_TIMER;
+ gLink.serialIntrCounter = 8;
+ }
+ else
+ {
+ gLink.state = LINK_STATE_CONN_ESTABLISHED;
+ }
+ }
+ break;
+ }
+ gLink.serialIntrCounter++;
+ sNumVBlanksWithoutSerialIntr = 0;
+ if (gLink.serialIntrCounter == 8)
+ {
+ gLastRecvQueueCount = gLink.recvQueue.count;
+ }
+}
+
+static void StartTransfer(void)
+{
+ REG_SIOCNT |= SIO_START;
+}
+
+static bool8 DoHandshake(void)
+{
+ u8 i;
+ u8 playerCount;
+ u16 minRecv;
+
+ playerCount = 0;
+ minRecv = 0xFFFF;
+ if (gLink.handshakeAsMaster == TRUE)
+ {
+ REG_SIOMLT_SEND = MASTER_HANDSHAKE;
+ }
+ else
+ {
+ REG_SIOMLT_SEND = SLAVE_HANDSHAKE;
+ }
+ *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV;
+ REG_SIOMLT_RECV = 0;
+ gLink.handshakeAsMaster = FALSE;
+ for (i = 0; i < 4; i++)
+ {
+ if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE)
+ {
+ playerCount++;
+ if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0)
+ {
+ minRecv = gLink.tempRecvBuffer[i];
+ }
+ }
+ else
+ {
+ if (gLink.tempRecvBuffer[i] != 0xFFFF)
+ {
+ playerCount = 0;
+ }
+ break;
+ }
+ }
+ gLink.playerCount = playerCount;
+ if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE)
+ {
+ return TRUE;
+ }
+ if (gLink.playerCount > 1)
+ {
+ gLink.link_field_F = (minRecv & 3) + 1;
+ }
+ else
+ {
+ gLink.link_field_F = 0;
+ }
+ sHandshakePlayerCount = gLink.playerCount;
+ return FALSE;
+}
+
+static void DoRecv(void)
+{
+ u16 recv[4];
+ u8 i;
+ u8 index;
+
+ *(u64 *)recv = REG_SIOMLT_RECV;
+ if (gLink.sendCmdIndex == 0)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ if (gLink.checksum != recv[i] && sChecksumAvailable)
+ {
+ gLink.badChecksum = TRUE;
+ }
+ }
+ gLink.checksum = 0;
+ sChecksumAvailable = TRUE;
+ }
+ else
+ {
+ index = gLink.recvQueue.pos + gLink.recvQueue.count;
+ if (index >= QUEUE_CAPACITY)
+ {
+ index -= QUEUE_CAPACITY;
+ }
+ if (gLink.recvQueue.count < QUEUE_CAPACITY)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ gLink.checksum += recv[i];
+ sRecvNonzeroCheck |= recv[i];
+ gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recv[i];
+ }
+ }
+ else
+ {
+ gLink.queueFull = QUEUE_FULL_RECV;
+ }
+ gLink.recvCmdIndex++;
+ if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck)
+ {
+ gLink.recvQueue.count++;
+ sRecvNonzeroCheck = 0;
+ }
+ }
+}
+
+static void DoSend(void)
+{
+ if (gLink.sendCmdIndex == CMD_LENGTH)
+ {
+ REG_SIOMLT_SEND = gLink.checksum;
+ if (!sSendBufferEmpty)
+ {
+ gLink.sendQueue.count--;
+ gLink.sendQueue.pos++;
+ if (gLink.sendQueue.pos >= QUEUE_CAPACITY)
+ {
+ gLink.sendQueue.pos = 0;
+ }
+ }
+ else
+ {
+ sSendBufferEmpty = FALSE;
+ }
+ }
+ else
+ {
+ if (!sSendBufferEmpty && gLink.sendQueue.count == 0)
+ {
+ sSendBufferEmpty = TRUE;
+ }
+ if (sSendBufferEmpty)
+ {
+ REG_SIOMLT_SEND = 0;
+ }
+ else
+ {
+ REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos];
+ }
+ gLink.sendCmdIndex++;
+ }
+}
+
+static void StopTimer(void)
+{
+ if (gLink.isMaster)
+ {
+ REG_TM3CNT_H &= ~TIMER_ENABLE;
+ REG_TM3CNT_L = -197;
+ }
+}
+
+static void SendRecvDone(void)
+{
+ if (gLink.recvCmdIndex == CMD_LENGTH)
+ {
+ gLink.sendCmdIndex = 0;
+ gLink.recvCmdIndex = 0;
+ }
+ else if (gLink.isMaster)
+ {
+ REG_TM3CNT_H |= TIMER_ENABLE;
+ }
+}
+
+void ResetSendBuffer(void)
+{
+ u8 i;
+ u8 j;
+
+ gLink.sendQueue.count = 0;
+ gLink.sendQueue.pos = 0;
+ for (i = 0; i < CMD_LENGTH; i++)
+ {
+ for (j = 0; j < QUEUE_CAPACITY; j++)
+ {
+ gLink.sendQueue.data[i][j] = 0xEFFF;
+ }
+ }
+}
+
+void ResetRecvBuffer(void)
+{
+ u8 i;
+ u8 j;
+ u8 k;
+
+ gLink.recvQueue.count = 0;
+ gLink.recvQueue.pos = 0;
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ for (j = 0; j < CMD_LENGTH; j++)
+ {
+ for (k = 0; k < QUEUE_CAPACITY; k++)
+ {
+ gLink.recvQueue.data[i][j][k] = 0xEFFF;
+ }
+ }
+ }
+}
diff --git a/sym_common.txt b/sym_common.txt
index 0adbe29b3..b251a32ba 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -4,98 +4,9 @@
.include "window.o"
.include "text.o"
.include "sprite.o"
+ .include "link.o"
.align 4
-gLinkPartnersHeldKeys: @ 3003E60
- .space 0xC
-
-gLinkDebugSeed: @ 3003E6C
- .space 0x4
-
-gLocalLinkPlayerBlock: @ 3003E70
- .space 0x3C
-
-gLinkErrorOccurred: @ 3003EAC
- .space 0x4
-
-gLinkDebugFlags: @ 3003EB0
- .space 0x8
-
-gRemoteLinkPlayersNotReceived: @ 3003EB8
- .space 0x4
-
-gBlockReceivedStatus: @ 3003EBC
- .space 0x8
-
-gLinkHeldKeys: @ 3003EC4
- .space 0xC
-
-gRecvCmds: @ 3003ED0
- .space 0x50
-
-gLinkStatus: @ 3003F20
- .space 0x4
-
-gUnknown_3003F24: @ 3003F24
- .space 0x4
-
-gUnknown_3003F28: @ 3003F28
- .space 0x4
-
-gUnknown_3003F2C: @ 3003F2C
- .space 0x4
-
-gUnknown_3003F30: @ 3003F30
- .space 0x4
-
-gUnknown_3003F34: @ 3003F34
- .space 0x4
-
-gSuppressLinkErrorMessage: @ 3003F38
- .space 0x4
-
-gWirelessCommType: @ 3003F3C
- .space 0x4
-
-gSavedLinkPlayerCount: @ 3003F40
- .space 0x10
-
-gSendCmd: @ 3003F50
- .space 0x10
-
-gSavedMultiplayerId: @ 3003F60
- .space 0x4
-
-gReceivedRemoteLinkPlayers: @ 3003F64
- .space 0xC
-
-gLinkTestBGInfo: @ 3003F70
- .space 0x10
-
-gLinkCallback: @ 3003F80
- .space 0x4
-
-gShouldAdvanceLinkState: @ 3003F84
- .space 0x4
-
-gLinkTestBlockChecksums: @ 3003F88
- .space 0x8
-
-gBlockRequestType: @ 3003F90
- .space 0x10
-
-gLastSendQueueCount: @ 3003FA0
- .space 0x10
-
-gLink: @ 3003FB0
- .space 0xFC0
-
-gLastRecvQueueCount: @ 3004F70
- .space 0x4
-
-gLinkSavedIme: @ 3004F74
- .space 0xC
-
gPreBattleCallback1: @ 3004F80
.space 0x4