diff options
-rw-r--r-- | asm/link_rfu.s | 331 | ||||
-rw-r--r-- | include/link_rfu.h | 15 | ||||
-rw-r--r-- | src/link_rfu.c | 119 |
3 files changed, 120 insertions, 345 deletions
diff --git a/asm/link_rfu.s b/asm/link_rfu.s index 2aeb664d3..3d85d8a7d 100644 --- a/asm/link_rfu.s +++ b/asm/link_rfu.s @@ -5,337 +5,6 @@ .text - thumb_func_start sub_800FE50 -sub_800FE50: @ 800FE50 - push {r4,lr} - adds r4, r0, 0 - ldr r0, =gSendCmd - ldrh r0, [r0] - cmp r0, 0 - bne _0800FE76 - bl sub_8011A80 - cmp r0, 0 - bne _0800FE76 - ldr r0, =gUnknown_03005000+0xF2 - adds r1, r4, 0 - movs r2, 0xC - bl memcpy - movs r0, 0xBC - lsls r0, 6 - bl sub_800FD14 -_0800FE76: - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end sub_800FE50 - - thumb_func_start sub_800FE84 -@ bool8 sub_800FE84(u32 a1, u32 size) -sub_800FE84: @ 800FE84 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r7, r0, 0 - adds r6, r1, 0 - ldr r5, =gUnknown_03005000 - ldr r0, [r5] - cmp r0, 0 - bne _0800FEB8 - ldr r0, =gSendCmd - ldrh r0, [r0] - cmp r0, 0 - bne _0800FEB8 - movs r0, 0x7C - adds r0, r5 - mov r9, r0 - ldrb r1, [r0] - mov r8, r1 - cmp r1, 0 - beq _0800FEC8 - ldr r1, =gUnknown_02022B44 - adds r1, 0x83 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] -_0800FEB8: - movs r0, 0 - b _0800FF32 - .pool -_0800FEC8: - adds r0, r6, 0 - movs r1, 0xC - bl __umodsi3 - negs r4, r0 - orrs r4, r0 - lsrs r4, 31 - bl GetMultiplayerId - adds r1, r5, 0 - adds r1, 0x7D - strb r0, [r1] - movs r0, 0x1 - mov r1, r9 - strb r0, [r1] - adds r0, r6, 0 - movs r1, 0xC - bl __udivsi3 - adds r0, r4 - adds r1, r5, 0 - adds r1, 0x6E - strh r0, [r1] - adds r0, r5, 0 - adds r0, 0x6C - mov r1, r8 - strh r1, [r0] - movs r0, 0x80 - lsls r0, 1 - cmp r6, r0 - bls _0800FF0A - str r7, [r5, 0x70] - b _0800FF1C -_0800FF0A: - ldr r4, =gBlockSendBuffer - cmp r7, r4 - beq _0800FF1A - adds r0, r4, 0 - adds r1, r7, 0 - adds r2, r6, 0 - bl memcpy -_0800FF1A: - str r4, [r5, 0x70] -_0800FF1C: - movs r0, 0x88 - lsls r0, 8 - bl sub_800FD14 - ldr r0, =gUnknown_03005000 - ldr r1, =rfufunc_80F9F44 - str r1, [r0] - adds r0, 0x5B - movs r1, 0 - strb r1, [r0] - movs r0, 0x1 -_0800FF32: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .pool - thumb_func_end sub_800FE84 - - thumb_func_start rfufunc_80F9F44 -rfufunc_80F9F44: @ 800FF4C - push {r4,r5,lr} - ldr r0, =gSendCmd - ldrh r0, [r0] - cmp r0, 0 - bne _0800FFA0 - movs r5, 0x88 - lsls r5, 8 - adds r0, r5, 0 - bl sub_800FD14 - ldr r4, =gUnknown_03005000 - ldrb r0, [r4, 0xC] - cmp r0, 0x1 - bne _0800FF84 - adds r1, r4, 0 - adds r1, 0x5B - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bls _0800FFA0 - b _0800FF9C - .pool -_0800FF84: - bl GetMultiplayerId - ldr r1, =gRecvCmds - lsls r0, 24 - lsrs r0, 20 - adds r0, r1 - ldrh r1, [r0] - movs r0, 0xFF - lsls r0, 8 - ands r0, r1 - cmp r0, r5 - bne _0800FFA0 -_0800FF9C: - ldr r0, =sub_800FFB0 - str r0, [r4] -_0800FFA0: - pop {r4,r5} - pop {r0} - bx r0 - .pool - thumb_func_end rfufunc_80F9F44 - - thumb_func_start sub_800FFB0 -sub_800FFB0: @ 800FFB0 - push {r4-r6,lr} - ldr r0, =gUnknown_03005000 - mov r12, r0 - ldr r5, [r0, 0x70] - ldr r3, =gSendCmd - mov r2, r12 - adds r2, 0x6C - ldrh r1, [r2] - movs r4, 0x89 - lsls r4, 8 - adds r0, r4, 0 - orrs r0, r1 - strh r0, [r3] - movs r4, 0 - adds r6, r2, 0 - adds r3, 0x2 -_0800FFD0: - lsls r2, r4, 1 - ldrh r1, [r6] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - adds r0, r5 - ldrb r1, [r0, 0x1] - lsls r1, 8 - ldrb r0, [r0] - orrs r0, r1 - strh r0, [r3] - adds r3, 0x2 - adds r4, 0x1 - cmp r4, 0x6 - ble _0800FFD0 - mov r0, r12 - adds r0, 0x6C - ldrh r1, [r0] - adds r1, 0x1 - strh r1, [r0] - adds r0, 0x2 - ldrh r0, [r0] - lsls r1, 16 - lsrs r1, 16 - cmp r0, r1 - bhi _08010014 - mov r0, r12 - adds r0, 0x7C - movs r1, 0 - strb r1, [r0] - ldr r0, =rfufunc_80FA020 - mov r1, r12 - str r0, [r1] -_08010014: - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end sub_800FFB0 - - thumb_func_start rfufunc_80FA020 -rfufunc_80FA020: @ 8010028 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - ldr r5, =gUnknown_03005000 - ldr r0, [r5, 0x70] - mov r8, r0 - bl GetMultiplayerId - lsls r0, 24 - lsrs r6, r0, 24 - ldrb r0, [r5, 0xC] - cmp r0, 0 - bne _080100F0 - ldr r3, =gSendCmd - adds r2, r5, 0 - adds r2, 0x6E - ldrh r0, [r2] - subs r0, 0x1 - ldr r4, =0xffff8900 - adds r1, r4, 0 - orrs r0, r1 - strh r0, [r3] - movs r4, 0 - mov r9, r5 - ldr r0, =gRecvCmds - mov r12, r0 - lsls r5, r6, 4 - adds r7, r2, 0 - adds r3, 0x2 -_08010064: - lsls r2, r4, 1 - ldrh r1, [r7] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - add r0, r8 - adds r1, r0, 0 - subs r1, 0xB - ldrb r1, [r1] - lsls r1, 8 - subs r0, 0xC - ldrb r0, [r0] - orrs r0, r1 - strh r0, [r3] - adds r3, 0x2 - adds r4, 0x1 - cmp r4, 0x6 - ble _08010064 - mov r1, r12 - adds r0, r5, r1 - ldrb r1, [r0] - mov r3, r9 - adds r0, r3, 0 - adds r0, 0x6E - ldrh r0, [r0] - subs r0, 0x1 - cmp r1, r0 - bne _080100F4 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 2 - adds r1, r3, 0 - adds r1, 0x88 - adds r1, r0, r1 - ldr r2, =gUnknown_082ED628 - adds r0, r3 - adds r0, 0x82 - ldrh r0, [r0] - lsls r0, 2 - adds r0, r2 - ldr r1, [r1] - ldr r0, [r0] - cmp r1, r0 - beq _080100E8 - adds r0, r6, 0 - bl sub_800F638 - ldr r1, =gUnknown_02022B44 - adds r1, 0x64 - ldrh r0, [r1] - adds r0, 0x1 - strh r0, [r1] - b _080100F4 - .pool -_080100E8: - movs r0, 0 - mov r4, r9 - str r0, [r4] - b _080100F4 -_080100F0: - movs r0, 0 - str r0, [r5] -_080100F4: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end rfufunc_80FA020 - thumb_func_start sub_8010100 sub_8010100: @ 8010100 push {lr} diff --git a/include/link_rfu.h b/include/link_rfu.h index 0c279f50b..a5d237b9f 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -47,7 +47,11 @@ struct UnkLinkRfuStruct_02022B44 u8 fill_08[6]; vu8 unk_0e; u8 unk_0f; - u8 fill_10[0xcc]; + u8 fill_10[0x54]; + u16 unk_64; + u8 fill_66[0x1d]; + u8 unk_83; + u8 fill_84[0x58]; }; struct UnkRfuStruct_1 { @@ -96,7 +100,7 @@ struct UnkRfuStruct_1 { struct UnkRfuStruct_2_Sub_6c { /* 0x00 */ u16 unk_00; /* 0x02 */ u16 unk_02; - /* 0x04 */ u8 *unk_04; + /* 0x04 */ const u8 *unk_04; /* 0x08 */ u32 unk_08; /* 0x0c */ u32 unk_0c; /* 0x10 */ u8 unk_10; @@ -210,7 +214,7 @@ bool32 sub_800F7E4(void); void sub_800F804(void); void sub_800F850(void); u8 sub_800FCD8(void); -bool32 sub_800FE84(const void *src, size_t size); +bool32 sub_800FE84(const u8 *src, size_t size); void Rfu_set_zero(void); u8 sub_80104F4(void); u8 rfu_get_multiplayer_id(void); @@ -224,10 +228,15 @@ void sub_800E174(void); void sub_800E6D0(void); bool32 sub_8010EC0(void); bool32 sub_8010F1C(void); +bool32 sub_8011A80(void); bool32 sub_800F0B8(void); u32 sub_80124D4(void); void RfuVSync(void); void sub_80111B0(bool32 a0); u8 sub_8011A74(void); +struct UnkLinkRfuStruct_02022B14 *sub_800F7DC(void); +void sub_8011068(u8 a0); +void sub_8011170(u32 a0); +void sub_8011A64(u8 a0, u16 a1); #endif //GUARD_LINK_RFU_H diff --git a/src/link_rfu.c b/src/link_rfu.c index 8e2ecb5fd..1a57ff872 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -49,16 +49,18 @@ static void sub_800D358(u8 a0); static void sub_800D434(void); static void sub_800D610(void); void sub_800D630(void); -bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); +static bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); static void sub_800EAB4(void); static void sub_800EAFC(void); void sub_800ED34(u16 unused); static void sub_800EDBC(u16 unused); static void sub_800F048(void); -struct UnkLinkRfuStruct_02022B14 *sub_800F7DC(void); -void sub_800F86C(u8 a0); -void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data); -void sub_800FD14(u16 a0); +static void sub_800F86C(u8 unused); +static void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data); +void sub_800FD14(u16 command); +void rfufunc_80F9F44(void); +void sub_800FFB0(void); +void rfufunc_80FA020(void); bool32 sub_8010454(u16 a0); void sub_8010528(void); void sub_8010750(void); @@ -68,9 +70,6 @@ void sub_80109E8(u16 a0); void sub_8010A70(void *a0); void sub_8010AAC(u8 taskId); void sub_8010D0C(u8 taskId); -void sub_8011068(u8 a0); -void sub_8011170(u32 a0); -void sub_8011A64(u8 a0, u16 a1); void sub_8011D6C(u8 a0); u8 sub_8012224(void); void sub_801227C(void); @@ -1885,7 +1884,7 @@ void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2) } } -bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2) +static bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2) { int i; @@ -3393,7 +3392,7 @@ void sub_800F850(void) gUnknown_03005000.unk_00 = sub_800F820; } -void sub_800F86C(u8 unused) +static void sub_800F86C(u8 unused) { u16 i; u16 j; @@ -3523,7 +3522,7 @@ bool8 sub_800FC88(void) return TRUE; } -void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data) +static void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data) { data->unk_00 = 0; data->unk_02 = 0; @@ -3749,3 +3748,101 @@ __attribute__((naked)) void sub_800FD14(u16 command) "\t.pool"); } #endif + +void sub_800FE50(u16 *a0) +{ + if (gSendCmd[0] == 0 && sub_8011A80() == 0) + { + memcpy(gUnknown_03005000.unk_f2, a0, sizeof(gUnknown_03005000.unk_f2)); + sub_800FD14(0x2f00); + } +} + +bool32 sub_800FE84(const u8 *src, size_t size) +{ + bool8 r4; + if (gUnknown_03005000.unk_00 != NULL) + return FALSE; + if (gSendCmd[0] != 0) + return FALSE; + if (gUnknown_03005000.unk_6c.unk_10 != 0) + { + gUnknown_02022B44.unk_83++; + return FALSE; + } + r4 = (size % 12) != 0; + gUnknown_03005000.unk_6c.unk_11 = GetMultiplayerId(); + gUnknown_03005000.unk_6c.unk_10 = 1; + gUnknown_03005000.unk_6c.unk_02 = (size / 12) + r4; + gUnknown_03005000.unk_6c.unk_00 = 0; + if (size > 0x100) + gUnknown_03005000.unk_6c.unk_04 = src; + else + { + if (src != gBlockSendBuffer) + memcpy(gBlockSendBuffer, src, size); + gUnknown_03005000.unk_6c.unk_04 = gBlockSendBuffer; + } + sub_800FD14(0x8800); + gUnknown_03005000.unk_00 = rfufunc_80F9F44; + gUnknown_03005000.unk_5b = 0; + return TRUE; +} + +void rfufunc_80F9F44(void) +{ + if (gSendCmd[0] == 0) + { + sub_800FD14(0x8800); + if (gUnknown_03005000.unk_0c == 1) + { + if (++gUnknown_03005000.unk_5b > 2) + gUnknown_03005000.unk_00 = sub_800FFB0; + } + else + { + if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == 0x8800) + gUnknown_03005000.unk_00 = sub_800FFB0; + } + } +} + +void sub_800FFB0(void) +{ + int i; + const u8 *src = gUnknown_03005000.unk_6c.unk_04; + gSendCmd[0] = 0x8900 | gUnknown_03005000.unk_6c.unk_00; + for (i = 0; i < 7; i++) + gSendCmd[i + 1] = (src[(i << 1) + gUnknown_03005000.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + gUnknown_03005000.unk_6c.unk_00 * 12 + 0]; + gUnknown_03005000.unk_6c.unk_00++; + if (gUnknown_03005000.unk_6c.unk_02 <= gUnknown_03005000.unk_6c.unk_00) + { + gUnknown_03005000.unk_6c.unk_10 = 0; + gUnknown_03005000.unk_00 = rfufunc_80FA020; + } +} + +void rfufunc_80FA020(void) +{ + const u8 *src = gUnknown_03005000.unk_6c.unk_04; + u8 mpId = GetMultiplayerId(); + int i; + if (gUnknown_03005000.unk_0c == 0) + { + gSendCmd[0] = (~0x76ff) | (gUnknown_03005000.unk_6c.unk_02 - 1); + for (i = 0; i < 7; i++) + gSendCmd[i + 1] = (src[(i << 1) + (gUnknown_03005000.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (gUnknown_03005000.unk_6c.unk_02 - 1) * 12 + 0]; + if ((u8)gRecvCmds[mpId][0] == gUnknown_03005000.unk_6c.unk_02 - 1) + { + if (gUnknown_03005000.unk_80[mpId].unk_08 != gUnknown_082ED628[gUnknown_03005000.unk_80[mpId].unk_02]) + { + sub_800F638(mpId, gUnknown_03005000.unk_80[mpId].unk_08); + gUnknown_02022B44.unk_64++; + } + else + gUnknown_03005000.unk_00 = NULL; + } + } + else + gUnknown_03005000.unk_00 = NULL; +} |