diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_controllers.c | 2 | ||||
-rw-r--r-- | src/link.c | 584 | ||||
-rw-r--r-- | src/main.c | 18 |
3 files changed, 320 insertions, 284 deletions
diff --git a/src/battle_controllers.c b/src/battle_controllers.c index d741a8a98..ce96fff6a 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -62,7 +62,7 @@ void HandleLinkBattleSetup(void) if (gSerialIsRFU) sub_800B488(); if (!gReceivedRemoteLinkPlayers) - sub_8009734(); + OpenLink(); CreateTask(task00_08081A90, 0); CreateTasksForSendRecvLinkBuffers(); } diff --git a/src/link.c b/src/link.c index bba217b4d..07598bc1f 100644 --- a/src/link.c +++ b/src/link.c @@ -40,16 +40,16 @@ struct LinkTestBGInfo // Static RAM declarations -IWRAM_DATA struct BlockTransfer gUnknown_03000D10; +IWRAM_DATA struct BlockTransfer sBlockSend; IWRAM_DATA u32 link_c_unused_03000d1c; -IWRAM_DATA struct BlockTransfer gUnknown_03000D20[MAX_LINK_PLAYERS]; -IWRAM_DATA u32 gUnknown_03000D50; +IWRAM_DATA struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; +IWRAM_DATA u32 sBlockSendDelayCounter; IWRAM_DATA u32 gUnknown_03000D54; IWRAM_DATA u8 gUnknown_03000D58; -IWRAM_DATA u32 gUnknown_03000D5C; +IWRAM_DATA u32 sPlayerDataExchangeStatus; IWRAM_DATA u32 gUnknown_03000D60; -IWRAM_DATA u8 gUnknown_03000D64; -ALIGNED() IWRAM_DATA u8 gUnknown_03000D68[MAX_LINK_PLAYERS]; +IWRAM_DATA u8 sLinkTestLastBlockSendPos; +ALIGNED() IWRAM_DATA u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; IWRAM_DATA u8 gUnknown_03000D6C; IWRAM_DATA bool8 gUnknown_03000D6D; IWRAM_DATA u16 gUnknown_03000D6E; @@ -68,68 +68,68 @@ IWRAM_DATA bool32 gUnknown_03000DB0; u16 gUnknown_03003020[6]; u32 gUnknown_0300302C; -struct LinkPlayerBlock gUnknown_03003030; -bool8 gUnknown_0300306C; +struct LinkPlayerBlock gLocalLinkPlayerBlock; +bool8 gLinkErrorOccurred; u32 gUnknown_03003070; bool8 gUnknown_03003078[MAX_LINK_PLAYERS]; u8 gUnknown_0300307C[MAX_LINK_PLAYERS]; -u16 gUnknown_03003084; -u16 gUnknown_03003090[MAX_LINK_PLAYERS][8]; -u32 gUnknown_030030E0; +u16 gLinkHeldKeys; +u16 gRecvCmds[MAX_LINK_PLAYERS][8]; +u32 gLinkStatus; u8 gUnknown_030030E4; bool8 gUnknown_030030E8; u8 gUnknown_030030EC[MAX_LINK_PLAYERS]; u8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; -u8 gUnknown_030030F8; +u8 gSuppressLinkErrorMessage; bool8 gSerialIsRFU; bool8 gUnknown_03003100; -u16 gUnknown_03003110[8]; +u16 gSendCmd[8]; u8 gUnknown_03003120; bool8 gReceivedRemoteLinkPlayers; -struct LinkTestBGInfo gUnknown_03003130; -void (*gUnknown_03003140)(void); -bool8 gUnknown_03003144; -u16 gUnknown_03003148[MAX_LINK_PLAYERS]; -u8 gUnknown_03003150; +struct LinkTestBGInfo gLinkTestBGInfo; +void (*gLinkCallback)(void); +bool8 gShouldAdvanceLinkState; +u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; +u8 gBlockRequestType; u8 gUnknown_03003160; +struct Link gLink; +u8 gUnknown_03004130; -EWRAM_DATA u8 gUnknown_020223BC = 0; +EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; EWRAM_DATA u32 gUnknown_020223C0 = 0; EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {}; -EWRAM_DATA u8 gUnknown_020228C4[BLOCK_BUFFER_SIZE] = {}; -EWRAM_DATA bool8 gUnknown_020229C4 = FALSE; -EWRAM_DATA u16 gUnknown_020229C6 = 0; -EWRAM_DATA u16 gUnknown_020229C8 = 0; -EWRAM_DATA struct LinkPlayer gUnknown_020229CC = {}; +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 gUnknown_02022A74[MAX_RFU_PLAYERS] = {}; // Static ROM declarations -void sub_8009638(void); +void InitLocalLinkPlayer(void); void sub_80096BC(void); -static void c2_08009A8C(void); -static void sub_8009AA0(u8 unused); +static void CB2_LinkTest(void); +static void ProcessRecvCmds(u8 unused); static void sub_8009F70(void); -static void sub_800A2E0(void); -bool32 sub_800A2F4(const void *src, size_t size); -static void sub_800A364(void); -static void sub_800A388(void); -static void sub_800A3EC(void); -void task00_link_test(u8 taskId); -void sub_800A588(u8 who); -u16 sub_800A648(const u16 *src, u16 size); -void sub_800A6E8(u32 pos, u8 a0, u8 a1, u8 a2); -void sub_800A824(void); -void c2_800ACD4(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 SetBlockReceivedFlag(u8 who); +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 task00_link_test(u8 taskId); void sub_800AEB4(void); -void sub_800B330(bool8 flag); +u8 sub_800B2F8(void); void sub_800B4A4(void); -void sub_800B524(struct LinkPlayer *linkPlayer); -void sub_800B53C(void); -void sub_800B594(void); +void DisableSerial(void); +void EnableSerial(void); // .rodata @@ -141,13 +141,13 @@ const u16 gLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits const u8 unkstring_82ed160[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}"); const u16 g2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp"); const struct BlockRequest gUnknown_082ED1A8[] = { - {gUnknown_020228C4, 200}, - {gUnknown_020228C4, 200}, - {gUnknown_020228C4, 100}, - {gUnknown_020228C4, 220}, - {gUnknown_020228C4, 40} + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 100}, + {gBlockSendBuffer, 220}, + {gBlockSendBuffer, 40} }; -const u8 gUnknown_082ED1D0[] = { +const u8 gBGControlRegs[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, @@ -192,50 +192,50 @@ bool8 sub_80093CC(void) return TRUE; } sub_800B4A4(); - sub_80097E8(); + CloseLink(); RestoreSerialTimer3IntrHandlers(); return FALSE; } -void sub_8009404(u8 taskId) +void Task_DestroySelf(u8 taskId) { DestroyTask(taskId); } -void sub_8009414(u8 a0, u8 a1, u8 a2, u8 a3, u16 a4) +static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 a4) { - LoadPalette(gLinkTestDigitsPal, a0 * 16, 0x20); - DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(a3) + (16 * a4), sizeof gLinkTestDigitsGfx); - gUnknown_03003130.screenBaseBlock = a2; - gUnknown_03003130.paletteNum = a0; - gUnknown_03003130.dummy_8 = a4; - switch (a1) + LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20); + DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof gLinkTestDigitsGfx); + gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; + gLinkTestBGInfo.paletteNum = paletteNum; + gLinkTestBGInfo.dummy_8 = a4; + switch (bgNum) { case 1: - SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(a2) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(a3)); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock)); break; case 2: - SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(a2) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(a3)); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock)); break; case 3: - SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(a2) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(a3)); + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock)); break; } - SetGpuReg(REG_OFFSET_BG0HOFS + a1 * 4, 0); - SetGpuReg(REG_OFFSET_BG0VOFS + a1 * 4, 0); + SetGpuReg(REG_OFFSET_BG0HOFS + bgNum * 4, 0); + SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0); } -void sub_80094EC(u8 a0, u8 a1, u8 a2, u8 a3) +void sub_80094EC(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) { - LoadPalette(gLinkTestDigitsPal, a0 * 16, 0x20); - DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(a3), sizeof gLinkTestDigitsGfx); - gUnknown_03003130.screenBaseBlock = a2; - gUnknown_03003130.paletteNum = a0; - gUnknown_03003130.dummy_8 = 0; - SetGpuReg(gUnknown_082ED1D0[a1], BGCNT_SCREENBASE(a2) | BGCNT_CHARBASE(a3)); + LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20); + DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof gLinkTestDigitsGfx); + gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; + gLinkTestBGInfo.paletteNum = paletteNum; + gLinkTestBGInfo.dummy_8 = 0; + SetGpuReg(gBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock)); } -void sub_8009570(void) +void LinkTestScreen(void) { int i; @@ -243,45 +243,45 @@ void sub_8009570(void) FreeAllSpritePalettes(); ResetTasks(); SetVBlankCallback(sub_80096BC); - sub_800A2E0(); - gUnknown_020229C6 = 0x1111; - sub_8009734(); + ResetBlockSend(); + gLinkType = 0x1111; + OpenLink(); SeedRng(gMain.vblankCounter2); for (i = 0; i < MAX_LINK_PLAYERS; i ++) { gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256; } - sub_8009414(0, 2, 4, 0, 0); + InitLinkTestBG(0, 2, 4, 0, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - CreateTask(sub_8009404, 0); + CreateTask(Task_DestroySelf, 0); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); gUnknown_03000D60 = 0; - sub_8009638(); + InitLocalLinkPlayer(); CreateTask(task00_link_test, 0); - SetMainCallback2(c2_08009A8C); + SetMainCallback2(CB2_LinkTest); } void sub_8009628(u8 a0) { - gUnknown_020229CC.lp_field_18 = a0; + gLocalLinkPlayer.lp_field_18 = a0; } -void sub_8009638(void) +void InitLocalLinkPlayer(void) { - gUnknown_020229CC.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); - StringCopy(gUnknown_020229CC.name, gSaveBlock2Ptr->playerName); - gUnknown_020229CC.gender = gSaveBlock2Ptr->playerGender; - gUnknown_020229CC.linkType = gUnknown_020229C6; - gUnknown_020229CC.language = gGameLanguage; - gUnknown_020229CC.version = gGameVersion + 0x4000; - gUnknown_020229CC.lp_field_2 = 0x8000; - gUnknown_020229CC.name[8] = IsNationalPokedexEnabled(); + gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); + StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName); + gLocalLinkPlayer.gender = gSaveBlock2Ptr->playerGender; + gLocalLinkPlayer.linkType = gLinkType; + gLocalLinkPlayer.language = gGameLanguage; + gLocalLinkPlayer.version = gGameVersion + 0x4000; + gLocalLinkPlayer.lp_field_2 = 0x8000; + gLocalLinkPlayer.name[8] = IsNationalPokedexEnabled(); if (FlagGet(SYS_UNKNOWN_87F)) { - gUnknown_020229CC.name[8] |= 0x10; + gLocalLinkPlayer.name[8] |= 0x10; } } @@ -292,46 +292,46 @@ void sub_80096BC(void) TransferPlttBuffer(); } -void sub_80096D0(void) +void InitLink(void) { int i; for (i = 0; i < 8; i ++) { - gUnknown_03003110[i] = 0xefff; + gSendCmd[i] = 0xefff; } - gUnknown_020229C4 = TRUE; - sub_800B594(); + gLinkOpen = TRUE; + EnableSerial(); } -void task02_080097CC(u8 taskId) +void Task_TriggerHandshake(u8 taskId) { if (++ gTasks[taskId].data[0] == 5) { - gUnknown_03003144 = TRUE; + gShouldAdvanceLinkState = TRUE; DestroyTask(taskId); } } -void sub_8009734(void) +void OpenLink(void) { int i; if (!gSerialIsRFU) { - sub_800B628(); - sub_80096D0(); - gUnknown_03003140 = sub_800A824; - gUnknown_03002748 = 0; - gUnknown_0300306C = 0; - gUnknown_030030F8 = 0; + ResetSerial(); + InitLink(); + gLinkCallback = LinkCB_RequestPlayerDataExchange; + gLinkVSyncDisabled = FALSE; + gLinkErrorOccurred = FALSE; + gSuppressLinkErrorMessage = FALSE; ResetBlockReceivedFlags(); - sub_800A2E0(); + ResetBlockSend(); gUnknown_03000D54 = 0; gUnknown_030030E8 = 0; gUnknown_030030E4 = 0; gUnknown_030030F4 = 0; - CreateTask(task02_080097CC, 2); + CreateTask(Task_TriggerHandshake, 2); } else { @@ -346,33 +346,33 @@ void sub_8009734(void) } } -void sub_80097E8(void) +void CloseLink(void) { gReceivedRemoteLinkPlayers = FALSE; if (gSerialIsRFU) { sub_800EDD4(); } - gUnknown_020229C4 = FALSE; - sub_800B53C(); + gLinkOpen = FALSE; + DisableSerial(); } -static void sub_8009818(u8 nothing, u8 is, u8 used) +static void TestBlockTransfer(u8 nothing, u8 is, u8 used) { u8 i; u8 status; - if (gUnknown_03000D64 != gUnknown_03000D10.pos) + if (sLinkTestLastBlockSendPos != sBlockSend.pos) { - sub_800A6E8(gUnknown_03000D10.pos, 2, 3, 2); - gUnknown_03000D64 = gUnknown_03000D10.pos; + LinkTest_prnthex(sBlockSend.pos, 2, 3, 2); + sLinkTestLastBlockSendPos = sBlockSend.pos; } for (i = 0; i < MAX_LINK_PLAYERS; i ++) { - if (gUnknown_03000D68[i] != gUnknown_03000D20[i].pos) + if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) { - sub_800A6E8(gUnknown_03000D20[i].pos, 2, i + 4, 2); - gUnknown_03000D68[i] = gUnknown_03000D20[i].pos; + LinkTest_prnthex(sBlockRecv[i].pos, 2, i + 4, 2); + sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; } } status = GetBlockReceivedStatus(); @@ -382,27 +382,27 @@ static void sub_8009818(u8 nothing, u8 is, u8 used) { if ((status >> i) & 1) { - gUnknown_03003148[i] = sub_800A648(gBlockRecvBuffer[i], gUnknown_03000D20[i].size); + gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(gBlockRecvBuffer[i], sBlockRecv[i].size); ResetBlockReceivedFlag(i); - if (gUnknown_03003148[i] != 0x0342) + if (gLinkTestBlockChecksums[i] != 0x0342) { - gUnknown_020223BC = 0; - gUnknown_020223BD = 0; + gLinkTestDebugValuesEnabled = FALSE; + gUnknown_020223BD = FALSE; } } } } } -void sub_8009900(void) +void LinkTestProcessKeyInput(void) { if (gMain.newKeys & A_BUTTON) { - gUnknown_03003144 = TRUE; + gShouldAdvanceLinkState = TRUE; } if (gMain.heldKeys & B_BUTTON) { - sub_800A2F4(gHeap + 0x4000, 0x00002004); + InitBlockSend(gHeap + 0x4000, 0x00002004); } if (gMain.newKeys & L_BUTTON) { @@ -410,7 +410,7 @@ void sub_8009900(void) } if (gMain.newKeys & START_BUTTON) { - sub_800B330(1); + SetSuppressLinkErrorMessage(TRUE); } if (gMain.newKeys & R_BUTTON) { @@ -420,48 +420,48 @@ void sub_8009900(void) { sub_800AC34(); } - if (gUnknown_020223BC) + if (gLinkTestDebugValuesEnabled) { - sub_800A994(gMain.vblankCounter2, gUnknown_03003140 ? gUnknown_03002748 : gUnknown_03002748 | 0x10); + SetLinkDebugValues(gMain.vblankCounter2, gLinkCallback ? gLinkVSyncDisabled : gLinkVSyncDisabled | 0x10); } } -static void c2_08009A8C(void) +static void CB2_LinkTest(void) { - sub_8009900(); - sub_8009818(1, 1, 0); + LinkTestProcessKeyInput(); + TestBlockTransfer(1, 1, 0); RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } -u16 sub_80099E0(const u16 *src) +u16 LinkMain2(const u16 *heldKeys) { u8 i; - if (!gUnknown_020229C4) + if (!gLinkOpen) { return 0; } for (i = 0; i < 8; i ++) { - gUnknown_03003110[i] = 0; + gSendCmd[i] = 0; } - gUnknown_03003084 = *src; - if (gUnknown_030030E0 & LINK_STAT_CONN_ESTABLISHED) + gLinkHeldKeys = *heldKeys; + if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED) { - sub_8009AA0(SIO_MULTI_CNT->id); - if (gUnknown_03003140 != NULL) + ProcessRecvCmds(SIO_MULTI_CNT->id); + if (gLinkCallback != NULL) { - gUnknown_03003140(); + gLinkCallback(); } sub_800AEB4(); } - return gUnknown_030030E0; + return gLinkStatus; } -void sub_8009A58(u8 who) +void HandleReceiveRemoteLinkPlayer(u8 who) { int i; int count; @@ -478,33 +478,33 @@ void sub_8009A58(u8 who) } } -static void sub_8009AA0(u8 unused) +static void ProcessRecvCmds(u8 unused) { u16 i; for (i = 0; i < MAX_LINK_PLAYERS; i ++) { gUnknown_03003020[i] = 0; - if (gUnknown_03003090[i][0] == 0) + if (gRecvCmds[i][0] == 0) { continue; } - switch (gUnknown_03003090[i][0]) + switch (gRecvCmds[i][0]) { case 0x2222: { struct LinkPlayerBlock *block; - sub_8009638(); - block = &gUnknown_03003030; - block->linkPlayer = gUnknown_020229CC; + InitLocalLinkPlayer(); + block = &gLocalLinkPlayerBlock; + block->linkPlayer = gLocalLinkPlayer; memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1); memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1); - sub_800A2F4(block, sizeof(*block)); + InitBlockSend(block, sizeof(*block)); break; } case 0x4444: - gUnknown_03003020[i] = gUnknown_03003090[i][1]; + gUnknown_03003020[i] = gRecvCmds[i][1]; break; case 0x5555: gUnknown_030030E8 = 1; @@ -516,15 +516,15 @@ static void sub_8009AA0(u8 unused) { struct BlockTransfer *blockRecv; - blockRecv = &gUnknown_03000D20[i]; + blockRecv = &sBlockRecv[i]; blockRecv->pos = 0; - blockRecv->size = gUnknown_03003090[i][1]; - blockRecv->multiplayerId = gUnknown_03003090[i][2]; + blockRecv->size = gRecvCmds[i][1]; + blockRecv->multiplayerId = gRecvCmds[i][2]; break; } case 0x8888: { - if (gUnknown_03000D20[i].size > BLOCK_BUFFER_SIZE) + if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) { u16 *buffer; u16 j; @@ -532,7 +532,7 @@ static void sub_8009AA0(u8 unused) buffer = (u16 *)gDecompressionBuffer; for (j = 0; j < CMD_LENGTH - 1; j ++) { - buffer[(gUnknown_03000D20[i].pos / 2) + j] = gUnknown_03003090[i][j + 1]; + buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; } } else @@ -541,13 +541,13 @@ static void sub_8009AA0(u8 unused) for (j = 0; j < CMD_LENGTH - 1; j ++) { - gBlockRecvBuffer[i][(gUnknown_03000D20[i].pos / 2) + j] = gUnknown_03003090[i][j + 1]; + gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; } } - gUnknown_03000D20[i].pos += (CMD_LENGTH - 1) * 2; + sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2; - if (gUnknown_03000D20[i].pos >= gUnknown_03000D20[i].size) + if (sBlockRecv[i].pos >= sBlockRecv[i].size) { if (gUnknown_03003078[i] == TRUE) { @@ -567,16 +567,16 @@ static void sub_8009AA0(u8 unused) if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 || strcmp(block->magic2, gASCIIGameFreakInc) != 0) { - SetMainCallback2(c2_800ACD4); + SetMainCallback2(CB2_LinkError); } else { - sub_8009A58(i); + HandleReceiveRemoteLinkPlayer(i); } } else { - sub_800A588(i); + SetBlockReceivedFlag(i); } } } @@ -591,78 +591,78 @@ static void sub_8009AA0(u8 unused) sub_800A418(); break; case 0xCCCC: - SendBlock(0, gUnknown_082ED1A8[gUnknown_03003090[i][1]].address, gUnknown_082ED1A8[gUnknown_03003090[i][1]].size); + SendBlock(0, gUnknown_082ED1A8[gRecvCmds[i][1]].address, gUnknown_082ED1A8[gRecvCmds[i][1]].size); break; case 0xCAFE: - gUnknown_03003020[i] = gUnknown_03003090[i][1]; + gUnknown_03003020[i] = gRecvCmds[i][1]; break; } } } -void sub_8009D90(u16 command) +void BuildSendCmd(u16 command) { switch (command) { case 0x2222: - gUnknown_03003110[0] = 0x2222; - gUnknown_03003110[1] = gUnknown_020229C6; + gSendCmd[0] = 0x2222; + gSendCmd[1] = gLinkType; break; case 0x2ffe: - gUnknown_03003110[0] = 0x2ffe; + gSendCmd[0] = 0x2ffe; break; case 0x4444: - gUnknown_03003110[0] = 0x4444; - gUnknown_03003110[1] = gMain.heldKeys; + gSendCmd[0] = 0x4444; + gSendCmd[1] = gMain.heldKeys; break; case 0x5555: - gUnknown_03003110[0] = 0x5555; + gSendCmd[0] = 0x5555; break; case 0x6666: - gUnknown_03003110[0] = 0x6666; - gUnknown_03003110[1] = 0; + gSendCmd[0] = 0x6666; + gSendCmd[1] = 0; break; case 0x7777: { u8 i; - gUnknown_03003110[0] = 0x7777; - for (i = 0; i < MAX_RFU_PLAYERS; i ++) + gSendCmd[0] = 0x7777; + for (i = 0; i < 5; i ++) { - gUnknown_03003110[i + 1] = 0xEE; + gSendCmd[i + 1] = 0xEE; } break; } case 0xbbbb: - gUnknown_03003110[0] = 0xbbbb; - gUnknown_03003110[1] = gUnknown_03000D10.size; - gUnknown_03003110[2] = gUnknown_03000D10.multiplayerId + 0x80; + gSendCmd[0] = 0xbbbb; + gSendCmd[1] = sBlockSend.size; + gSendCmd[2] = sBlockSend.multiplayerId + 0x80; break; case 0xaaaa: - gUnknown_03003110[0] = 0xaaaa; + gSendCmd[0] = 0xaaaa; break; case 0xaaab: - gUnknown_03003110[0] = 0xaaab; - gUnknown_03003110[1] = gScriptItemId; + gSendCmd[0] = 0xaaab; + gSendCmd[1] = gScriptItemId; break; case 0xcccc: - gUnknown_03003110[0] = 0xcccc; - gUnknown_03003110[1] = gUnknown_03003150; + gSendCmd[0] = 0xcccc; + gSendCmd[1] = gBlockRequestType; break; case 0x5fff: - gUnknown_03003110[0] = 0x5fff; - gUnknown_03003110[1] = gUnknown_030030F4; + gSendCmd[0] = 0x5fff; + gSendCmd[1] = gUnknown_030030F4; break; case 0x5566: - gUnknown_03003110[0] = 0x5566; + gSendCmd[0] = 0x5566; break; case 0xcafe: - if (gUnknown_03005DA8 == 0 || gUnknown_030022B4) + if (gUnknown_03005DA8 == 0 || gLinkTransferringData) { break; } - gUnknown_03003110[0] = 0xcafe; - gUnknown_03003110[1] = gUnknown_03005DA8; + gSendCmd[0] = 0xcafe; + gSendCmd[1] = gUnknown_03005DA8; break; } } @@ -673,7 +673,7 @@ void sub_8009F18(void) { sub_800F804(); } - gUnknown_03003140 = sub_8009F70; + gLinkCallback = sub_8009F70; } bool32 sub_8009F3C(void) @@ -682,7 +682,7 @@ bool32 sub_8009F3C(void) { return sub_800F7E4(); } - if (gUnknown_03003140 == sub_8009F70) + if (gLinkCallback == sub_8009F70) { return TRUE; } @@ -693,11 +693,11 @@ static void sub_8009F70(void) { if (gReceivedRemoteLinkPlayers == TRUE) { - sub_8009D90(0xcafe); + BuildSendCmd(0xcafe); } } -void sub_8009F8C(void) +void ClearLinkCallback(void) { if (gSerialIsRFU) { @@ -705,11 +705,11 @@ void sub_8009F8C(void) } else { - gUnknown_03003140 = NULL; + gLinkCallback = NULL; } } -void sub_8009FAC(void) +void ClearLinkCallback_2(void) { if (gSerialIsRFU) { @@ -717,7 +717,7 @@ void sub_8009FAC(void) } else { - gUnknown_03003140 = NULL; + gLinkCallback = NULL; } } @@ -727,7 +727,7 @@ u8 GetLinkPlayerCount(void) { return sub_80104F4(); } - return EXTRACT_PLAYER_COUNT(gUnknown_030030E0); + return EXTRACT_PLAYER_COUNT(gLinkStatus); } int sub_8009FF8(u32 version1, u32 version2) @@ -781,14 +781,14 @@ bool32 sub_800A07C(void) return FALSE; } -void sub_800A0AC(void) +void OpenLinkTimed(void) { - gUnknown_03000D5C = 0; - gUnknown_020229C8 = 0; - sub_8009734(); + sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; + gLinkTimeOutCounter = 0; + OpenLink(); } -u8 sub_800A0C8(int lower, int upper) +u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) { int i; int count; @@ -803,15 +803,15 @@ u8 sub_800A0C8(int lower, int upper) cmpVal = sub_800ABAC(); if (lower > cmpVal || cmpVal > upper) { - gUnknown_03000D5C = 6; + sPlayerDataExchangeStatus = EXCHANGE_STAT_6; return 6; } else { if (GetLinkPlayerCount() == 0) { - gUnknown_0300306C = TRUE; - sub_80097E8(); + gLinkErrorOccurred = TRUE; + CloseLink(); } for (i = 0, index = 0; i < GetLinkPlayerCount(); index ++, i ++) { @@ -827,24 +827,24 @@ u8 sub_800A0C8(int lower, int upper) switch (sub_807A728()) { case 1: - gUnknown_03000D5C = 4; + sPlayerDataExchangeStatus = EXCHANGE_STAT_4; break; case 2: - gUnknown_03000D5C = 5; + sPlayerDataExchangeStatus = EXCHANGE_STAT_5; break; case 0: - gUnknown_03000D5C = 1; + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; break; } } else { - gUnknown_03000D5C = 1; + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; } } else { - gUnknown_03000D5C = 3; + sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; linkType1 = gLinkPlayers[GetMultiplayerId()].linkType; linkType2 = gLinkPlayers[GetMultiplayerId() ^ 1].linkType; if ((linkType1 == 0x2266 && linkType2 == 0x2277) || (linkType1 == 0x2277 && linkType2 == 0x2266)) @@ -854,14 +854,14 @@ u8 sub_800A0C8(int lower, int upper) } } } - else if (++ gUnknown_020229C8 > 600) + else if (++ gLinkTimeOutCounter > 600) { - gUnknown_03000D5C = 2; + sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; } - return gUnknown_03000D5C; + return sPlayerDataExchangeStatus; } -bool8 sub_800A23C(void) +bool8 IsLinkPlayerDataExchangeComplete(void) { u8 i; u8 count; @@ -878,12 +878,12 @@ bool8 sub_800A23C(void) if (count == GetLinkPlayerCount()) { retval = TRUE; - gUnknown_03000D5C = 1; + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; } else { retval = FALSE; - gUnknown_03000D5C = 3; + sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; } return retval; } @@ -893,7 +893,7 @@ u32 GetLinkPlayerTrainerId(u8 who) return gLinkPlayers[who].trainerId; } -void sub_800A2BC(void) +void ResetLinkPlayers(void) { int i; @@ -903,78 +903,78 @@ void sub_800A2BC(void) } } -static void sub_800A2E0(void) +static void ResetBlockSend(void) { - gUnknown_03000D10.active = FALSE; - gUnknown_03000D10.pos = 0; - gUnknown_03000D10.size = 0; - gUnknown_03000D10.src = NULL; + sBlockSend.active = FALSE; + sBlockSend.pos = 0; + sBlockSend.size = 0; + sBlockSend.src = NULL; } -bool32 sub_800A2F4(const void *src, size_t size) +static bool32 InitBlockSend(const void *src, size_t size) { - if (gUnknown_03000D10.active) + if (sBlockSend.active) { return FALSE; } - gUnknown_03000D10.multiplayerId = GetMultiplayerId(); - gUnknown_03000D10.active = TRUE; - gUnknown_03000D10.size = size; - gUnknown_03000D10.pos = 0; + sBlockSend.multiplayerId = GetMultiplayerId(); + sBlockSend.active = TRUE; + sBlockSend.size = size; + sBlockSend.pos = 0; if (size > 0x100) { - gUnknown_03000D10.src = src; + sBlockSend.src = src; } else { - if (src != gUnknown_020228C4) + if (src != gBlockSendBuffer) { - memcpy(gUnknown_020228C4, src, size); + memcpy(gBlockSendBuffer, src, size); } - gUnknown_03000D10.src = gUnknown_020228C4; + sBlockSend.src = gBlockSendBuffer; } - sub_8009D90(0xbbbb); - gUnknown_03003140 = sub_800A364; - gUnknown_03000D50 = 0; + BuildSendCmd(0xbbbb); + gLinkCallback = LinkCB_BlockSendBegin; + sBlockSendDelayCounter = 0; return TRUE; } -static void sub_800A364(void) +static void LinkCB_BlockSendBegin(void) { - if (++ gUnknown_03000D50 > 2) + if (++ sBlockSendDelayCounter > 2) { - gUnknown_03003140 = sub_800A388; + gLinkCallback = LinkCB_BlockSend; } } -static void sub_800A388(void) +static void LinkCB_BlockSend(void) { int i; const u8 *src; - src = gUnknown_03000D10.src; - gUnknown_03003110[0] = 0x8888; + src = sBlockSend.src; + gSendCmd[0] = 0x8888; for (i = 0; i < 7; i ++) { - gUnknown_03003110[i + 1] = (src[gUnknown_03000D10.pos + i * 2 + 1] << 8) | src[gUnknown_03000D10.pos + i * 2]; + gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2]; } - gUnknown_03000D10.pos += 14; - if (gUnknown_03000D10.size <= gUnknown_03000D10.pos) + sBlockSend.pos += 14; + if (sBlockSend.size <= sBlockSend.pos) { - gUnknown_03000D10.active = FALSE; - gUnknown_03003140 = sub_800A3EC; + sBlockSend.active = FALSE; + gLinkCallback = LinkCB_BlockSendEnd; } } -static void sub_800A3EC(void) +static void LinkCB_BlockSendEnd(void) { - gUnknown_03003140 = NULL; + gLinkCallback = NULL; } -void sub_800A3F8(void) +static void sub_800A3F8(void) { GetMultiplayerId(); - sub_8009D90(0x4444); + BuildSendCmd(0x4444); gUnknown_020223C0 ++; } @@ -987,7 +987,7 @@ void sub_800A418(void) } else { - gUnknown_03003140 = sub_800A3F8; + gLinkCallback = sub_800A3F8; } } @@ -998,7 +998,7 @@ u32 sub_800A44C(void) void sub_800A458(void) { - sub_8009D90(0xaaaa); + BuildSendCmd(0xaaaa); } u8 GetMultiplayerId(void) @@ -1024,7 +1024,7 @@ bool8 SendBlock(u8 unused, const void *src, u16 size) { return sub_800FE84(src, size); } - return sub_800A2F4(src, size); + return InitBlockSend(src, size); } bool8 sub_800A4D8(u8 a0) @@ -1033,10 +1033,10 @@ bool8 sub_800A4D8(u8 a0) { return sub_8010100(a0); } - if (gUnknown_03003140 == NULL) + if (gLinkCallback == NULL) { - gUnknown_03003150 = a0; - sub_8009D90(0xcccc); + gBlockRequestType = a0; + BuildSendCmd(0xcccc); return TRUE; } return FALSE; @@ -1048,7 +1048,7 @@ bool8 sub_800A520(void) { return sub_8010500(); } - return gUnknown_03003140 == NULL; + return gLinkCallback == NULL; } u8 GetBlockReceivedStatus(void) @@ -1060,7 +1060,7 @@ u8 GetBlockReceivedStatus(void) return (gUnknown_0300307C[3] << 3) | (gUnknown_0300307C[2] << 2) | (gUnknown_0300307C[1] << 1) | (gUnknown_0300307C[0] << 0); } -void sub_800A588(u8 who) +static void SetBlockReceivedFlag(u8 who) { if (gSerialIsRFU == TRUE) { @@ -1106,13 +1106,13 @@ void ResetBlockReceivedFlag(u8 who) void sub_800A620(void) { - if ((gUnknown_030030E0 & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gUnknown_030030E0) > 1) + if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) { - gUnknown_03003144 = TRUE; + gShouldAdvanceLinkState = TRUE; } } -u16 sub_800A648(const u16 *data, u16 size) +static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size) { u16 chksum; u16 i; @@ -1120,45 +1120,45 @@ u16 sub_800A648(const u16 *data, u16 size) chksum = 0; for (i = 0; i < size / 2; i ++) { - chksum += data[i]; + chksum += src[i]; } return chksum; } -void sub_800A678(char a0, u8 a1, u8 a2) +static void LinkTest_prnthexchar(char a0, u8 a1, u8 a2) { u16 *vAddr; - vAddr = (u16 *)BG_SCREEN_ADDR(gUnknown_03003130.screenBaseBlock); - vAddr[a2 * 32 + a1] = (gUnknown_03003130.paletteNum << 12) | (a0 + 1 + gUnknown_03003130.dummy_8); + vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); + vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + 1 + gLinkTestBGInfo.dummy_8); } -void sub_800A6B0(char a0, u8 a1, u8 a2) +static void LinkTest_prntchar(char a0, u8 a1, u8 a2) { u16 *vAddr; - vAddr = (u16 *)BG_SCREEN_ADDR(gUnknown_03003130.screenBaseBlock); - vAddr[a2 * 32 + a1] = (gUnknown_03003130.paletteNum << 12) | (a0 + gUnknown_03003130.dummy_8); + vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); + vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + gLinkTestBGInfo.dummy_8); } -void sub_800A6E8(u32 a0, u8 a1, u8 a2, u8 a3) +static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2) { char sp[32 / 2]; int i; - for (i = 0; i < a3; i ++) + for (i = 0; i < a2; i ++) { - sp[i] = a0 & 0xf; - a0 >>= 4; + sp[i] = pos & 0xf; + pos >>= 4; } - for (i = a3 - 1; i >= 0; i --) + for (i = a2 - 1; i >= 0; i --) { - sub_800A678(sp[i], a1, a2); - a1 ++; + LinkTest_prnthexchar(sp[i], a0, a1); + a0 ++; } } -void sub_800A73C(int a0, u8 a1, u8 a2, u8 a3) +static void LinkTest_prntint(int a0, u8 a1, u8 a2, u8 a3) { char sp[32 / 2]; int sp10; @@ -1177,16 +1177,16 @@ void sub_800A73C(int a0, u8 a1, u8 a2, u8 a3) } for (i = a3 - 1; i >= 0; i --) { - sub_800A678(sp[i], a1, a2); + LinkTest_prnthexchar(sp[i], a1, a2); a1 ++; } if (sp10 != -1) { - sub_800A678(*"\n", sp10, a2); + LinkTest_prnthexchar(*"\n", sp10, a2); } } -void sub_800A7DC(const char *a0, u8 a1, u8 a2) +static void LinkTest_prntstr(const char *a0, u8 a1, u8 a2) { int r6; int i; @@ -1203,8 +1203,44 @@ void sub_800A7DC(const char *a0, u8 a1, u8 a2) } else { - sub_800A6B0(a0[i], a1 + r6, a2 + r5); + LinkTest_prntchar(a0[i], a1 + r6, a2 + r5); r6 ++; } } } + +static void LinkCB_RequestPlayerDataExchange(void) +{ + if (gLinkStatus & LINK_STAT_MASTER) + { + BuildSendCmd(0x2222); + } + gLinkCallback = NULL; +} + +static void task00_link_test(u8 taskId) +{ + char sp[32]; + int i; + + strcpy(sp, gASCIITestPrint); + LinkTest_prntstr(sp, 5, 2); + LinkTest_prnthex(gShouldAdvanceLinkState, 2, 1, 2); + LinkTest_prnthex(gLinkStatus, 15, 1, 8); + LinkTest_prnthex(gLink.state, 2, 10, 2); + LinkTest_prnthex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); + LinkTest_prnthex(GetMultiplayerId(), 15, 12, 2); + LinkTest_prnthex(gUnknown_03003160, 25, 1, 2); + LinkTest_prnthex(gUnknown_03004130, 25, 2, 2); + LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2); + LinkTest_prnthex(gUnknown_0300302C, 2, 12, 8); + LinkTest_prnthex(gUnknown_03003070, 2, 13, 8); + LinkTest_prnthex(sub_800B2E8(), 25, 5, 1); + LinkTest_prnthex(sub_800B2F8(), 25, 6, 1); + LinkTest_prnthex(sub_800B320(), 25, 7, 1); + LinkTest_prnthex(sub_800B33C(), 25, 8, 1); + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); + } +} diff --git a/src/main.c b/src/main.c index 61f6f60a4..a67bed035 100644 --- a/src/main.c +++ b/src/main.c @@ -80,12 +80,12 @@ const IntrFunc gIntrTableTemplate[] = static u16 gUnknown_03000000; u16 gKeyRepeatStartDelay; -bool8 gUnknown_030022B4; +bool8 gLinkTransferringData; struct Main gMain; u16 gKeyRepeatContinueDelay; bool8 gSoftResetDisabled; IntrFunc gIntrTable[INTR_COUNT]; -u8 gUnknown_03002748; +u8 gLinkVSyncDisabled; u32 IntrMain_Buffer[0x200]; u8 gPcmDmaCounter; @@ -129,7 +129,7 @@ void AgbMain() if (gFlashMemoryPresent != TRUE) SetMainCallback2(NULL); - gUnknown_030022B4 = FALSE; + gLinkTransferringData = FALSE; gUnknown_03000000 = 0xFC0; for (;;) @@ -147,22 +147,22 @@ void AgbMain() if (sub_8087634() == 1) { - gUnknown_030022B4 = TRUE; + gLinkTransferringData = TRUE; UpdateLinkAndCallCallbacks(); - gUnknown_030022B4 = FALSE; + gLinkTransferringData = FALSE; } else { - gUnknown_030022B4 = FALSE; + gLinkTransferringData = FALSE; UpdateLinkAndCallCallbacks(); if (sub_80875C8() == 1) { gMain.newKeys = 0; ClearSpriteCopyRequests(); - gUnknown_030022B4 = TRUE; + gLinkTransferringData = TRUE; UpdateLinkAndCallCallbacks(); - gUnknown_030022B4 = FALSE; + gLinkTransferringData = FALSE; } } @@ -338,7 +338,7 @@ static void VBlankIntr(void) { if (gSerialIsRFU != FALSE) LinkVSync(); - else if (gUnknown_03002748 == FALSE) + else if (gLinkVSyncDisabled == FALSE) sub_800B9B8(); gMain.vblankCounter1++; |