From fce326fbd47c48393b557487dd5dffa6a75f7022 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 7 Nov 2017 20:25:24 -0500 Subject: through sub_8009414 --- src/link.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 5 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index ae2cd1992..0b7002124 100644 --- a/src/link.c +++ b/src/link.c @@ -1,6 +1,11 @@ // Includes #include "global.h" +#include "librfu.h" +#include "gpu_regs.h" +#include "palette.h" +#include "task.h" +#include "link.h" // Static type declarations @@ -31,17 +36,17 @@ IWRAM_DATA u32 gUnknown_03000D54; IWRAM_DATA u8 gUnknown_03000D58; IWRAM_DATA u32 gUnknown_03000D5C; IWRAM_DATA u32 gUnknown_03000D60; -IWRAM_DATA u8 gUnknown_03000D64[4]; // not really, but won't match otherwise -IWRAM_DATA u8 gUnknown_03000D68[4]; +IWRAM_DATA u8 gUnknown_03000D64; +ALIGNED() IWRAM_DATA u8 gUnknown_03000D68[4]; IWRAM_DATA u8 gUnknown_03000D6C; IWRAM_DATA bool8 gUnknown_03000D6D; IWRAM_DATA u16 gUnknown_03000D6E; IWRAM_DATA u16 gUnknown_03000D70; IWRAM_DATA u8 gUnknown_03000D72; IWRAM_DATA u8 gUnknown_03000D73; -IWRAM_DATA u8 gUnknown_03000D74[4]; // not really, but won't match otherwise -IWRAM_DATA u8 gUnknown_03000D78[8]; // not really, but won't match otherwise -IWRAM_DATA u8 gUnknown_03000D80[16]; +IWRAM_DATA u8 gUnknown_03000D74; +ALIGNED() IWRAM_DATA u8 gUnknown_03000D78; +ALIGNED(8) IWRAM_DATA u8 gUnknown_03000D80[16]; IWRAM_DATA u16 gUnknown_03000D90[8]; IWRAM_DATA u32 gUnknown_03000DA0; IWRAM_DATA u32 gUnknown_03000DA4; @@ -51,6 +56,60 @@ IWRAM_DATA bool32 gUnknown_03000DB0; // Static ROM declarations +void sub_800E700(void); +u32 sub_800BEC0(void); +void sub_800B4A4(void); + // .rodata +ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); +const u8 gWirelessLinkDisplayGfx[] = INCBIN_U8("graphics/interface/wireless_link_display.4bpp.lz"); +const u8 gWirelessLinkDisplayTilemap[] = INCBIN_U8("graphics/interface/wireless_link_display.bin.lz"); +const u16 gLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); +const u16 gLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp"); + // .text + +bool8 sub_80093CC(void) +{ + sub_800B488(); + sub_800E700(); + if (sub_800BEC0() == 0x8001) + { + rfu_REQ_stopMode(); + rfu_waitREQComplete(); + return TRUE; + } + sub_800B4A4(); + sub_80097E8(); + RestoreSerialTimer3IntrHandlers(); + return FALSE; +} + +void sub_8009404(u8 taskId) +{ + DestroyTask(taskId); +} + +void sub_8009414(u8 a0, u8 a1, u8 a2, u8 a3, u16 a4) +{ + LoadPalette(gLinkTestDigitsPal, a0 * 16, 0x20); + DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(a3) + (16 * a4), sizeof gLinkTestDigitsGfx); + gUnknown_03003130[0] = a2; + gUnknown_03003130[1] = a0; + gUnknown_03003130[2] = a4; + switch (a1) + { + case 1: + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(a2) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(a3)); + break; + case 2: + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(a2) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(a3)); + break; + case 3: + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(a2) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(a3)); + break; + } + SetGpuReg(REG_OFFSET_BG0HOFS + a1 * 4, 0); + SetGpuReg(REG_OFFSET_BG0VOFS + a1 * 4, 0); +} -- cgit v1.2.3 From 59eb766f47ca0f144447b13aabf7c4b9135fc0f3 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 7 Nov 2017 21:45:44 -0500 Subject: sub_80094EC --- src/link.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 0b7002124..7955f4427 100644 --- a/src/link.c +++ b/src/link.c @@ -67,6 +67,24 @@ const u8 gWirelessLinkDisplayGfx[] = INCBIN_U8("graphics/interface/wireless_link const u8 gWirelessLinkDisplayTilemap[] = INCBIN_U8("graphics/interface/wireless_link_display.bin.lz"); const u16 gLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); const u16 gLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp"); +const u8 unkstring_82ed160[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}"); +const u16 g2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp"); +const struct { + void *data; + u16 size; +} gUnknown_082ED1A8[] = { + {gUnknown_020228C4, 200}, + {gUnknown_020228C4, 200}, + {gUnknown_020228C4, 100}, + {gUnknown_020228C4, 220}, + {gUnknown_020228C4, 40} +}; +const u8 gUnknown_082ED1D0[] = { + REG_OFFSET_BG0CNT, + REG_OFFSET_BG1CNT, + REG_OFFSET_BG2CNT, + REG_OFFSET_BG3CNT +}; // .text @@ -113,3 +131,13 @@ void sub_8009414(u8 a0, u8 a1, u8 a2, u8 a3, u16 a4) SetGpuReg(REG_OFFSET_BG0HOFS + a1 * 4, 0); SetGpuReg(REG_OFFSET_BG0VOFS + a1 * 4, 0); } + +void sub_80094EC(u8 a0, u8 a1, u8 a2, u8 a3) +{ + LoadPalette(gLinkTestDigitsPal, a0 * 16, 0x20); + DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(a3), sizeof gLinkTestDigitsGfx); + gUnknown_03003130[0] = a2; + gUnknown_03003130[1] = a0; + gUnknown_03003130[2] = 0; + SetGpuReg(gUnknown_082ED1D0[a1], BGCNT_SCREENBASE(a2) | BGCNT_CHARBASE(a3)); +} -- cgit v1.2.3 From 0709dc7e4c0201b80a547fb1152ec4a0219dc31a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 7 Nov 2017 22:14:40 -0500 Subject: sub_8009570 --- src/link.c | 53 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 8 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 7955f4427..3c1bd13b1 100644 --- a/src/link.c +++ b/src/link.c @@ -2,6 +2,7 @@ // Includes #include "global.h" #include "librfu.h" +#include "rng.h" #include "gpu_regs.h" #include "palette.h" #include "task.h" @@ -54,11 +55,18 @@ IWRAM_DATA void *gUnknown_03000DA8; IWRAM_DATA void *gUnknown_03000DAC; IWRAM_DATA bool32 gUnknown_03000DB0; +u16 gUnknown_020229C6 = 0; + // Static ROM declarations -void sub_800E700(void); -u32 sub_800BEC0(void); +void sub_8009638(void); +void sub_80096BC(void); +void c2_08009A8C(void); +void sub_800A2E0(void); +void task00_link_test(u8 taskId); void sub_800B4A4(void); +u32 sub_800BEC0(void); +void sub_800E700(void); // .rodata @@ -113,9 +121,9 @@ void sub_8009414(u8 a0, u8 a1, u8 a2, u8 a3, u16 a4) { LoadPalette(gLinkTestDigitsPal, a0 * 16, 0x20); DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(a3) + (16 * a4), sizeof gLinkTestDigitsGfx); - gUnknown_03003130[0] = a2; - gUnknown_03003130[1] = a0; - gUnknown_03003130[2] = a4; + gUnknown_03003130.screenBaseBlock = a2; + gUnknown_03003130.paletteNum = a0; + gUnknown_03003130.dummy_8 = a4; switch (a1) { case 1: @@ -136,8 +144,37 @@ void sub_80094EC(u8 a0, u8 a1, u8 a2, u8 a3) { LoadPalette(gLinkTestDigitsPal, a0 * 16, 0x20); DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(a3), sizeof gLinkTestDigitsGfx); - gUnknown_03003130[0] = a2; - gUnknown_03003130[1] = a0; - gUnknown_03003130[2] = 0; + gUnknown_03003130.screenBaseBlock = a2; + gUnknown_03003130.paletteNum = a0; + gUnknown_03003130.dummy_8 = 0; SetGpuReg(gUnknown_082ED1D0[a1], BGCNT_SCREENBASE(a2) | BGCNT_CHARBASE(a3)); } + +void sub_8009570(void) +{ + int i; + + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(sub_80096BC); + sub_800A2E0(); + gUnknown_020229C6 = 0x1111; + sub_8009734(); + SeedRng(gMain.vblankCounter2); + for (i = 0; i < 4; i ++) + { + gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256; + } + sub_8009414(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); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + gUnknown_03000D60 = 0; + sub_8009638(); + CreateTask(task00_link_test, 0); + SetMainCallback2(c2_08009A8C); +} -- cgit v1.2.3 From f90106ae6ca4132c1ffdddee6580e46af3352f76 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 7 Nov 2017 22:26:00 -0500 Subject: sub_8009638 --- src/link.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 3c1bd13b1..f95c1acb7 100644 --- a/src/link.c +++ b/src/link.c @@ -3,6 +3,8 @@ #include "global.h" #include "librfu.h" #include "rng.h" +#include "string_util.h" +#include "event_data.h" #include "gpu_regs.h" #include "palette.h" #include "task.h" @@ -56,6 +58,7 @@ IWRAM_DATA void *gUnknown_03000DAC; IWRAM_DATA bool32 gUnknown_03000DB0; u16 gUnknown_020229C6 = 0; +struct LinkPlayer gUnknown_020229CC = {}; // Static ROM declarations @@ -178,3 +181,24 @@ void sub_8009570(void) CreateTask(task00_link_test, 0); SetMainCallback2(c2_08009A8C); } + +void sub_8009628(u8 a0) +{ + gUnknown_020229CC.lp_field_18 = a0; +} + +void sub_8009638(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(); + if (FlagGet(SYS_UNKNOWN_87F)) + { + gUnknown_020229CC.name[8] |= 0x10; + } +} -- cgit v1.2.3 From 9029fb27c176cd962bb30a12a77e7138ed21f28b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 7 Nov 2017 22:52:10 -0500 Subject: through sub_8009734 --- src/link.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index f95c1acb7..bcad97f53 100644 --- a/src/link.c +++ b/src/link.c @@ -57,6 +57,7 @@ IWRAM_DATA void *gUnknown_03000DA8; IWRAM_DATA void *gUnknown_03000DAC; IWRAM_DATA bool32 gUnknown_03000DB0; +bool8 gUnknown_020229C4 = 0; u16 gUnknown_020229C6 = 0; struct LinkPlayer gUnknown_020229CC = {}; @@ -67,6 +68,8 @@ void sub_80096BC(void); void c2_08009A8C(void); void sub_800A2E0(void); void task00_link_test(u8 taskId); +void sub_800A824(void); +void sub_800B594(void); void sub_800B4A4(void); u32 sub_800BEC0(void); void sub_800E700(void); @@ -202,3 +205,64 @@ void sub_8009638(void) gUnknown_020229CC.name[8] |= 0x10; } } + +void sub_80096BC(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80096D0(void) +{ + int i; + + for (i = 0; i < 8; i ++) + { + gUnknown_03003110[i] = 0xefff; + } + gUnknown_020229C4 = TRUE; + sub_800B594(); +} + +void task02_080097CC(u8 taskId) +{ + if (++ gTasks[taskId].data[0] == 5) + { + gUnknown_03003144 = TRUE; + DestroyTask(taskId); + } +} + +void sub_8009734(void) +{ + int i; + + if (!gLinkVSyncDisabled) + { + sub_800B628(); + sub_80096D0(); + gUnknown_03003140 = sub_800A824; + gUnknown_03002748 = 0; + gUnknown_0300306C = 0; + gUnknown_030030F8 = 0; + ResetBlockReceivedFlags(); + sub_800A2E0(); + gUnknown_03000D54 = 0; + gUnknown_030030E8 = 0; + gUnknown_030030E4 = 0; + gUnknown_030030F4 = 0; + CreateTask(task02_080097CC, 2); + } + else + { + sub_800E700(); + } + gReceivedRemoteLinkPlayers = 0; + for (i = 0; i < 4; i ++) + { + gUnknown_03003078[i] = 1; + gUnknown_030030F0[i] = 0; + gUnknown_030030EC[i] = 0; + } +} -- cgit v1.2.3 From e68dbd62765b2784af8ec0f788d049ca5bafad25 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 8 Nov 2017 19:29:37 -0500 Subject: through sub_8009818 --- src/link.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index bcad97f53..823a9a96b 100644 --- a/src/link.c +++ b/src/link.c @@ -57,7 +57,37 @@ IWRAM_DATA void *gUnknown_03000DA8; IWRAM_DATA void *gUnknown_03000DAC; IWRAM_DATA bool32 gUnknown_03000DB0; -bool8 gUnknown_020229C4 = 0; +u16 gUnknown_03003020[6]; +u32 gUnknown_0300302C; +struct LinkPlayerBlock gUnknown_03003030; +bool8 gUnknown_0300306C; +u32 gUnknown_03003070; +bool8 gUnknown_03003078[4]; +u8 gUnknown_0300307C[4]; +u16 gUnknown_03003084; +u16 gUnknown_03003090[4][8]; +u32 gUnknown_030030E0; +u8 gUnknown_030030E4; +bool8 gUnknown_030030E8; +u8 gUnknown_030030EC[4]; +u8 gUnknown_030030F0[4]; +u16 gUnknown_030030F4; +u8 gUnknown_030030F8; +bool8 gLinkVSyncDisabled; +bool8 gUnknown_03003100; +u16 gUnknown_03003110[8]; +u8 gUnknown_03003120; +bool8 gReceivedRemoteLinkPlayers; +struct LinkTestBGInfo gUnknown_03003130; +void (*gUnknown_03003140)(void); +bool8 gUnknown_03003144; +u16 gUnknown_03003148[4]; +u8 gUnknown_03003150; +u8 gUnknown_03003160; + +u8 gUnknown_020223BC = 0; +u8 gUnknown_020223BD = 0; +bool8 gUnknown_020229C4 = FALSE; u16 gUnknown_020229C6 = 0; struct LinkPlayer gUnknown_020229CC = {}; @@ -68,11 +98,15 @@ void sub_80096BC(void); void c2_08009A8C(void); void sub_800A2E0(void); void task00_link_test(u8 taskId); +u16 sub_800A648(u16 *src, u16 size); +void sub_800A6E8(u32 pos, u8 a0, u8 a1, u8 a2); void sub_800A824(void); void sub_800B594(void); void sub_800B4A4(void); +void sub_800B53C(void); u32 sub_800BEC0(void); void sub_800E700(void); +void sub_800EDD4(void); // .rodata @@ -266,3 +300,51 @@ void sub_8009734(void) gUnknown_030030EC[i] = 0; } } + +void sub_80097E8(void) +{ + gReceivedRemoteLinkPlayers = FALSE; + if (gLinkVSyncDisabled) + { + sub_800EDD4(); + } + gUnknown_020229C4 = FALSE; + sub_800B53C(); +} + +void sub_8009818(void) +{ + u8 i; + u8 status; + + if (gUnknown_03000D64 != gUnknown_03000D10.pos) + { + sub_800A6E8(gUnknown_03000D10.pos, 2, 3, 2); + gUnknown_03000D64 = gUnknown_03000D10.pos; + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_03000D68[i] != gUnknown_03000D20[i].pos) + { + sub_800A6E8(gUnknown_03000D20[i].pos, 2, i + 4, 2); + gUnknown_03000D68[i] = gUnknown_03000D20[i].pos; + } + } + status = GetBlockReceivedStatus(); + if (status == 0xF) // 0b1111 + { + for (i = 0; i < 4; i ++) + { + if ((status >> i) & 1) + { + gUnknown_03003148[i] = sub_800A648(gBlockRecvBuffer[i], gUnknown_03000D20[i].size); + ResetBlockReceivedFlag(i); + if (gUnknown_03003148[i] != 0x0342) + { + gUnknown_020223BC = 0; + gUnknown_020223BD = 0; + } + } + } + } +} -- cgit v1.2.3 From 9a9f6012441a4ed0f7ba1566a3f693801957ef12 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 8 Nov 2017 19:58:59 -0500 Subject: sub_8009900 --- src/link.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 823a9a96b..327a170d0 100644 --- a/src/link.c +++ b/src/link.c @@ -1,6 +1,8 @@ // Includes #include "global.h" +#include "malloc.h" +#include "save.h" #include "librfu.h" #include "rng.h" #include "string_util.h" @@ -97,13 +99,15 @@ void sub_8009638(void); void sub_80096BC(void); void c2_08009A8C(void); void sub_800A2E0(void); +void sub_800A2F4(void *heapptr, size_t src); void task00_link_test(u8 taskId); u16 sub_800A648(u16 *src, u16 size); void sub_800A6E8(u32 pos, u8 a0, u8 a1, u8 a2); void sub_800A824(void); -void sub_800B594(void); +void sub_800B330(bool8 flag); void sub_800B4A4(void); void sub_800B53C(void); +void sub_800B594(void); u32 sub_800BEC0(void); void sub_800E700(void); void sub_800EDD4(void); @@ -348,3 +352,35 @@ void sub_8009818(void) } } } + +void sub_8009900(void) +{ + if (gMain.newKeys & A_BUTTON) + { + gUnknown_03003144 = TRUE; + } + if (gMain.heldKeys & B_BUTTON) + { + sub_800A2F4(gHeap + 0x4000, 0x00002004); + } + if (gMain.newKeys & L_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 16, 0, 2); + } + if (gMain.newKeys & START_BUTTON) + { + sub_800B330(1); + } + if (gMain.newKeys & R_BUTTON) + { + TrySavingData(1); + } + if (gMain.newKeys & SELECT_BUTTON) + { + sub_800AC34(); + } + if (gUnknown_020223BC) + { + sub_800A994(gMain.vblankCounter2, gUnknown_03003140 ? gUnknown_03002748 : gUnknown_03002748 | 0x10); + } +} -- cgit v1.2.3 From d51f87226f029143dfb027f5e7bc36c64c5959eb Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 8 Nov 2017 20:11:29 -0500 Subject: sub_80099E0 --- src/link.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 327a170d0..c07a6d701 100644 --- a/src/link.c +++ b/src/link.c @@ -31,6 +31,13 @@ struct LinkTestBGInfo u32 dummy_C; }; +struct SIOCnt { + u32 cnt0_0:4; + u32 cnt0_2:2; +}; + +#define REG_SIOCNT_STRUCT (*(volatile struct SIOCnt *)REG_ADDR_SIOCNT) + // Static RAM declarations IWRAM_DATA struct BlockTransfer gUnknown_03000D10; @@ -98,12 +105,14 @@ struct LinkPlayer gUnknown_020229CC = {}; void sub_8009638(void); void sub_80096BC(void); void c2_08009A8C(void); +void sub_8009AA0(u8 unused); void sub_800A2E0(void); void sub_800A2F4(void *heapptr, size_t src); void task00_link_test(u8 taskId); u16 sub_800A648(u16 *src, u16 size); void sub_800A6E8(u32 pos, u8 a0, u8 a1, u8 a2); void sub_800A824(void); +void sub_800AEB4(void); void sub_800B330(bool8 flag); void sub_800B4A4(void); void sub_800B53C(void); @@ -316,7 +325,7 @@ void sub_80097E8(void) sub_800B53C(); } -void sub_8009818(void) +static void sub_8009818(u8 nothing, u8 is, u8 used) { u8 i; u8 status; @@ -384,3 +393,38 @@ void sub_8009900(void) sub_800A994(gMain.vblankCounter2, gUnknown_03003140 ? gUnknown_03002748 : gUnknown_03002748 | 0x10); } } + +void c2_08009A8C(void) +{ + sub_8009900(); + sub_8009818(1, 1, 0); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +u16 sub_80099E0(const u16 *src) +{ + u8 i; + + if (!gUnknown_020229C4) + { + return 0; + } + for (i = 0; i < 8; i ++) + { + gUnknown_03003110[i] = 0; + } + gUnknown_03003084 = *src; + if (gUnknown_030030E0 & 0x40) + { + sub_8009AA0(REG_SIOCNT_STRUCT.cnt0_2); + if (gUnknown_03003140 != NULL) + { + gUnknown_03003140(); + } + sub_800AEB4(); + } + return gUnknown_030030E0; +} -- cgit v1.2.3 From 6192cb2eea52a4e060bd7d8db884e9133d8b882f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 8 Nov 2017 20:48:26 -0500 Subject: sub_8009A58 --- src/link.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index c07a6d701..e99f6764f 100644 --- a/src/link.c +++ b/src/link.c @@ -428,3 +428,20 @@ u16 sub_80099E0(const u16 *src) } return gUnknown_030030E0; } + +void sub_8009A58(u8 who) +{ + int i; + int count; + + count = 0; + gUnknown_03003078[who] = FALSE; + for (i = 0; i < sub_800ABAC(); i ++) + { + count += gUnknown_03003078[i]; + } + if (count == 0 && gReceivedRemoteLinkPlayers == 0) + { + gReceivedRemoteLinkPlayers = 1; + } +} -- cgit v1.2.3 From d94f74d2617f257c0cdcc19cfb08dc76ea0ec4ad Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 9 Nov 2017 21:14:43 -0500 Subject: sub_8009AA0 --- src/link.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 146 insertions(+), 19 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index e99f6764f..4279c6efc 100644 --- a/src/link.c +++ b/src/link.c @@ -5,6 +5,7 @@ #include "save.h" #include "librfu.h" #include "rng.h" +#include "decompress.h" #include "string_util.h" #include "event_data.h" #include "gpu_regs.h" @@ -42,14 +43,14 @@ struct SIOCnt { IWRAM_DATA struct BlockTransfer gUnknown_03000D10; IWRAM_DATA u32 link_c_unused_03000d1c; -IWRAM_DATA struct BlockTransfer gUnknown_03000D20[4]; +IWRAM_DATA struct BlockTransfer gUnknown_03000D20[MAX_LINK_PLAYERS]; IWRAM_DATA u32 gUnknown_03000D50; IWRAM_DATA u32 gUnknown_03000D54; IWRAM_DATA u8 gUnknown_03000D58; IWRAM_DATA u32 gUnknown_03000D5C; IWRAM_DATA u32 gUnknown_03000D60; IWRAM_DATA u8 gUnknown_03000D64; -ALIGNED() IWRAM_DATA u8 gUnknown_03000D68[4]; +ALIGNED() IWRAM_DATA u8 gUnknown_03000D68[MAX_LINK_PLAYERS]; IWRAM_DATA u8 gUnknown_03000D6C; IWRAM_DATA bool8 gUnknown_03000D6D; IWRAM_DATA u16 gUnknown_03000D6E; @@ -71,15 +72,15 @@ u32 gUnknown_0300302C; struct LinkPlayerBlock gUnknown_03003030; bool8 gUnknown_0300306C; u32 gUnknown_03003070; -bool8 gUnknown_03003078[4]; -u8 gUnknown_0300307C[4]; +bool8 gUnknown_03003078[MAX_LINK_PLAYERS]; +u8 gUnknown_0300307C[MAX_LINK_PLAYERS]; u16 gUnknown_03003084; -u16 gUnknown_03003090[4][8]; +u16 gUnknown_03003090[MAX_LINK_PLAYERS][8]; u32 gUnknown_030030E0; u8 gUnknown_030030E4; bool8 gUnknown_030030E8; -u8 gUnknown_030030EC[4]; -u8 gUnknown_030030F0[4]; +u8 gUnknown_030030EC[MAX_LINK_PLAYERS]; +u8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; u8 gUnknown_030030F8; bool8 gLinkVSyncDisabled; @@ -90,7 +91,7 @@ bool8 gReceivedRemoteLinkPlayers; struct LinkTestBGInfo gUnknown_03003130; void (*gUnknown_03003140)(void); bool8 gUnknown_03003144; -u16 gUnknown_03003148[4]; +u16 gUnknown_03003148[MAX_LINK_PLAYERS]; u8 gUnknown_03003150; u8 gUnknown_03003160; @@ -104,17 +105,21 @@ struct LinkPlayer gUnknown_020229CC = {}; void sub_8009638(void); void sub_80096BC(void); -void c2_08009A8C(void); -void sub_8009AA0(u8 unused); +static void c2_08009A8C(void); +static void sub_8009AA0(u8 unused); void sub_800A2E0(void); void sub_800A2F4(void *heapptr, size_t src); +void sub_800A418(void); void task00_link_test(u8 taskId); +void sub_800A588(u8 who); u16 sub_800A648(u16 *src, u16 size); void sub_800A6E8(u32 pos, u8 a0, u8 a1, u8 a2); void sub_800A824(void); +void c2_800ACD4(void); void sub_800AEB4(void); void sub_800B330(bool8 flag); void sub_800B4A4(void); +void sub_800B524(struct LinkPlayer *linkPlayer); void sub_800B53C(void); void sub_800B594(void); u32 sub_800BEC0(void); @@ -130,10 +135,7 @@ const u16 gLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits const u16 gLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp"); const u8 unkstring_82ed160[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}"); const u16 g2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp"); -const struct { - void *data; - u16 size; -} gUnknown_082ED1A8[] = { +const struct BlockRequest gUnknown_082ED1A8[] = { {gUnknown_020228C4, 200}, {gUnknown_020228C4, 200}, {gUnknown_020228C4, 100}, @@ -146,6 +148,9 @@ const u8 gUnknown_082ED1D0[] = { REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT }; +const char gASCIIGameFreakInc[] = "GameFreak inc."; +const char gASCIITestPrint[] = "TEST PRINT\nP0\nP1\nP2\nP3"; + // .text @@ -215,7 +220,7 @@ void sub_8009570(void) gUnknown_020229C6 = 0x1111; sub_8009734(); SeedRng(gMain.vblankCounter2); - for (i = 0; i < 4; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i ++) { gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256; } @@ -306,7 +311,7 @@ void sub_8009734(void) sub_800E700(); } gReceivedRemoteLinkPlayers = 0; - for (i = 0; i < 4; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i ++) { gUnknown_03003078[i] = 1; gUnknown_030030F0[i] = 0; @@ -335,7 +340,7 @@ static void sub_8009818(u8 nothing, u8 is, u8 used) sub_800A6E8(gUnknown_03000D10.pos, 2, 3, 2); gUnknown_03000D64 = gUnknown_03000D10.pos; } - for (i = 0; i < 4; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i ++) { if (gUnknown_03000D68[i] != gUnknown_03000D20[i].pos) { @@ -346,7 +351,7 @@ static void sub_8009818(u8 nothing, u8 is, u8 used) status = GetBlockReceivedStatus(); if (status == 0xF) // 0b1111 { - for (i = 0; i < 4; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i ++) { if ((status >> i) & 1) { @@ -394,7 +399,7 @@ void sub_8009900(void) } } -void c2_08009A8C(void) +static void c2_08009A8C(void) { sub_8009900(); sub_8009818(1, 1, 0); @@ -445,3 +450,125 @@ void sub_8009A58(u8 who) gReceivedRemoteLinkPlayers = 1; } } + +static void sub_8009AA0(u8 unused) +{ + u16 i; + + for (i = 0; i < MAX_LINK_PLAYERS; i ++) + { + gUnknown_03003020[i] = 0; + if (gUnknown_03003090[i][0] == 0) + { + continue; + } + switch (gUnknown_03003090[i][0]) + { + case 0x2222: + { + struct LinkPlayerBlock *block; + + sub_8009638(); + block = &gUnknown_03003030; + block->linkPlayer = gUnknown_020229CC; + memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1); + memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1); + sub_800A2F4(block, sizeof(*block)); + break; + } + case 0x4444: + gUnknown_03003020[i] = gUnknown_03003090[i][1]; + break; + case 0x5555: + gUnknown_030030E8 = 1; + break; + case 0x5566: + gUnknown_030030E8 = 1; + break; + case 0xBBBB: + { + struct BlockTransfer *blockRecv; + + blockRecv = &gUnknown_03000D20[i]; + blockRecv->pos = 0; + blockRecv->size = gUnknown_03003090[i][1]; + blockRecv->multiplayerId = gUnknown_03003090[i][2]; + break; + } + case 0x8888: + { + if (gUnknown_03000D20[i].size > BLOCK_BUFFER_SIZE) + { + u16 *buffer; + u16 j; + + buffer = (u16 *)gDecompressionBuffer; + for (j = 0; j < CMD_LENGTH - 1; j ++) + { + buffer[(gUnknown_03000D20[i].pos / 2) + j] = gUnknown_03003090[i][j + 1]; + } + } + else + { + u16 j; + + for (j = 0; j < CMD_LENGTH - 1; j ++) + { + gBlockRecvBuffer[i][(gUnknown_03000D20[i].pos / 2) + j] = gUnknown_03003090[i][j + 1]; + } + } + + gUnknown_03000D20[i].pos += (CMD_LENGTH - 1) * 2; + + if (gUnknown_03000D20[i].pos >= gUnknown_03000D20[i].size) + { + if (gUnknown_03003078[i] == TRUE) + { + struct LinkPlayerBlock *block; + struct LinkPlayer *linkPlayer; + + block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i]; + linkPlayer = &gLinkPlayers[i]; + *linkPlayer = block->linkPlayer; + if ((linkPlayer->version & 0xFF) == VERSION_RUBY || (linkPlayer->version & 0xFF) == VERSION_SAPPHIRE) + { + linkPlayer->name[10] = 0; + linkPlayer->name[9] = 0; + linkPlayer->name[8] = 0; + } + sub_800B524(linkPlayer); + if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 + || strcmp(block->magic2, gASCIIGameFreakInc) != 0) + { + SetMainCallback2(c2_800ACD4); + } + else + { + sub_8009A58(i); + } + } + else + { + sub_800A588(i); + } + } + } + break; + case 0x5FFF: + gUnknown_030030F0[i] = 1; + break; + case 0x2FFE: + gUnknown_030030EC[i] = 1; + break; + case 0xAAAA: + sub_800A418(); + break; + case 0xCCCC: + SendBlock(0, gUnknown_082ED1A8[gUnknown_03003090[i][1]].address, gUnknown_082ED1A8[gUnknown_03003090[i][1]].size); + break; + case 0xCAFE: + gUnknown_03003020[i] = gUnknown_03003090[i][1]; + break; + } + } +} -- cgit v1.2.3 From 1523d5c01e1745ad2f7c627c5701ab65de375f12 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 9 Nov 2017 21:48:27 -0500 Subject: sub_8009D90 --- src/link.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 4279c6efc..c2f033e1d 100644 --- a/src/link.c +++ b/src/link.c @@ -8,6 +8,8 @@ #include "decompress.h" #include "string_util.h" #include "event_data.h" +#include "item_menu.h" +#include "overworld.h" #include "gpu_regs.h" #include "palette.h" #include "task.h" @@ -572,3 +574,70 @@ static void sub_8009AA0(u8 unused) } } } + +void sub_8009D90(u16 command) +{ + switch (command) + { + case 0x2222: + gUnknown_03003110[0] = 0x2222; + gUnknown_03003110[1] = gUnknown_020229C6; + break; + case 0x2ffe: + gUnknown_03003110[0] = 0x2ffe; + break; + case 0x4444: + gUnknown_03003110[0] = 0x4444; + gUnknown_03003110[1] = gMain.heldKeys; + break; + case 0x5555: + gUnknown_03003110[0] = 0x5555; + break; + case 0x6666: + gUnknown_03003110[0] = 0x6666; + gUnknown_03003110[1] = 0; + break; + case 0x7777: + { + u8 i; + + gUnknown_03003110[0] = 0x7777; + for (i = 0; i < 5; i ++) + { + gUnknown_03003110[i + 1] = 0xEE; + } + break; + } + case 0xbbbb: + gUnknown_03003110[0] = 0xbbbb; + gUnknown_03003110[1] = gUnknown_03000D10.size; + gUnknown_03003110[2] = gUnknown_03000D10.multiplayerId + 0x80; + break; + case 0xaaaa: + gUnknown_03003110[0] = 0xaaaa; + break; + case 0xaaab: + gUnknown_03003110[0] = 0xaaab; + gUnknown_03003110[1] = gScriptItemId; + break; + case 0xcccc: + gUnknown_03003110[0] = 0xcccc; + gUnknown_03003110[1] = gUnknown_03003150; + break; + case 0x5fff: + gUnknown_03003110[0] = 0x5fff; + gUnknown_03003110[1] = gUnknown_030030F4; + break; + case 0x5566: + gUnknown_03003110[0] = 0x5566; + break; + case 0xcafe: + if (gUnknown_03005DA8 == 0 || gUnknown_030022B4) + { + break; + } + gUnknown_03003110[0] = 0xcafe; + gUnknown_03003110[1] = gUnknown_03005DA8; + break; + } +} -- cgit v1.2.3 From c9da45b254d2400277027da3a6b2cc49d69ce2ff Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 9 Nov 2017 21:56:47 -0500 Subject: through sub_8009FAC --- src/link.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index c2f033e1d..2c8fd5397 100644 --- a/src/link.c +++ b/src/link.c @@ -109,6 +109,7 @@ void sub_8009638(void); void sub_80096BC(void); static void c2_08009A8C(void); static void sub_8009AA0(u8 unused); +void sub_8009F70(void); void sub_800A2E0(void); void sub_800A2F4(void *heapptr, size_t src); void sub_800A418(void); @@ -127,6 +128,9 @@ void sub_800B594(void); u32 sub_800BEC0(void); void sub_800E700(void); void sub_800EDD4(void); +bool32 sub_800F7E4(void); +void sub_800F804(void); +void Rfu_set_zero(void); // .rodata @@ -641,3 +645,57 @@ void sub_8009D90(u16 command) break; } } + +void sub_8009F18(void) +{ + if (gLinkVSyncDisabled) + { + sub_800F804(); + } + gUnknown_03003140 = sub_8009F70; +} + +bool32 sub_8009F3C(void) +{ + if (gLinkVSyncDisabled) + { + return sub_800F7E4(); + } + if (gUnknown_03003140 == sub_8009F70) + { + return TRUE; + } + return FALSE; +} + +void sub_8009F70(void) +{ + if (gReceivedRemoteLinkPlayers == TRUE) + { + sub_8009D90(0xcafe); + } +} + +void sub_8009F8C(void) +{ + if (gLinkVSyncDisabled) + { + Rfu_set_zero(); + } + else + { + gUnknown_03003140 = NULL; + } +} + +void sub_8009FAC(void) +{ + if (gLinkVSyncDisabled) + { + Rfu_set_zero(); + } + else + { + gUnknown_03003140 = NULL; + } +} -- cgit v1.2.3 From d76901ff6412c319a1044db36e6ab0b98f530d25 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 08:37:50 -0500 Subject: through sub_800A0AC --- src/link.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 2c8fd5397..66c7c5801 100644 --- a/src/link.c +++ b/src/link.c @@ -101,6 +101,7 @@ u8 gUnknown_020223BC = 0; u8 gUnknown_020223BD = 0; bool8 gUnknown_020229C4 = FALSE; u16 gUnknown_020229C6 = 0; +u16 gUnknown_020229C8 = 0; struct LinkPlayer gUnknown_020229CC = {}; // Static ROM declarations @@ -131,6 +132,7 @@ void sub_800EDD4(void); bool32 sub_800F7E4(void); void sub_800F804(void); void Rfu_set_zero(void); +u8 sub_80104F4(void); // .rodata @@ -699,3 +701,70 @@ void sub_8009FAC(void) gUnknown_03003140 = NULL; } } + +u8 GetLinkPlayerCount(void) +{ + if (gLinkVSyncDisabled) + { + return sub_80104F4(); + } + return EXTRACT_PLAYER_COUNT(gUnknown_030030E0); +} + +int sub_8009FF8(u32 version1, u32 version2) +{ + int i; + u8 nPlayers; + + nPlayers = GetLinkPlayerCount(); + for (i = 0; i < nPlayers; i ++) + { + if ((gLinkPlayers[i].version & 0xFF) == version1 || (gLinkPlayers[i].version & 0xFF) == version2) + { + return 1; + } + } + return -1; +} + +u32 sub_800A03C(void) +{ + return 2; +} + +bool32 sub_800A040(void) +{ + if (GetLinkPlayerCount() != 4 || sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) < 0) + { + return FALSE; + } + return TRUE; +} + +bool32 sub_800A064(void) +{ + if (sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) >= 0) + { + return TRUE; + } + return FALSE; +} + +bool32 sub_800A07C(void) +{ + int i; + + i = sub_8009FF8(VERSION_FIRE_RED, VERSION_LEAF_GREEN); + if (i >= 0 && gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + return TRUE; + } + return FALSE; +} + +void sub_800A0AC(void) +{ + gUnknown_03000D5C = 0; + gUnknown_020229C8 = 0; + sub_8009734(); +} -- cgit v1.2.3 From 27f9dd0a97cf6e0a2528ec3744a34a0732ff97fd Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 19:06:06 -0500 Subject: sub_800A0C8 --- src/link.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 66c7c5801..5d5d22cf5 100644 --- a/src/link.c +++ b/src/link.c @@ -13,6 +13,7 @@ #include "gpu_regs.h" #include "palette.h" #include "task.h" +#include "trade.h" #include "link.h" // Static type declarations @@ -768,3 +769,76 @@ void sub_800A0AC(void) gUnknown_020229C8 = 0; sub_8009734(); } + +u8 sub_800A0C8(int lower, int upper) +{ + int i; + int count; + u32 index; + u8 cmpVal; + u32 linkType1; + u32 linkType2; + + count = 0; + if (gReceivedRemoteLinkPlayers == TRUE) + { + cmpVal = sub_800ABAC(); + if (lower > cmpVal || cmpVal > upper) + { + gUnknown_03000D5C = 6; + return 6; + } + else + { + if (GetLinkPlayerCount() == 0) + { + gUnknown_0300306C = TRUE; + sub_80097E8(); + } + for (i = 0, index = 0; i < GetLinkPlayerCount(); index ++, i ++) + { + if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) + { + count ++; + } + } + if (count == GetLinkPlayerCount()) + { + if (gLinkPlayers[0].linkType == 0x1133) + { + switch (sub_807A728()) + { + case 1: + gUnknown_03000D5C = 4; + break; + case 2: + gUnknown_03000D5C = 5; + break; + case 0: + gUnknown_03000D5C = 1; + break; + } + } + else + { + gUnknown_03000D5C = 1; + } + } + else + { + gUnknown_03000D5C = 3; + linkType1 = gLinkPlayers[GetMultiplayerId()].linkType; + linkType2 = gLinkPlayers[GetMultiplayerId() ^ 1].linkType; + if ((linkType1 == 0x2266 && linkType2 == 0x2277) || (linkType1 == 0x2277 && linkType2 == 0x2266)) + { + gSpecialVar_0x8005 = 3; + } + } + } + } + else if (++ gUnknown_020229C8 > 600) + { + gUnknown_03000D5C = 2; + } + return gUnknown_03000D5C; +} -- cgit v1.2.3 From 1ac4d1849c79162719490900efdf4f6836fa9422 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 19:14:35 -0500 Subject: through sub_800A2BC --- src/link.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 5d5d22cf5..3cb485b49 100644 --- a/src/link.c +++ b/src/link.c @@ -842,3 +842,45 @@ u8 sub_800A0C8(int lower, int upper) } return gUnknown_03000D5C; } + +bool8 sub_800A23C(void) +{ + u8 i; + u8 count; + bool8 retval; + + count = 0; + for (i = 0; i < GetLinkPlayerCount(); i ++) + { + if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) + { + count ++; + } + } + if (count == GetLinkPlayerCount()) + { + retval = TRUE; + gUnknown_03000D5C = 1; + } + else + { + retval = FALSE; + gUnknown_03000D5C = 3; + } + return retval; +} + +u32 GetLinkPlayerTrainerId(u8 who) +{ + return gLinkPlayers[who].trainerId; +} + +void sub_800A2BC(void) +{ + int i; + + for (i = 0; i <= MAX_LINK_PLAYERS; i ++) + { + gLinkPlayers[i] = (struct LinkPlayer){}; + } +} -- cgit v1.2.3 From e8ea1867a012b4b0368c4c4f41e4e131e46edac9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 19:25:46 -0500 Subject: sub_800A2F4 --- src/link.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 3cb485b49..9fd243052 100644 --- a/src/link.c +++ b/src/link.c @@ -22,7 +22,7 @@ struct BlockTransfer { u16 pos; u16 size; - void *src; + const void *src; bool8 active; u8 multiplayerId; }; @@ -111,9 +111,10 @@ void sub_8009638(void); void sub_80096BC(void); static void c2_08009A8C(void); static void sub_8009AA0(u8 unused); -void sub_8009F70(void); -void sub_800A2E0(void); -void sub_800A2F4(void *heapptr, size_t src); +static void sub_8009F70(void); +static void sub_800A2E0(void); +bool32 sub_800A2F4(const void *src, size_t size); +void sub_800A364(void); void sub_800A418(void); void task00_link_test(u8 taskId); void sub_800A588(u8 who); @@ -671,7 +672,7 @@ bool32 sub_8009F3C(void) return FALSE; } -void sub_8009F70(void) +static void sub_8009F70(void) { if (gReceivedRemoteLinkPlayers == TRUE) { @@ -884,3 +885,39 @@ void sub_800A2BC(void) gLinkPlayers[i] = (struct LinkPlayer){}; } } + +static void sub_800A2E0(void) +{ + gUnknown_03000D10.active = FALSE; + gUnknown_03000D10.pos = 0; + gUnknown_03000D10.size = 0; + gUnknown_03000D10.src = NULL; +} + +bool32 sub_800A2F4(const void *src, size_t size) +{ + if (gUnknown_03000D10.active) + { + return FALSE; + } + gUnknown_03000D10.multiplayerId = GetMultiplayerId(); + gUnknown_03000D10.active = TRUE; + gUnknown_03000D10.size = size; + gUnknown_03000D10.pos = 0; + if (size > 0x100) + { + gUnknown_03000D10.src = src; + } + else + { + if (src != gUnknown_020228C4) + { + memcpy(gUnknown_020228C4, src, size); + } + gUnknown_03000D10.src = gUnknown_020228C4; + } + sub_8009D90(0xbbbb); + gUnknown_03003140 = sub_800A364; + gUnknown_03000D50 = 0; + return TRUE; +} -- cgit v1.2.3 From 263fbdb2c1500aac078c9b36883bb39eefb77acf Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 19:37:38 -0500 Subject: through sub_800A388 --- src/link.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 9fd243052..1499b8275 100644 --- a/src/link.c +++ b/src/link.c @@ -22,7 +22,7 @@ struct BlockTransfer { u16 pos; u16 size; - const void *src; + const u8 *src; bool8 active; u8 multiplayerId; }; @@ -114,7 +114,9 @@ static void sub_8009AA0(u8 unused); static void sub_8009F70(void); static void sub_800A2E0(void); bool32 sub_800A2F4(const void *src, size_t size); -void sub_800A364(void); +static void sub_800A364(void); +static void sub_800A388(void); +void sub_800A3EC(void); void sub_800A418(void); void task00_link_test(u8 taskId); void sub_800A588(u8 who); @@ -921,3 +923,30 @@ bool32 sub_800A2F4(const void *src, size_t size) gUnknown_03000D50 = 0; return TRUE; } + +static void sub_800A364(void) +{ + if (++ gUnknown_03000D50 > 2) + { + gUnknown_03003140 = sub_800A388; + } +} + +static void sub_800A388(void) +{ + int i; + const u8 *src; + + src = gUnknown_03000D10.src; + gUnknown_03003110[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]; + } + gUnknown_03000D10.pos += 14; + if (gUnknown_03000D10.size <= gUnknown_03000D10.pos) + { + gUnknown_03000D10.active = FALSE; + gUnknown_03003140 = sub_800A3EC; + } +} -- cgit v1.2.3 From 3503444d3ba8e0f987e9f48457e832fa270a02bf Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 20:27:02 -0500 Subject: Some EWRAM offsets abstracted away --- src/link.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 1499b8275..13efb9504 100644 --- a/src/link.c +++ b/src/link.c @@ -98,12 +98,17 @@ u16 gUnknown_03003148[MAX_LINK_PLAYERS]; u8 gUnknown_03003150; u8 gUnknown_03003160; -u8 gUnknown_020223BC = 0; -u8 gUnknown_020223BD = 0; -bool8 gUnknown_020229C4 = FALSE; -u16 gUnknown_020229C6 = 0; -u16 gUnknown_020229C8 = 0; -struct LinkPlayer gUnknown_020229CC = {}; +EWRAM_DATA u8 gUnknown_020223BC = 0; +EWRAM_DATA u8 gUnknown_020223BD = 0; +EWRAM_DATA u32 gUnknown_020223C0 = 0; +EWRAM_DATA u16 gBlockRecvBuffer[MAX_LINK_PLAYERS + 1][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 struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS + 1] = {}; +EWRAM_DATA struct LinkPlayer gUnknown_02022A74[MAX_LINK_PLAYERS + 1] = {}; // Static ROM declarations @@ -116,7 +121,7 @@ static void sub_800A2E0(void); bool32 sub_800A2F4(const void *src, size_t size); static void sub_800A364(void); static void sub_800A388(void); -void sub_800A3EC(void); +static void sub_800A3EC(void); void sub_800A418(void); void task00_link_test(u8 taskId); void sub_800A588(u8 who); @@ -950,3 +955,15 @@ static void sub_800A388(void) gUnknown_03003140 = sub_800A3EC; } } + +static void sub_800A3EC(void) +{ + gUnknown_03003140 = NULL; +} + +void sub_800A3F8(void) +{ + GetMultiplayerId(); + sub_8009D90(0x4444); + gUnknown_020223C0 ++; +} -- cgit v1.2.3 From 50c162250732dbe5d90b8e38d66c3dc7ea114f00 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 20:47:24 -0500 Subject: Split link.s and link_rfu.s --- src/link.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 13efb9504..16208652e 100644 --- a/src/link.c +++ b/src/link.c @@ -122,7 +122,6 @@ 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 sub_800A418(void); void task00_link_test(u8 taskId); void sub_800A588(u8 who); u16 sub_800A648(u16 *src, u16 size); @@ -135,11 +134,14 @@ void sub_800B4A4(void); void sub_800B524(struct LinkPlayer *linkPlayer); void sub_800B53C(void); void sub_800B594(void); + +// rfu u32 sub_800BEC0(void); void sub_800E700(void); void sub_800EDD4(void); bool32 sub_800F7E4(void); void sub_800F804(void); +void sub_800F850(void); void Rfu_set_zero(void); u8 sub_80104F4(void); @@ -967,3 +969,16 @@ void sub_800A3F8(void) sub_8009D90(0x4444); gUnknown_020223C0 ++; } + +void sub_800A418(void) +{ + gUnknown_020223C0 = 0; + if (gLinkVSyncDisabled) + { + sub_800F850(); + } + else + { + gUnknown_03003140 = sub_800A3F8; + } +} -- cgit v1.2.3 From b92d85fd301c1492b8f03be8a98e61f94eb3171d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 20:55:03 -0500 Subject: Decompile link data --- src/link.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 16208652e..d9d5a48dd 100644 --- a/src/link.c +++ b/src/link.c @@ -3,6 +3,8 @@ #include "global.h" #include "malloc.h" #include "save.h" +#include "bg.h" +#include "window.h" #include "librfu.h" #include "rng.h" #include "decompress.h" @@ -169,7 +171,29 @@ const u8 gUnknown_082ED1D0[] = { }; const char gASCIIGameFreakInc[] = "GameFreak inc."; const char gASCIITestPrint[] = "TEST PRINT\nP0\nP1\nP2\nP3"; - +const struct BgTemplate gUnknown_082ED1FC[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .priority = 0 + }, { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 8, + .priority = 1 + } +}; +const struct WindowTemplate gUnknown_082ED204[] = { + {0x00, 0x00, 0x00, 0x1E, 0x05, 0x0F, 0x0002}, + {0x00, 0x00, 0x06, 0x1E, 0x07, 0x0F, 0x0098}, + {0x00, 0x00, 0x0D, 0x1E, 0x07, 0x0F, 0x016A}, + DUMMY_WIN_TEMPLATE +}; +const u8 gUnknown_082ED224[] = { + 0x00, 0x01, 0x02, 0x00, + 0xff, 0xfe, 0xff, 0x00 +}; // .text -- cgit v1.2.3 From 27c0dc0fd59f4e71f09313613a1a03bd48e6209d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 22:08:17 -0500 Subject: through sub_800A588 --- src/link.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 92 insertions(+), 27 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index d9d5a48dd..68868491b 100644 --- a/src/link.c +++ b/src/link.c @@ -16,6 +16,7 @@ #include "palette.h" #include "task.h" #include "trade.h" +#include "link_rfu.h" #include "link.h" // Static type declarations @@ -37,13 +38,6 @@ struct LinkTestBGInfo u32 dummy_C; }; -struct SIOCnt { - u32 cnt0_0:4; - u32 cnt0_2:2; -}; - -#define REG_SIOCNT_STRUCT (*(volatile struct SIOCnt *)REG_ADDR_SIOCNT) - // Static RAM declarations IWRAM_DATA struct BlockTransfer gUnknown_03000D10; @@ -88,7 +82,7 @@ u8 gUnknown_030030EC[MAX_LINK_PLAYERS]; u8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; u8 gUnknown_030030F8; -bool8 gLinkVSyncDisabled; +bool8 gSerialIsRFU; bool8 gUnknown_03003100; u16 gUnknown_03003110[8]; u8 gUnknown_03003120; @@ -137,16 +131,6 @@ void sub_800B524(struct LinkPlayer *linkPlayer); void sub_800B53C(void); void sub_800B594(void); -// rfu -u32 sub_800BEC0(void); -void sub_800E700(void); -void sub_800EDD4(void); -bool32 sub_800F7E4(void); -void sub_800F804(void); -void sub_800F850(void); -void Rfu_set_zero(void); -u8 sub_80104F4(void); - // .rodata ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); @@ -333,7 +317,7 @@ void sub_8009734(void) { int i; - if (!gLinkVSyncDisabled) + if (!gSerialIsRFU) { sub_800B628(); sub_80096D0(); @@ -365,7 +349,7 @@ void sub_8009734(void) void sub_80097E8(void) { gReceivedRemoteLinkPlayers = FALSE; - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { sub_800EDD4(); } @@ -467,7 +451,7 @@ u16 sub_80099E0(const u16 *src) gUnknown_03003084 = *src; if (gUnknown_030030E0 & 0x40) { - sub_8009AA0(REG_SIOCNT_STRUCT.cnt0_2); + sub_8009AA0(SIO_MULTI_CNT->id); if (gUnknown_03003140 != NULL) { gUnknown_03003140(); @@ -685,7 +669,7 @@ void sub_8009D90(u16 command) void sub_8009F18(void) { - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { sub_800F804(); } @@ -694,7 +678,7 @@ void sub_8009F18(void) bool32 sub_8009F3C(void) { - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { return sub_800F7E4(); } @@ -715,7 +699,7 @@ static void sub_8009F70(void) void sub_8009F8C(void) { - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { Rfu_set_zero(); } @@ -727,7 +711,7 @@ void sub_8009F8C(void) void sub_8009FAC(void) { - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { Rfu_set_zero(); } @@ -739,7 +723,7 @@ void sub_8009FAC(void) u8 GetLinkPlayerCount(void) { - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { return sub_80104F4(); } @@ -997,7 +981,7 @@ void sub_800A3F8(void) void sub_800A418(void) { gUnknown_020223C0 = 0; - if (gLinkVSyncDisabled) + if (gSerialIsRFU) { sub_800F850(); } @@ -1006,3 +990,84 @@ void sub_800A418(void) gUnknown_03003140 = sub_800A3F8; } } + +u32 sub_800A44C(void) +{ + return gUnknown_020223C0; +} + +void sub_800A458(void) +{ + sub_8009D90(0xaaaa); +} + +u8 GetMultiplayerId(void) +{ + if (gSerialIsRFU == TRUE) + { + return rfu_get_multiplayer_id(); + } + return SIO_MULTI_CNT->id; +} + +u8 bitmask_all_link_players_but_self(void) +{ + u8 mpId; + + mpId = GetMultiplayerId(); + return ((1 << MAX_LINK_PLAYERS) - 1) ^ (1 << mpId); +} + +bool8 SendBlock(u8 unused, const void *src, u16 size) +{ + if (gSerialIsRFU == TRUE) + { + return sub_800FE84(src, size); + } + return sub_800A2F4(src, size); +} + +bool8 sub_800A4D8(u8 a0) +{ + if (gSerialIsRFU == TRUE) + { + return sub_8010100(a0); + } + if (gUnknown_03003140 == NULL) + { + gUnknown_03003150 = a0; + sub_8009D90(0xcccc); + return TRUE; + } + return FALSE; +} + +bool8 sub_800A520(void) +{ + if (gSerialIsRFU == TRUE) + { + return sub_8010500(); + } + return gUnknown_03003140 == NULL; +} + +u8 GetBlockReceivedStatus(void) +{ + if (gSerialIsRFU == TRUE) + { + return sub_800FCD8(); + } + return (gUnknown_0300307C[3] << 3) | (gUnknown_0300307C[2] << 2) | (gUnknown_0300307C[1] << 1) | (gUnknown_0300307C[0] << 0); +} + +void sub_800A588(u8 who) +{ + if (gSerialIsRFU == TRUE) + { + sub_800F6FC(who); + } + else + { + gUnknown_0300307C[who] = TRUE; + } +} -- cgit v1.2.3 From efd0651efeeb42eb6e6a68b88ab2f9a93407666b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 22:34:23 -0500 Subject: through sub_800A678 --- src/link.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 6 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 68868491b..532079498 100644 --- a/src/link.c +++ b/src/link.c @@ -97,14 +97,14 @@ u8 gUnknown_03003160; EWRAM_DATA u8 gUnknown_020223BC = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; EWRAM_DATA u32 gUnknown_020223C0 = 0; -EWRAM_DATA u16 gBlockRecvBuffer[MAX_LINK_PLAYERS + 1][BLOCK_BUFFER_SIZE / 2] = {}; +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 struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS + 1] = {}; -EWRAM_DATA struct LinkPlayer gUnknown_02022A74[MAX_LINK_PLAYERS + 1] = {}; +EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {}; +EWRAM_DATA struct LinkPlayer gUnknown_02022A74[MAX_RFU_PLAYERS] = {}; // Static ROM declarations @@ -120,7 +120,7 @@ static void sub_800A388(void); static void sub_800A3EC(void); void task00_link_test(u8 taskId); void sub_800A588(u8 who); -u16 sub_800A648(u16 *src, u16 size); +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); @@ -449,7 +449,7 @@ u16 sub_80099E0(const u16 *src) gUnknown_03003110[i] = 0; } gUnknown_03003084 = *src; - if (gUnknown_030030E0 & 0x40) + if (gUnknown_030030E0 & LINK_STAT_CONN_ESTABLISHED) { sub_8009AA0(SIO_MULTI_CNT->id); if (gUnknown_03003140 != NULL) @@ -627,7 +627,7 @@ void sub_8009D90(u16 command) u8 i; gUnknown_03003110[0] = 0x7777; - for (i = 0; i < 5; i ++) + for (i = 0; i < MAX_RFU_PLAYERS; i ++) { gUnknown_03003110[i + 1] = 0xEE; } @@ -1071,3 +1071,64 @@ void sub_800A588(u8 who) gUnknown_0300307C[who] = TRUE; } } + +void ResetBlockReceivedFlags(void) +{ + int i; + + if (gSerialIsRFU == TRUE) + { + for (i = 0; i < MAX_RFU_PLAYERS; i ++) + { + sub_800F728(i); + } + } + else + { + for (i = 0; i < MAX_LINK_PLAYERS; i ++) + { + gUnknown_0300307C[i] = FALSE; + } + } +} + +void ResetBlockReceivedFlag(u8 who) +{ + if (gSerialIsRFU == TRUE) + { + sub_800F728(who); + } + else if (gUnknown_0300307C[who]) + { + gUnknown_0300307C[who] = FALSE; + } +} + +void sub_800A620(void) +{ + if ((gUnknown_030030E0 & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gUnknown_030030E0) > 1) + { + gUnknown_03003144 = TRUE; + } +} + +u16 sub_800A648(const u16 *data, u16 size) +{ + u16 chksum; + u16 i; + + chksum = 0; + for (i = 0; i < size / 2; i ++) + { + chksum += data[i]; + } + return chksum; +} + +void sub_800A678(u8 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); +} -- cgit v1.2.3 From ee738c74b9e0e39fae410834add43388c12d176c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 22:44:35 -0500 Subject: through sub_800A6E8 --- src/link.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 532079498..c2ef12786 100644 --- a/src/link.c +++ b/src/link.c @@ -1132,3 +1132,28 @@ void sub_800A678(u8 a0, u8 a1, u8 a2) vAddr = (u16 *)BG_SCREEN_ADDR(gUnknown_03003130.screenBaseBlock); vAddr[a2 * 32 + a1] = (gUnknown_03003130.paletteNum << 12) | (a0 + 1 + gUnknown_03003130.dummy_8); } + +void sub_800A6B0(u8 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); +} + +void sub_800A6E8(u32 a0, u8 a1, u8 a2, u8 a3) +{ + u8 sp[32 / 2]; + int i; + + for (i = 0; i < a3; i ++) + { + sp[i] = a0 & 0xf; + a0 >>= 4; + } + for (i = a3 - 1; i >= 0; i --) + { + sub_800A678(sp[i], a1, a2); + a1 ++; + } +} -- cgit v1.2.3 From 92afe9e33f7056170cfb826359d634c8ab9c4262 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 22:54:40 -0500 Subject: sub_800A73C --- src/link.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index c2ef12786..ede672f18 100644 --- a/src/link.c +++ b/src/link.c @@ -1157,3 +1157,31 @@ void sub_800A6E8(u32 a0, u8 a1, u8 a2, u8 a3) a1 ++; } } + +void sub_800A73C(int a0, u8 a1, u8 a2, u8 a3) +{ + u8 sp[32 / 2]; + int sp10; + int i; + + sp10 = -1; + if (a0 < 0) + { + sp10 = a1; + a0 = -a0; + } + for (i = 0; i < a3; i ++) + { + sp[i] = a0 % 10; + a0 /= 10; + } + for (i = a3 - 1; i >= 0; i --) + { + sub_800A678(sp[i], a1, a2); + a1 ++; + } + if (sp10 != -1) + { + sub_800A678(10, sp10, a2); + } +} -- cgit v1.2.3 From 2c37f83546887e51098c04da0648e91234aa38e7 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 10 Nov 2017 23:12:21 -0500 Subject: sub_800A7DC --- src/link.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index ede672f18..bba217b4d 100644 --- a/src/link.c +++ b/src/link.c @@ -1125,7 +1125,7 @@ u16 sub_800A648(const u16 *data, u16 size) return chksum; } -void sub_800A678(u8 a0, u8 a1, u8 a2) +void sub_800A678(char a0, u8 a1, u8 a2) { u16 *vAddr; @@ -1133,7 +1133,7 @@ void sub_800A678(u8 a0, u8 a1, u8 a2) vAddr[a2 * 32 + a1] = (gUnknown_03003130.paletteNum << 12) | (a0 + 1 + gUnknown_03003130.dummy_8); } -void sub_800A6B0(u8 a0, u8 a1, u8 a2) +void sub_800A6B0(char a0, u8 a1, u8 a2) { u16 *vAddr; @@ -1143,7 +1143,7 @@ void sub_800A6B0(u8 a0, u8 a1, u8 a2) void sub_800A6E8(u32 a0, u8 a1, u8 a2, u8 a3) { - u8 sp[32 / 2]; + char sp[32 / 2]; int i; for (i = 0; i < a3; i ++) @@ -1160,7 +1160,7 @@ void sub_800A6E8(u32 a0, u8 a1, u8 a2, u8 a3) void sub_800A73C(int a0, u8 a1, u8 a2, u8 a3) { - u8 sp[32 / 2]; + char sp[32 / 2]; int sp10; int i; @@ -1182,6 +1182,29 @@ void sub_800A73C(int a0, u8 a1, u8 a2, u8 a3) } if (sp10 != -1) { - sub_800A678(10, sp10, a2); + sub_800A678(*"\n", sp10, a2); + } +} + +void sub_800A7DC(const char *a0, u8 a1, u8 a2) +{ + int r6; + int i; + int r5; + + r5 = 0; + r6 = 0; + for (i = 0; a0[i] != 0; a0 ++) + { + if (a0[i] == *"\n") + { + r5 ++; + r6 = 0; + } + else + { + sub_800A6B0(a0[i], a1 + r6, a2 + r5); + r6 ++; + } } } -- cgit v1.2.3 From e874cbd9d952f9cb893885c04c61908910cc7791 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 11 Nov 2017 00:05:44 -0500 Subject: Rename functions in link.c --- src/link.c | 584 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 310 insertions(+), 274 deletions(-) (limited to 'src/link.c') 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); + } +} -- cgit v1.2.3 From 3321548956e2c7311bedb5bdfc4693c2010467f2 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 11 Nov 2017 00:25:05 -0500 Subject: Link common syms --- src/link.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 07598bc1f..d5fc890ca 100644 --- a/src/link.c +++ b/src/link.c @@ -67,14 +67,16 @@ IWRAM_DATA void *gUnknown_03000DAC; IWRAM_DATA bool32 gUnknown_03000DB0; u16 gUnknown_03003020[6]; -u32 gUnknown_0300302C; +u32 gLinkDebugSeed; struct LinkPlayerBlock gLocalLinkPlayerBlock; bool8 gLinkErrorOccurred; -u32 gUnknown_03003070; +u32 gLinkDebugFlags; +u32 gUnknown_03003074; bool8 gUnknown_03003078[MAX_LINK_PLAYERS]; u8 gUnknown_0300307C[MAX_LINK_PLAYERS]; +u32 gFiller_03003080; u16 gLinkHeldKeys; -u16 gRecvCmds[MAX_LINK_PLAYERS][8]; +u16 gRecvCmds[MAX_RFU_PLAYERS][8]; u32 gLinkStatus; u8 gUnknown_030030E4; bool8 gUnknown_030030E8; @@ -92,9 +94,15 @@ void (*gLinkCallback)(void); bool8 gShouldAdvanceLinkState; u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; u8 gBlockRequestType; +u32 gFiller_03003154; +u32 gFiller_03003158; +u32 gFiller_0300315c; u8 gUnknown_03003160; struct Link gLink; u8 gUnknown_03004130; +u16 gUnknown_03004134; +u32 gFiller_03004138; +u32 gFiller_0300413C; EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; @@ -124,7 +132,7 @@ 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); +static void Task_PrintTestData(u8 taskId); void sub_800AEB4(void); u8 sub_800B2F8(void); void sub_800B4A4(void); @@ -260,7 +268,7 @@ void LinkTestScreen(void) UpdatePaletteFade(); gUnknown_03000D60 = 0; InitLocalLinkPlayer(); - CreateTask(task00_link_test, 0); + CreateTask(Task_PrintTestData, 0); SetMainCallback2(CB2_LinkTest); } @@ -1218,7 +1226,7 @@ static void LinkCB_RequestPlayerDataExchange(void) gLinkCallback = NULL; } -static void task00_link_test(u8 taskId) +static void Task_PrintTestData(u8 taskId) { char sp[32]; int i; @@ -1233,8 +1241,8 @@ static void task00_link_test(u8 taskId) 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(gLinkDebugSeed, 2, 12, 8); + LinkTest_prnthex(gLinkDebugFlags, 2, 13, 8); LinkTest_prnthex(sub_800B2E8(), 25, 5, 1); LinkTest_prnthex(sub_800B2F8(), 25, 6, 1); LinkTest_prnthex(sub_800B320(), 25, 7, 1); @@ -1244,3 +1252,9 @@ static void task00_link_test(u8 taskId) LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); } } + +void SetLinkDebugValues(u32 seed, u32 flags) +{ + gLinkDebugSeed = seed; + gLinkDebugFlags = flags; +} -- cgit v1.2.3 From 8eb7bdc617d126ae0a37acbce90c53cd61c5d668 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 11 Nov 2017 00:39:02 -0500 Subject: Reinfer file boundaries --- src/link.c | 8 -------- 1 file changed, 8 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index d5fc890ca..5ed05f50f 100644 --- a/src/link.c +++ b/src/link.c @@ -57,14 +57,6 @@ IWRAM_DATA u16 gUnknown_03000D70; IWRAM_DATA u8 gUnknown_03000D72; IWRAM_DATA u8 gUnknown_03000D73; IWRAM_DATA u8 gUnknown_03000D74; -ALIGNED() IWRAM_DATA u8 gUnknown_03000D78; -ALIGNED(8) IWRAM_DATA u8 gUnknown_03000D80[16]; -IWRAM_DATA u16 gUnknown_03000D90[8]; -IWRAM_DATA u32 gUnknown_03000DA0; -IWRAM_DATA u32 gUnknown_03000DA4; -IWRAM_DATA void *gUnknown_03000DA8; -IWRAM_DATA void *gUnknown_03000DAC; -IWRAM_DATA bool32 gUnknown_03000DB0; u16 gUnknown_03003020[6]; u32 gLinkDebugSeed; -- cgit v1.2.3 From d0578ca9e0c144a8e2c32d874be2d48af65f4403 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 11 Nov 2017 09:56:47 -0500 Subject: through sub_800AA54 --- src/link.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 5ed05f50f..d6bb7bd7d 100644 --- a/src/link.c +++ b/src/link.c @@ -1250,3 +1250,51 @@ void SetLinkDebugValues(u32 seed, u32 flags) gLinkDebugSeed = seed; gLinkDebugFlags = flags; } + +u8 sub_800A9A8(void) +{ + int i; + u8 flags; + + flags = 0; + for (i = 0; i < gUnknown_03003100; i ++) + { + flags |= (1 << i); + } + return flags; +} + +u8 sub_800A9D8(void) +{ + int i; + u8 flags; + + flags = 0; + for (i = 0; i < GetLinkPlayerCount(); i ++) + { + flags |= (1 << i); + } + return flags; +} + +void sub_800AA04(u8 a0) +{ + int i; + + gUnknown_03003100 = a0; + gUnknown_03003120 = GetMultiplayerId(); + for (i = 0; i < MAX_RFU_PLAYERS; i ++) + { + gUnknown_02022A74[i] = gLinkPlayers[i]; + } +} + +u8 sub_800AA48(void) +{ + return gUnknown_03003100; +} + +u8 sub_800AA54(void) +{ + return gUnknown_03003120; +} -- cgit v1.2.3 From 2e95c5575fb53107501f1a9a950d453048297148 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 20:57:21 -0500 Subject: sub_800AA60 --- src/link.c | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index d6bb7bd7d..1ccfb5158 100644 --- a/src/link.c +++ b/src/link.c @@ -77,7 +77,7 @@ u8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; u8 gSuppressLinkErrorMessage; bool8 gSerialIsRFU; -bool8 gUnknown_03003100; +bool8 gSavedLinkPlayerCount; u16 gSendCmd[8]; u8 gUnknown_03003120; bool8 gReceivedRemoteLinkPlayers; @@ -106,7 +106,7 @@ 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] = {}; +EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {}; // Static ROM declarations @@ -1257,7 +1257,7 @@ u8 sub_800A9A8(void) u8 flags; flags = 0; - for (i = 0; i < gUnknown_03003100; i ++) + for (i = 0; i < gSavedLinkPlayerCount; i ++) { flags |= (1 << i); } @@ -1281,20 +1281,53 @@ void sub_800AA04(u8 a0) { int i; - gUnknown_03003100 = a0; + gSavedLinkPlayerCount = a0; gUnknown_03003120 = GetMultiplayerId(); for (i = 0; i < MAX_RFU_PLAYERS; i ++) { - gUnknown_02022A74[i] = gLinkPlayers[i]; + gSavedLinkPlayers[i] = gLinkPlayers[i]; } } u8 sub_800AA48(void) { - return gUnknown_03003100; + return gSavedLinkPlayerCount; } u8 sub_800AA54(void) { return gUnknown_03003120; } + +bool8 sub_800AA60(void) +{ + int i; + unsigned count; + + count = 0; + for (i = 0; i < gSavedLinkPlayerCount; i ++) + { + if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) + { + if (gLinkType == 0x2288) + { + if (gLinkType == gLinkPlayers[i].linkType) + { + count ++; + } + } + else + { + count ++; + } + } + } + if (count == gSavedLinkPlayerCount) + { + if (sub_800ABAC() == gSavedLinkPlayerCount) + { + return TRUE; + } + } + return FALSE; +} -- cgit v1.2.3 From 5ec0fc9aa0b62ee15bf7fea44371f928ed222371 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 21:26:11 -0500 Subject: sub_800AB18 --- src/link.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 1ccfb5158..5ca08dd27 100644 --- a/src/link.c +++ b/src/link.c @@ -1331,3 +1331,29 @@ bool8 sub_800AA60(void) } return FALSE; } + +void sub_800AAF4(void) +{ + int i; + + // Clearly not what was meant to be written, but here it is anyway. + for (i = 0; i < 4; i ++) + { + CpuSet(&gSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer)); + } +} + +void sub_800AB18(void) +{ + u8 i; + + for (i = 0; i < gSavedLinkPlayerCount; i ++) + { + if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) + { + gLinkErrorOccurred = TRUE; + CloseLink(); + SetMainCallback2(CB2_LinkError); + } + } +} -- cgit v1.2.3 From b346bac98b9328ad2da85e89b885ea09f247e98d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 21:31:08 -0500 Subject: through GetLinkPlayerCount_2 --- src/link.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 5ca08dd27..d6cc1b5de 100644 --- a/src/link.c +++ b/src/link.c @@ -79,7 +79,7 @@ u8 gSuppressLinkErrorMessage; bool8 gSerialIsRFU; bool8 gSavedLinkPlayerCount; u16 gSendCmd[8]; -u8 gUnknown_03003120; +u8 gSavedMultiplayerId; bool8 gReceivedRemoteLinkPlayers; struct LinkTestBGInfo gLinkTestBGInfo; void (*gLinkCallback)(void); @@ -468,7 +468,7 @@ void HandleReceiveRemoteLinkPlayer(u8 who) count = 0; gUnknown_03003078[who] = FALSE; - for (i = 0; i < sub_800ABAC(); i ++) + for (i = 0; i < GetLinkPlayerCount_2(); i ++) { count += gUnknown_03003078[i]; } @@ -800,7 +800,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) count = 0; if (gReceivedRemoteLinkPlayers == TRUE) { - cmpVal = sub_800ABAC(); + cmpVal = GetLinkPlayerCount_2(); if (lower > cmpVal || cmpVal > upper) { sPlayerDataExchangeStatus = EXCHANGE_STAT_6; @@ -1282,7 +1282,7 @@ void sub_800AA04(u8 a0) int i; gSavedLinkPlayerCount = a0; - gUnknown_03003120 = GetMultiplayerId(); + gSavedMultiplayerId = GetMultiplayerId(); for (i = 0; i < MAX_RFU_PLAYERS; i ++) { gSavedLinkPlayers[i] = gLinkPlayers[i]; @@ -1296,7 +1296,7 @@ u8 sub_800AA48(void) u8 sub_800AA54(void) { - return gUnknown_03003120; + return gSavedMultiplayerId; } bool8 sub_800AA60(void) @@ -1324,7 +1324,7 @@ bool8 sub_800AA60(void) } if (count == gSavedLinkPlayerCount) { - if (sub_800ABAC() == gSavedLinkPlayerCount) + if (GetLinkPlayerCount_2() == gSavedLinkPlayerCount) { return TRUE; } @@ -1357,3 +1357,14 @@ void sub_800AB18(void) } } } + +void sub_800AB98(void) +{ + gSavedLinkPlayerCount = 0; + gSavedMultiplayerId = 0; +} + +u8 GetLinkPlayerCount_2(void) +{ + return EXTRACT_PLAYER_COUNT(gLinkStatus); +} -- cgit v1.2.3 From ccf6599b4038a5a957576f7ab88027dd98c07dcf Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 22:09:11 -0500 Subject: sub_800AC34 --- src/link.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index d6cc1b5de..3ab9acb7c 100644 --- a/src/link.c +++ b/src/link.c @@ -107,6 +107,12 @@ 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 unk_04; +} gUnknown_02022B00 = {}; +EWRAM_DATA u16 gUnknown_02022B08 = 0; +EWRAM_DATA void *gUnknown_02022B0C = NULL; // Static ROM declarations @@ -125,6 +131,7 @@ 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 Task_PrintTestData(u8 taskId); +void sub_800AC80(void); void sub_800AEB4(void); u8 sub_800B2F8(void); void sub_800B4A4(void); @@ -1368,3 +1375,55 @@ u8 GetLinkPlayerCount_2(void) { return EXTRACT_PLAYER_COUNT(gLinkStatus); } + +bool8 IsLinkMaster(void) +{ + if (gSerialIsRFU) + { + return Rfu_IsMaster(); + } + return EXTRACT_MASTER(gLinkStatus); +} + +u8 sub_800ABE8(void) +{ + return gUnknown_03000D58; +} + +void sub_800ABF4(u16 a0) +{ + if (gSerialIsRFU == TRUE) + { + task_add_05_task_del_08FA224_when_no_RfuFunc(); + } + else + { + if (gLinkCallback == NULL) + { + gLinkCallback = sub_800AC80; + gUnknown_030030E4 = 0; + gUnknown_030030F4 = a0; + } + } +} + +void sub_800AC34(void) +{ + if (gSerialIsRFU == TRUE) + { + task_add_05_task_del_08FA224_when_no_RfuFunc(); + } + else + { + if (gLinkCallback != NULL) + { + gUnknown_02022B08 ++; + } + else + { + gLinkCallback = sub_800AC80; + gUnknown_030030E4 = 0; + gUnknown_030030F4 = 0; + } + } +} -- cgit v1.2.3 From 6fe7b33ae15d33896f7808e52ca921d4f5881941 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 22:24:15 -0500 Subject: through sub_800AD10 --- src/link.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 3ab9acb7c..ab1b9174c 100644 --- a/src/link.c +++ b/src/link.c @@ -16,6 +16,7 @@ #include "palette.h" #include "task.h" #include "trade.h" +#include "battle.h" #include "link_rfu.h" #include "link.h" @@ -131,7 +132,9 @@ 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 Task_PrintTestData(u8 taskId); -void sub_800AC80(void); +static void sub_800AC80(void); +static void sub_800ACAC(void); +void sub_800AD5C(void); void sub_800AEB4(void); u8 sub_800B2F8(void); void sub_800B4A4(void); @@ -1427,3 +1430,58 @@ void sub_800AC34(void) } } } + +static void sub_800AC80(void) +{ + if (gUnknown_03004130 == 0) + { + BuildSendCmd(0x5fff); + gLinkCallback = sub_800ACAC; + } +} + +static void sub_800ACAC(void) +{ + int i; + unsigned count; + u8 linkPlayerCount; + + linkPlayerCount = GetLinkPlayerCount(); + count = 0; + for (i = 0; i < linkPlayerCount; i ++) + { + if (gUnknown_030030F0[i]) + { + count ++; + } + } + if (count == linkPlayerCount) + { + gBattleTypeFlags &= ~BATTLE_TYPE_20; + gLinkVSyncDisabled = TRUE; + CloseLink(); + gLinkCallback = NULL; + gUnknown_030030E4 = 1; + } +} + +void sub_800AD10(void) +{ + if (gSerialIsRFU == TRUE) + { + task_add_05_task_del_08FA224_when_no_RfuFunc(); + } + else + { + if (gLinkCallback != NULL) + { + gUnknown_02022B08 ++; + } + else + { + gLinkCallback = sub_800AD5C; + gUnknown_030030E4 = 0; + gUnknown_030030F4 = 0; + } + } +} -- cgit v1.2.3 From 16dba15c1c80ce545b4ed4178d42412bb98bdd33 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 22:30:00 -0500 Subject: through sub_800AD88 --- src/link.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index ab1b9174c..b01e53789 100644 --- a/src/link.c +++ b/src/link.c @@ -134,7 +134,8 @@ static void LinkCB_RequestPlayerDataExchange(void); static void Task_PrintTestData(u8 taskId); static void sub_800AC80(void); static void sub_800ACAC(void); -void sub_800AD5C(void); +static void sub_800AD5C(void); +static void sub_800AD88(void); void sub_800AEB4(void); u8 sub_800B2F8(void); void sub_800B4A4(void); @@ -1485,3 +1486,41 @@ void sub_800AD10(void) } } } + +static void sub_800AD5C(void) +{ + if (gUnknown_03004130 == 0) + { + BuildSendCmd(0x5fff); + gLinkCallback = sub_800AD88; + } +} + +static void sub_800AD88(void) +{ + int i; + unsigned count; + u8 linkPlayerCount; + + linkPlayerCount = GetLinkPlayerCount(); + count = 0; + for (i = 0; i < linkPlayerCount; i ++) + { + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + count ++; + } + else if (gUnknown_030030F0[i]) + { + count ++; + } + } + if (count == linkPlayerCount) + { + gBattleTypeFlags &= ~BATTLE_TYPE_20; + gLinkVSyncDisabled = TRUE; + CloseLink(); + gLinkCallback = NULL; + gUnknown_030030E4 = 1; + } +} -- cgit v1.2.3 From e6b38426b7c882a3ae09ac9e6e27e12b06e7ffd1 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 22:44:20 -0500 Subject: sub_800ADF8 --- src/link.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 17 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index b01e53789..291c32e5b 100644 --- a/src/link.c +++ b/src/link.c @@ -71,10 +71,10 @@ u32 gFiller_03003080; u16 gLinkHeldKeys; u16 gRecvCmds[MAX_RFU_PLAYERS][8]; u32 gLinkStatus; -u8 gUnknown_030030E4; +bool8 gUnknown_030030E4; bool8 gUnknown_030030E8; -u8 gUnknown_030030EC[MAX_LINK_PLAYERS]; -u8 gUnknown_030030F0[MAX_LINK_PLAYERS]; +bool8 gUnknown_030030EC[MAX_LINK_PLAYERS]; +bool8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; u8 gSuppressLinkErrorMessage; bool8 gSerialIsRFU; @@ -136,6 +136,8 @@ static void sub_800AC80(void); static void sub_800ACAC(void); static void sub_800AD5C(void); static void sub_800AD88(void); +static void sub_800AE30(void); +static void sub_800AE5C(void); void sub_800AEB4(void); u8 sub_800B2F8(void); void sub_800B4A4(void); @@ -339,8 +341,8 @@ void OpenLink(void) ResetBlockReceivedFlags(); ResetBlockSend(); gUnknown_03000D54 = 0; - gUnknown_030030E8 = 0; - gUnknown_030030E4 = 0; + gUnknown_030030E8 = FALSE; + gUnknown_030030E4 = FALSE; gUnknown_030030F4 = 0; CreateTask(Task_TriggerHandshake, 2); } @@ -351,9 +353,9 @@ void OpenLink(void) gReceivedRemoteLinkPlayers = 0; for (i = 0; i < MAX_LINK_PLAYERS; i ++) { - gUnknown_03003078[i] = 1; - gUnknown_030030F0[i] = 0; - gUnknown_030030EC[i] = 0; + gUnknown_03003078[i] = TRUE; + gUnknown_030030F0[i] = FALSE; + gUnknown_030030EC[i] = FALSE; } } @@ -518,10 +520,10 @@ static void ProcessRecvCmds(u8 unused) gUnknown_03003020[i] = gRecvCmds[i][1]; break; case 0x5555: - gUnknown_030030E8 = 1; + gUnknown_030030E8 = TRUE; break; case 0x5566: - gUnknown_030030E8 = 1; + gUnknown_030030E8 = TRUE; break; case 0xBBBB: { @@ -593,10 +595,10 @@ static void ProcessRecvCmds(u8 unused) } break; case 0x5FFF: - gUnknown_030030F0[i] = 1; + gUnknown_030030F0[i] = TRUE; break; case 0x2FFE: - gUnknown_030030EC[i] = 1; + gUnknown_030030EC[i] = TRUE; break; case 0xAAAA: sub_800A418(); @@ -1405,7 +1407,7 @@ void sub_800ABF4(u16 a0) if (gLinkCallback == NULL) { gLinkCallback = sub_800AC80; - gUnknown_030030E4 = 0; + gUnknown_030030E4 = FALSE; gUnknown_030030F4 = a0; } } @@ -1426,7 +1428,7 @@ void sub_800AC34(void) else { gLinkCallback = sub_800AC80; - gUnknown_030030E4 = 0; + gUnknown_030030E4 = FALSE; gUnknown_030030F4 = 0; } } @@ -1462,7 +1464,7 @@ static void sub_800ACAC(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gUnknown_030030E4 = 1; + gUnknown_030030E4 = TRUE; } } @@ -1481,7 +1483,7 @@ void sub_800AD10(void) else { gLinkCallback = sub_800AD5C; - gUnknown_030030E4 = 0; + gUnknown_030030E4 = FALSE; gUnknown_030030F4 = 0; } } @@ -1521,6 +1523,54 @@ static void sub_800AD88(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gUnknown_030030E4 = 1; + gUnknown_030030E4 = TRUE; + } +} + +void sub_800ADF8(void) +{ + if (gSerialIsRFU == TRUE) + { + sub_8010434(); + } + else + { + if (gLinkCallback == NULL) + { + gLinkCallback = sub_800AE30; + } + gUnknown_030030E4 = FALSE; + } +} + +static void sub_800AE30(void) +{ + if (gUnknown_03004130 == 0) + { + BuildSendCmd(0x2ffe); + gLinkCallback = sub_800AE5C; + } +} + +static void sub_800AE5C(void) +{ + u8 i; + u8 linkPlayerCount; + + linkPlayerCount = GetLinkPlayerCount(); + for (i = 0; i < linkPlayerCount; i ++) + { + if (!gUnknown_030030EC[i]) + { + break; + } + } + if (i == linkPlayerCount) + { + for (i = 0; i < MAX_LINK_PLAYERS; i ++) + { + gUnknown_030030EC[i] = FALSE; + } + gLinkCallback = NULL; } } -- cgit v1.2.3 From 344a71d347c487f9fb4213637f3930e2643444d9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 23:16:51 -0500 Subject: through CB2_LinkError --- src/link.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 95 insertions(+), 10 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 291c32e5b..c9a555dbb 100644 --- a/src/link.c +++ b/src/link.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "m4a.h" #include "malloc.h" #include "save.h" #include "bg.h" @@ -15,6 +16,11 @@ #include "gpu_regs.h" #include "palette.h" #include "task.h" +#include "unknown_task.h" +#include "menu.h" +#include "new_menu_helpers.h" +#include "text.h" +#include "sound.h" #include "trade.h" #include "battle.h" #include "link_rfu.h" @@ -90,9 +96,9 @@ u8 gBlockRequestType; u32 gFiller_03003154; u32 gFiller_03003158; u32 gFiller_0300315c; -u8 gUnknown_03003160; +u8 gLastSendQueueCount; struct Link gLink; -u8 gUnknown_03004130; +u8 gLastRecvQueueCount; u16 gUnknown_03004134; u32 gFiller_03004138; u32 gFiller_0300413C; @@ -110,8 +116,10 @@ EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {}; EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {}; EWRAM_DATA struct { u32 status; - u8 unk_04; -} gUnknown_02022B00 = {}; + u8 lastRecvQueueCount; + u8 lastSendQueueCount; + u8 unk_06; +} sLinkErrorBuffer = {}; EWRAM_DATA u16 gUnknown_02022B08 = 0; EWRAM_DATA void *gUnknown_02022B0C = NULL; @@ -138,7 +146,8 @@ static void sub_800AD5C(void); static void sub_800AD88(void); static void sub_800AE30(void); static void sub_800AE5C(void); -void sub_800AEB4(void); +static void sub_800AEB4(void); +void sub_800B1A0(void); u8 sub_800B2F8(void); void sub_800B4A4(void); void DisableSerial(void); @@ -1243,8 +1252,8 @@ static void Task_PrintTestData(u8 taskId) 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(gLastSendQueueCount, 25, 1, 2); + LinkTest_prnthex(gLastRecvQueueCount, 25, 2, 2); LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2); LinkTest_prnthex(gLinkDebugSeed, 2, 12, 8); LinkTest_prnthex(gLinkDebugFlags, 2, 13, 8); @@ -1436,7 +1445,7 @@ void sub_800AC34(void) static void sub_800AC80(void) { - if (gUnknown_03004130 == 0) + if (gLastRecvQueueCount == 0) { BuildSendCmd(0x5fff); gLinkCallback = sub_800ACAC; @@ -1491,7 +1500,7 @@ void sub_800AD10(void) static void sub_800AD5C(void) { - if (gUnknown_03004130 == 0) + if (gLastRecvQueueCount == 0) { BuildSendCmd(0x5fff); gLinkCallback = sub_800AD88; @@ -1545,7 +1554,7 @@ void sub_800ADF8(void) static void sub_800AE30(void) { - if (gUnknown_03004130 == 0) + if (gLastRecvQueueCount == 0) { BuildSendCmd(0x2ffe); gLinkCallback = sub_800AE5C; @@ -1574,3 +1583,79 @@ static void sub_800AE5C(void) gLinkCallback = NULL; } } + +static void sub_800AEB4(void) +{ + if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus)) + { + if (!gSuppressLinkErrorMessage) + { + sLinkErrorBuffer.status = gLinkStatus; + sLinkErrorBuffer.lastRecvQueueCount = gLastRecvQueueCount; + sLinkErrorBuffer.lastSendQueueCount = gLastSendQueueCount; + SetMainCallback2(CB2_LinkError); + } + gLinkErrorOccurred = TRUE; + CloseLink(); + } +} + +void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06) +{ + sLinkErrorBuffer.status = status; + sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount; + sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount; + sLinkErrorBuffer.unk_06 = unk_06; +} + +void CB2_LinkError(void) +{ + u8 *tilemapBuffer; + + SetGpuReg(REG_OFFSET_DISPCNT, 0); + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + m4aMPlayStop(&gMPlay_SE3); + InitHeap(gHeap, HEAP_SIZE); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetPaletteFadeControl(); + FillPalette(0, 0, 2); + ResetTasks(); + remove_some_task(); + if (gSerialIsRFU) + { + if (!sLinkErrorBuffer.unk_06) + { + gSerialIsRFU = 3; + } + sub_800E604(); + } + SetVBlankCallback(sub_80096BC); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_082ED1FC, 2); + gUnknown_02022B0C = tilemapBuffer = malloc(0x800); + SetBgTilemapBuffer(1, tilemapBuffer); + if (InitWindows(gUnknown_082ED204)) + { + DeactivateAllTextPrinters(); + reset_temp_tile_data_buffers(); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); + LoadPalette(gUnknown_0860F074, 0xf0, 0x20); + gSoftResetDisabled = FALSE; + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + gMain.callback1 = NULL; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + SetMainCallback2(sub_800B1A0); + } +} -- cgit v1.2.3 From 85cf626316c6300cd77978d769a8758ec43a2ca4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 23:33:03 -0500 Subject: sub_800B080 --- src/link.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index c9a555dbb..09f3b6d6f 100644 --- a/src/link.c +++ b/src/link.c @@ -20,6 +20,7 @@ #include "menu.h" #include "new_menu_helpers.h" #include "text.h" +#include "strings.h" #include "sound.h" #include "trade.h" #include "battle.h" @@ -1659,3 +1660,20 @@ void CB2_LinkError(void) SetMainCallback2(sub_800B1A0); } } + +void sub_800B080(void) +{ + LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0); + copy_decompressed_tile_data_to_vram_autofree(1, gWirelessLinkDisplayGfx, FALSE, 0, 0); + CopyToBgTilemapBuffer(1, gWirelessLinkDisplayTilemap, 0, 0); + CopyBgTilemapBufferToVram(1); + LoadPalette(gWirelessLinkDisplayPal, 0, 0x20); + FillWindowPixelBuffer(0, 0x00); + FillWindowPixelBuffer(2, 0x00); + box_print(0, 3, 2, 6, gUnknown_082ED224, 0, gText_CommErrorEllipsis); + box_print(2, 3, 2, 1, gUnknown_082ED224, 0, gText_MoveCloserToLinkPartner); + PutWindowTilemap(0); + PutWindowTilemap(2); + CopyWindowToVram(0, 0); + CopyWindowToVram(2, 3); +} -- cgit v1.2.3 From f21c5ebea50685982daf1f81cda4c535615a6ef8 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 12 Nov 2017 23:58:05 -0500 Subject: through sub_800B1A0 --- src/link.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 108 insertions(+), 25 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 09f3b6d6f..1ee4ade4f 100644 --- a/src/link.c +++ b/src/link.c @@ -3,6 +3,7 @@ #include "global.h" #include "m4a.h" #include "malloc.h" +#include "reset_save_heap.h" #include "save.h" #include "bg.h" #include "window.h" @@ -21,6 +22,7 @@ #include "new_menu_helpers.h" #include "text.h" #include "strings.h" +#include "songs.h" #include "sound.h" #include "trade.h" #include "battle.h" @@ -84,7 +86,7 @@ bool8 gUnknown_030030EC[MAX_LINK_PLAYERS]; bool8 gUnknown_030030F0[MAX_LINK_PLAYERS]; u16 gUnknown_030030F4; u8 gSuppressLinkErrorMessage; -bool8 gSerialIsRFU; +bool8 gWirelessCommType; bool8 gSavedLinkPlayerCount; u16 gSendCmd[8]; u8 gSavedMultiplayerId; @@ -148,7 +150,7 @@ static void sub_800AD88(void); static void sub_800AE30(void); static void sub_800AE5C(void); static void sub_800AEB4(void); -void sub_800B1A0(void); +static void sub_800B1A0(void); u8 sub_800B2F8(void); void sub_800B4A4(void); void DisableSerial(void); @@ -340,7 +342,7 @@ void OpenLink(void) { int i; - if (!gSerialIsRFU) + if (!gWirelessCommType) { ResetSerial(); InitLink(); @@ -372,7 +374,7 @@ void OpenLink(void) void CloseLink(void) { gReceivedRemoteLinkPlayers = FALSE; - if (gSerialIsRFU) + if (gWirelessCommType) { sub_800EDD4(); } @@ -692,7 +694,7 @@ void BuildSendCmd(u16 command) void sub_8009F18(void) { - if (gSerialIsRFU) + if (gWirelessCommType) { sub_800F804(); } @@ -701,7 +703,7 @@ void sub_8009F18(void) bool32 sub_8009F3C(void) { - if (gSerialIsRFU) + if (gWirelessCommType) { return sub_800F7E4(); } @@ -722,7 +724,7 @@ static void sub_8009F70(void) void ClearLinkCallback(void) { - if (gSerialIsRFU) + if (gWirelessCommType) { Rfu_set_zero(); } @@ -734,7 +736,7 @@ void ClearLinkCallback(void) void ClearLinkCallback_2(void) { - if (gSerialIsRFU) + if (gWirelessCommType) { Rfu_set_zero(); } @@ -746,7 +748,7 @@ void ClearLinkCallback_2(void) u8 GetLinkPlayerCount(void) { - if (gSerialIsRFU) + if (gWirelessCommType) { return sub_80104F4(); } @@ -1004,7 +1006,7 @@ static void sub_800A3F8(void) void sub_800A418(void) { gUnknown_020223C0 = 0; - if (gSerialIsRFU) + if (gWirelessCommType) { sub_800F850(); } @@ -1026,7 +1028,7 @@ void sub_800A458(void) u8 GetMultiplayerId(void) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { return rfu_get_multiplayer_id(); } @@ -1043,7 +1045,7 @@ u8 bitmask_all_link_players_but_self(void) bool8 SendBlock(u8 unused, const void *src, u16 size) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { return sub_800FE84(src, size); } @@ -1052,7 +1054,7 @@ bool8 SendBlock(u8 unused, const void *src, u16 size) bool8 sub_800A4D8(u8 a0) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { return sub_8010100(a0); } @@ -1067,7 +1069,7 @@ bool8 sub_800A4D8(u8 a0) bool8 sub_800A520(void) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { return sub_8010500(); } @@ -1076,7 +1078,7 @@ bool8 sub_800A520(void) u8 GetBlockReceivedStatus(void) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { return sub_800FCD8(); } @@ -1085,7 +1087,7 @@ u8 GetBlockReceivedStatus(void) static void SetBlockReceivedFlag(u8 who) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { sub_800F6FC(who); } @@ -1099,7 +1101,7 @@ void ResetBlockReceivedFlags(void) { int i; - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { for (i = 0; i < MAX_RFU_PLAYERS; i ++) { @@ -1117,7 +1119,7 @@ void ResetBlockReceivedFlags(void) void ResetBlockReceivedFlag(u8 who) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { sub_800F728(who); } @@ -1394,7 +1396,7 @@ u8 GetLinkPlayerCount_2(void) bool8 IsLinkMaster(void) { - if (gSerialIsRFU) + if (gWirelessCommType) { return Rfu_IsMaster(); } @@ -1408,7 +1410,7 @@ u8 sub_800ABE8(void) void sub_800ABF4(u16 a0) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { task_add_05_task_del_08FA224_when_no_RfuFunc(); } @@ -1425,7 +1427,7 @@ void sub_800ABF4(u16 a0) void sub_800AC34(void) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { task_add_05_task_del_08FA224_when_no_RfuFunc(); } @@ -1480,7 +1482,7 @@ static void sub_800ACAC(void) void sub_800AD10(void) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { task_add_05_task_del_08FA224_when_no_RfuFunc(); } @@ -1539,7 +1541,7 @@ static void sub_800AD88(void) void sub_800ADF8(void) { - if (gSerialIsRFU == TRUE) + if (gWirelessCommType == TRUE) { sub_8010434(); } @@ -1624,11 +1626,11 @@ void CB2_LinkError(void) FillPalette(0, 0, 2); ResetTasks(); remove_some_task(); - if (gSerialIsRFU) + if (gWirelessCommType) { if (!sLinkErrorBuffer.unk_06) { - gSerialIsRFU = 3; + gWirelessCommType = 3; } sub_800E604(); } @@ -1677,3 +1679,84 @@ void sub_800B080(void) CopyWindowToVram(0, 0); CopyWindowToVram(2, 3); } + +void sub_800B138(void) +{ + LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0); + FillWindowPixelBuffer(1, 0x00); + FillWindowPixelBuffer(2, 0x00); + box_print(1, 3, 2, 0, gUnknown_082ED224, 0, gText_CommErrorCheckConnections); + PutWindowTilemap(1); + PutWindowTilemap(2); + CopyWindowToVram(1, 0); + CopyWindowToVram(2, 3); +} + +static void sub_800B1A0(void) +{ + switch (gMain.state) + { + case 00: + if (sLinkErrorBuffer.unk_06) + { + sub_800B080(); + } + else + { + sub_800B138(); + } + break; + case 02: + ShowBg(0); + if (sLinkErrorBuffer.unk_06) + { + ShowBg(1); + } + break; + case 30: + PlaySE(SE_BOO); + break; + case 60: + PlaySE(SE_BOO); + break; + case 90: + PlaySE(SE_BOO); + break; + case 130: + if (gWirelessCommType == 2) + { + box_print(0, 3, 2, 20, gUnknown_082ED224, 0, gText_ABtnTitleScreen); + } + else if (gWirelessCommType == 1) + { + box_print(0, 3, 2, 20, gUnknown_082ED224, 0, gText_ABtnRegistrationCounter); + } + break; + } + if (gMain.state == 160) + { + if (gWirelessCommType == 1) + { + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_PIN); + gWirelessCommType = 0; + sLinkErrorBuffer.unk_06 = 0; + sub_81700F8(); + } + } + else if (gWirelessCommType == 2) + { + if (gMain.newKeys & A_BUTTON) + { + rfu_REQ_stopMode(); + rfu_waitREQComplete(); + DoSoftReset(); + } + } + } + if (gMain.state != 160) + { + gMain.state ++; + } +} -- cgit v1.2.3 From 8904f62cc846cf55fa9b3dea1f7607e039affee3 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 00:15:31 -0500 Subject: through sub_800B33C --- src/link.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 1ee4ade4f..71efbf358 100644 --- a/src/link.c +++ b/src/link.c @@ -1663,7 +1663,7 @@ void CB2_LinkError(void) } } -void sub_800B080(void) +static void sub_800B080(void) { LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0); copy_decompressed_tile_data_to_vram_autofree(1, gWirelessLinkDisplayGfx, FALSE, 0, 0); @@ -1680,7 +1680,7 @@ void sub_800B080(void) CopyWindowToVram(2, 3); } -void sub_800B138(void) +static void sub_800B138(void) { LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0); FillWindowPixelBuffer(1, 0x00); @@ -1760,3 +1760,28 @@ static void sub_800B1A0(void) gMain.state ++; } } + +bool8 sub_800B2E8(void) +{ + return (REG_SIOCNT & 0x04) != 0; +} + +bool8 sub_800B2F8(void) +{ + return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04); +} + +bool8 sub_800B320(void) +{ + return EXTRACT_CONN_ESTABLISHED(gLinkStatus); +} + +void SetSuppressLinkErrorMessage(bool8 flag) +{ + gSuppressLinkErrorMessage = flag; +} + +bool8 sub_800B33C(void) +{ + return gLinkErrorOccurred; +} -- cgit v1.2.3 From abec2b934054e21149bd7c0cb802875f9071c172 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 00:31:27 -0500 Subject: through sub_800B3A4 --- src/link.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 71efbf358..af31b37f6 100644 --- a/src/link.c +++ b/src/link.c @@ -1785,3 +1785,30 @@ bool8 sub_800B33C(void) { return gLinkErrorOccurred; } + +void sub_800B348(void) +{ + struct LinkPlayerBlock *block; + + InitLocalLinkPlayer(); + block = &gLocalLinkPlayerBlock; + block->linkPlayer = gLocalLinkPlayer; + memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1); + memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1); + memcpy(gBlockSendBuffer, block, sizeof(*block)); +} + +void sub_800B3A4(u8 who) +{ + struct LinkPlayerBlock *block; + struct LinkPlayer *player; + + block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who]; + player = &gLinkPlayers[who]; + *player = block->linkPlayer; + sub_800B524(player); + if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 || strcmp(block->magic2, gASCIIGameFreakInc) != 0) + { + SetMainCallback2(CB2_LinkError); + } +} -- cgit v1.2.3 From 7e4cb5f332de1d72fc57be82f4eca0ecd5db5f8d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 01:01:27 -0500 Subject: HandleLinkConnection --- src/link.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index af31b37f6..ecaeafd97 100644 --- a/src/link.c +++ b/src/link.c @@ -152,6 +152,7 @@ static void sub_800AE5C(void); static void sub_800AEB4(void); static void sub_800B1A0(void); u8 sub_800B2F8(void); +u32 sub_800B638(bool8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[8]); void sub_800B4A4(void); void DisableSerial(void); void EnableSerial(void); @@ -1812,3 +1813,32 @@ void sub_800B3A4(u8 who) SetMainCallback2(CB2_LinkError); } } + +bool8 HandleLinkConnection(void) +{ + bool32 r4; + bool32 r5; + + if (gWirelessCommType == 0) + { + gLinkStatus = sub_800B638(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); + LinkMain2(&gMain.heldKeys); + if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && sub_808766C() == TRUE) + { + return TRUE; + } + } + else + { + r4 = sub_8010EC0(); + r5 = sub_8010F1C(); + if (sub_808766C() == TRUE) + { + if (r4 == TRUE || sub_800F0B8() || r5) + { + return TRUE; + } + } + } + return FALSE; +} -- cgit v1.2.3 From 515459d151bcc9b4f046a93a77e8e9412a2f2ca4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 01:04:31 -0500 Subject: through sub_800B4C0 --- src/link.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index ecaeafd97..44d96937e 100644 --- a/src/link.c +++ b/src/link.c @@ -151,9 +151,9 @@ static void sub_800AE30(void); static void sub_800AE5C(void); static void sub_800AEB4(void); static void sub_800B1A0(void); -u8 sub_800B2F8(void); +static bool8 sub_800B2F8(void); u32 sub_800B638(bool8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[8]); -void sub_800B4A4(void); +static void sub_800B4A4(void); void DisableSerial(void); void EnableSerial(void); @@ -1767,7 +1767,7 @@ bool8 sub_800B2E8(void) return (REG_SIOCNT & 0x04) != 0; } -bool8 sub_800B2F8(void) +static bool8 sub_800B2F8(void) { return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04); } @@ -1842,3 +1842,27 @@ bool8 HandleLinkConnection(void) } return FALSE; } + +void sub_800B488(void) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + gWirelessCommType = 1; + } +} + +static void sub_800B4A4(void) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + gWirelessCommType = 0; + } +} + +void sub_800B4C0(void) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + gWirelessCommType = 0; + } +} -- cgit v1.2.3 From fcb8c8cf32f424bf83c8e95555ac41598e71104c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 01:12:34 -0500 Subject: through sub_800B524 --- src/link.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 44d96937e..266c7109d 100644 --- a/src/link.c +++ b/src/link.c @@ -1866,3 +1866,32 @@ void sub_800B4C0(void) gWirelessCommType = 0; } } + +u32 sub_800B4DC(void) +{ + if (gWirelessCommType != 0) + { + return sub_80124D4(); + } + return gLink.recvQueue.count; +} + +bool8 sub_800B504(void) +{ + if (sub_800B4DC() > 2) + { + return TRUE; + } + return FALSE; +} + +u8 sub_800B518(void) +{ + return gWirelessCommType; +} + +void sub_800B524(struct LinkPlayer *player) +{ + player->name[10] = player->name[8]; + ConvertInternationalString(player->name, player->language); +} -- cgit v1.2.3 From 910c39d4ef3fbb752188b83b565effce14136ddf Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 01:20:38 -0500 Subject: DisableSerial --- src/link.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 266c7109d..3839a0194 100644 --- a/src/link.c +++ b/src/link.c @@ -1895,3 +1895,14 @@ void sub_800B524(struct LinkPlayer *player) player->name[10] = player->name[8]; ConvertInternationalString(player->name, player->language); } + +void DisableSerial(void) +{ + DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + REG_SIOCNT = SIO_MULTI_MODE; + REG_TMCNT_H(3) = 0; + REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; + REG_SIOMLT_SEND = 0; + REG_SIOMLT_RECV = 0; + CpuFill32(0, &gLink, sizeof(gLink)); +} -- cgit v1.2.3 From 2be3083b3ee71e2287d4ecc6d3b8b9b3558b8740 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 01:24:28 -0500 Subject: through ResetSerial --- src/link.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 3839a0194..3da48a951 100644 --- a/src/link.c +++ b/src/link.c @@ -1906,3 +1906,27 @@ void DisableSerial(void) REG_SIOMLT_RECV = 0; CpuFill32(0, &gLink, sizeof(gLink)); } + +void EnableSerial(void) +{ + DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + REG_RCNT = 0; + REG_SIOCNT = SIO_MULTI_MODE; + REG_SIOCNT |= SIO_115200_BPS | SIO_INTR_ENABLE; + EnableInterrupts(INTR_FLAG_SERIAL); + REG_SIOMLT_SEND = 0; + CpuFill32(0, &gLink, sizeof(gLink)); + gUnknown_03000D6C = 0; + gUnknown_03000D6E = 0; + gUnknown_03000D70 = 0; + gUnknown_03000D72 = 0; + gUnknown_03000D73 = 0; + gLastSendQueueCount = 0; + gLastRecvQueueCount = 0; +} + +void ResetSerial(void) +{ + EnableSerial(); + DisableSerial(); +} -- cgit v1.2.3 From c81d50cb2f57eb7d3121e71552c196f5867674cb Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 13 Nov 2017 01:46:22 -0500 Subject: LinkMain1 --- src/link.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 124 insertions(+), 23 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 3da48a951..3adfc1b76 100644 --- a/src/link.c +++ b/src/link.c @@ -78,7 +78,7 @@ bool8 gUnknown_03003078[MAX_LINK_PLAYERS]; u8 gUnknown_0300307C[MAX_LINK_PLAYERS]; u32 gFiller_03003080; u16 gLinkHeldKeys; -u16 gRecvCmds[MAX_RFU_PLAYERS][8]; +u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; u32 gLinkStatus; bool8 gUnknown_030030E4; bool8 gUnknown_030030E8; @@ -88,12 +88,12 @@ u16 gUnknown_030030F4; u8 gSuppressLinkErrorMessage; bool8 gWirelessCommType; bool8 gSavedLinkPlayerCount; -u16 gSendCmd[8]; +u16 gSendCmd[CMD_LENGTH]; u8 gSavedMultiplayerId; bool8 gReceivedRemoteLinkPlayers; struct LinkTestBGInfo gLinkTestBGInfo; void (*gLinkCallback)(void); -bool8 gShouldAdvanceLinkState; +u8 gShouldAdvanceLinkState; u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; u8 gBlockRequestType; u32 gFiller_03003154; @@ -149,14 +149,19 @@ static void sub_800AD5C(void); static void sub_800AD88(void); static void sub_800AE30(void); static void sub_800AE5C(void); -static void sub_800AEB4(void); -static void sub_800B1A0(void); -static bool8 sub_800B2F8(void); -u32 sub_800B638(bool8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[8]); +static void CheckErrorStatus(void); +static void CB2_PrintErrorMessage(void); +static bool8 IsSioMultiMaster(void); +u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH]); static void sub_800B4A4(void); void DisableSerial(void); void EnableSerial(void); +void sub_800B764(void); +void sub_800B790(void); +void sub_800B7C0(u16 *queue); +void sub_800B8A8(u16 (*queue)[CMD_LENGTH]); + // .rodata ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); @@ -334,7 +339,7 @@ void Task_TriggerHandshake(u8 taskId) { if (++ gTasks[taskId].data[0] == 5) { - gShouldAdvanceLinkState = TRUE; + gShouldAdvanceLinkState = 1; DestroyTask(taskId); } } @@ -424,7 +429,7 @@ void LinkTestProcessKeyInput(void) { if (gMain.newKeys & A_BUTTON) { - gShouldAdvanceLinkState = TRUE; + gShouldAdvanceLinkState = 1; } if (gMain.heldKeys & B_BUTTON) { @@ -482,7 +487,7 @@ u16 LinkMain2(const u16 *heldKeys) { gLinkCallback(); } - sub_800AEB4(); + CheckErrorStatus(); } return gLinkStatus; } @@ -1134,7 +1139,7 @@ void sub_800A620(void) { if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) { - gShouldAdvanceLinkState = TRUE; + gShouldAdvanceLinkState = 1; } } @@ -1261,10 +1266,10 @@ static void Task_PrintTestData(u8 taskId) LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2); LinkTest_prnthex(gLinkDebugSeed, 2, 12, 8); LinkTest_prnthex(gLinkDebugFlags, 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); + LinkTest_prnthex(GetSioMultiSI(), 25, 5, 1); + LinkTest_prnthex(IsSioMultiMaster(), 25, 6, 1); + LinkTest_prnthex(IsLinkConnectionEstablished(), 25, 7, 1); + LinkTest_prnthex(HasLinkErrorOccurred(), 25, 8, 1); for (i = 0; i < MAX_LINK_PLAYERS; i++) { LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); @@ -1588,7 +1593,7 @@ static void sub_800AE5C(void) } } -static void sub_800AEB4(void) +static void CheckErrorStatus(void) { if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus)) { @@ -1660,7 +1665,7 @@ void CB2_LinkError(void) AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); - SetMainCallback2(sub_800B1A0); + SetMainCallback2(CB2_PrintErrorMessage); } } @@ -1693,7 +1698,7 @@ static void sub_800B138(void) CopyWindowToVram(2, 3); } -static void sub_800B1A0(void) +static void CB2_PrintErrorMessage(void) { switch (gMain.state) { @@ -1762,17 +1767,17 @@ static void sub_800B1A0(void) } } -bool8 sub_800B2E8(void) +bool8 GetSioMultiSI(void) { return (REG_SIOCNT & 0x04) != 0; } -static bool8 sub_800B2F8(void) +static bool8 IsSioMultiMaster(void) { return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04); } -bool8 sub_800B320(void) +bool8 IsLinkConnectionEstablished(void) { return EXTRACT_CONN_ESTABLISHED(gLinkStatus); } @@ -1782,7 +1787,7 @@ void SetSuppressLinkErrorMessage(bool8 flag) gSuppressLinkErrorMessage = flag; } -bool8 sub_800B33C(void) +bool8 HasLinkErrorOccurred(void) { return gLinkErrorOccurred; } @@ -1821,7 +1826,7 @@ bool8 HandleLinkConnection(void) if (gWirelessCommType == 0) { - gLinkStatus = sub_800B638(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); + gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); LinkMain2(&gMain.heldKeys); if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && sub_808766C() == TRUE) { @@ -1930,3 +1935,99 @@ void ResetSerial(void) EnableSerial(); DisableSerial(); } + +u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH]) +{ + u32 retVal; + u32 retVal2; + + switch (gLink.state) + { + case LINK_STATE_START0: + DisableSerial(); + gLink.state = 1; + break; + case LINK_STATE_START1: + if (*shouldAdvanceLinkState == 1) + { + EnableSerial(); + gLink.state = 2; + } + break; + case LINK_STATE_HANDSHAKE: + switch (*shouldAdvanceLinkState) + { + default: + sub_800B764(); + break; + case 1: + if (gLink.isMaster == 8 && gLink.playerCount > 1) + { + gLink.handshakeAsMaster = TRUE; + } + break; + case 2: + gLink.state = LINK_STATE_START0; + REG_SIOMLT_SEND = 0; + break; + } + break; + case LINK_STATE_INIT_TIMER: + sub_800B790(); + gLink.state = LINK_STATE_CONN_ESTABLISHED; + // fallthrough + case LINK_STATE_CONN_ESTABLISHED: + sub_800B7C0(sendCmd); + sub_800B8A8(recvCmds); + break; + } + *shouldAdvanceLinkState = 0; + retVal = gLink.localId; + retVal |= (gLink.playerCount << 2); + if (gLink.isMaster == 8) + { + retVal |= 0x20; + } + { + u32 receivedNothing = gLink.receivedNothing << 8; + u32 link_field_F = gLink.link_field_F << 9; + u32 hardwareError = gLink.hardwareError << 12; + u32 badChecksum = gLink.badChecksum << 13; + u32 queueFull = gLink.queueFull << 14; + u32 val; + + if (gLink.state == LINK_STATE_CONN_ESTABLISHED) + { + val = 0x40; + val |= receivedNothing; + val |= retVal; + val |= link_field_F; + val |= hardwareError; + val |= badChecksum; + val |= queueFull; + } + else + { + val = retVal; + val |= receivedNothing; + val |= link_field_F; + val |= hardwareError; + val |= badChecksum; + val |= queueFull; + } + + retVal = val; + } + + if (gLink.lag == LAG_MASTER) + retVal |= 0x10000; + + if (gLink.localId > 3) + retVal |= 0x20000; + + retVal2 = retVal; + if (gLink.lag == LAG_SLAVE) + retVal2 |= 0x40000; + + return retVal2; +} -- cgit v1.2.3 From 6f8da5dcb66d16954800c73a67b3cd06f8ac0702 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 14 Nov 2017 08:31:37 -0500 Subject: through DequeueRecvCmd --- src/link.c | 313 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 209 insertions(+), 104 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 3adfc1b76..eb6d573d5 100644 --- a/src/link.c +++ b/src/link.c @@ -62,20 +62,20 @@ 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; +IWRAM_DATA u16 sSendNonzeroCheck; IWRAM_DATA u16 gUnknown_03000D70; IWRAM_DATA u8 gUnknown_03000D72; IWRAM_DATA u8 gUnknown_03000D73; IWRAM_DATA u8 gUnknown_03000D74; -u16 gUnknown_03003020[6]; +u16 gLinkPartnersHeldKeys[6]; u32 gLinkDebugSeed; struct LinkPlayerBlock gLocalLinkPlayerBlock; bool8 gLinkErrorOccurred; u32 gLinkDebugFlags; -u32 gUnknown_03003074; -bool8 gUnknown_03003078[MAX_LINK_PLAYERS]; -u8 gUnknown_0300307C[MAX_LINK_PLAYERS]; +u32 gFiller_03003074; +bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS]; +u8 gBlockReceivedStatus[MAX_LINK_PLAYERS]; u32 gFiller_03003080; u16 gLinkHeldKeys; u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH]; @@ -102,7 +102,7 @@ u32 gFiller_0300315c; u8 gLastSendQueueCount; struct Link gLink; u8 gLastRecvQueueCount; -u16 gUnknown_03004134; +u16 gLinkSavedIme; u32 gFiller_03004138; u32 gFiller_0300413C; @@ -128,8 +128,8 @@ EWRAM_DATA void *gUnknown_02022B0C = NULL; // Static ROM declarations -void InitLocalLinkPlayer(void); -void sub_80096BC(void); +static void InitLocalLinkPlayer(void); +static void sub_80096BC(void); static void CB2_LinkTest(void); static void ProcessRecvCmds(u8 unused); static void sub_8009F70(void); @@ -152,15 +152,13 @@ static void sub_800AE5C(void); static void CheckErrorStatus(void); static void CB2_PrintErrorMessage(void); static bool8 IsSioMultiMaster(void); -u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH]); static void sub_800B4A4(void); -void DisableSerial(void); -void EnableSerial(void); - -void sub_800B764(void); -void sub_800B790(void); -void sub_800B7C0(u16 *queue); -void sub_800B8A8(u16 (*queue)[CMD_LENGTH]); +static void DisableSerial(void); +static void EnableSerial(void); +static void CheckMasterOrSlave(void); +static void InitTimer(void); +static void EnqueueSendCmd(u16 *sendCmd); +static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]); // .rodata @@ -300,7 +298,7 @@ void sub_8009628(u8 a0) gLocalLinkPlayer.lp_field_18 = a0; } -void InitLocalLinkPlayer(void) +static void InitLocalLinkPlayer(void) { gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName); @@ -316,14 +314,14 @@ void InitLocalLinkPlayer(void) } } -void sub_80096BC(void) +static void sub_80096BC(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -void InitLink(void) +static void InitLink(void) { int i; @@ -335,7 +333,7 @@ void InitLink(void) EnableSerial(); } -void Task_TriggerHandshake(u8 taskId) +static void Task_TriggerHandshake(u8 taskId) { if (++ gTasks[taskId].data[0] == 5) { @@ -371,7 +369,7 @@ void OpenLink(void) gReceivedRemoteLinkPlayers = 0; for (i = 0; i < MAX_LINK_PLAYERS; i ++) { - gUnknown_03003078[i] = TRUE; + gRemoteLinkPlayersNotReceived[i] = TRUE; gUnknown_030030F0[i] = FALSE; gUnknown_030030EC[i] = FALSE; } @@ -425,7 +423,7 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used) } } -void LinkTestProcessKeyInput(void) +static void LinkTestProcessKeyInput(void) { if (gMain.newKeys & A_BUTTON) { @@ -492,16 +490,16 @@ u16 LinkMain2(const u16 *heldKeys) return gLinkStatus; } -void HandleReceiveRemoteLinkPlayer(u8 who) +static void HandleReceiveRemoteLinkPlayer(u8 who) { int i; int count; count = 0; - gUnknown_03003078[who] = FALSE; + gRemoteLinkPlayersNotReceived[who] = FALSE; for (i = 0; i < GetLinkPlayerCount_2(); i ++) { - count += gUnknown_03003078[i]; + count += gRemoteLinkPlayersNotReceived[i]; } if (count == 0 && gReceivedRemoteLinkPlayers == 0) { @@ -515,14 +513,14 @@ static void ProcessRecvCmds(u8 unused) for (i = 0; i < MAX_LINK_PLAYERS; i ++) { - gUnknown_03003020[i] = 0; + gLinkPartnersHeldKeys[i] = 0; if (gRecvCmds[i][0] == 0) { continue; } switch (gRecvCmds[i][0]) { - case 0x2222: + case LINKCMD_SEND_LINK_TYPE: { struct LinkPlayerBlock *block; @@ -534,16 +532,16 @@ static void ProcessRecvCmds(u8 unused) InitBlockSend(block, sizeof(*block)); break; } - case 0x4444: - gUnknown_03003020[i] = gRecvCmds[i][1]; + case LINKCMD_SEND_HELD_KEYS: + gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; - case 0x5555: + case LINKCMD_0x5555: gUnknown_030030E8 = TRUE; break; - case 0x5566: + case LINKCMD_0x5566: gUnknown_030030E8 = TRUE; break; - case 0xBBBB: + case LINKCMD_INIT_BLOCK: { struct BlockTransfer *blockRecv; @@ -553,7 +551,7 @@ static void ProcessRecvCmds(u8 unused) blockRecv->multiplayerId = gRecvCmds[i][2]; break; } - case 0x8888: + case LINKCMD_CONT_BLOCK: { if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) { @@ -580,7 +578,7 @@ static void ProcessRecvCmds(u8 unused) if (sBlockRecv[i].pos >= sBlockRecv[i].size) { - if (gUnknown_03003078[i] == TRUE) + if (gRemoteLinkPlayersNotReceived[i] == TRUE) { struct LinkPlayerBlock *block; struct LinkPlayer *linkPlayer; @@ -612,87 +610,87 @@ static void ProcessRecvCmds(u8 unused) } } break; - case 0x5FFF: + case LINKCMD_0x5FFF: gUnknown_030030F0[i] = TRUE; break; - case 0x2FFE: + case LINKCMD_0x2FFE: gUnknown_030030EC[i] = TRUE; break; - case 0xAAAA: + case LINKCMD_0xAAAA: sub_800A418(); break; - case 0xCCCC: + case LINKCMD_0xCCCC: SendBlock(0, gUnknown_082ED1A8[gRecvCmds[i][1]].address, gUnknown_082ED1A8[gRecvCmds[i][1]].size); break; - case 0xCAFE: - gUnknown_03003020[i] = gRecvCmds[i][1]; + case LINKCMD_SEND_HELD_KEYS_2: + gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; } } } -void BuildSendCmd(u16 command) +static void BuildSendCmd(u16 command) { switch (command) { - case 0x2222: - gSendCmd[0] = 0x2222; + case LINKCMD_SEND_LINK_TYPE: + gSendCmd[0] = LINKCMD_SEND_LINK_TYPE; gSendCmd[1] = gLinkType; break; - case 0x2ffe: - gSendCmd[0] = 0x2ffe; + case LINKCMD_0x2FFE: + gSendCmd[0] = LINKCMD_0x2FFE; break; - case 0x4444: - gSendCmd[0] = 0x4444; + case LINKCMD_SEND_HELD_KEYS: + gSendCmd[0] = LINKCMD_SEND_HELD_KEYS; gSendCmd[1] = gMain.heldKeys; break; - case 0x5555: - gSendCmd[0] = 0x5555; + case LINKCMD_0x5555: + gSendCmd[0] = LINKCMD_0x5555; break; - case 0x6666: - gSendCmd[0] = 0x6666; + case LINKCMD_0x6666: + gSendCmd[0] = LINKCMD_0x6666; gSendCmd[1] = 0; break; - case 0x7777: + case LINKCMD_0x7777: { u8 i; - gSendCmd[0] = 0x7777; + gSendCmd[0] = LINKCMD_0x7777; for (i = 0; i < 5; i ++) { gSendCmd[i + 1] = 0xEE; } break; } - case 0xbbbb: - gSendCmd[0] = 0xbbbb; + case LINKCMD_INIT_BLOCK: + gSendCmd[0] = LINKCMD_INIT_BLOCK; gSendCmd[1] = sBlockSend.size; gSendCmd[2] = sBlockSend.multiplayerId + 0x80; break; - case 0xaaaa: - gSendCmd[0] = 0xaaaa; + case LINKCMD_0xAAAA: + gSendCmd[0] = LINKCMD_0xAAAA; break; - case 0xaaab: - gSendCmd[0] = 0xaaab; + case LINKCMD_0xAAAB: + gSendCmd[0] = LINKCMD_0xAAAB; gSendCmd[1] = gScriptItemId; break; - case 0xcccc: - gSendCmd[0] = 0xcccc; + case LINKCMD_0xCCCC: + gSendCmd[0] = LINKCMD_0xCCCC; gSendCmd[1] = gBlockRequestType; break; - case 0x5fff: - gSendCmd[0] = 0x5fff; + case LINKCMD_0x5FFF: + gSendCmd[0] = LINKCMD_0x5FFF; gSendCmd[1] = gUnknown_030030F4; break; - case 0x5566: - gSendCmd[0] = 0x5566; + case LINKCMD_0x5566: + gSendCmd[0] = LINKCMD_0x5566; break; - case 0xcafe: + case LINKCMD_SEND_HELD_KEYS_2: if (gUnknown_03005DA8 == 0 || gLinkTransferringData) { break; } - gSendCmd[0] = 0xcafe; + gSendCmd[0] = LINKCMD_SEND_HELD_KEYS_2; gSendCmd[1] = gUnknown_03005DA8; break; } @@ -724,7 +722,7 @@ static void sub_8009F70(void) { if (gReceivedRemoteLinkPlayers == TRUE) { - BuildSendCmd(0xcafe); + BuildSendCmd(LINKCMD_SEND_HELD_KEYS_2); } } @@ -761,7 +759,7 @@ u8 GetLinkPlayerCount(void) return EXTRACT_PLAYER_COUNT(gLinkStatus); } -int sub_8009FF8(u32 version1, u32 version2) +static int sub_8009FF8(u32 version1, u32 version2) { int i; u8 nPlayers; @@ -964,7 +962,7 @@ static bool32 InitBlockSend(const void *src, size_t size) } sBlockSend.src = gBlockSendBuffer; } - BuildSendCmd(0xbbbb); + BuildSendCmd(LINKCMD_INIT_BLOCK); gLinkCallback = LinkCB_BlockSendBegin; sBlockSendDelayCounter = 0; return TRUE; @@ -984,7 +982,7 @@ static void LinkCB_BlockSend(void) const u8 *src; src = sBlockSend.src; - gSendCmd[0] = 0x8888; + gSendCmd[0] = LINKCMD_CONT_BLOCK; for (i = 0; i < 7; i ++) { gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2]; @@ -1005,7 +1003,7 @@ static void LinkCB_BlockSendEnd(void) static void sub_800A3F8(void) { GetMultiplayerId(); - BuildSendCmd(0x4444); + BuildSendCmd(LINKCMD_SEND_HELD_KEYS); gUnknown_020223C0 ++; } @@ -1029,7 +1027,7 @@ u32 sub_800A44C(void) void sub_800A458(void) { - BuildSendCmd(0xaaaa); + BuildSendCmd(LINKCMD_0xAAAA); } u8 GetMultiplayerId(void) @@ -1067,7 +1065,7 @@ bool8 sub_800A4D8(u8 a0) if (gLinkCallback == NULL) { gBlockRequestType = a0; - BuildSendCmd(0xcccc); + BuildSendCmd(LINKCMD_0xCCCC); return TRUE; } return FALSE; @@ -1088,7 +1086,7 @@ u8 GetBlockReceivedStatus(void) { return sub_800FCD8(); } - return (gUnknown_0300307C[3] << 3) | (gUnknown_0300307C[2] << 2) | (gUnknown_0300307C[1] << 1) | (gUnknown_0300307C[0] << 0); + return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0); } static void SetBlockReceivedFlag(u8 who) @@ -1099,7 +1097,7 @@ static void SetBlockReceivedFlag(u8 who) } else { - gUnknown_0300307C[who] = TRUE; + gBlockReceivedStatus[who] = TRUE; } } @@ -1118,7 +1116,7 @@ void ResetBlockReceivedFlags(void) { for (i = 0; i < MAX_LINK_PLAYERS; i ++) { - gUnknown_0300307C[i] = FALSE; + gBlockReceivedStatus[i] = FALSE; } } } @@ -1129,9 +1127,9 @@ void ResetBlockReceivedFlag(u8 who) { sub_800F728(who); } - else if (gUnknown_0300307C[who]) + else if (gBlockReceivedStatus[who]) { - gUnknown_0300307C[who] = FALSE; + gBlockReceivedStatus[who] = FALSE; } } @@ -1244,7 +1242,7 @@ static void LinkCB_RequestPlayerDataExchange(void) { if (gLinkStatus & LINK_STAT_MASTER) { - BuildSendCmd(0x2222); + BuildSendCmd(LINKCMD_SEND_LINK_TYPE); } gLinkCallback = NULL; } @@ -1456,7 +1454,7 @@ static void sub_800AC80(void) { if (gLastRecvQueueCount == 0) { - BuildSendCmd(0x5fff); + BuildSendCmd(LINKCMD_0x5FFF); gLinkCallback = sub_800ACAC; } } @@ -1511,7 +1509,7 @@ static void sub_800AD5C(void) { if (gLastRecvQueueCount == 0) { - BuildSendCmd(0x5fff); + BuildSendCmd(LINKCMD_0x5FFF); gLinkCallback = sub_800AD88; } } @@ -1565,7 +1563,7 @@ static void sub_800AE30(void) { if (gLastRecvQueueCount == 0) { - BuildSendCmd(0x2ffe); + BuildSendCmd(LINKCMD_0x2FFE); gLinkCallback = sub_800AE5C; } } @@ -1901,7 +1899,7 @@ void sub_800B524(struct LinkPlayer *player) ConvertInternationalString(player->name, player->language); } -void DisableSerial(void) +static void DisableSerial(void) { DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); REG_SIOCNT = SIO_MULTI_MODE; @@ -1912,7 +1910,7 @@ void DisableSerial(void) CpuFill32(0, &gLink, sizeof(gLink)); } -void EnableSerial(void) +static void EnableSerial(void) { DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); REG_RCNT = 0; @@ -1922,7 +1920,7 @@ void EnableSerial(void) REG_SIOMLT_SEND = 0; CpuFill32(0, &gLink, sizeof(gLink)); gUnknown_03000D6C = 0; - gUnknown_03000D6E = 0; + sSendNonzeroCheck = 0; gUnknown_03000D70 = 0; gUnknown_03000D72 = 0; gUnknown_03000D73 = 0; @@ -1958,10 +1956,10 @@ u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENG switch (*shouldAdvanceLinkState) { default: - sub_800B764(); + CheckMasterOrSlave(); break; case 1: - if (gLink.isMaster == 8 && gLink.playerCount > 1) + if (gLink.isMaster == LINK_MASTER && gLink.playerCount > 1) { gLink.handshakeAsMaster = TRUE; } @@ -1973,32 +1971,32 @@ u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENG } break; case LINK_STATE_INIT_TIMER: - sub_800B790(); + InitTimer(); gLink.state = LINK_STATE_CONN_ESTABLISHED; // fallthrough case LINK_STATE_CONN_ESTABLISHED: - sub_800B7C0(sendCmd); - sub_800B8A8(recvCmds); + EnqueueSendCmd(sendCmd); + DequeueRecvCmds(recvCmds); break; } *shouldAdvanceLinkState = 0; retVal = gLink.localId; - retVal |= (gLink.playerCount << 2); - if (gLink.isMaster == 8) + retVal |= (gLink.playerCount << LINK_STAT_PLAYER_COUNT_SHIFT); + if (gLink.isMaster == LINK_MASTER) { - retVal |= 0x20; + retVal |= LINK_STAT_MASTER; } { - u32 receivedNothing = gLink.receivedNothing << 8; - u32 link_field_F = gLink.link_field_F << 9; - u32 hardwareError = gLink.hardwareError << 12; - u32 badChecksum = gLink.badChecksum << 13; - u32 queueFull = gLink.queueFull << 14; + u32 receivedNothing = gLink.receivedNothing << LINK_STAT_RECEIVED_NOTHING_SHIFT; + u32 link_field_F = gLink.link_field_F << LINK_STAT_UNK_FLAG_9_SHIFT; + u32 hardwareError = gLink.hardwareError << LINK_STAT_ERROR_HARDWARE_SHIFT; + u32 badChecksum = gLink.badChecksum << LINK_STAT_ERROR_CHECKSUM_SHIFT; + u32 queueFull = gLink.queueFull << LINK_STAT_ERROR_QUEUE_FULL_SHIFT; u32 val; if (gLink.state == LINK_STATE_CONN_ESTABLISHED) { - val = 0x40; + val = LINK_STAT_CONN_ESTABLISHED; val |= receivedNothing; val |= retVal; val |= link_field_F; @@ -2020,14 +2018,121 @@ u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENG } if (gLink.lag == LAG_MASTER) - retVal |= 0x10000; + { + retVal |= LINK_STAT_ERROR_LAG_MASTER; + } - if (gLink.localId > 3) - retVal |= 0x20000; + if (gLink.localId >= MAX_LINK_PLAYERS) + { + retVal |= LINK_STAT_ERROR_INVALID_ID; + } retVal2 = retVal; if (gLink.lag == LAG_SLAVE) - retVal2 |= 0x40000; + { + retVal2 |= LINK_STAT_ERROR_LAG_SLAVE; + } return retVal2; } + +static void CheckMasterOrSlave(void) +{ + u32 terminals; + + terminals = *(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI); + if (terminals == SIO_MULTI_SD && gLink.localId == 0) + { + gLink.isMaster = LINK_MASTER; + } + else + { + gLink.isMaster = LINK_SLAVE; + } +} + +static void InitTimer(void) +{ + if (gLink.isMaster) + { + REG_TM3CNT_L = 0xFF3B; + REG_TM3CNT_H = TIMER_64CLK | TIMER_INTR_ENABLE; + EnableInterrupts(INTR_FLAG_TIMER3); + } +} + +static void EnqueueSendCmd(u16 *sendCmd) +{ + u8 i; + u8 offset; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + if (gLink.sendQueue.count < QUEUE_CAPACITY) + { + offset = gLink.sendQueue.pos + gLink.sendQueue.count; + if (offset >= QUEUE_CAPACITY) + { + offset -= QUEUE_CAPACITY; + } + for (i = 0; i < CMD_LENGTH; i ++) + { + sSendNonzeroCheck |= *sendCmd; + gLink.sendQueue.data[i][offset] = *sendCmd; + *sendCmd = 0; + sendCmd++; + } + } + else + { + gLink.queueFull = QUEUE_FULL_SEND; + } + if (sSendNonzeroCheck) + { + gLink.sendQueue.count ++; + sSendNonzeroCheck = 0; + } + REG_IME = gLinkSavedIme; + gLastSendQueueCount = gLink.sendQueue.count; +} + + +static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]) +{ + u8 i; + u8 j; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + if (gLink.recvQueue.count == 0) + { + for (i = 0; i < gLink.playerCount; i ++) + { + for (j = 0; j < CMD_LENGTH; j ++) + { + recvCmds[i][j] = 0; + } + } + + gLink.receivedNothing = TRUE; + } + else + { + for (i = 0; i < gLink.playerCount; i ++) + { + for (j = 0; j < CMD_LENGTH; j ++) + { + recvCmds[i][j] = gLink.recvQueue.data[i][j][gLink.recvQueue.pos]; + } + } + gLink.recvQueue.count --; + gLink.recvQueue.pos ++; + if (gLink.recvQueue.pos >= QUEUE_CAPACITY) + { + gLink.recvQueue.pos = 0; + } + gLink.receivedNothing = FALSE; + } + REG_IME = gLinkSavedIme; +} + -- cgit v1.2.3 From 3bb450645b65fee8a901521d148ab87f81f8f20b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 14 Nov 2017 08:44:32 -0500 Subject: LinkVSync --- src/link.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'src/link.c') 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; + } + } + } +} + -- cgit v1.2.3 From 50501396b21bf132cf71d0f5d353bf51d277ba27 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 15 Nov 2017 08:44:11 -0500 Subject: DoHandshake --- src/link.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 3 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index a57385a59..741f5f707 100644 --- a/src/link.c +++ b/src/link.c @@ -65,7 +65,7 @@ IWRAM_DATA bool8 gUnknown_03000D6D; IWRAM_DATA u16 sSendNonzeroCheck; IWRAM_DATA u16 gUnknown_03000D70; IWRAM_DATA u8 gUnknown_03000D72; -IWRAM_DATA u8 gUnknown_03000D73; +IWRAM_DATA u8 sHandshakePlayerCount; IWRAM_DATA u8 gUnknown_03000D74; u16 gLinkPartnersHeldKeys[6]; @@ -159,7 +159,12 @@ static void CheckMasterOrSlave(void); static void InitTimer(void); static void EnqueueSendCmd(u16 *sendCmd); static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]); -void StartTransfer(void); +static void StartTransfer(void); +static bool8 DoHandshake(void); +void DoRecv(void); +void DoSend(void); +void StopTimer(void); +void SendRecvDone(void); // .rodata @@ -1924,7 +1929,7 @@ static void EnableSerial(void) sSendNonzeroCheck = 0; gUnknown_03000D70 = 0; gUnknown_03000D72 = 0; - gUnknown_03000D73 = 0; + sHandshakePlayerCount = 0; gLastSendQueueCount = 0; gLastRecvQueueCount = 0; } @@ -2183,3 +2188,102 @@ void LinkVSync(void) } } +void Timer3Intr(void) +{ + StopTimer(); + StartTransfer(); +} + +void SerialCB(void) +{ + gLink.localId = SIO_MULTI_CNT->id; + switch (gLink.state) + { + case LINK_STATE_CONN_ESTABLISHED: + gLink.hardwareError = SIO_MULTI_CNT->error; + DoRecv(); + DoSend(); + SendRecvDone(); + break; + case LINK_STATE_HANDSHAKE: + if (DoHandshake()) + { + if (gLink.isMaster) + { + gLink.state = LINK_STATE_INIT_TIMER; + gLink.serialIntrCounter = 8; + } + else + { + gLink.state = LINK_STATE_CONN_ESTABLISHED; + } + } + break; + } + gLink.serialIntrCounter ++; + sNumVBlanksWithoutSerialIntr = 0; + if (gLink.serialIntrCounter == 8) + { + gLastRecvQueueCount = gLink.recvQueue.count; + } +} + +static void StartTransfer(void) +{ + REG_SIOCNT |= SIO_START; +} + +static bool8 DoHandshake(void) +{ + u8 i; + u8 playerCount; + u16 minRecv; + + playerCount = 0; + minRecv = 0xFFFF; + if (gLink.handshakeAsMaster == TRUE) + { + REG_SIOMLT_SEND = MASTER_HANDSHAKE; + } + else + { + REG_SIOMLT_SEND = SLAVE_HANDSHAKE; + } + *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV; + REG_SIOMLT_RECV = 0; + gLink.handshakeAsMaster = FALSE; + for (i = 0; i < 4; i ++) + { + if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) + { + playerCount ++; + if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) + { + minRecv = gLink.tempRecvBuffer[i]; + } + } + else + { + if (gLink.tempRecvBuffer[i] != 0xFFFF) + { + playerCount = 0; + } + break; + } + } + gLink.playerCount = playerCount; + if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) + { + return TRUE; + } + if (gLink.playerCount > 1) + { + gLink.link_field_F = (minRecv & 3) + 1; + } + else + { + gLink.link_field_F = 0; + } + sHandshakePlayerCount = gLink.playerCount; + return FALSE; +} -- cgit v1.2.3 From 2fd6aad25aa0157102e7c287e8a0b4d1605b8fa4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 16 Nov 2017 21:38:06 -0500 Subject: through SendRecvDone --- src/link.c | 257 +++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 183 insertions(+), 74 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 23ebdc01a..adb997511 100644 --- a/src/link.c +++ b/src/link.c @@ -61,10 +61,10 @@ IWRAM_DATA u32 gUnknown_03000D60; IWRAM_DATA u8 sLinkTestLastBlockSendPos; ALIGNED() IWRAM_DATA u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; IWRAM_DATA u8 sNumVBlanksWithoutSerialIntr; -IWRAM_DATA bool8 gUnknown_03000D6D; +IWRAM_DATA bool8 sSendBufferEmpty; IWRAM_DATA u16 sSendNonzeroCheck; -IWRAM_DATA u16 gUnknown_03000D70; -IWRAM_DATA u8 gUnknown_03000D72; +IWRAM_DATA u16 sRecvNonzeroCheck; +IWRAM_DATA u8 sChecksumAvailable; IWRAM_DATA u8 sHandshakePlayerCount; IWRAM_DATA u8 gUnknown_03000D74; @@ -161,10 +161,10 @@ static void EnqueueSendCmd(u16 *sendCmd); static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]); static void StartTransfer(void); static bool8 DoHandshake(void); -void DoRecv(void); -void DoSend(void); -void StopTimer(void); -void SendRecvDone(void); +static void DoRecv(void); +static void DoSend(void); +static void StopTimer(void); +static void SendRecvDone(void); // .rodata @@ -282,7 +282,7 @@ void LinkTestScreen(void) gLinkType = 0x1111; OpenLink(); SeedRng(gMain.vblankCounter2); - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256; } @@ -331,7 +331,7 @@ static void InitLink(void) { int i; - for (i = 0; i < 8; i ++) + for (i = 0; i < 8; i++) { gSendCmd[i] = 0xefff; } @@ -341,7 +341,7 @@ static void InitLink(void) static void Task_TriggerHandshake(u8 taskId) { - if (++ gTasks[taskId].data[0] == 5) + if (++gTasks[taskId].data[0] == 5) { gShouldAdvanceLinkState = 1; DestroyTask(taskId); @@ -373,7 +373,7 @@ void OpenLink(void) sub_800E700(); } gReceivedRemoteLinkPlayers = 0; - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { gRemoteLinkPlayersNotReceived[i] = TRUE; gUnknown_030030F0[i] = FALSE; @@ -402,7 +402,7 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used) LinkTest_prnthex(sBlockSend.pos, 2, 3, 2); sLinkTestLastBlockSendPos = sBlockSend.pos; } - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) { @@ -413,7 +413,7 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used) status = GetBlockReceivedStatus(); if (status == 0xF) // 0b1111 { - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { if ((status >> i) & 1) { @@ -479,7 +479,7 @@ u16 LinkMain2(const u16 *heldKeys) { return 0; } - for (i = 0; i < 8; i ++) + for (i = 0; i < 8; i++) { gSendCmd[i] = 0; } @@ -503,7 +503,7 @@ static void HandleReceiveRemoteLinkPlayer(u8 who) count = 0; gRemoteLinkPlayersNotReceived[who] = FALSE; - for (i = 0; i < GetLinkPlayerCount_2(); i ++) + for (i = 0; i < GetLinkPlayerCount_2(); i++) { count += gRemoteLinkPlayersNotReceived[i]; } @@ -517,7 +517,7 @@ static void ProcessRecvCmds(u8 unused) { u16 i; - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { gLinkPartnersHeldKeys[i] = 0; if (gRecvCmds[i][0] == 0) @@ -565,7 +565,7 @@ static void ProcessRecvCmds(u8 unused) u16 j; buffer = (u16 *)gDecompressionBuffer; - for (j = 0; j < CMD_LENGTH - 1; j ++) + for (j = 0; j < CMD_LENGTH - 1; j++) { buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; } @@ -574,7 +574,7 @@ static void ProcessRecvCmds(u8 unused) { u16 j; - for (j = 0; j < CMD_LENGTH - 1; j ++) + for (j = 0; j < CMD_LENGTH - 1; j++) { gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1]; } @@ -662,7 +662,7 @@ static void BuildSendCmd(u16 command) u8 i; gSendCmd[0] = LINKCMD_0x7777; - for (i = 0; i < 5; i ++) + for (i = 0; i < 5; i++) { gSendCmd[i + 1] = 0xEE; } @@ -771,7 +771,7 @@ static int sub_8009FF8(u32 version1, u32 version2) u8 nPlayers; nPlayers = GetLinkPlayerCount(); - for (i = 0; i < nPlayers; i ++) + for (i = 0; i < nPlayers; i++) { if ((gLinkPlayers[i].version & 0xFF) == version1 || (gLinkPlayers[i].version & 0xFF) == version2) { @@ -848,11 +848,11 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) gLinkErrorOccurred = TRUE; CloseLink(); } - for (i = 0, index = 0; i < GetLinkPlayerCount(); index ++, i ++) + for (i = 0, index = 0; i < GetLinkPlayerCount(); index++, i++) { if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) { - count ++; + count++; } } if (count == GetLinkPlayerCount()) @@ -889,7 +889,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper) } } } - else if (++ gLinkTimeOutCounter > 600) + else if (++gLinkTimeOutCounter > 600) { sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; } @@ -903,11 +903,11 @@ bool8 IsLinkPlayerDataExchangeComplete(void) bool8 retval; count = 0; - for (i = 0; i < GetLinkPlayerCount(); i ++) + for (i = 0; i < GetLinkPlayerCount(); i++) { if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) { - count ++; + count++; } } if (count == GetLinkPlayerCount()) @@ -932,7 +932,7 @@ void ResetLinkPlayers(void) { int i; - for (i = 0; i <= MAX_LINK_PLAYERS; i ++) + for (i = 0; i <= MAX_LINK_PLAYERS; i++) { gLinkPlayers[i] = (struct LinkPlayer){}; } @@ -976,7 +976,7 @@ static bool32 InitBlockSend(const void *src, size_t size) static void LinkCB_BlockSendBegin(void) { - if (++ sBlockSendDelayCounter > 2) + if (++sBlockSendDelayCounter > 2) { gLinkCallback = LinkCB_BlockSend; } @@ -989,7 +989,7 @@ static void LinkCB_BlockSend(void) src = sBlockSend.src; gSendCmd[0] = LINKCMD_CONT_BLOCK; - for (i = 0; i < 7; i ++) + for (i = 0; i < 7; i++) { gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2]; } @@ -1010,7 +1010,7 @@ static void sub_800A3F8(void) { GetMultiplayerId(); BuildSendCmd(LINKCMD_SEND_HELD_KEYS); - gUnknown_020223C0 ++; + gUnknown_020223C0++; } void sub_800A418(void) @@ -1113,14 +1113,14 @@ void ResetBlockReceivedFlags(void) if (gWirelessCommType == TRUE) { - for (i = 0; i < MAX_RFU_PLAYERS; i ++) + for (i = 0; i < MAX_RFU_PLAYERS; i++) { sub_800F728(i); } } else { - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { gBlockReceivedStatus[i] = FALSE; } @@ -1153,7 +1153,7 @@ static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size) u16 i; chksum = 0; - for (i = 0; i < size / 2; i ++) + for (i = 0; i < size / 2; i++) { chksum += src[i]; } @@ -1181,15 +1181,15 @@ static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2) char sp[32 / 2]; int i; - for (i = 0; i < a2; i ++) + for (i = 0; i < a2; i++) { sp[i] = pos & 0xf; pos >>= 4; } - for (i = a2 - 1; i >= 0; i --) + for (i = a2 - 1; i >= 0; i--) { LinkTest_prnthexchar(sp[i], a0, a1); - a0 ++; + a0++; } } @@ -1205,15 +1205,15 @@ static void LinkTest_prntint(int a0, u8 a1, u8 a2, u8 a3) sp10 = a1; a0 = -a0; } - for (i = 0; i < a3; i ++) + for (i = 0; i < a3; i++) { sp[i] = a0 % 10; a0 /= 10; } - for (i = a3 - 1; i >= 0; i --) + for (i = a3 - 1; i >= 0; i--) { LinkTest_prnthexchar(sp[i], a1, a2); - a1 ++; + a1++; } if (sp10 != -1) { @@ -1229,17 +1229,17 @@ static void LinkTest_prntstr(const char *a0, u8 a1, u8 a2) r5 = 0; r6 = 0; - for (i = 0; a0[i] != 0; a0 ++) + for (i = 0; a0[i] != 0; a0++) { if (a0[i] == *"\n") { - r5 ++; + r5++; r6 = 0; } else { LinkTest_prntchar(a0[i], a1 + r6, a2 + r5); - r6 ++; + r6++; } } } @@ -1292,7 +1292,7 @@ u8 sub_800A9A8(void) u8 flags; flags = 0; - for (i = 0; i < gSavedLinkPlayerCount; i ++) + for (i = 0; i < gSavedLinkPlayerCount; i++) { flags |= (1 << i); } @@ -1305,7 +1305,7 @@ u8 sub_800A9D8(void) u8 flags; flags = 0; - for (i = 0; i < GetLinkPlayerCount(); i ++) + for (i = 0; i < GetLinkPlayerCount(); i++) { flags |= (1 << i); } @@ -1318,7 +1318,7 @@ void sub_800AA04(u8 a0) gSavedLinkPlayerCount = a0; gSavedMultiplayerId = GetMultiplayerId(); - for (i = 0; i < MAX_RFU_PLAYERS; i ++) + for (i = 0; i < MAX_RFU_PLAYERS; i++) { gSavedLinkPlayers[i] = gLinkPlayers[i]; } @@ -1340,7 +1340,7 @@ bool8 sub_800AA60(void) unsigned count; count = 0; - for (i = 0; i < gSavedLinkPlayerCount; i ++) + for (i = 0; i < gSavedLinkPlayerCount; i++) { if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) { @@ -1348,12 +1348,12 @@ bool8 sub_800AA60(void) { if (gLinkType == gLinkPlayers[i].linkType) { - count ++; + count++; } } else { - count ++; + count++; } } } @@ -1372,7 +1372,7 @@ void sub_800AAF4(void) int i; // Clearly not what was meant to be written, but here it is anyway. - for (i = 0; i < 4; i ++) + for (i = 0; i < 4; i++) { CpuSet(&gSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer)); } @@ -1382,7 +1382,7 @@ void sub_800AB18(void) { u8 i; - for (i = 0; i < gSavedLinkPlayerCount; i ++) + for (i = 0; i < gSavedLinkPlayerCount; i++) { if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) { @@ -1445,7 +1445,7 @@ void sub_800AC34(void) { if (gLinkCallback != NULL) { - gUnknown_02022B08 ++; + gUnknown_02022B08++; } else { @@ -1473,11 +1473,11 @@ static void sub_800ACAC(void) linkPlayerCount = GetLinkPlayerCount(); count = 0; - for (i = 0; i < linkPlayerCount; i ++) + for (i = 0; i < linkPlayerCount; i++) { if (gUnknown_030030F0[i]) { - count ++; + count++; } } if (count == linkPlayerCount) @@ -1500,7 +1500,7 @@ void sub_800AD10(void) { if (gLinkCallback != NULL) { - gUnknown_02022B08 ++; + gUnknown_02022B08++; } else { @@ -1528,15 +1528,15 @@ static void sub_800AD88(void) linkPlayerCount = GetLinkPlayerCount(); count = 0; - for (i = 0; i < linkPlayerCount; i ++) + for (i = 0; i < linkPlayerCount; i++) { if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) { - count ++; + count++; } else if (gUnknown_030030F0[i]) { - count ++; + count++; } } if (count == linkPlayerCount) @@ -1580,7 +1580,7 @@ static void sub_800AE5C(void) u8 linkPlayerCount; linkPlayerCount = GetLinkPlayerCount(); - for (i = 0; i < linkPlayerCount; i ++) + for (i = 0; i < linkPlayerCount; i++) { if (!gUnknown_030030EC[i]) { @@ -1589,7 +1589,7 @@ static void sub_800AE5C(void) } if (i == linkPlayerCount) { - for (i = 0; i < MAX_LINK_PLAYERS; i ++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { gUnknown_030030EC[i] = FALSE; } @@ -1767,7 +1767,7 @@ static void CB2_PrintErrorMessage(void) } if (gMain.state != 160) { - gMain.state ++; + gMain.state++; } } @@ -1927,8 +1927,8 @@ static void EnableSerial(void) CpuFill32(0, &gLink, sizeof(gLink)); sNumVBlanksWithoutSerialIntr = 0; sSendNonzeroCheck = 0; - gUnknown_03000D70 = 0; - gUnknown_03000D72 = 0; + sRecvNonzeroCheck = 0; + sChecksumAvailable = 0; sHandshakePlayerCount = 0; gLastSendQueueCount = 0; gLastRecvQueueCount = 0; @@ -2061,7 +2061,7 @@ static void InitTimer(void) { if (gLink.isMaster) { - REG_TM3CNT_L = 0xFF3B; + REG_TM3CNT_L = -197; REG_TM3CNT_H = TIMER_64CLK | TIMER_INTR_ENABLE; EnableInterrupts(INTR_FLAG_TIMER3); } @@ -2081,7 +2081,7 @@ static void EnqueueSendCmd(u16 *sendCmd) { offset -= QUEUE_CAPACITY; } - for (i = 0; i < CMD_LENGTH; i ++) + for (i = 0; i < CMD_LENGTH; i++) { sSendNonzeroCheck |= *sendCmd; gLink.sendQueue.data[i][offset] = *sendCmd; @@ -2095,7 +2095,7 @@ static void EnqueueSendCmd(u16 *sendCmd) } if (sSendNonzeroCheck) { - gLink.sendQueue.count ++; + gLink.sendQueue.count++; sSendNonzeroCheck = 0; } REG_IME = gLinkSavedIme; @@ -2112,9 +2112,9 @@ static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]) REG_IME = 0; if (gLink.recvQueue.count == 0) { - for (i = 0; i < gLink.playerCount; i ++) + for (i = 0; i < gLink.playerCount; i++) { - for (j = 0; j < CMD_LENGTH; j ++) + for (j = 0; j < CMD_LENGTH; j++) { recvCmds[i][j] = 0; } @@ -2124,15 +2124,15 @@ static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]) } else { - for (i = 0; i < gLink.playerCount; i ++) + for (i = 0; i < gLink.playerCount; i++) { - for (j = 0; j < CMD_LENGTH; j ++) + for (j = 0; j < CMD_LENGTH; j++) { recvCmds[i][j] = gLink.recvQueue.data[i][j][gLink.recvQueue.pos]; } } - gLink.recvQueue.count --; - gLink.recvQueue.pos ++; + gLink.recvQueue.count--; + gLink.recvQueue.pos++; if (gLink.recvQueue.pos >= QUEUE_CAPACITY) { gLink.recvQueue.pos = 0; @@ -2142,6 +2142,8 @@ static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]) REG_IME = gLinkSavedIme; } +// link_intr.c + void LinkVSync(void) { if (gLink.isMaster) @@ -2173,7 +2175,7 @@ void LinkVSync(void) } else if (gLink.state == LINK_STATE_CONN_ESTABLISHED || gLink.state == LINK_STATE_HANDSHAKE) { - if (++ sNumVBlanksWithoutSerialIntr > 10) + if (++sNumVBlanksWithoutSerialIntr > 10) { if (gLink.state == LINK_STATE_CONN_ESTABLISHED) { @@ -2220,7 +2222,7 @@ void SerialCB(void) } break; } - gLink.serialIntrCounter ++; + gLink.serialIntrCounter++; sNumVBlanksWithoutSerialIntr = 0; if (gLink.serialIntrCounter == 8) { @@ -2252,11 +2254,11 @@ static bool8 DoHandshake(void) *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV; REG_SIOMLT_RECV = 0; gLink.handshakeAsMaster = FALSE; - for (i = 0; i < 4; i ++) + for (i = 0; i < 4; i++) { if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) { - playerCount ++; + playerCount++; if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) { minRecv = gLink.tempRecvBuffer[i]; @@ -2287,3 +2289,110 @@ static bool8 DoHandshake(void) sHandshakePlayerCount = gLink.playerCount; return FALSE; } + +static void DoRecv(void) +{ + u16 recv[4]; + u8 i; + u8 index; + + *(u64 *)recv = REG_SIOMLT_RECV; + if (gLink.sendCmdIndex == 0) + { + for (i = 0; i < gLink.playerCount; i++) + { + if (gLink.checksum != recv[i] && sChecksumAvailable) + { + gLink.badChecksum = TRUE; + } + } + gLink.checksum = 0; + sChecksumAvailable = TRUE; + } + else + { + index = gLink.recvQueue.pos + gLink.recvQueue.count; + if (index >= QUEUE_CAPACITY) + { + index -= QUEUE_CAPACITY; + } + if (gLink.recvQueue.count < QUEUE_CAPACITY) + { + for (i = 0; i < gLink.playerCount; i++) + { + gLink.checksum += recv[i]; + sRecvNonzeroCheck |= recv[i]; + gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recv[i]; + } + } + else + { + gLink.queueFull = QUEUE_FULL_RECV; + } + gLink.recvCmdIndex++; + if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck) + { + gLink.recvQueue.count++; + sRecvNonzeroCheck = 0; + } + } +} + +static void DoSend(void) +{ + if (gLink.sendCmdIndex == CMD_LENGTH) + { + REG_SIOMLT_SEND = gLink.checksum; + if (!sSendBufferEmpty) + { + gLink.sendQueue.count--; + gLink.sendQueue.pos++; + if (gLink.sendQueue.pos >= QUEUE_CAPACITY) + { + gLink.sendQueue.pos = 0; + } + } + else + { + sSendBufferEmpty = FALSE; + } + } + else + { + if (!sSendBufferEmpty && gLink.sendQueue.count == 0) + { + sSendBufferEmpty = TRUE; + } + if (sSendBufferEmpty) + { + REG_SIOMLT_SEND = 0; + } + else + { + REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos]; + } + gLink.sendCmdIndex++; + } +} + +static void StopTimer(void) +{ + if (gLink.isMaster) + { + REG_TM3CNT_H &= ~TIMER_ENABLE; + REG_TM3CNT_L = -197; + } +} + +static void SendRecvDone(void) +{ + if (gLink.recvCmdIndex == CMD_LENGTH) + { + gLink.sendCmdIndex = 0; + gLink.recvCmdIndex = 0; + } + else if (gLink.isMaster) + { + REG_TM3CNT_H |= TIMER_ENABLE; + } +} -- cgit v1.2.3 From cc37d7e15b5d5b23bc56bb8fc3787198db934757 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 16 Nov 2017 22:13:42 -0500 Subject: reset buffers --- src/link.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index adb997511..aa9e0a65d 100644 --- a/src/link.c +++ b/src/link.c @@ -1771,6 +1771,8 @@ static void CB2_PrintErrorMessage(void) } } +// TODO: there might be a file boundary here, let's name it + bool8 GetSioMultiSI(void) { return (REG_SIOCNT & 0x04) != 0; @@ -1940,6 +1942,8 @@ void ResetSerial(void) DisableSerial(); } +// link_main1.c + u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH]) { u32 retVal; @@ -2396,3 +2400,39 @@ static void SendRecvDone(void) REG_TM3CNT_H |= TIMER_ENABLE; } } + +void ResetSendBuffer(void) +{ + u8 i; + u8 j; + + gLink.sendQueue.count = 0; + gLink.sendQueue.pos = 0; + for (i = 0; i < CMD_LENGTH; i++) + { + for (j = 0; j < QUEUE_CAPACITY; j++) + { + gLink.sendQueue.data[i][j] = 0xEFFF; + } + } +} + +void ResetRecvBuffer(void) +{ + u8 i; + u8 j; + u8 k; + + gLink.recvQueue.count = 0; + gLink.recvQueue.pos = 0; + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + for (j = 0; j < CMD_LENGTH; j++) + { + for (k = 0; k < QUEUE_CAPACITY; k++) + { + gLink.recvQueue.data[i][j][k] = 0xEFFF; + } + } + } +} -- cgit v1.2.3 From 3c20c54b83d00724b5b724f25eaa294e6afb8f3e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 16 Nov 2017 23:37:09 -0500 Subject: sub_800BEC0 --- src/link.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index aa9e0a65d..645fcc182 100644 --- a/src/link.c +++ b/src/link.c @@ -143,12 +143,14 @@ 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 Task_PrintTestData(u8 taskId); + static void sub_800AC80(void); static void sub_800ACAC(void); static void sub_800AD5C(void); static void sub_800AD88(void); static void sub_800AE30(void); static void sub_800AE5C(void); + static void CheckErrorStatus(void); static void CB2_PrintErrorMessage(void); static bool8 IsSioMultiMaster(void); @@ -159,6 +161,7 @@ static void CheckMasterOrSlave(void); static void InitTimer(void); static void EnqueueSendCmd(u16 *sendCmd); static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]); + static void StartTransfer(void); static bool8 DoHandshake(void); static void DoRecv(void); @@ -166,6 +169,8 @@ static void DoSend(void); static void StopTimer(void); static void SendRecvDone(void); +void sub_800D610(void); + // .rodata ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); @@ -2436,3 +2441,29 @@ void ResetRecvBuffer(void) } } } + +// rfu + +u32 sub_800BEC0(void) +{ + u32 r4; + u8 r2; + + r4 = rfu_REQBN_softReset_and_checkID(); + if (r4 == 0x8001) + { + gUnknown_03004140.unk_08 = 1; + } + if (gUnknown_03004140.unk_04 != 0x17 && gUnknown_03004140.unk_04 != 0x01) + { + gUnknown_03004140.unk_05 = 0; + gUnknown_03004140.unk_04 = 0; + } + gUnknown_03004140.unk_07 = 0; + gUnknown_03004140.unk_0d = 0; + gUnknown_03004140.unk_01 = 0; + gUnknown_03004140.unk_00 = 0; + gUnknown_03004140.unk_06 = -1; + sub_800D610(); + return r4; +} -- cgit v1.2.3 From 8377b0066252f5b5c214acd2d6f44b9590f8d3d9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 17 Nov 2017 00:05:28 -0500 Subject: rfu_REQ_sendData_wrapper --- src/link.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 645fcc182..fc9e14b68 100644 --- a/src/link.c +++ b/src/link.c @@ -2447,7 +2447,6 @@ void ResetRecvBuffer(void) u32 sub_800BEC0(void) { u32 r4; - u8 r2; r4 = rfu_REQBN_softReset_and_checkID(); if (r4 == 0x8001) @@ -2467,3 +2466,22 @@ u32 sub_800BEC0(void) sub_800D610(); return r4; } + +void rfu_REQ_sendData_wrapper(u8 r2) +{ + u8 val; + if (!gUnknown_03007890->unk_00) + { + val = gUnknown_03004140.unk_02; + r2 = 0; + if (val == 1) + { + r2 = 1; + } + } + else + { + gUnknown_03004140.unk_03 = 0; + } + rfu_REQ_sendData(r2); +} -- cgit v1.2.3 From a054b244ab150b3823aa513cc215c81dc426c796 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 17 Nov 2017 08:33:25 -0500 Subject: sub_800BF4C --- src/link.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index fc9e14b68..963ef603e 100644 --- a/src/link.c +++ b/src/link.c @@ -170,6 +170,8 @@ static void StopTimer(void); static void SendRecvDone(void); void sub_800D610(void); +void sub_800CEB0(u16 unk0); +void sub_800C7B4(u16 unk0, u16 unk1); // .rodata @@ -2485,3 +2487,18 @@ void rfu_REQ_sendData_wrapper(u8 r2) } rfu_REQ_sendData(r2); } + +int sub_800BF4C(void (*func1)(u8), void (*func2)(void)) +{ + if (func1 == NULL) + { + return 4; + } + CpuFill16(0, &gUnknown_03004140, sizeof(gUnknown_03004140)); + gUnknown_03004140.unk_06 = -1; + gUnknown_03004140.unk_40 = func1; + gUnknown_03004140.unk_44 = func2; + rfu_setMSCCallback(sub_800CEB0); + rfu_setREQCallback(sub_800C7B4); + return 0; +} -- cgit v1.2.3 From 06c1908d00b61a87be8ba9505aebb55d48e7dff7 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 17 Nov 2017 08:44:54 -0500 Subject: through sub_800BFCC --- src/link.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 963ef603e..96234ad04 100644 --- a/src/link.c +++ b/src/link.c @@ -172,6 +172,7 @@ static void SendRecvDone(void); void sub_800D610(void); void sub_800CEB0(u16 unk0); void sub_800C7B4(u16 unk0, u16 unk1); +void sub_800C000(void); // .rodata @@ -2502,3 +2503,24 @@ int sub_800BF4C(void (*func1)(u8), void (*func2)(void)) rfu_setREQCallback(sub_800C7B4); return 0; } + +void sub_800BFA0(void) +{ + CpuFill16(0, &gUnknown_03004140, sizeof(gUnknown_03004140) - 2 * sizeof(void *)); + gUnknown_03004140.unk_06 = -1; +} + +void sub_800BFCC(struct UnkLinkRfuStruct_02022B2C *unk0) +{ + sub_800C000(); + gUnknown_03004140.unk_04 = 1; + gUnknown_03004140.unk_05 = 2; + gUnknown_03004140.unk_3c = unk0; + gUnknown_03004140.unk_09 = unk0->unk_11; + gUnknown_03004140.unk_32 = unk0->unk_12; + gUnknown_03004140.unk_18 = unk0->unk_14; + if (unk0->unk_10) + { + gUnknown_03004140.unk_0b = 1; + } +} -- cgit v1.2.3 From 648f3245c1843e1128c6832b445ac8ba31433a56 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 18 Nov 2017 15:00:38 -0500 Subject: through sub_800C054 --- src/link.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 96234ad04..9fae98454 100644 --- a/src/link.c +++ b/src/link.c @@ -174,6 +174,8 @@ void sub_800CEB0(u16 unk0); void sub_800C7B4(u16 unk0, u16 unk1); void sub_800C000(void); +void sub_800D30C(u8 a0, u8 a1); + // .rodata ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); @@ -2524,3 +2526,86 @@ void sub_800BFCC(struct UnkLinkRfuStruct_02022B2C *unk0) gUnknown_03004140.unk_0b = 1; } } + +void sub_800C000(void) +{ + u8 i; + + gUnknown_03004140.unk_05 = 0; + gUnknown_03004140.unk_04 = 0; + gUnknown_03004140.unk_06 = -1; + gUnknown_03004140.unk_07 = 0; + gUnknown_03004140.unk_10 = 0; + gUnknown_03004140.unk_0c = 0; + gUnknown_03004140.unk_24 = 0; + gUnknown_03004140.unk_30 = 0; + for (i = 0; i < 4; i++) + { + gUnknown_03004140.unk_28[i] = 0; + gUnknown_03004140.unk_34[i] = 0; + } +} + +void sub_800C048(void) +{ + gUnknown_03004140.unk_04 = 0x15; +} + +u8 sub_800C054(u8 r5, u16 r7, u16 r8, u16 *r6) +{ + u8 i; + u16 *buffer; + + if (gUnknown_03004140.unk_04 != 0 && (gUnknown_03004140.unk_04 != 0x08 || r5 != 1)) + { + gUnknown_03004140.unk_14 = 1; + sub_800D30C(0xf3, 0x01); + return 1; + } + if (!rfu_getMasterSlave()) + { + gUnknown_03004140.unk_14 = 2; + sub_800D30C(0xf3, 0x01); + return 2; + } + for (i = 0, buffer = r6; i < 16; i++) + { + if (*buffer++ == 0xFFFF) + { + break; + } + } + if (i == 16) + { + gUnknown_03004140.unk_14 = 4; + sub_800D30C(0xf3, 0x01); + return 4; + } + if (r5 > 1) + { + gUnknown_03004140.unk_07 = 1; + r5 = 1; + r7 = 0; + } + else + { + gUnknown_03004140.unk_07 = 0; + } + if (r5 != 0) + { + gUnknown_03004140.unk_04 = 5; + } + else + { + gUnknown_03004140.unk_04 = 9; + if (gUnknown_03004140.unk_0b) + { + gUnknown_03004140.unk_0b = 2; + } + } + gUnknown_03004140.unk_06 = r5; + gUnknown_03004140.unk_1a = r7; + gUnknown_03004140.unk_26 = r8; + gUnknown_03004140.unk_20 = r6; + return 0; +} -- cgit v1.2.3 From f25cdb483795454d0d89d59fd614697e6c4b8cc4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 18 Nov 2017 15:15:54 -0500 Subject: resolve questionable file boundary decision --- src/link.c | 169 ------------------------------------------------------------- 1 file changed, 169 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 9fae98454..8c6dda32a 100644 --- a/src/link.c +++ b/src/link.c @@ -66,7 +66,6 @@ IWRAM_DATA u16 sSendNonzeroCheck; IWRAM_DATA u16 sRecvNonzeroCheck; IWRAM_DATA u8 sChecksumAvailable; IWRAM_DATA u8 sHandshakePlayerCount; -IWRAM_DATA u8 gUnknown_03000D74; u16 gLinkPartnersHeldKeys[6]; u32 gLinkDebugSeed; @@ -169,13 +168,6 @@ static void DoSend(void); static void StopTimer(void); static void SendRecvDone(void); -void sub_800D610(void); -void sub_800CEB0(u16 unk0); -void sub_800C7B4(u16 unk0, u16 unk1); -void sub_800C000(void); - -void sub_800D30C(u8 a0, u8 a1); - // .rodata ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); @@ -2448,164 +2440,3 @@ void ResetRecvBuffer(void) } // rfu - -u32 sub_800BEC0(void) -{ - u32 r4; - - r4 = rfu_REQBN_softReset_and_checkID(); - if (r4 == 0x8001) - { - gUnknown_03004140.unk_08 = 1; - } - if (gUnknown_03004140.unk_04 != 0x17 && gUnknown_03004140.unk_04 != 0x01) - { - gUnknown_03004140.unk_05 = 0; - gUnknown_03004140.unk_04 = 0; - } - gUnknown_03004140.unk_07 = 0; - gUnknown_03004140.unk_0d = 0; - gUnknown_03004140.unk_01 = 0; - gUnknown_03004140.unk_00 = 0; - gUnknown_03004140.unk_06 = -1; - sub_800D610(); - return r4; -} - -void rfu_REQ_sendData_wrapper(u8 r2) -{ - u8 val; - if (!gUnknown_03007890->unk_00) - { - val = gUnknown_03004140.unk_02; - r2 = 0; - if (val == 1) - { - r2 = 1; - } - } - else - { - gUnknown_03004140.unk_03 = 0; - } - rfu_REQ_sendData(r2); -} - -int sub_800BF4C(void (*func1)(u8), void (*func2)(void)) -{ - if (func1 == NULL) - { - return 4; - } - CpuFill16(0, &gUnknown_03004140, sizeof(gUnknown_03004140)); - gUnknown_03004140.unk_06 = -1; - gUnknown_03004140.unk_40 = func1; - gUnknown_03004140.unk_44 = func2; - rfu_setMSCCallback(sub_800CEB0); - rfu_setREQCallback(sub_800C7B4); - return 0; -} - -void sub_800BFA0(void) -{ - CpuFill16(0, &gUnknown_03004140, sizeof(gUnknown_03004140) - 2 * sizeof(void *)); - gUnknown_03004140.unk_06 = -1; -} - -void sub_800BFCC(struct UnkLinkRfuStruct_02022B2C *unk0) -{ - sub_800C000(); - gUnknown_03004140.unk_04 = 1; - gUnknown_03004140.unk_05 = 2; - gUnknown_03004140.unk_3c = unk0; - gUnknown_03004140.unk_09 = unk0->unk_11; - gUnknown_03004140.unk_32 = unk0->unk_12; - gUnknown_03004140.unk_18 = unk0->unk_14; - if (unk0->unk_10) - { - gUnknown_03004140.unk_0b = 1; - } -} - -void sub_800C000(void) -{ - u8 i; - - gUnknown_03004140.unk_05 = 0; - gUnknown_03004140.unk_04 = 0; - gUnknown_03004140.unk_06 = -1; - gUnknown_03004140.unk_07 = 0; - gUnknown_03004140.unk_10 = 0; - gUnknown_03004140.unk_0c = 0; - gUnknown_03004140.unk_24 = 0; - gUnknown_03004140.unk_30 = 0; - for (i = 0; i < 4; i++) - { - gUnknown_03004140.unk_28[i] = 0; - gUnknown_03004140.unk_34[i] = 0; - } -} - -void sub_800C048(void) -{ - gUnknown_03004140.unk_04 = 0x15; -} - -u8 sub_800C054(u8 r5, u16 r7, u16 r8, u16 *r6) -{ - u8 i; - u16 *buffer; - - if (gUnknown_03004140.unk_04 != 0 && (gUnknown_03004140.unk_04 != 0x08 || r5 != 1)) - { - gUnknown_03004140.unk_14 = 1; - sub_800D30C(0xf3, 0x01); - return 1; - } - if (!rfu_getMasterSlave()) - { - gUnknown_03004140.unk_14 = 2; - sub_800D30C(0xf3, 0x01); - return 2; - } - for (i = 0, buffer = r6; i < 16; i++) - { - if (*buffer++ == 0xFFFF) - { - break; - } - } - if (i == 16) - { - gUnknown_03004140.unk_14 = 4; - sub_800D30C(0xf3, 0x01); - return 4; - } - if (r5 > 1) - { - gUnknown_03004140.unk_07 = 1; - r5 = 1; - r7 = 0; - } - else - { - gUnknown_03004140.unk_07 = 0; - } - if (r5 != 0) - { - gUnknown_03004140.unk_04 = 5; - } - else - { - gUnknown_03004140.unk_04 = 9; - if (gUnknown_03004140.unk_0b) - { - gUnknown_03004140.unk_0b = 2; - } - } - gUnknown_03004140.unk_06 = r5; - gUnknown_03004140.unk_1a = r7; - gUnknown_03004140.unk_26 = r8; - gUnknown_03004140.unk_20 = r6; - return 0; -} -- cgit v1.2.3 From 22600e81cca075ecfa570365f14070d9318b33ce Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 19 Nov 2017 00:02:15 -0500 Subject: Start parsing out link_rfu common syms --- src/link.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 8c6dda32a..eebafef2c 100644 --- a/src/link.c +++ b/src/link.c @@ -2438,5 +2438,3 @@ void ResetRecvBuffer(void) } } } - -// rfu -- cgit v1.2.3 From 95d77c25f390afa8702469b3dfd17c8dc375a3e2 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 20 Jan 2018 16:38:44 -0500 Subject: through sub_801084C --- src/link.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index c59691bc8..1e8332f57 100644 --- a/src/link.c +++ b/src/link.c @@ -1812,13 +1812,14 @@ void sub_800B348(void) memcpy(gBlockSendBuffer, block, sizeof(*block)); } -void sub_800B3A4(u8 who) +void sub_800B3A4(u32 who) { + u8 who_ = who; struct LinkPlayerBlock *block; struct LinkPlayer *player; - block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who]; - player = &gLinkPlayers[who]; + block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_]; + player = &gLinkPlayers[who_]; *player = block->linkPlayer; sub_800B524(player); if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 || strcmp(block->magic2, gASCIIGameFreakInc) != 0) -- cgit v1.2.3 From ef412145d07e74b2db6555e726a7944f9451c48e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 20 Jan 2018 17:28:10 -0500 Subject: through sub_8010A70 --- src/link.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/link.c') diff --git a/src/link.c b/src/link.c index 1e8332f57..65c5d3982 100644 --- a/src/link.c +++ b/src/link.c @@ -26,8 +26,8 @@ #include "sound.h" #include "trade.h" #include "battle.h" -#include "link_rfu.h" #include "link.h" +#include "link_rfu.h" // Static type declarations -- cgit v1.2.3