diff options
-rw-r--r-- | asm/link.s | 1157 | ||||
-rw-r--r-- | common_syms/link.txt | 35 | ||||
-rw-r--r-- | include/link.h | 6 | ||||
-rw-r--r-- | include/link_rfu.h | 1 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/link.c | 621 | ||||
-rw-r--r-- | sym_common.txt | 91 |
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 |