diff --git a/asm/mevent_server.s b/asm/mevent_server.s index 8c76e2d0d0..ea4416ac71 100755 --- a/asm/mevent_server.s +++ b/asm/mevent_server.s @@ -5,115 +5,6 @@ .text - thumb_func_start mevent_srv_init_wnews -mevent_srv_init_wnews: @ 801D07C - push {r4,lr} - ldr r4, =gUnknown_02022C7C - movs r0, 0x60 - bl AllocZeroed - str r0, [r4] - ldr r1, =gUnknown_082F298C - movs r2, 0 - movs r3, 0x1 - bl mevent_srv_init_common - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end mevent_srv_init_wnews - - thumb_func_start mevent_srv_new_wcard -mevent_srv_new_wcard: @ 801D0A0 - push {r4,lr} - ldr r4, =gUnknown_02022C7C - movs r0, 0x60 - bl AllocZeroed - str r0, [r4] - ldr r1, =gUnknown_082F29EC - movs r2, 0 - movs r3, 0x1 - bl mevent_srv_init_common - pop {r4} - pop {r0} - bx r0 - .pool - thumb_func_end mevent_srv_new_wcard - - thumb_func_start mevent_srv_common_do_exec -mevent_srv_common_do_exec: @ 801D0C4 - push {r4-r6,lr} - adds r6, r0, 0 - ldr r4, =gUnknown_02022C7C - ldr r0, [r4] - cmp r0, 0 - bne _0801D0D8 - movs r0, 0x3 - b _0801D0F8 - .pool -_0801D0D8: - bl mevent_dispatch_08145600 - adds r5, r0, 0 - cmp r5, 0x3 - bne _0801D0F6 - ldr r0, [r4] - ldr r1, [r0, 0x4] - strh r1, [r6] - bl mevent_srv_free_resources - ldr r0, [r4] - bl Free - movs r0, 0 - str r0, [r4] -_0801D0F6: - adds r0, r5, 0 -_0801D0F8: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end mevent_srv_common_do_exec - - thumb_func_start mevent_srv_init_common -mevent_srv_init_common: @ 801D100 - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - adds r4, r0, 0 - adds r6, r1, 0 - mov r8, r2 - mov r9, r3 - movs r5, 0 - str r5, [r4] - str r5, [r4, 0x8] - movs r0, 0xA6 - lsls r0, 1 - bl AllocZeroed - str r0, [r4, 0x18] - movs r0, 0xDE - lsls r0, 1 - bl AllocZeroed - str r0, [r4, 0x1C] - movs r0, 0x80 - lsls r0, 3 - bl AllocZeroed - str r0, [r4, 0x14] - movs r0, 0x64 - bl AllocZeroed - str r0, [r4, 0x20] - str r6, [r4, 0x10] - str r5, [r4, 0xC] - adds r4, 0x38 - adds r0, r4, 0 - mov r1, r8 - mov r2, r9 - bl sub_801D8D8 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end mevent_srv_init_common - thumb_func_start mevent_srv_free_resources mevent_srv_free_resources: @ 801D158 push {r4,lr} @@ -517,8 +408,8 @@ _0801D464: bx r1 thumb_func_end sub_801D1F0 - thumb_func_start mevent_dispatch_08145600 -mevent_dispatch_08145600: @ 801D46C + thumb_func_start mevent_srv_exec_common +mevent_srv_exec_common: @ 801D46C push {lr} ldr r2, =gUnknown_082F2548 ldr r1, [r0, 0x8] @@ -529,6 +420,6 @@ mevent_dispatch_08145600: @ 801D46C pop {r1} bx r1 .pool - thumb_func_end mevent_dispatch_08145600 + thumb_func_end mevent_srv_exec_common .align 2, 0 @ don't pad with nop diff --git a/asm/mevent_server_helpers.s b/asm/mevent_server_helpers.s index f92f1e2c76..6a60649a47 100755 --- a/asm/mevent_server_helpers.s +++ b/asm/mevent_server_helpers.s @@ -23,8 +23,8 @@ sub_801D8CC: @ 801D8CC bx r1 thumb_func_end sub_801D8CC - thumb_func_start sub_801D8D8 -sub_801D8D8: @ 801D8D8 + thumb_func_start mevent_srv_sub_init +mevent_srv_sub_init: @ 801D8D8 movs r3, 0 strb r1, [r0, 0x4] strb r2, [r0, 0x5] @@ -43,7 +43,7 @@ sub_801D8D8: @ 801D8D8 str r1, [r0, 0x20] bx lr .pool - thumb_func_end sub_801D8D8 + thumb_func_end mevent_srv_sub_init thumb_func_start sub_801D904 sub_801D904: @ 801D904 diff --git a/asm/mevent_server_ish.s b/asm/mevent_server_ish.s index f616669828..765b39b7eb 100755 --- a/asm/mevent_server_ish.s +++ b/asm/mevent_server_ish.s @@ -115,7 +115,7 @@ mevent_srv_ish_init: @ 801D50C adds r0, r4, 0 adds r1, r6, 0 mov r2, r8 - bl sub_801D8D8 + bl mevent_srv_sub_init pop {r3} mov r8, r3 pop {r4-r6} diff --git a/data/mevent_server.s b/data/mevent_server.s index 02fe9476ec..eaab75c360 100755 --- a/data/mevent_server.s +++ b/data/mevent_server.s @@ -242,7 +242,7 @@ gUnknown_082F292C:: @ 82F292C .byte 0x00, 0x00, 0x00, 0x00 .align 2 -gUnknown_082F298C:: @ 82F298C +s_mevent_wonder_news:: @ 82F298C .byte 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00 .byte 0x20, 0x00, 0x00, 0x00 @@ -262,7 +262,7 @@ gUnknown_082F298C:: @ 82F298C .4byte gUnknown_082F2800 .align 2 -gUnknown_082F29EC:: @ 82F29EC +s_mevent_wonder_card:: @ 82F29EC .byte 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/include/mevent_server.h b/include/mevent_server.h index d7657b2709..772aae6b18 100644 --- a/include/mevent_server.h +++ b/include/mevent_server.h @@ -1,6 +1,80 @@ #ifndef GUARD_MEVENT_SERVER_H #define GUARD_MEVENT_SERVER_H +#define ME_SEND_BUF_SIZE 0x400 + +struct mevent_srv_sub +{ + s32 seqno; + u8 sendPlayerNo; + u8 recvPlayerNo; + u16 recvIdent; + u16 recvCounter; + u16 recvCRC; + u16 recvSize; + u16 sendIdent; + u16 sendCounter; + u16 sendCRC; + u16 sendSize; + void * recvBfr; + const void * sendBfr; + u32 (*recvFunc)(struct mevent_srv_sub *); + u32 (*sendFunc)(struct mevent_srv_sub *); +}; + +struct send_recv_header +{ + u16 ident; + u16 crc; + u16 size; +}; + +struct mevent_cmd_ish +{ + u32 instr; + u32 parameter; +}; + +struct mevent_srv_ish +{ + u32 unk_00; + u32 param; + u32 mainseqno; + u32 flag; + u32 cmdidx; + void * sendBuffer; + void * recvBuffer; + struct mevent_cmd_ish * cmdBuffer; + void * buffer; + struct mevent_srv_sub manager; +}; + +struct mevent_cmd +{ + u32 instr; + bool32 flag; + void * parameter; +}; + +struct mevent_srv_common +{ + u32 unk_00; + u32 param; + u32 mainseqno; + u32 cmdidx; + const struct mevent_cmd * cmdBuffer; + void * recvBuffer; + struct MEventBuffer_32E0_Sub * mevent_32e0; + struct MEventBuffer_3120_Sub * mevent_3120; + struct MEventStruct_Unk1442CC * mevent_unk1442cc; + void * sendBuffer1; + u32 sendBuffer1Size; + void * sendBuffer2; + u32 sendBuffer2Size; + u32 sendWord; + struct mevent_srv_sub manager; +}; + void mevent_srv_new_wcard(); void mevent_srv_init_wnews(); u32 mevent_srv_common_do_exec(u16 * a0); diff --git a/include/mevent_server_helpers.h b/include/mevent_server_helpers.h new file mode 100644 index 0000000000..d2b4608fb8 --- /dev/null +++ b/include/mevent_server_helpers.h @@ -0,0 +1,6 @@ +#ifndef GUARD_MEVENT_SERVER_HELPERS_H +#define GUARD_MEVENT_SERVER_HELPERS_H + +void mevent_srv_sub_init(struct mevent_srv_sub *, u32, u32); + +#endif //GUARD_MEVENT_SERVER_HELPERS_H diff --git a/ld_script.txt b/ld_script.txt index 619abfce1a..31de8d7303 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -60,6 +60,7 @@ SECTIONS { src/union_room_battle.o(.text); src/mevent2.o(.text); src/mevent_801BAAC.o(.text); + src/mevent_server.o(.text); asm/mevent_server.o(.text); asm/mevent_server_ish.o(.text); asm/mevent_server_helpers.o(.text); @@ -416,6 +417,7 @@ SECTIONS { src/union_room_battle.o(.rodata); src/mevent2.o(.rodata); src/mevent_801BAAC.o(.rodata); + src/mevent_server.o(.rodata); data/mevent_server.o(.rodata); src/union_room_chat.o(.rodata); data/union_room_chat.o(.rodata); diff --git a/src/mevent_server.c b/src/mevent_server.c new file mode 100644 index 0000000000..ea5a186265 --- /dev/null +++ b/src/mevent_server.c @@ -0,0 +1,56 @@ +#include "global.h" +#include "alloc.h" +#include "mevent.h" +#include "mevent_server.h" +#include "mevent_server_helpers.h" + +EWRAM_DATA struct mevent_srv_common * s_mevent_srv_common_ptr = NULL; +EWRAM_DATA struct mevent_srv_ish * s_mevent_srv_ish_ptr = NULL; + +static void mevent_srv_init_common(struct mevent_srv_common *, const void *, u32, u32); +u32 mevent_srv_exec_common(struct mevent_srv_common *); +u32 mevent_srv_free_resources(struct mevent_srv_common *); + +extern const struct mevent_cmd s_mevent_wonder_news[]; +extern const struct mevent_cmd s_mevent_wonder_card[]; + +void mevent_srv_init_wnews(void) +{ + s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common)); + mevent_srv_init_common(s_mevent_srv_common_ptr, s_mevent_wonder_news, 0, 1); +} + +void mevent_srv_new_wcard(void) +{ + s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common)); + mevent_srv_init_common(s_mevent_srv_common_ptr, s_mevent_wonder_card, 0, 1); +} + +u32 mevent_srv_common_do_exec(u16 * a0) +{ + u32 result; + if (s_mevent_srv_common_ptr == NULL) + return 3; + result = mevent_srv_exec_common(s_mevent_srv_common_ptr); + if (result == 3) + { + *a0 = s_mevent_srv_common_ptr->param; + mevent_srv_free_resources(s_mevent_srv_common_ptr); + Free(s_mevent_srv_common_ptr); + s_mevent_srv_common_ptr = NULL; + } + return result; +} + +static void mevent_srv_init_common(struct mevent_srv_common * svr, const void * cmdBuffer, u32 sendPlayerNo, u32 recvPlayerNo) +{ + svr->unk_00 = 0; + svr->mainseqno = 0; + svr->mevent_32e0 = AllocZeroed(sizeof(struct MEventBuffer_32E0_Sub)); + svr->mevent_3120 = AllocZeroed(sizeof(struct MEventBuffer_3120_Sub)); + svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE); + svr->mevent_unk1442cc = AllocZeroed(sizeof(struct MEventStruct_Unk1442CC)); + svr->cmdBuffer = cmdBuffer; + svr->cmdidx = 0; + mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo); +} diff --git a/sym_ewram.txt b/sym_ewram.txt index fa0306b1e7..22afe82261 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -12,14 +12,10 @@ .include "src/union_room_battle.o" .include "src/mevent2.o" .include "src/mevent_801BAAC.o" + .include "src/mevent_server.o" - @ mevent_server -gUnknown_02022C7C: @ 2022C7C - .space 0x4 - -s_mevent_srv_ish_ptr: @ 2022C80 - .space 0x4 - + @ union_room_chat + .align 2 gUnknown_02022C84: @ 2022C84 .space 0x4