diff options
-rw-r--r-- | asm/mevent_server.s | 133 | ||||
-rw-r--r-- | include/link.h | 1 | ||||
-rw-r--r-- | src/mevent_server.c | 89 |
3 files changed, 80 insertions, 143 deletions
diff --git a/asm/mevent_server.s b/asm/mevent_server.s index 833212ea4..d41ad7af4 100644 --- a/asm/mevent_server.s +++ b/asm/mevent_server.s @@ -5,139 +5,6 @@ .text - thumb_func_start sub_81449E0 -sub_81449E0: @ 81449E0 - push {r4,r5,lr} - sub sp, 0x8 - adds r4, r0, 0 - ldr r5, [r4] - cmp r5, 0x1 - beq _08144A4C - cmp r5, 0x1 - bgt _081449F6 - cmp r5, 0 - beq _08144A00 - b _08144AE2 -_081449F6: - cmp r5, 0x2 - beq _08144AA0 - cmp r5, 0x3 - beq _08144ACA - b _08144AE2 -_08144A00: - bl sub_800A4BC - lsls r0, 24 - cmp r0, 0 - beq _08144AE2 - ldrh r1, [r4, 0xE] - ldr r2, _08144A44 @ =0xffff0000 - ldr r0, [sp] - ands r0, r2 - orrs r0, r1 - str r0, [sp] - ldrh r1, [r4, 0x14] - ldr r0, [sp, 0x4] - ands r0, r2 - orrs r0, r1 - str r0, [sp, 0x4] - ldr r0, [r4, 0x1C] - bl CalcCRC16WithTable - lsls r0, 16 - ldr r2, _08144A48 @ =0x0000ffff - ldr r1, [sp] - ands r1, r2 - orrs r1, r0 - str r1, [sp] - lsrs r1, 16 - strh r1, [r4, 0x12] - strh r5, [r4, 0x10] - movs r0, 0 - mov r1, sp - movs r2, 0x8 - bl SendBlock - b _08144AC2 - .align 2, 0 -_08144A44: .4byte 0xffff0000 -_08144A48: .4byte 0x0000ffff -_08144A4C: - bl sub_800A4BC - lsls r0, 24 - cmp r0, 0 - beq _08144AE2 - ldrb r0, [r4, 0x4] - bl sub_81448D8 - cmp r0, 0 - beq _08144AE2 - ldrb r0, [r4, 0x4] - bl sub_81448FC - ldrh r1, [r4, 0x10] - lsls r0, r1, 6 - subs r0, r1 - lsls r3, r0, 2 - ldrh r0, [r4, 0x14] - subs r0, r3 - cmp r0, 0xFC - bhi _08144A8C - ldr r1, [r4, 0x1C] - adds r1, r3 - lsls r2, r0, 16 - lsrs r2, 16 - movs r0, 0 - bl SendBlock - ldrh r0, [r4, 0x10] - adds r0, 0x1 - strh r0, [r4, 0x10] - b _08144AC2 -_08144A8C: - ldr r1, [r4, 0x1C] - adds r1, r3 - movs r0, 0 - movs r2, 0xFC - bl SendBlock - ldrh r0, [r4, 0x10] - adds r0, 0x1 - strh r0, [r4, 0x10] - b _08144AE2 -_08144AA0: - bl sub_800A4BC - lsls r0, 24 - cmp r0, 0 - beq _08144AE2 - ldr r0, [r4, 0x1C] - ldrh r1, [r4, 0x14] - bl CalcCRC16WithTable - lsls r0, 16 - lsrs r0, 16 - ldrh r1, [r4, 0x12] - cmp r0, r1 - beq _08144AC2 - bl sub_80FA190 - b _08144AE2 -_08144AC2: - ldr r0, [r4] - adds r0, 0x1 - str r0, [r4] - b _08144AE2 -_08144ACA: - ldrb r0, [r4, 0x4] - bl sub_81448D8 - cmp r0, 0 - beq _08144AE2 - ldrb r0, [r4, 0x4] - bl sub_81448FC - movs r0, 0 - str r0, [r4] - movs r0, 0x1 - b _08144AE4 -_08144AE2: - movs r0, 0 -_08144AE4: - add sp, 0x8 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_81449E0 - thumb_func_start sub_8144AEC sub_8144AEC: @ 8144AEC push {r4,lr} diff --git a/include/link.h b/include/link.h index 1c13de37e..39873ec11 100644 --- a/include/link.h +++ b/include/link.h @@ -207,5 +207,6 @@ void sub_800A5BC(void); void sub_800AA80(u8); void sub_80098D8(void); void sub_80098B8(void); +bool8 sub_800A4BC(void); #endif // GUARD_LINK_H diff --git a/src/mevent_server.c b/src/mevent_server.c index 0c94980ff..8c68a9350 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -21,7 +21,7 @@ struct mevent_srv_sub u16 unk_12; u16 unk_14; void * unk_18; - u32 unk_1C; + void * unk_1C; u32 (*unk_20)(struct mevent_srv_sub *); u32 (*unk_24)(struct mevent_srv_sub *); }; @@ -40,6 +40,13 @@ struct mevent_srv_ish struct mevent_srv_sub unk_24; }; +struct send_recv_buff +{ + u16 unk0; + u16 unk2; + u16 unk4; +}; + EWRAM_DATA struct mevent_srv_ish * gUnknown_203F3C0 = NULL; u32 sub_814490C(struct mevent_srv_sub *); @@ -66,13 +73,13 @@ void sub_814485C(struct mevent_srv_sub * srv, u8 a1, u8 a2) srv->unk_0A = 0; srv->unk_0C = 0; srv->unk_08 = 0; - srv->unk_1C = 0; + srv->unk_1C = NULL; srv->unk_18 = NULL; srv->unk_24 = sub_81449E0; srv->unk_20 = sub_814490C; } -void sub_8144888(struct mevent_srv_sub * srv, u16 a1, u32 a2, u32 a3) +void sub_8144888(struct mevent_srv_sub * srv, u16 a1, void * a2, u32 a3) { srv->unk_00 = 0; srv->unk_0E = a1; @@ -95,7 +102,7 @@ void sub_81448AC(struct mevent_srv_sub * srv, u16 a1, void * a2) srv->unk_18 = a2; } -void sub_81448BC(u32 recv_idx, u16 * dest, size_t size) +void sub_81448BC(u32 recv_idx, void * dest, size_t size) { memcpy(dest, gBlockRecvBuffer[recv_idx], size); } @@ -115,22 +122,22 @@ void sub_81448FC(u32 recv_idx) bool32 sub_814490C(struct mevent_srv_sub * srv) { - u16 buff[4]; + struct send_recv_buff buff; + switch (srv->unk_00) { case 0: if (sub_81448D8(srv->unk_05)) { - u16 * r4; - sub_81448BC(srv->unk_05, (r4 = buff), sizeof(buff)); - srv->unk_0C = r4[2]; - srv->unk_0A = r4[1]; + sub_81448BC(srv->unk_05, &buff, sizeof(buff)); + srv->unk_0C = buff.unk4; + srv->unk_0A = buff.unk2; if (srv->unk_0C > 0x400) { sub_80FA190(); return FALSE; } - else if (srv->unk_06 != buff[0]) + else if (srv->unk_06 != buff.unk0) { sub_80FA190(); return FALSE; @@ -178,3 +185,65 @@ bool32 sub_814490C(struct mevent_srv_sub * srv) return FALSE; } + +bool32 sub_81449E0(struct mevent_srv_sub * srv) +{ + struct send_recv_buff buff; + + switch (srv->unk_00) + { + case 0: + if (sub_800A4BC()) + { + buff.unk0 = srv->unk_0E; + buff.unk4 = srv->unk_14; + buff.unk2 = CalcCRC16WithTable(srv->unk_1C, srv->unk_14); + srv->unk_12 = buff.unk2; + srv->unk_10 = 0; + SendBlock(0, &buff, sizeof(buff)); + ++srv->unk_00; + } + break; + case 1: + if (sub_800A4BC()) + { + if (sub_81448D8(srv->unk_04)) + { + size_t r3; + sub_81448FC(srv->unk_04); + r3 = 252 * srv->unk_10; + if (srv->unk_14 - r3 <= 252) + { + SendBlock(0, srv->unk_1C + r3, srv->unk_14 - r3); + ++srv->unk_10; + ++srv->unk_00; + } + else + { + SendBlock(0, srv->unk_1C + r3, 252); + ++srv->unk_10; + } + } + } + break; + case 2: + if (sub_800A4BC()) + { + if (CalcCRC16WithTable(srv->unk_1C, srv->unk_14) != srv->unk_12) + sub_80FA190(); + else + ++srv->unk_00; + } + break; + case 3: + if (sub_81448D8(srv->unk_04)) + { + sub_81448FC(srv->unk_04); + srv->unk_00 = 0; + return TRUE; + } + break; + } + + return FALSE; +} |