link through TestBlockTransfer + bss, ewram

This commit is contained in:
PikalaxALT
2019-10-05 20:30:02 -04:00
parent b01da1a592
commit 221dd4721d
10 changed files with 429 additions and 632 deletions
+162 -2
View File
@@ -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;
}
}
}
}
}