summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-05 20:30:02 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-05 20:30:02 -0400
commit221dd4721d40abaebdbcf0823c924062c77311f5 (patch)
treecf3d0579ef4d4189d0210774b103e7b2c242db6b /src
parentb01da1a59260b2ac54dd876e9cf35d2c1fb944e7 (diff)
link through TestBlockTransfer + bss, ewram
Diffstat (limited to 'src')
-rw-r--r--src/ereader_helpers.c14
-rw-r--r--src/intro.c2
-rw-r--r--src/link.c164
-rw-r--r--src/mevent.c2
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;
}