through rfufunc_80FA020
This commit is contained in:
331
asm/link_rfu.s
331
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}
|
||||
|
||||
@@ -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
|
||||
|
||||
119
src/link_rfu.c
119
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user