diff --git a/asm/intro.s b/asm/intro.s index c4d7f80e8..b59ce9012 100644 --- a/asm/intro.s +++ b/asm/intro.s @@ -282,7 +282,7 @@ _0816CE6C: .pool _0816CE8C: bl GameCubeMultiBoot_Quit - ldr r0, =sub_800BA38 + ldr r0, =SerialCB bl SetSerialCallback _0816CE96: movs r0, 0 diff --git a/asm/link.s b/asm/link.s index 59e307e21..92e476b61 100644 --- a/asm/link.s +++ b/asm/link.s @@ -5,80 +5,17 @@ .text - thumb_func_start sub_800B9B8 -sub_800B9B8: @ 800B9B8 - push {r4,lr} - ldr r3, =gLink - ldrb r4, [r3] - cmp r4, 0 - beq _0800B9F4 - ldrb r0, [r3, 0x1] - cmp r0, 0x2 - beq _0800B9EE - cmp r0, 0x4 - bne _0800BA1E - movs r0, 0xD - ldrsb r0, [r3, r0] - cmp r0, 0x8 - bgt _0800B9E4 - ldrb r0, [r3, 0x10] - cmp r0, 0x1 - beq _0800B9EE - movs r0, 0x1 - strb r0, [r3, 0x13] - b _0800BA1E - .pool -_0800B9E4: - ldrb r0, [r3, 0x13] - cmp r0, 0x1 - beq _0800BA1E - movs r0, 0 - strb r0, [r3, 0xD] -_0800B9EE: - bl sub_800BAC0 - b _0800BA1E -_0800B9F4: - ldrb r2, [r3, 0x1] - cmp r2, 0x4 - beq _0800B9FE - cmp r2, 0x2 - bne _0800BA1E -_0800B9FE: - ldr r1, =gUnknown_03000D6C - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xA - bls _0800BA1E - cmp r2, 0x4 - bne _0800BA16 - movs r0, 0x2 - strb r0, [r3, 0x13] -_0800BA16: - cmp r2, 0x2 - bne _0800BA1E - strb r4, [r3, 0x3] - strb r4, [r3, 0xF] -_0800BA1E: - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end sub_800B9B8 - thumb_func_start Timer3Intr Timer3Intr: @ 800BA28 push {lr} - bl sub_800BD98 - bl sub_800BAC0 + bl StopTimer + bl StartTransfer pop {r0} bx r0 thumb_func_end Timer3Intr - thumb_func_start sub_800BA38 -sub_800BA38: @ 800BA38 + thumb_func_start SerialCB +SerialCB: @ 800BA38 push {r4,lr} ldr r4, =gLink ldr r0, =0x04000128 @@ -121,7 +58,7 @@ _0800BA8A: adds r0, 0x1 movs r2, 0 strb r0, [r3, 0xD] - ldr r1, =gUnknown_03000D6C + ldr r1, =sNumVBlanksWithoutSerialIntr strb r2, [r1] lsls r0, 24 asrs r0, 24 @@ -137,10 +74,10 @@ _0800BAAA: pop {r0} bx r0 .pool - thumb_func_end sub_800BA38 + thumb_func_end SerialCB - thumb_func_start sub_800BAC0 -sub_800BAC0: @ 800BAC0 + thumb_func_start StartTransfer +StartTransfer: @ 800BAC0 ldr r0, =0x04000128 ldrh r1, [r0] movs r2, 0x80 @@ -148,7 +85,7 @@ sub_800BAC0: @ 800BAC0 strh r1, [r0] bx lr .pool - thumb_func_end sub_800BAC0 + thumb_func_end StartTransfer thumb_func_start sub_800BAD0 sub_800BAD0: @ 800BAD0 @@ -496,8 +433,8 @@ _0800BD8C: .pool thumb_func_end sub_800BCE4 - thumb_func_start sub_800BD98 -sub_800BD98: @ 800BD98 + thumb_func_start StopTimer +StopTimer: @ 800BD98 push {lr} ldr r0, =gLink ldrb r0, [r0] @@ -516,7 +453,7 @@ _0800BDB4: pop {r0} bx r0 .pool - thumb_func_end sub_800BD98 + thumb_func_end StopTimer thumb_func_start sub_800BDCC sub_800BDCC: @ 800BDCC diff --git a/asm/link_rfu.s b/asm/link_rfu.s index 3641ec1a3..43a99267f 100644 --- a/asm/link_rfu.s +++ b/asm/link_rfu.s @@ -7545,13 +7545,13 @@ Rfu_IsMaster: @ 8011AB0 .pool thumb_func_end Rfu_IsMaster - thumb_func_start LinkVSync -LinkVSync: @ 8011ABC + thumb_func_start RfuVSync +RfuVSync: @ 8011ABC push {lr} bl rfu_syncVBlank_ pop {r0} bx r0 - thumb_func_end LinkVSync + thumb_func_end RfuVSync thumb_func_start sub_8011AC8 sub_8011AC8: @ 8011AC8 diff --git a/include/link.h b/include/link.h index 023d95207..dab00195c 100644 --- a/include/link.h +++ b/include/link.h @@ -246,7 +246,6 @@ void sub_800A418(void); void SetSuppressLinkErrorMessage(bool8 flag); void sub_800B524(struct LinkPlayer *linkPlayer); u8 GetSioMultiSI(void); -void sub_800B9B8(void); extern u16 gLinkPartnersHeldKeys[6]; extern u32 gLinkDebugSeed; diff --git a/include/link_rfu.h b/include/link_rfu.h index 2062b3a79..62cff87b9 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -31,5 +31,6 @@ bool32 sub_8010EC0(void); bool32 sub_8010F1C(void); bool32 sub_800F0B8(void); u32 sub_80124D4(void); +void RfuVSync(void); #endif //GUARD_LINK_RFU_H diff --git a/src/link.c b/src/link.c index eb6d573d5..a57385a59 100644 --- a/src/link.c +++ b/src/link.c @@ -60,7 +60,7 @@ IWRAM_DATA u32 sPlayerDataExchangeStatus; IWRAM_DATA u32 gUnknown_03000D60; IWRAM_DATA u8 sLinkTestLastBlockSendPos; ALIGNED() IWRAM_DATA u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; -IWRAM_DATA u8 gUnknown_03000D6C; +IWRAM_DATA u8 sNumVBlanksWithoutSerialIntr; IWRAM_DATA bool8 gUnknown_03000D6D; IWRAM_DATA u16 sSendNonzeroCheck; IWRAM_DATA u16 gUnknown_03000D70; @@ -159,6 +159,7 @@ static void CheckMasterOrSlave(void); static void InitTimer(void); static void EnqueueSendCmd(u16 *sendCmd); static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]); +void StartTransfer(void); // .rodata @@ -1919,7 +1920,7 @@ static void EnableSerial(void) EnableInterrupts(INTR_FLAG_SERIAL); REG_SIOMLT_SEND = 0; CpuFill32(0, &gLink, sizeof(gLink)); - gUnknown_03000D6C = 0; + sNumVBlanksWithoutSerialIntr = 0; sSendNonzeroCheck = 0; gUnknown_03000D70 = 0; gUnknown_03000D72 = 0; @@ -2136,3 +2137,49 @@ static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]) 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; + } + } + } +} + diff --git a/src/main.c b/src/main.c index 00dd99dc3..09ab3f5e4 100644 --- a/src/main.c +++ b/src/main.c @@ -316,10 +316,10 @@ extern void ProcessDma3Requests(void); static void VBlankIntr(void) { - if (gWirelessCommType != FALSE) - LinkVSync(); + if (gWirelessCommType != 0) + RfuVSync(); else if (gLinkVSyncDisabled == FALSE) - sub_800B9B8(); + LinkVSync(); gMain.vblankCounter1++;