diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-05 20:30:02 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-05 20:30:02 -0400 |
commit | 221dd4721d40abaebdbcf0823c924062c77311f5 (patch) | |
tree | cf3d0579ef4d4189d0210774b103e7b2c242db6b /src | |
parent | b01da1a59260b2ac54dd876e9cf35d2c1fb944e7 (diff) |
link through TestBlockTransfer + bss, ewram
Diffstat (limited to 'src')
-rw-r--r-- | src/ereader_helpers.c | 14 | ||||
-rw-r--r-- | src/intro.c | 2 | ||||
-rw-r--r-- | src/link.c | 164 | ||||
-rw-r--r-- | src/mevent.c | 2 |
4 files changed, 171 insertions, 11 deletions
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c index 2a9b9ea71..cce6cefca 100644 --- a/src/ereader_helpers.c +++ b/src/ereader_helpers.c @@ -51,7 +51,7 @@ int EReader_Send(size_t r6, const void * r5) { GetKeyInput(); if (TEST_BUTTON(sJoyNew, B_BUTTON)) - gUnknown_3003F84 = 2; + gShouldAdvanceLinkState = 2; sSendRecvStatus = EReaderHandleTransfer(1, r6, r5, NULL); if ((sSendRecvStatus & 0x13) == 0x10) @@ -71,7 +71,7 @@ int EReader_Send(size_t r6, const void * r5) } else { - gUnknown_3003F84 = 0; + gShouldAdvanceLinkState = 0; VBlankIntrWait(); } } @@ -90,7 +90,7 @@ int EReader_Recv(void * r5) { GetKeyInput(); if (TEST_BUTTON(sJoyNew, B_BUTTON)) - gUnknown_3003F84 = 2; + gShouldAdvanceLinkState = 2; sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, r5); if ((sSendRecvStatus & 0x13) == 0x10) @@ -110,7 +110,7 @@ int EReader_Recv(void * r5) } else { - gUnknown_3003F84 = 0; + gShouldAdvanceLinkState = 0; VBlankIntrWait(); } } @@ -150,7 +150,7 @@ static void OpenSerial32(void) REG_RCNT = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE; REG_SIOCNT |= SIO_MULTI_SD; - gUnknown_3003F84 = 0; + gShouldAdvanceLinkState = 0; sCounter1 = 0; sCounter2 = 0; } @@ -167,7 +167,7 @@ u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBu case 1: if (DetermineSendRecvState(mode)) EnableSio(); - if (gUnknown_3003F84 == 2) + if (gShouldAdvanceLinkState == 2) { sSendRecvMgr.field_04 = 2; sSendRecvMgr.state = 6; @@ -179,7 +179,7 @@ u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBu sSendRecvMgr.state = 3; // fallthrough case 3: - if (gUnknown_3003F84 == 2) + if (gShouldAdvanceLinkState == 2) { sSendRecvMgr.field_04 = 2; sSendRecvMgr.state = 6; diff --git a/src/intro.c b/src/intro.c index bb7242f2f..c15f40dd3 100644 --- a/src/intro.c +++ b/src/intro.c @@ -561,7 +561,7 @@ static bool8 sub_80EC62C(void) } break; case 142: - sub_800B388(); + ResetSerial(); SetMainCallback2(sub_80EC5B8); break; } diff --git a/src/link.c b/src/link.c index f63b2fcd7..b1e1466fc 100644 --- a/src/link.c +++ b/src/link.c @@ -27,18 +27,68 @@ struct LinkTestBGInfo u32 dummy_C; }; -u32 gUnknown_3000E58; +#define static __attribute__((section(".bss"))) +static struct BlockTransfer sBlockSend; +ALIGNED(8) static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; +static u32 sBlockSendDelayCounter; +static u32 gUnknown_3000E4C; +static u8 gUnknown_3000E50; +static u32 sPlayerDataExchangeStatus; +static u32 gUnknown_3000E58; +static u8 sLinkTestLastBlockSendPos; +ALIGNED(8) static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; +static u8 sNumVBlanksWithoutSerialIntr; +static bool8 sSendBufferEmpty; +static u16 sSendNonzeroCheck; +static u16 sRecvNonzeroCheck; +static u8 sChecksumAvailable; +static u8 sHandshakePlayerCount; +#undef static struct LinkTestBGInfo gLinkTestBGInfo; +bool8 gLinkErrorOccurred; +bool8 gSuppressLinkErrorMessage; +void (*gLinkCallback)(void); +bool8 gUnknown_3003F28; +bool8 gUnknown_3003F24; +u16 gUnknown_3003F34; +u8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; +u8 gUnknown_3003F30[MAX_LINK_PLAYERS]; +u8 gUnknown_3003F2C[MAX_LINK_PLAYERS]; +u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; +EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = FALSE; +EWRAM_DATA bool8 gUnknown_2022111 = FALSE; +EWRAM_DATA u32 gUnknown_2022114 = 0; +EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {}; +EWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {}; +EWRAM_DATA bool8 gLinkOpen = FALSE; +EWRAM_DATA u16 gLinkType = 0; +EWRAM_DATA u16 gLinkTimeOutCounter = 0; EWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {}; +EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {}; +EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {}; +EWRAM_DATA struct { + u32 status; + u8 lastRecvQueueCount; + u8 lastSendQueueCount; + u8 unk_06; +} sLinkErrorBuffer = {}; +EWRAM_DATA u16 gUnknown_202285C = 0; +EWRAM_DATA void *gUnknown_2022860 = NULL; -void sub_800B210(void); void InitLocalLinkPlayer(void); void sub_800978C(void); +u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size); +void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2); +void LinkCB_RequestPlayerDataExchange(void); void ResetBlockSend(void); void task00_link_test(u8 taskId); void CB2_LinkTest(void); +void EnableSerial(void); +void sub_800B210(void); +void sub_80F8DC0(void); +void DisableSerial(void); extern const u16 gLinkTestDigitsPal[0x20]; extern const u16 gLinkTestDigitsGfx[0x1000]; @@ -151,3 +201,113 @@ void InitLocalLinkPlayer(void) gLocalLinkPlayer.name[8] |= 0x10; } } + +void sub_800978C(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void InitLink(void) +{ + int i; + + for (i = 0; i < 8; i++) + { + gSendCmd[i] = 0xEFFF; + } + gLinkOpen = TRUE; + EnableSerial(); +} + +void Task_TriggerHandshake(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 5) + { + gShouldAdvanceLinkState = 1; + DestroyTask(taskId); + } +} + +void OpenLink(void) +{ + int i; + + if (!gWirelessCommType) + { + ResetSerial(); + InitLink(); + gLinkCallback = LinkCB_RequestPlayerDataExchange; + gLinkVSyncDisabled = FALSE; + gLinkErrorOccurred = FALSE; + gSuppressLinkErrorMessage = FALSE; + ResetBlockReceivedFlags(); + ResetBlockSend(); + gUnknown_3000E4C = 0; + gUnknown_3003F28 = FALSE; + gUnknown_3003F24 = FALSE; + gUnknown_3003F34 = 0; + CreateTask(Task_TriggerHandshake, 2); + } + else + { + sub_80F86F4(); + } + gReceivedRemoteLinkPlayers = 0; + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gRemoteLinkPlayersNotReceived[i] = TRUE; + gUnknown_3003F30[i] = FALSE; + gUnknown_3003F2C[i] = FALSE; + } +} + +void CloseLink(void) +{ + gReceivedRemoteLinkPlayers = FALSE; + if (gWirelessCommType) + { + sub_80F8DC0(); + } + gLinkOpen = FALSE; + DisableSerial(); +} + +void TestBlockTransfer(u8 nothing, u8 is, u8 used) +{ + u8 i; + u8 status; + + if (sLinkTestLastBlockSendPos != sBlockSend.pos) + { + LinkTest_prnthex(sBlockSend.pos, 2, 3, 2); + sLinkTestLastBlockSendPos = sBlockSend.pos; + } + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) + { + LinkTest_prnthex(sBlockRecv[i].pos, 2, i + 4, 2); + sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; + } + } + status = GetBlockReceivedStatus(); + if (status == 0xF) // 0b1111 + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if ((status >> i) & 1) + { + gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(gBlockRecvBuffer[i], sBlockRecv[i].size); + ResetBlockReceivedFlag(i); + if (gLinkTestBlockChecksums[i] != 0x0342) + { + gLinkTestDebugValuesEnabled = FALSE; + gUnknown_2022111 = FALSE; + } + } + } + } +} + diff --git a/src/mevent.c b/src/mevent.c index d0d7f59aa..a4a9ea82d 100644 --- a/src/mevent.c +++ b/src/mevent.c @@ -126,7 +126,7 @@ u8 sub_8143674(struct MEvent_Str_1 *mgr) resp = 2; if (mgr->status & 4) resp = 3; - gUnknown_3003F84 = 0; + gShouldAdvanceLinkState = 0; return resp; } |