From a436d79177fc54927d14cc2114802dee74176a6b Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Tue, 24 Dec 2019 04:25:49 +0800 Subject: partially sync with knizz's documentation --- asm/librfu.s | 792 +++++++++++++++++++++++++++---------------------------- asm/link_rfu.s | 134 +++++----- asm/link_rfu_2.s | 128 ++++----- asm/link_rfu_3.s | 4 +- include/librfu.h | 214 +++++++++------ src/trade.c | 10 +- sym_common.txt | 10 +- 7 files changed, 675 insertions(+), 617 deletions(-) diff --git a/asm/librfu.s b/asm/librfu.s index 03bf3eeb8..2e17aef23 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,8 +5,8 @@ .text - thumb_func_start sub_81E05B0 -sub_81E05B0: @ 81E05B0 + thumb_func_start rfu_initializeAPI +rfu_initializeAPI: @ 81E05B0 push {r4-r7,lr} adds r4, r0, 0 mov r12, r2 @@ -48,21 +48,21 @@ _081E05EA: .align 2, 0 _081E05F4: .4byte 0x00000504 _081E05F8: - ldr r0, _081E06CC @ =gUnknown_3007460 + ldr r0, _081E06CC @ =gRfuLinkStatus str r4, [r0] - ldr r1, _081E06D0 @ =gUnknown_3007464 + ldr r1, _081E06D0 @ =gRfuStatic adds r0, r4, 0 adds r0, 0xB4 str r0, [r1] - ldr r1, _081E06D4 @ =gUnknown_3007468 + ldr r1, _081E06D4 @ =gRfuFixed adds r0, 0x28 str r0, [r1] - ldr r2, _081E06D8 @ =gUnknown_3007450 + ldr r2, _081E06D8 @ =gRfuSlotStatusNI movs r1, 0xDE lsls r1, 1 adds r0, r4, r1 str r0, [r2] - ldr r1, _081E06DC @ =gUnknown_3007440 + ldr r1, _081E06DC @ =gRfuSlotStatusUNI movs r3, 0xDF lsls r3, 2 adds r0, r4, r3 @@ -89,10 +89,10 @@ _081E0624: lsrs r5, r0, 16 cmp r5, 0x3 bls _081E0624 - ldr r0, _081E06D4 @ =gUnknown_3007468 + ldr r0, _081E06D4 @ =gRfuFixed ldr r1, [r0] adds r1, 0xDC - ldr r4, _081E06DC @ =gUnknown_3007440 + ldr r4, _081E06DC @ =gRfuSlotStatusUNI ldr r0, [r4, 0xC] adds r0, 0x1C str r0, [r1] @@ -101,7 +101,7 @@ _081E0624: bl STWI_init_all bl rfu_STC_clearAPIVariables movs r5, 0 - ldr r3, _081E06D8 @ =gUnknown_3007450 + ldr r3, _081E06D8 @ =gRfuSlotStatusNI movs r2, 0 _081E0668: lsls r1, r5, 2 @@ -118,11 +118,11 @@ _081E0668: lsrs r5, r0, 16 cmp r5, 0x3 bls _081E0668 - ldr r1, _081E06E0 @ =sub_81E1B24 + ldr r1, _081E06E0 @ =rfu_STC_fastCopy movs r5, 0x2 negs r5, r5 ands r5, r1 - ldr r2, _081E06D4 @ =gUnknown_3007468 + ldr r2, _081E06D4 @ =gRfuFixed ldr r0, [r2] adds r4, r0, 0 adds r4, 0x8 @@ -158,15 +158,15 @@ _081E06C6: pop {r1} bx r1 .align 2, 0 -_081E06CC: .4byte gUnknown_3007460 -_081E06D0: .4byte gUnknown_3007464 -_081E06D4: .4byte gUnknown_3007468 -_081E06D8: .4byte gUnknown_3007450 -_081E06DC: .4byte gUnknown_3007440 -_081E06E0: .4byte sub_81E1B24 +_081E06CC: .4byte gRfuLinkStatus +_081E06D0: .4byte gRfuStatic +_081E06D4: .4byte gRfuFixed +_081E06D8: .4byte gRfuSlotStatusNI +_081E06DC: .4byte gRfuSlotStatusUNI +_081E06E0: .4byte rfu_STC_fastCopy _081E06E4: .4byte rfu_REQ_changeMasterSlave _081E06E8: .4byte 0x0000ffff - thumb_func_end sub_81E05B0 + thumb_func_end rfu_initializeAPI thumb_func_start rfu_STC_clearAPIVariables rfu_STC_clearAPIVariables: @ 81E06EC @@ -177,7 +177,7 @@ rfu_STC_clearAPIVariables: @ 81E06EC adds r7, r0, 0 movs r6, 0 strh r6, [r1] - ldr r5, _081E0764 @ =gUnknown_3007464 + ldr r5, _081E0764 @ =gRfuStatic ldr r1, [r5] ldrb r4, [r1] mov r0, sp @@ -192,7 +192,7 @@ rfu_STC_clearAPIVariables: @ 81E06EC mov r0, sp adds r0, 0x2 strh r1, [r0] - ldr r4, _081E076C @ =gUnknown_3007460 + ldr r4, _081E076C @ =gRfuLinkStatus ldr r1, [r4] ldr r2, _081E0770 @ =0x0100005a bl CpuSet @@ -228,9 +228,9 @@ _081E0740: bx r0 .align 2, 0 _081E0760: .4byte 0x04000208 -_081E0764: .4byte gUnknown_3007464 +_081E0764: .4byte gRfuStatic _081E0768: .4byte 0x01000014 -_081E076C: .4byte gUnknown_3007460 +_081E076C: .4byte gRfuLinkStatus _081E0770: .4byte 0x0100005a thumb_func_end rfu_STC_clearAPIVariables @@ -252,7 +252,7 @@ rfu_UNI_PARENT_getDRAC_ACK: @ 81E0788 adds r4, r0, 0 movs r0, 0 strb r0, [r4] - ldr r5, _081E07A0 @ =gUnknown_3007460 + ldr r5, _081E07A0 @ =gRfuLinkStatus ldr r0, [r5] ldrb r0, [r0] cmp r0, 0x1 @@ -261,7 +261,7 @@ rfu_UNI_PARENT_getDRAC_ACK: @ 81E0788 lsls r0, 2 b _081E07CA .align 2, 0 -_081E07A0: .4byte gUnknown_3007460 +_081E07A0: .4byte gRfuLinkStatus _081E07A4: bl rfu_getSTWIRecvBuffer adds r1, r0, 0 @@ -306,13 +306,13 @@ rfu_setTimerInterrupt: @ 81E07D0 thumb_func_start rfu_getSTWIRecvBuffer rfu_getSTWIRecvBuffer: @ 81E07E4 - ldr r0, _081E07F0 @ =gUnknown_3007468 + ldr r0, _081E07F0 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] bx lr .align 2, 0 -_081E07F0: .4byte gUnknown_3007468 +_081E07F0: .4byte gRfuFixed thumb_func_end rfu_getSTWIRecvBuffer thumb_func_start rfu_setMSCCallback @@ -327,7 +327,7 @@ rfu_setMSCCallback: @ 81E07F4 rfu_setREQCallback: @ 81E0800 push {lr} adds r1, r0, 0 - ldr r0, _081E0818 @ =gUnknown_3007468 + ldr r0, _081E0818 @ =gRfuFixed ldr r0, [r0] str r1, [r0] negs r0, r1 @@ -337,7 +337,7 @@ rfu_setREQCallback: @ 81E0800 pop {r0} bx r0 .align 2, 0 -_081E0818: .4byte gUnknown_3007468 +_081E0818: .4byte gRfuFixed thumb_func_end rfu_setREQCallback thumb_func_start rfu_enableREQCallback @@ -346,16 +346,16 @@ rfu_enableREQCallback: @ 81E081C lsls r0, 24 cmp r0, 0 beq _081E0834 - ldr r0, _081E0830 @ =gUnknown_3007464 + ldr r0, _081E0830 @ =gRfuStatic ldr r2, [r0] ldrb r1, [r2] movs r0, 0x8 orrs r0, r1 b _081E083E .align 2, 0 -_081E0830: .4byte gUnknown_3007464 +_081E0830: .4byte gRfuStatic _081E0834: - ldr r0, _081E0844 @ =gUnknown_3007464 + ldr r0, _081E0844 @ =gRfuStatic ldr r2, [r0] ldrb r1, [r2] movs r0, 0xF7 @@ -365,7 +365,7 @@ _081E083E: pop {r0} bx r0 .align 2, 0 -_081E0844: .4byte gUnknown_3007464 +_081E0844: .4byte gRfuStatic thumb_func_end rfu_enableREQCallback thumb_func_start rfu_STC_REQ_callback @@ -377,7 +377,7 @@ rfu_STC_REQ_callback: @ 81E0848 lsrs r4, r1, 16 ldr r0, _081E087C @ =rfu_CB_defaultCallback bl STWI_set_Callback_M - ldr r0, _081E0880 @ =gUnknown_3007464 + ldr r0, _081E0880 @ =gRfuStatic ldr r0, [r0] strh r4, [r0, 0x1C] ldrb r1, [r0] @@ -385,7 +385,7 @@ rfu_STC_REQ_callback: @ 81E0848 ands r0, r1 cmp r0, 0 beq _081E0876 - ldr r0, _081E0884 @ =gUnknown_3007468 + ldr r0, _081E0884 @ =gRfuFixed ldr r0, [r0] ldr r2, [r0] adds r0, r5, 0 @@ -397,8 +397,8 @@ _081E0876: bx r0 .align 2, 0 _081E087C: .4byte rfu_CB_defaultCallback -_081E0880: .4byte gUnknown_3007464 -_081E0884: .4byte gUnknown_3007468 +_081E0880: .4byte gRfuStatic +_081E0884: .4byte gRfuFixed thumb_func_end rfu_STC_REQ_callback thumb_func_start rfu_CB_defaultCallback @@ -410,21 +410,21 @@ rfu_CB_defaultCallback: @ 81E0888 lsrs r3, r1, 16 cmp r0, 0xFF bne _081E08E4 - ldr r0, _081E08EC @ =gUnknown_3007464 + ldr r0, _081E08EC @ =gRfuStatic ldr r0, [r0] ldrb r1, [r0] movs r0, 0x8 ands r0, r1 cmp r0, 0 beq _081E08B2 - ldr r0, _081E08F0 @ =gUnknown_3007468 + ldr r0, _081E08F0 @ =gRfuFixed ldr r0, [r0] ldr r2, [r0] movs r0, 0xFF adds r1, r3, 0 bl _call_via_r2 _081E08B2: - ldr r0, _081E08F4 @ =gUnknown_3007460 + ldr r0, _081E08F4 @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] ldrb r0, [r0, 0x3] @@ -446,7 +446,7 @@ _081E08D2: lsrs r4, r0, 24 cmp r4, 0x3 bls _081E08C0 - ldr r0, _081E08F4 @ =gUnknown_3007460 + ldr r0, _081E08F4 @ =gRfuLinkStatus ldr r1, [r0] movs r0, 0xFF strb r0, [r1] @@ -455,22 +455,22 @@ _081E08E4: pop {r0} bx r0 .align 2, 0 -_081E08EC: .4byte gUnknown_3007464 -_081E08F0: .4byte gUnknown_3007468 -_081E08F4: .4byte gUnknown_3007460 +_081E08EC: .4byte gRfuStatic +_081E08F0: .4byte gRfuFixed +_081E08F4: .4byte gRfuLinkStatus thumb_func_end rfu_CB_defaultCallback thumb_func_start rfu_waitREQComplete rfu_waitREQComplete: @ 81E08F8 push {lr} bl STWI_poll_CommandEnd - ldr r0, _081E0908 @ =gUnknown_3007464 + ldr r0, _081E0908 @ =gRfuStatic ldr r0, [r0] ldrh r0, [r0, 0x1C] pop {r1} bx r1 .align 2, 0 -_081E0908: .4byte gUnknown_3007464 +_081E0908: .4byte gRfuStatic thumb_func_end rfu_waitREQComplete thumb_func_start rfu_REQ_RFUStatus @@ -489,7 +489,7 @@ _081E091C: .4byte rfu_STC_REQ_callback rfu_getRFUStatus: @ 81E0920 push {r4,r5,lr} adds r4, r0, 0 - ldr r5, _081E0938 @ =gUnknown_3007468 + ldr r5, _081E0938 @ =gRfuFixed ldr r0, [r5] adds r0, 0xDC ldr r0, [r0] @@ -499,7 +499,7 @@ rfu_getRFUStatus: @ 81E0920 movs r0, 0x10 b _081E0956 .align 2, 0 -_081E0938: .4byte gUnknown_3007468 +_081E0938: .4byte gRfuFixed _081E093C: bl STWI_poll_CommandEnd lsls r0, 16 @@ -521,8 +521,8 @@ _081E0956: bx r1 thumb_func_end rfu_getRFUStatus - thumb_func_start sub_81E095C -sub_81E095C: @ 81E095C + thumb_func_start rfu_MBOOT_CHILD_inheritanceLinkStatus +rfu_MBOOT_CHILD_inheritanceLinkStatus: @ 81E095C push {lr} ldr r2, _081E0964 @ =_Str_RFU_MBOOT ldr r3, _081E0968 @ =0x30000F0 @@ -561,11 +561,11 @@ _081E0984: bne _081E09CC movs r0, 0xC0 lsls r0, 18 - ldr r1, _081E09C4 @ =gUnknown_3007460 + ldr r1, _081E09C4 @ =gRfuLinkStatus ldr r1, [r1] movs r2, 0x5A bl CpuSet - ldr r0, _081E09C8 @ =gUnknown_3007464 + ldr r0, _081E09C8 @ =gRfuStatic ldr r2, [r0] ldrb r1, [r2] movs r0, 0x80 @@ -575,14 +575,14 @@ _081E0984: b _081E09CE .align 2, 0 _081E09C0: .4byte 0x30000FA -_081E09C4: .4byte gUnknown_3007460 -_081E09C8: .4byte gUnknown_3007464 +_081E09C4: .4byte gRfuLinkStatus +_081E09C8: .4byte gRfuStatic _081E09CC: movs r0, 0x1 _081E09CE: pop {r1} bx r1 - thumb_func_end sub_81E095C + thumb_func_end rfu_MBOOT_CHILD_inheritanceLinkStatus thumb_func_start rfu_REQ_stopMode rfu_REQ_stopMode: @ 81E09D4 @@ -777,14 +777,14 @@ rfu_REQ_configSystem: @ 81E0B1C bl STWI_send_SystemConfigREQ cmp r6, 0 bne _081E0B5C - ldr r0, _081E0B58 @ =gUnknown_3007464 + ldr r0, _081E0B58 @ =gRfuStatic ldr r1, [r0] movs r0, 0x1 strh r0, [r1, 0x1A] b _081E0B76 .align 2, 0 _081E0B54: .4byte rfu_STC_REQ_callback -_081E0B58: .4byte gUnknown_3007464 +_081E0B58: .4byte gRfuStatic _081E0B5C: ldr r5, _081E0B7C @ =0x04000208 ldrh r4, [r5] @@ -794,7 +794,7 @@ _081E0B5C: lsls r0, 2 adds r1, r6, 0 bl Div - ldr r1, _081E0B80 @ =gUnknown_3007464 + ldr r1, _081E0B80 @ =gRfuStatic ldr r1, [r1] strh r0, [r1, 0x1A] strh r4, [r5] @@ -804,7 +804,7 @@ _081E0B76: bx r0 .align 2, 0 _081E0B7C: .4byte 0x04000208 -_081E0B80: .4byte gUnknown_3007464 +_081E0B80: .4byte gRfuStatic thumb_func_end rfu_REQ_configSystem thumb_func_start rfu_REQ_configGameData @@ -896,7 +896,7 @@ rfu_CB_configGameData: @ 81E0C10 ldr r0, _081E0C54 @ =gRfuState ldr r0, [r0] ldr r1, [r0, 0x24] - ldr r0, _081E0C58 @ =gUnknown_3007460 + ldr r0, _081E0C58 @ =gRfuLinkStatus ldr r6, [r0] ldrb r2, [r1, 0x4] adds r5, r6, 0 @@ -921,7 +921,7 @@ rfu_CB_configGameData: @ 81E0C10 b _081E0C62 .align 2, 0 _081E0C54: .4byte gRfuState -_081E0C58: .4byte gUnknown_3007460 +_081E0C58: .4byte gRfuLinkStatus _081E0C5C: adds r1, r6, 0 adds r1, 0x97 @@ -929,7 +929,7 @@ _081E0C5C: _081E0C62: strb r0, [r1] movs r2, 0 - ldr r3, _081E0CA8 @ =gUnknown_3007460 + ldr r3, _081E0CA8 @ =gRfuLinkStatus _081E0C68: ldr r0, [r3] adds r0, 0x9A @@ -944,7 +944,7 @@ _081E0C68: bls _081E0C68 adds r4, 0x1 movs r2, 0 - ldr r3, _081E0CA8 @ =gUnknown_3007460 + ldr r3, _081E0CA8 @ =gRfuLinkStatus _081E0C84: ldr r0, [r3] adds r0, 0xA9 @@ -965,11 +965,11 @@ _081E0C9A: pop {r0} bx r0 .align 2, 0 -_081E0CA8: .4byte gUnknown_3007460 +_081E0CA8: .4byte gRfuLinkStatus thumb_func_end rfu_CB_configGameData - thumb_func_start sub_81E0CAC -sub_81E0CAC: @ 81E0CAC + thumb_func_start rfu_REQ_startSearchChild +rfu_REQ_startSearchChild: @ 81E0CAC push {lr} ldr r0, _081E0CDC @ =rfu_CB_defaultCallback bl STWI_set_Callback_M @@ -979,7 +979,7 @@ sub_81E0CAC: @ 81E0CAC lsrs r1, r0, 16 cmp r1, 0 bne _081E0CE4 - ldr r0, _081E0CE0 @ =gUnknown_3007468 + ldr r0, _081E0CE0 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] @@ -991,7 +991,7 @@ sub_81E0CAC: @ 81E0CAC b _081E0CEA .align 2, 0 _081E0CDC: .4byte rfu_CB_defaultCallback -_081E0CE0: .4byte gUnknown_3007468 +_081E0CE0: .4byte gRfuFixed _081E0CE4: movs r0, 0x19 bl rfu_STC_REQ_callback @@ -1003,7 +1003,7 @@ _081E0CEA: bx r0 .align 2, 0 _081E0CF8: .4byte rfu_CB_startSearchChild - thumb_func_end sub_81E0CAC + thumb_func_end rfu_REQ_startSearchChild thumb_func_start rfu_CB_startSearchChild rfu_CB_startSearchChild: @ 81E0CFC @@ -1015,7 +1015,7 @@ rfu_CB_startSearchChild: @ 81E0CFC adds r2, r1, 0 cmp r2, 0 bne _081E0D14 - ldr r0, _081E0D20 @ =gUnknown_3007464 + ldr r0, _081E0D20 @ =gRfuStatic ldr r1, [r0] movs r0, 0x1 strb r0, [r1, 0x9] @@ -1026,7 +1026,7 @@ _081E0D14: pop {r0} bx r0 .align 2, 0 -_081E0D20: .4byte gUnknown_3007464 +_081E0D20: .4byte gRfuStatic thumb_func_end rfu_CB_startSearchChild thumb_func_start rfu_STC_clearLinkStatus @@ -1042,7 +1042,7 @@ rfu_STC_clearLinkStatus: @ 81E0D24 mov r0, sp movs r5, 0 strh r5, [r0] - ldr r4, _081E0D80 @ =gUnknown_3007460 + ldr r4, _081E0D80 @ =gRfuLinkStatus ldr r1, [r4] adds r1, 0x14 ldr r2, _081E0D84 @ =0x01000040 @@ -1051,7 +1051,7 @@ rfu_STC_clearLinkStatus: @ 81E0D24 strb r5, [r0, 0x8] _081E0D4C: movs r1, 0 - ldr r2, _081E0D80 @ =gUnknown_3007460 + ldr r2, _081E0D80 @ =gRfuLinkStatus adds r4, r2, 0 movs r3, 0 _081E0D54: @@ -1078,7 +1078,7 @@ _081E0D54: pop {r0} bx r0 .align 2, 0 -_081E0D80: .4byte gUnknown_3007460 +_081E0D80: .4byte gRfuLinkStatus _081E0D84: .4byte 0x01000040 thumb_func_end rfu_STC_clearLinkStatus @@ -1115,11 +1115,11 @@ rfu_CB_pollAndEndSearchChild: @ 81E0DB0 lsrs r6, r1, 16 cmp r6, 0 bne _081E0DC2 - bl sub_81E0E38 + bl rfu_STC_readChildList _081E0DC2: cmp r4, 0x1A bne _081E0E04 - ldr r5, _081E0DF8 @ =gUnknown_3007460 + ldr r5, _081E0DF8 @ =gRfuLinkStatus ldr r0, [r5] adds r0, 0x94 ldrh r0, [r0] @@ -1133,7 +1133,7 @@ _081E0DC2: cmp r0, 0 bne _081E0E20 ldr r1, [r5] - ldr r0, _081E0E00 @ =gUnknown_3007468 + ldr r0, _081E0E00 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] @@ -1142,13 +1142,13 @@ _081E0DC2: strh r0, [r1] b _081E0E20 .align 2, 0 -_081E0DF8: .4byte gUnknown_3007460 +_081E0DF8: .4byte gRfuLinkStatus _081E0DFC: .4byte rfu_CB_defaultCallback -_081E0E00: .4byte gUnknown_3007468 +_081E0E00: .4byte gRfuFixed _081E0E04: cmp r4, 0x1B bne _081E0E20 - ldr r0, _081E0E30 @ =gUnknown_3007460 + ldr r0, _081E0E30 @ =gRfuLinkStatus ldr r1, [r0] ldrb r0, [r1] cmp r0, 0xFF @@ -1157,7 +1157,7 @@ _081E0E04: movs r0, 0 strh r0, [r1] _081E0E18: - ldr r0, _081E0E34 @ =gUnknown_3007464 + ldr r0, _081E0E34 @ =gRfuStatic ldr r1, [r0] movs r0, 0 strb r0, [r1, 0x9] @@ -1169,19 +1169,19 @@ _081E0E20: pop {r0} bx r0 .align 2, 0 -_081E0E30: .4byte gUnknown_3007460 -_081E0E34: .4byte gUnknown_3007464 +_081E0E30: .4byte gRfuLinkStatus +_081E0E34: .4byte gRfuStatic thumb_func_end rfu_CB_pollAndEndSearchChild - thumb_func_start sub_81E0E38 -sub_81E0E38: @ 81E0E38 + thumb_func_start rfu_STC_readChildList +rfu_STC_readChildList: @ 81E0E38 push {r4-r7,lr} mov r7, r10 mov r6, r9 mov r5, r8 push {r5-r7} sub sp, 0x4 - ldr r1, _081E0F64 @ =gUnknown_3007468 + ldr r1, _081E0F64 @ =gRfuFixed ldr r0, [r1] adds r0, 0xDC ldr r0, [r0] @@ -1215,7 +1215,7 @@ _081E0E76: cmp r2, 0x3 bls _081E0E76 _081E0E8A: - ldr r0, _081E0F64 @ =gUnknown_3007468 + ldr r0, _081E0F64 @ =gRfuFixed ldr r1, [r0] adds r1, 0xDC ldr r1, [r1] @@ -1229,9 +1229,9 @@ _081E0E96: mov r1, r8 cmp r1, 0 beq _081E0F52 - ldr r2, _081E0F6C @ =gUnknown_3007464 + ldr r2, _081E0F6C @ =gRfuStatic mov r9, r2 - ldr r7, _081E0F70 @ =gUnknown_3007460 + ldr r7, _081E0F70 @ =gRfuLinkStatus mov r10, r9 _081E0EAC: ldrb r2, [r4, 0x2] @@ -1329,11 +1329,11 @@ _081E0F52: pop {r0} bx r0 .align 2, 0 -_081E0F64: .4byte gUnknown_3007468 +_081E0F64: .4byte gRfuFixed _081E0F68: .4byte rfu_CB_defaultCallback -_081E0F6C: .4byte gUnknown_3007464 -_081E0F70: .4byte gUnknown_3007460 - thumb_func_end sub_81E0E38 +_081E0F6C: .4byte gRfuStatic +_081E0F70: .4byte gRfuLinkStatus + thumb_func_end rfu_STC_readChildList thumb_func_start rfu_REQ_startSearchParent rfu_REQ_startSearchParent: @ 81E0F74 @@ -1371,17 +1371,17 @@ _081E0F9E: thumb_func_start rfu_REQ_pollSearchParent rfu_REQ_pollSearchParent: @ 81E0FAC push {lr} - ldr r0, _081E0FBC @ =sub_81E0FC0 + ldr r0, _081E0FBC @ =rfu_CB_pollSearchParent bl STWI_set_Callback_M bl STWI_send_SP_PollingREQ pop {r0} bx r0 .align 2, 0 -_081E0FBC: .4byte sub_81E0FC0 +_081E0FBC: .4byte rfu_CB_pollSearchParent thumb_func_end rfu_REQ_pollSearchParent - thumb_func_start sub_81E0FC0 -sub_81E0FC0: @ 81E0FC0 + thumb_func_start rfu_CB_pollSearchParent +rfu_CB_pollSearchParent: @ 81E0FC0 push {r4,r5,lr} lsls r0, 24 lsrs r5, r0, 24 @@ -1398,7 +1398,7 @@ _081E0FD4: pop {r4,r5} pop {r0} bx r0 - thumb_func_end sub_81E0FC0 + thumb_func_end rfu_CB_pollSearchParent thumb_func_start rfu_REQ_endSearchParent rfu_REQ_endSearchParent: @ 81E0FE4 @@ -1421,12 +1421,12 @@ rfu_STC_readParentCandidateList: @ 81E0FF8 mov r0, sp movs r4, 0 strh r4, [r0] - ldr r5, _081E10A0 @ =gUnknown_3007460 + ldr r5, _081E10A0 @ =gRfuLinkStatus ldr r1, [r5] adds r1, 0x14 ldr r2, _081E10A4 @ =0x01000040 bl CpuSet - ldr r0, _081E10A8 @ =gUnknown_3007468 + ldr r0, _081E10A8 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r2, [r0] @@ -1500,9 +1500,9 @@ _081E1048: strb r0, [r4, 0x3] b _081E10B2 .align 2, 0 -_081E10A0: .4byte gUnknown_3007460 +_081E10A0: .4byte gRfuLinkStatus _081E10A4: .4byte 0x01000040 -_081E10A8: .4byte gUnknown_3007468 +_081E10A8: .4byte gRfuFixed _081E10AC: .4byte 0x00007fff _081E10B0: strb r3, [r4, 0x3] @@ -1563,7 +1563,7 @@ rfu_REQ_startConnectParent: @ 81E1108 lsrs r4, r0, 16 movs r3, 0 movs r2, 0 - ldr r1, _081E1154 @ =gUnknown_3007460 + ldr r1, _081E1154 @ =gRfuLinkStatus ldr r0, [r1] ldrh r0, [r0, 0x14] cmp r0, r4 @@ -1589,7 +1589,7 @@ _081E1134: _081E113C: cmp r3, 0 bne _081E1160 - ldr r0, _081E1158 @ =gUnknown_3007464 + ldr r0, _081E1158 @ =gRfuStatic ldr r0, [r0] strh r4, [r0, 0x1E] ldr r0, _081E115C @ =rfu_STC_REQ_callback @@ -1598,8 +1598,8 @@ _081E113C: bl STWI_send_CP_StartREQ b _081E1168 .align 2, 0 -_081E1154: .4byte gUnknown_3007460 -_081E1158: .4byte gUnknown_3007464 +_081E1154: .4byte gRfuLinkStatus +_081E1158: .4byte gRfuStatic _081E115C: .4byte rfu_STC_REQ_callback _081E1160: movs r0, 0x1F @@ -1639,7 +1639,7 @@ rfu_CB_pollConnectParent: @ 81E1184 str r1, [sp, 0x28] cmp r1, 0 bne _081E1286 - ldr r0, _081E1240 @ =gUnknown_3007468 + ldr r0, _081E1240 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] @@ -1653,7 +1653,7 @@ rfu_CB_pollConnectParent: @ 81E1184 lsls r0, 17 lsls r0, r1 lsrs r2, r0, 24 - ldr r4, _081E1244 @ =gUnknown_3007460 + ldr r4, _081E1244 @ =gRfuLinkStatus ldr r3, [r4] ldrb r1, [r3, 0x2] adds r0, r2, 0 @@ -1677,7 +1677,7 @@ rfu_CB_pollConnectParent: @ 81E1184 strb r0, [r1, 0x1] ldr r0, [r4] strb r2, [r0] - ldr r3, _081E1248 @ =gUnknown_3007464 + ldr r3, _081E1248 @ =gRfuStatic ldr r2, [r3] ldrb r1, [r2] movs r0, 0x80 @@ -1719,9 +1719,9 @@ _081E1202: strb r1, [r0, 0x8] b _081E1264 .align 2, 0 -_081E1240: .4byte gUnknown_3007468 -_081E1244: .4byte gUnknown_3007460 -_081E1248: .4byte gUnknown_3007464 +_081E1240: .4byte gRfuFixed +_081E1244: .4byte gRfuLinkStatus +_081E1248: .4byte gRfuStatic _081E124C: .4byte 0x01000040 _081E1250: adds r0, r4, 0 @@ -1738,7 +1738,7 @@ _081E125A: _081E1264: cmp r5, 0x3 bhi _081E1286 - ldr r4, _081E12A0 @ =gUnknown_3007460 + ldr r4, _081E12A0 @ =gRfuLinkStatus mov r0, r10 lsls r5, r0, 5 adds r0, r5, 0 @@ -1765,7 +1765,7 @@ _081E1286: pop {r0} bx r0 .align 2, 0 -_081E12A0: .4byte gUnknown_3007460 +_081E12A0: .4byte gRfuLinkStatus thumb_func_end rfu_CB_pollConnectParent thumb_func_start rfu_getConnectParentStatus @@ -1774,7 +1774,7 @@ rfu_getConnectParentStatus: @ 81E12A4 adds r3, r0, 0 movs r0, 0xFF strb r0, [r3] - ldr r0, _081E12C4 @ =gUnknown_3007468 + ldr r0, _081E12C4 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r2, [r0] @@ -1787,7 +1787,7 @@ rfu_getConnectParentStatus: @ 81E12A4 movs r0, 0x10 b _081E12D4 .align 2, 0 -_081E12C4: .4byte gUnknown_3007468 +_081E12C4: .4byte gRfuFixed _081E12C8: adds r2, 0x6 ldrb r0, [r2] @@ -1806,14 +1806,14 @@ rfu_REQ_endConnectParent: @ 81E12D8 ldr r0, _081E1304 @ =rfu_CB_pollConnectParent bl STWI_set_Callback_M bl STWI_send_CP_EndREQ - ldr r0, _081E1308 @ =gUnknown_3007468 + ldr r0, _081E1308 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r1, [r0] ldrb r0, [r1, 0x6] cmp r0, 0x3 bhi _081E1300 - ldr r0, _081E130C @ =gUnknown_3007464 + ldr r0, _081E130C @ =gRfuStatic ldr r0, [r0] adds r0, 0xA ldrb r1, [r1, 0x6] @@ -1825,20 +1825,20 @@ _081E1300: bx r0 .align 2, 0 _081E1304: .4byte rfu_CB_pollConnectParent -_081E1308: .4byte gUnknown_3007468 -_081E130C: .4byte gUnknown_3007464 +_081E1308: .4byte gRfuFixed +_081E130C: .4byte gRfuStatic thumb_func_end rfu_REQ_endConnectParent thumb_func_start rfu_syncVBlank rfu_syncVBlank: @ 81E1310 push {r4,r5,lr} bl rfu_NI_checkCommFailCounter - ldr r0, _081E1358 @ =gUnknown_3007460 + ldr r0, _081E1358 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0xFF beq _081E13E8 - ldr r4, _081E135C @ =gUnknown_3007464 + ldr r4, _081E135C @ =gRfuStatic ldr r1, [r4] ldrb r0, [r1, 0x6] cmp r0, 0 @@ -1866,8 +1866,8 @@ _081E132E: strh r0, [r1, 0x20] b _081E136A .align 2, 0 -_081E1358: .4byte gUnknown_3007460 -_081E135C: .4byte gUnknown_3007464 +_081E1358: .4byte gRfuLinkStatus +_081E135C: .4byte gRfuStatic _081E1360: cmp r3, 0 beq _081E1380 @@ -1878,16 +1878,16 @@ _081E136A: cmp r3, 0 beq _081E1380 _081E136E: - ldr r3, _081E137C @ =gUnknown_3007464 + ldr r3, _081E137C @ =gRfuStatic ldr r2, [r3] ldrb r1, [r2] movs r0, 0xFD ands r0, r1 b _081E138A .align 2, 0 -_081E137C: .4byte gUnknown_3007464 +_081E137C: .4byte gRfuStatic _081E1380: - ldr r3, _081E13DC @ =gUnknown_3007464 + ldr r3, _081E13DC @ =gRfuStatic ldr r2, [r3] ldrb r1, [r2] movs r0, 0x2 @@ -1906,7 +1906,7 @@ _081E138A: movs r0, 0xFB ands r0, r1 strb r0, [r3] - ldr r0, _081E13E0 @ =gUnknown_3007460 + ldr r0, _081E13E0 @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] ldrb r0, [r0, 0x3] @@ -1928,15 +1928,15 @@ _081E13C4: lsrs r4, r0, 24 cmp r4, 0x3 bls _081E13B2 - ldr r0, _081E13E0 @ =gUnknown_3007460 + ldr r0, _081E13E0 @ =gRfuLinkStatus ldr r1, [r0] movs r0, 0xFF strb r0, [r1] movs r0, 0x1 b _081E13EA .align 2, 0 -_081E13DC: .4byte gUnknown_3007464 -_081E13E0: .4byte gUnknown_3007460 +_081E13DC: .4byte gRfuStatic +_081E13E0: .4byte gRfuLinkStatus _081E13E4: subs r0, 0x1 strh r0, [r3, 0x20] @@ -1948,8 +1948,8 @@ _081E13EA: bx r1 thumb_func_end rfu_syncVBlank - thumb_func_start sub_81E13F0 -sub_81E13F0: @ 81E13F0 + thumb_func_start rfu_REQBN_watchLink +rfu_REQBN_watchLink: @ 81E13F0 push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -1975,7 +1975,7 @@ sub_81E13F0: @ 81E13F0 ldrb r0, [r2, 0xC] ldr r2, [sp, 0x4] strb r0, [r2] - ldr r4, _081E1490 @ =gUnknown_3007460 + ldr r4, _081E1490 @ =gRfuLinkStatus ldr r0, [r4] ldrb r0, [r0] cmp r0, 0xFF @@ -1989,7 +1989,7 @@ _081E142E: bne _081E143A b _081E178E _081E143A: - ldr r3, _081E1498 @ =gUnknown_3007464 + ldr r3, _081E1498 @ =gRfuStatic ldr r2, [r3] ldrb r1, [r2] movs r0, 0x4 @@ -2014,7 +2014,7 @@ _081E1460: lsrs r0, 24 cmp r0, 0x29 bne _081E14A0 - ldr r0, _081E149C @ =gUnknown_3007468 + ldr r0, _081E149C @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r1, [r0] @@ -2036,16 +2036,16 @@ _081E148A: str r2, [sp, 0x8] b _081E14F8 .align 2, 0 -_081E1490: .4byte gUnknown_3007460 +_081E1490: .4byte gRfuLinkStatus _081E1494: .4byte gRfuState -_081E1498: .4byte gUnknown_3007464 -_081E149C: .4byte gUnknown_3007468 +_081E1498: .4byte gRfuStatic +_081E149C: .4byte gRfuFixed _081E14A0: movs r0, 0x9B lsls r0, 1 cmp r5, r0 bne _081E14F0 - ldr r0, _081E154C @ =gUnknown_3007468 + ldr r0, _081E154C @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] @@ -2068,7 +2068,7 @@ _081E14C6: ands r0, r1 cmp r0, 0 beq _081E14E6 - ldr r0, _081E1550 @ =gUnknown_3007460 + ldr r0, _081E1550 @ =gRfuLinkStatus ldr r0, [r0] adds r0, 0xA adds r0, r5 @@ -2088,7 +2088,7 @@ _081E14F0: bne _081E14F8 b _081E178E _081E14F8: - ldr r4, _081E154C @ =gUnknown_3007468 + ldr r4, _081E154C @ =gRfuFixed ldr r0, [r4] adds r0, 0xDC ldr r0, [r0] @@ -2110,7 +2110,7 @@ _081E14F8: ldr r0, [r0] adds r2, r0, 0x4 movs r5, 0 - ldr r3, _081E1550 @ =gUnknown_3007460 + ldr r3, _081E1550 @ =gRfuLinkStatus _081E152C: ldr r0, [r3] adds r0, 0xA @@ -2128,8 +2128,8 @@ _081E152C: movs r5, 0 b _081E1564 .align 2, 0 -_081E154C: .4byte gUnknown_3007468 -_081E1550: .4byte gUnknown_3007460 +_081E154C: .4byte gRfuFixed +_081E1550: .4byte gRfuLinkStatus _081E1554: .4byte rfu_CB_defaultCallback _081E1558: movs r0, 0x11 @@ -2152,7 +2152,7 @@ _081E1578: ldr r2, [sp, 0x8] cmp r2, 0x1 bne _081E164E - ldr r4, _081E15B8 @ =gUnknown_3007460 + ldr r4, _081E15B8 @ =gRfuLinkStatus ldr r1, [r4] ldrb r0, [r1, 0x2] ands r0, r6 @@ -2167,7 +2167,7 @@ _081E1578: ldrb r0, [r1] cmp r0, 0x1 bne _081E15C0 - ldr r2, _081E15BC @ =gUnknown_3007464 + ldr r2, _081E15BC @ =gRfuStatic ldr r1, [r2] adds r1, 0xA adds r1, r5 @@ -2182,15 +2182,15 @@ _081E1578: bls _081E164E b _081E1626 .align 2, 0 -_081E15B8: .4byte gUnknown_3007460 -_081E15BC: .4byte gUnknown_3007464 +_081E15B8: .4byte gRfuLinkStatus +_081E15BC: .4byte gRfuStatic _081E15C0: bl STWI_send_SystemStatusREQ bl STWI_poll_CommandEnd lsls r0, 16 cmp r0, 0 bne _081E164E - ldr r0, _081E15F0 @ =gUnknown_3007468 + ldr r0, _081E15F0 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] @@ -2207,9 +2207,9 @@ _081E15C0: ldr r0, [sp] b _081E164C .align 2, 0 -_081E15F0: .4byte gUnknown_3007468 +_081E15F0: .4byte gRfuFixed _081E15F4: - ldr r2, _081E163C @ =gUnknown_3007464 + ldr r2, _081E163C @ =gRfuStatic ldr r1, [r2] adds r1, 0xA adds r1, r5 @@ -2245,9 +2245,9 @@ _081E1626: strb r0, [r2] b _081E164E .align 2, 0 -_081E163C: .4byte gUnknown_3007464 +_081E163C: .4byte gRfuStatic _081E1640: - ldr r0, _081E16B0 @ =gUnknown_3007464 + ldr r0, _081E16B0 @ =gRfuStatic ldr r0, [r0] adds r0, 0xA adds r0, r5 @@ -2256,7 +2256,7 @@ _081E1640: _081E164C: strb r1, [r0] _081E164E: - ldr r2, _081E16B4 @ =gUnknown_3007460 + ldr r2, _081E16B4 @ =gRfuLinkStatus mov r12, r2 ldr r1, [r2] ldrb r7, [r1] @@ -2298,15 +2298,15 @@ _081E164E: ldrb r0, [r1, 0x1] adds r0, 0x1 strb r0, [r1, 0x1] - ldr r0, _081E16B0 @ =gUnknown_3007464 + ldr r0, _081E16B0 @ =gRfuStatic ldr r0, [r0] adds r0, 0xA adds r0, r5 strb r3, [r0] b _081E1742 .align 2, 0 -_081E16B0: .4byte gUnknown_3007464 -_081E16B4: .4byte gUnknown_3007460 +_081E16B0: .4byte gRfuStatic +_081E16B4: .4byte gRfuLinkStatus _081E16B8: movs r0, 0 strb r0, [r4] @@ -2319,7 +2319,7 @@ _081E16BE: bne _081E1742 bl STWI_send_SlotStatusREQ bl STWI_poll_CommandEnd - ldr r0, _081E1708 @ =gUnknown_3007468 + ldr r0, _081E1708 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r2, [r0] @@ -2334,7 +2334,7 @@ _081E16BE: ldrb r0, [r2, 0x2] cmp r0, r5 bne _081E1710 - ldr r0, _081E170C @ =gUnknown_3007464 + ldr r0, _081E170C @ =gRfuStatic ldr r0, [r0] lsls r1, r5, 1 adds r0, 0x12 @@ -2348,8 +2348,8 @@ _081E16BE: lsls r0, 24 b _081E173E .align 2, 0 -_081E1708: .4byte gUnknown_3007468 -_081E170C: .4byte gUnknown_3007464 +_081E1708: .4byte gRfuFixed +_081E170C: .4byte gRfuStatic _081E1710: adds r2, 0x4 subs r0, r3, 0x1 @@ -2361,7 +2361,7 @@ _081E1710: ldrb r0, [r2, 0x2] cmp r0, r5 bne _081E1710 - ldr r0, _081E17A0 @ =gUnknown_3007464 + ldr r0, _081E17A0 @ =gRfuStatic ldr r0, [r0] lsls r1, r5, 1 adds r0, 0x12 @@ -2378,7 +2378,7 @@ _081E173E: lsrs r0, 24 mov r9, r0 _081E1742: - ldr r0, _081E17A4 @ =gUnknown_3007460 + ldr r0, _081E17A4 @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] mov r2, r8 @@ -2405,7 +2405,7 @@ _081E1768: bl STWI_send_DisconnectREQ bl STWI_poll_CommandEnd _081E1778: - ldr r1, _081E17A8 @ =gUnknown_3007468 + ldr r1, _081E17A8 @ =gRfuFixed ldr r0, [r1] adds r0, 0xDC ldr r0, [r0] @@ -2428,10 +2428,10 @@ _081E1790: pop {r1} bx r1 .align 2, 0 -_081E17A0: .4byte gUnknown_3007464 -_081E17A4: .4byte gUnknown_3007460 -_081E17A8: .4byte gUnknown_3007468 - thumb_func_end sub_81E13F0 +_081E17A0: .4byte gRfuStatic +_081E17A4: .4byte gRfuLinkStatus +_081E17A8: .4byte gRfuFixed + thumb_func_end rfu_REQBN_watchLink thumb_func_start rfu_STC_removeLinkData rfu_STC_removeLinkData: @ 81E17AC @@ -2448,7 +2448,7 @@ rfu_STC_removeLinkData: @ 81E17AC lsls r0, 17 lsls r0, r7 lsrs r5, r0, 24 - ldr r1, _081E1850 @ =gUnknown_3007460 + ldr r1, _081E1850 @ =gRfuLinkStatus ldr r4, [r1] ldrb r0, [r4, 0x2] ands r0, r5 @@ -2520,7 +2520,7 @@ _081E1844: pop {r0} bx r0 .align 2, 0 -_081E1850: .4byte gUnknown_3007460 +_081E1850: .4byte gRfuLinkStatus _081E1854: .4byte 0x00ff00ff _081E1858: .4byte 0x01000010 thumb_func_end rfu_STC_removeLinkData @@ -2530,7 +2530,7 @@ rfu_REQ_disconnect: @ 81E185C push {r4,lr} lsls r0, 24 lsrs r4, r0, 24 - ldr r2, _081E18A0 @ =gUnknown_3007460 + ldr r2, _081E18A0 @ =gRfuLinkStatus ldr r1, [r2] ldrb r0, [r1, 0x2] ldrb r1, [r1, 0x3] @@ -2538,7 +2538,7 @@ rfu_REQ_disconnect: @ 81E185C ands r0, r4 cmp r0, 0 beq _081E18E0 - ldr r0, _081E18A4 @ =gUnknown_3007464 + ldr r0, _081E18A4 @ =gRfuStatic ldr r1, [r0] strb r4, [r1, 0x5] ldr r2, [r2] @@ -2561,8 +2561,8 @@ rfu_REQ_disconnect: @ 81E185C bl rfu_CB_disconnect b _081E18E0 .align 2, 0 -_081E18A0: .4byte gUnknown_3007460 -_081E18A4: .4byte gUnknown_3007464 +_081E18A0: .4byte gRfuLinkStatus +_081E18A4: .4byte gRfuStatic _081E18A8: ldr r0, [r3] ldrb r0, [r0, 0x9] @@ -2603,7 +2603,7 @@ rfu_CB_disconnect: @ 81E18EC lsrs r5, r1, 16 cmp r5, 0x3 bne _081E1928 - ldr r0, _081E19BC @ =gUnknown_3007460 + ldr r0, _081E19BC @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0 @@ -2615,7 +2615,7 @@ rfu_CB_disconnect: @ 81E18EC lsls r0, 16 cmp r0, 0 bne _081E1928 - ldr r0, _081E19C4 @ =gUnknown_3007468 + ldr r0, _081E19C4 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] @@ -2624,9 +2624,9 @@ rfu_CB_disconnect: @ 81E18EC bne _081E1928 movs r5, 0 _081E1928: - ldr r3, _081E19C8 @ =gUnknown_3007464 + ldr r3, _081E19C8 @ =gRfuStatic ldr r2, [r3] - ldr r0, _081E19BC @ =gUnknown_3007460 + ldr r0, _081E19BC @ =gRfuLinkStatus ldr r1, [r0] ldrb r0, [r1, 0x2] ldrb r1, [r1, 0x3] @@ -2634,7 +2634,7 @@ _081E1928: ldrb r1, [r2, 0x5] ands r0, r1 strb r0, [r2, 0x5] - ldr r0, _081E19C4 @ =gUnknown_3007468 + ldr r0, _081E19C4 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r1, [r0] @@ -2649,7 +2649,7 @@ _081E1950: lsls r0, 17 lsls r0, r4 lsrs r0, 24 - ldr r1, _081E19C8 @ =gUnknown_3007464 + ldr r1, _081E19C8 @ =gRfuStatic ldr r1, [r1] ldrb r1, [r1, 0x5] ands r0, r1 @@ -2665,7 +2665,7 @@ _081E196C: cmp r4, 0x3 bls _081E1950 _081E1976: - ldr r0, _081E19BC @ =gUnknown_3007460 + ldr r0, _081E19BC @ =gRfuLinkStatus ldr r2, [r0] ldrb r1, [r2, 0x2] ldrb r0, [r2, 0x3] @@ -2678,7 +2678,7 @@ _081E1988: adds r0, r6, 0 adds r1, r5, 0 bl rfu_STC_REQ_callback - ldr r0, _081E19C8 @ =gUnknown_3007464 + ldr r0, _081E19C8 @ =gRfuStatic ldr r0, [r0] ldrb r0, [r0, 0x9] cmp r0, 0 @@ -2698,10 +2698,10 @@ _081E19B6: pop {r0} bx r0 .align 2, 0 -_081E19BC: .4byte gUnknown_3007460 +_081E19BC: .4byte gRfuLinkStatus _081E19C0: .4byte rfu_CB_defaultCallback -_081E19C4: .4byte gUnknown_3007468 -_081E19C8: .4byte gUnknown_3007464 +_081E19C4: .4byte gRfuFixed +_081E19C8: .4byte gRfuStatic thumb_func_end rfu_CB_disconnect thumb_func_start rfu_REQ_CHILD_startConnectRecovery @@ -2709,7 +2709,7 @@ rfu_REQ_CHILD_startConnectRecovery: @ 81E19CC push {r4,r5,lr} lsls r0, 24 lsrs r5, r0, 24 - ldr r0, _081E1A1C @ =gUnknown_3007464 + ldr r0, _081E1A1C @ =gRfuStatic ldr r0, [r0] strb r5, [r0, 0x5] movs r4, 0 @@ -2733,7 +2733,7 @@ _081E19E6: _081E19FA: adds r0, r2, 0 bl STWI_set_Callback_M - ldr r0, _081E1A24 @ =gUnknown_3007460 + ldr r0, _081E1A24 @ =gRfuLinkStatus ldr r1, [r0] lsls r0, r4, 5 adds r0, r1, r0 @@ -2746,9 +2746,9 @@ _081E19FA: pop {r0} bx r0 .align 2, 0 -_081E1A1C: .4byte gUnknown_3007464 +_081E1A1C: .4byte gRfuStatic _081E1A20: .4byte rfu_STC_REQ_callback -_081E1A24: .4byte gUnknown_3007460 +_081E1A24: .4byte gRfuLinkStatus thumb_func_end rfu_REQ_CHILD_startConnectRecovery thumb_func_start rfu_REQ_CHILD_pollConnectRecovery @@ -2775,20 +2775,20 @@ rfu_CB_CHILD_pollConnectRecovery: @ 81E1A3C lsrs r7, r1, 16 cmp r7, 0 bne _081E1AC0 - ldr r0, _081E1AD4 @ =gUnknown_3007468 + ldr r0, _081E1AD4 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] ldrb r0, [r0, 0x4] cmp r0, 0 bne _081E1AC0 - ldr r0, _081E1AD8 @ =gUnknown_3007464 + ldr r0, _081E1AD8 @ =gRfuStatic ldr r1, [r0] ldrb r1, [r1, 0x5] adds r6, r0, 0 cmp r1, 0 beq _081E1AC0 - ldr r1, _081E1ADC @ =gUnknown_3007460 + ldr r1, _081E1ADC @ =gRfuLinkStatus ldr r0, [r1] strb r7, [r0] movs r4, 0 @@ -2843,9 +2843,9 @@ _081E1AC0: pop {r0} bx r0 .align 2, 0 -_081E1AD4: .4byte gUnknown_3007468 -_081E1AD8: .4byte gUnknown_3007464 -_081E1ADC: .4byte gUnknown_3007460 +_081E1AD4: .4byte gRfuFixed +_081E1AD8: .4byte gRfuStatic +_081E1ADC: .4byte gRfuLinkStatus thumb_func_end rfu_CB_CHILD_pollConnectRecovery thumb_func_start rfu_CHILD_getConnectRecoveryStatus @@ -2854,7 +2854,7 @@ rfu_CHILD_getConnectRecoveryStatus: @ 81E1AE0 adds r2, r0, 0 movs r0, 0xFF strb r0, [r2] - ldr r0, _081E1B00 @ =gUnknown_3007468 + ldr r0, _081E1B00 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r1, [r0] @@ -2867,7 +2867,7 @@ rfu_CHILD_getConnectRecoveryStatus: @ 81E1AE0 movs r0, 0x10 b _081E1B0A .align 2, 0 -_081E1B00: .4byte gUnknown_3007468 +_081E1B00: .4byte gRfuFixed _081E1B04: ldrb r0, [r1, 0x4] strb r0, [r2] @@ -2889,8 +2889,8 @@ rfu_REQ_CHILD_endConnectRecovery: @ 81E1B10 _081E1B20: .4byte rfu_CB_CHILD_pollConnectRecovery thumb_func_end rfu_REQ_CHILD_endConnectRecovery - thumb_func_start sub_81E1B24 -sub_81E1B24: @ 81E1B24 + thumb_func_start rfu_STC_fastCopy +rfu_STC_fastCopy: @ 81E1B24 push {r4-r6,lr} adds r5, r0, 0 adds r6, r1, 0 @@ -2916,7 +2916,7 @@ _081E1B48: pop {r4-r6} pop {r0} bx r0 - thumb_func_end sub_81E1B24 + thumb_func_end rfu_STC_fastCopy thumb_func_start rfu_REQ_changeMasterSlave rfu_REQ_changeMasterSlave: @ 81E1B54 @@ -2994,7 +2994,7 @@ rfu_clearAllSlot: @ 81E1BB8 _081E1BD4: mov r0, sp strh r7, [r0] - ldr r0, _081E1C40 @ =gUnknown_3007450 + ldr r0, _081E1C40 @ =gRfuSlotStatusNI lsls r4, r5, 2 adds r0, r4, r0 ldr r1, [r0] @@ -3002,13 +3002,13 @@ _081E1BD4: ldr r2, _081E1C44 @ =0x01000034 bl CpuSet strh r7, [r6] - ldr r0, _081E1C48 @ =gUnknown_3007440 + ldr r0, _081E1C48 @ =gRfuSlotStatusUNI adds r4, r0 ldr r1, [r4] adds r0, r6, 0 ldr r2, _081E1C4C @ =0x0100000a bl CpuSet - ldr r3, _081E1C50 @ =gUnknown_3007460 + ldr r3, _081E1C50 @ =gRfuLinkStatus ldr r0, [r3] adds r0, 0x10 adds r0, r5 @@ -3029,7 +3029,7 @@ _081E1BD4: strb r1, [r0, 0x5] ldr r0, [r3] strb r1, [r0, 0x6] - ldr r0, _081E1C54 @ =gUnknown_3007464 + ldr r0, _081E1C54 @ =gRfuStatic ldr r0, [r0] strb r1, [r0, 0x2] ldr r0, _081E1C3C @ =0x04000208 @@ -3043,12 +3043,12 @@ _081E1BD4: bx r0 .align 2, 0 _081E1C3C: .4byte 0x04000208 -_081E1C40: .4byte gUnknown_3007450 +_081E1C40: .4byte gRfuSlotStatusNI _081E1C44: .4byte 0x01000034 -_081E1C48: .4byte gUnknown_3007440 +_081E1C48: .4byte gRfuSlotStatusUNI _081E1C4C: .4byte 0x0100000a -_081E1C50: .4byte gUnknown_3007460 -_081E1C54: .4byte gUnknown_3007464 +_081E1C50: .4byte gRfuLinkStatus +_081E1C54: .4byte gRfuStatic thumb_func_end rfu_clearAllSlot thumb_func_start rfu_STC_releaseFrame @@ -3060,14 +3060,14 @@ rfu_STC_releaseFrame: @ 81E1C58 adds r5, r2, 0 lsls r1, 24 lsrs r3, r1, 24 - ldr r0, _081E1C90 @ =gUnknown_3007464 + ldr r0, _081E1C90 @ =gRfuStatic ldr r0, [r0] ldrb r1, [r0] movs r0, 0x80 ands r0, r1 cmp r0, 0 bne _081E1C98 - ldr r6, _081E1C94 @ =gUnknown_3007460 + ldr r6, _081E1C94 @ =gRfuLinkStatus cmp r3, 0 bne _081E1C84 ldr r1, [r6] @@ -3082,10 +3082,10 @@ _081E1C84: strb r0, [r1, 0xF] b _081E1CB8 .align 2, 0 -_081E1C90: .4byte gUnknown_3007464 -_081E1C94: .4byte gUnknown_3007460 +_081E1C90: .4byte gRfuStatic +_081E1C94: .4byte gRfuLinkStatus _081E1C98: - ldr r6, _081E1CC0 @ =gUnknown_3007460 + ldr r6, _081E1CC0 @ =gRfuLinkStatus cmp r3, 0 bne _081E1CAC ldr r1, [r6] @@ -3107,7 +3107,7 @@ _081E1CB8: pop {r0} bx r0 .align 2, 0 -_081E1CC0: .4byte gUnknown_3007460 +_081E1CC0: .4byte gRfuLinkStatus thumb_func_end rfu_STC_releaseFrame thumb_func_start rfu_clearSlot @@ -3149,7 +3149,7 @@ _081E1CF4: cmp r0, 0 beq _081E1DBC movs r3, 0 - ldr r1, _081E1D3C @ =gUnknown_3007450 + ldr r1, _081E1D3C @ =gRfuSlotStatusNI lsls r0, r7, 2 adds r0, r1 mov r9, r0 @@ -3164,7 +3164,7 @@ _081E1D12: beq _081E1D64 mov r2, r9 ldr r4, [r2] - ldr r0, _081E1D40 @ =gUnknown_3007460 + ldr r0, _081E1D40 @ =gRfuLinkStatus ldr r2, [r0] adds r0, r4, 0 adds r0, 0x2C @@ -3175,8 +3175,8 @@ _081E1D12: b _081E1D64 .align 2, 0 _081E1D38: .4byte 0x04000208 -_081E1D3C: .4byte gUnknown_3007450 -_081E1D40: .4byte gUnknown_3007460 +_081E1D3C: .4byte gRfuSlotStatusNI +_081E1D40: .4byte gRfuLinkStatus _081E1D44: movs r0, 0x8 mov r1, r8 @@ -3187,7 +3187,7 @@ _081E1D44: ldr r0, [r2] adds r4, r0, 0 adds r4, 0x34 - ldr r0, _081E1DF8 @ =gUnknown_3007460 + ldr r0, _081E1DF8 @ =gRfuLinkStatus ldr r2, [r0] movs r1, 0x1 lsls r1, r7 @@ -3247,7 +3247,7 @@ _081E1DBC: ands r0, r4 cmp r0, 0 beq _081E1E32 - ldr r1, _081E1E00 @ =gUnknown_3007440 + ldr r1, _081E1E00 @ =gRfuSlotStatusUNI lsls r0, r7, 2 adds r0, r1 ldr r3, [r0] @@ -3257,14 +3257,14 @@ _081E1DBC: ands r0, r1 cmp r0, 0 beq _081E1E24 - ldr r0, _081E1E04 @ =gUnknown_3007464 + ldr r0, _081E1E04 @ =gRfuStatic ldr r0, [r0] ldrb r1, [r0] movs r0, 0x80 ands r0, r1 cmp r0, 0 bne _081E1E08 - ldr r2, _081E1DF8 @ =gUnknown_3007460 + ldr r2, _081E1DF8 @ =gRfuLinkStatus ldr r1, [r2] ldrb r0, [r1, 0xF] adds r0, 0x3 @@ -3273,12 +3273,12 @@ _081E1DBC: strb r0, [r1, 0xF] b _081E1E1A .align 2, 0 -_081E1DF8: .4byte gUnknown_3007460 +_081E1DF8: .4byte gRfuLinkStatus _081E1DFC: .4byte 0x0100001a -_081E1E00: .4byte gUnknown_3007440 -_081E1E04: .4byte gUnknown_3007464 +_081E1E00: .4byte gRfuSlotStatusUNI +_081E1E04: .4byte gRfuStatic _081E1E08: - ldr r2, _081E1E6C @ =gUnknown_3007460 + ldr r2, _081E1E6C @ =gRfuLinkStatus ldr r1, [r2] adds r1, 0x10 adds r1, r7 @@ -3309,7 +3309,7 @@ _081E1E32: mov r1, sp movs r0, 0 strh r0, [r1] - ldr r1, _081E1E74 @ =gUnknown_3007440 + ldr r1, _081E1E74 @ =gRfuSlotStatusUNI lsls r0, r7, 2 adds r0, r1 ldr r1, [r0] @@ -3332,9 +3332,9 @@ _081E1E5C: pop {r1} bx r1 .align 2, 0 -_081E1E6C: .4byte gUnknown_3007460 +_081E1E6C: .4byte gRfuLinkStatus _081E1E70: .4byte 0x01000006 -_081E1E74: .4byte gUnknown_3007440 +_081E1E74: .4byte gRfuSlotStatusUNI _081E1E78: .4byte 0x01000004 _081E1E7C: .4byte 0x04000208 thumb_func_end rfu_clearSlot @@ -3360,7 +3360,7 @@ _081E1E9C: ands r0, r3 cmp r0, 0 beq _081E1EB8 - ldr r0, _081E1EB4 @ =gUnknown_3007450 + ldr r0, _081E1EB4 @ =gRfuSlotStatusNI lsls r1, 2 adds r1, r0 ldr r0, [r1] @@ -3368,7 +3368,7 @@ _081E1E9C: str r6, [r0, 0x6C] b _081E1ED2 .align 2, 0 -_081E1EB4: .4byte gUnknown_3007450 +_081E1EB4: .4byte gRfuSlotStatusNI _081E1EB8: movs r0, 0x10 ands r2, r0 @@ -3378,7 +3378,7 @@ _081E1EB8: lsls r0, 3 b _081E1ED4 _081E1EC6: - ldr r0, _081E1EDC @ =gUnknown_3007440 + ldr r0, _081E1EDC @ =gRfuSlotStatusUNI lsls r1, r4, 2 adds r1, r0 ldr r0, [r1] @@ -3391,7 +3391,7 @@ _081E1ED4: pop {r1} bx r1 .align 2, 0 -_081E1EDC: .4byte gUnknown_3007440 +_081E1EDC: .4byte gRfuSlotStatusUNI thumb_func_end rfu_setRecvBuffer thumb_func_start rfu_NI_setSendData @@ -3428,7 +3428,7 @@ rfu_UNI_setSendData: @ 81E1F0C lsrs r1, r0, 24 lsls r2, 24 lsrs r2, 24 - ldr r0, _081E1F28 @ =gUnknown_3007460 + ldr r0, _081E1F28 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -3436,7 +3436,7 @@ rfu_UNI_setSendData: @ 81E1F0C adds r0, r2, 0x3 b _081E1F2E .align 2, 0 -_081E1F28: .4byte gUnknown_3007460 +_081E1F28: .4byte gRfuLinkStatus _081E1F2C: adds r0, r2, 0x2 _081E1F2E: @@ -3466,7 +3466,7 @@ rfu_NI_CHILD_setSendGameName: @ 81E1F48 lsls r1, 17 lsls r1, r0 lsrs r1, 24 - ldr r0, _081E1F78 @ =gUnknown_3007460 + ldr r0, _081E1F78 @ =gRfuLinkStatus ldr r3, [r0] adds r3, 0x98 movs r0, 0x1A @@ -3479,7 +3479,7 @@ rfu_NI_CHILD_setSendGameName: @ 81E1F48 pop {r1} bx r1 .align 2, 0 -_081E1F78: .4byte gUnknown_3007460 +_081E1F78: .4byte gRfuLinkStatus thumb_func_end rfu_NI_CHILD_setSendGameName thumb_func_start rfu_STC_setSendData_org @@ -3498,7 +3498,7 @@ rfu_STC_setSendData_org: @ 81E1F7C lsls r2, 24 lsrs r2, 24 mov r8, r2 - ldr r0, _081E1FA8 @ =gUnknown_3007460 + ldr r0, _081E1FA8 @ =gRfuLinkStatus ldr r2, [r0] ldrb r1, [r2] mov r10, r0 @@ -3507,7 +3507,7 @@ rfu_STC_setSendData_org: @ 81E1F7C ldr r0, _081E1FAC @ =0x00000301 b _081E2166 .align 2, 0 -_081E1FA8: .4byte gUnknown_3007460 +_081E1FA8: .4byte gRfuLinkStatus _081E1FAC: .4byte 0x00000301 _081E1FB0: movs r0, 0xF @@ -3614,7 +3614,7 @@ _081E204E: cmp r6, 0x40 bne _081E2124 _081E2068: - ldr r1, _081E20A0 @ =gUnknown_3007450 + ldr r1, _081E20A0 @ =gRfuSlotStatusNI lsls r0, r2, 2 adds r0, r1 ldr r0, [r0] @@ -3641,7 +3641,7 @@ _081E2068: b _081E20A8 .align 2, 0 _081E209C: .4byte 0x04000208 -_081E20A0: .4byte gUnknown_3007450 +_081E20A0: .4byte gRfuSlotStatusNI _081E20A4: movs r0, 0x1 strb r0, [r1] @@ -3674,7 +3674,7 @@ _081E20C8: bls _081E20C8 movs r2, 0 movs r5, 0x1 - ldr r4, _081E211C @ =gUnknown_3007450 + ldr r4, _081E211C @ =gRfuSlotStatusNI movs r1, 0 _081E20E2: adds r0, r3, 0 @@ -3708,14 +3708,14 @@ _081E20F4: strh r0, [r2] b _081E215C .align 2, 0 -_081E211C: .4byte gUnknown_3007450 +_081E211C: .4byte gRfuSlotStatusNI _081E2120: .4byte 0x00008021 _081E2124: movs r0, 0x10 ands r0, r6 cmp r0, 0 beq _081E215C - ldr r1, _081E2178 @ =gUnknown_3007440 + ldr r1, _081E2178 @ =gRfuSlotStatusUNI lsls r0, r2, 2 adds r0, r1 ldr r1, [r0] @@ -3755,7 +3755,7 @@ _081E2166: pop {r1} bx r1 .align 2, 0 -_081E2178: .4byte gUnknown_3007440 +_081E2178: .4byte gRfuSlotStatusUNI _081E217C: .4byte 0x00008024 _081E2180: .4byte 0x04000208 thumb_func_end rfu_STC_setSendData_org @@ -3783,7 +3783,7 @@ rfu_changeSendTarget: @ 81E2184 _081E21A8: cmp r0, 0x20 bne _081E2248 - ldr r0, _081E2238 @ =gUnknown_3007450 + ldr r0, _081E2238 @ =gRfuSlotStatusNI mov r12, r0 lsls r0, r7, 2 add r0, r12 @@ -3834,7 +3834,7 @@ _081E2202: lsrs r2, r0, 24 cmp r2, 0x3 bls _081E21EE - ldr r0, _081E2244 @ =gUnknown_3007460 + ldr r0, _081E2244 @ =gRfuLinkStatus ldr r1, [r0] ldrb r0, [r1, 0x4] ldr r2, [sp] @@ -3856,14 +3856,14 @@ _081E222E: strh r1, [r0] b _081E22DA .align 2, 0 -_081E2238: .4byte gUnknown_3007450 +_081E2238: .4byte gRfuSlotStatusNI _081E223C: .4byte 0x00008020 _081E2240: .4byte 0x04000208 -_081E2244: .4byte gUnknown_3007460 +_081E2244: .4byte gRfuLinkStatus _081E2248: cmp r3, 0x10 bne _081E22D4 - ldr r3, _081E2264 @ =gUnknown_3007440 + ldr r3, _081E2264 @ =gRfuSlotStatusUNI lsls r1, r7, 2 adds r0, r1, r3 ldr r0, [r0] @@ -3876,7 +3876,7 @@ _081E225E: ldr r0, _081E226C @ =0x00000403 b _081E22DC .align 2, 0 -_081E2264: .4byte gUnknown_3007440 +_081E2264: .4byte gRfuSlotStatusUNI _081E2268: .4byte 0x00008024 _081E226C: .4byte 0x00000403 _081E2270: @@ -3911,7 +3911,7 @@ _081E22A0: ldrh r0, [r3] mov r8, r0 strh r2, [r3] - ldr r4, _081E22D0 @ =gUnknown_3007460 + ldr r4, _081E22D0 @ =gRfuLinkStatus ldr r2, [r4] adds r5, r1, r5 ldr r0, [r5] @@ -3931,7 +3931,7 @@ _081E22A0: b _081E22DA .align 2, 0 _081E22CC: .4byte 0x04000208 -_081E22D0: .4byte gUnknown_3007460 +_081E22D0: .4byte gRfuLinkStatus _081E22D4: movs r0, 0xC0 lsls r0, 3 @@ -3960,7 +3960,7 @@ rfu_NI_stopReceivingData: @ 81E22EC lsls r0, 3 b _081E2356 _081E22FC: - ldr r1, _081E2328 @ =gUnknown_3007450 + ldr r1, _081E2328 @ =gRfuSlotStatusNI lsls r0, r3, 2 adds r0, r1 ldr r2, [r0] @@ -3983,14 +3983,14 @@ _081E22FC: movs r0, 0x48 b _081E2336 .align 2, 0 -_081E2328: .4byte gUnknown_3007450 +_081E2328: .4byte gRfuSlotStatusNI _081E232C: .4byte 0x04000208 _081E2330: .4byte 0x00008043 _081E2334: movs r0, 0x47 _081E2336: strh r0, [r2, 0x34] - ldr r0, _081E235C @ =gUnknown_3007460 + ldr r0, _081E235C @ =gRfuLinkStatus ldr r2, [r0] movs r1, 0x1 lsls r1, r3 @@ -4010,7 +4010,7 @@ _081E2356: pop {r1} bx r1 .align 2, 0 -_081E235C: .4byte gUnknown_3007460 +_081E235C: .4byte gRfuLinkStatus _081E2360: .4byte 0x04000208 thumb_func_end rfu_NI_stopReceivingData @@ -4029,7 +4029,7 @@ rfu_UNI_changeAndReadySendData: @ 81E2364 lsls r0, 3 b _081E23F0 _081E237C: - ldr r1, _081E2390 @ =gUnknown_3007440 + ldr r1, _081E2390 @ =gRfuSlotStatusUNI lsls r0, 2 adds r0, r1 ldr r4, [r0] @@ -4040,11 +4040,11 @@ _081E237C: ldr r0, _081E2398 @ =0x00000403 b _081E23F0 .align 2, 0 -_081E2390: .4byte gUnknown_3007440 +_081E2390: .4byte gRfuSlotStatusUNI _081E2394: .4byte 0x00008024 _081E2398: .4byte 0x00000403 _081E239C: - ldr r0, _081E23B0 @ =gUnknown_3007460 + ldr r0, _081E23B0 @ =gRfuLinkStatus ldr r1, [r0] ldrb r0, [r1] cmp r0, 0x1 @@ -4055,7 +4055,7 @@ _081E239C: ldrb r1, [r1, 0xF] b _081E23C2 .align 2, 0 -_081E23B0: .4byte gUnknown_3007460 +_081E23B0: .4byte gRfuLinkStatus _081E23B4: adds r0, r3, 0 adds r0, 0x10 @@ -4101,7 +4101,7 @@ rfu_UNI_readySendData: @ 81E23F8 lsrs r0, 24 cmp r0, 0x3 bhi _081E2416 - ldr r1, _081E241C @ =gUnknown_3007440 + ldr r1, _081E241C @ =gRfuSlotStatusUNI lsls r0, 2 adds r0, r1 ldr r2, [r0] @@ -4115,7 +4115,7 @@ _081E2416: pop {r0} bx r0 .align 2, 0 -_081E241C: .4byte gUnknown_3007440 +_081E241C: .4byte gRfuSlotStatusUNI _081E2420: .4byte 0x00008024 thumb_func_end rfu_UNI_readySendData @@ -4126,7 +4126,7 @@ rfu_UNI_clearRecvNewDataFlag: @ 81E2424 lsrs r0, 24 cmp r0, 0x3 bhi _081E243A - ldr r1, _081E2440 @ =gUnknown_3007440 + ldr r1, _081E2440 @ =gRfuSlotStatusUNI lsls r0, 2 adds r0, r1 ldr r1, [r0] @@ -4136,7 +4136,7 @@ _081E243A: pop {r0} bx r0 .align 2, 0 -_081E2440: .4byte gUnknown_3007440 +_081E2440: .4byte gRfuSlotStatusUNI thumb_func_end rfu_UNI_clearRecvNewDataFlag thumb_func_start rfu_REQ_sendData @@ -4144,7 +4144,7 @@ rfu_REQ_sendData: @ 81E2444 push {r4,r5,lr} lsls r0, 24 lsrs r5, r0, 24 - ldr r0, _081E2490 @ =gUnknown_3007460 + ldr r0, _081E2490 @ =gRfuLinkStatus ldr r2, [r0] ldrb r1, [r2] adds r4, r0, 0 @@ -4162,7 +4162,7 @@ _081E2458: orrs r3, r0 cmp r3, 0 bne _081E24E8 - ldr r0, _081E2494 @ =gUnknown_3007464 + ldr r0, _081E2494 @ =gRfuStatic ldr r2, [r0] ldrb r1, [r2, 0x3] adds r4, r0, 0 @@ -4181,8 +4181,8 @@ _081E2480: strb r0, [r1, 0x8] b _081E249E .align 2, 0 -_081E2490: .4byte gUnknown_3007460 -_081E2494: .4byte gUnknown_3007464 +_081E2490: .4byte gRfuLinkStatus +_081E2494: .4byte gRfuStatic _081E2498: ldrb r0, [r1, 0x7] adds r0, 0x1 @@ -4198,13 +4198,13 @@ _081E249E: cmp r0, 0 bne _081E2542 _081E24B0: - ldr r4, _081E24D4 @ =gUnknown_3007468 + ldr r4, _081E24D4 @ =gRfuFixed ldr r1, [r4] movs r0, 0x1 str r0, [r1, 0x68] movs r0, 0xFF str r0, [r1, 0x78] - ldr r0, _081E24D8 @ =sub_81E2630 + ldr r0, _081E24D8 @ =rfu_CB_sendData3 bl STWI_set_Callback_M cmp r5, 0 bne _081E24DC @@ -4214,8 +4214,8 @@ _081E24B0: bl STWI_send_DataTxREQ b _081E257E .align 2, 0 -_081E24D4: .4byte gUnknown_3007468 -_081E24D8: .4byte sub_81E2630 +_081E24D4: .4byte gRfuFixed +_081E24D8: .4byte rfu_CB_sendData3 _081E24DC: ldr r0, [r4] adds r0, 0x68 @@ -4237,10 +4237,10 @@ _081E24F4: bl STWI_set_Callback_M cmp r5, 0 beq _081E252C - ldr r0, _081E2524 @ =gUnknown_3007468 + ldr r0, _081E2524 @ =gRfuFixed ldr r0, [r0] adds r0, 0x68 - ldr r1, _081E2528 @ =gUnknown_3007464 + ldr r1, _081E2528 @ =gRfuStatic ldr r1, [r1] ldr r1, [r1, 0x24] adds r1, 0x4 @@ -4250,13 +4250,13 @@ _081E24F4: b _081E257E .align 2, 0 _081E2520: .4byte rfu_CB_sendData -_081E2524: .4byte gUnknown_3007468 -_081E2528: .4byte gUnknown_3007464 +_081E2524: .4byte gRfuFixed +_081E2528: .4byte gRfuStatic _081E252C: - ldr r0, _081E2564 @ =gUnknown_3007468 + ldr r0, _081E2564 @ =gRfuFixed ldr r0, [r0] adds r0, 0x68 - ldr r1, _081E2568 @ =gUnknown_3007464 + ldr r1, _081E2568 @ =gRfuStatic ldr r1, [r1] ldr r1, [r1, 0x24] adds r1, 0x4 @@ -4266,7 +4266,7 @@ _081E252C: _081E2542: cmp r5, 0 beq _081E257E - ldr r0, _081E256C @ =gUnknown_3007460 + ldr r0, _081E256C @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -4280,9 +4280,9 @@ _081E2542: bl _call_via_r1 b _081E257E .align 2, 0 -_081E2564: .4byte gUnknown_3007468 -_081E2568: .4byte gUnknown_3007464 -_081E256C: .4byte gUnknown_3007460 +_081E2564: .4byte gRfuFixed +_081E2568: .4byte gRfuStatic +_081E256C: .4byte gRfuLinkStatus _081E2570: .4byte gRfuState _081E2574: ldr r0, _081E2584 @ =rfu_CB_sendData2 @@ -4309,7 +4309,7 @@ rfu_CB_sendData: @ 81E2588 ldr r0, _081E2610 @ =0x00008020 mov r8, r0 _081E259C: - ldr r0, _081E2614 @ =gUnknown_3007440 + ldr r0, _081E2614 @ =gRfuSlotStatusUNI lsls r2, r6, 2 adds r0, r2, r0 ldr r1, [r0] @@ -4319,7 +4319,7 @@ _081E259C: movs r0, 0 strb r0, [r1, 0x2] _081E25AE: - ldr r0, _081E2618 @ =gUnknown_3007450 + ldr r0, _081E2618 @ =gRfuSlotStatusNI adds r0, r2, r0 ldr r4, [r0] ldrh r0, [r4] @@ -4329,7 +4329,7 @@ _081E25AE: movs r1, 0 adds r2, r4, 0 bl rfu_STC_releaseFrame - ldr r5, _081E261C @ =gUnknown_3007460 + ldr r5, _081E261C @ =gRfuLinkStatus ldr r2, [r5] ldrb r1, [r4, 0x1A] ldrb r0, [r2, 0x4] @@ -4355,7 +4355,7 @@ _081E25E8: cmp r6, 0x3 bls _081E259C _081E25F2: - ldr r0, _081E261C @ =gUnknown_3007460 + ldr r0, _081E261C @ =gRfuLinkStatus ldr r1, [r0] ldrb r0, [r1, 0xE] movs r0, 0 @@ -4370,9 +4370,9 @@ _081E25F2: bx r0 .align 2, 0 _081E2610: .4byte 0x00008020 -_081E2614: .4byte gUnknown_3007440 -_081E2618: .4byte gUnknown_3007450 -_081E261C: .4byte gUnknown_3007460 +_081E2614: .4byte gRfuSlotStatusUNI +_081E2618: .4byte gRfuSlotStatusNI +_081E261C: .4byte gRfuLinkStatus thumb_func_end rfu_CB_sendData thumb_func_start rfu_CB_sendData2 @@ -4386,8 +4386,8 @@ rfu_CB_sendData2: @ 81E2620 bx r0 thumb_func_end rfu_CB_sendData2 - thumb_func_start sub_81E2630 -sub_81E2630: @ 81E2630 + thumb_func_start rfu_CB_sendData3 +rfu_CB_sendData3: @ 81E2630 push {lr} lsls r0, 24 lsrs r0, 24 @@ -4407,7 +4407,7 @@ _081E2646: _081E2652: pop {r0} bx r0 - thumb_func_end sub_81E2630 + thumb_func_end rfu_CB_sendData3 thumb_func_start rfu_constructSendLLFrame rfu_constructSendLLFrame: @ 81E2658 @@ -4417,7 +4417,7 @@ rfu_constructSendLLFrame: @ 81E2658 mov r5, r8 push {r5-r7} sub sp, 0x4 - ldr r0, _081E2704 @ =gUnknown_3007460 + ldr r0, _081E2704 @ =gRfuLinkStatus ldr r2, [r0] ldrb r0, [r2] cmp r0, 0xFF @@ -4435,7 +4435,7 @@ _081E2670: movs r0, 0 strb r0, [r2, 0xE] mov r8, r0 - ldr r0, _081E2708 @ =gUnknown_3007468 + ldr r0, _081E2708 @ =gRfuFixed ldr r0, [r0] adds r0, 0x6C str r0, [sp] @@ -4447,7 +4447,7 @@ _081E2670: mov r10, r1 _081E269A: movs r5, 0 - ldr r0, _081E2710 @ =gUnknown_3007450 + ldr r0, _081E2710 @ =gRfuSlotStatusNI lsls r7, r6, 2 adds r4, r7, r0 ldr r2, [r4] @@ -4476,7 +4476,7 @@ _081E26BA: lsrs r0, 16 adds r5, r0 _081E26D6: - ldr r0, _081E2714 @ =gUnknown_3007440 + ldr r0, _081E2714 @ =gRfuSlotStatusUNI adds r0, r7, r0 ldr r0, [r0] ldrh r0, [r0] @@ -4491,7 +4491,7 @@ _081E26D6: _081E26F0: cmp r5, 0 beq _081E2724 - ldr r0, _081E2704 @ =gUnknown_3007460 + ldr r0, _081E2704 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -4499,11 +4499,11 @@ _081E26F0: add r8, r5 b _081E2724 .align 2, 0 -_081E2704: .4byte gUnknown_3007460 -_081E2708: .4byte gUnknown_3007468 +_081E2704: .4byte gRfuLinkStatus +_081E2708: .4byte gRfuFixed _081E270C: .4byte 0x00008024 -_081E2710: .4byte gUnknown_3007450 -_081E2714: .4byte gUnknown_3007440 +_081E2710: .4byte gRfuSlotStatusNI +_081E2714: .4byte gRfuSlotStatusUNI _081E2718: adds r0, r7, r6 adds r0, 0x8 @@ -4517,15 +4517,15 @@ _081E2724: lsrs r6, r0, 24 cmp r6, 0x3 bls _081E269A - ldr r6, _081E2784 @ =gUnknown_3007464 + ldr r6, _081E2784 @ =gRfuStatic mov r0, r8 cmp r0, 0 beq _081E276E ldr r2, [sp] movs r0, 0x3 ands r0, r2 - ldr r5, _081E2788 @ =gUnknown_3007460 - ldr r1, _081E278C @ =gUnknown_3007468 + ldr r5, _081E2788 @ =gRfuLinkStatus + ldr r1, _081E278C @ =gRfuFixed cmp r0, 0 beq _081E2756 movs r4, 0 @@ -4565,9 +4565,9 @@ _081E2774: pop {r0} bx r0 .align 2, 0 -_081E2784: .4byte gUnknown_3007464 -_081E2788: .4byte gUnknown_3007460 -_081E278C: .4byte gUnknown_3007468 +_081E2784: .4byte gRfuStatic +_081E2788: .4byte gRfuLinkStatus +_081E278C: .4byte gRfuFixed thumb_func_end rfu_constructSendLLFrame thumb_func_start rfu_STC_NI_constructLLSF @@ -4583,7 +4583,7 @@ rfu_STC_NI_constructLLSF: @ 81E2790 lsls r0, 24 lsrs r0, 24 mov r10, r0 - ldr r2, _081E280C @ =gUnknown_3007460 + ldr r2, _081E280C @ =gRfuLinkStatus ldr r0, [r2] ldrb r0, [r0] lsls r0, 4 @@ -4637,7 +4637,7 @@ _081E27FA: movs r5, 0 b _081E285C .align 2, 0 -_081E280C: .4byte gUnknown_3007460 +_081E280C: .4byte gRfuLinkStatus _081E2810: .4byte _Str_RfuHeader _081E2814: .4byte 0x00008022 _081E2818: @@ -4709,7 +4709,7 @@ _081E2860: orrs r3, r0 orrs r3, r5 str r3, [sp] - ldr r2, _081E291C @ =gUnknown_3007460 + ldr r2, _081E291C @ =gRfuLinkStatus ldr r0, [r2] ldrb r0, [r0] cmp r0, 0x1 @@ -4750,7 +4750,7 @@ _081E28D2: adds r0, r1 ldr r0, [r0] str r0, [sp, 0x4] - ldr r0, _081E2920 @ =gUnknown_3007468 + ldr r0, _081E2920 @ =gRfuFixed ldr r1, [r0] add r0, sp, 0x4 ldr r3, [r1, 0x4] @@ -4772,7 +4772,7 @@ _081E28F2: movs r0, 0 strb r0, [r6] _081E290C: - ldr r0, _081E291C @ =gUnknown_3007460 + ldr r0, _081E291C @ =gRfuLinkStatus ldr r2, [r0] ldrb r1, [r2] cmp r1, 0x1 @@ -4781,8 +4781,8 @@ _081E290C: strb r1, [r2, 0xE] b _081E2936 .align 2, 0 -_081E291C: .4byte gUnknown_3007460 -_081E2920: .4byte gUnknown_3007468 +_081E291C: .4byte gRfuLinkStatus +_081E2920: .4byte gRfuFixed _081E2924: .4byte 0x00008022 _081E2928: movs r0, 0x1 @@ -4818,7 +4818,7 @@ rfu_STC_UNI_constructLLSF: @ 81E2950 lsls r0, 24 lsrs r0, 24 mov r8, r0 - ldr r1, _081E2978 @ =gUnknown_3007440 + ldr r1, _081E2978 @ =gRfuSlotStatusUNI lsls r0, 2 adds r0, r1 ldr r4, [r0] @@ -4832,9 +4832,9 @@ _081E2974: movs r0, 0 b _081E2A18 .align 2, 0 -_081E2978: .4byte gUnknown_3007440 +_081E2978: .4byte gRfuSlotStatusUNI _081E297C: - ldr r0, _081E29F4 @ =gUnknown_3007460 + ldr r0, _081E29F4 @ =gRfuLinkStatus ldr r2, [r0] ldrb r0, [r2] lsls r0, 4 @@ -4858,7 +4858,7 @@ _081E297C: _081E29A6: mov r2, sp movs r3, 0 - ldr r1, _081E29FC @ =gUnknown_3007468 + ldr r1, _081E29FC @ =gRfuFixed mov r12, r1 add r7, sp, 0x4 ldrb r0, [r5] @@ -4887,7 +4887,7 @@ _081E29CE: adds r0, r7, 0 adds r1, r6, 0 bl _call_via_r3 - ldr r0, _081E29F4 @ =gUnknown_3007460 + ldr r0, _081E29F4 @ =gRfuLinkStatus ldr r2, [r0] ldrb r0, [r2] cmp r0, 0x1 @@ -4896,9 +4896,9 @@ _081E29CE: movs r0, 0x10 b _081E2A0C .align 2, 0 -_081E29F4: .4byte gUnknown_3007460 +_081E29F4: .4byte gRfuLinkStatus _081E29F8: .4byte _Str_RfuHeader -_081E29FC: .4byte gUnknown_3007468 +_081E29FC: .4byte gRfuFixed _081E2A00: movs r0, 0x10 mov r1, r8 @@ -4925,12 +4925,12 @@ _081E2A18: thumb_func_start rfu_REQ_recvData rfu_REQ_recvData: @ 81E2A24 push {r4,lr} - ldr r0, _081E2A58 @ =gUnknown_3007460 + ldr r0, _081E2A58 @ =gRfuLinkStatus ldr r4, [r0] ldrb r0, [r4] cmp r0, 0xFF beq _081E2A50 - ldr r2, _081E2A5C @ =gUnknown_3007464 + ldr r2, _081E2A5C @ =gRfuStatic ldr r3, [r2] ldrb r0, [r4, 0x4] ldrb r1, [r4, 0x5] @@ -4949,8 +4949,8 @@ _081E2A50: pop {r0} bx r0 .align 2, 0 -_081E2A58: .4byte gUnknown_3007460 -_081E2A5C: .4byte gUnknown_3007464 +_081E2A58: .4byte gRfuLinkStatus +_081E2A5C: .4byte gRfuStatic _081E2A60: .4byte rfu_CB_recvData thumb_func_end rfu_REQ_recvData @@ -4968,17 +4968,17 @@ rfu_CB_recvData: @ 81E2A64 lsrs r7, r1, 16 cmp r7, 0 bne _081E2B28 - ldr r0, _081E2AA0 @ =gUnknown_3007468 + ldr r0, _081E2AA0 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r0, [r0] ldrb r0, [r0, 0x1] cmp r0, 0 beq _081E2B28 - ldr r0, _081E2AA4 @ =gUnknown_3007464 + ldr r0, _081E2AA4 @ =gRfuStatic ldr r0, [r0] strb r7, [r0, 0x1] - ldr r0, _081E2AA8 @ =gUnknown_3007460 + ldr r0, _081E2AA8 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -4986,25 +4986,25 @@ rfu_CB_recvData: @ 81E2A64 bl rfu_STC_PARENT_analyzeRecvPacket b _081E2AB0 .align 2, 0 -_081E2AA0: .4byte gUnknown_3007468 -_081E2AA4: .4byte gUnknown_3007464 -_081E2AA8: .4byte gUnknown_3007460 +_081E2AA0: .4byte gRfuFixed +_081E2AA4: .4byte gRfuStatic +_081E2AA8: .4byte gRfuLinkStatus _081E2AAC: bl rfu_STC_CHILD_analyzeRecvPacket _081E2AB0: movs r6, 0 ldr r0, _081E2B40 @ =0x00008043 mov r8, r0 - ldr r3, _081E2B44 @ =gUnknown_3007460 + ldr r3, _081E2B44 @ =gRfuLinkStatus _081E2AB8: - ldr r0, _081E2B48 @ =gUnknown_3007450 + ldr r0, _081E2B48 @ =gRfuSlotStatusNI lsls r1, r6, 2 adds r1, r0 ldr r4, [r1] ldrh r0, [r4, 0x34] cmp r0, r8 bne _081E2B0A - ldr r0, _081E2B4C @ =gUnknown_3007464 + ldr r0, _081E2B4C @ =gRfuStatic ldr r0, [r0] ldrb r0, [r0, 0x1] asrs r0, r6 @@ -5044,7 +5044,7 @@ _081E2B0A: lsrs r6, r0, 24 cmp r6, 0x3 bls _081E2AB8 - ldr r0, _081E2B4C @ =gUnknown_3007464 + ldr r0, _081E2B4C @ =gRfuStatic ldr r1, [r0] ldrb r0, [r1, 0x4] cmp r0, 0 @@ -5067,16 +5067,16 @@ _081E2B28: bx r0 .align 2, 0 _081E2B40: .4byte 0x00008043 -_081E2B44: .4byte gUnknown_3007460 -_081E2B48: .4byte gUnknown_3007450 -_081E2B4C: .4byte gUnknown_3007464 +_081E2B44: .4byte gRfuLinkStatus +_081E2B48: .4byte gRfuSlotStatusNI +_081E2B4C: .4byte gRfuStatic thumb_func_end rfu_CB_recvData thumb_func_start rfu_STC_PARENT_analyzeRecvPacket rfu_STC_PARENT_analyzeRecvPacket: @ 81E2B50 push {r4-r7,lr} sub sp, 0x4 - ldr r1, _081E2BE0 @ =gUnknown_3007468 + ldr r1, _081E2BE0 @ =gRfuFixed ldr r0, [r1] adds r0, 0xDC ldr r0, [r0] @@ -5085,7 +5085,7 @@ rfu_STC_PARENT_analyzeRecvPacket: @ 81E2B50 movs r5, 0 mov r12, r1 movs r7, 0x1F - ldr r4, _081E2BE4 @ =gUnknown_3007464 + ldr r4, _081E2BE4 @ =gRfuStatic movs r6, 0x1 _081E2B6A: mov r0, sp @@ -5151,14 +5151,14 @@ _081E2BD0: pop {r0} bx r0 .align 2, 0 -_081E2BE0: .4byte gUnknown_3007468 -_081E2BE4: .4byte gUnknown_3007464 +_081E2BE0: .4byte gRfuFixed +_081E2BE4: .4byte gRfuStatic thumb_func_end rfu_STC_PARENT_analyzeRecvPacket thumb_func_start rfu_STC_CHILD_analyzeRecvPacket rfu_STC_CHILD_analyzeRecvPacket: @ 81E2BE8 push {r4-r6,lr} - ldr r0, _081E2C38 @ =gUnknown_3007468 + ldr r0, _081E2C38 @ =gRfuFixed ldr r0, [r0] adds r0, 0xDC ldr r1, [r0] @@ -5169,7 +5169,7 @@ rfu_STC_CHILD_analyzeRecvPacket: @ 81E2BE8 adds r5, 0x8 cmp r4, 0 bne _081E2C08 - ldr r0, _081E2C3C @ =gUnknown_3007464 + ldr r0, _081E2C3C @ =gRfuStatic ldr r1, [r0] movs r0, 0xF strb r0, [r1, 0x1] @@ -5199,8 +5199,8 @@ _081E2C30: pop {r0} bx r0 .align 2, 0 -_081E2C38: .4byte gUnknown_3007468 -_081E2C3C: .4byte gUnknown_3007464 +_081E2C38: .4byte gRfuFixed +_081E2C3C: .4byte gRfuStatic thumb_func_end rfu_STC_CHILD_analyzeRecvPacket thumb_func_start rfu_STC_analyzeLLSF @@ -5217,7 +5217,7 @@ rfu_STC_analyzeLLSF: @ 81E2C40 mov r12, r0 lsls r2, 16 lsrs r3, r2, 16 - ldr r2, _081E2C74 @ =gUnknown_3007460 + ldr r2, _081E2C74 @ =gRfuLinkStatus ldr r0, [r2] ldrb r0, [r0] mvns r0, r0 @@ -5232,7 +5232,7 @@ rfu_STC_analyzeLLSF: @ 81E2C40 adds r0, r3, 0 b _081E2E6E .align 2, 0 -_081E2C74: .4byte gUnknown_3007460 +_081E2C74: .4byte gRfuLinkStatus _081E2C78: .4byte _Str_RfuHeader _081E2C7C: movs r5, 0 @@ -5341,7 +5341,7 @@ _081E2CA4: beq _081E2D4A b _081E2E6C _081E2D4A: - ldr r2, _081E2D90 @ =gUnknown_3007460 + ldr r2, _081E2D90 @ =gRfuLinkStatus ldr r3, [r2] ldrb r2, [r3] cmp r2, 0x1 @@ -5371,7 +5371,7 @@ _081E2D80: .4byte 0xffff00ff _081E2D84: .4byte 0xff00ffff _081E2D88: .4byte 0x00ffffff _081E2D8C: .4byte 0x0000ffff -_081E2D90: .4byte gUnknown_3007460 +_081E2D90: .4byte gRfuLinkStatus _081E2D94: mov r5, r9 ldrb r0, [r5, 0x3] @@ -5384,7 +5384,7 @@ _081E2D94: b _081E2E6C _081E2DA8: movs r4, 0 - ldr r1, _081E2DC0 @ =gUnknown_3007450 + ldr r1, _081E2DC0 @ =gRfuSlotStatusNI ldr r0, [r1] ldrb r0, [r0, 0x1A] mov r5, r12 @@ -5395,7 +5395,7 @@ _081E2DA8: ldrb r0, [r3, 0x4] b _081E2DEA .align 2, 0 -_081E2DC0: .4byte gUnknown_3007450 +_081E2DC0: .4byte gRfuSlotStatusNI _081E2DC4: adds r0, r4, 0x1 lsls r0, 24 @@ -5412,7 +5412,7 @@ _081E2DC4: ands r0, r2 cmp r0, 0 beq _081E2DC4 - ldr r3, _081E2E04 @ =gUnknown_3007460 + ldr r3, _081E2E04 @ =gRfuLinkStatus ldr r0, [r3] ldrb r0, [r0, 0x4] mov r5, r12 @@ -5430,7 +5430,7 @@ _081E2DEA: bl rfu_STC_NI_receive_Sender b _081E2E6C .align 2, 0 -_081E2E04: .4byte gUnknown_3007460 +_081E2E04: .4byte gRfuLinkStatus _081E2E08: ldrb r1, [r3, 0x2] mov r2, r9 @@ -5465,7 +5465,7 @@ _081E2E36: bl rfu_STC_NI_receive_Receiver b _081E2E62 _081E2E48: - ldr r0, _081E2E80 @ =gUnknown_3007460 + ldr r0, _081E2E80 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x4] asrs r0, r4 @@ -5495,7 +5495,7 @@ _081E2E6E: pop {r1} bx r1 .align 2, 0 -_081E2E80: .4byte gUnknown_3007460 +_081E2E80: .4byte gRfuLinkStatus thumb_func_end rfu_STC_analyzeLLSF thumb_func_start rfu_STC_UNI_receive @@ -5506,7 +5506,7 @@ rfu_STC_UNI_receive: @ 81E2E84 str r2, [sp] lsls r0, 24 lsrs r7, r0, 24 - ldr r2, _081E2EB8 @ =gUnknown_3007440 + ldr r2, _081E2EB8 @ =gRfuSlotStatusUNI lsls r1, r7, 2 adds r1, r2 ldr r3, [r1] @@ -5527,7 +5527,7 @@ rfu_STC_UNI_receive: @ 81E2E84 strh r0, [r5, 0x2] b _081E2F0E .align 2, 0 -_081E2EB8: .4byte gUnknown_3007440 +_081E2EB8: .4byte gRfuSlotStatusUNI _081E2EBC: .4byte 0x00000701 _081E2EC0: ldrb r0, [r5, 0x7] @@ -5560,7 +5560,7 @@ _081E2EE4: ldr r0, [r0] ldr r0, [r0, 0x14] str r0, [sp, 0x4] - ldr r0, _081E2F30 @ =gUnknown_3007468 + ldr r0, _081E2F30 @ =gRfuFixed ldr r0, [r0] add r1, sp, 0x4 ldr r3, [r0, 0x4] @@ -5573,7 +5573,7 @@ _081E2F0E: ldrh r0, [r5, 0x2] cmp r0, 0 beq _081E2F22 - ldr r0, _081E2F34 @ =gUnknown_3007464 + ldr r0, _081E2F34 @ =gRfuStatic ldr r2, [r0] movs r0, 0x10 lsls r0, r7 @@ -5587,8 +5587,8 @@ _081E2F22: bx r0 .align 2, 0 _081E2F2C: .4byte 0x00008042 -_081E2F30: .4byte gUnknown_3007468 -_081E2F34: .4byte gUnknown_3007464 +_081E2F30: .4byte gRfuFixed +_081E2F34: .4byte gRfuStatic thumb_func_end rfu_STC_UNI_receive thumb_func_start rfu_STC_NI_receive_Sender @@ -5604,7 +5604,7 @@ rfu_STC_NI_receive_Sender: @ 81E2F38 lsls r1, 24 lsrs r1, 24 mov r10, r1 - ldr r1, _081E3004 @ =gUnknown_3007450 + ldr r1, _081E3004 @ =gRfuSlotStatusNI lsrs r0, 22 adds r0, r1 ldr r0, [r0] @@ -5700,7 +5700,7 @@ _081E2FB2: str r0, [r1] b _081E302E .align 2, 0 -_081E3004: .4byte gUnknown_3007450 +_081E3004: .4byte gRfuSlotStatusNI _081E3008: .4byte 0x00008022 _081E300C: .4byte 0x00008021 _081E3010: .4byte 0x00008023 @@ -5811,7 +5811,7 @@ _081E30D8: ldrh r2, [r4] movs r0, 0 strh r0, [r4] - ldr r0, _081E311C @ =gUnknown_3007464 + ldr r0, _081E311C @ =gRfuStatic ldr r3, [r0] movs r0, 0x10 mov r7, r10 @@ -5821,7 +5821,7 @@ _081E30D8: movs r1, 0 strb r0, [r3, 0x2] lsls r0, r7, 2 - ldr r3, _081E3120 @ =gUnknown_3007450 + ldr r3, _081E3120 @ =gRfuSlotStatusNI adds r0, r3 ldr r0, [r0] strh r1, [r0, 0x2] @@ -5839,8 +5839,8 @@ _081E30FE: _081E3110: .4byte 0x80230000 _081E3114: .4byte 0x00008020 _081E3118: .4byte 0x04000208 -_081E311C: .4byte gUnknown_3007464 -_081E3120: .4byte gUnknown_3007450 +_081E311C: .4byte gRfuStatic +_081E3120: .4byte gRfuSlotStatusNI thumb_func_end rfu_STC_NI_receive_Sender thumb_func_start rfu_STC_NI_receive_Receiver @@ -5857,7 +5857,7 @@ rfu_STC_NI_receive_Receiver: @ 81E3124 lsrs r0, 24 mov r8, r0 movs r7, 0 - ldr r1, _081E3184 @ =gUnknown_3007450 + ldr r1, _081E3184 @ =gRfuSlotStatusNI lsls r0, 2 adds r0, r1 ldr r4, [r0] @@ -5874,7 +5874,7 @@ rfu_STC_NI_receive_Receiver: @ 81E3124 ldrb r0, [r6, 0x2] cmp r0, 0x3 bne _081E3194 - ldr r0, _081E3188 @ =gUnknown_3007464 + ldr r0, _081E3188 @ =gRfuStatic ldr r2, [r0] movs r0, 0x1 mov r1, r8 @@ -5894,8 +5894,8 @@ rfu_STC_NI_receive_Receiver: @ 81E3124 strh r0, [r4, 0x34] b _081E31DA .align 2, 0 -_081E3184: .4byte gUnknown_3007450 -_081E3188: .4byte gUnknown_3007464 +_081E3184: .4byte gRfuSlotStatusNI +_081E3188: .4byte gRfuStatic _081E318C: .4byte 0x00008042 _081E3190: .4byte 0x00008043 _081E3194: @@ -5947,7 +5947,7 @@ _081E31DE: ands r0, r1 cmp r2, r0 bne _081E3234 - ldr r0, _081E3290 @ =gUnknown_3007468 + ldr r0, _081E3290 @ =gRfuFixed ldr r0, [r0] lsls r1, r3, 2 adds r1, 0x4 @@ -6005,7 +6005,7 @@ _081E325C: ldrh r2, [r3] movs r0, 0 strh r0, [r3] - ldr r0, _081E329C @ =gUnknown_3007464 + ldr r0, _081E329C @ =gRfuStatic ldr r4, [r0] movs r0, 0x1 mov r1, r8 @@ -6027,10 +6027,10 @@ _081E327A: bx r0 .align 2, 0 _081E328C: .4byte 0x00008041 -_081E3290: .4byte gUnknown_3007468 +_081E3290: .4byte gRfuFixed _081E3294: .4byte 0x00008042 _081E3298: .4byte 0x04000208 -_081E329C: .4byte gUnknown_3007464 +_081E329C: .4byte gRfuStatic thumb_func_end rfu_STC_NI_receive_Receiver thumb_func_start rfu_STC_NI_initSlot_asRecvControllData @@ -6039,7 +6039,7 @@ rfu_STC_NI_initSlot_asRecvControllData: @ 81E32A0 adds r2, r1, 0 lsls r0, 24 lsrs r4, r0, 24 - ldr r0, _081E32BC @ =gUnknown_3007460 + ldr r0, _081E32BC @ =gRfuLinkStatus ldr r3, [r0] ldrb r1, [r3] mov r12, r0 @@ -6050,7 +6050,7 @@ rfu_STC_NI_initSlot_asRecvControllData: @ 81E32A0 adds r1, 0xF b _081E32C8 .align 2, 0 -_081E32BC: .4byte gUnknown_3007460 +_081E32BC: .4byte gRfuLinkStatus _081E32C0: movs r5, 0x2 adds r0, r4, 0 @@ -6073,7 +6073,7 @@ _081E32C8: strh r0, [r2] ldr r0, _081E32F8 @ =0x00000702 strh r0, [r2, 0x18] - ldr r0, _081E32FC @ =gUnknown_3007464 + ldr r0, _081E32FC @ =gRfuStatic ldr r2, [r0] ldrb r1, [r2, 0x4] adds r0, r6, 0 @@ -6082,7 +6082,7 @@ _081E32C8: b _081E3326 .align 2, 0 _081E32F8: .4byte 0x00000702 -_081E32FC: .4byte gUnknown_3007464 +_081E32FC: .4byte gRfuStatic _081E3300: strh r3, [r2, 0x18] ldrb r0, [r1] @@ -6122,7 +6122,7 @@ rfu_STC_NI_initSlot_asRecvDataEntity: @ 81E3330 ldrb r0, [r0] cmp r0, 0x1 bne _081E3354 - ldr r0, _081E3350 @ =gUnknown_3007460 + ldr r0, _081E3350 @ =gRfuLinkStatus lsls r1, r5, 5 adds r1, 0x14 ldr r0, [r0] @@ -6130,9 +6130,9 @@ rfu_STC_NI_initSlot_asRecvDataEntity: @ 81E3330 adds r0, 0x4 b _081E33AA .align 2, 0 -_081E3350: .4byte gUnknown_3007460 +_081E3350: .4byte gRfuLinkStatus _081E3354: - ldr r1, _081E3398 @ =gUnknown_3007450 + ldr r1, _081E3398 @ =gRfuSlotStatusNI lsls r0, r5, 2 adds r0, r1 ldr r2, [r0] @@ -6144,13 +6144,13 @@ _081E3354: lsls r1, 17 lsls r1, r5 lsrs r1, 24 - ldr r0, _081E339C @ =gUnknown_3007464 + ldr r0, _081E339C @ =gRfuStatic ldr r3, [r0] ldrb r2, [r3, 0x4] adds r0, r1, 0 orrs r0, r2 strb r0, [r3, 0x4] - ldr r0, _081E33A0 @ =gUnknown_3007460 + ldr r0, _081E33A0 @ =gRfuLinkStatus ldr r2, [r0] ldrb r0, [r2, 0x5] bics r0, r1 @@ -6165,9 +6165,9 @@ _081E3354: bl rfu_STC_releaseFrame b _081E33DC .align 2, 0 -_081E3398: .4byte gUnknown_3007450 -_081E339C: .4byte gUnknown_3007464 -_081E33A0: .4byte gUnknown_3007460 +_081E3398: .4byte gRfuSlotStatusNI +_081E339C: .4byte gRfuStatic +_081E33A0: .4byte gRfuLinkStatus _081E33A4: .4byte 0x00000701 _081E33A8: ldr r0, [r2, 0x68] @@ -6209,7 +6209,7 @@ _081E33E4: .4byte 0x00008042 thumb_func_start rfu_NI_checkCommFailCounter rfu_NI_checkCommFailCounter: @ 81E33E8 push {r4-r7,lr} - ldr r2, _081E3474 @ =gUnknown_3007460 + ldr r2, _081E3474 @ =gRfuLinkStatus ldr r0, [r2] ldrb r1, [r0, 0x4] ldrb r0, [r0, 0x5] @@ -6221,14 +6221,14 @@ rfu_NI_checkCommFailCounter: @ 81E33E8 mov r12, r0 movs r0, 0 strh r0, [r1] - ldr r1, _081E347C @ =gUnknown_3007464 + ldr r1, _081E347C @ =gRfuStatic ldr r0, [r1] ldrb r0, [r0, 0x2] lsrs r7, r0, 4 movs r3, 0 adds r6, r1, 0 adds r5, r2, 0 - ldr r4, _081E3480 @ =gUnknown_3007450 + ldr r4, _081E3480 @ =gRfuSlotStatusNI _081E3412: movs r0, 0x80 lsls r0, 17 @@ -6283,10 +6283,10 @@ _081E346E: pop {r0} bx r0 .align 2, 0 -_081E3474: .4byte gUnknown_3007460 +_081E3474: .4byte gRfuLinkStatus _081E3478: .4byte 0x04000208 -_081E347C: .4byte gUnknown_3007464 -_081E3480: .4byte gUnknown_3007450 +_081E347C: .4byte gRfuStatic +_081E3480: .4byte gRfuSlotStatusNI thumb_func_end rfu_NI_checkCommFailCounter thumb_func_start rfu_REQ_noise diff --git a/asm/link_rfu.s b/asm/link_rfu.s index 7c1485466..49fe3aef5 100644 --- a/asm/link_rfu.s +++ b/asm/link_rfu.s @@ -50,7 +50,7 @@ rfu_REQ_sendData_wrapper: @ 80FD3F0 push {lr} lsls r0, 24 lsrs r2, r0, 24 - ldr r0, _080FD410 @ =gUnknown_3007460 + ldr r0, _080FD410 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0 @@ -63,7 +63,7 @@ rfu_REQ_sendData_wrapper: @ 80FD3F0 movs r2, 0x1 b _080FD420 .align 2, 0 -_080FD410: .4byte gUnknown_3007460 +_080FD410: .4byte gRfuLinkStatus _080FD414: .4byte gUnknown_3005E10 _080FD418: ldr r0, _080FD42C @ =gUnknown_3005E10 @@ -383,7 +383,7 @@ _080FD648: _080FD664: .4byte gUnknown_3005E10 _080FD668: movs r2, 0 - ldr r0, _080FD6B4 @ =gUnknown_3007460 + ldr r0, _080FD6B4 @ =gRfuLinkStatus ldr r1, [r0] ldrb r3, [r1, 0x8] ldr r5, _080FD6B8 @ =gUnknown_3005E10 @@ -422,7 +422,7 @@ _080FD6A2: movs r0, 0x3 b _080FD6E8 .align 2, 0 -_080FD6B4: .4byte gUnknown_3007460 +_080FD6B4: .4byte gRfuLinkStatus _080FD6B8: .4byte gUnknown_3005E10 _080FD6BC: ldrb r0, [r5, 0x4] @@ -476,7 +476,7 @@ sub_80FD6F4: @ 80FD6F4 bics r0, r1 strb r0, [r3] movs r4, 0 - ldr r7, _080FD75C @ =gUnknown_3007460 + ldr r7, _080FD75C @ =gRfuLinkStatus movs r5, 0x1 adds r3, 0x4 movs r2, 0 @@ -514,7 +514,7 @@ _080FD750: bx r0 .align 2, 0 _080FD758: .4byte gUnknown_3005E10 -_080FD75C: .4byte gUnknown_3007460 +_080FD75C: .4byte gRfuLinkStatus thumb_func_end sub_80FD6F4 thumb_func_start sub_80FD760 @@ -601,7 +601,7 @@ _080FD80A: strb r0, [r5, 0x4] ldrb r0, [r5, 0x12] strb r0, [r5, 0x5] - ldr r4, _080FD82C @ =gUnknown_3007460 + ldr r4, _080FD82C @ =gRfuLinkStatus ldr r0, [r4] ldrb r0, [r0, 0x3] bl sub_80FE818 @@ -613,7 +613,7 @@ _080FD80A: bl sub_80FE7F0 b _080FD84A .align 2, 0 -_080FD82C: .4byte gUnknown_3007460 +_080FD82C: .4byte gRfuLinkStatus _080FD830: movs r0, 0x12 strb r0, [r5, 0x4] @@ -653,7 +653,7 @@ sub_80FD850: @ 80FD850 mov r1, sp adds r2, r5, 0 adds r3, r4, 0 - bl sub_81E13F0 + bl rfu_REQBN_watchLink mov r0, sp ldrb r0, [r0] adds r7, r4, 0 @@ -743,7 +743,7 @@ _080FD90A: _080FD91E: bl sub_80FEAF4 _080FD922: - ldr r0, _080FDA0C @ =gUnknown_3007460 + ldr r0, _080FDA0C @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -866,7 +866,7 @@ _080FD9FC: pop {r1} bx r1 .align 2, 0 -_080FDA0C: .4byte gUnknown_3007460 +_080FDA0C: .4byte gRfuLinkStatus _080FDA10: .4byte gUnknown_3005E10 thumb_func_end sub_80FD850 @@ -1025,7 +1025,7 @@ _080FDB5C: .align 2, 0 _080FDB70: .4byte gUnknown_3005E10 _080FDB74: - bl sub_81E0CAC + bl rfu_REQ_startSearchChild b _080FDBDA _080FDB7A: bl rfu_REQ_pollSearchChild @@ -1056,13 +1056,13 @@ _080FDBAE: bl rfu_REQ_endConnectParent b _080FDBDA _080FDBB4: - ldr r0, _080FDBC0 @ =gUnknown_3007460 + ldr r0, _080FDBC0 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x3] bl rfu_REQ_CHILD_startConnectRecovery b _080FDBDA .align 2, 0 -_080FDBC0: .4byte gUnknown_3007460 +_080FDBC0: .4byte gRfuLinkStatus _080FDBC4: bl rfu_REQ_CHILD_pollConnectRecovery b _080FDBDA @@ -1089,7 +1089,7 @@ _080FDBE4: bhi _080FDBF4 b _080FDA5A _080FDBF4: - ldr r0, _080FDC24 @ =gUnknown_3007460 + ldr r0, _080FDC24 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -1110,7 +1110,7 @@ _080FDC1A: bx r0 .align 2, 0 _080FDC20: .4byte gUnknown_3005E10 -_080FDC24: .4byte gUnknown_3007460 +_080FDC24: .4byte gRfuLinkStatus thumb_func_end sub_80FDA30 thumb_func_start sub_80FDC28 @@ -1387,7 +1387,7 @@ _080FDE64: ldrh r0, [r4, 0x1A] cmp r0, 0x1 beq _080FDE8A - ldr r0, _080FDEB0 @ =gUnknown_3007460 + ldr r0, _080FDEB0 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x8] cmp r0, 0x4 @@ -1419,7 +1419,7 @@ _080FDEA0: b _080FE16E .align 2, 0 _080FDEAC: .4byte gUnknown_3005E10 -_080FDEB0: .4byte gUnknown_3007460 +_080FDEB0: .4byte gRfuLinkStatus _080FDEB4: cmp r6, 0 beq _080FDEBA @@ -1563,7 +1563,7 @@ _080FDFB4: beq _080FDFBA b _080FE16E _080FDFBA: - ldr r2, _080FDFFC @ =gUnknown_3007460 + ldr r2, _080FDFFC @ =gRfuLinkStatus ldr r3, [r2] ldrb r0, [r3, 0x3] movs r1, 0 @@ -1600,7 +1600,7 @@ _080FDFEC: beq _080FDFDC b _080FE16E .align 2, 0 -_080FDFFC: .4byte gUnknown_3007460 +_080FDFFC: .4byte gRfuLinkStatus _080FE000: cmp r6, 0 bne _080FE01E @@ -1670,7 +1670,7 @@ _080FE078: ldr r4, _080FE0B4 @ =gUnknown_3005E10 strb r6, [r4, 0x5] strb r6, [r4, 0x4] - ldr r0, _080FE0B8 @ =gUnknown_3007460 + ldr r0, _080FE0B8 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x3] bl sub_80FE818 @@ -1697,7 +1697,7 @@ _080FE08C: b _080FE16E .align 2, 0 _080FE0B4: .4byte gUnknown_3005E10 -_080FE0B8: .4byte gUnknown_3007460 +_080FE0B8: .4byte gRfuLinkStatus _080FE0BC: cmp r6, 0 bne _080FE16E @@ -1758,7 +1758,7 @@ _080FE0E8: strb r7, [r5, 0x5] strb r7, [r5, 0x4] bl sub_80FEAF4 - ldr r0, _080FE158 @ =gUnknown_3007460 + ldr r0, _080FE158 @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] ldrb r0, [r0, 0x3] @@ -1772,7 +1772,7 @@ _080FE0E8: bl sub_80FE7F0 b _080FE16E .align 2, 0 -_080FE158: .4byte gUnknown_3007460 +_080FE158: .4byte gRfuLinkStatus _080FE15C: cmp r6, 0 bne _080FE16E @@ -1811,7 +1811,7 @@ _080FE194: ldrb r0, [r0] cmp r0, 0 bne _080FE1CA - ldr r4, _080FE1E0 @ =gUnknown_3007460 + ldr r4, _080FE1E0 @ =gRfuLinkStatus ldr r0, [r4] ldrb r0, [r0] cmp r0, 0 @@ -1839,7 +1839,7 @@ _080FE1D2: _080FE1DC: b _080FE322 .align 2, 0 -_080FE1E0: .4byte gUnknown_3007460 +_080FE1E0: .4byte gRfuLinkStatus _080FE1E4: mov r0, r8 cmp r0, 0x30 @@ -1906,7 +1906,7 @@ _080FE24E: strb r0, [r3] movs r3, 0 adds r7, r1, 0 - ldr r2, _080FE2AC @ =gUnknown_3007460 + ldr r2, _080FE2AC @ =gRfuLinkStatus mov r1, sp movs r5, 0x1 adds r4, r7, 0 @@ -1947,7 +1947,7 @@ _080FE27A: b _080FE2C2 .align 2, 0 _080FE2A8: .4byte gUnknown_3005E10 -_080FE2AC: .4byte gUnknown_3007460 +_080FE2AC: .4byte gRfuLinkStatus _080FE2B0: ldrb r0, [r7, 0x4] subs r0, 0x6 @@ -1980,7 +1980,7 @@ _080FE2D6: b _080FE322 _080FE2E6: bl sub_80FE6F0 - ldr r0, _080FE300 @ =gUnknown_3007460 + ldr r0, _080FE300 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0xFF @@ -1990,7 +1990,7 @@ _080FE2E6: bl sub_80FE7F0 b _080FE322 .align 2, 0 -_080FE300: .4byte gUnknown_3007460 +_080FE300: .4byte gRfuLinkStatus _080FE304: cmp r6, 0 bne _080FE326 @@ -2018,7 +2018,7 @@ _080FE326: ldrb r0, [r7, 0x7] cmp r0, 0x4 bne _080FE358 - ldr r2, _080FE354 @ =gUnknown_3007460 + ldr r2, _080FE354 @ =gRfuLinkStatus ldr r1, [r2] movs r0, 0x1 strb r0, [r1] @@ -2030,7 +2030,7 @@ _080FE326: b _080FE388 .align 2, 0 _080FE350: .4byte gUnknown_3005E10 -_080FE354: .4byte gUnknown_3007460 +_080FE354: .4byte gRfuLinkStatus _080FE358: movs r1, 0 mov r3, r8 @@ -2075,7 +2075,7 @@ sub_80FE394: @ 80FE394 strb r0, [r4, 0xE] movs r0, 0x1 strb r0, [r4, 0xF] - ldr r0, _080FE3CC @ =gUnknown_3007460 + ldr r0, _080FE3CC @ =gRfuLinkStatus ldr r0, [r0] ldrb r5, [r0] cmp r5, 0 @@ -2091,7 +2091,7 @@ sub_80FE394: @ 80FE394 b _080FE40C .align 2, 0 _080FE3C8: .4byte gUnknown_3005E10 -_080FE3CC: .4byte gUnknown_3007460 +_080FE3CC: .4byte gRfuLinkStatus _080FE3D0: mov r0, sp bl rfu_UNI_PARENT_getDRAC_ACK @@ -2148,7 +2148,7 @@ sub_80FE418: @ 80FE418 bls _080FE436 b _080FE62A _080FE436: - ldr r0, _080FE4A0 @ =gUnknown_3007460 + ldr r0, _080FE4A0 @ =gRfuLinkStatus ldr r2, [r0] ldrb r1, [r2, 0x2] ldrb r0, [r3, 0xC] @@ -2201,7 +2201,7 @@ _080FE46C: b _080FE574 .align 2, 0 _080FE49C: .4byte gUnknown_3005E10 -_080FE4A0: .4byte gUnknown_3007460 +_080FE4A0: .4byte gRfuLinkStatus _080FE4A4: ldrb r1, [r7] adds r0, r4, 0 @@ -2224,7 +2224,7 @@ _080FE4BE: mov r10, r2 cmp r0, 0 beq _080FE574 - ldr r0, _080FE518 @ =gUnknown_3007450 + ldr r0, _080FE518 @ =gRfuSlotStatusNI lsls r1, r6, 2 adds r1, r0 ldr r1, [r1] @@ -2242,7 +2242,7 @@ _080FE4BE: ldr r0, _080FE51C @ =0x0000ffff cmp r2, r0 beq _080FE508 - ldr r0, _080FE520 @ =gUnknown_3007460 + ldr r0, _080FE520 @ =gRfuLinkStatus ldr r0, [r0] lsls r1, r6, 5 adds r0, r1 @@ -2264,9 +2264,9 @@ _080FE508: orrs r5, r0 b _080FE53C .align 2, 0 -_080FE518: .4byte gUnknown_3007450 +_080FE518: .4byte gRfuSlotStatusNI _080FE51C: .4byte 0x0000ffff -_080FE520: .4byte gUnknown_3007460 +_080FE520: .4byte gRfuLinkStatus _080FE524: lsls r1, r6, 1 adds r0, r3, 0 @@ -2331,7 +2331,7 @@ _080FE592: cmp r0, 0 beq _080FE5CE movs r5, 0x1 - ldr r0, _080FE600 @ =gUnknown_3007460 + ldr r0, _080FE600 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x6] cmp r0, 0 @@ -2378,7 +2378,7 @@ _080FE5CE: .align 2, 0 _080FE5F8: .4byte 0x0000ffff _080FE5FC: .4byte gUnknown_3005E10 -_080FE600: .4byte gUnknown_3007460 +_080FE600: .4byte gRfuLinkStatus _080FE604: cmp r0, 0x2 bne _080FE610 @@ -2435,7 +2435,7 @@ sub_80FE63C: @ 80FE63C lsls r0, 16 cmp r0, 0 beq _080FE676 - ldr r1, _080FE6E8 @ =gUnknown_3007450 + ldr r1, _080FE6E8 @ =gRfuSlotStatusNI ldrb r0, [r4, 0x10] lsls r0, 2 adds r0, r1 @@ -2481,7 +2481,7 @@ _080FE6B6: bne _080FE6DA strb r4, [r5, 0x5] strb r4, [r5, 0x4] - ldr r0, _080FE6EC @ =gUnknown_3007460 + ldr r0, _080FE6EC @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] ldrb r0, [r0, 0x3] @@ -2498,8 +2498,8 @@ _080FE6DA: .align 2, 0 _080FE6E0: .4byte 0x04000208 _080FE6E4: .4byte gUnknown_3005E10 -_080FE6E8: .4byte gUnknown_3007450 -_080FE6EC: .4byte gUnknown_3007460 +_080FE6E8: .4byte gRfuSlotStatusNI +_080FE6EC: .4byte gRfuLinkStatus thumb_func_end sub_80FE63C thumb_func_start sub_80FE6F0 @@ -2509,7 +2509,7 @@ sub_80FE6F0: @ 80FE6F0 ldrb r0, [r5, 0x4] cmp r0, 0xF bne _080FE73C - ldr r1, _080FE748 @ =gUnknown_3007450 + ldr r1, _080FE748 @ =gRfuSlotStatusNI ldrb r2, [r5, 0x10] lsls r0, r2, 2 adds r0, r1 @@ -2546,7 +2546,7 @@ _080FE73C: bx r0 .align 2, 0 _080FE744: .4byte gUnknown_3005E10 -_080FE748: .4byte gUnknown_3007450 +_080FE748: .4byte gRfuSlotStatusNI thumb_func_end sub_80FE6F0 thumb_func_start sub_80FE74C @@ -2585,7 +2585,7 @@ sub_80FE778: @ 80FE778 push {r5-r7} movs r6, 0 movs r5, 0 - ldr r1, _080FE7E4 @ =gUnknown_3007460 + ldr r1, _080FE7E4 @ =gRfuLinkStatus ldr r0, [r1] ldrb r0, [r0, 0x8] cmp r6, r0 @@ -2638,7 +2638,7 @@ _080FE7D4: pop {r1} bx r1 .align 2, 0 -_080FE7E4: .4byte gUnknown_3007460 +_080FE7E4: .4byte gRfuLinkStatus _080FE7E8: .4byte gUnknown_3005E10 _080FE7EC: .4byte 0x0000ffff thumb_func_end sub_80FE778 @@ -2690,14 +2690,14 @@ sub_80FE83C: @ 80FE83C push {r4-r7,lr} lsls r0, 24 lsrs r5, r0, 24 - ldr r0, _080FE908 @ =gUnknown_3007460 + ldr r0, _080FE908 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x4] cmp r0, 0 beq _080FE884 movs r4, 0 _080FE84E: - ldr r1, _080FE90C @ =gUnknown_3007450 + ldr r1, _080FE90C @ =gRfuSlotStatusNI lsls r0, r4, 2 adds r0, r1 ldr r2, [r0] @@ -2725,14 +2725,14 @@ _080FE87A: cmp r4, 0x3 bls _080FE84E _080FE884: - ldr r0, _080FE908 @ =gUnknown_3007460 + ldr r0, _080FE908 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x5] cmp r0, 0 beq _080FE8C2 movs r4, 0 _080FE890: - ldr r1, _080FE90C @ =gUnknown_3007450 + ldr r1, _080FE90C @ =gRfuSlotStatusNI lsls r0, r4, 2 adds r0, r1 ldr r2, [r0] @@ -2758,7 +2758,7 @@ _080FE8B8: cmp r4, 0x3 bls _080FE890 _080FE8C2: - ldr r0, _080FE908 @ =gUnknown_3007460 + ldr r0, _080FE908 @ =gRfuLinkStatus ldr r3, [r0] ldrb r2, [r3, 0x6] cmp r2, 0 @@ -2768,7 +2768,7 @@ _080FE8C2: ands r0, r2 strb r0, [r3, 0x6] movs r4, 0 - ldr r7, _080FE910 @ =gUnknown_3007440 + ldr r7, _080FE910 @ =gRfuSlotStatusUNI ldr r6, _080FE914 @ =0x00008024 _080FE8DA: lsls r0, r4, 2 @@ -2796,9 +2796,9 @@ _080FE900: pop {r0} bx r0 .align 2, 0 -_080FE908: .4byte gUnknown_3007460 -_080FE90C: .4byte gUnknown_3007450 -_080FE910: .4byte gUnknown_3007440 +_080FE908: .4byte gRfuLinkStatus +_080FE90C: .4byte gRfuSlotStatusNI +_080FE910: .4byte gRfuSlotStatusUNI _080FE914: .4byte 0x00008024 thumb_func_end sub_80FE83C @@ -2814,14 +2814,14 @@ sub_80FE918: @ 80FE918 ldrh r0, [r0, 0x18] cmp r0, 0 beq _080FE9F4 - ldr r0, _080FEA08 @ =gUnknown_3007460 + ldr r0, _080FEA08 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x4] cmp r0, 0 beq _080FE9B8 movs r6, 0 _080FE938: - ldr r3, _080FEA0C @ =gUnknown_3007450 + ldr r3, _080FEA0C @ =gRfuSlotStatusNI lsls r2, r6, 2 adds r0, r2, r3 ldr r0, [r0] @@ -2889,14 +2889,14 @@ _080FE9AE: cmp r6, 0x3 bls _080FE938 _080FE9B8: - ldr r0, _080FEA08 @ =gUnknown_3007460 + ldr r0, _080FEA08 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x5] cmp r0, 0 beq _080FE9F4 movs r6, 0 _080FE9C4: - ldr r1, _080FEA0C @ =gUnknown_3007450 + ldr r1, _080FEA0C @ =gRfuSlotStatusNI lsls r0, r6, 2 adds r0, r1 ldr r2, [r0] @@ -2931,8 +2931,8 @@ _080FE9F4: bx r0 .align 2, 0 _080FEA04: .4byte gUnknown_3005E10 -_080FEA08: .4byte gUnknown_3007460 -_080FEA0C: .4byte gUnknown_3007450 +_080FEA08: .4byte gRfuLinkStatus +_080FEA0C: .4byte gRfuSlotStatusNI thumb_func_end sub_80FE918 thumb_func_start sub_80FEA10 @@ -3002,7 +3002,7 @@ sub_80FEA78: @ 80FEA78 push {lr} lsls r0, 16 lsrs r2, r0, 16 - ldr r0, _080FEA94 @ =gUnknown_3007460 + ldr r0, _080FEA94 @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x4] ldrb r0, [r0, 0x5] @@ -3014,7 +3014,7 @@ sub_80FEA78: @ 80FEA78 movs r0, 0 b _080FEAAC .align 2, 0 -_080FEA94: .4byte gUnknown_3007460 +_080FEA94: .4byte gRfuLinkStatus _080FEA98: .4byte gUnknown_3005E10 _080FEA9C: ldr r1, _080FEAB0 @ =gUnknown_3005E10 diff --git a/asm/link_rfu_2.s b/asm/link_rfu_2.s index f37313210..2e3f89291 100644 --- a/asm/link_rfu_2.s +++ b/asm/link_rfu_2.s @@ -137,7 +137,7 @@ sub_80F86F4: @ 80F86F4 ldr r4, _080F8730 @ =gIntrTable + 0x4 adds r2, r4, 0 movs r3, 0x1 - bl sub_81E05B0 + bl rfu_initializeAPI lsls r0, 16 lsrs r1, r0, 16 cmp r1, 0 @@ -871,7 +871,7 @@ _080F8D2A: bge _080F8D2A bl rfu_REQ_recvData bl rfu_waitREQComplete - ldr r1, _080F8D94 @ =gUnknown_3007440 + ldr r1, _080F8D94 @ =gRfuSlotStatusUNI ldr r3, _080F8D90 @ =gUnknown_3005450 ldr r0, _080F8D98 @ =0x000008f6 adds r4, r3, r0 @@ -911,7 +911,7 @@ _080F8D84: bx r0 .align 2, 0 _080F8D90: .4byte gUnknown_3005450 -_080F8D94: .4byte gUnknown_3007440 +_080F8D94: .4byte gRfuSlotStatusUNI _080F8D98: .4byte 0x000008f6 _080F8D9C: .4byte 0x00000988 _080F8DA0: .4byte 0x000008f7 @@ -1074,7 +1074,7 @@ sub_80F8ECC: @ 80F8ECC ldrh r0, [r4, 0x4] cmp r0, 0x7 bne _080F8F08 - ldr r0, _080F8F00 @ =gUnknown_3007460 + ldr r0, _080F8F00 @ =gRfuLinkStatus ldr r1, [r0] ldr r2, _080F8F04 @ =0x000008f5 adds r0, r4, r2 @@ -1093,7 +1093,7 @@ sub_80F8ECC: @ 80F8ECC b _080F8F0A .align 2, 0 _080F8EFC: .4byte gUnknown_3005450 -_080F8F00: .4byte gUnknown_3007460 +_080F8F00: .4byte gRfuLinkStatus _080F8F04: .4byte 0x000008f5 _080F8F08: movs r0, 0 @@ -1363,7 +1363,7 @@ _080F90D8: .4byte 0x000008f2 thumb_func_start IsRfuRecvQueueEmpty IsRfuRecvQueueEmpty: @ 80F90DC push {r4,lr} - ldr r0, _080F90EC @ =gUnknown_3007460 + ldr r0, _080F90EC @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x6] cmp r0, 0 @@ -1372,7 +1372,7 @@ _080F90E8: movs r0, 0 b _080F9110 .align 2, 0 -_080F90EC: .4byte gUnknown_3007460 +_080F90EC: .4byte gRfuLinkStatus _080F90F0: movs r3, 0 ldr r4, _080F9118 @ =gRecvCmds @@ -1422,7 +1422,7 @@ _080F913C: strb r0, [r1] ldr r0, _080F919C @ =0x0000099a adds r1, r6, r0 - ldr r0, _080F91A0 @ =gUnknown_3007460 + ldr r0, _080F91A0 @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r1] ldrb r0, [r0, 0x2] @@ -1460,7 +1460,7 @@ _080F913C: .align 2, 0 _080F9198: .4byte 0x00000993 _080F919C: .4byte 0x0000099a -_080F91A0: .4byte gUnknown_3007460 +_080F91A0: .4byte gRfuLinkStatus _080F91A4: .4byte 0x00000994 _080F91A8: .4byte 0x0000099b _080F91AC: .4byte 0x0000099c @@ -1815,7 +1815,7 @@ _080F947E: adds r0, r6, r1 ldrb r0, [r0] adds r1, r0, 0 - ldr r0, _080F94A0 @ =gUnknown_3007460 + ldr r0, _080F94A0 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x6] cmp r0, 0 @@ -1826,7 +1826,7 @@ _080F947E: .align 2, 0 _080F9498: .4byte 0x00000994 _080F949C: .4byte gUnknown_3005450 -_080F94A0: .4byte gUnknown_3007460 +_080F94A0: .4byte gRfuLinkStatus _080F94A4: movs r0, 0 b _080F94AA @@ -1950,7 +1950,7 @@ _080F9538: ldrb r0, [r0] cmp r0, 0 beq _080F95E4 - ldr r0, _080F964C @ =gUnknown_3007460 + ldr r0, _080F964C @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] ldrb r0, [r0, 0x3] @@ -2042,7 +2042,7 @@ _080F963C: .4byte gRecvCmds _080F9640: .4byte gUnknown_3005E10 _080F9644: .4byte gUnknown_3005450 _080F9648: .4byte 0x0000099c -_080F964C: .4byte gUnknown_3007460 +_080F964C: .4byte gRfuLinkStatus _080F9650: .4byte gReceivedRemoteLinkPlayers _080F9654: .4byte 0x00000988 _080F9658: .4byte gSendCmd @@ -2435,7 +2435,7 @@ _080F9902: beq _080F9914 b _080F9C40 _080F9914: - ldr r0, _080F9944 @ =gUnknown_3007460 + ldr r0, _080F9944 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] mov r6, r8 @@ -2458,7 +2458,7 @@ _080F9924: .align 2, 0 _080F993C: .4byte gUnknown_3005450 _080F9940: .4byte gReceivedRemoteLinkPlayers -_080F9944: .4byte gUnknown_3007460 +_080F9944: .4byte gRfuLinkStatus _080F9948: .4byte gRecvCmds + 2 _080F994C: .4byte gRecvCmds + 4 _080F9950: .4byte gUnknown_3005DD6 @@ -2688,7 +2688,7 @@ _080F9B00: ldr r0, _080F9B54 @ =gRecvCmds + 2 adds r4, r5, r0 ldrh r1, [r4] - ldr r0, _080F9B58 @ =gUnknown_3007460 + ldr r0, _080F9B58 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0, 0x2] ands r1, r0 @@ -2715,7 +2715,7 @@ _080F9B38: _080F9B4C: .4byte gUnknown_3005450 _080F9B50: .4byte gReceivedRemoteLinkPlayers _080F9B54: .4byte gRecvCmds + 2 -_080F9B58: .4byte gUnknown_3007460 +_080F9B58: .4byte gRfuLinkStatus _080F9B5C: .4byte gRecvCmds + 4 _080F9B60: .4byte 0x0000099c _080F9B64: .4byte gRecvCmds @@ -3502,7 +3502,7 @@ _080FA13C: .4byte gUnknown_3005450 thumb_func_start sub_80FA140 sub_80FA140: @ 80FA140 push {lr} - ldr r0, _080FA15C @ =gUnknown_3007460 + ldr r0, _080FA15C @ =gRfuLinkStatus ldr r0, [r0] ldrb r1, [r0, 0x2] ldrb r0, [r0, 0x3] @@ -3513,7 +3513,7 @@ sub_80FA140: @ 80FA140 pop {r0} bx r0 .align 2, 0 -_080FA15C: .4byte gUnknown_3007460 +_080FA15C: .4byte gRfuLinkStatus thumb_func_end sub_80FA140 thumb_func_start sub_80FA160 @@ -3552,7 +3552,7 @@ sub_80FA190: @ 80FA190 adds r1, r2, r0 movs r0, 0x1 strb r0, [r1] - ldr r0, _080FA1BC @ =gUnknown_3007460 + ldr r0, _080FA1BC @ =gRfuLinkStatus ldr r1, [r0] ldrb r0, [r1, 0x2] ldrb r1, [r1, 0x3] @@ -3565,7 +3565,7 @@ sub_80FA190: @ 80FA190 .align 2, 0 _080FA1B4: .4byte gUnknown_3005450 _080FA1B8: .4byte 0x0000099c -_080FA1BC: .4byte gUnknown_3007460 +_080FA1BC: .4byte gRfuLinkStatus _080FA1C0: .4byte 0x0000099b thumb_func_end sub_80FA190 @@ -4065,7 +4065,7 @@ _080FA53A: lsrs r0, 24 cmp r0, 0x1 bls _080FA5C2 - ldr r1, _080FA5A0 @ =gUnknown_3007450 + ldr r1, _080FA5A0 @ =gRfuSlotStatusNI lsls r0, r5, 2 adds r0, r1 ldr r0, [r0] @@ -4103,7 +4103,7 @@ _080FA55E: _080FA594: .4byte gUnknown_3005450 _080FA598: .4byte 0x000008f6 _080FA59C: .4byte 0x00000989 -_080FA5A0: .4byte gUnknown_3007450 +_080FA5A0: .4byte gRfuSlotStatusNI _080FA5A4: .4byte 0x0000098d _080FA5A8: mov r2, r8 @@ -4300,7 +4300,7 @@ sub_80FA6FC: @ 80FA6FC movs r0, 0x2 b _080FA732 _080FA718: - ldr r1, _080FA72C @ =gUnknown_3007450 + ldr r1, _080FA72C @ =gRfuSlotStatusNI lsls r0, 2 adds r0, r1 ldr r0, [r0] @@ -4310,7 +4310,7 @@ _080FA718: movs r0, 0 b _080FA732 .align 2, 0 -_080FA72C: .4byte gUnknown_3007450 +_080FA72C: .4byte gRfuSlotStatusNI _080FA730: movs r0, 0x1 _080FA732: @@ -4327,7 +4327,7 @@ sub_80FA738: @ 80FA738 ldr r1, _080FA780 @ =0x0000098d adds r5, r0, r1 _080FA746: - ldr r1, _080FA784 @ =gUnknown_3007450 + ldr r1, _080FA784 @ =gRfuSlotStatusNI lsls r0, r4, 2 adds r0, r1 ldr r0, [r0] @@ -4358,7 +4358,7 @@ _080FA770: .align 2, 0 _080FA77C: .4byte gUnknown_3005450 _080FA780: .4byte 0x0000098d -_080FA784: .4byte gUnknown_3007450 +_080FA784: .4byte gRfuSlotStatusNI thumb_func_end sub_80FA738 thumb_func_start sub_80FA788 @@ -4371,7 +4371,7 @@ sub_80FA788: @ 80FA788 ldrb r0, [r0] cmp r0, 0x8 bne _080FA7C2 - ldr r2, _080FA808 @ =gUnknown_3007450 + ldr r2, _080FA808 @ =gRfuSlotStatusNI ldr r0, _080FA80C @ =0x000008f6 adds r1, r0 ldrb r0, [r1] @@ -4393,7 +4393,7 @@ _080FA7BA: movs r0, 0x4 bl rfu_clearSlot _080FA7C2: - ldr r2, _080FA808 @ =gUnknown_3007450 + ldr r2, _080FA808 @ =gRfuSlotStatusNI ldr r5, _080FA800 @ =gUnknown_3005450 ldr r0, _080FA80C @ =0x000008f6 adds r1, r5, r0 @@ -4425,7 +4425,7 @@ _080FA7E6: .align 2, 0 _080FA800: .4byte gUnknown_3005450 _080FA804: .4byte 0x0000093d -_080FA808: .4byte gUnknown_3007450 +_080FA808: .4byte gRfuSlotStatusNI _080FA80C: .4byte 0x000008f6 _080FA810: .4byte 0x0000093e _080FA814: @@ -5772,7 +5772,7 @@ _080FB21E: ands r0, r1 cmp r0, 0 beq _080FB286 - ldr r0, _080FB274 @ =gUnknown_3007460 + ldr r0, _080FB274 @ =gRfuLinkStatus lsls r1, r5, 5 adds r1, 0x14 ldr r0, [r0] @@ -5803,7 +5803,7 @@ _080FB21E: _080FB268: .4byte gUnknown_3005E10 _080FB26C: .4byte gUnknown_3005450 _080FB270: .4byte 0x0000098d -_080FB274: .4byte gUnknown_3007460 +_080FB274: .4byte gRfuLinkStatus _080FB278: .4byte 0x00000989 _080FB27C: mov r0, r8 @@ -6216,7 +6216,7 @@ sub_80FB5A0: @ 80FB5A0 movs r3, 0 movs r2, 0 movs r4, 0x1 - ldr r6, _080FB5E8 @ =gUnknown_3007460 + ldr r6, _080FB5E8 @ =gRfuLinkStatus movs r7, 0x7F _080FB5AE: adds r0, r5, 0 @@ -6249,7 +6249,7 @@ _080FB5D4: pop {r1} bx r1 .align 2, 0 -_080FB5E8: .4byte gUnknown_3007460 +_080FB5E8: .4byte gRfuLinkStatus thumb_func_end sub_80FB5A0 thumb_func_start sub_80FB5EC @@ -6601,7 +6601,7 @@ _080FB894: adds r1, 0xF0 movs r0, 0x3 strb r0, [r1] - ldr r0, _080FB8B8 @ =gUnknown_3007460 + ldr r0, _080FB8B8 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0 @@ -6615,7 +6615,7 @@ _080FB8AA: b _080FB9C0 .align 2, 0 _080FB8B4: .4byte gUnknown_3005450 -_080FB8B8: .4byte gUnknown_3007460 +_080FB8B8: .4byte gRfuLinkStatus _080FB8BC: .4byte 0x000008f4 _080FB8C0: ldr r0, _080FB900 @ =gUnknown_3005450 @@ -6674,7 +6674,7 @@ _080FB916: movs r0, 0 bl sub_80FD760 _080FB934: - ldr r0, _080FB96C @ =gUnknown_3007460 + ldr r0, _080FB96C @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0xFF @@ -6700,7 +6700,7 @@ _080FB95A: .align 2, 0 _080FB964: .4byte 0x0000099c _080FB968: .4byte gReceivedRemoteLinkPlayers -_080FB96C: .4byte gUnknown_3007460 +_080FB96C: .4byte gRfuLinkStatus _080FB970: .4byte gUnknown_3005E10 _080FB974: .4byte sub_80F8B34 _080FB978: .4byte gUnknown_3005450 @@ -7108,7 +7108,7 @@ sub_80FBC70: @ 80FBC70 movs r0, 0xFF mov r9, r0 movs r7, 0 - ldr r1, _080FBCF4 @ =gUnknown_3007460 + ldr r1, _080FBCF4 @ =gRfuLinkStatus mov r8, r1 _080FBC8E: lsls r4, r7, 5 @@ -7162,7 +7162,7 @@ _080FBCE2: pop {r1} bx r1 .align 2, 0 -_080FBCF4: .4byte gUnknown_3007460 +_080FBCF4: .4byte gRfuLinkStatus thumb_func_end sub_80FBC70 thumb_func_start sub_80FBCF8 @@ -7391,7 +7391,7 @@ sub_80FBE80: @ 80FBE80 lsrs r2, r0, 24 cmp r2, 0xFF beq _080FBF18 - ldr r0, _080FBEDC @ =gUnknown_3007460 + ldr r0, _080FBEDC @ =gRfuLinkStatus ldr r0, [r0] lsls r1, r2, 5 adds r0, r1 @@ -7408,7 +7408,7 @@ sub_80FBE80: @ 80FBE80 b _080FBF10 .align 2, 0 _080FBED8: .4byte gTasks+0x8 -_080FBEDC: .4byte gUnknown_3007460 +_080FBEDC: .4byte gRfuLinkStatus _080FBEE0: .4byte gUnknown_3005450 _080FBEE4: .4byte 0x000008f5 _080FBEE8: @@ -7638,7 +7638,7 @@ _080FC070: beq _080FC108 movs r1, 0xA ldrsh r0, [r4, r1] - ldr r7, _080FC0F4 @ =gUnknown_3007460 + ldr r7, _080FC0F4 @ =gRfuLinkStatus lsls r4, r2, 5 adds r2, r4, 0 adds r2, 0x14 @@ -7670,7 +7670,7 @@ _080FC0E4: .4byte gTasks _080FC0E8: .4byte 0x00000985 _080FC0EC: .4byte gUnknown_3005E10 _080FC0F0: .4byte 0x00000119 -_080FC0F4: .4byte gUnknown_3007460 +_080FC0F4: .4byte gRfuLinkStatus _080FC0F8: movs r1, 0xE0 lsls r1, 7 @@ -7845,7 +7845,7 @@ sub_80FC228: @ 80FC228 movs r2, 0x13 movs r3, 0x2 bl nullsub_88 - ldr r4, _080FC2F8 @ =gUnknown_3007460 + ldr r4, _080FC2F8 @ =gRfuLinkStatus ldr r0, [r4] ldrb r0, [r0, 0x2] movs r1, 0x14 @@ -7934,7 +7934,7 @@ _080FC2CE: bl nullsub_87 b _080FC436 .align 2, 0 -_080FC2F8: .4byte gUnknown_3007460 +_080FC2F8: .4byte gRfuLinkStatus _080FC2FC: .4byte gUnknown_3005450 _080FC300: .4byte gUnknown_843EE64 _080FC304: @@ -7969,7 +7969,7 @@ _080FC318: adds r6, 0x1 cmp r6, 0x3 ble _080FC318 - ldr r5, _080FC394 @ =gUnknown_3007460 + ldr r5, _080FC394 @ =gRfuLinkStatus ldr r1, [r5] ldr r4, _080FC398 @ =gUnknown_3005450 ldr r0, _080FC39C @ =0x000008f6 @@ -8004,12 +8004,12 @@ _080FC318: .align 2, 0 _080FC38C: .4byte gUnknown_843EE47 _080FC390: .4byte gUnknown_843EE57 -_080FC394: .4byte gUnknown_3007460 +_080FC394: .4byte gRfuLinkStatus _080FC398: .4byte gUnknown_3005450 _080FC39C: .4byte 0x000008f6 _080FC3A0: movs r6, 0 - ldr r1, _080FC440 @ =gUnknown_3007460 + ldr r1, _080FC440 @ =gRfuLinkStatus ldr r0, [r1] ldrb r0, [r0, 0x8] cmp r6, r0 @@ -8088,7 +8088,7 @@ _080FC436: pop {r0} bx r0 .align 2, 0 -_080FC440: .4byte gUnknown_3007460 +_080FC440: .4byte gRfuLinkStatus _080FC444: .4byte gUnknown_843EE47 _080FC448: .4byte gUnknown_843EE57 thumb_func_end sub_80FC228 @@ -9032,7 +9032,7 @@ sub_80FCADC: @ 80FCADC lsls r0, 24 lsrs r5, r0, 24 movs r6, 0 - ldr r0, _080FCB04 @ =gUnknown_3007460 + ldr r0, _080FCB04 @ =gRfuLinkStatus ldr r4, [r0] ldrb r2, [r4, 0x2] ldrb r1, [r4] @@ -9048,7 +9048,7 @@ sub_80FCADC: @ 80FCADC ldrb r0, [r4, 0xA] b _080FCB4C .align 2, 0 -_080FCB04: .4byte gUnknown_3007460 +_080FCB04: .4byte gRfuLinkStatus _080FCB08: adds r0, r6, 0x1 lsls r0, 24 @@ -9234,7 +9234,7 @@ sub_80FCC3C: @ 80FCC3C bne _080FCC98 movs r0, 0x1 mov r9, r0 - ldr r6, _080FCC94 @ =gUnknown_3007460 + ldr r6, _080FCC94 @ =gRfuLinkStatus ldr r0, [r6] lsls r4, r5, 5 adds r0, r4 @@ -9261,11 +9261,11 @@ _080FCC78: b _080FCCE4 .align 2, 0 _080FCC90: .4byte gUnknown_3005E10 -_080FCC94: .4byte gUnknown_3007460 +_080FCC94: .4byte gRfuLinkStatus _080FCC98: movs r0, 0 mov r9, r0 - ldr r6, _080FCCCC @ =gUnknown_3007460 + ldr r6, _080FCCCC @ =gRfuLinkStatus ldr r0, [r6] lsls r4, r5, 5 adds r0, r4 @@ -9288,7 +9288,7 @@ _080FCCB0: bl memcpy b _080FCCE4 .align 2, 0 -_080FCCCC: .4byte gUnknown_3007460 +_080FCCCC: .4byte gRfuLinkStatus _080FCCD0: adds r0, r7, 0 movs r1, 0 @@ -9315,7 +9315,7 @@ sub_80FCCF4: @ 80FCCF4 adds r5, r1, 0 lsls r2, 24 movs r7, 0 - ldr r6, _080FCD2C @ =gUnknown_3007460 + ldr r6, _080FCD2C @ =gRfuLinkStatus ldr r0, [r6] lsrs r4, r2, 19 adds r2, r0, r4 @@ -9337,7 +9337,7 @@ sub_80FCCF4: @ 80FCCF4 movs r7, 0x1 b _080FCD48 .align 2, 0 -_080FCD2C: .4byte gUnknown_3007460 +_080FCD2C: .4byte gRfuLinkStatus _080FCD30: .4byte 0x00007f7d _080FCD34: adds r0, r3, 0 @@ -9388,7 +9388,7 @@ CreateWirelessStatusIndicatorSprite: @ 80FCD74 movs r3, 0xE7 movs r2, 0x8 _080FCD8A: - ldr r0, _080FCDCC @ =gUnknown_3007460 + ldr r0, _080FCDCC @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -9420,7 +9420,7 @@ _080FCD8A: strb r5, [r0] b _080FCE2A .align 2, 0 -_080FCDCC: .4byte gUnknown_3007460 +_080FCDCC: .4byte gRfuLinkStatus _080FCDD0: .4byte gUnknown_843F284 _080FCDD4: .4byte gSprites _080FCDD8: .4byte 0x00001234 @@ -9551,7 +9551,7 @@ _080FCEE0: .4byte gUnknown_203ACE4 thumb_func_start sub_80FCEE4 sub_80FCEE4: @ 80FCEE4 push {r4,lr} - ldr r1, _080FCF04 @ =gUnknown_3007460 + ldr r1, _080FCF04 @ =gRfuLinkStatus ldr r0, [r1] ldrb r2, [r0, 0x2] movs r3, 0 @@ -9567,7 +9567,7 @@ _080FCEF0: ldrb r0, [r0] b _080FCF16 .align 2, 0 -_080FCF04: .4byte gUnknown_3007460 +_080FCF04: .4byte gRfuLinkStatus _080FCF08: lsrs r2, 1 adds r0, r3, 0x1 @@ -9626,7 +9626,7 @@ _080FCF5C: adds r6, r2, 0 movs r5, 0xFF movs r4, 0 - ldr r0, _080FCF84 @ =gUnknown_3007460 + ldr r0, _080FCF84 @ =gRfuLinkStatus ldr r0, [r0] ldrb r0, [r0] cmp r0, 0x1 @@ -9641,7 +9641,7 @@ _080FCF5C: _080FCF78: .4byte gUnknown_203ACE4 _080FCF7C: .4byte gSprites _080FCF80: .4byte 0x00001234 -_080FCF84: .4byte gUnknown_3007460 +_080FCF84: .4byte gRfuLinkStatus _080FCF88: adds r0, r4, 0x1 lsls r0, 24 diff --git a/asm/link_rfu_3.s b/asm/link_rfu_3.s index 3b76df047..1f47f7214 100644 --- a/asm/link_rfu_3.s +++ b/asm/link_rfu_3.s @@ -10493,7 +10493,7 @@ _0811AFF8: _0811AFFA: cmp r4, 0x3 bgt _0811B030 - ldr r0, _0811B044 @ =gUnknown_3007460 + ldr r0, _0811B044 @ =gRfuLinkStatus ldr r0, [r0] lsls r1, r4, 5 adds r0, r1 @@ -10526,7 +10526,7 @@ _0811B030: bl StringCopy b _0811B080 .align 2, 0 -_0811B044: .4byte gUnknown_3007460 +_0811B044: .4byte gRfuLinkStatus _0811B048: .4byte gSpeciesNames _0811B04C: .4byte gUnknown_8457DB8 _0811B050: diff --git a/include/librfu.h b/include/librfu.h index 69f0bb695..5eb9fd7a0 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -76,9 +76,9 @@ struct UnkLinkRfuStruct_02022B14Substruct u16 unk_00_4:1; u16 unk_00_5:1; u16 unk_00_6:1; - u16 unk_00_7:1; - u16 unk_01_0:1; - u16 unk_01_1:1; + u16 isChampion:1; + u16 hasNationalDex:1; + u16 gameClear:1; u16 unk_01_2:4; u16 unk_01_6:2; u8 playerTrainerId[2]; @@ -93,36 +93,35 @@ struct __attribute__((packed, aligned(2))) UnkLinkRfuStruct_02022B14 u8 unk_0a_0:7; u8 unk_0a_7:1; u8 playerGender:1; - u8 unk_0b_1:7; + u8 level:7; u8 unk_0c; }; struct RfuStruct { - vs32 unk_0; - u8 txParams; - u8 unk_5; - u8 activeCommand; - u8 unk_7; - u8 unk_8; - u8 unk_9; + vs32 state; + u8 reqLength; + u8 reqNext; + u8 reqActiveCommand; + u8 ackLength; + u8 ackNext; + u8 ackActiveCommand; u8 timerSelect; u8 unk_b; - int timerState; + s32 timerState; vu8 timerActive; u8 unk_11; - vu16 unk_12; + vu16 error; vu8 msMode; - u8 unk_15; + u8 recoveryCount; u8 unk_16; u8 unk_17; void (*callbackM)(); void (*callbackS)(); - u32 callbackID; - union RfuPacket * txPacket; - union RfuPacket * rxPacket; + u32 callbackId; + union RfuPacket *txPacket; + union RfuPacket *rxPacket; vu8 unk_2c; - u8 padding[3]; }; struct RfuIntrStruct @@ -133,90 +132,149 @@ struct RfuIntrStruct u8 block2[0x30]; }; -struct RfuUnk1 +struct RfuSlotStatusUNI { - u16 unk_0; - u8 unk_2; - u8 unk_3; - u8 fill_4[14]; - u8 unk_12; - u32 unk_14; - u32 unk_18; - struct RfuIntrStruct unk_1c; + u16 sendState; + u8 dataReadyFlag; + u8 bmSlot; + u16 payloadSize; + void *src; // TODO: is it correct? + u16 recvState; + u16 errorCode; + u16 dataSize; + u8 newDataFlag; + u8 dataBlockFlag; + void *recvBuffer; + u32 recvBuffSize; }; -struct RfuUnk2 +struct NIComm { - u16 unk_0; - u16 unk_2; - u8 fill_4[0x16]; - u8 unk_1a; - u8 fill_1b[0x19]; - u16 unk_34; - u16 unk_36; - u8 fill_38[0x16]; - u8 unk_4e; - u8 fill_4f[0x12]; - u8 unk_61; - u8 fill_62[6]; - void *unk_68; - void *unk_6c; - u8 unk_70[0x70]; + u16 state; + u16 failCounter; + u32 nowP[4]; // ??? + u32 remainSize; + u16 errorCode; + u8 bmSlot; + u8 unk_1b; + u8 recvAckFlag[4]; + u8 ack; + u8 phase; + u8 n[4]; // ??? + void *src; + u8 bmSlotOrg; + u8 dataType; + u16 payloadSize; + u32 dataSize; }; -struct RfuUnk3 +struct RfuSlotStatusNI { - u32 unk_0; - u32 unk_4; - u8 unk_8[0xD4]; - u32 unk_dc; + struct NIComm send; + struct NIComm recv; + void *recvBuffer; + void *recvBufferSize; }; -struct RfuUnk5Sub +struct RfuFixed { - u16 unk_00; - u8 unk_02; - u16 unk_04; - struct UnkLinkRfuStruct_02022B14 unk_06; - u8 fill_13[1]; - u8 playerName[PLAYER_NAME_LENGTH + 1]; + void *reqCallback; + void *fastCopyPtr; + u16 fastCopyBuffer[24]; + u32 fastCopyBuffer2[12]; + u32 LLFBuffer[29]; + u8 *STWIBuffer; }; -struct RfuUnk5 +struct RfuStatic { - u8 unk_00; - u8 unk_01; - u8 unk_02; - u8 unk_03; - u8 unk_04; - u8 unk_05; - u8 unk_06; - u8 unk_07; - u8 unk_08; - u8 filler_09[1]; - u8 unk_0a[4]; - u8 filler_0e[6]; - struct RfuUnk5Sub unk_14[4]; + u8 flags; + u8 NIEndRecvFlag; + u8 RecvRenewalFlag; + u8 commExistFlag; + u8 recvErrorFlag; + u8 recoveryBmSlot; + u8 nowWatchInterval; + u8 nullFrameCount; + u8 emberCount; + u8 SCStartFlag; + u8 linkEmergencyFlag[4]; + u8 lsFixedCount[4]; + u16 cidBak[4]; + u16 unk_1a; + u16 reqResult; + u16 tryPid; + u32 watchdogTimer; + u32 totalPacketSize; }; -extern struct RfuStruct * gRfuState; +struct RfuTgtData +{ + u16 id; + u8 slot; + u8 multibootFlag; + u16 serialNum; + u8 gname[15]; + u8 uname[9]; +}; -extern struct RfuUnk5 * gUnknown_3007460; -extern u32 *gUnknown_3007464; -extern struct RfuUnk3 * gUnknown_3007468; -extern struct RfuUnk2 * gUnknown_3007450[4]; -extern struct RfuUnk1 * gUnknown_3007440[4]; -extern struct { +struct RfuLinkStatus +{ + u8 connMode; + u8 connCount; + u8 connSlotFlag; + u8 linkLossSlotFlag; + u8 sendSlotNIFlag; + u8 recvSlotNIFlag; + u8 sendSlotUNIFlag; + u8 getNameFlag; + u8 findParentCount; + u8 watchInterval; + u8 stength[4]; + u8 LLFReadyFlag; + u8 remainLLFrameSizeParent; + u8 remainLLFrameSizeChild[4]; + struct RfuTgtData partner[4]; + struct RfuTgtData my; +}; + +struct Unk_3007470 +{ u8 unk0; u8 unk1; u16 unk2; u16 unk4; u8 fill6[4]; u16 unkA; -} gUnknown_3007470; +}; + +struct STWIStruct +{ + // TODO: resolve the struct + u8 unk_0[232]; + u8 function[2400]; + struct RfuStruct STWIStatus; +}; + +struct Unk_3001190 +{ + struct RfuLinkStatus linkStatus; + struct RfuStatic static_; + struct RfuFixed fixed; + struct RfuSlotStatusNI NI[4]; + struct RfuSlotStatusUNI UNI[4]; + struct STWIStruct STWI; +}; -extern void rfu_STC_clearAPIVariables(void); +extern struct RfuStruct *gRfuState; +extern struct RfuLinkStatus *gRfuLinkStatus; +extern struct RfuStatic *gRfuStatic; +extern struct RfuFixed *gRfuFixed; +extern struct RfuSlotStatusNI *gRfuSlotStatusNI[4]; +extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; +extern struct Unk_3007470 gUnknown_3007470; +void rfu_STC_clearAPIVariables(void); void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_REQ_stopMode(void); void rfu_waitREQComplete(void); diff --git a/src/trade.c b/src/trade.c index 2f48928ec..10ed51d69 100644 --- a/src/trade.c +++ b/src/trade.c @@ -2765,10 +2765,10 @@ static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet) int GetUnionRoomTradeMessageId(struct UnkLinkRfuStruct_02022B14Substruct a0, struct UnkLinkRfuStruct_02022B14Substruct a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet) { - u8 r9 = a0.unk_01_0; - u8 r4 = a0.unk_00_7; - u8 r10 = a1.unk_01_0; - u8 r0 = a1.unk_00_7; + u8 r9 = a0.hasNationalDex; + u8 r4 = a0.isChampion; + u8 r10 = a1.hasNationalDex; + u8 r0 = a1.isChampion; u8 r1 = a1.unk_01_2; u8 r2; @@ -2845,7 +2845,7 @@ int GetUnionRoomTradeMessageId(struct UnkLinkRfuStruct_02022B14Substruct a0, str int CanRegisterMonForTradingBoard(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a2, u8 a3) { - u8 canTradeEggAndNational = a0.unk_01_0; + u8 canTradeEggAndNational = a0.hasNationalDex; if (IsDeoxysOrMewUntradable(a2, a3)) { diff --git a/sym_common.txt b/sym_common.txt index b41ec5ff2..e72f9a03c 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -163,19 +163,19 @@ gUnknown_3005E94: @ 3005E94 gRfuState: @ 3007438 .space 0x8 -gUnknown_3007440: @ 3007440 +gRfuSlotStatusUNI: @ 3007440 .space 0x10 -gUnknown_3007450: @ 3007450 +gRfuSlotStatusNI: @ 3007450 .space 0x10 -gUnknown_3007460: @ 3007460 +gRfuLinkStatus: @ 3007460 .space 0x4 -gUnknown_3007464: @ 3007464 +gRfuStatic: @ 3007464 .space 0x4 -gUnknown_3007468: @ 3007468 +gRfuFixed: @ 3007468 .space 0x8 gUnknown_3007470: @ 3007470 -- cgit v1.2.3 From 8f1a8972c19f5cd2522c9e7982bd330ac05305e9 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 27 Dec 2019 05:17:41 +0800 Subject: librfu_stwi Co-authored-by: Max Thomas --- asm/librfu_stwi.s | 1560 -------------------------------------------------- include/gba/io_reg.h | 6 + include/gba/macro.h | 12 +- include/librfu.h | 67 ++- ld_script.txt | 2 +- src/librfu_stwi.c | 645 +++++++++++++++++++++ 6 files changed, 715 insertions(+), 1577 deletions(-) delete mode 100644 asm/librfu_stwi.s create mode 100644 src/librfu_stwi.c diff --git a/asm/librfu_stwi.s b/asm/librfu_stwi.s deleted file mode 100644 index 5434d037f..000000000 --- a/asm/librfu_stwi.s +++ /dev/null @@ -1,1560 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start STWI_init_all -STWI_init_all: @ 81DF114 - push {r4,lr} - adds r3, r0, 0 - lsls r2, 24 - lsrs r2, 24 - cmp r2, 0x1 - bne _081DF150 - adds r2, r3, 0 - adds r2, 0xE8 - str r2, [r1] - ldr r1, _081DF13C @ =0x040000d4 - ldr r0, _081DF140 @ =IntrSIO32 - str r0, [r1] - str r2, [r1, 0x4] - ldr r0, _081DF144 @ =0x800004b0 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - ldr r1, _081DF148 @ =gRfuState - ldr r2, _081DF14C @ =0x00000a48 - adds r0, r3, r2 - b _081DF15A - .align 2, 0 -_081DF13C: .4byte 0x040000d4 -_081DF140: .4byte IntrSIO32 -_081DF144: .4byte 0x800004b0 -_081DF148: .4byte gRfuState -_081DF14C: .4byte 0x00000a48 -_081DF150: - ldr r0, _081DF1D4 @ =IntrSIO32 - str r0, [r1] - ldr r1, _081DF1D8 @ =gRfuState - adds r0, r3, 0 - adds r0, 0xE8 -_081DF15A: - str r0, [r1] - adds r2, r1, 0 - ldr r1, [r2] - str r3, [r1, 0x28] - adds r0, r3, 0 - adds r0, 0x74 - str r0, [r1, 0x24] - ldrb r0, [r1, 0x14] - movs r4, 0 - movs r0, 0x1 - strb r0, [r1, 0x14] - ldr r0, [r2] - str r4, [r0] - strb r4, [r0, 0x4] - ldr r0, [r2] - strb r4, [r0, 0x5] - ldr r0, [r2] - strb r4, [r0, 0x7] - ldr r0, [r2] - strb r4, [r0, 0x8] - ldr r0, [r2] - strb r4, [r0, 0x9] - ldr r0, [r2] - str r4, [r0, 0xC] - ldrb r1, [r0, 0x10] - strb r4, [r0, 0x10] - ldr r0, [r2] - ldrh r1, [r0, 0x12] - movs r1, 0 - strh r4, [r0, 0x12] - strb r1, [r0, 0x15] - ldr r0, [r2] - adds r0, 0x2C - ldrb r2, [r0] - strb r1, [r0] - ldr r1, _081DF1DC @ =0x04000134 - movs r2, 0x80 - lsls r2, 1 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r2, _081DF1E0 @ =0x00005003 - adds r0, r2, 0 - strh r0, [r1] - bl STWI_init_Callback_M - bl STWI_init_Callback_S - ldr r3, _081DF1E4 @ =0x04000208 - ldrh r2, [r3] - strh r4, [r3] - ldr r4, _081DF1E8 @ =0x04000200 - ldrh r0, [r4] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF1D4: .4byte IntrSIO32 -_081DF1D8: .4byte gRfuState -_081DF1DC: .4byte 0x04000134 -_081DF1E0: .4byte 0x00005003 -_081DF1E4: .4byte 0x04000208 -_081DF1E8: .4byte 0x04000200 - thumb_func_end STWI_init_all - - thumb_func_start STWI_init_timer -STWI_init_timer: @ 81DF1EC - push {r4,r5,lr} - ldr r2, _081DF218 @ =STWI_intr_timer - str r2, [r0] - ldr r5, _081DF21C @ =gRfuState - ldr r0, [r5] - movs r4, 0 - strb r1, [r0, 0xA] - ldr r3, _081DF220 @ =0x04000208 - ldrh r2, [r3] - strh r4, [r3] - ldr r4, _081DF224 @ =0x04000200 - ldr r1, [r5] - movs r0, 0x8 - ldrb r1, [r1, 0xA] - lsls r0, r1 - ldrh r1, [r4] - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF218: .4byte STWI_intr_timer -_081DF21C: .4byte gRfuState -_081DF220: .4byte 0x04000208 -_081DF224: .4byte 0x04000200 - thumb_func_end STWI_init_timer - - thumb_func_start AgbRFU_SoftReset -AgbRFU_SoftReset: @ 81DF228 - push {r4,r5,lr} - ldr r5, _081DF2C0 @ =0x04000134 - movs r1, 0x80 - lsls r1, 8 - adds r0, r1, 0 - strh r0, [r5] - ldr r2, _081DF2C4 @ =0x000080a0 - adds r0, r2, 0 - strh r0, [r5] - ldr r1, _081DF2C8 @ =gRfuState - ldr r0, [r1] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r3, _081DF2CC @ =0x04000100 - adds r2, r0, r3 - ldr r4, _081DF2D0 @ =0x04000102 - adds r3, r0, r4 - movs r0, 0 - strh r0, [r3] - strh r0, [r2] - movs r0, 0x83 - strh r0, [r3] - ldrh r0, [r2] - adds r4, r1, 0 - cmp r0, 0x11 - bhi _081DF268 - ldr r0, _081DF2D4 @ =0x000080a2 - adds r1, r0, 0 -_081DF260: - strh r1, [r5] - ldrh r0, [r2] - cmp r0, 0x11 - bls _081DF260 -_081DF268: - movs r0, 0x3 - strh r0, [r3] - ldr r1, _081DF2C0 @ =0x04000134 - ldr r2, _081DF2C4 @ =0x000080a0 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r3, _081DF2D8 @ =0x00005003 - adds r0, r3, 0 - strh r0, [r1] - ldr r0, [r4] - movs r2, 0 - str r2, [r0] - strb r2, [r0, 0x4] - ldr r0, [r4] - strb r2, [r0, 0x5] - ldr r0, [r4] - strb r2, [r0, 0x6] - ldr r0, [r4] - strb r2, [r0, 0x7] - ldr r0, [r4] - strb r2, [r0, 0x8] - ldr r0, [r4] - strb r2, [r0, 0x9] - ldr r0, [r4] - str r2, [r0, 0xC] - ldrb r1, [r0, 0x10] - strb r2, [r0, 0x10] - ldr r1, [r4] - ldrh r0, [r1, 0x12] - movs r3, 0 - strh r2, [r1, 0x12] - ldrb r0, [r1, 0x14] - movs r0, 0x1 - strb r0, [r1, 0x14] - ldr r0, [r4] - strb r3, [r0, 0x15] - ldr r0, [r4] - adds r0, 0x2C - ldrb r1, [r0] - strb r3, [r0] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF2C0: .4byte 0x04000134 -_081DF2C4: .4byte 0x000080a0 -_081DF2C8: .4byte gRfuState -_081DF2CC: .4byte 0x04000100 -_081DF2D0: .4byte 0x04000102 -_081DF2D4: .4byte 0x000080a2 -_081DF2D8: .4byte 0x00005003 - thumb_func_end AgbRFU_SoftReset - - thumb_func_start STWI_set_MS_mode -STWI_set_MS_mode: @ 81DF2DC - lsls r0, 24 - lsrs r0, 24 - ldr r1, _081DF2EC @ =gRfuState - ldr r1, [r1] - ldrb r2, [r1, 0x14] - strb r0, [r1, 0x14] - bx lr - .align 2, 0 -_081DF2EC: .4byte gRfuState - thumb_func_end STWI_set_MS_mode - - thumb_func_start STWI_read_status -STWI_read_status: @ 81DF2F0 - push {lr} - lsls r0, 24 - lsrs r0, 24 - adds r1, r0, 0 - cmp r0, 0x1 - beq _081DF31C - cmp r0, 0x1 - bgt _081DF306 - cmp r0, 0 - beq _081DF310 - b _081DF344 -_081DF306: - cmp r1, 0x2 - beq _081DF328 - cmp r1, 0x3 - beq _081DF338 - b _081DF344 -_081DF310: - ldr r0, _081DF318 @ =gRfuState - ldr r0, [r0] - ldrh r0, [r0, 0x12] - b _081DF346 - .align 2, 0 -_081DF318: .4byte gRfuState -_081DF31C: - ldr r0, _081DF324 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0x14] - b _081DF346 - .align 2, 0 -_081DF324: .4byte gRfuState -_081DF328: - ldr r0, _081DF334 @ =gRfuState - ldr r0, [r0] - ldr r0, [r0] - lsls r0, 16 - lsrs r0, 16 - b _081DF346 - .align 2, 0 -_081DF334: .4byte gRfuState -_081DF338: - ldr r0, _081DF340 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0x6] - b _081DF346 - .align 2, 0 -_081DF340: .4byte gRfuState -_081DF344: - ldr r0, _081DF34C @ =0x0000ffff -_081DF346: - pop {r1} - bx r1 - .align 2, 0 -_081DF34C: .4byte 0x0000ffff - thumb_func_end STWI_read_status - - thumb_func_start STWI_init_Callback_M -STWI_init_Callback_M: @ 81DF350 - push {lr} - movs r0, 0 - bl STWI_set_Callback_M - pop {r0} - bx r0 - thumb_func_end STWI_init_Callback_M - - thumb_func_start STWI_init_Callback_S -STWI_init_Callback_S: @ 81DF35C - push {lr} - movs r0, 0 - bl STWI_set_Callback_S - pop {r0} - bx r0 - thumb_func_end STWI_init_Callback_S - - thumb_func_start STWI_set_Callback_M -STWI_set_Callback_M: @ 81DF368 - ldr r1, _081DF370 @ =gRfuState - ldr r1, [r1] - str r0, [r1, 0x18] - bx lr - .align 2, 0 -_081DF370: .4byte gRfuState - thumb_func_end STWI_set_Callback_M - - thumb_func_start STWI_set_Callback_S -STWI_set_Callback_S: @ 81DF374 - ldr r1, _081DF37C @ =gRfuState - ldr r1, [r1] - str r0, [r1, 0x1C] - bx lr - .align 2, 0 -_081DF37C: .4byte gRfuState - thumb_func_end STWI_set_Callback_S - - thumb_func_start STWI_set_Callback_ID -STWI_set_Callback_ID: @ 81DF380 - ldr r1, _081DF388 @ =gRfuState - ldr r1, [r1] - str r0, [r1, 0x20] - bx lr - .align 2, 0 -_081DF388: .4byte gRfuState - thumb_func_end STWI_set_Callback_ID - - thumb_func_start STWI_poll_CommandEnd -STWI_poll_CommandEnd: @ 81DF38C - push {lr} - ldr r0, _081DF3B0 @ =gRfuState - ldr r1, [r0] - adds r2, r1, 0 - adds r2, 0x2C - ldrb r1, [r2] - adds r3, r0, 0 - cmp r1, 0x1 - bne _081DF3A6 - adds r1, r2, 0 -_081DF3A0: - ldrb r0, [r1] - cmp r0, 0x1 - beq _081DF3A0 -_081DF3A6: - ldr r0, [r3] - ldrh r0, [r0, 0x12] - pop {r1} - bx r1 - .align 2, 0 -_081DF3B0: .4byte gRfuState - thumb_func_end STWI_poll_CommandEnd - - thumb_func_start STWI_send_ResetREQ -STWI_send_ResetREQ: @ 81DF3B4 - push {lr} - movs r0, 0x10 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF3CE - ldr r0, _081DF3D4 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF3CE: - pop {r0} - bx r0 - .align 2, 0 -_081DF3D4: .4byte gRfuState - thumb_func_end STWI_send_ResetREQ - - thumb_func_start STWI_send_LinkStatusREQ -STWI_send_LinkStatusREQ: @ 81DF3D8 - push {lr} - movs r0, 0x11 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF3F2 - ldr r0, _081DF3F8 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF3F2: - pop {r0} - bx r0 - .align 2, 0 -_081DF3F8: .4byte gRfuState - thumb_func_end STWI_send_LinkStatusREQ - - thumb_func_start STWI_send_VersionStatusREQ -STWI_send_VersionStatusREQ: @ 81DF3FC - push {lr} - movs r0, 0x12 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF416 - ldr r0, _081DF41C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF416: - pop {r0} - bx r0 - .align 2, 0 -_081DF41C: .4byte gRfuState - thumb_func_end STWI_send_VersionStatusREQ - - thumb_func_start STWI_send_SystemStatusREQ -STWI_send_SystemStatusREQ: @ 81DF420 - push {lr} - movs r0, 0x13 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF43A - ldr r0, _081DF440 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF43A: - pop {r0} - bx r0 - .align 2, 0 -_081DF440: .4byte gRfuState - thumb_func_end STWI_send_SystemStatusREQ - - thumb_func_start STWI_send_SlotStatusREQ -STWI_send_SlotStatusREQ: @ 81DF444 - push {lr} - movs r0, 0x14 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF45E - ldr r0, _081DF464 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF45E: - pop {r0} - bx r0 - .align 2, 0 -_081DF464: .4byte gRfuState - thumb_func_end STWI_send_SlotStatusREQ - - thumb_func_start STWI_send_ConfigStatusREQ -STWI_send_ConfigStatusREQ: @ 81DF468 - push {lr} - movs r0, 0x15 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF482 - ldr r0, _081DF488 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF482: - pop {r0} - bx r0 - .align 2, 0 -_081DF488: .4byte gRfuState - thumb_func_end STWI_send_ConfigStatusREQ - - thumb_func_start STWI_send_GameConfigREQ -STWI_send_GameConfigREQ: @ 81DF48C - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r0, 0x16 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF4D8 - ldr r2, _081DF4E0 @ =gRfuState - ldr r1, [r2] - movs r0, 0x6 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r1, [r0, 0x24] - adds r1, 0x4 - ldrh r0, [r4] - strh r0, [r1] - adds r1, 0x2 - adds r4, 0x2 - movs r2, 0xD -_081DF4B6: - ldrb r0, [r4] - strb r0, [r1] - adds r1, 0x1 - adds r4, 0x1 - subs r2, 0x1 - cmp r2, 0 - bge _081DF4B6 - movs r2, 0x7 -_081DF4C6: - ldrb r0, [r5] - strb r0, [r1] - adds r1, 0x1 - adds r5, 0x1 - subs r2, 0x1 - cmp r2, 0 - bge _081DF4C6 - bl STWI_start_Command -_081DF4D8: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF4E0: .4byte gRfuState - thumb_func_end STWI_send_GameConfigREQ - - thumb_func_start STWI_send_SystemConfigREQ -STWI_send_SystemConfigREQ: @ 81DF4E4 - push {r4-r6,lr} - lsls r0, 16 - lsrs r6, r0, 16 - lsls r1, 24 - lsrs r5, r1, 24 - lsls r2, 24 - lsrs r4, r2, 24 - movs r0, 0x17 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF51A - ldr r2, _081DF520 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - adds r0, 0x4 - strb r4, [r0] - adds r0, 0x1 - strb r5, [r0] - adds r0, 0x1 - strh r6, [r0] - bl STWI_start_Command -_081DF51A: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF520: .4byte gRfuState - thumb_func_end STWI_send_SystemConfigREQ - - thumb_func_start STWI_send_SC_StartREQ -STWI_send_SC_StartREQ: @ 81DF524 - push {lr} - movs r0, 0x19 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF53E - ldr r0, _081DF544 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF53E: - pop {r0} - bx r0 - .align 2, 0 -_081DF544: .4byte gRfuState - thumb_func_end STWI_send_SC_StartREQ - - thumb_func_start STWI_send_SC_PollingREQ -STWI_send_SC_PollingREQ: @ 81DF548 - push {lr} - movs r0, 0x1A - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF562 - ldr r0, _081DF568 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF562: - pop {r0} - bx r0 - .align 2, 0 -_081DF568: .4byte gRfuState - thumb_func_end STWI_send_SC_PollingREQ - - thumb_func_start STWI_send_SC_EndREQ -STWI_send_SC_EndREQ: @ 81DF56C - push {lr} - movs r0, 0x1B - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF586 - ldr r0, _081DF58C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF586: - pop {r0} - bx r0 - .align 2, 0 -_081DF58C: .4byte gRfuState - thumb_func_end STWI_send_SC_EndREQ - - thumb_func_start STWI_send_SP_StartREQ -STWI_send_SP_StartREQ: @ 81DF590 - push {lr} - movs r0, 0x1C - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF5AA - ldr r0, _081DF5B0 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF5AA: - pop {r0} - bx r0 - .align 2, 0 -_081DF5B0: .4byte gRfuState - thumb_func_end STWI_send_SP_StartREQ - - thumb_func_start STWI_send_SP_PollingREQ -STWI_send_SP_PollingREQ: @ 81DF5B4 - push {lr} - movs r0, 0x1D - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF5CE - ldr r0, _081DF5D4 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF5CE: - pop {r0} - bx r0 - .align 2, 0 -_081DF5D4: .4byte gRfuState - thumb_func_end STWI_send_SP_PollingREQ - - thumb_func_start STWI_send_SP_EndREQ -STWI_send_SP_EndREQ: @ 81DF5D8 - push {lr} - movs r0, 0x1E - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF5F2 - ldr r0, _081DF5F8 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF5F2: - pop {r0} - bx r0 - .align 2, 0 -_081DF5F8: .4byte gRfuState - thumb_func_end STWI_send_SP_EndREQ - - thumb_func_start STWI_send_CP_StartREQ -STWI_send_CP_StartREQ: @ 81DF5FC - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - movs r0, 0x1F - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF620 - ldr r2, _081DF628 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - str r4, [r0, 0x4] - bl STWI_start_Command -_081DF620: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF628: .4byte gRfuState - thumb_func_end STWI_send_CP_StartREQ - - thumb_func_start STWI_send_CP_PollingREQ -STWI_send_CP_PollingREQ: @ 81DF62C - push {lr} - movs r0, 0x20 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF646 - ldr r0, _081DF64C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF646: - pop {r0} - bx r0 - .align 2, 0 -_081DF64C: .4byte gRfuState - thumb_func_end STWI_send_CP_PollingREQ - - thumb_func_start STWI_send_CP_EndREQ -STWI_send_CP_EndREQ: @ 81DF650 - push {lr} - movs r0, 0x21 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF66A - ldr r0, _081DF670 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF66A: - pop {r0} - bx r0 - .align 2, 0 -_081DF670: .4byte gRfuState - thumb_func_end STWI_send_CP_EndREQ - - thumb_func_start STWI_send_DataTxREQ -STWI_send_DataTxREQ: @ 81DF674 - push {r4-r6,lr} - adds r6, r0, 0 - lsls r4, r1, 24 - lsrs r5, r4, 24 - movs r0, 0x24 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF6B2 - lsrs r2, r4, 26 - movs r0, 0x3 - ands r0, r5 - cmp r0, 0 - beq _081DF694 - adds r2, 0x1 -_081DF694: - ldr r1, _081DF6B8 @ =gRfuState - ldr r0, [r1] - strb r2, [r0, 0x4] - ldr r0, [r1] - ldr r1, [r0, 0x24] - adds r1, 0x4 - ldrb r2, [r0, 0x4] - movs r0, 0x80 - lsls r0, 19 - orrs r2, r0 - adds r0, r6, 0 - bl CpuSet - bl STWI_start_Command -_081DF6B2: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF6B8: .4byte gRfuState - thumb_func_end STWI_send_DataTxREQ - - thumb_func_start STWI_send_DataTxAndChangeREQ -STWI_send_DataTxAndChangeREQ: @ 81DF6BC - push {r4-r6,lr} - adds r6, r0, 0 - lsls r4, r1, 24 - lsrs r5, r4, 24 - movs r0, 0x25 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF6FA - lsrs r2, r4, 26 - movs r0, 0x3 - ands r0, r5 - cmp r0, 0 - beq _081DF6DC - adds r2, 0x1 -_081DF6DC: - ldr r1, _081DF700 @ =gRfuState - ldr r0, [r1] - strb r2, [r0, 0x4] - ldr r0, [r1] - ldr r1, [r0, 0x24] - adds r1, 0x4 - ldrb r2, [r0, 0x4] - movs r0, 0x80 - lsls r0, 19 - orrs r2, r0 - adds r0, r6, 0 - bl CpuSet - bl STWI_start_Command -_081DF6FA: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF700: .4byte gRfuState - thumb_func_end STWI_send_DataTxAndChangeREQ - - thumb_func_start STWI_send_DataRxREQ -STWI_send_DataRxREQ: @ 81DF704 - push {lr} - movs r0, 0x26 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF71E - ldr r0, _081DF724 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF71E: - pop {r0} - bx r0 - .align 2, 0 -_081DF724: .4byte gRfuState - thumb_func_end STWI_send_DataRxREQ - - thumb_func_start STWI_send_MS_ChangeREQ -STWI_send_MS_ChangeREQ: @ 81DF728 - push {lr} - movs r0, 0x27 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF742 - ldr r0, _081DF748 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF742: - pop {r0} - bx r0 - .align 2, 0 -_081DF748: .4byte gRfuState - thumb_func_end STWI_send_MS_ChangeREQ - - thumb_func_start STWI_send_DataReadyAndChangeREQ -STWI_send_DataReadyAndChangeREQ: @ 81DF74C - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r5, r4, 0 - movs r0, 0x28 - bl STWI_init - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0 - bne _081DF792 - cmp r4, 0 - bne _081DF774 - ldr r0, _081DF770 @ =gRfuState - ldr r0, [r0] - strb r3, [r0, 0x4] - b _081DF78E - .align 2, 0 -_081DF770: .4byte gRfuState -_081DF774: - ldr r2, _081DF798 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - adds r0, 0x4 - strb r5, [r0] - adds r0, 0x1 - strb r3, [r0] - adds r0, 0x1 - strb r3, [r0] - strb r3, [r0, 0x1] -_081DF78E: - bl STWI_start_Command -_081DF792: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF798: .4byte gRfuState - thumb_func_end STWI_send_DataReadyAndChangeREQ - - thumb_func_start STWI_send_DisconnectedAndChangeREQ -STWI_send_DisconnectedAndChangeREQ: @ 81DF79C - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - movs r0, 0x29 - bl STWI_init - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0 - bne _081DF7D2 - ldr r2, _081DF7D8 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - adds r0, 0x4 - strb r4, [r0] - adds r0, 0x1 - strb r5, [r0] - adds r0, 0x1 - strb r3, [r0] - strb r3, [r0, 0x1] - bl STWI_start_Command -_081DF7D2: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF7D8: .4byte gRfuState - thumb_func_end STWI_send_DisconnectedAndChangeREQ - - thumb_func_start STWI_send_ResumeRetransmitAndChangeREQ -STWI_send_ResumeRetransmitAndChangeREQ: @ 81DF7DC - push {lr} - movs r0, 0x37 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF7F6 - ldr r0, _081DF7FC @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF7F6: - pop {r0} - bx r0 - .align 2, 0 -_081DF7FC: .4byte gRfuState - thumb_func_end STWI_send_ResumeRetransmitAndChangeREQ - - thumb_func_start STWI_send_DisconnectREQ -STWI_send_DisconnectREQ: @ 81DF800 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r0, 0x30 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF824 - ldr r2, _081DF82C @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - str r4, [r0, 0x4] - bl STWI_start_Command -_081DF824: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF82C: .4byte gRfuState - thumb_func_end STWI_send_DisconnectREQ - - thumb_func_start STWI_send_TestModeREQ -STWI_send_TestModeREQ: @ 81DF830 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 24 - lsrs r4, r1, 24 - movs r0, 0x31 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF85C - ldr r2, _081DF864 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r1, [r0, 0x24] - lsls r0, r4, 8 - orrs r0, r5 - str r0, [r1, 0x4] - bl STWI_start_Command -_081DF85C: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF864: .4byte gRfuState - thumb_func_end STWI_send_TestModeREQ - - thumb_func_start STWI_send_CPR_StartREQ -STWI_send_CPR_StartREQ: @ 81DF868 - push {r4-r6,lr} - lsls r0, 16 - lsrs r5, r0, 16 - lsls r1, 16 - lsrs r4, r1, 16 - lsls r2, 24 - lsrs r6, r2, 24 - movs r0, 0x32 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF89A - ldr r2, _081DF8A0 @ =gRfuState - ldr r1, [r2] - movs r0, 0x2 - strb r0, [r1, 0x4] - lsls r0, r5, 16 - orrs r0, r4 - ldr r1, [r2] - ldr r1, [r1, 0x24] - str r0, [r1, 0x4] - str r6, [r1, 0x8] - bl STWI_start_Command -_081DF89A: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF8A0: .4byte gRfuState - thumb_func_end STWI_send_CPR_StartREQ - - thumb_func_start STWI_send_CPR_PollingREQ -STWI_send_CPR_PollingREQ: @ 81DF8A4 - push {lr} - movs r0, 0x33 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF8BE - ldr r0, _081DF8C4 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF8BE: - pop {r0} - bx r0 - .align 2, 0 -_081DF8C4: .4byte gRfuState - thumb_func_end STWI_send_CPR_PollingREQ - - thumb_func_start STWI_send_CPR_EndREQ -STWI_send_CPR_EndREQ: @ 81DF8C8 - push {lr} - movs r0, 0x34 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF8E2 - ldr r0, _081DF8E8 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF8E2: - pop {r0} - bx r0 - .align 2, 0 -_081DF8E8: .4byte gRfuState - thumb_func_end STWI_send_CPR_EndREQ - - thumb_func_start STWI_send_StopModeREQ -STWI_send_StopModeREQ: @ 81DF8EC - push {lr} - movs r0, 0x3D - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF906 - ldr r0, _081DF90C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF906: - pop {r0} - bx r0 - .align 2, 0 -_081DF90C: .4byte gRfuState - thumb_func_end STWI_send_StopModeREQ - - thumb_func_start STWI_intr_timer -STWI_intr_timer: @ 81DF910 - push {r4,lr} - ldr r4, _081DF928 @ =gRfuState - ldr r1, [r4] - ldr r0, [r1, 0xC] - cmp r0, 0x2 - beq _081DF936 - cmp r0, 0x2 - bhi _081DF92C - cmp r0, 0x1 - beq _081DF944 - b _081DF96C - .align 2, 0 -_081DF928: .4byte gRfuState -_081DF92C: - cmp r0, 0x3 - beq _081DF94E - cmp r0, 0x4 - beq _081DF944 - b _081DF96C -_081DF936: - ldrb r0, [r1, 0x10] - movs r0, 0x1 - strb r0, [r1, 0x10] - movs r0, 0x32 - bl STWI_set_timer - b _081DF96C -_081DF944: - bl STWI_stop_timer - bl STWI_restart_Command - b _081DF96C -_081DF94E: - ldrb r0, [r1, 0x10] - movs r0, 0x1 - strb r0, [r1, 0x10] - bl STWI_stop_timer - bl STWI_reset_ClockCounter - ldr r0, [r4] - ldr r2, [r0, 0x18] - cmp r2, 0 - beq _081DF96C - movs r0, 0xFF - movs r1, 0 - bl _call_via_r2 -_081DF96C: - pop {r4} - pop {r0} - bx r0 - thumb_func_end STWI_intr_timer - - thumb_func_start STWI_set_timer -STWI_set_timer: @ 81DF974 - push {r4-r7,lr} - lsls r0, 24 - lsrs r3, r0, 24 - adds r5, r3, 0 - ldr r2, _081DF9A4 @ =gRfuState - ldr r0, [r2] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r1, _081DF9A8 @ =0x04000100 - adds r4, r0, r1 - adds r1, 0x2 - adds r7, r0, r1 - ldr r1, _081DF9AC @ =0x04000208 - movs r0, 0 - strh r0, [r1] - adds r6, r2, 0 - cmp r3, 0x50 - beq _081DF9CC - cmp r3, 0x50 - bgt _081DF9B0 - cmp r3, 0x32 - beq _081DF9BA - b _081DF9F8 - .align 2, 0 -_081DF9A4: .4byte gRfuState -_081DF9A8: .4byte 0x04000100 -_081DF9AC: .4byte 0x04000208 -_081DF9B0: - cmp r5, 0x64 - beq _081DF9DC - cmp r5, 0x82 - beq _081DF9EC - b _081DF9F8 -_081DF9BA: - ldr r1, _081DF9C8 @ =0x0000fccb - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x1 - b _081DF9F6 - .align 2, 0 -_081DF9C8: .4byte 0x0000fccb -_081DF9CC: - ldr r1, _081DF9D8 @ =0x0000fae0 - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x2 - b _081DF9F6 - .align 2, 0 -_081DF9D8: .4byte 0x0000fae0 -_081DF9DC: - ldr r1, _081DF9E8 @ =0x0000f996 - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x3 - b _081DF9F6 - .align 2, 0 -_081DF9E8: .4byte 0x0000f996 -_081DF9EC: - ldr r1, _081DFA14 @ =0x0000f7ad - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x4 -_081DF9F6: - str r0, [r1, 0xC] -_081DF9F8: - movs r0, 0xC3 - strh r0, [r7] - ldr r2, _081DFA18 @ =0x04000202 - ldr r1, [r6] - movs r0, 0x8 - ldrb r1, [r1, 0xA] - lsls r0, r1 - strh r0, [r2] - ldr r1, _081DFA1C @ =0x04000208 - movs r0, 0x1 - strh r0, [r1] - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DFA14: .4byte 0x0000f7ad -_081DFA18: .4byte 0x04000202 -_081DFA1C: .4byte 0x04000208 - thumb_func_end STWI_set_timer - - thumb_func_start STWI_stop_timer -STWI_stop_timer: @ 81DFA20 - ldr r2, _081DFA40 @ =gRfuState - ldr r0, [r2] - movs r1, 0 - str r1, [r0, 0xC] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r3, _081DFA44 @ =0x04000100 - adds r0, r3 - strh r1, [r0] - ldr r0, [r2] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r2, _081DFA48 @ =0x04000102 - adds r0, r2 - strh r1, [r0] - bx lr - .align 2, 0 -_081DFA40: .4byte gRfuState -_081DFA44: .4byte 0x04000100 -_081DFA48: .4byte 0x04000102 - thumb_func_end STWI_stop_timer - - thumb_func_start STWI_init -STWI_init: @ 81DFA4C - push {r4-r6,lr} - lsls r0, 24 - lsrs r5, r0, 24 - adds r6, r5, 0 - ldr r0, _081DFA78 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081DFA80 - ldr r0, _081DFA7C @ =gRfuState - ldr r1, [r0] - ldrh r0, [r1, 0x12] - movs r0, 0x6 - strh r0, [r1, 0x12] - ldr r2, [r1, 0x18] - cmp r2, 0 - beq _081DFACA - ldrh r1, [r1, 0x12] - adds r0, r5, 0 - bl _call_via_r2 - b _081DFACA - .align 2, 0 -_081DFA78: .4byte 0x04000208 -_081DFA7C: .4byte gRfuState -_081DFA80: - ldr r4, _081DFAAC @ =gRfuState - ldr r2, [r4] - adds r3, r2, 0 - adds r3, 0x2C - ldrb r0, [r3] - cmp r0, 0x1 - bne _081DFAB0 - ldrh r0, [r2, 0x12] - movs r1, 0 - movs r0, 0x2 - strh r0, [r2, 0x12] - ldrb r0, [r3] - strb r1, [r3] - ldr r0, [r4] - ldr r2, [r0, 0x18] - cmp r2, 0 - beq _081DFACA - ldrh r1, [r0, 0x12] - adds r0, r5, 0 - bl _call_via_r2 - b _081DFACA - .align 2, 0 -_081DFAAC: .4byte gRfuState -_081DFAB0: - ldrb r0, [r2, 0x14] - cmp r0, 0 - bne _081DFACE - ldrh r0, [r2, 0x12] - movs r0, 0x4 - strh r0, [r2, 0x12] - ldr r3, [r2, 0x18] - cmp r3, 0 - beq _081DFACA - ldrh r1, [r2, 0x12] - adds r0, r5, 0 - bl _call_via_r3 -_081DFACA: - movs r0, 0x1 - b _081DFB16 -_081DFACE: - ldrb r0, [r3] - movs r1, 0 - movs r0, 0x1 - strb r0, [r3] - ldr r0, [r4] - strb r6, [r0, 0x6] - ldr r0, [r4] - str r1, [r0] - strb r1, [r0, 0x4] - ldr r0, [r4] - strb r1, [r0, 0x5] - ldr r0, [r4] - strb r1, [r0, 0x7] - ldr r0, [r4] - strb r1, [r0, 0x8] - ldr r0, [r4] - strb r1, [r0, 0x9] - ldr r0, [r4] - str r1, [r0, 0xC] - ldrb r2, [r0, 0x10] - strb r1, [r0, 0x10] - ldr r0, [r4] - ldrh r2, [r0, 0x12] - movs r2, 0 - strh r1, [r0, 0x12] - strb r2, [r0, 0x15] - ldr r1, _081DFB1C @ =0x04000134 - movs r2, 0x80 - lsls r2, 1 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r2, _081DFB20 @ =0x00005003 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 -_081DFB16: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_081DFB1C: .4byte 0x04000134 -_081DFB20: .4byte 0x00005003 - thumb_func_end STWI_init - - thumb_func_start STWI_start_Command -STWI_start_Command: @ 81DFB24 - push {r4,r5,lr} - ldr r5, _081DFB7C @ =gRfuState - ldr r0, [r5] - ldr r3, [r0, 0x24] - ldrb r1, [r0, 0x4] - lsls r1, 8 - ldrb r0, [r0, 0x6] - ldr r2, _081DFB80 @ =0x99660000 - orrs r0, r2 - orrs r1, r0 - str r1, [r3] - ldr r2, _081DFB84 @ =0x04000120 - ldr r1, [r5] - ldr r0, [r1, 0x24] - ldr r0, [r0] - str r0, [r2] - movs r2, 0 - str r2, [r1] - movs r0, 0x1 - strb r0, [r1, 0x5] - ldr r4, _081DFB88 @ =0x04000208 - ldrh r3, [r4] - strh r2, [r4] - ldr r2, _081DFB8C @ =0x04000200 - ldr r1, [r5] - movs r0, 0x8 - ldrb r1, [r1, 0xA] - lsls r0, r1 - ldrh r1, [r2] - orrs r0, r1 - strh r0, [r2] - ldrh r0, [r2] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r2] - strh r3, [r4] - ldr r1, _081DFB90 @ =0x04000128 - ldr r2, _081DFB94 @ =0x00005083 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_081DFB7C: .4byte gRfuState -_081DFB80: .4byte 0x99660000 -_081DFB84: .4byte 0x04000120 -_081DFB88: .4byte 0x04000208 -_081DFB8C: .4byte 0x04000200 -_081DFB90: .4byte 0x04000128 -_081DFB94: .4byte 0x00005083 - thumb_func_end STWI_start_Command - - thumb_func_start STWI_restart_Command -STWI_restart_Command: @ 81DFB98 - push {r4,lr} - ldr r4, _081DFBB0 @ =gRfuState - ldr r2, [r4] - ldrb r0, [r2, 0x15] - adds r3, r4, 0 - cmp r0, 0x1 - bhi _081DFBB4 - adds r0, 0x1 - strb r0, [r2, 0x15] - bl STWI_start_Command - b _081DFC0E - .align 2, 0 -_081DFBB0: .4byte gRfuState -_081DFBB4: - ldrb r0, [r2, 0x6] - cmp r0, 0x27 - beq _081DFBC6 - cmp r0, 0x25 - beq _081DFBC6 - cmp r0, 0x35 - beq _081DFBC6 - cmp r0, 0x37 - bne _081DFBE8 -_081DFBC6: - ldr r0, [r3] - ldrh r1, [r0, 0x12] - movs r2, 0 - movs r1, 0x1 - strh r1, [r0, 0x12] - adds r0, 0x2C - ldrb r1, [r0] - strb r2, [r0] - ldr r1, [r3] - ldr r2, [r1, 0x18] - cmp r2, 0 - beq _081DFC0E - ldrb r0, [r1, 0x6] - ldrh r1, [r1, 0x12] - bl _call_via_r2 - b _081DFC0E -_081DFBE8: - ldrh r0, [r2, 0x12] - movs r1, 0 - movs r0, 0x1 - strh r0, [r2, 0x12] - adds r0, r2, 0 - adds r0, 0x2C - ldrb r2, [r0] - strb r1, [r0] - ldr r1, [r4] - ldr r2, [r1, 0x18] - cmp r2, 0 - beq _081DFC08 - ldrb r0, [r1, 0x6] - ldrh r1, [r1, 0x12] - bl _call_via_r2 -_081DFC08: - ldr r1, [r4] - movs r0, 0x4 - str r0, [r1] -_081DFC0E: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end STWI_restart_Command - - thumb_func_start STWI_reset_ClockCounter -STWI_reset_ClockCounter: @ 81DFC18 - ldr r3, _081DFC44 @ =gRfuState - ldr r1, [r3] - movs r0, 0x5 - str r0, [r1] - movs r2, 0 - strb r2, [r1, 0x4] - ldr r0, [r3] - strb r2, [r0, 0x5] - ldr r1, _081DFC48 @ =0x04000120 - movs r0, 0x80 - lsls r0, 24 - str r0, [r1] - adds r1, 0x8 - strh r2, [r1] - ldr r2, _081DFC4C @ =0x00005003 - adds r0, r2, 0 - strh r0, [r1] - adds r2, 0x7F - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 - bx lr - .align 2, 0 -_081DFC44: .4byte gRfuState -_081DFC48: .4byte 0x04000120 -_081DFC4C: .4byte 0x00005003 - thumb_func_end STWI_reset_ClockCounter diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 6d54bc5fb..8eacc8aa7 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -137,6 +137,8 @@ #define REG_OFFSET_DMA3CNT_H 0xde #define REG_OFFSET_TMCNT 0x100 +#define REG_OFFSET_TMCNT_L 0x100 +#define REG_OFFSET_TMCNT_H 0x102 #define REG_OFFSET_TM0CNT 0x100 #define REG_OFFSET_TM0CNT_L 0x100 #define REG_OFFSET_TM0CNT_H 0x102 @@ -298,6 +300,8 @@ #define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H) #define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT) +#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L) +#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H) #define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT) #define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L) #define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H) @@ -458,6 +462,8 @@ #define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) #define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4))) +#define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4))) +#define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4))) #define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT) #define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L) #define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H) diff --git a/include/gba/macro.h b/include/gba/macro.h index e416c3577..a3e870210 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -105,7 +105,7 @@ } \ } -#define DmaClearLarge(dmaNum, dest, size, block, bit) \ +#define DmaClearLarge(dmaNum, dest, size, block, bit) \ { \ u32 _size = size; \ while (1) \ @@ -170,4 +170,14 @@ #define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16) #define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32) +#define IntrEnable(flags) \ +{ \ + u16 imeTemp; \ + \ + imeTemp = REG_IME; \ + REG_IME = 0; \ + REG_IE |= flags; \ + REG_IME = imeTemp; \ +} + #endif // GUARD_GBA_MACRO_H diff --git a/include/librfu.h b/include/librfu.h index 5eb9fd7a0..709074f9c 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -108,7 +108,7 @@ struct RfuStruct u8 ackActiveCommand; u8 timerSelect; u8 unk_b; - s32 timerState; + u32 timerState; // this field is s32 in emerald vu8 timerActive; u8 unk_11; vu16 error; @@ -126,10 +126,10 @@ struct RfuStruct struct RfuIntrStruct { - u8 rxPacketAlloc[0x74]; - u8 txPacketAlloc[0x74]; - u8 block1[0x960]; - u8 block2[0x30]; + union RfuPacket rxPacketAlloc; + union RfuPacket txPacketAlloc; + u8 block1[0x960]; // size of librfu_intr.s binary + struct RfuStruct block2; }; struct RfuSlotStatusUNI @@ -248,14 +248,6 @@ struct Unk_3007470 u16 unkA; }; -struct STWIStruct -{ - // TODO: resolve the struct - u8 unk_0[232]; - u8 function[2400]; - struct RfuStruct STWIStatus; -}; - struct Unk_3001190 { struct RfuLinkStatus linkStatus; @@ -263,7 +255,7 @@ struct Unk_3001190 struct RfuFixed fixed; struct RfuSlotStatusNI NI[4]; struct RfuSlotStatusUNI UNI[4]; - struct STWIStruct STWI; + struct RfuIntrStruct intr; }; extern struct RfuStruct *gRfuState; @@ -275,7 +267,6 @@ extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; void rfu_STC_clearAPIVariables(void); -void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_REQ_stopMode(void); void rfu_waitREQComplete(void); u32 rfu_REQBN_softReset_and_checkID(void); @@ -323,4 +314,50 @@ void rfu_UNI_clearRecvNewDataFlag(u8 a0); void rfu_REQ_PARENT_resumeRetransmitAndChange(void); void rfu_NI_setSendData(u8, u8, const void *, u32); +// librfu_intr +void IntrSIO32(void); + +// librfu_stwi +void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); +void STWI_set_MS_mode(u8 mode); +void STWI_init_Callback_M(void); +void STWI_init_Callback_S(void); +void STWI_set_Callback_M(void (*callbackM)()); +void STWI_set_Callback_S(void (*callbackS)()); +void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect); +void AgbRFU_SoftReset(void); +void STWI_set_Callback_ID(u32 id); +u16 STWI_read_status(u8 index); +u16 STWI_poll_CommandEnd(void); +void STWI_send_DataRxREQ(void); +void STWI_send_MS_ChangeREQ(void); +void STWI_send_StopModeREQ(void); +void STWI_send_SystemStatusREQ(void); +void STWI_send_GameConfigREQ(u8 *unk1, u8 *data); +void STWI_send_ResetREQ(void); +void STWI_send_LinkStatusREQ(void); +void STWI_send_VersionStatusREQ(void); +void STWI_send_SlotStatusREQ(void); +void STWI_send_ConfigStatusREQ(void); +void STWI_send_ResumeRetransmitAndChangeREQ(void); +void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3); +void STWI_send_SC_StartREQ(void); +void STWI_send_SC_PollingREQ(void); +void STWI_send_SC_EndREQ(void); +void STWI_send_SP_StartREQ(void); +void STWI_send_SP_PollingREQ(void); +void STWI_send_SP_EndREQ(void); +void STWI_send_CP_StartREQ(u16 unk1); +void STWI_send_CP_PollingREQ(void); +void STWI_send_CP_EndREQ(void); +void STWI_send_DataTxREQ(const void *in, u8 size); +void STWI_send_DataTxAndChangeREQ(const void *in, u8 size); +void STWI_send_DataReadyAndChangeREQ(u8 unk); +void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1); +void STWI_send_DisconnectREQ(u8 unk); +void STWI_send_TestModeREQ(u8 unk0, u8 unk1); +void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2); +void STWI_send_CPR_PollingREQ(void); +void STWI_send_CPR_EndREQ(void); + #endif // GUARD_LIBRFU_H diff --git a/ld_script.txt b/ld_script.txt index aeb11a271..c57b7b4a0 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -317,7 +317,7 @@ SECTIONS { src/agb_flash_1m.o(.text); src/agb_flash_mx.o(.text); src/agb_flash_le.o(.text); - asm/librfu_stwi.o(.text); + src/librfu_stwi.o(.text); asm/librfu_intr.o(.text); asm/librfu.o(.text); src/isagbprn.o(.text); diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c new file mode 100644 index 000000000..fe8a4ef76 --- /dev/null +++ b/src/librfu_stwi.c @@ -0,0 +1,645 @@ +#include "global.h" +#include "librfu.h" + +static void STWI_intr_timer(void); +static u16 STWI_init(u8 request); +static s32 STWI_start_Command(void); +static void STWI_set_timer(u8 unk); +static void STWI_stop_timer(void); +static s32 STWI_restart_Command(void); +static s32 STWI_reset_ClockCounter(void); + +void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + // If we're copying our interrupt into RAM, DMA it to block1 and use + // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // interrupt usually is a pointer to gIntrTable[1] + if (copyInterruptToRam == TRUE) + { + *interrupt = (IntrFunc)interruptStruct->block1; + DmaCopy16(3, &IntrSIO32, interruptStruct->block1, sizeof(interruptStruct->block1)); + gRfuState = &interruptStruct->block2; + } + else + { + *interrupt = IntrSIO32; + gRfuState = (struct RfuStruct *)interruptStruct->block1; + } + gRfuState->rxPacket = &interruptStruct->rxPacketAlloc; + gRfuState->txPacket = &interruptStruct->txPacketAlloc; + gRfuState->msMode = 1; + gRfuState->state = 0; + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + gRfuState->ackLength = 0; + gRfuState->ackNext = 0; + gRfuState->ackActiveCommand = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->error = 0; + gRfuState->recoveryCount = 0; + gRfuState->unk_2c = 0; + REG_RCNT = 0x100; // TODO: mystery bit? + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + STWI_init_Callback_M(); + STWI_init_Callback_S(); + IntrEnable(INTR_FLAG_SERIAL); +} + +void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect) +{ + *interrupt = STWI_intr_timer; + gRfuState->timerSelect = timerSelect; + IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); +} + +void AgbRFU_SoftReset(void) +{ + vu16 *timerL; + vu16 *timerH; + + REG_RCNT = 0x8000; + REG_RCNT = 0x80A0; // all these bits are undocumented + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + *timerH = 0; + *timerL = 0; + *timerH = 0x83; + while (*timerL <= 0x11) + REG_RCNT = 0x80A2; + *timerH = 3; + REG_RCNT = 0x80A0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gRfuState->state = 0; + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + gRfuState->reqActiveCommand = 0; + gRfuState->ackLength = 0; + gRfuState->ackNext = 0; + gRfuState->ackActiveCommand = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->error = 0; + gRfuState->msMode = 1; + gRfuState->recoveryCount = 0; + gRfuState->unk_2c = 0; +} + +void STWI_set_MS_mode(u8 mode) +{ + gRfuState->msMode = mode; +} + +u16 STWI_read_status(u8 index) +{ + switch (index) + { + case 0: + return gRfuState->error; + case 1: + return gRfuState->msMode; + case 2: + return gRfuState->state; + case 3: + return gRfuState->reqActiveCommand; + default: + return 0xFFFF; + } +} + +void STWI_init_Callback_M(void) +{ + STWI_set_Callback_M(NULL); +} + +void STWI_init_Callback_S(void) +{ + STWI_set_Callback_S(NULL); +} + +void STWI_set_Callback_M(void (*callbackM)()) +{ + gRfuState->callbackM = callbackM; +} + +void STWI_set_Callback_S(void (*callbackS)()) +{ + gRfuState->callbackS = callbackS; +} + +void STWI_set_Callback_ID(u32 id) +{ + gRfuState->callbackId = id; +} + +u16 STWI_poll_CommandEnd(void) +{ + while (gRfuState->unk_2c == TRUE) + ; + return gRfuState->error; +} + +void STWI_send_ResetREQ(void) +{ + if (!STWI_init(RFU_RESET)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_LinkStatusREQ(void) +{ + if (!STWI_init(RFU_LINK_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_VersionStatusREQ(void) +{ + if (!STWI_init(RFU_VERSION_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SystemStatusREQ(void) +{ + if (!STWI_init(RFU_SYSTEM_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SlotStatusREQ(void) +{ + if (!STWI_init(RFU_SLOT_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_ConfigStatusREQ(void) +{ + if (!STWI_init(RFU_CONFIG_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_GameConfigREQ(u8 *unk1, u8 *data) +{ + u8 *packetBytes; + s32 i; + + if (!STWI_init(RFU_GAME_CONFIG)) + { + gRfuState->reqLength = 6; + // TODO: what is unk1 + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *(u16 *)packetBytes = *(u16 *)unk1; + packetBytes += sizeof(u16); + unk1 += sizeof(u16); + for (i = 0; i < 14; ++i) + { + *packetBytes = *unk1; + ++packetBytes; + ++unk1; + } + for (i = 0; i < 8; ++i) + { + *packetBytes = *data; + ++packetBytes; + ++data; + } + STWI_start_Command(); + } +} + +void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) +{ + if (!STWI_init(RFU_SYSTEM_CONFIG)) + { + u8 *packetBytes; + + gRfuState->reqLength = 1; + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *packetBytes++ = unk3; + *packetBytes++ = unk2; + *(u16*)packetBytes = unk1; + STWI_start_Command(); + } +} + +void STWI_send_SC_StartREQ(void) +{ + if (!STWI_init(RFU_SC_START)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_PollingREQ(void) +{ + if (!STWI_init(RFU_SC_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_EndREQ(void) +{ + if (!STWI_init(RFU_SC_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_StartREQ(void) +{ + if (!STWI_init(RFU_SP_START)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_PollingREQ(void) +{ + if (!STWI_init(RFU_SP_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_EndREQ(void) +{ + if (!STWI_init(RFU_SP_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_StartREQ(u16 unk1) +{ + if (!STWI_init(RFU_CP_START)) + { + gRfuState->reqLength = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk1; + STWI_start_Command(); + } +} + +void STWI_send_CP_PollingREQ(void) +{ + if (!STWI_init(RFU_CP_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_EndREQ(void) +{ + if (!STWI_init(RFU_CP_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataTxREQ(const void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX)) + { + u8 reqLength = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + reqLength += 1; + gRfuState->reqLength = reqLength; + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->reqLength * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) + { + u8 reqLength = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + reqLength += 1; + gRfuState->reqLength = reqLength; + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->reqLength * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataRxREQ(void) +{ + if (!STWI_init(RFU_DATA_RX)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_MS_ChangeREQ(void) +{ + if (!STWI_init(RFU_MS_CHANGE)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataReadyAndChangeREQ(u8 unk) +{ + if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) + { + if (!unk) + { + gRfuState->reqLength = 0; + } + else + { + u8 *packetBytes; + + gRfuState->reqLength = 1; + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *packetBytes++ = unk; + *packetBytes++ = 0; + *packetBytes++ = 0; + *packetBytes = 0; + } + STWI_start_Command(); + } +} + +void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) + { + u8 *packetBytes; + + gRfuState->reqLength = 1; + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *packetBytes++ = unk0; + *packetBytes++ = unk1; + *packetBytes++ = 0; + *packetBytes = 0; + STWI_start_Command(); + } +} + +void STWI_send_ResumeRetransmitAndChangeREQ(void) +{ + if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_DisconnectREQ(u8 unk) +{ + if (!STWI_init(RFU_DISCONNECT)) + { + gRfuState->reqLength = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk; + STWI_start_Command(); + } +} + +void STWI_send_TestModeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_TEST_MODE)) + { + gRfuState->reqLength = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); + STWI_start_Command(); + } +} + +void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) +{ + u32 *packetData; + u32 arg1; + + if (!STWI_init(RFU_CPR_START)) + { + gRfuState->reqLength = 2; + arg1 = unk1 | (unk0 << 16); + packetData = gRfuState->txPacket->rfuPacket32.data; + packetData[0] = arg1; + packetData[1] = unk2; + STWI_start_Command(); + } +} + +void STWI_send_CPR_PollingREQ(void) +{ + if (!STWI_init(RFU_CPR_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_CPR_EndREQ(void) +{ + if (!STWI_init(RFU_CPR_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_StopModeREQ(void) +{ + if (!STWI_init(RFU_STOP_MODE)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +static void STWI_intr_timer(void) +{ + switch (gRfuState->timerState) + { + // TODO: Make an enum for these + case 2: + gRfuState->timerActive = 1; + STWI_set_timer(50); + break; + case 1: + case 4: + STWI_stop_timer(); + STWI_restart_Command(); + break; + case 3: + gRfuState->timerActive = 1; + STWI_stop_timer(); + STWI_reset_ClockCounter(); + if (gRfuState->callbackM) + gRfuState->callbackM(255, 0); + break; + } +} + +static void STWI_set_timer(u8 unk) +{ + vu16 *timerL; + vu16 *timerH; + + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + REG_IME = 0; + switch (unk) + { + case 50: + *timerL = 0xFCCB; + gRfuState->timerState = 1; + break; + case 80: + *timerL = 0xFAE0; + gRfuState->timerState = 2; + break; + case 100: + *timerL = 0xF996; + gRfuState->timerState = 3; + break; + case 130: + *timerL = 0xF7AD; + gRfuState->timerState = 4; + break; + } + *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; + REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; + REG_IME = 1; +} + +static void STWI_stop_timer(void) +{ + gRfuState->timerState = 0; + REG_TMCNT_L(gRfuState->timerSelect) = 0; + REG_TMCNT_H(gRfuState->timerSelect) = 0; +} + +static u16 STWI_init(u8 request) +{ + if (!REG_IME) + { + gRfuState->error = 6; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->error); + return TRUE; + } + else if (gRfuState->unk_2c == TRUE) + { + gRfuState->error = 2; + gRfuState->unk_2c = FALSE; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->error); + return TRUE; + } + else if(!gRfuState->msMode) + { + gRfuState->error = 4; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->error, gRfuState); + return TRUE; + } + else + { + gRfuState->unk_2c = TRUE; + gRfuState->reqActiveCommand = request; + gRfuState->state = 0; + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + gRfuState->ackLength = 0; + gRfuState->ackNext = 0; + gRfuState->ackActiveCommand = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->error = 0; + gRfuState->recoveryCount = 0; + REG_RCNT = 0x100; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + return FALSE; + } +} + +static s32 STWI_start_Command(void) +{ + u16 imeTemp; + + // equivalent to gRfuState->txPacket->rfuPacket32.command, + // but the cast here is required to avoid register issue + *(u32 *)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->reqLength << 8) | gRfuState->reqActiveCommand; + REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; + gRfuState->state = 0; + gRfuState->reqNext = 1; + imeTemp = REG_IME; + REG_IME = 0; + REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = imeTemp; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; + return 0; +} + +static s32 STWI_restart_Command(void) +{ + if (gRfuState->recoveryCount <= 1) + { + ++gRfuState->recoveryCount; + STWI_start_Command(); + } + else + { + if (gRfuState->reqActiveCommand == RFU_MS_CHANGE || gRfuState->reqActiveCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->reqActiveCommand == RFU_UNK35 || gRfuState->reqActiveCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) + { + gRfuState->error = 1; + gRfuState->unk_2c = 0; + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); + } + else + { + gRfuState->error = 1; + gRfuState->unk_2c = 0; + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); + gRfuState->state = 4; // TODO: what's 4 + } + } + return 0; +} + +static s32 STWI_reset_ClockCounter(void) +{ + gRfuState->state = 5; // TODO: what is 5 + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + REG_SIODATA32 = (1 << 31); + REG_SIOCNT = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; + return 0; +} -- cgit v1.2.3 From 973cb394b23002acde7d7ea19abc754019dd106c Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Sun, 29 Dec 2019 06:24:26 +0800 Subject: librfu through 0x81E13F0 --- asm/librfu.s | 1943 -------------------------------------------- common_syms/librfu_rfu.txt | 7 + data/librfu_rodata.s | 1 - include/constants/trade.h | 4 +- include/gba/io_reg.h | 2 +- include/gba/syscall.h | 2 + include/librfu.h | 37 +- ld_script.txt | 1 + src/agb_flash.c | 2 +- src/librfu_rfu.c | 736 +++++++++++++++++ src/librfu_stwi.c | 21 +- sym_common.txt | 23 +- 12 files changed, 782 insertions(+), 1997 deletions(-) create mode 100644 common_syms/librfu_rfu.txt create mode 100644 src/librfu_rfu.c diff --git a/asm/librfu.s b/asm/librfu.s index 2e17aef23..d3b48f07e 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,1949 +5,6 @@ .text - thumb_func_start rfu_initializeAPI -rfu_initializeAPI: @ 81E05B0 - push {r4-r7,lr} - adds r4, r0, 0 - mov r12, r2 - lsls r1, 16 - lsrs r2, r1, 16 - lsls r3, 24 - lsrs r7, r3, 24 - movs r0, 0xF0 - lsls r0, 20 - ands r0, r4 - movs r1, 0x80 - lsls r1, 18 - cmp r0, r1 - bne _081E05D0 - cmp r7, 0 - bne _081E05D8 -_081E05D0: - movs r0, 0x3 - ands r0, r4 - cmp r0, 0 - beq _081E05DC -_081E05D8: - movs r0, 0x2 - b _081E06C6 -_081E05DC: - cmp r7, 0 - beq _081E05E8 - ldr r3, _081E05E4 @ =0x00000e64 - b _081E05EA - .align 2, 0 -_081E05E4: .4byte 0x00000e64 -_081E05E8: - ldr r3, _081E05F4 @ =0x00000504 -_081E05EA: - cmp r2, r3 - bcs _081E05F8 - movs r0, 0x1 - b _081E06C6 - .align 2, 0 -_081E05F4: .4byte 0x00000504 -_081E05F8: - ldr r0, _081E06CC @ =gRfuLinkStatus - str r4, [r0] - ldr r1, _081E06D0 @ =gRfuStatic - adds r0, r4, 0 - adds r0, 0xB4 - str r0, [r1] - ldr r1, _081E06D4 @ =gRfuFixed - adds r0, 0x28 - str r0, [r1] - ldr r2, _081E06D8 @ =gRfuSlotStatusNI - movs r1, 0xDE - lsls r1, 1 - adds r0, r4, r1 - str r0, [r2] - ldr r1, _081E06DC @ =gRfuSlotStatusUNI - movs r3, 0xDF - lsls r3, 2 - adds r0, r4, r3 - str r0, [r1] - movs r5, 0x1 - adds r6, r2, 0 - adds r4, r1, 0 -_081E0624: - lsls r2, r5, 2 - adds r3, r2, r6 - subs r1, r5, 0x1 - lsls r1, 2 - adds r0, r1, r6 - ldr r0, [r0] - adds r0, 0x70 - str r0, [r3] - adds r2, r4 - adds r1, r4 - ldr r0, [r1] - adds r0, 0x1C - str r0, [r2] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _081E0624 - ldr r0, _081E06D4 @ =gRfuFixed - ldr r1, [r0] - adds r1, 0xDC - ldr r4, _081E06DC @ =gRfuSlotStatusUNI - ldr r0, [r4, 0xC] - adds r0, 0x1C - str r0, [r1] - mov r1, r12 - adds r2, r7, 0 - bl STWI_init_all - bl rfu_STC_clearAPIVariables - movs r5, 0 - ldr r3, _081E06D8 @ =gRfuSlotStatusNI - movs r2, 0 -_081E0668: - lsls r1, r5, 2 - adds r0, r1, r3 - ldr r0, [r0] - str r2, [r0, 0x68] - str r2, [r0, 0x6C] - adds r1, r4 - ldr r0, [r1] - str r2, [r0, 0x14] - str r2, [r0, 0x18] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _081E0668 - ldr r1, _081E06E0 @ =rfu_STC_fastCopy - movs r5, 0x2 - negs r5, r5 - ands r5, r1 - ldr r2, _081E06D4 @ =gRfuFixed - ldr r0, [r2] - adds r4, r0, 0 - adds r4, 0x8 - ldr r0, _081E06E4 @ =rfu_REQ_changeMasterSlave - subs r0, r1 - lsls r0, 15 - lsrs r3, r0, 16 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - ldr r0, _081E06E8 @ =0x0000ffff - cmp r3, r0 - beq _081E06BC - adds r6, r0, 0 -_081E06AA: - ldrh r0, [r5] - strh r0, [r4] - adds r5, 0x2 - adds r4, 0x2 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, r6 - bne _081E06AA -_081E06BC: - ldr r1, [r2] - adds r0, r1, 0 - adds r0, 0x9 - str r0, [r1, 0x4] - movs r0, 0 -_081E06C6: - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E06CC: .4byte gRfuLinkStatus -_081E06D0: .4byte gRfuStatic -_081E06D4: .4byte gRfuFixed -_081E06D8: .4byte gRfuSlotStatusNI -_081E06DC: .4byte gRfuSlotStatusUNI -_081E06E0: .4byte rfu_STC_fastCopy -_081E06E4: .4byte rfu_REQ_changeMasterSlave -_081E06E8: .4byte 0x0000ffff - thumb_func_end rfu_initializeAPI - - thumb_func_start rfu_STC_clearAPIVariables -rfu_STC_clearAPIVariables: @ 81E06EC - push {r4-r7,lr} - sub sp, 0x4 - ldr r1, _081E0760 @ =0x04000208 - ldrh r0, [r1] - adds r7, r0, 0 - movs r6, 0 - strh r6, [r1] - ldr r5, _081E0764 @ =gRfuStatic - ldr r1, [r5] - ldrb r4, [r1] - mov r0, sp - strh r6, [r0] - ldr r2, _081E0768 @ =0x01000014 - bl CpuSet - ldr r2, [r5] - movs r0, 0x8 - ands r4, r0 - movs r1, 0 - strb r4, [r2] - mov r0, sp - adds r0, 0x2 - strh r1, [r0] - ldr r4, _081E076C @ =gRfuLinkStatus - ldr r1, [r4] - ldr r2, _081E0770 @ =0x0100005a - bl CpuSet - ldr r1, [r4] - movs r0, 0x4 - strb r0, [r1, 0x9] - ldr r0, [r5] - strb r6, [r0, 0x6] - ldr r1, [r4] - movs r0, 0xFF - strb r0, [r1] - bl rfu_clearAllSlot - ldr r0, [r5] - strb r6, [r0, 0x9] - movs r2, 0 - movs r3, 0 -_081E0740: - ldr r0, [r5] - lsls r1, r2, 1 - adds r0, 0x12 - adds r0, r1 - strh r3, [r0] - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E0740 - ldr r0, _081E0760 @ =0x04000208 - strh r7, [r0] - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0760: .4byte 0x04000208 -_081E0764: .4byte gRfuStatic -_081E0768: .4byte 0x01000014 -_081E076C: .4byte gRfuLinkStatus -_081E0770: .4byte 0x0100005a - thumb_func_end rfu_STC_clearAPIVariables - - thumb_func_start rfu_REQ_PARENT_resumeRetransmitAndChange -rfu_REQ_PARENT_resumeRetransmitAndChange: @ 81E0774 - push {lr} - ldr r0, _081E0784 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_ResumeRetransmitAndChangeREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0784: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_PARENT_resumeRetransmitAndChange - - thumb_func_start rfu_UNI_PARENT_getDRAC_ACK -rfu_UNI_PARENT_getDRAC_ACK: @ 81E0788 - push {r4,r5,lr} - adds r4, r0, 0 - movs r0, 0 - strb r0, [r4] - ldr r5, _081E07A0 @ =gRfuLinkStatus - ldr r0, [r5] - ldrb r0, [r0] - cmp r0, 0x1 - beq _081E07A4 - movs r0, 0xC0 - lsls r0, 2 - b _081E07CA - .align 2, 0 -_081E07A0: .4byte gRfuLinkStatus -_081E07A4: - bl rfu_getSTWIRecvBuffer - adds r1, r0, 0 - ldrb r0, [r1] - cmp r0, 0x28 - beq _081E07B4 - cmp r0, 0x36 - bne _081E07C8 -_081E07B4: - ldrb r0, [r1, 0x1] - cmp r0, 0 - bne _081E07C0 - ldr r0, [r5] - ldrb r0, [r0, 0x2] - b _081E07C2 -_081E07C0: - ldrb r0, [r1, 0x4] -_081E07C2: - strb r0, [r4] - movs r0, 0 - b _081E07CA -_081E07C8: - movs r0, 0x10 -_081E07CA: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end rfu_UNI_PARENT_getDRAC_ACK - - thumb_func_start rfu_setTimerInterrupt -rfu_setTimerInterrupt: @ 81E07D0 - push {lr} - adds r2, r0, 0 - adds r0, r1, 0 - lsls r2, 24 - lsrs r2, 24 - adds r1, r2, 0 - bl STWI_init_timer - pop {r0} - bx r0 - thumb_func_end rfu_setTimerInterrupt - - thumb_func_start rfu_getSTWIRecvBuffer -rfu_getSTWIRecvBuffer: @ 81E07E4 - ldr r0, _081E07F0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - bx lr - .align 2, 0 -_081E07F0: .4byte gRfuFixed - thumb_func_end rfu_getSTWIRecvBuffer - - thumb_func_start rfu_setMSCCallback -rfu_setMSCCallback: @ 81E07F4 - push {lr} - bl STWI_set_Callback_S - pop {r0} - bx r0 - thumb_func_end rfu_setMSCCallback - - thumb_func_start rfu_setREQCallback -rfu_setREQCallback: @ 81E0800 - push {lr} - adds r1, r0, 0 - ldr r0, _081E0818 @ =gRfuFixed - ldr r0, [r0] - str r1, [r0] - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - bl rfu_enableREQCallback - pop {r0} - bx r0 - .align 2, 0 -_081E0818: .4byte gRfuFixed - thumb_func_end rfu_setREQCallback - - thumb_func_start rfu_enableREQCallback -rfu_enableREQCallback: @ 81E081C - push {lr} - lsls r0, 24 - cmp r0, 0 - beq _081E0834 - ldr r0, _081E0830 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0x8 - orrs r0, r1 - b _081E083E - .align 2, 0 -_081E0830: .4byte gRfuStatic -_081E0834: - ldr r0, _081E0844 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0xF7 - ands r0, r1 -_081E083E: - strb r0, [r2] - pop {r0} - bx r0 - .align 2, 0 -_081E0844: .4byte gRfuStatic - thumb_func_end rfu_enableREQCallback - - thumb_func_start rfu_STC_REQ_callback -rfu_STC_REQ_callback: @ 81E0848 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r4, r1, 16 - ldr r0, _081E087C @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - ldr r0, _081E0880 @ =gRfuStatic - ldr r0, [r0] - strh r4, [r0, 0x1C] - ldrb r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _081E0876 - ldr r0, _081E0884 @ =gRfuFixed - ldr r0, [r0] - ldr r2, [r0] - adds r0, r5, 0 - adds r1, r4, 0 - bl _call_via_r2 -_081E0876: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E087C: .4byte rfu_CB_defaultCallback -_081E0880: .4byte gRfuStatic -_081E0884: .4byte gRfuFixed - thumb_func_end rfu_STC_REQ_callback - - thumb_func_start rfu_CB_defaultCallback -rfu_CB_defaultCallback: @ 81E0888 - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 16 - lsrs r3, r1, 16 - cmp r0, 0xFF - bne _081E08E4 - ldr r0, _081E08EC @ =gRfuStatic - ldr r0, [r0] - ldrb r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _081E08B2 - ldr r0, _081E08F0 @ =gRfuFixed - ldr r0, [r0] - ldr r2, [r0] - movs r0, 0xFF - adds r1, r3, 0 - bl _call_via_r2 -_081E08B2: - ldr r0, _081E08F4 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r1, [r0, 0x2] - ldrb r0, [r0, 0x3] - adds r5, r0, 0 - orrs r5, r1 - movs r4, 0 -_081E08C0: - adds r0, r5, 0 - asrs r0, r4 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E08D2 - adds r0, r4, 0 - bl rfu_STC_removeLinkData -_081E08D2: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E08C0 - ldr r0, _081E08F4 @ =gRfuLinkStatus - ldr r1, [r0] - movs r0, 0xFF - strb r0, [r1] -_081E08E4: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E08EC: .4byte gRfuStatic -_081E08F0: .4byte gRfuFixed -_081E08F4: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_defaultCallback - - thumb_func_start rfu_waitREQComplete -rfu_waitREQComplete: @ 81E08F8 - push {lr} - bl STWI_poll_CommandEnd - ldr r0, _081E0908 @ =gRfuStatic - ldr r0, [r0] - ldrh r0, [r0, 0x1C] - pop {r1} - bx r1 - .align 2, 0 -_081E0908: .4byte gRfuStatic - thumb_func_end rfu_waitREQComplete - - thumb_func_start rfu_REQ_RFUStatus -rfu_REQ_RFUStatus: @ 81E090C - push {lr} - ldr r0, _081E091C @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - pop {r0} - bx r0 - .align 2, 0 -_081E091C: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_RFUStatus - - thumb_func_start rfu_getRFUStatus -rfu_getRFUStatus: @ 81E0920 - push {r4,r5,lr} - adds r4, r0, 0 - ldr r5, _081E0938 @ =gRfuFixed - ldr r0, [r5] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x93 - beq _081E093C - movs r0, 0x10 - b _081E0956 - .align 2, 0 -_081E0938: .4byte gRfuFixed -_081E093C: - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E0950 - ldr r0, [r5] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - b _081E0952 -_081E0950: - movs r0, 0xFF -_081E0952: - strb r0, [r4] - movs r0, 0 -_081E0956: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end rfu_getRFUStatus - - thumb_func_start rfu_MBOOT_CHILD_inheritanceLinkStatus -rfu_MBOOT_CHILD_inheritanceLinkStatus: @ 81E095C - push {lr} - ldr r2, _081E0964 @ =_Str_RFU_MBOOT - ldr r3, _081E0968 @ =0x30000F0 - b _081E0976 - .align 2, 0 -_081E0964: .4byte _Str_RFU_MBOOT -_081E0968: .4byte 0x30000F0 -_081E096C: - ldrb r0, [r3] - adds r3, 0x1 - adds r2, 0x1 - cmp r1, r0 - bne _081E09CC -_081E0976: - ldrb r1, [r2] - cmp r1, 0 - bne _081E096C - movs r2, 0xC0 - lsls r2, 18 - movs r3, 0 - movs r1, 0 -_081E0984: - ldrh r0, [r2] - adds r0, r3, r0 - lsls r0, 16 - lsrs r3, r0, 16 - adds r2, 0x2 - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x59 - bls _081E0984 - ldr r0, _081E09C0 @ =0x30000FA - ldrh r0, [r0] - cmp r3, r0 - bne _081E09CC - movs r0, 0xC0 - lsls r0, 18 - ldr r1, _081E09C4 @ =gRfuLinkStatus - ldr r1, [r1] - movs r2, 0x5A - bl CpuSet - ldr r0, _081E09C8 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0x80 - orrs r0, r1 - strb r0, [r2] - movs r0, 0 - b _081E09CE - .align 2, 0 -_081E09C0: .4byte 0x30000FA -_081E09C4: .4byte gRfuLinkStatus -_081E09C8: .4byte gRfuStatic -_081E09CC: - movs r0, 0x1 -_081E09CE: - pop {r1} - bx r1 - thumb_func_end rfu_MBOOT_CHILD_inheritanceLinkStatus - - thumb_func_start rfu_REQ_stopMode -rfu_REQ_stopMode: @ 81E09D4 - push {lr} - ldr r0, _081E09F4 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081E09FC - movs r0, 0x3D - movs r1, 0x6 - bl rfu_STC_REQ_callback - ldr r0, _081E09F8 @ =gRfuState - ldr r1, [r0] - ldrh r0, [r1, 0x12] - movs r0, 0x6 - strh r0, [r1, 0x12] - b _081E0A72 - .align 2, 0 -_081E09F4: .4byte 0x04000208 -_081E09F8: .4byte gRfuState -_081E09FC: - bl AgbRFU_SoftReset - bl rfu_STC_clearAPIVariables - movs r0, 0x8 - bl sub_81E349C - ldr r1, _081E0A4C @ =0x00008001 - cmp r0, r1 - bne _081E0A60 - ldr r0, _081E0A50 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r2, _081E0A54 @ =0x04000100 - adds r1, r0, r2 - movs r0, 0 - str r0, [r1] - movs r0, 0x83 - lsls r0, 16 - str r0, [r1] - ldr r0, [r1] - lsls r0, 16 - ldr r2, _081E0A58 @ =0x0105ffff - ldr r3, _081E0A5C @ =rfu_CB_stopMode - cmp r0, r2 - bhi _081E0A3A -_081E0A32: - ldr r0, [r1] - lsls r0, 16 - cmp r0, r2 - bls _081E0A32 -_081E0A3A: - movs r0, 0 - str r0, [r1] - adds r0, r3, 0 - bl STWI_set_Callback_M - bl STWI_send_StopModeREQ - b _081E0A72 - .align 2, 0 -_081E0A4C: .4byte 0x00008001 -_081E0A50: .4byte gRfuState -_081E0A54: .4byte 0x04000100 -_081E0A58: .4byte 0x0105ffff -_081E0A5C: .4byte rfu_CB_stopMode -_081E0A60: - ldr r1, _081E0A78 @ =0x04000128 - movs r2, 0x80 - lsls r2, 6 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0x3D - movs r1, 0 - bl rfu_STC_REQ_callback -_081E0A72: - pop {r0} - bx r0 - .align 2, 0 -_081E0A78: .4byte 0x04000128 - thumb_func_end rfu_REQ_stopMode - - thumb_func_start rfu_CB_stopMode -rfu_CB_stopMode: @ 81E0A7C - push {r4,lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r2, r1, 0 - cmp r2, 0 - bne _081E0A96 - ldr r1, _081E0AA4 @ =0x04000128 - movs r4, 0x80 - lsls r4, 6 - adds r0, r4, 0 - strh r0, [r1] -_081E0A96: - adds r0, r3, 0 - adds r1, r2, 0 - bl rfu_STC_REQ_callback - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081E0AA4: .4byte 0x04000128 - thumb_func_end rfu_CB_stopMode - - thumb_func_start rfu_REQBN_softReset_and_checkID -rfu_REQBN_softReset_and_checkID: @ 81E0AA8 - push {lr} - ldr r0, _081E0AB8 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081E0ABC - movs r0, 0x1 - negs r0, r0 - b _081E0ADC - .align 2, 0 -_081E0AB8: .4byte 0x04000208 -_081E0ABC: - bl AgbRFU_SoftReset - bl rfu_STC_clearAPIVariables - movs r0, 0x1E - bl sub_81E349C - adds r2, r0, 0 - cmp r2, 0 - bne _081E0ADA - ldr r1, _081E0AE0 @ =0x04000128 - movs r3, 0x80 - lsls r3, 6 - adds r0, r3, 0 - strh r0, [r1] -_081E0ADA: - adds r0, r2, 0 -_081E0ADC: - pop {r1} - bx r1 - .align 2, 0 -_081E0AE0: .4byte 0x04000128 - thumb_func_end rfu_REQBN_softReset_and_checkID - - thumb_func_start rfu_REQ_reset -rfu_REQ_reset: @ 81E0AE4 - push {lr} - ldr r0, _081E0AF4 @ =rfu_CB_reset - bl STWI_set_Callback_M - bl STWI_send_ResetREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0AF4: .4byte rfu_CB_reset - thumb_func_end rfu_REQ_reset - - thumb_func_start rfu_CB_reset -rfu_CB_reset: @ 81E0AF8 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r4, r1, 0 - cmp r4, 0 - bne _081E0B0C - bl rfu_STC_clearAPIVariables -_081E0B0C: - adds r0, r5, 0 - adds r1, r4, 0 - bl rfu_STC_REQ_callback - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_CB_reset - - thumb_func_start rfu_REQ_configSystem -rfu_REQ_configSystem: @ 81E0B1C - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 24 - lsrs r5, 24 - lsls r2, 24 - lsrs r6, r2, 24 - ldr r0, _081E0B54 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - movs r0, 0x3 - ands r4, r0 - movs r0, 0x3C - orrs r4, r0 - adds r0, r4, 0 - adds r1, r5, 0 - adds r2, r6, 0 - bl STWI_send_SystemConfigREQ - cmp r6, 0 - bne _081E0B5C - ldr r0, _081E0B58 @ =gRfuStatic - ldr r1, [r0] - movs r0, 0x1 - strh r0, [r1, 0x1A] - b _081E0B76 - .align 2, 0 -_081E0B54: .4byte rfu_STC_REQ_callback -_081E0B58: .4byte gRfuStatic -_081E0B5C: - ldr r5, _081E0B7C @ =0x04000208 - ldrh r4, [r5] - movs r0, 0 - strh r0, [r5] - movs r0, 0x96 - lsls r0, 2 - adds r1, r6, 0 - bl Div - ldr r1, _081E0B80 @ =gRfuStatic - ldr r1, [r1] - strh r0, [r1, 0x1A] - strh r4, [r5] -_081E0B76: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E0B7C: .4byte 0x04000208 -_081E0B80: .4byte gRfuStatic - thumb_func_end rfu_REQ_configSystem - - thumb_func_start rfu_REQ_configGameData -rfu_REQ_configGameData: @ 81E0B84 - push {r4-r7,lr} - sub sp, 0x10 - adds r4, r2, 0 - adds r7, r3, 0 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r2, r1, 16 - adds r5, r4, 0 - mov r0, sp - strb r1, [r0] - lsrs r2, 24 - strb r2, [r0, 0x1] - cmp r6, 0 - beq _081E0BAA - movs r1, 0x80 - orrs r2, r1 - movs r1, 0 - orrs r2, r1 - strb r2, [r0, 0x1] -_081E0BAA: - movs r2, 0x2 - ldr r0, _081E0C0C @ =rfu_CB_configGameData - mov r12, r0 -_081E0BB0: - mov r3, sp - adds r1, r3, r2 - ldrb r0, [r4] - strb r0, [r1] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0xE - bls _081E0BB0 - movs r3, 0 - adds r1, r7, 0 - movs r2, 0 -_081E0BCA: - ldrb r0, [r1] - adds r0, r3, r0 - lsls r0, 24 - adds r1, 0x1 - lsrs r0, 24 - ldrb r3, [r5] - adds r0, r3 - lsls r0, 24 - lsrs r3, r0, 24 - adds r5, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x7 - bls _081E0BCA - mov r1, sp - mvns r0, r3 - strb r0, [r1, 0xF] - cmp r6, 0 - beq _081E0BF6 - movs r0, 0 - strb r0, [r1, 0xE] -_081E0BF6: - mov r0, r12 - bl STWI_set_Callback_M - mov r0, sp - adds r1, r7, 0 - bl STWI_send_GameConfigREQ - add sp, 0x10 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0C0C: .4byte rfu_CB_configGameData - thumb_func_end rfu_REQ_configGameData - - thumb_func_start rfu_CB_configGameData -rfu_CB_configGameData: @ 81E0C10 - push {r4-r7,lr} - lsls r0, 24 - lsrs r0, 24 - mov r12, r0 - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E0C9A - ldr r0, _081E0C54 @ =gRfuState - ldr r0, [r0] - ldr r1, [r0, 0x24] - ldr r0, _081E0C58 @ =gRfuLinkStatus - ldr r6, [r0] - ldrb r2, [r1, 0x4] - adds r5, r6, 0 - adds r5, 0x98 - strh r2, [r5] - ldrb r0, [r1, 0x5] - lsls r3, r0, 8 - orrs r3, r2 - strh r3, [r5] - adds r4, r1, 0x6 - movs r1, 0x80 - lsls r1, 8 - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _081E0C5C - eors r3, r1 - strh r3, [r5] - adds r1, r6, 0 - adds r1, 0x97 - movs r0, 0x1 - b _081E0C62 - .align 2, 0 -_081E0C54: .4byte gRfuState -_081E0C58: .4byte gRfuLinkStatus -_081E0C5C: - adds r1, r6, 0 - adds r1, 0x97 - movs r0, 0 -_081E0C62: - strb r0, [r1] - movs r2, 0 - ldr r3, _081E0CA8 @ =gRfuLinkStatus -_081E0C68: - ldr r0, [r3] - adds r0, 0x9A - adds r0, r2 - ldrb r1, [r4] - strb r1, [r0] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0xC - bls _081E0C68 - adds r4, 0x1 - movs r2, 0 - ldr r3, _081E0CA8 @ =gRfuLinkStatus -_081E0C84: - ldr r0, [r3] - adds r0, 0xA9 - adds r0, r2 - ldrb r1, [r4] - strb r1, [r0] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x7 - bls _081E0C84 -_081E0C9A: - mov r0, r12 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0CA8: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_configGameData - - thumb_func_start rfu_REQ_startSearchChild -rfu_REQ_startSearchChild: @ 81E0CAC - push {lr} - ldr r0, _081E0CDC @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081E0CE4 - ldr r0, _081E0CE0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E0CEA - movs r0, 0x1 - bl rfu_STC_clearLinkStatus - b _081E0CEA - .align 2, 0 -_081E0CDC: .4byte rfu_CB_defaultCallback -_081E0CE0: .4byte gRfuFixed -_081E0CE4: - movs r0, 0x19 - bl rfu_STC_REQ_callback -_081E0CEA: - ldr r0, _081E0CF8 @ =rfu_CB_startSearchChild - bl STWI_set_Callback_M - bl STWI_send_SC_StartREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0CF8: .4byte rfu_CB_startSearchChild - thumb_func_end rfu_REQ_startSearchChild - - thumb_func_start rfu_CB_startSearchChild -rfu_CB_startSearchChild: @ 81E0CFC - push {lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r2, r1, 0 - cmp r2, 0 - bne _081E0D14 - ldr r0, _081E0D20 @ =gRfuStatic - ldr r1, [r0] - movs r0, 0x1 - strb r0, [r1, 0x9] -_081E0D14: - adds r0, r3, 0 - adds r1, r2, 0 - bl rfu_STC_REQ_callback - pop {r0} - bx r0 - .align 2, 0 -_081E0D20: .4byte gRfuStatic - thumb_func_end rfu_CB_startSearchChild - - thumb_func_start rfu_STC_clearLinkStatus -rfu_STC_clearLinkStatus: @ 81E0D24 - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl rfu_clearAllSlot - cmp r4, 0 - beq _081E0D4C - mov r0, sp - movs r5, 0 - strh r5, [r0] - ldr r4, _081E0D80 @ =gRfuLinkStatus - ldr r1, [r4] - adds r1, 0x14 - ldr r2, _081E0D84 @ =0x01000040 - bl CpuSet - ldr r0, [r4] - strb r5, [r0, 0x8] -_081E0D4C: - movs r1, 0 - ldr r2, _081E0D80 @ =gRfuLinkStatus - adds r4, r2, 0 - movs r3, 0 -_081E0D54: - ldr r0, [r4] - adds r0, 0xA - adds r0, r1 - strb r3, [r0] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x3 - bls _081E0D54 - ldr r0, [r2] - movs r1, 0 - strb r1, [r0, 0x1] - ldr r0, [r2] - strb r1, [r0, 0x2] - ldr r0, [r2] - strb r1, [r0, 0x3] - ldr r0, [r2] - strb r1, [r0, 0x7] - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E0D80: .4byte gRfuLinkStatus -_081E0D84: .4byte 0x01000040 - thumb_func_end rfu_STC_clearLinkStatus - - thumb_func_start rfu_REQ_pollSearchChild -rfu_REQ_pollSearchChild: @ 81E0D88 - push {lr} - ldr r0, _081E0D98 @ =rfu_CB_pollAndEndSearchChild - bl STWI_set_Callback_M - bl STWI_send_SC_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0D98: .4byte rfu_CB_pollAndEndSearchChild - thumb_func_end rfu_REQ_pollSearchChild - - thumb_func_start rfu_REQ_endSearchChild -rfu_REQ_endSearchChild: @ 81E0D9C - push {lr} - ldr r0, _081E0DAC @ =rfu_CB_pollAndEndSearchChild - bl STWI_set_Callback_M - bl STWI_send_SC_EndREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0DAC: .4byte rfu_CB_pollAndEndSearchChild - thumb_func_end rfu_REQ_endSearchChild - - thumb_func_start rfu_CB_pollAndEndSearchChild -rfu_CB_pollAndEndSearchChild: @ 81E0DB0 - push {r4-r6,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 16 - lsrs r6, r1, 16 - cmp r6, 0 - bne _081E0DC2 - bl rfu_STC_readChildList -_081E0DC2: - cmp r4, 0x1A - bne _081E0E04 - ldr r5, _081E0DF8 @ =gRfuLinkStatus - ldr r0, [r5] - adds r0, 0x94 - ldrh r0, [r0] - cmp r0, 0 - bne _081E0E20 - ldr r0, _081E0DFC @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E0E20 - ldr r1, [r5] - ldr r0, _081E0E00 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrh r0, [r0, 0x4] - adds r1, 0x94 - strh r0, [r1] - b _081E0E20 - .align 2, 0 -_081E0DF8: .4byte gRfuLinkStatus -_081E0DFC: .4byte rfu_CB_defaultCallback -_081E0E00: .4byte gRfuFixed -_081E0E04: - cmp r4, 0x1B - bne _081E0E20 - ldr r0, _081E0E30 @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1] - cmp r0, 0xFF - bne _081E0E18 - adds r1, 0x94 - movs r0, 0 - strh r0, [r1] -_081E0E18: - ldr r0, _081E0E34 @ =gRfuStatic - ldr r1, [r0] - movs r0, 0 - strb r0, [r1, 0x9] -_081E0E20: - adds r0, r4, 0 - adds r1, r6, 0 - bl rfu_STC_REQ_callback - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E0E30: .4byte gRfuLinkStatus -_081E0E34: .4byte gRfuStatic - thumb_func_end rfu_CB_pollAndEndSearchChild - - thumb_func_start rfu_STC_readChildList -rfu_STC_readChildList: @ 81E0E38 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - ldr r1, _081E0F64 @ =gRfuFixed - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldrb r2, [r0, 0x1] - mov r8, r2 - adds r4, r1, 0 - cmp r2, 0 - beq _081E0E96 - ldr r5, [r0, 0x4] - ldr r0, _081E0F68 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_LinkStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E0E8A - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - adds r4, r0, 0x4 - movs r2, 0 -_081E0E76: - mov r0, sp - adds r1, r0, r2 - ldrb r0, [r4] - strb r0, [r1] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E0E76 -_081E0E8A: - ldr r0, _081E0F64 @ =gRfuFixed - ldr r1, [r0] - adds r1, 0xDC - ldr r1, [r1] - str r5, [r1, 0x4] - adds r4, r0, 0 -_081E0E96: - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - adds r4, r0, 0x4 - mov r1, r8 - cmp r1, 0 - beq _081E0F52 - ldr r2, _081E0F6C @ =gRfuStatic - mov r9, r2 - ldr r7, _081E0F70 @ =gRfuLinkStatus - mov r10, r9 -_081E0EAC: - ldrb r2, [r4, 0x2] - adds r5, r2, 0 - cmp r2, 0x3 - bhi _081E0F42 - ldr r1, [r7] - ldrb r0, [r1, 0x2] - asrs r0, r2 - movs r6, 0x1 - ands r0, r6 - cmp r0, 0 - bne _081E0F42 - ldrb r3, [r1, 0x3] - asrs r3, r2 - ands r3, r6 - cmp r3, 0 - bne _081E0F42 - mov r1, sp - adds r0, r1, r2 - ldrb r0, [r0] - mov r12, r10 - cmp r0, 0 - beq _081E0EE6 - mov r0, r9 - ldr r1, [r0] - adds r1, 0xE - adds r1, r2 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] -_081E0EE6: - mov r1, r9 - ldr r0, [r1] - adds r0, 0xE - adds r1, r0, r5 - ldrb r0, [r1] - cmp r0, 0x3 - bls _081E0F42 - strb r3, [r1] - ldr r0, [r7] - adds r0, 0xA - adds r0, r5 - movs r1, 0xFF - strb r1, [r0] - ldr r2, [r7] - adds r0, r6, 0 - lsls r0, r5 - ldrb r1, [r2, 0x2] - orrs r0, r1 - strb r0, [r2, 0x2] - ldr r1, [r7] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r1, [r7] - lsls r3, r5, 5 - adds r1, r3 - ldrh r0, [r4] - strh r0, [r1, 0x14] - strb r5, [r1, 0x16] - ldr r0, [r7] - strb r6, [r0] - mov r0, r12 - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0x7F - ands r0, r1 - strb r0, [r2] - mov r2, r12 - ldr r1, [r2] - lsls r0, r5, 1 - adds r1, 0x12 - adds r1, r0 - ldr r0, [r7] - adds r0, r3 - ldrh r0, [r0, 0x14] - strh r0, [r1] -_081E0F42: - mov r0, r8 - subs r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - adds r4, 0x4 - cmp r0, 0 - bne _081E0EAC -_081E0F52: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0F64: .4byte gRfuFixed -_081E0F68: .4byte rfu_CB_defaultCallback -_081E0F6C: .4byte gRfuStatic -_081E0F70: .4byte gRfuLinkStatus - thumb_func_end rfu_STC_readChildList - - thumb_func_start rfu_REQ_startSearchParent -rfu_REQ_startSearchParent: @ 81E0F74 - push {lr} - ldr r0, _081E0F84 @ =rfu_CB_startSearchParent - bl STWI_set_Callback_M - bl STWI_send_SP_StartREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0F84: .4byte rfu_CB_startSearchParent - thumb_func_end rfu_REQ_startSearchParent - - thumb_func_start rfu_CB_startSearchParent -rfu_CB_startSearchParent: @ 81E0F88 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r4, r1, 0 - cmp r4, 0 - bne _081E0F9E - movs r0, 0 - bl rfu_STC_clearLinkStatus -_081E0F9E: - adds r0, r5, 0 - adds r1, r4, 0 - bl rfu_STC_REQ_callback - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_CB_startSearchParent - - thumb_func_start rfu_REQ_pollSearchParent -rfu_REQ_pollSearchParent: @ 81E0FAC - push {lr} - ldr r0, _081E0FBC @ =rfu_CB_pollSearchParent - bl STWI_set_Callback_M - bl STWI_send_SP_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0FBC: .4byte rfu_CB_pollSearchParent - thumb_func_end rfu_REQ_pollSearchParent - - thumb_func_start rfu_CB_pollSearchParent -rfu_CB_pollSearchParent: @ 81E0FC0 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r4, r1, 0 - cmp r4, 0 - bne _081E0FD4 - bl rfu_STC_readParentCandidateList -_081E0FD4: - adds r0, r5, 0 - adds r1, r4, 0 - bl rfu_STC_REQ_callback - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_CB_pollSearchParent - - thumb_func_start rfu_REQ_endSearchParent -rfu_REQ_endSearchParent: @ 81E0FE4 - push {lr} - ldr r0, _081E0FF4 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_SP_EndREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0FF4: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_endSearchParent - - thumb_func_start rfu_STC_readParentCandidateList -rfu_STC_readParentCandidateList: @ 81E0FF8 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - mov r0, sp - movs r4, 0 - strh r4, [r0] - ldr r5, _081E10A0 @ =gRfuLinkStatus - ldr r1, [r5] - adds r1, 0x14 - ldr r2, _081E10A4 @ =0x01000040 - bl CpuSet - ldr r0, _081E10A8 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r2, [r0] - ldrb r7, [r2, 0x1] - adds r2, 0x4 - ldr r0, [r5] - strb r4, [r0, 0x8] - movs r6, 0 - cmp r7, 0 - beq _081E10FC - mov r12, r5 - ldr r0, _081E10AC @ =0x00007fff - mov r8, r0 -_081E102E: - subs r0, r7, 0x7 - lsls r0, 24 - lsrs r7, r0, 24 - adds r1, r2, 0x6 - adds r2, 0x13 - ldrb r0, [r2] - mvns r0, r0 - lsls r0, 24 - lsrs r5, r0, 24 - adds r2, 0x1 - movs r4, 0 - movs r3, 0 - adds r6, 0x1 -_081E1048: - ldrb r0, [r2] - adds r0, r4, r0 - lsls r0, 24 - adds r2, 0x1 - lsrs r0, 24 - ldrb r4, [r1] - adds r0, r4 - lsls r0, 24 - lsrs r4, r0, 24 - adds r1, 0x1 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x7 - bls _081E1048 - cmp r4, r5 - bne _081E10F0 - subs r2, 0x1C - mov r0, r12 - ldr r1, [r0] - ldrb r0, [r1, 0x8] - lsls r0, 5 - adds r0, 0x14 - adds r4, r1, r0 - ldrh r0, [r2] - movs r3, 0 - strh r0, [r4] - adds r2, 0x2 - ldrb r0, [r2] - strb r0, [r4, 0x2] - adds r2, 0x2 - ldrh r1, [r2] - mov r0, r8 - ands r0, r1 - strh r0, [r4, 0x4] - ldrh r1, [r2] - movs r0, 0x80 - lsls r0, 8 - ands r0, r1 - cmp r0, 0 - beq _081E10B0 - movs r0, 0x1 - strb r0, [r4, 0x3] - b _081E10B2 - .align 2, 0 -_081E10A0: .4byte gRfuLinkStatus -_081E10A4: .4byte 0x01000040 -_081E10A8: .4byte gRfuFixed -_081E10AC: .4byte 0x00007fff -_081E10B0: - strb r3, [r4, 0x3] -_081E10B2: - adds r2, 0x2 - movs r3, 0 - adds r5, r4, 0 - adds r5, 0x15 - adds r4, 0x6 -_081E10BC: - adds r1, r4, r3 - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0xC - bls _081E10BC - adds r2, 0x1 - movs r3, 0 - adds r4, r5, 0 -_081E10D4: - adds r1, r4, r3 - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x7 - bls _081E10D4 - mov r4, r12 - ldr r1, [r4] - ldrb r0, [r1, 0x8] - adds r0, 0x1 - strb r0, [r1, 0x8] -_081E10F0: - lsls r0, r6, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bhi _081E10FC - cmp r7, 0 - bne _081E102E -_081E10FC: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end rfu_STC_readParentCandidateList - - thumb_func_start rfu_REQ_startConnectParent -rfu_REQ_startConnectParent: @ 81E1108 - push {r4,r5,lr} - lsls r0, 16 - lsrs r4, r0, 16 - movs r3, 0 - movs r2, 0 - ldr r1, _081E1154 @ =gRfuLinkStatus - ldr r0, [r1] - ldrh r0, [r0, 0x14] - cmp r0, r4 - beq _081E1134 - adds r5, r1, 0 -_081E111E: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bhi _081E1134 - ldr r0, [r5] - lsls r1, r2, 5 - adds r0, r1 - ldrh r0, [r0, 0x14] - cmp r0, r4 - bne _081E111E -_081E1134: - cmp r2, 0x4 - bne _081E113C - movs r3, 0x80 - lsls r3, 1 -_081E113C: - cmp r3, 0 - bne _081E1160 - ldr r0, _081E1158 @ =gRfuStatic - ldr r0, [r0] - strh r4, [r0, 0x1E] - ldr r0, _081E115C @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - adds r0, r4, 0 - bl STWI_send_CP_StartREQ - b _081E1168 - .align 2, 0 -_081E1154: .4byte gRfuLinkStatus -_081E1158: .4byte gRfuStatic -_081E115C: .4byte rfu_STC_REQ_callback -_081E1160: - movs r0, 0x1F - adds r1, r3, 0 - bl rfu_STC_REQ_callback -_081E1168: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_REQ_startConnectParent - - thumb_func_start rfu_REQ_pollConnectParent -rfu_REQ_pollConnectParent: @ 81E1170 - push {lr} - ldr r0, _081E1180 @ =rfu_CB_pollConnectParent - bl STWI_set_Callback_M - bl STWI_send_CP_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E1180: .4byte rfu_CB_pollConnectParent - thumb_func_end rfu_REQ_pollConnectParent - - thumb_func_start rfu_CB_pollConnectParent -rfu_CB_pollConnectParent: @ 81E1184 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x2C - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] - lsls r1, 16 - lsrs r1, 16 - str r1, [sp, 0x28] - cmp r1, 0 - bne _081E1286 - ldr r0, _081E1240 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrh r5, [r0, 0x4] - ldrb r1, [r0, 0x6] - mov r10, r1 - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E1286 - movs r0, 0x80 - lsls r0, 17 - lsls r0, r1 - lsrs r2, r0, 24 - ldr r4, _081E1244 @ =gRfuLinkStatus - ldr r3, [r4] - ldrb r1, [r3, 0x2] - adds r0, r2, 0 - ands r0, r1 - cmp r0, 0 - bne _081E1286 - adds r0, r2, 0 - orrs r0, r1 - strb r0, [r3, 0x2] - ldr r1, [r4] - ldrb r0, [r1, 0x3] - bics r0, r2 - strb r0, [r1, 0x3] - ldr r1, [r4] - adds r0, r1, 0 - adds r0, 0x94 - movs r2, 0 - strh r5, [r0] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r0, [r4] - strb r2, [r0] - ldr r3, _081E1248 @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x80 - orrs r0, r1 - strb r0, [r2] - movs r5, 0 - adds r7, r4, 0 - add r6, sp, 0x20 - movs r0, 0 - mov r8, r0 -_081E1202: - ldr r2, [r7] - lsls r4, r5, 5 - adds r0, r2, r4 - ldr r1, [r3] - ldrh r0, [r0, 0x14] - ldrh r1, [r1, 0x1E] - cmp r0, r1 - bne _081E125A - ldrb r0, [r2, 0x8] - cmp r0, 0 - beq _081E1250 - mov r9, sp - adds r0, r4, 0 - adds r0, 0x14 - adds r0, r2, r0 - mov r1, sp - movs r2, 0x10 - bl CpuSet - mov r1, r8 - strh r1, [r6] - ldr r1, [r7] - adds r1, 0x14 - adds r0, r6, 0 - ldr r2, _081E124C @ =0x01000040 - bl CpuSet - ldr r0, [r7] - mov r1, r8 - strb r1, [r0, 0x8] - b _081E1264 - .align 2, 0 -_081E1240: .4byte gRfuFixed -_081E1244: .4byte gRfuLinkStatus -_081E1248: .4byte gRfuStatic -_081E124C: .4byte 0x01000040 -_081E1250: - adds r0, r4, 0 - adds r0, 0x14 - adds r2, r0 - mov r9, r2 - b _081E1264 -_081E125A: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E1202 -_081E1264: - cmp r5, 0x3 - bhi _081E1286 - ldr r4, _081E12A0 @ =gRfuLinkStatus - mov r0, r10 - lsls r5, r0, 5 - adds r0, r5, 0 - adds r0, 0x14 - ldr r1, [r4] - adds r1, r0 - mov r0, r9 - movs r2, 0x10 - bl CpuSet - ldr r0, [r4] - adds r0, r5 - mov r1, r10 - strb r1, [r0, 0x16] -_081E1286: - ldr r0, [sp, 0x24] - ldr r1, [sp, 0x28] - bl rfu_STC_REQ_callback - add sp, 0x2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E12A0: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_pollConnectParent - - thumb_func_start rfu_getConnectParentStatus -rfu_getConnectParentStatus: @ 81E12A4 - push {lr} - adds r3, r0, 0 - movs r0, 0xFF - strb r0, [r3] - ldr r0, _081E12C4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r2, [r0] - ldrb r0, [r2] - adds r0, 0x60 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _081E12C8 - movs r0, 0x10 - b _081E12D4 - .align 2, 0 -_081E12C4: .4byte gRfuFixed -_081E12C8: - adds r2, 0x6 - ldrb r0, [r2] - strb r0, [r1] - ldrb r0, [r2, 0x1] - strb r0, [r3] - movs r0, 0 -_081E12D4: - pop {r1} - bx r1 - thumb_func_end rfu_getConnectParentStatus - - thumb_func_start rfu_REQ_endConnectParent -rfu_REQ_endConnectParent: @ 81E12D8 - push {lr} - ldr r0, _081E1304 @ =rfu_CB_pollConnectParent - bl STWI_set_Callback_M - bl STWI_send_CP_EndREQ - ldr r0, _081E1308 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrb r0, [r1, 0x6] - cmp r0, 0x3 - bhi _081E1300 - ldr r0, _081E130C @ =gRfuStatic - ldr r0, [r0] - adds r0, 0xA - ldrb r1, [r1, 0x6] - adds r0, r1 - movs r1, 0 - strb r1, [r0] -_081E1300: - pop {r0} - bx r0 - .align 2, 0 -_081E1304: .4byte rfu_CB_pollConnectParent -_081E1308: .4byte gRfuFixed -_081E130C: .4byte gRfuStatic - thumb_func_end rfu_REQ_endConnectParent - - thumb_func_start rfu_syncVBlank -rfu_syncVBlank: @ 81E1310 - push {r4,r5,lr} - bl rfu_NI_checkCommFailCounter - ldr r0, _081E1358 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0xFF - beq _081E13E8 - ldr r4, _081E135C @ =gRfuStatic - ldr r1, [r4] - ldrb r0, [r1, 0x6] - cmp r0, 0 - beq _081E132E - subs r0, 0x1 - strb r0, [r1, 0x6] -_081E132E: - bl rfu_getMasterSlave - lsls r0, 24 - lsrs r3, r0, 24 - ldr r2, [r4] - ldrb r1, [r2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _081E1360 - cmp r3, 0 - bne _081E136E - movs r0, 0x4 - orrs r0, r1 - strb r0, [r2] - ldr r1, [r4] - movs r0, 0xB4 - lsls r0, 1 - strh r0, [r1, 0x20] - b _081E136A - .align 2, 0 -_081E1358: .4byte gRfuLinkStatus -_081E135C: .4byte gRfuStatic -_081E1360: - cmp r3, 0 - beq _081E1380 - movs r0, 0xFB - ands r0, r1 - strb r0, [r2] -_081E136A: - cmp r3, 0 - beq _081E1380 -_081E136E: - ldr r3, _081E137C @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0xFD - ands r0, r1 - b _081E138A - .align 2, 0 -_081E137C: .4byte gRfuStatic -_081E1380: - ldr r3, _081E13DC @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x2 - orrs r0, r1 -_081E138A: - strb r0, [r2] - ldr r3, [r3] - ldrb r1, [r3] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _081E13E8 - ldrh r0, [r3, 0x20] - cmp r0, 0 - bne _081E13E4 - movs r0, 0xFB - ands r0, r1 - strb r0, [r3] - ldr r0, _081E13E0 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r1, [r0, 0x2] - ldrb r0, [r0, 0x3] - adds r5, r0, 0 - orrs r5, r1 - movs r4, 0 -_081E13B2: - adds r0, r5, 0 - asrs r0, r4 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E13C4 - adds r0, r4, 0 - bl rfu_STC_removeLinkData -_081E13C4: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E13B2 - ldr r0, _081E13E0 @ =gRfuLinkStatus - ldr r1, [r0] - movs r0, 0xFF - strb r0, [r1] - movs r0, 0x1 - b _081E13EA - .align 2, 0 -_081E13DC: .4byte gRfuStatic -_081E13E0: .4byte gRfuLinkStatus -_081E13E4: - subs r0, 0x1 - strh r0, [r3, 0x20] -_081E13E8: - movs r0, 0 -_081E13EA: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end rfu_syncVBlank - thumb_func_start rfu_REQBN_watchLink rfu_REQBN_watchLink: @ 81E13F0 push {r4-r7,lr} diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt new file mode 100644 index 000000000..142895733 --- /dev/null +++ b/common_syms/librfu_rfu.txt @@ -0,0 +1,7 @@ +gRfuState +gRfuSlotStatusUNI +gRfuSlotStatusNI +gRfuLinkStatus +gRfuStatic +gRfuFixed +gUnknown_3007470 diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s index c6ca84f4b..d5e847aa3 100644 --- a/data/librfu_rodata.s +++ b/data/librfu_rodata.s @@ -25,4 +25,3 @@ _Str_RFU_MBOOT:: .align 2 _Str_Sio32ID:: .asciz "NINTENDOSio32ID_030820" - diff --git a/include/constants/trade.h b/include/constants/trade.h index b1371caab..b22cd26d2 100644 --- a/include/constants/trade.h +++ b/include/constants/trade.h @@ -1,4 +1,4 @@ - #ifndef GUARD_CONSTANTS_TRADE_H +#ifndef GUARD_CONSTANTS_TRADE_H #define GUARD_CONSTANTS_TRADE_H // TODO: document trade.c and trade_scene.c with corresponding macros @@ -115,4 +115,4 @@ #define CANT_REGISTER_MON 1 #define CANT_REGISTER_EGG 2 -#endif //GUARD_CONSTANTS_TRADE_H +#endif // GUARD_CONSTANTS_TRADE_H diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 8eacc8aa7..548e27163 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -461,7 +461,7 @@ #define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L) #define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) -#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4))) +#define REG_TMCNT(n) (*(vu32 *)(REG_ADDR_TMCNT + ((n) * 4))) #define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4))) #define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4))) #define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT) diff --git a/include/gba/syscall.h b/include/gba/syscall.h index deddec5ba..22fdf09fa 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -45,4 +45,6 @@ void RLUnCompVram(const void *src, void *dest); int MultiBoot(struct MultiBootParam *mp); +s32 Div(s32 num, s32 denom); + #endif // GUARD_GBA_SYSCALL_H diff --git a/include/librfu.h b/include/librfu.h index 709074f9c..9482b94c4 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -117,7 +117,7 @@ struct RfuStruct u8 unk_16; u8 unk_17; void (*callbackM)(); - void (*callbackS)(); + void (*callbackS)(u16); u32 callbackId; union RfuPacket *txPacket; union RfuPacket *rxPacket; @@ -145,7 +145,7 @@ struct RfuSlotStatusUNI u8 newDataFlag; u8 dataBlockFlag; void *recvBuffer; - u32 recvBuffSize; + u32 recvBufferSize; }; struct NIComm @@ -178,12 +178,12 @@ struct RfuSlotStatusNI struct RfuFixed { - void *reqCallback; + void (*reqCallback)(u16, u16); void *fastCopyPtr; u16 fastCopyBuffer[24]; u32 fastCopyBuffer2[12]; u32 LLFBuffer[29]; - u8 *STWIBuffer; + struct RfuIntrStruct *STWIBuffer; }; struct RfuStatic @@ -204,7 +204,7 @@ struct RfuStatic u16 unk_1a; u16 reqResult; u16 tryPid; - u32 watchdogTimer; + u16 watchdogTimer; u32 totalPacketSize; }; @@ -230,7 +230,7 @@ struct RfuLinkStatus u8 getNameFlag; u8 findParentCount; u8 watchInterval; - u8 stength[4]; + u8 strength[4]; u8 LLFReadyFlag; u8 remainLLFrameSizeParent; u8 remainLLFrameSizeChild[4]; @@ -266,19 +266,20 @@ extern struct RfuSlotStatusNI *gRfuSlotStatusNI[4]; extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; +// librfu_rfu void rfu_STC_clearAPIVariables(void); void rfu_REQ_stopMode(void); -void rfu_waitREQComplete(void); -u32 rfu_REQBN_softReset_and_checkID(void); +u16 rfu_waitREQComplete(void); +s32 rfu_REQBN_softReset_and_checkID(void); void rfu_REQ_sendData(u8); void rfu_setMSCCallback(void (*func)(u16)); void rfu_setREQCallback(void (*func)(u16, u16)); bool8 rfu_getMasterSlave(void); void rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); -bool16 rfu_syncVBlank(void); +u16 rfu_syncVBlank(void); void rfu_REQ_reset(void); void rfu_REQ_configSystem(u16, u8, u8); -void rfu_REQ_configGameData(u8, u16, struct UnkLinkRfuStruct_02022B14 *, u8 *); +void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7); void rfu_REQ_startSearchChild(void); void rfu_REQ_pollSearchChild(void); void rfu_REQ_endSearchChild(void); @@ -293,18 +294,18 @@ void rfu_REQ_CHILD_pollConnectRecovery(void); void rfu_REQ_CHILD_endConnectRecovery(void); void rfu_REQ_changeMasterSlave(void); void rfu_REQ_RFUStatus(void); -void rfu_getRFUStatus(u8 *status); -u8 *rfu_getSTWIRecvBuffer(void); +u32 rfu_getRFUStatus(u8 *status); +struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void); u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); void rfu_clearSlot(u8 a0, u8 a1); void rfu_clearAllSlot(void); bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); -bool16 rfu_getConnectParentStatus(u8 *status, u8 *a1); +u16 rfu_getConnectParentStatus(u8 *status, u8 *a1); bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0); void rfu_REQ_disconnect(u8 who); void rfu_changeSendTarget(u8 a0, u8 who, u8 a2); void rfu_NI_stopReceivingData(u8 who); -u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); +u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_setTimerInterrupt(u8 which, IntrFunc *intr); void rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); bool16 rfu_UNI_setSendData(u8 flag, void *ptr, u8 size); @@ -318,12 +319,12 @@ void rfu_NI_setSendData(u8, u8, const void *, u32); void IntrSIO32(void); // librfu_stwi -void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); +void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); void STWI_set_MS_mode(u8 mode); void STWI_init_Callback_M(void); void STWI_init_Callback_S(void); -void STWI_set_Callback_M(void (*callbackM)()); -void STWI_set_Callback_S(void (*callbackS)()); +void STWI_set_Callback_M(void *callbackM); +void STWI_set_Callback_S(void (*callbackS)(u16)); void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect); void AgbRFU_SoftReset(void); void STWI_set_Callback_ID(u32 id); @@ -333,7 +334,7 @@ void STWI_send_DataRxREQ(void); void STWI_send_MS_ChangeREQ(void); void STWI_send_StopModeREQ(void); void STWI_send_SystemStatusREQ(void); -void STWI_send_GameConfigREQ(u8 *unk1, u8 *data); +void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data); void STWI_send_ResetREQ(void); void STWI_send_LinkStatusREQ(void); void STWI_send_VersionStatusREQ(void); diff --git a/ld_script.txt b/ld_script.txt index c57b7b4a0..89bf60c16 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -319,6 +319,7 @@ SECTIONS { src/agb_flash_le.o(.text); src/librfu_stwi.o(.text); asm/librfu_intr.o(.text); + src/librfu_rfu.o(.text); asm/librfu.o(.text); src/isagbprn.o(.text); asm/libagbsyscall.o(.text); diff --git a/src/agb_flash.c b/src/agb_flash.c index 5b171abcb..7eb4ae737 100644 --- a/src/agb_flash.c +++ b/src/agb_flash.c @@ -74,7 +74,7 @@ u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) return 1; sTimerNum = timerNum; - sTimerReg = ®_TMCNT(sTimerNum); + sTimerReg = ®_TMCNT_L(sTimerNum); *intrFunc = FlashTimerIntr; return 0; } diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c new file mode 100644 index 000000000..96f4e9519 --- /dev/null +++ b/src/librfu_rfu.c @@ -0,0 +1,736 @@ +#include "global.h" +#include "librfu.h" + +void rfu_CB_defaultCallback(u8, u16); +void rfu_CB_reset(u8, u16); +void rfu_CB_configGameData(u8, u16); +void rfu_CB_stopMode(u8, u16); +void rfu_CB_startSearchChild(u8, u16); +void rfu_CB_pollAndEndSearchChild(u8, u16); +void rfu_CB_startSearchParent(u8, u16); +void rfu_CB_pollSearchParent(u8, u16); +void rfu_CB_pollConnectParent(u8, u16); +void rfu_CB_pollConnectParent(u8, u16); +s32 sub_81E349C(u8); +void rfu_enableREQCallback(bool8); +void rfu_STC_readChildList(void); +void rfu_STC_readParentCandidateList(void); +void rfu_STC_REQ_callback(u8, u16); +void rfu_STC_removeLinkData(u8, u8); +void rfu_STC_fastCopy(u8 **a1, u8 **a2, s32 a3); +void rfu_STC_clearLinkStatus(u8); +void rfu_NI_checkCommFailCounter(void); + +extern const char _Str_RFU_MBOOT[]; + +struct RfuStruct *gRfuState; +ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; +struct RfuSlotStatusNI *gRfuSlotStatusNI[4]; +struct RfuLinkStatus *gRfuLinkStatus; +struct RfuStatic *gRfuStatic; +struct RfuFixed *gRfuFixed; +ALIGNED(8) struct Unk_3007470 gUnknown_3007470; + +u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + u16 i; + u16 *dst; + const u16 *src; + u16 r3; + + // is in EWRAM? + if (((u32)unk0 & 0xF000000) == 0x2000000 && copyInterruptToRam) + return 2; + // is not 4-byte aligned? + if ((u32)unk0 & 3) + return 2; + // Nintendo pls, just use a ternary for once + if (copyInterruptToRam) + { + // An assert/debug print may have existed before, ie + // printf("%s %u < %u", "somefile.c:12345", unk1, num) + // to push this into r3? + r3 = 0xe64; + if (unk1 < r3) + return 1; + } + if (!copyInterruptToRam) + { + r3 = 0x504; // same as above, this should be r3 not r0 + if (unk1 < r3) + return 1; + } + gRfuLinkStatus = &unk0->linkStatus; + gRfuStatic = &unk0->static_; + gRfuFixed = &unk0->fixed; + gRfuSlotStatusNI[0] = &unk0->NI[0]; + gRfuSlotStatusUNI[0] = &unk0->UNI[0]; + for (i = 1; i < NELEMS(gRfuSlotStatusNI); ++i) + { + gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; + gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1]; + } + // TODO: Is it possible to fix the following 2 statements? + // It's equivalent to: + // gRfuFixed->STWIBuffer = &unk0->intr; + // STWI_init_all(&unk0->intr, interrupt, copyInterruptToRam); + gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1]; + STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], interrupt, copyInterruptToRam); + rfu_STC_clearAPIVariables(); + for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i) + { + gRfuSlotStatusNI[i]->recvBuffer = 0; + gRfuSlotStatusNI[i]->recvBufferSize = 0; + gRfuSlotStatusUNI[i]->recvBuffer = 0; + gRfuSlotStatusUNI[i]->recvBufferSize = 0; + } + src = (const u16 *)((u32)&rfu_STC_fastCopy & ~1); + dst = gRfuFixed->fastCopyBuffer; + // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy + for (r3 = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --r3; r3 != 0xFFFF; --r3) + *dst++ = *src++; + gRfuFixed->fastCopyPtr = (u8 *)gRfuFixed->fastCopyBuffer + 1; + return 0; +} + +void rfu_STC_clearAPIVariables(void) +{ + u16 IMEBackup = REG_IME; + u8 i, r4; + + REG_IME = 0; + r4 = gRfuStatic->flags; + CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic)); + gRfuStatic->flags = r4 & 8; + CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + gRfuLinkStatus->watchInterval = 4; + gRfuStatic->nowWatchInterval = 0; + gRfuLinkStatus->connMode = 0xFF; + rfu_clearAllSlot(); + gRfuStatic->SCStartFlag = 0; + for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i) + gRfuStatic->cidBak[i] = 0; + REG_IME = IMEBackup; +} + +void rfu_REQ_PARENT_resumeRetransmitAndChange(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_ResumeRetransmitAndChangeREQ(); +} + +u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) +{ + struct RfuIntrStruct *buf; + *ackFlag = 0; + if (gRfuLinkStatus->connMode != 1) + return 0x300; + buf = rfu_getSTWIRecvBuffer(); + switch (buf->rxPacketAlloc.rfuPacket8.data[0]) + { + case 40: + case 54: + if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0) + *ackFlag = gRfuLinkStatus->connSlotFlag; + else + *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4]; + return 0; + default: + return 0x10; + } +} + +void rfu_setTimerInterrupt(u8 which, IntrFunc *intr) +{ + STWI_init_timer(intr, which); +} + +struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) +{ + return gRfuFixed->STWIBuffer; +} + +void rfu_setMSCCallback(void (*callback)(u16)) +{ + STWI_set_Callback_S(callback); +} + +void rfu_setREQCallback(void (*callback)(u16, u16)) +{ + gRfuFixed->reqCallback = callback; + rfu_enableREQCallback(callback != NULL); +} + +void rfu_enableREQCallback(bool8 enable) +{ + if (enable) + gRfuStatic->flags |= 8; + else + gRfuStatic->flags &= 0xF7; +} + +void rfu_STC_REQ_callback(u8 r5, u16 reqResult) +{ + STWI_set_Callback_M(rfu_CB_defaultCallback); + gRfuStatic->reqResult = reqResult; + if (gRfuStatic->flags & 8) + gRfuFixed->reqCallback(r5, reqResult); +} + +void rfu_CB_defaultCallback(u8 r0, u16 reqResult) +{ + s32 r5; + u8 i; + + if (r0 == 0xFF) + { + if (gRfuStatic->flags & 8) + gRfuFixed->reqCallback(r0, reqResult); + r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (i = 0; i < 4; ++i) + if ((r5 >> i) & 1) + rfu_STC_removeLinkData(i, 1); + gRfuLinkStatus->connMode = 0xFF; + } +} + +u16 rfu_waitREQComplete(void) +{ + STWI_poll_CommandEnd(); + return gRfuStatic->reqResult; +} + +void rfu_REQ_RFUStatus(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SystemStatusREQ(); +} + +u32 rfu_getRFUStatus(u8 *status) +{ + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93) + return 0x10; + if (STWI_poll_CommandEnd() == 0) + *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; + else + *status = 0xFF; + return 0; +} + +s32 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) +{ + const char *s1 = _Str_RFU_MBOOT; + char *s2 = (char *)0x30000F0; + u16 checksum; + u16 *r2; + u8 i; + + while (*s1 != '\0') + if (*s1++ != *s2++) + return 1; + r2 = (u16 *)0x3000000; + checksum = 0; + for (i = 0; i < 90; ++i) + checksum += *r2++; + if (checksum != *(u16 *)0x30000FA) + return 1; + CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + gRfuStatic->flags |= 0x80; + return 0; +} + +void rfu_REQ_stopMode(void) +{ + vu32 *timerReg; + + if (REG_IME == 0) + { + rfu_STC_REQ_callback(61, 6); + gRfuState->error = 6; + } + else + { + AgbRFU_SoftReset(); + rfu_STC_clearAPIVariables(); + if (sub_81E349C(8) == 0x8001) + { + timerReg = ®_TMCNT(gRfuState->timerSelect); + *timerReg = 0; + *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16; + while (*timerReg << 16 < 262 << 16) + ; + *timerReg = 0; + STWI_set_Callback_M(rfu_CB_stopMode); + STWI_send_StopModeREQ(); + } + else + { + REG_SIOCNT = SIO_MULTI_MODE; + rfu_STC_REQ_callback(61, 0); + } + } +} + +void rfu_CB_stopMode(u8 a1, u16 reqResult) +{ + if (reqResult == 0) + REG_SIOCNT = SIO_MULTI_MODE; + rfu_STC_REQ_callback(a1, reqResult); +} + +s32 rfu_REQBN_softReset_and_checkID(void) +{ + s32 r2; + + if (REG_IME == 0) + return -1; + AgbRFU_SoftReset(); + rfu_STC_clearAPIVariables(); + if ((r2 = sub_81E349C(30)) == 0) + REG_SIOCNT = SIO_MULTI_MODE; + return r2; +} + +void rfu_REQ_reset(void) +{ + STWI_set_Callback_M(rfu_CB_reset); + STWI_send_ResetREQ(); +} + +void rfu_CB_reset(u8 a1, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_clearAPIVariables(); + rfu_STC_REQ_callback(a1, reqResult); +} + +void rfu_REQ_configSystem(u16 r4, u8 r5, u8 r6) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SystemConfigREQ((r4 & 3) | 0x3C, r5, r6); + if (r6 == 0) + { + gRfuStatic->unk_1a = 1; + } + else + { + u16 IMEBackup = REG_IME; + + REG_IME = 0; + gRfuStatic->unk_1a = Div(600, r6); + REG_IME = IMEBackup; + } +} + +void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7) +{ + u8 sp[16]; + u8 i; + u8 r3; + const u8 *r5 = r4; + const u8 *r1; + + sp[0] = r2; + sp[1] = r2 >> 8; + if (r6 != 0) + sp[1] = (r2 >> 8) | 0x80; + for (i = 2; i < 15; ++i) + sp[i] = *r4++; + r3 = 0; + r1 = r7; + for (i = 0; i < 8; ++i) + { + r3 += *r1++; + r3 += *r5++; + } + sp[15] = ~r3; + if (r6 != 0) + sp[14] = 0; + STWI_set_Callback_M(rfu_CB_configGameData); + STWI_send_GameConfigREQ(sp, r7); +} + +void rfu_CB_configGameData(u8 ip, u16 r7) +{ + s32 r2, r3; + u8 *r4; + u8 i; + u8 *r1; + + if (r7 == 0) + { + r1 = gRfuState->txPacket->rfuPacket8.data; + r2 = gRfuLinkStatus->my.serialNum = r1[4]; + gRfuLinkStatus->my.serialNum = (r1[5] << 8) | r2; + r4 = &r1[6]; + if (gRfuLinkStatus->my.serialNum & 0x8000) + { + gRfuLinkStatus->my.serialNum = gRfuLinkStatus->my.serialNum ^ 0x8000; + gRfuLinkStatus->my.multibootFlag = 1; + } + else + { + gRfuLinkStatus->my.multibootFlag = 0; + } + for (i = 0; i < NELEMS(gRfuLinkStatus->my.gname) - 2; ++i) + gRfuLinkStatus->my.gname[i] = *r4++; + ++r4; + for (i = 0; i < NELEMS(gRfuLinkStatus->my.uname) - 1; ++i) + gRfuLinkStatus->my.uname[i] = *r4++; + } + rfu_STC_REQ_callback(ip, r7); +} + +void rfu_REQ_startSearchChild(void) +{ + u16 r1; + + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + r1 = STWI_poll_CommandEnd(); + if (r1 == 0) + { + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + rfu_STC_clearLinkStatus(1); + } + else + { + rfu_STC_REQ_callback(25, r1); + } + STWI_set_Callback_M(rfu_CB_startSearchChild); + STWI_send_SC_StartREQ(); +} + +void rfu_CB_startSearchChild(u8 r3, u16 reqResult) +{ + if (reqResult == 0) + gRfuStatic->SCStartFlag = 1; + rfu_STC_REQ_callback(r3, reqResult); +} + +void rfu_STC_clearLinkStatus(u8 r4) +{ + u8 i; + + rfu_clearAllSlot(); + if (r4 != 0) + { + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + gRfuLinkStatus->findParentCount = 0; + } + for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + gRfuLinkStatus->strength[i] = 0; + gRfuLinkStatus->connCount = 0; + gRfuLinkStatus->connSlotFlag = 0; + gRfuLinkStatus->linkLossSlotFlag = 0; + gRfuLinkStatus->getNameFlag = 0; +} + +void rfu_REQ_pollSearchChild(void) +{ + STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); + STWI_send_SC_PollingREQ(); +} + +void rfu_REQ_endSearchChild(void) +{ + STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); + STWI_send_SC_EndREQ(); +} + +void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_readChildList(); + if (r4 == 26) + { + if (gRfuLinkStatus->my.id == 0) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + } + } + else if (r4 == 27) + { + if (gRfuLinkStatus->connMode == 255) + gRfuLinkStatus->my.id = 0; + gRfuStatic->SCStartFlag = 0; + } + rfu_STC_REQ_callback(r4, reqResult); +} + +void rfu_STC_readChildList(void) +{ + u32 r5; + u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; + u8 *r4; + u8 i; + u8 sp[4]; + u8 r2; + + if (r8 != 0) + { + r5 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_LinkStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + { + r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + for (i = 0; i < NELEMS(sp); ++i) + sp[i] = *r4++; + } + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = r5; + } + for (r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + r8 != 0; + r4 += 4) + { + r2 = r4[2]; + if (r2 < 4 && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1)) + { + if (sp[r2] != 0) + ++gRfuStatic->lsFixedCount[r2]; + if (gRfuStatic->lsFixedCount[r2] >= 4) + { + gRfuStatic->lsFixedCount[r2] = 0; + gRfuLinkStatus->strength[r2] = 0xFF; + gRfuLinkStatus->connSlotFlag |= 1 << r2; + ++gRfuLinkStatus->connCount; + gRfuLinkStatus->partner[r2].id = *(u16 *)r4; + gRfuLinkStatus->partner[r2].slot = r2; + gRfuLinkStatus->connMode = 1; + gRfuStatic->flags &= 0x7F; + gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id; + } + } + --r8; + } +} + +void rfu_REQ_startSearchParent(void) +{ + STWI_set_Callback_M(rfu_CB_startSearchParent); + STWI_send_SP_StartREQ(); +} + +void rfu_CB_startSearchParent(u8 r5, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_clearLinkStatus(0); + rfu_STC_REQ_callback(r5, reqResult); +} + +void rfu_REQ_pollSearchParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollSearchParent); + STWI_send_SP_PollingREQ(); +} + +void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_readParentCandidateList(); + rfu_STC_REQ_callback(r5, reqResult); +} + +void rfu_REQ_endSearchParent(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SP_EndREQ(); +} + +void rfu_STC_readParentCandidateList(void) +{ + u8 r7, r6, r5, r4, r3; + u8 *r1, *r2; + struct RfuTgtData *r4_; + + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0]; + r7 = r2[1]; + r2 += 4; + gRfuLinkStatus->findParentCount = 0; + for (r6 = 0; r6 < 4 && r7 != 0; ++r6) + { + r7 -= 7; + r1 = r2 + 6; + r2 += 19; + r5 = ~*r2; + ++r2; + r4 = 0; + for (r3 = 0; r3 < 8; ++r3) + { + r4 += *r2++; + r4 += *r1++; + } + if (r4 == r5) + { + r2 -= 28; + r4_ = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount]; + r4_->id = *(u16 *)r2; + r2 += 2; + r4_->slot = *r2; + r2 += 2; + r4_->serialNum = *(u16 *)r2 & 0x7FFF; + if (*(u16 *)r2 & 0x8000) + r4_->multibootFlag = 1; + else + r4_->multibootFlag = 0; + r2 += 2; + for (r3 = 0; r3 < NELEMS(r4_->gname) - 2; ++r3) + r4_->gname[r3] = *r2++; + ++r2; + for (r3 = 0; r3 < NELEMS(r4_->uname) - 1; ++r3) + r4_->uname[r3] = *r2++; + ++gRfuLinkStatus->findParentCount; + } + } +} + +void rfu_REQ_startConnectParent(u16 r4) +{ + u16 r3 = 0; + u8 i; + for (i = 0; i < NELEMS(gRfuLinkStatus->partner) && gRfuLinkStatus->partner[i].id != r4; ++i) + ; + if (i == 4) + r3 = 256; + if (r3 == 0) + { + gRfuStatic->tryPid = r4; + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_CP_StartREQ(r4); + } + else + { + rfu_STC_REQ_callback(31, r3); + } +} + +void rfu_REQ_pollConnectParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollConnectParent); + STWI_send_CP_PollingREQ(); +} + +void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) +{ + u16 id; + u8 slot; + u8 r2, r5; + struct RfuTgtData *r9; + struct RfuTgtData sp; + + if (sp28 == 0) + { + id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]; + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + { + r2 = 1 << slot; + if (!(r2 & gRfuLinkStatus->connSlotFlag)) + { + gRfuLinkStatus->connSlotFlag |= r2; + gRfuLinkStatus->linkLossSlotFlag &= ~r2; + gRfuLinkStatus->my.id = id; + ++gRfuLinkStatus->connCount; + gRfuLinkStatus->connMode = 0; + gRfuStatic->flags |= 0x80; + for (r5 = 0; r5 < NELEMS(gRfuLinkStatus->partner); ++r5) + { + if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid) + { + if (gRfuLinkStatus->findParentCount != 0) + { + r9 = &sp; + CpuCopy16(&gRfuLinkStatus->partner[r5], &sp, sizeof(struct RfuTgtData)); + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + gRfuLinkStatus->findParentCount = 0; + } + else + { + r9 = &gRfuLinkStatus->partner[r5]; + } + break; + } + } + if (r5 < 4) + { + CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); + gRfuLinkStatus->partner[slot].slot = slot; + } + } + } + } + rfu_STC_REQ_callback(sp24, sp28); +} + +u16 rfu_getConnectParentStatus(u8 *status, u8 *r1) +{ + u8 r0, *r2; + + *status = 0xFF; + r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + r0 = r2[0] + 96; + if (r0 <= 1) + { + r2 += 6; + *r1 = r2[0]; + *status = r2[1]; + return 0; + } + return 0x10; +} + +void rfu_REQ_endConnectParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollConnectParent); + STWI_send_CP_EndREQ(); + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6] < 4) + gRfuStatic->linkEmergencyFlag[gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]] = 0; +} + +u16 rfu_syncVBlank(void) +{ + u8 r3, r4; + s32 r5; + + rfu_NI_checkCommFailCounter(); + if (gRfuLinkStatus->connMode == 0xFF) + return 0; + if (gRfuStatic->nowWatchInterval != 0) + --gRfuStatic->nowWatchInterval; + r3 = rfu_getMasterSlave(); + if (!(gRfuStatic->flags & 2)) + { + if (r3 == 0) + { + gRfuStatic->flags |= 4; + gRfuStatic->watchdogTimer = 360; + } + } + else if (r3 != 0) + { + gRfuStatic->flags &= 0xFB; + } + if (r3 != 0) + gRfuStatic->flags &= 0xFD; + else + gRfuStatic->flags |= 2; + if (!(gRfuStatic->flags & 4)) + return 0; + if (gRfuStatic->watchdogTimer == 0) + { + gRfuStatic->flags &= 0xFB; + r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (r4 = 0; r4 < 4; ++r4) + if ((r5 >> r4) & 1) + rfu_STC_removeLinkData(r4, 1); + gRfuLinkStatus->connMode = 0xFF; + return 1; + } + --gRfuStatic->watchdogTimer; + return 0; +} diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index fe8a4ef76..c8df0ccfa 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -64,7 +64,7 @@ void AgbRFU_SoftReset(void) timerH = ®_TMCNT_H(gRfuState->timerSelect); *timerH = 0; *timerL = 0; - *timerH = 0x83; + *timerH = TIMER_ENABLE | TIMER_1024CLK; while (*timerL <= 0x11) REG_RCNT = 0x80A2; *timerH = 3; @@ -117,12 +117,13 @@ void STWI_init_Callback_S(void) STWI_set_Callback_S(NULL); } -void STWI_set_Callback_M(void (*callbackM)()) +// The callback can take 2 or 3 arguments. +void STWI_set_Callback_M(void *callbackM) { gRfuState->callbackM = callbackM; } -void STWI_set_Callback_S(void (*callbackS)()) +void STWI_set_Callback_S(void (*callbackS)(u16)) { gRfuState->callbackS = callbackS; } @@ -193,7 +194,7 @@ void STWI_send_ConfigStatusREQ(void) } } -void STWI_send_GameConfigREQ(u8 *unk1, u8 *data) +void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) { u8 *packetBytes; s32 i; @@ -496,7 +497,7 @@ static void STWI_intr_timer(void) gRfuState->timerActive = 1; STWI_stop_timer(); STWI_reset_ClockCounter(); - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(255, 0); break; } @@ -546,7 +547,7 @@ static u16 STWI_init(u8 request) if (!REG_IME) { gRfuState->error = 6; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(request, gRfuState->error); return TRUE; } @@ -554,14 +555,14 @@ static u16 STWI_init(u8 request) { gRfuState->error = 2; gRfuState->unk_2c = FALSE; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(request, gRfuState->error); return TRUE; } else if(!gRfuState->msMode) { gRfuState->error = 4; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(request, gRfuState->error, gRfuState); return TRUE; } @@ -617,14 +618,14 @@ static s32 STWI_restart_Command(void) { gRfuState->error = 1; gRfuState->unk_2c = 0; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); } else { gRfuState->error = 1; gRfuState->unk_2c = 0; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); gRfuState->state = 4; // TODO: what's 4 } diff --git a/sym_common.txt b/sym_common.txt index e72f9a03c..444c2a7af 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -159,24 +159,5 @@ gUnknown_3005E94: @ 3005E94 .include "berry_fix_program.o" .include "m4a.o" .include "agb_flash.o" - -gRfuState: @ 3007438 - .space 0x8 - -gRfuSlotStatusUNI: @ 3007440 - .space 0x10 - -gRfuSlotStatusNI: @ 3007450 - .space 0x10 - -gRfuLinkStatus: @ 3007460 - .space 0x4 - -gRfuStatic: @ 3007464 - .space 0x4 - -gRfuFixed: @ 3007468 - .space 0x8 - -gUnknown_3007470: @ 3007470 - .space 0xC + .align 2 + .include "librfu_rfu.o" -- cgit v1.2.3 From 6cbce0b9668c0fd7e902397e96f9a488b1d6f5a8 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Tue, 31 Dec 2019 06:42:18 +0800 Subject: librfu through 0x81E2C40 --- asm/librfu.s | 3255 ------------------------------------------------------ include/librfu.h | 75 +- src/librfu_rfu.c | 1095 +++++++++++++++++- 3 files changed, 1139 insertions(+), 3286 deletions(-) diff --git a/asm/librfu.s b/asm/librfu.s index d3b48f07e..c98ee854c 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,3261 +5,6 @@ .text - thumb_func_start rfu_REQBN_watchLink -rfu_REQBN_watchLink: @ 81E13F0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - mov r8, r1 - str r2, [sp] - str r3, [sp, 0x4] - lsls r0, 16 - lsrs r5, r0, 16 - movs r0, 0 - str r0, [sp, 0x8] - movs r1, 0 - str r1, [sp, 0xC] - mov r2, r8 - strb r1, [r2] - mov r0, sp - ldrb r1, [r0, 0xC] - ldr r0, [sp] - strb r1, [r0] - mov r2, sp - ldrb r0, [r2, 0xC] - ldr r2, [sp, 0x4] - strb r0, [r2] - ldr r4, _081E1490 @ =gRfuLinkStatus - ldr r0, [r4] - ldrb r0, [r0] - cmp r0, 0xFF - bne _081E142E - b _081E178E -_081E142E: - ldr r0, _081E1494 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0x14] - cmp r0, 0 - bne _081E143A - b _081E178E -_081E143A: - ldr r3, _081E1498 @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _081E144E - movs r0, 0xB4 - lsls r0, 1 - strh r0, [r2, 0x20] -_081E144E: - ldr r1, [r3] - ldrb r0, [r1, 0x6] - cmp r0, 0 - bne _081E1460 - ldr r0, [r4] - ldrb r0, [r0, 0x9] - strb r0, [r1, 0x6] - movs r1, 0x1 - str r1, [sp, 0x8] -_081E1460: - lsls r0, r5, 24 - lsrs r0, 24 - cmp r0, 0x29 - bne _081E14A0 - ldr r0, _081E149C @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrb r0, [r1, 0x4] - mov r2, r8 - strb r0, [r2] - ldrb r0, [r1, 0x5] - ldr r1, [sp] - strb r0, [r1] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _081E148A - ldr r0, [r4] - ldrb r0, [r0, 0x2] - strb r0, [r2] -_081E148A: - movs r2, 0x2 - str r2, [sp, 0x8] - b _081E14F8 - .align 2, 0 -_081E1490: .4byte gRfuLinkStatus -_081E1494: .4byte gRfuState -_081E1498: .4byte gRfuStatic -_081E149C: .4byte gRfuFixed -_081E14A0: - movs r0, 0x9B - lsls r0, 1 - cmp r5, r0 - bne _081E14F0 - ldr r0, _081E154C @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r6, [r0, 0x5] - ldr r0, [r4] - ldrb r0, [r0, 0x2] - eors r6, r0 - ands r6, r0 - mov r0, r8 - strb r6, [r0] - movs r0, 0x1 - ldr r1, [sp] - strb r0, [r1] - movs r5, 0 -_081E14C6: - mov r2, r8 - ldrb r0, [r2] - asrs r0, r5 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E14E6 - ldr r0, _081E1550 @ =gRfuLinkStatus - ldr r0, [r0] - adds r0, 0xA - adds r0, r5 - movs r1, 0 - strb r1, [r0] - adds r0, r5, 0 - bl rfu_STC_removeLinkData -_081E14E6: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E14C6 -_081E14F0: - ldr r0, [sp, 0x8] - cmp r0, 0 - bne _081E14F8 - b _081E178E -_081E14F8: - ldr r4, _081E154C @ =gRfuFixed - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - ldr r1, [r0] - str r1, [sp, 0x10] - ldr r0, [r0, 0x4] - str r0, [sp, 0x14] - ldr r0, _081E1554 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_LinkStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0xC] - cmp r0, 0 - bne _081E1558 - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - adds r2, r0, 0x4 - movs r5, 0 - ldr r3, _081E1550 @ =gRfuLinkStatus -_081E152C: - ldr r0, [r3] - adds r0, 0xA - adds r0, r5 - ldrb r1, [r2] - strb r1, [r0] - adds r2, 0x1 - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E152C - movs r2, 0 - mov r9, r2 - movs r5, 0 - b _081E1564 - .align 2, 0 -_081E154C: .4byte gRfuFixed -_081E1550: .4byte gRfuLinkStatus -_081E1554: .4byte rfu_CB_defaultCallback -_081E1558: - movs r0, 0x11 - ldr r1, [sp, 0xC] - bl rfu_STC_REQ_callback - ldr r0, [sp, 0xC] - b _081E1790 -_081E1564: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r5 - lsrs r6, r0, 24 - adds r0, r5, 0x1 - mov r10, r0 - ldr r1, [sp, 0xC] - cmp r1, 0 - beq _081E1578 - b _081E1742 -_081E1578: - ldr r2, [sp, 0x8] - cmp r2, 0x1 - bne _081E164E - ldr r4, _081E15B8 @ =gRfuLinkStatus - ldr r1, [r4] - ldrb r0, [r1, 0x2] - ands r0, r6 - cmp r0, 0 - beq _081E164E - adds r0, r1, 0 - adds r0, 0xA - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0 - bne _081E1640 - ldrb r0, [r1] - cmp r0, 0x1 - bne _081E15C0 - ldr r2, _081E15BC @ =gRfuStatic - ldr r1, [r2] - adds r1, 0xA - adds r1, r5 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - ldr r0, [r2] - adds r0, 0xA - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0x3 - bls _081E164E - b _081E1626 - .align 2, 0 -_081E15B8: .4byte gRfuLinkStatus -_081E15BC: .4byte gRfuStatic -_081E15C0: - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E164E - ldr r0, _081E15F0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E15F4 - mov r2, r8 - ldrb r1, [r2] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2] - mov r0, sp - ldrb r1, [r0, 0x8] - ldr r0, [sp] - b _081E164C - .align 2, 0 -_081E15F0: .4byte gRfuFixed -_081E15F4: - ldr r2, _081E163C @ =gRfuStatic - ldr r1, [r2] - adds r1, 0xA - adds r1, r5 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - lsls r0, 24 - ldr r2, [r2] - lsrs r0, 24 - ldrh r1, [r2, 0x1A] - cmp r0, r1 - bls _081E164E - adds r0, r2, 0 - adds r0, 0xA - adds r0, r5 - mov r2, sp - ldrb r2, [r2, 0xC] - strb r2, [r0] - ldr r0, [r4] - ldrb r0, [r0, 0x2] - bl STWI_send_DisconnectREQ - bl STWI_poll_CommandEnd -_081E1626: - mov r0, r8 - ldrb r1, [r0] - adds r0, r6, 0 - orrs r0, r1 - mov r1, r8 - strb r0, [r1] - mov r2, sp - ldrb r0, [r2, 0x8] - ldr r2, [sp] - strb r0, [r2] - b _081E164E - .align 2, 0 -_081E163C: .4byte gRfuStatic -_081E1640: - ldr r0, _081E16B0 @ =gRfuStatic - ldr r0, [r0] - adds r0, 0xA - adds r0, r5 - mov r1, sp - ldrb r1, [r1, 0xC] -_081E164C: - strb r1, [r0] -_081E164E: - ldr r2, _081E16B4 @ =gRfuLinkStatus - mov r12, r2 - ldr r1, [r2] - ldrb r7, [r1] - adds r0, r5, 0x1 - mov r10, r0 - cmp r7, 0x1 - bne _081E1742 - adds r0, r1, 0 - adds r0, 0xA - adds r4, r0, r5 - ldrb r3, [r4] - cmp r3, 0 - beq _081E1742 - ldrb r2, [r1, 0x3] - adds r0, r6, 0 - ands r0, r2 - cmp r0, 0 - beq _081E16BE - cmp r3, 0xA - bls _081E16B8 - ldr r2, [sp, 0x4] - ldrb r1, [r2] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2] - mov r0, r12 - ldr r2, [r0] - ldrb r1, [r2, 0x2] - adds r0, r6, 0 - orrs r0, r1 - movs r3, 0 - strb r0, [r2, 0x2] - mov r2, r12 - ldr r1, [r2] - ldrb r0, [r1, 0x3] - bics r0, r6 - strb r0, [r1, 0x3] - ldr r1, [r2] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r0, _081E16B0 @ =gRfuStatic - ldr r0, [r0] - adds r0, 0xA - adds r0, r5 - strb r3, [r0] - b _081E1742 - .align 2, 0 -_081E16B0: .4byte gRfuStatic -_081E16B4: .4byte gRfuLinkStatus -_081E16B8: - movs r0, 0 - strb r0, [r4] - b _081E1742 -_081E16BE: - ldrb r0, [r1, 0x2] - orrs r0, r2 - ands r0, r6 - cmp r0, 0 - bne _081E1742 - bl STWI_send_SlotStatusREQ - bl STWI_poll_CommandEnd - ldr r0, _081E1708 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r2, [r0] - ldrb r0, [r2, 0x1] - subs r0, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - adds r2, 0x8 - cmp r3, 0 - beq _081E1742 - ldrh r4, [r2] - ldrb r0, [r2, 0x2] - cmp r0, r5 - bne _081E1710 - ldr r0, _081E170C @ =gRfuStatic - ldr r0, [r0] - lsls r1, r5, 1 - adds r0, 0x12 - adds r0, r1 - ldrh r0, [r0] - cmp r4, r0 - bne _081E1710 - lsls r7, r5 - mov r0, r9 - orrs r0, r7 - lsls r0, 24 - b _081E173E - .align 2, 0 -_081E1708: .4byte gRfuFixed -_081E170C: .4byte gRfuStatic -_081E1710: - adds r2, 0x4 - subs r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0 - beq _081E1742 - ldrh r4, [r2] - ldrb r0, [r2, 0x2] - cmp r0, r5 - bne _081E1710 - ldr r0, _081E17A0 @ =gRfuStatic - ldr r0, [r0] - lsls r1, r5, 1 - adds r0, 0x12 - adds r0, r1 - ldrh r0, [r0] - cmp r4, r0 - bne _081E1710 - movs r0, 0x1 - lsls r0, r5 - mov r1, r9 - orrs r1, r0 - lsls r0, r1, 24 -_081E173E: - lsrs r0, 24 - mov r9, r0 -_081E1742: - ldr r0, _081E17A4 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r1, [r0, 0x2] - mov r2, r8 - ldrb r0, [r2] - ands r0, r1 - ands r6, r0 - cmp r6, 0 - beq _081E175C - adds r0, r5, 0 - movs r1, 0 - bl rfu_STC_removeLinkData -_081E175C: - mov r1, r10 - lsls r0, r1, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bhi _081E1768 - b _081E1564 -_081E1768: - mov r2, r9 - cmp r2, 0 - beq _081E1778 - mov r0, r9 - bl STWI_send_DisconnectREQ - bl STWI_poll_CommandEnd -_081E1778: - ldr r1, _081E17A8 @ =gRfuFixed - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldr r2, [sp, 0x10] - str r2, [r0] - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldr r1, [sp, 0x14] - str r1, [r0, 0x4] -_081E178E: - movs r0, 0 -_081E1790: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E17A0: .4byte gRfuStatic -_081E17A4: .4byte gRfuLinkStatus -_081E17A8: .4byte gRfuFixed - thumb_func_end rfu_REQBN_watchLink - - thumb_func_start rfu_STC_removeLinkData -rfu_STC_removeLinkData: @ 81E17AC - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r7, r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r12, r1 - movs r0, 0x80 - lsls r0, 17 - lsls r0, r7 - lsrs r5, r0, 24 - ldr r1, _081E1850 @ =gRfuLinkStatus - ldr r4, [r1] - ldrb r0, [r4, 0x2] - ands r0, r5 - mov r8, r1 - cmp r0, 0 - beq _081E17DE - ldrb r0, [r4, 0x1] - cmp r0, 0 - beq _081E17DE - subs r0, 0x1 - strb r0, [r4, 0x1] -_081E17DE: - mov r3, r8 - ldr r2, [r3] - mvns r6, r5 - ldrb r1, [r2, 0x2] - adds r0, r6, 0 - ands r0, r1 - strb r0, [r2, 0x2] - ldr r2, [r3] - ldrb r1, [r2, 0x3] - adds r0, r5, 0 - orrs r0, r1 - strb r0, [r2, 0x3] - ldr r3, [r3] - ldr r0, [r3] - ldr r1, _081E1854 @ =0x00ff00ff - ands r0, r1 - cmp r0, 0 - bne _081E1806 - movs r0, 0xFF - strb r0, [r3] -_081E1806: - mov r0, r12 - cmp r0, 0 - beq _081E1844 - mov r1, sp - movs r4, 0 - movs r0, 0 - strh r0, [r1] - lsls r0, r7, 5 - adds r0, 0x14 - mov r2, r8 - ldr r1, [r2] - adds r1, r0 - ldr r2, _081E1858 @ =0x01000010 - mov r0, sp - bl CpuSet - mov r0, r8 - ldr r2, [r0] - ldrb r1, [r2, 0x3] - adds r0, r6, 0 - ands r0, r1 - strb r0, [r2, 0x3] - mov r2, r8 - ldr r1, [r2] - ldrb r0, [r1, 0x7] - ands r6, r0 - strb r6, [r1, 0x7] - ldr r0, [r2] - adds r0, 0xA - adds r0, r7 - strb r4, [r0] -_081E1844: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E1850: .4byte gRfuLinkStatus -_081E1854: .4byte 0x00ff00ff -_081E1858: .4byte 0x01000010 - thumb_func_end rfu_STC_removeLinkData - - thumb_func_start rfu_REQ_disconnect -rfu_REQ_disconnect: @ 81E185C - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r2, _081E18A0 @ =gRfuLinkStatus - ldr r1, [r2] - ldrb r0, [r1, 0x2] - ldrb r1, [r1, 0x3] - orrs r0, r1 - ands r0, r4 - cmp r0, 0 - beq _081E18E0 - ldr r0, _081E18A4 @ =gRfuStatic - ldr r1, [r0] - strb r4, [r1, 0x5] - ldr r2, [r2] - ldrb r1, [r2] - adds r3, r0, 0 - cmp r1, 0xFF - bne _081E18A8 - ldr r0, [r3] - ldrb r1, [r0] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _081E18A8 - ldrb r0, [r2, 0x3] - ands r0, r4 - cmp r0, 0 - beq _081E18E0 - movs r0, 0x30 - movs r1, 0 - bl rfu_CB_disconnect - b _081E18E0 - .align 2, 0 -_081E18A0: .4byte gRfuLinkStatus -_081E18A4: .4byte gRfuStatic -_081E18A8: - ldr r0, [r3] - ldrb r0, [r0, 0x9] - cmp r0, 0 - beq _081E18D4 - ldr r0, _081E18D0 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SC_EndREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - beq _081E18D4 - movs r0, 0x1B - bl rfu_STC_REQ_callback - b _081E18E0 - .align 2, 0 -_081E18D0: .4byte rfu_CB_defaultCallback -_081E18D4: - ldr r0, _081E18E8 @ =rfu_CB_disconnect - bl STWI_set_Callback_M - adds r0, r4, 0 - bl STWI_send_DisconnectREQ -_081E18E0: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081E18E8: .4byte rfu_CB_disconnect - thumb_func_end rfu_REQ_disconnect - - thumb_func_start rfu_CB_disconnect -rfu_CB_disconnect: @ 81E18EC - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 16 - lsrs r5, r1, 16 - cmp r5, 0x3 - bne _081E1928 - ldr r0, _081E19BC @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0 - bne _081E1928 - ldr r0, _081E19C0 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E1928 - ldr r0, _081E19C4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E1928 - movs r5, 0 -_081E1928: - ldr r3, _081E19C8 @ =gRfuStatic - ldr r2, [r3] - ldr r0, _081E19BC @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1, 0x2] - ldrb r1, [r1, 0x3] - orrs r0, r1 - ldrb r1, [r2, 0x5] - ands r0, r1 - strb r0, [r2, 0x5] - ldr r0, _081E19C4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldr r0, [r3] - ldrb r0, [r0, 0x5] - strb r0, [r1, 0x8] - cmp r5, 0 - bne _081E1976 - movs r4, 0 -_081E1950: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r4 - lsrs r0, 24 - ldr r1, _081E19C8 @ =gRfuStatic - ldr r1, [r1] - ldrb r1, [r1, 0x5] - ands r0, r1 - cmp r0, 0 - beq _081E196C - adds r0, r4, 0 - movs r1, 0x1 - bl rfu_STC_removeLinkData -_081E196C: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E1950 -_081E1976: - ldr r0, _081E19BC @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2, 0x2] - ldrb r0, [r2, 0x3] - orrs r0, r1 - cmp r0, 0 - bne _081E1988 - movs r0, 0xFF - strb r0, [r2] -_081E1988: - adds r0, r6, 0 - adds r1, r5, 0 - bl rfu_STC_REQ_callback - ldr r0, _081E19C8 @ =gRfuStatic - ldr r0, [r0] - ldrb r0, [r0, 0x9] - cmp r0, 0 - beq _081E19B6 - ldr r0, _081E19C0 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SC_StartREQ - bl STWI_poll_CommandEnd - adds r5, r0, 0 - cmp r5, 0 - beq _081E19B6 - movs r0, 0x19 - adds r1, r5, 0 - bl rfu_STC_REQ_callback -_081E19B6: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E19BC: .4byte gRfuLinkStatus -_081E19C0: .4byte rfu_CB_defaultCallback -_081E19C4: .4byte gRfuFixed -_081E19C8: .4byte gRfuStatic - thumb_func_end rfu_CB_disconnect - - thumb_func_start rfu_REQ_CHILD_startConnectRecovery -rfu_REQ_CHILD_startConnectRecovery: @ 81E19CC - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _081E1A1C @ =gRfuStatic - ldr r0, [r0] - strb r5, [r0, 0x5] - movs r4, 0 - movs r0, 0x1 - ands r0, r5 - ldr r2, _081E1A20 @ =rfu_STC_REQ_callback - cmp r0, 0 - bne _081E19FA - movs r1, 0x1 -_081E19E6: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bhi _081E19FA - adds r0, r5, 0 - asrs r0, r4 - ands r0, r1 - cmp r0, 0 - beq _081E19E6 -_081E19FA: - adds r0, r2, 0 - bl STWI_set_Callback_M - ldr r0, _081E1A24 @ =gRfuLinkStatus - ldr r1, [r0] - lsls r0, r4, 5 - adds r0, r1, r0 - ldrh r0, [r0, 0x14] - adds r1, 0x94 - ldrh r1, [r1] - adds r2, r5, 0 - bl STWI_send_CPR_StartREQ - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E1A1C: .4byte gRfuStatic -_081E1A20: .4byte rfu_STC_REQ_callback -_081E1A24: .4byte gRfuLinkStatus - thumb_func_end rfu_REQ_CHILD_startConnectRecovery - - thumb_func_start rfu_REQ_CHILD_pollConnectRecovery -rfu_REQ_CHILD_pollConnectRecovery: @ 81E1A28 - push {lr} - ldr r0, _081E1A38 @ =rfu_CB_CHILD_pollConnectRecovery - bl STWI_set_Callback_M - bl STWI_send_CPR_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E1A38: .4byte rfu_CB_CHILD_pollConnectRecovery - thumb_func_end rfu_REQ_CHILD_pollConnectRecovery - - thumb_func_start rfu_CB_CHILD_pollConnectRecovery -rfu_CB_CHILD_pollConnectRecovery: @ 81E1A3C - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E1AC0 - ldr r0, _081E1AD4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x4] - cmp r0, 0 - bne _081E1AC0 - ldr r0, _081E1AD8 @ =gRfuStatic - ldr r1, [r0] - ldrb r1, [r1, 0x5] - adds r6, r0, 0 - cmp r1, 0 - beq _081E1AC0 - ldr r1, _081E1ADC @ =gRfuLinkStatus - ldr r0, [r1] - strb r7, [r0] - movs r4, 0 - adds r5, r1, 0 - mov r12, r4 -_081E1A76: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r4 - lsrs r3, r0, 24 - ldr r2, [r5] - ldr r0, [r6] - ldrb r0, [r0, 0x5] - ands r0, r3 - ldrb r1, [r2, 0x3] - ands r0, r1 - cmp r0, 0 - beq _081E1AB0 - ldrb r1, [r2, 0x2] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2, 0x2] - ldr r1, [r5] - ldrb r0, [r1, 0x3] - bics r0, r3 - strb r0, [r1, 0x3] - ldr r1, [r5] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r0, [r6] - adds r0, 0xA - adds r0, r4 - mov r1, r12 - strb r1, [r0] -_081E1AB0: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E1A76 - ldr r1, [r6] - movs r0, 0 - strb r0, [r1, 0x5] -_081E1AC0: - mov r0, r8 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E1AD4: .4byte gRfuFixed -_081E1AD8: .4byte gRfuStatic -_081E1ADC: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_CHILD_pollConnectRecovery - - thumb_func_start rfu_CHILD_getConnectRecoveryStatus -rfu_CHILD_getConnectRecoveryStatus: @ 81E1AE0 - push {lr} - adds r2, r0, 0 - movs r0, 0xFF - strb r0, [r2] - ldr r0, _081E1B00 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrb r0, [r1] - adds r0, 0x4D - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _081E1B04 - movs r0, 0x10 - b _081E1B0A - .align 2, 0 -_081E1B00: .4byte gRfuFixed -_081E1B04: - ldrb r0, [r1, 0x4] - strb r0, [r2] - movs r0, 0 -_081E1B0A: - pop {r1} - bx r1 - thumb_func_end rfu_CHILD_getConnectRecoveryStatus - - thumb_func_start rfu_REQ_CHILD_endConnectRecovery -rfu_REQ_CHILD_endConnectRecovery: @ 81E1B10 - push {lr} - ldr r0, _081E1B20 @ =rfu_CB_CHILD_pollConnectRecovery - bl STWI_set_Callback_M - bl STWI_send_CPR_EndREQ - pop {r0} - bx r0 - .align 2, 0 -_081E1B20: .4byte rfu_CB_CHILD_pollConnectRecovery - thumb_func_end rfu_REQ_CHILD_endConnectRecovery - - thumb_func_start rfu_STC_fastCopy -rfu_STC_fastCopy: @ 81E1B24 - push {r4-r6,lr} - adds r5, r0, 0 - adds r6, r1, 0 - ldr r3, [r5] - ldr r1, [r6] - subs r2, 0x1 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - beq _081E1B48 - adds r4, r0, 0 -_081E1B3A: - ldrb r0, [r3] - strb r0, [r1] - adds r3, 0x1 - adds r1, 0x1 - subs r2, 0x1 - cmp r2, r4 - bne _081E1B3A -_081E1B48: - str r3, [r5] - str r1, [r6] - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end rfu_STC_fastCopy - - thumb_func_start rfu_REQ_changeMasterSlave -rfu_REQ_changeMasterSlave: @ 81E1B54 - push {lr} - movs r0, 0x1 - bl STWI_read_status - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bne _081E1B74 - ldr r0, _081E1B70 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_MS_ChangeREQ - b _081E1B7C - .align 2, 0 -_081E1B70: .4byte rfu_STC_REQ_callback -_081E1B74: - movs r0, 0x27 - movs r1, 0 - bl rfu_STC_REQ_callback -_081E1B7C: - pop {r0} - bx r0 - thumb_func_end rfu_REQ_changeMasterSlave - - thumb_func_start rfu_getMasterSlave -rfu_getMasterSlave: @ 81E1B80 - push {lr} - movs r0, 0x1 - bl STWI_read_status - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x1 - bne _081E1BAE - ldr r0, _081E1BB4 @ =gRfuState - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0 - beq _081E1BAE - ldrb r0, [r1, 0x6] - cmp r0, 0x27 - beq _081E1BAC - cmp r0, 0x25 - beq _081E1BAC - cmp r0, 0x37 - bne _081E1BAE -_081E1BAC: - movs r2, 0 -_081E1BAE: - adds r0, r2, 0 - pop {r1} - bx r1 - .align 2, 0 -_081E1BB4: .4byte gRfuState - thumb_func_end rfu_getMasterSlave - - thumb_func_start rfu_clearAllSlot -rfu_clearAllSlot: @ 81E1BB8 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - ldr r1, _081E1C3C @ =0x04000208 - ldrh r0, [r1] - mov r8, r0 - movs r0, 0 - strh r0, [r1] - movs r5, 0 - mov r0, sp - adds r0, 0x2 - movs r7, 0 - adds r6, r0, 0 -_081E1BD4: - mov r0, sp - strh r7, [r0] - ldr r0, _081E1C40 @ =gRfuSlotStatusNI - lsls r4, r5, 2 - adds r0, r4, r0 - ldr r1, [r0] - mov r0, sp - ldr r2, _081E1C44 @ =0x01000034 - bl CpuSet - strh r7, [r6] - ldr r0, _081E1C48 @ =gRfuSlotStatusUNI - adds r4, r0 - ldr r1, [r4] - adds r0, r6, 0 - ldr r2, _081E1C4C @ =0x0100000a - bl CpuSet - ldr r3, _081E1C50 @ =gRfuLinkStatus - ldr r0, [r3] - adds r0, 0x10 - adds r0, r5 - movs r1, 0x10 - strb r1, [r0] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _081E1BD4 - ldr r2, [r3] - movs r1, 0 - movs r0, 0x57 - strb r0, [r2, 0xF] - ldr r0, [r3] - strb r1, [r0, 0x4] - ldr r0, [r3] - strb r1, [r0, 0x5] - ldr r0, [r3] - strb r1, [r0, 0x6] - ldr r0, _081E1C54 @ =gRfuStatic - ldr r0, [r0] - strb r1, [r0, 0x2] - ldr r0, _081E1C3C @ =0x04000208 - mov r1, r8 - strh r1, [r0] - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E1C3C: .4byte 0x04000208 -_081E1C40: .4byte gRfuSlotStatusNI -_081E1C44: .4byte 0x01000034 -_081E1C48: .4byte gRfuSlotStatusUNI -_081E1C4C: .4byte 0x0100000a -_081E1C50: .4byte gRfuLinkStatus -_081E1C54: .4byte gRfuStatic - thumb_func_end rfu_clearAllSlot - - thumb_func_start rfu_STC_releaseFrame -rfu_STC_releaseFrame: @ 81E1C58 - push {r4-r6,lr} - adds r4, r2, 0 - lsls r0, 24 - lsrs r2, r0, 24 - adds r5, r2, 0 - lsls r1, 24 - lsrs r3, r1, 24 - ldr r0, _081E1C90 @ =gRfuStatic - ldr r0, [r0] - ldrb r1, [r0] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _081E1C98 - ldr r6, _081E1C94 @ =gRfuLinkStatus - cmp r3, 0 - bne _081E1C84 - ldr r1, [r6] - ldrb r0, [r1, 0xF] - ldrh r4, [r4, 0x2E] - adds r0, r4 - strb r0, [r1, 0xF] -_081E1C84: - ldr r1, [r6] - ldrb r0, [r1, 0xF] - adds r0, 0x3 - strb r0, [r1, 0xF] - b _081E1CB8 - .align 2, 0 -_081E1C90: .4byte gRfuStatic -_081E1C94: .4byte gRfuLinkStatus -_081E1C98: - ldr r6, _081E1CC0 @ =gRfuLinkStatus - cmp r3, 0 - bne _081E1CAC - ldr r1, [r6] - adds r1, 0x10 - adds r1, r2 - ldrb r0, [r1] - ldrh r4, [r4, 0x2E] - adds r0, r4 - strb r0, [r1] -_081E1CAC: - ldr r1, [r6] - adds r1, 0x10 - adds r1, r5 - ldrb r0, [r1] - adds r0, 0x2 - strb r0, [r1] -_081E1CB8: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E1CC0: .4byte gRfuLinkStatus - thumb_func_end rfu_STC_releaseFrame - - thumb_func_start rfu_clearSlot -rfu_clearSlot: @ 81E1CC4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r1, 24 - lsrs r7, r1, 24 - cmp r7, 0x3 - bls _081E1CE4 - movs r0, 0x80 - lsls r0, 3 - b _081E1E5C -_081E1CE4: - movs r0, 0xF - mov r1, r8 - ands r0, r1 - cmp r0, 0 - bne _081E1CF4 - movs r0, 0xC0 - lsls r0, 3 - b _081E1E5C -_081E1CF4: - ldr r1, _081E1D38 @ =0x04000208 - ldrh r0, [r1] - mov r10, r0 - movs r0, 0 - strh r0, [r1] - movs r0, 0xC - mov r2, r8 - ands r0, r2 - cmp r0, 0 - beq _081E1DBC - movs r3, 0 - ldr r1, _081E1D3C @ =gRfuSlotStatusNI - lsls r0, r7, 2 - adds r0, r1 - mov r9, r0 -_081E1D12: - movs r4, 0 - cmp r3, 0 - bne _081E1D44 - movs r0, 0x4 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _081E1D64 - mov r2, r9 - ldr r4, [r2] - ldr r0, _081E1D40 @ =gRfuLinkStatus - ldr r2, [r0] - adds r0, r4, 0 - adds r0, 0x2C - ldrb r1, [r0] - ldrb r0, [r2, 0x4] - bics r0, r1 - strb r0, [r2, 0x4] - b _081E1D64 - .align 2, 0 -_081E1D38: .4byte 0x04000208 -_081E1D3C: .4byte gRfuSlotStatusNI -_081E1D40: .4byte gRfuLinkStatus -_081E1D44: - movs r0, 0x8 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _081E1D64 - mov r2, r9 - ldr r0, [r2] - adds r4, r0, 0 - adds r4, 0x34 - ldr r0, _081E1DF8 @ =gRfuLinkStatus - ldr r2, [r0] - movs r1, 0x1 - lsls r1, r7 - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] -_081E1D64: - adds r6, r3, 0x1 - cmp r4, 0 - beq _081E1DB4 - ldrh r0, [r4] - movs r2, 0x80 - lsls r2, 8 - adds r1, r2, 0 - ands r0, r1 - cmp r0, 0 - beq _081E1DA4 - lsls r1, r3, 24 - lsrs r1, 24 - adds r0, r7, 0 - adds r2, r4, 0 - bl rfu_STC_releaseFrame - movs r1, 0 - adds r2, r4, 0 - adds r2, 0x2C - movs r5, 0x1 - movs r3, 0 -_081E1D8E: - ldrb r0, [r2] - asrs r0, r1 - ands r0, r5 - cmp r0, 0 - beq _081E1D9A - strh r3, [r4, 0x2] -_081E1D9A: - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0x3 - bls _081E1D8E -_081E1DA4: - mov r1, sp - movs r0, 0 - strh r0, [r1] - mov r0, sp - adds r1, r4, 0 - ldr r2, _081E1DFC @ =0x0100001a - bl CpuSet -_081E1DB4: - lsls r0, r6, 16 - lsrs r3, r0, 16 - cmp r3, 0x1 - bls _081E1D12 -_081E1DBC: - movs r0, 0x1 - mov r4, r8 - ands r0, r4 - cmp r0, 0 - beq _081E1E32 - ldr r1, _081E1E00 @ =gRfuSlotStatusUNI - lsls r0, r7, 2 - adds r0, r1 - ldr r3, [r0] - ldrh r1, [r3] - movs r0, 0x80 - lsls r0, 8 - ands r0, r1 - cmp r0, 0 - beq _081E1E24 - ldr r0, _081E1E04 @ =gRfuStatic - ldr r0, [r0] - ldrb r1, [r0] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _081E1E08 - ldr r2, _081E1DF8 @ =gRfuLinkStatus - ldr r1, [r2] - ldrb r0, [r1, 0xF] - adds r0, 0x3 - ldrb r4, [r3, 0x4] - adds r0, r4 - strb r0, [r1, 0xF] - b _081E1E1A - .align 2, 0 -_081E1DF8: .4byte gRfuLinkStatus -_081E1DFC: .4byte 0x0100001a -_081E1E00: .4byte gRfuSlotStatusUNI -_081E1E04: .4byte gRfuStatic -_081E1E08: - ldr r2, _081E1E6C @ =gRfuLinkStatus - ldr r1, [r2] - adds r1, 0x10 - adds r1, r7 - ldrb r0, [r1] - adds r0, 0x2 - ldrb r4, [r3, 0x4] - adds r0, r4 - strb r0, [r1] -_081E1E1A: - ldr r2, [r2] - ldrb r1, [r3, 0x3] - ldrb r0, [r2, 0x6] - bics r0, r1 - strb r0, [r2, 0x6] -_081E1E24: - mov r0, sp - movs r1, 0 - strh r1, [r0] - ldr r2, _081E1E70 @ =0x01000006 - adds r1, r3, 0 - bl CpuSet -_081E1E32: - movs r0, 0x2 - mov r1, r8 - ands r0, r1 - cmp r0, 0 - beq _081E1E54 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r1, _081E1E74 @ =gRfuSlotStatusUNI - lsls r0, r7, 2 - adds r0, r1 - ldr r1, [r0] - adds r1, 0xC - ldr r2, _081E1E78 @ =0x01000004 - mov r0, sp - bl CpuSet -_081E1E54: - ldr r0, _081E1E7C @ =0x04000208 - mov r2, r10 - strh r2, [r0] - movs r0, 0 -_081E1E5C: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E1E6C: .4byte gRfuLinkStatus -_081E1E70: .4byte 0x01000006 -_081E1E74: .4byte gRfuSlotStatusUNI -_081E1E78: .4byte 0x01000004 -_081E1E7C: .4byte 0x04000208 - thumb_func_end rfu_clearSlot - - thumb_func_start rfu_setRecvBuffer -rfu_setRecvBuffer: @ 81E1E80 - push {r4-r6,lr} - adds r5, r2, 0 - adds r6, r3, 0 - lsls r0, 24 - lsrs r3, r0, 24 - adds r2, r3, 0 - lsls r1, 24 - lsrs r1, 24 - adds r4, r1, 0 - cmp r1, 0x3 - bls _081E1E9C - movs r0, 0x80 - lsls r0, 3 - b _081E1ED4 -_081E1E9C: - movs r0, 0x20 - ands r0, r3 - cmp r0, 0 - beq _081E1EB8 - ldr r0, _081E1EB4 @ =gRfuSlotStatusNI - lsls r1, 2 - adds r1, r0 - ldr r0, [r1] - str r5, [r0, 0x68] - str r6, [r0, 0x6C] - b _081E1ED2 - .align 2, 0 -_081E1EB4: .4byte gRfuSlotStatusNI -_081E1EB8: - movs r0, 0x10 - ands r2, r0 - cmp r2, 0 - bne _081E1EC6 - movs r0, 0xC0 - lsls r0, 3 - b _081E1ED4 -_081E1EC6: - ldr r0, _081E1EDC @ =gRfuSlotStatusUNI - lsls r1, r4, 2 - adds r1, r0 - ldr r0, [r1] - str r5, [r0, 0x14] - str r6, [r0, 0x18] -_081E1ED2: - movs r0, 0 -_081E1ED4: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_081E1EDC: .4byte gRfuSlotStatusUNI - thumb_func_end rfu_setRecvBuffer - - thumb_func_start rfu_NI_setSendData -rfu_NI_setSendData: @ 81E1EE0 - push {r4-r6,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - lsls r4, 24 - lsrs r4, 24 - lsls r5, 24 - lsrs r5, 24 - str r3, [sp] - movs r0, 0x20 - adds r1, r4, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl rfu_STC_setSendData_org - lsls r0, 16 - lsrs r0, 16 - add sp, 0x4 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end rfu_NI_setSendData - - thumb_func_start rfu_UNI_setSendData -rfu_UNI_setSendData: @ 81E1F0C - push {lr} - sub sp, 0x4 - adds r3, r1, 0 - lsls r0, 24 - lsrs r1, r0, 24 - lsls r2, 24 - lsrs r2, 24 - ldr r0, _081E1F28 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E1F2C - adds r0, r2, 0x3 - b _081E1F2E - .align 2, 0 -_081E1F28: .4byte gRfuLinkStatus -_081E1F2C: - adds r0, r2, 0x2 -_081E1F2E: - lsls r0, 24 - lsrs r2, r0, 24 - movs r0, 0 - str r0, [sp] - movs r0, 0x10 - bl rfu_STC_setSendData_org - lsls r0, 16 - lsrs r0, 16 - add sp, 0x4 - pop {r1} - bx r1 - thumb_func_end rfu_UNI_setSendData - - thumb_func_start rfu_NI_CHILD_setSendGameName -rfu_NI_CHILD_setSendGameName: @ 81E1F48 - push {lr} - sub sp, 0x4 - adds r2, r1, 0 - lsls r0, 24 - lsrs r0, 24 - lsls r2, 24 - lsrs r2, 24 - movs r1, 0x80 - lsls r1, 17 - lsls r1, r0 - lsrs r1, 24 - ldr r0, _081E1F78 @ =gRfuLinkStatus - ldr r3, [r0] - adds r3, 0x98 - movs r0, 0x1A - str r0, [sp] - movs r0, 0x40 - bl rfu_STC_setSendData_org - lsls r0, 16 - lsrs r0, 16 - add sp, 0x4 - pop {r1} - bx r1 - .align 2, 0 -_081E1F78: .4byte gRfuLinkStatus - thumb_func_end rfu_NI_CHILD_setSendGameName - - thumb_func_start rfu_STC_setSendData_org -rfu_STC_setSendData_org: @ 81E1F7C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - str r3, [sp] - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 24 - lsrs r3, r1, 24 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - ldr r0, _081E1FA8 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2] - mov r10, r0 - cmp r1, 0xFF - bne _081E1FB0 - ldr r0, _081E1FAC @ =0x00000301 - b _081E2166 - .align 2, 0 -_081E1FA8: .4byte gRfuLinkStatus -_081E1FAC: .4byte 0x00000301 -_081E1FB0: - movs r0, 0xF - ands r0, r3 - cmp r0, 0 - bne _081E1FBE - movs r0, 0x80 - lsls r0, 3 - b _081E2166 -_081E1FBE: - ldrb r0, [r2, 0x2] - ldrb r1, [r2, 0x3] - orrs r0, r1 - ands r0, r3 - cmp r0, r3 - beq _081E1FD4 - ldr r0, _081E1FD0 @ =0x00000401 - b _081E2166 - .align 2, 0 -_081E1FD0: .4byte 0x00000401 -_081E1FD4: - movs r0, 0x10 - ands r0, r6 - cmp r0, 0 - beq _081E1FE0 - ldrb r0, [r2, 0x6] - b _081E1FE2 -_081E1FE0: - ldrb r0, [r2, 0x4] -_081E1FE2: - ands r0, r3 - cmp r0, 0 - beq _081E1FF0 - ldr r0, _081E1FEC @ =0x00000402 - b _081E2166 - .align 2, 0 -_081E1FEC: .4byte 0x00000402 -_081E1FF0: - movs r2, 0 - movs r0, 0x1 - ands r0, r3 - ldr r4, _081E2020 @ =_Str_RfuHeader - cmp r0, 0 - bne _081E2012 - movs r1, 0x1 -_081E1FFE: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bhi _081E2012 - adds r0, r3, 0 - asrs r0, r2 - ands r0, r1 - cmp r0, 0 - beq _081E1FFE -_081E2012: - mov r0, r10 - ldr r1, [r0] - ldrb r0, [r1] - cmp r0, 0x1 - bne _081E2024 - adds r1, 0xF - b _081E202E - .align 2, 0 -_081E2020: .4byte _Str_RfuHeader -_081E2024: - cmp r0, 0 - bne _081E2030 - adds r0, r2, 0 - adds r0, 0x10 - adds r1, r0 -_081E202E: - mov r9, r1 -_081E2030: - mov r1, r10 - ldr r0, [r1] - ldrb r0, [r0] - lsls r0, 4 - adds r0, r4 - ldrb r4, [r0] - mov r0, r9 - ldrb r0, [r0] - cmp r8, r0 - bhi _081E2048 - cmp r8, r4 - bhi _081E204E -_081E2048: - movs r0, 0xA0 - lsls r0, 3 - b _081E2166 -_081E204E: - ldr r1, _081E209C @ =0x04000208 - ldrh r0, [r1] - str r0, [sp, 0x4] - movs r7, 0 - strh r7, [r1] - movs r0, 0x20 - ands r0, r6 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - bne _081E2068 - cmp r6, 0x40 - bne _081E2124 -_081E2068: - ldr r1, _081E20A0 @ =gRfuSlotStatusNI - lsls r0, r2, 2 - adds r0, r1 - ldr r0, [r0] - mov r12, r0 - movs r1, 0 - strh r1, [r0, 0x18] - mov r1, r12 - adds r1, 0x2D - mov r2, r12 - str r1, [r2, 0x4] - movs r0, 0x7 - str r0, [r2, 0x14] - mov r0, r12 - adds r0, 0x2C - strb r3, [r0] - strb r3, [r2, 0x1A] - mov r2, r8 - subs r0, r2, r4 - mov r2, r12 - strh r0, [r2, 0x2E] - cmp r5, 0 - beq _081E20A4 - strb r7, [r1] - b _081E20A8 - .align 2, 0 -_081E209C: .4byte 0x04000208 -_081E20A0: .4byte gRfuSlotStatusNI -_081E20A4: - movs r0, 0x1 - strb r0, [r1] -_081E20A8: - ldr r0, [sp, 0x28] - mov r1, r12 - str r0, [r1, 0x30] - ldr r2, [sp] - str r2, [r1, 0x28] - movs r1, 0 - mov r0, r12 - strb r1, [r0, 0x1F] - adds r0, 0x20 - strb r1, [r0] - mov r4, r12 - adds r4, 0x1B - movs r6, 0 - mov r2, r12 - adds r2, 0x21 - movs r5, 0x1 -_081E20C8: - adds r0, r4, r1 - strb r6, [r0] - adds r0, r2, r1 - strb r5, [r0] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x3 - bls _081E20C8 - movs r2, 0 - movs r5, 0x1 - ldr r4, _081E211C @ =gRfuSlotStatusNI - movs r1, 0 -_081E20E2: - adds r0, r3, 0 - asrs r0, r2 - ands r0, r5 - cmp r0, 0 - beq _081E20F4 - lsls r0, r2, 2 - adds r0, r4 - ldr r0, [r0] - strh r1, [r0, 0x2] -_081E20F4: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E20E2 - mov r1, r10 - ldr r2, [r1] - ldrb r1, [r2, 0x4] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2, 0x4] - mov r2, r9 - ldrb r0, [r2] - mov r1, r8 - subs r0, r1 - strb r0, [r2] - ldr r0, _081E2120 @ =0x00008021 - mov r2, r12 - strh r0, [r2] - b _081E215C - .align 2, 0 -_081E211C: .4byte gRfuSlotStatusNI -_081E2120: .4byte 0x00008021 -_081E2124: - movs r0, 0x10 - ands r0, r6 - cmp r0, 0 - beq _081E215C - ldr r1, _081E2178 @ =gRfuSlotStatusUNI - lsls r0, r2, 2 - adds r0, r1 - ldr r1, [r0] - strb r3, [r1, 0x3] - ldr r0, [sp] - str r0, [r1, 0x8] - mov r2, r8 - subs r0, r2, r4 - strh r0, [r1, 0x4] - mov r2, r9 - ldrb r0, [r2] - mov r2, r8 - subs r0, r2 - mov r2, r9 - strb r0, [r2] - ldr r0, _081E217C @ =0x00008024 - strh r0, [r1] - mov r0, r10 - ldr r2, [r0] - ldrb r1, [r2, 0x6] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2, 0x6] -_081E215C: - ldr r0, _081E2180 @ =0x04000208 - mov r1, sp - ldrh r1, [r1, 0x4] - strh r1, [r0] - movs r0, 0 -_081E2166: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E2178: .4byte gRfuSlotStatusUNI -_081E217C: .4byte 0x00008024 -_081E2180: .4byte 0x04000208 - thumb_func_end rfu_STC_setSendData_org - - thumb_func_start rfu_changeSendTarget -rfu_changeSendTarget: @ 81E2184 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - adds r3, r0, 0 - lsls r1, 24 - lsrs r7, r1, 24 - lsls r2, 24 - lsrs r6, r2, 24 - cmp r7, 0x3 - bls _081E21A8 - movs r0, 0x80 - lsls r0, 3 - b _081E22DC -_081E21A8: - cmp r0, 0x20 - bne _081E2248 - ldr r0, _081E2238 @ =gRfuSlotStatusNI - mov r12, r0 - lsls r0, r7, 2 - add r0, r12 - ldr r5, [r0] - ldrh r2, [r5] - ldr r1, _081E223C @ =0x00008020 - adds r0, r1, 0 - ands r0, r2 - cmp r0, r1 - bne _081E225E - ldrb r0, [r5, 0x1A] - adds r3, r6, 0 - eors r3, r0 - adds r2, r3, 0 - ands r2, r6 - cmp r2, 0 - bne _081E2296 - cmp r3, 0 - bne _081E21D6 - b _081E22DA -_081E21D6: - ldr r1, _081E2240 @ =0x04000208 - ldrh r0, [r1] - mov r8, r0 - strh r2, [r1] - movs r2, 0 - mvns r1, r3 - str r1, [sp] - lsls r4, r6, 24 - mov r10, r4 - movs r0, 0x1 - mov r9, r0 - movs r1, 0 -_081E21EE: - adds r0, r3, 0 - asrs r0, r2 - mov r4, r9 - ands r0, r4 - cmp r0, 0 - beq _081E2202 - lsls r0, r2, 2 - add r0, r12 - ldr r0, [r0] - strh r1, [r0, 0x2] -_081E2202: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E21EE - ldr r0, _081E2244 @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1, 0x4] - ldr r2, [sp] - ands r2, r0 - strb r2, [r1, 0x4] - strb r6, [r5, 0x1A] - mov r0, r10 - cmp r0, 0 - bne _081E222E - adds r0, r7, 0 - movs r1, 0 - adds r2, r5, 0 - bl rfu_STC_releaseFrame - movs r0, 0x27 - strh r0, [r5] -_081E222E: - ldr r0, _081E2240 @ =0x04000208 - mov r1, r8 - strh r1, [r0] - b _081E22DA - .align 2, 0 -_081E2238: .4byte gRfuSlotStatusNI -_081E223C: .4byte 0x00008020 -_081E2240: .4byte 0x04000208 -_081E2244: .4byte gRfuLinkStatus -_081E2248: - cmp r3, 0x10 - bne _081E22D4 - ldr r3, _081E2264 @ =gRfuSlotStatusUNI - lsls r1, r7, 2 - adds r0, r1, r3 - ldr r0, [r0] - ldrh r2, [r0] - ldr r0, _081E2268 @ =0x00008024 - adds r5, r3, 0 - cmp r2, r0 - beq _081E2270 -_081E225E: - ldr r0, _081E226C @ =0x00000403 - b _081E22DC - .align 2, 0 -_081E2264: .4byte gRfuSlotStatusUNI -_081E2268: .4byte 0x00008024 -_081E226C: .4byte 0x00000403 -_081E2270: - movs r3, 0 - movs r2, 0 - adds r4, r5, 0 -_081E2276: - cmp r2, r7 - beq _081E2284 - lsls r0, r2, 2 - adds r0, r4 - ldr r0, [r0] - ldrb r0, [r0, 0x3] - orrs r3, r0 -_081E2284: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E2276 - adds r2, r6, 0 - ands r2, r3 - cmp r2, 0 - beq _081E22A0 -_081E2296: - ldr r0, _081E229C @ =0x00000404 - b _081E22DC - .align 2, 0 -_081E229C: .4byte 0x00000404 -_081E22A0: - ldr r3, _081E22CC @ =0x04000208 - ldrh r0, [r3] - mov r8, r0 - strh r2, [r3] - ldr r4, _081E22D0 @ =gRfuLinkStatus - ldr r2, [r4] - adds r5, r1, r5 - ldr r0, [r5] - ldrb r1, [r0, 0x3] - ldrb r0, [r2, 0x6] - bics r0, r1 - strb r0, [r2, 0x6] - ldr r2, [r4] - ldrb r1, [r2, 0x6] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2, 0x6] - ldr r0, [r5] - strb r6, [r0, 0x3] - mov r2, r8 - strh r2, [r3] - b _081E22DA - .align 2, 0 -_081E22CC: .4byte 0x04000208 -_081E22D0: .4byte gRfuLinkStatus -_081E22D4: - movs r0, 0xC0 - lsls r0, 3 - b _081E22DC -_081E22DA: - movs r0, 0 -_081E22DC: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_changeSendTarget - - thumb_func_start rfu_NI_stopReceivingData -rfu_NI_stopReceivingData: @ 81E22EC - push {r4,r5,lr} - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x3 - bls _081E22FC - movs r0, 0x80 - lsls r0, 3 - b _081E2356 -_081E22FC: - ldr r1, _081E2328 @ =gRfuSlotStatusNI - lsls r0, r3, 2 - adds r0, r1 - ldr r2, [r0] - adds r5, r2, 0 - adds r5, 0x34 - ldr r1, _081E232C @ =0x04000208 - ldrh r0, [r1] - adds r4, r0, 0 - movs r0, 0 - strh r0, [r1] - ldrh r1, [r2, 0x34] - movs r0, 0x80 - lsls r0, 8 - ands r0, r1 - cmp r0, 0 - beq _081E2350 - ldr r0, _081E2330 @ =0x00008043 - cmp r1, r0 - bne _081E2334 - movs r0, 0x48 - b _081E2336 - .align 2, 0 -_081E2328: .4byte gRfuSlotStatusNI -_081E232C: .4byte 0x04000208 -_081E2330: .4byte 0x00008043 -_081E2334: - movs r0, 0x47 -_081E2336: - strh r0, [r2, 0x34] - ldr r0, _081E235C @ =gRfuLinkStatus - ldr r2, [r0] - movs r1, 0x1 - lsls r1, r3 - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] - adds r0, r3, 0 - movs r1, 0x1 - adds r2, r5, 0 - bl rfu_STC_releaseFrame -_081E2350: - ldr r0, _081E2360 @ =0x04000208 - strh r4, [r0] - movs r0, 0 -_081E2356: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_081E235C: .4byte gRfuLinkStatus -_081E2360: .4byte 0x04000208 - thumb_func_end rfu_NI_stopReceivingData - - thumb_func_start rfu_UNI_changeAndReadySendData -rfu_UNI_changeAndReadySendData: @ 81E2364 - push {r4-r7,lr} - adds r7, r1, 0 - lsls r0, 24 - lsrs r0, 24 - adds r3, r0, 0 - lsls r2, 24 - lsrs r5, r2, 24 - cmp r0, 0x3 - bls _081E237C - movs r0, 0x80 - lsls r0, 3 - b _081E23F0 -_081E237C: - ldr r1, _081E2390 @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r4, [r0] - ldrh r1, [r4] - ldr r0, _081E2394 @ =0x00008024 - cmp r1, r0 - beq _081E239C - ldr r0, _081E2398 @ =0x00000403 - b _081E23F0 - .align 2, 0 -_081E2390: .4byte gRfuSlotStatusUNI -_081E2394: .4byte 0x00008024 -_081E2398: .4byte 0x00000403 -_081E239C: - ldr r0, _081E23B0 @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1] - cmp r0, 0x1 - bne _081E23B4 - adds r6, r1, 0 - adds r6, 0xF - ldrb r0, [r4, 0x4] - ldrb r1, [r1, 0xF] - b _081E23C2 - .align 2, 0 -_081E23B0: .4byte gRfuLinkStatus -_081E23B4: - adds r0, r3, 0 - adds r0, 0x10 - adds r6, r1, r0 - adds r1, 0x10 - adds r1, r3 - ldrb r0, [r4, 0x4] - ldrb r1, [r1] -_081E23C2: - adds r0, r1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, r5 - bcc _081E23EC - ldr r2, _081E23E8 @ =0x04000208 - ldrh r1, [r2] - movs r0, 0 - strh r0, [r2] - str r7, [r4, 0x8] - subs r0, r3, r5 - strb r0, [r6] - strh r5, [r4, 0x4] - movs r0, 0x1 - strb r0, [r4, 0x2] - strh r1, [r2] - movs r0, 0 - b _081E23F0 - .align 2, 0 -_081E23E8: .4byte 0x04000208 -_081E23EC: - movs r0, 0xA0 - lsls r0, 3 -_081E23F0: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_UNI_changeAndReadySendData - - thumb_func_start rfu_UNI_readySendData -rfu_UNI_readySendData: @ 81E23F8 - push {lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _081E2416 - ldr r1, _081E241C @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r2, [r0] - ldrh r1, [r2] - ldr r0, _081E2420 @ =0x00008024 - cmp r1, r0 - bne _081E2416 - movs r0, 0x1 - strb r0, [r2, 0x2] -_081E2416: - pop {r0} - bx r0 - .align 2, 0 -_081E241C: .4byte gRfuSlotStatusUNI -_081E2420: .4byte 0x00008024 - thumb_func_end rfu_UNI_readySendData - - thumb_func_start rfu_UNI_clearRecvNewDataFlag -rfu_UNI_clearRecvNewDataFlag: @ 81E2424 - push {lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _081E243A - ldr r1, _081E2440 @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - movs r0, 0 - strb r0, [r1, 0x12] -_081E243A: - pop {r0} - bx r0 - .align 2, 0 -_081E2440: .4byte gRfuSlotStatusUNI - thumb_func_end rfu_UNI_clearRecvNewDataFlag - - thumb_func_start rfu_REQ_sendData -rfu_REQ_sendData: @ 81E2444 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _081E2490 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2] - adds r4, r0, 0 - cmp r1, 0xFF - bne _081E2458 - b _081E257E -_081E2458: - cmp r1, 0x1 - bne _081E24E8 - ldrb r0, [r2, 0x4] - ldrb r1, [r2, 0x5] - adds r3, r0, 0 - orrs r3, r1 - ldrb r0, [r2, 0x6] - orrs r3, r0 - cmp r3, 0 - bne _081E24E8 - ldr r0, _081E2494 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2, 0x3] - adds r4, r0, 0 - cmp r1, 0 - beq _081E2480 - movs r0, 0x10 - strb r0, [r2, 0x8] - ldr r0, [r4] - strb r3, [r0, 0x7] -_081E2480: - ldr r1, [r4] - ldrb r0, [r1, 0x8] - cmp r0, 0 - beq _081E2498 - subs r0, 0x1 - strb r0, [r1, 0x8] - b _081E249E - .align 2, 0 -_081E2490: .4byte gRfuLinkStatus -_081E2494: .4byte gRfuStatic -_081E2498: - ldrb r0, [r1, 0x7] - adds r0, 0x1 - strb r0, [r1, 0x7] -_081E249E: - ldr r1, [r4] - ldrb r0, [r1, 0x8] - cmp r0, 0 - bne _081E24B0 - ldrb r1, [r1, 0x7] - movs r0, 0xF - ands r0, r1 - cmp r0, 0 - bne _081E2542 -_081E24B0: - ldr r4, _081E24D4 @ =gRfuFixed - ldr r1, [r4] - movs r0, 0x1 - str r0, [r1, 0x68] - movs r0, 0xFF - str r0, [r1, 0x78] - ldr r0, _081E24D8 @ =rfu_CB_sendData3 - bl STWI_set_Callback_M - cmp r5, 0 - bne _081E24DC - ldr r0, [r4] - adds r0, 0x68 - movs r1, 0x1 - bl STWI_send_DataTxREQ - b _081E257E - .align 2, 0 -_081E24D4: .4byte gRfuFixed -_081E24D8: .4byte rfu_CB_sendData3 -_081E24DC: - ldr r0, [r4] - adds r0, 0x68 - movs r1, 0x1 - bl STWI_send_DataTxAndChangeREQ - b _081E257E -_081E24E8: - ldr r0, [r4] - ldrb r0, [r0, 0xE] - cmp r0, 0 - bne _081E24F4 - bl rfu_constructSendLLFrame -_081E24F4: - ldr r0, [r4] - ldrb r0, [r0, 0xE] - cmp r0, 0 - beq _081E2542 - ldr r0, _081E2520 @ =rfu_CB_sendData - bl STWI_set_Callback_M - cmp r5, 0 - beq _081E252C - ldr r0, _081E2524 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0x68 - ldr r1, _081E2528 @ =gRfuStatic - ldr r1, [r1] - ldr r1, [r1, 0x24] - adds r1, 0x4 - lsls r1, 24 - lsrs r1, 24 - bl STWI_send_DataTxAndChangeREQ - b _081E257E - .align 2, 0 -_081E2520: .4byte rfu_CB_sendData -_081E2524: .4byte gRfuFixed -_081E2528: .4byte gRfuStatic -_081E252C: - ldr r0, _081E2564 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0x68 - ldr r1, _081E2568 @ =gRfuStatic - ldr r1, [r1] - ldr r1, [r1, 0x24] - adds r1, 0x4 - lsls r1, 24 - lsrs r1, 24 - bl STWI_send_DataTxREQ -_081E2542: - cmp r5, 0 - beq _081E257E - ldr r0, _081E256C @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E2574 - ldr r0, _081E2570 @ =gRfuState - ldr r0, [r0] - ldr r1, [r0, 0x1C] - cmp r1, 0 - beq _081E257E - movs r0, 0x27 - bl _call_via_r1 - b _081E257E - .align 2, 0 -_081E2564: .4byte gRfuFixed -_081E2568: .4byte gRfuStatic -_081E256C: .4byte gRfuLinkStatus -_081E2570: .4byte gRfuState -_081E2574: - ldr r0, _081E2584 @ =rfu_CB_sendData2 - bl STWI_set_Callback_M - bl STWI_send_MS_ChangeREQ -_081E257E: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E2584: .4byte rfu_CB_sendData2 - thumb_func_end rfu_REQ_sendData - - thumb_func_start rfu_CB_sendData -rfu_CB_sendData: @ 81E2588 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E25F2 - movs r6, 0 - ldr r0, _081E2610 @ =0x00008020 - mov r8, r0 -_081E259C: - ldr r0, _081E2614 @ =gRfuSlotStatusUNI - lsls r2, r6, 2 - adds r0, r2, r0 - ldr r1, [r0] - ldrb r0, [r1, 0x2] - cmp r0, 0 - beq _081E25AE - movs r0, 0 - strb r0, [r1, 0x2] -_081E25AE: - ldr r0, _081E2618 @ =gRfuSlotStatusNI - adds r0, r2, r0 - ldr r4, [r0] - ldrh r0, [r4] - cmp r0, r8 - bne _081E25E8 - adds r0, r6, 0 - movs r1, 0 - adds r2, r4, 0 - bl rfu_STC_releaseFrame - ldr r5, _081E261C @ =gRfuLinkStatus - ldr r2, [r5] - ldrb r1, [r4, 0x1A] - ldrb r0, [r2, 0x4] - bics r0, r1 - strb r0, [r2, 0x4] - adds r0, r4, 0 - adds r0, 0x2D - ldrb r3, [r0] - cmp r3, 0x1 - bne _081E25E4 - ldr r1, [r5] - lsls r3, r6 - ldrb r0, [r1, 0x7] - orrs r3, r0 - strb r3, [r1, 0x7] -_081E25E4: - movs r0, 0x26 - strh r0, [r4] -_081E25E8: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bls _081E259C -_081E25F2: - ldr r0, _081E261C @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1, 0xE] - movs r0, 0 - strb r0, [r1, 0xE] - movs r0, 0x24 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2610: .4byte 0x00008020 -_081E2614: .4byte gRfuSlotStatusUNI -_081E2618: .4byte gRfuSlotStatusNI -_081E261C: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_sendData - - thumb_func_start rfu_CB_sendData2 -rfu_CB_sendData2: @ 81E2620 - push {lr} - lsls r1, 16 - lsrs r1, 16 - movs r0, 0x24 - bl rfu_STC_REQ_callback - pop {r0} - bx r0 - thumb_func_end rfu_CB_sendData2 - - thumb_func_start rfu_CB_sendData3 -rfu_CB_sendData3: @ 81E2630 - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 16 - lsrs r1, 16 - cmp r1, 0 - beq _081E2646 - movs r0, 0x24 - bl rfu_STC_REQ_callback - b _081E2652 -_081E2646: - cmp r0, 0xFF - bne _081E2652 - movs r0, 0xFF - movs r1, 0 - bl rfu_STC_REQ_callback -_081E2652: - pop {r0} - bx r0 - thumb_func_end rfu_CB_sendData3 - - thumb_func_start rfu_constructSendLLFrame -rfu_constructSendLLFrame: @ 81E2658 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - ldr r0, _081E2704 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2] - cmp r0, 0xFF - bne _081E2670 - b _081E2774 -_081E2670: - ldrb r0, [r2, 0x4] - ldrb r1, [r2, 0x5] - orrs r0, r1 - ldrb r1, [r2, 0x6] - orrs r0, r1 - cmp r0, 0 - beq _081E2774 - ldrb r0, [r2, 0xE] - movs r0, 0 - strb r0, [r2, 0xE] - mov r8, r0 - ldr r0, _081E2708 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0x6C - str r0, [sp] - movs r6, 0 - movs r0, 0x80 - lsls r0, 8 - mov r9, r0 - ldr r1, _081E270C @ =0x00008024 - mov r10, r1 -_081E269A: - movs r5, 0 - ldr r0, _081E2710 @ =gRfuSlotStatusNI - lsls r7, r6, 2 - adds r4, r7, r0 - ldr r2, [r4] - ldrh r1, [r2] - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _081E26BA - adds r0, r6, 0 - mov r1, sp - bl rfu_STC_NI_constructLLSF - lsls r0, 16 - lsrs r5, r0, 16 -_081E26BA: - ldr r2, [r4] - ldrh r1, [r2, 0x34] - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _081E26D6 - adds r2, 0x34 - adds r0, r6, 0 - mov r1, sp - bl rfu_STC_NI_constructLLSF - lsls r0, 16 - lsrs r0, 16 - adds r5, r0 -_081E26D6: - ldr r0, _081E2714 @ =gRfuSlotStatusUNI - adds r0, r7, r0 - ldr r0, [r0] - ldrh r0, [r0] - cmp r0, r10 - bne _081E26F0 - adds r0, r6, 0 - mov r1, sp - bl rfu_STC_UNI_constructLLSF - lsls r0, 16 - lsrs r0, 16 - adds r5, r0 -_081E26F0: - cmp r5, 0 - beq _081E2724 - ldr r0, _081E2704 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E2718 - add r8, r5 - b _081E2724 - .align 2, 0 -_081E2704: .4byte gRfuLinkStatus -_081E2708: .4byte gRfuFixed -_081E270C: .4byte 0x00008024 -_081E2710: .4byte gRfuSlotStatusNI -_081E2714: .4byte gRfuSlotStatusUNI -_081E2718: - adds r0, r7, r6 - adds r0, 0x8 - lsls r5, r0 - mov r2, r8 - orrs r2, r5 - mov r8, r2 -_081E2724: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bls _081E269A - ldr r6, _081E2784 @ =gRfuStatic - mov r0, r8 - cmp r0, 0 - beq _081E276E - ldr r2, [sp] - movs r0, 0x3 - ands r0, r2 - ldr r5, _081E2788 @ =gRfuLinkStatus - ldr r1, _081E278C @ =gRfuFixed - cmp r0, 0 - beq _081E2756 - movs r4, 0 - movs r3, 0x3 -_081E2748: - strb r4, [r2] - adds r0, r2, 0x1 - str r0, [sp] - adds r2, r0, 0 - ands r0, r3 - cmp r0, 0 - bne _081E2748 -_081E2756: - ldr r0, [r1] - mov r2, r8 - str r2, [r0, 0x68] - ldr r0, [r5] - ldrb r0, [r0] - cmp r0, 0 - bne _081E276E - ldr r0, [sp] - subs r0, 0x6C - ldr r1, [r1] - subs r0, r1 - mov r8, r0 -_081E276E: - ldr r0, [r6] - mov r1, r8 - str r1, [r0, 0x24] -_081E2774: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2784: .4byte gRfuStatic -_081E2788: .4byte gRfuLinkStatus -_081E278C: .4byte gRfuFixed - thumb_func_end rfu_constructSendLLFrame - - thumb_func_start rfu_STC_NI_constructLLSF -rfu_STC_NI_constructLLSF: @ 81E2790 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - mov r12, r1 - adds r4, r2, 0 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldr r2, _081E280C @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r0, [r0] - lsls r0, 4 - ldr r1, _081E2810 @ =_Str_RfuHeader - adds r0, r1 - mov r8, r0 - ldrh r1, [r4] - ldr r0, _081E2814 @ =0x00008022 - cmp r1, r0 - bne _081E27FA - adds r3, r4, 0 - adds r3, 0x20 - ldrb r1, [r3] - lsls r1, 2 - adds r5, r4, 0x4 - adds r1, r5, r1 - ldr r2, [r4, 0x28] - ldr r0, [r4, 0x30] - adds r2, r0 - ldr r0, [r1] - adds r6, r3, 0 - cmp r0, r2 - bcc _081E27FA - movs r7, 0 -_081E27D8: - ldrb r0, [r3] - adds r0, 0x1 - strb r0, [r3] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bne _081E27E8 - strb r7, [r6] -_081E27E8: - ldrb r1, [r3] - lsls r1, 2 - adds r1, r5, r1 - ldr r2, [r4, 0x28] - ldr r0, [r4, 0x30] - adds r2, r0 - ldr r0, [r1] - cmp r0, r2 - bcs _081E27D8 -_081E27FA: - ldrh r1, [r4] - movs r0, 0x40 - ands r0, r1 - mov r9, r1 - cmp r0, 0 - beq _081E2818 - movs r5, 0 - b _081E285C - .align 2, 0 -_081E280C: .4byte gRfuLinkStatus -_081E2810: .4byte _Str_RfuHeader -_081E2814: .4byte 0x00008022 -_081E2818: - ldr r0, _081E2844 @ =0x00008022 - cmp r9, r0 - bne _081E284C - adds r3, r4, 0 - adds r3, 0x20 - ldrb r0, [r3] - lsls r0, 2 - adds r1, r4, 0x4 - adds r1, r0 - ldrh r7, [r4, 0x2E] - ldr r5, [r1] - adds r2, r5, r7 - ldr r1, [r4, 0x28] - ldr r0, [r4, 0x30] - adds r0, r1, r0 - adds r6, r3, 0 - cmp r2, r0 - bls _081E2848 - subs r0, r5 - lsls r0, 16 - lsrs r5, r0, 16 - b _081E2860 - .align 2, 0 -_081E2844: .4byte 0x00008022 -_081E2848: - adds r5, r7, 0 - b _081E2860 -_081E284C: - ldrh r2, [r4, 0x2E] - ldr r0, [r4, 0x14] - cmp r0, r2 - bcc _081E2858 - adds r5, r2, 0 - b _081E285C -_081E2858: - lsls r0, 16 - lsrs r5, r0, 16 -_081E285C: - adds r6, r4, 0 - adds r6, 0x20 -_081E2860: - movs r3, 0xF - mov r0, r9 - ands r3, r0 - mov r1, r8 - ldrb r1, [r1, 0x3] - lsls r3, r1 - ldrb r0, [r4, 0x1F] - mov r2, r8 - ldrb r2, [r2, 0x4] - lsls r0, r2 - orrs r3, r0 - ldrb r1, [r6] - adds r0, r1, 0 - mov r7, r8 - ldrb r7, [r7, 0x5] - lsls r0, r7 - orrs r3, r0 - adds r0, r4, 0 - adds r0, 0x21 - adds r0, r1 - ldrb r0, [r0] - mov r1, r8 - ldrb r1, [r1, 0x6] - lsls r0, r1 - orrs r3, r0 - orrs r3, r5 - str r3, [sp] - ldr r2, _081E291C @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E28A8 - ldrb r0, [r4, 0x1A] - lsls r0, 18 - orrs r3, r0 - str r3, [sp] -_081E28A8: - mov r2, sp - movs r3, 0 - mov r7, r8 - ldrb r7, [r7] - cmp r3, r7 - bcs _081E28D2 -_081E28B4: - mov r0, r12 - ldr r1, [r0] - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r1, 0x1 - mov r7, r12 - str r1, [r7] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - mov r0, r8 - ldrb r0, [r0] - cmp r3, r0 - bcc _081E28B4 -_081E28D2: - cmp r5, 0 - beq _081E28F2 - ldrb r1, [r6] - lsls r1, 2 - adds r0, r4, 0x4 - adds r0, r1 - ldr r0, [r0] - str r0, [sp, 0x4] - ldr r0, _081E2920 @ =gRfuFixed - ldr r1, [r0] - add r0, sp, 0x4 - ldr r3, [r1, 0x4] - mov r1, r12 - adds r2, r5, 0 - bl _call_via_r3 -_081E28F2: - ldrh r1, [r4] - ldr r0, _081E2924 @ =0x00008022 - cmp r1, r0 - bne _081E290C - ldrb r0, [r6] - adds r0, 0x1 - strb r0, [r6] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bne _081E290C - movs r0, 0 - strb r0, [r6] -_081E290C: - ldr r0, _081E291C @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r1, [r2] - cmp r1, 0x1 - bne _081E2928 - ldrb r0, [r2, 0xE] - strb r1, [r2, 0xE] - b _081E2936 - .align 2, 0 -_081E291C: .4byte gRfuLinkStatus -_081E2920: .4byte gRfuFixed -_081E2924: .4byte 0x00008022 -_081E2928: - movs r0, 0x1 - mov r1, r10 - lsls r0, r1 - ldrb r1, [r2, 0xE] - orrs r0, r1 - ldrb r1, [r2, 0xE] - strb r0, [r2, 0xE] -_081E2936: - mov r2, r8 - ldrb r0, [r2] - adds r0, r5, r0 - lsls r0, 16 - lsrs r0, 16 - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_STC_NI_constructLLSF - - thumb_func_start rfu_STC_UNI_constructLLSF -rfu_STC_UNI_constructLLSF: @ 81E2950 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x8 - adds r6, r1, 0 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - ldr r1, _081E2978 @ =gRfuSlotStatusUNI - lsls r0, 2 - adds r0, r1 - ldr r4, [r0] - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _081E2974 - ldrb r0, [r4, 0x3] - cmp r0, 0 - bne _081E297C -_081E2974: - movs r0, 0 - b _081E2A18 - .align 2, 0 -_081E2978: .4byte gRfuSlotStatusUNI -_081E297C: - ldr r0, _081E29F4 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2] - lsls r0, 4 - ldr r1, _081E29F8 @ =_Str_RfuHeader - adds r5, r0, r1 - ldrh r0, [r4] - movs r1, 0xF - ands r1, r0 - ldrb r0, [r5, 0x3] - lsls r1, r0 - ldrh r0, [r4, 0x4] - orrs r1, r0 - str r1, [sp] - ldrb r0, [r2] - cmp r0, 0x1 - bne _081E29A6 - ldrb r0, [r4, 0x3] - lsls r0, 18 - orrs r1, r0 - str r1, [sp] -_081E29A6: - mov r2, sp - movs r3, 0 - ldr r1, _081E29FC @ =gRfuFixed - mov r12, r1 - add r7, sp, 0x4 - ldrb r0, [r5] - cmp r3, r0 - bcs _081E29CE -_081E29B6: - ldr r1, [r6] - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r1, 0x1 - str r1, [r6] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - ldrb r1, [r5] - cmp r3, r1 - bcc _081E29B6 -_081E29CE: - ldr r0, [r4, 0x8] - str r0, [sp, 0x4] - mov r2, r12 - ldr r0, [r2] - ldrh r2, [r4, 0x4] - ldr r3, [r0, 0x4] - adds r0, r7, 0 - adds r1, r6, 0 - bl _call_via_r3 - ldr r0, _081E29F4 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2] - cmp r0, 0x1 - bne _081E2A00 - ldrb r0, [r2, 0xE] - movs r0, 0x10 - b _081E2A0C - .align 2, 0 -_081E29F4: .4byte gRfuLinkStatus -_081E29F8: .4byte _Str_RfuHeader -_081E29FC: .4byte gRfuFixed -_081E2A00: - movs r0, 0x10 - mov r1, r8 - lsls r0, r1 - ldrb r1, [r2, 0xE] - orrs r0, r1 - ldrb r1, [r2, 0xE] -_081E2A0C: - strb r0, [r2, 0xE] - ldrh r0, [r4, 0x4] - ldrb r5, [r5] - adds r0, r5 - lsls r0, 16 - lsrs r0, 16 -_081E2A18: - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end rfu_STC_UNI_constructLLSF - - thumb_func_start rfu_REQ_recvData -rfu_REQ_recvData: @ 81E2A24 - push {r4,lr} - ldr r0, _081E2A58 @ =gRfuLinkStatus - ldr r4, [r0] - ldrb r0, [r4] - cmp r0, 0xFF - beq _081E2A50 - ldr r2, _081E2A5C @ =gRfuStatic - ldr r3, [r2] - ldrb r0, [r4, 0x4] - ldrb r1, [r4, 0x5] - orrs r0, r1 - ldrb r1, [r4, 0x6] - orrs r0, r1 - movs r1, 0 - strb r0, [r3, 0x3] - ldr r0, [r2] - strb r1, [r0, 0x4] - ldr r0, _081E2A60 @ =rfu_CB_recvData - bl STWI_set_Callback_M - bl STWI_send_DataRxREQ -_081E2A50: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081E2A58: .4byte gRfuLinkStatus -_081E2A5C: .4byte gRfuStatic -_081E2A60: .4byte rfu_CB_recvData - thumb_func_end rfu_REQ_recvData - - thumb_func_start rfu_CB_recvData -rfu_CB_recvData: @ 81E2A64 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E2B28 - ldr r0, _081E2AA0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x1] - cmp r0, 0 - beq _081E2B28 - ldr r0, _081E2AA4 @ =gRfuStatic - ldr r0, [r0] - strb r7, [r0, 0x1] - ldr r0, _081E2AA8 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E2AAC - bl rfu_STC_PARENT_analyzeRecvPacket - b _081E2AB0 - .align 2, 0 -_081E2AA0: .4byte gRfuFixed -_081E2AA4: .4byte gRfuStatic -_081E2AA8: .4byte gRfuLinkStatus -_081E2AAC: - bl rfu_STC_CHILD_analyzeRecvPacket -_081E2AB0: - movs r6, 0 - ldr r0, _081E2B40 @ =0x00008043 - mov r8, r0 - ldr r3, _081E2B44 @ =gRfuLinkStatus -_081E2AB8: - ldr r0, _081E2B48 @ =gRfuSlotStatusNI - lsls r1, r6, 2 - adds r1, r0 - ldr r4, [r1] - ldrh r0, [r4, 0x34] - cmp r0, r8 - bne _081E2B0A - ldr r0, _081E2B4C @ =gRfuStatic - ldr r0, [r0] - ldrb r0, [r0, 0x1] - asrs r0, r6 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - bne _081E2B0A - adds r5, r4, 0 - adds r5, 0x34 - adds r0, r4, 0 - adds r0, 0x61 - ldrb r2, [r0] - cmp r2, 0x1 - bne _081E2AEE - ldr r1, [r3] - lsls r2, r6 - ldrb r0, [r1, 0x7] - orrs r2, r0 - strb r2, [r1, 0x7] -_081E2AEE: - adds r0, r6, 0 - movs r1, 0x1 - adds r2, r5, 0 - str r3, [sp] - bl rfu_STC_releaseFrame - ldr r3, [sp] - ldr r2, [r3] - ldrb r1, [r5, 0x1A] - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] - movs r0, 0x46 - strh r0, [r4, 0x34] -_081E2B0A: - adds r0, r6, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bls _081E2AB8 - ldr r0, _081E2B4C @ =gRfuStatic - ldr r1, [r0] - ldrb r0, [r1, 0x4] - cmp r0, 0 - beq _081E2B28 - adds r7, r0, 0 - movs r1, 0xE0 - lsls r1, 3 - adds r0, r1, 0 - orrs r7, r0 -_081E2B28: - mov r0, r9 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2B40: .4byte 0x00008043 -_081E2B44: .4byte gRfuLinkStatus -_081E2B48: .4byte gRfuSlotStatusNI -_081E2B4C: .4byte gRfuStatic - thumb_func_end rfu_CB_recvData - - thumb_func_start rfu_STC_PARENT_analyzeRecvPacket -rfu_STC_PARENT_analyzeRecvPacket: @ 81E2B50 - push {r4-r7,lr} - sub sp, 0x4 - ldr r1, _081E2BE0 @ =gRfuFixed - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldr r0, [r0, 0x4] - lsrs r3, r0, 8 - movs r5, 0 - mov r12, r1 - movs r7, 0x1F - ldr r4, _081E2BE4 @ =gRfuStatic - movs r6, 0x1 -_081E2B6A: - mov r0, sp - adds r1, r0, r5 - adds r0, r3, 0 - ands r0, r7 - strb r0, [r1] - lsrs r3, 5 - cmp r0, 0 - bne _081E2B86 - ldr r0, [r4] - adds r1, r6, 0 - lsls r1, r5 - ldrb r2, [r0, 0x1] - orrs r1, r2 - strb r1, [r0, 0x1] -_081E2B86: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E2B6A - mov r1, r12 - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - adds r6, r0, 0 - adds r6, 0x8 - movs r5, 0 -_081E2B9E: - mov r0, sp - adds r1, r0, r5 - ldrb r0, [r1] - adds r7, r5, 0x1 - cmp r0, 0 - beq _081E2BD0 - adds r4, r1, 0 -_081E2BAC: - ldrb r2, [r4] - adds r0, r5, 0 - adds r1, r6, 0 - bl rfu_STC_analyzeLLSF - lsls r0, 24 - lsrs r0, 24 - adds r6, r0 - ldrb r1, [r4] - subs r1, r0 - strb r1, [r4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _081E2BD0 - lsls r0, r1, 24 - cmp r0, 0 - bne _081E2BAC -_081E2BD0: - lsls r0, r7, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E2B9E - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2BE0: .4byte gRfuFixed -_081E2BE4: .4byte gRfuStatic - thumb_func_end rfu_STC_PARENT_analyzeRecvPacket - - thumb_func_start rfu_STC_CHILD_analyzeRecvPacket -rfu_STC_CHILD_analyzeRecvPacket: @ 81E2BE8 - push {r4-r6,lr} - ldr r0, _081E2C38 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrh r0, [r1, 0x4] - movs r4, 0x7F - ands r4, r0 - adds r5, r1, 0 - adds r5, 0x8 - cmp r4, 0 - bne _081E2C08 - ldr r0, _081E2C3C @ =gRfuStatic - ldr r1, [r0] - movs r0, 0xF - strb r0, [r1, 0x1] -_081E2C08: - movs r0, 0x80 - lsls r0, 8 - adds r6, r0, 0 -_081E2C0E: - cmp r4, 0 - beq _081E2C30 - movs r0, 0 - adds r1, r5, 0 - adds r2, r4, 0 - bl rfu_STC_analyzeLLSF - lsls r0, 16 - lsrs r0, 16 - adds r5, r0 - subs r0, r4, r0 - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r4, 0 - ands r0, r6 - cmp r0, 0 - beq _081E2C0E -_081E2C30: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E2C38: .4byte gRfuFixed -_081E2C3C: .4byte gRfuStatic - thumb_func_end rfu_STC_CHILD_analyzeRecvPacket - thumb_func_start rfu_STC_analyzeLLSF rfu_STC_analyzeLLSF: @ 81E2C40 push {r4-r7,lr} diff --git a/include/librfu.h b/include/librfu.h index 9482b94c4..ff160e207 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -3,6 +3,12 @@ #include "main.h" +/* TODOs: + * - documentation + * - check if any field needs to be volatile + * - decompile librfu_intr.s once arm support is back again + */ + enum { RFU_RESET = 0x10, @@ -134,16 +140,25 @@ struct RfuIntrStruct struct RfuSlotStatusUNI { - u16 sendState; - u8 dataReadyFlag; - u8 bmSlot; - u16 payloadSize; - void *src; // TODO: is it correct? - u16 recvState; - u16 errorCode; - u16 dataSize; - u8 newDataFlag; - u8 dataBlockFlag; + struct + { + struct UNISend + { + u16 state; + u8 dataReadyFlag; + u8 bmSlot; + u16 payloadSize; + const void *src; + } send; + struct UNIRecv + { + u16 state; + u16 errorCode; + u16 dataSize; + u8 newDataFlag; + u8 dataBlockFlag; + } recv; + } sub; void *recvBuffer; u32 recvBufferSize; }; @@ -152,16 +167,15 @@ struct NIComm { u16 state; u16 failCounter; - u32 nowP[4]; // ??? + const u8 *nowP[4]; u32 remainSize; u16 errorCode; u8 bmSlot; - u8 unk_1b; u8 recvAckFlag[4]; u8 ack; u8 phase; - u8 n[4]; // ??? - void *src; + u8 n[4]; + const void *src; u8 bmSlotOrg; u8 dataType; u16 payloadSize; @@ -170,16 +184,19 @@ struct NIComm struct RfuSlotStatusNI { - struct NIComm send; - struct NIComm recv; + struct + { + struct NIComm send; + struct NIComm recv; + } sub; void *recvBuffer; - void *recvBufferSize; + u32 recvBufferSize; }; struct RfuFixed { void (*reqCallback)(u16, u16); - void *fastCopyPtr; + void (*fastCopyPtr)(const u8 **, u8 **, s32); u16 fastCopyBuffer[24]; u32 fastCopyBuffer2[12]; u32 LLFBuffer[29]; @@ -190,7 +207,7 @@ struct RfuStatic { u8 flags; u8 NIEndRecvFlag; - u8 RecvRenewalFlag; + u8 recvRenewalFlag; u8 commExistFlag; u8 recvErrorFlag; u8 recoveryBmSlot; @@ -231,7 +248,7 @@ struct RfuLinkStatus u8 findParentCount; u8 watchInterval; u8 strength[4]; - u8 LLFReadyFlag; + vu8 LLFReadyFlag; u8 remainLLFrameSizeParent; u8 remainLLFrameSizeChild[4]; struct RfuTgtData partner[4]; @@ -275,7 +292,7 @@ void rfu_REQ_sendData(u8); void rfu_setMSCCallback(void (*func)(u16)); void rfu_setREQCallback(void (*func)(u16, u16)); bool8 rfu_getMasterSlave(void); -void rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); +s32 rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); u16 rfu_syncVBlank(void); void rfu_REQ_reset(void); void rfu_REQ_configSystem(u16, u8, u8); @@ -296,24 +313,24 @@ void rfu_REQ_changeMasterSlave(void); void rfu_REQ_RFUStatus(void); u32 rfu_getRFUStatus(u8 *status); struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void); -u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); -void rfu_clearSlot(u8 a0, u8 a1); +s32 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); +s32 rfu_clearSlot(u8 a0, u8 a1); void rfu_clearAllSlot(void); -bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); +u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); u16 rfu_getConnectParentStatus(u8 *status, u8 *a1); bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0); void rfu_REQ_disconnect(u8 who); -void rfu_changeSendTarget(u8 a0, u8 who, u8 a2); -void rfu_NI_stopReceivingData(u8 who); +s32 rfu_changeSendTarget(u8 a0, u8 who, u8 a2); +s32 rfu_NI_stopReceivingData(u8 who); u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_setTimerInterrupt(u8 which, IntrFunc *intr); -void rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); -bool16 rfu_UNI_setSendData(u8 flag, void *ptr, u8 size); +s32 rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); +s32 rfu_UNI_setSendData(u8 flag, const void *ptr, u8 size); void rfu_REQ_recvData(void); void rfu_UNI_readySendData(u8 a0); void rfu_UNI_clearRecvNewDataFlag(u8 a0); void rfu_REQ_PARENT_resumeRetransmitAndChange(void); -void rfu_NI_setSendData(u8, u8, const void *, u32); +s32 rfu_NI_setSendData(u8, u8, const void *, u32); // librfu_intr void IntrSIO32(void); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 96f4e9519..3bfa3b601 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -11,17 +11,31 @@ void rfu_CB_startSearchParent(u8, u16); void rfu_CB_pollSearchParent(u8, u16); void rfu_CB_pollConnectParent(u8, u16); void rfu_CB_pollConnectParent(u8, u16); +void rfu_CB_disconnect(u8, u16); +void rfu_CB_CHILD_pollConnectRecovery(u8, u16); +void rfu_CB_sendData(UNUSED u8, u16); +void rfu_CB_sendData2(UNUSED u8, u16); +void rfu_CB_sendData3(u8, u16); +void rfu_CB_recvData(u8, u16); s32 sub_81E349C(u8); void rfu_enableREQCallback(bool8); void rfu_STC_readChildList(void); void rfu_STC_readParentCandidateList(void); void rfu_STC_REQ_callback(u8, u16); void rfu_STC_removeLinkData(u8, u8); -void rfu_STC_fastCopy(u8 **a1, u8 **a2, s32 a3); +void rfu_STC_fastCopy(const u8 **, u8 **, s32); void rfu_STC_clearLinkStatus(u8); void rfu_NI_checkCommFailCounter(void); +u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32); +void rfu_constructSendLLFrame(void); +u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); +u16 rfu_STC_UNI_constructLLSF(u8, u8 **); +void rfu_STC_PARENT_analyzeRecvPacket(void); +void rfu_STC_CHILD_analyzeRecvPacket(void); +u16 rfu_STC_analyzeLLSF(u8, u8 *, u16); extern const char _Str_RFU_MBOOT[]; +extern const u8 _Str_RfuHeader[]; struct RfuStruct *gRfuState; ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; @@ -89,7 +103,7 @@ u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, b // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy for (r3 = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --r3; r3 != 0xFFFF; --r3) *dst++ = *src++; - gRfuFixed->fastCopyPtr = (u8 *)gRfuFixed->fastCopyBuffer + 1; + gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1; return 0; } @@ -734,3 +748,1080 @@ u16 rfu_syncVBlank(void) --gRfuStatic->watchdogTimer; return 0; } + +s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) +{ + u8 sp08 = 0; + u8 sp0C = 0; + u8 i; + s32 sp10, sp14; + u8 *r2; + u8 r9, r6, r3, r1, r0; + + *r8 = 0; + *sp00 = 0; + *sp04 = 0; + if (gRfuLinkStatus->connMode == 0xFF || gRfuState->msMode == 0) + return 0; + if (gRfuStatic->flags & 4) + gRfuStatic->watchdogTimer = 360; + if (gRfuStatic->nowWatchInterval == 0) + { + gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval; + sp08 = 1; + } + if ((u8)r5 == 41) + { + u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + + *r8 = r1[4]; + *sp00 = r1[5]; + if (*sp00 == 1) + *r8 = gRfuLinkStatus->connSlotFlag; + sp08 = 2; + } + else + { + if (r5 == 310) + { + r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; + r6 ^= gRfuLinkStatus->connSlotFlag; + *r8 = r6 & gRfuLinkStatus->connSlotFlag; + *sp00 = 1; + for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + { + if ((*r8 >> i) & 1) + { + gRfuLinkStatus->strength[i] = 0; + rfu_STC_removeLinkData(i, 0); + } + } + } + if (sp08 == 0) + return 0; + } + sp10 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; + sp14 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_LinkStatusREQ(); + sp0C = STWI_poll_CommandEnd(); + if (sp0C == 0) + { + r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + gRfuLinkStatus->strength[i] = *r2++; + r9 = 0; + i = 0; + } + else + { + rfu_STC_REQ_callback(17, sp0C); + return sp0C; + } + for (; i < 4; ++i) + { + r6 = 1 << i; + if (sp0C == 0) + { + if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6)) + { + if (gRfuLinkStatus->strength[i] == 0) + { + if (gRfuLinkStatus->connMode == 1) + { + ++gRfuStatic->linkEmergencyFlag[i]; + if (gRfuStatic->linkEmergencyFlag[i] > 3) + { + *r8 |= r6; + *sp00 = sp08; // why not directly use 1? + } + } + else + { + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + { + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + { + *r8 |= r6; + *sp00 = sp08; + } + else + { + if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->unk_1a) + { + gRfuStatic->linkEmergencyFlag[i] = 0; + STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); + STWI_poll_CommandEnd(); + *r8 |= r6; + *sp00 = sp08; // why not directly use 1? + } + } + } + } + } + else + { + gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? + } + } + if (gRfuLinkStatus->connMode == 1 && gRfuLinkStatus->strength[i] != 0) + { + if (r6 & gRfuLinkStatus->linkLossSlotFlag) + { + if (gRfuLinkStatus->strength[i] > 10) + { + *sp04 |= r6; + gRfuLinkStatus->connSlotFlag |= r6; + gRfuLinkStatus->linkLossSlotFlag &= ~r6; + ++gRfuLinkStatus->connCount; + gRfuStatic->linkEmergencyFlag[i] = 0; + } + else + { + gRfuLinkStatus->strength[i] = 0; + } + } + else + { + if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r6)) + { + STWI_send_SlotStatusREQ(); + STWI_poll_CommandEnd(); + r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + r3 = r2[1] - 1; + for (r2 += 8; r3 != 0; r2 += 4, --r3) + { + u16 r4 = *(u16 *)r2; + + if (r2[2] == i && r4 == gRfuStatic->cidBak[i]) + { + r9 |= 1 << i; + break; + } + } + } + } + } + } + r1 = gRfuLinkStatus->connSlotFlag; + r0 = *r8; + r0 &= r1; + if (r6 & r0) + rfu_STC_removeLinkData(i, 0); + } + if (r9 != 0) + { + STWI_send_DisconnectREQ(r9); + STWI_poll_CommandEnd(); + } + // equivalent to: + // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = sp10; + *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = sp10; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = sp14; + return 0; +} + +void rfu_STC_removeLinkData(u8 r7, u8 r12) +{ + u8 r5 = 1 << r7; + s32 r6; + + if ((gRfuLinkStatus->connSlotFlag & r5) && gRfuLinkStatus->connCount != 0) + --gRfuLinkStatus->connCount; + gRfuLinkStatus->connSlotFlag &= r6 = ~r5; + gRfuLinkStatus->linkLossSlotFlag |= r5; + if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) + gRfuLinkStatus->connMode = 0xFF; + if (r12 != 0) + { + CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); + gRfuLinkStatus->linkLossSlotFlag &= r6; + gRfuLinkStatus->getNameFlag &= r6; + gRfuLinkStatus->strength[r7] = 0; + } +} + +void rfu_REQ_disconnect(u8 who) +{ + u16 r1; + + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & who) + { + gRfuStatic->recoveryBmSlot = who; + if (gRfuLinkStatus->connMode == 0xFF && gRfuStatic->flags & 0x80) + { + if (gRfuLinkStatus->linkLossSlotFlag & who) + rfu_CB_disconnect(48, 0); + } + else if (gRfuStatic->SCStartFlag + && (STWI_set_Callback_M(rfu_CB_defaultCallback), + STWI_send_SC_EndREQ(), + (r1 = STWI_poll_CommandEnd()) != 0)) + { + rfu_STC_REQ_callback(27, r1); + } + else + { + STWI_set_Callback_M(rfu_CB_disconnect); + STWI_send_DisconnectREQ(who); + } + } +} + +void rfu_CB_disconnect(u8 r6, u16 r5) +{ + u8 r4, r0; + + if (r5 == 3 && gRfuLinkStatus->connMode == 0) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + r5 = 0; + } + gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; + if (r5 == 0) + { + for (r4 = 0; r4 < 4; ++r4) + { + r0 = 1 << r4; + if (r0 & gRfuStatic->recoveryBmSlot) + rfu_STC_removeLinkData(r4, 1); + } + } + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) + gRfuLinkStatus->connMode = 0xFF; + rfu_STC_REQ_callback(r6, r5); + if (gRfuStatic->SCStartFlag) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SC_StartREQ(); + r5 = STWI_poll_CommandEnd(); + if (r5 != 0) + rfu_STC_REQ_callback(25, r5); + } +} + +void rfu_REQ_CHILD_startConnectRecovery(u8 r5) +{ + u8 i; + + gRfuStatic->recoveryBmSlot = r5; + for (i = 0; i < 4 && !((r5 >> i) & 1); ++i) + ; + STWI_set_Callback_M(rfu_STC_REQ_callback); + // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id + STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, r5); +} + +void rfu_REQ_CHILD_pollConnectRecovery(void) +{ + STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); + STWI_send_CPR_PollingREQ(); +} + +void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) +{ + u8 r3, r4; + struct RfuLinkStatus *r2; + + if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) + { + gRfuLinkStatus->connMode = 0; + for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) + { + r3 = 1 << r4; + r2 = gRfuLinkStatus; // ??? + if (gRfuStatic->recoveryBmSlot & r3 & r2->linkLossSlotFlag) + { + gRfuLinkStatus->connSlotFlag |= r3; + gRfuLinkStatus->linkLossSlotFlag &= ~r3; + ++gRfuLinkStatus->connCount; + gRfuStatic->linkEmergencyFlag[r4] = 0; + } + } + gRfuStatic->recoveryBmSlot = 0; + } + rfu_STC_REQ_callback(r8, r7); +} + +u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) +{ + u8 r0; + + *status = 0xFF; + r0 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] + 77; + if (r0 <= 1) + { + *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + return 0; + } + return 0x10; +} + +void rfu_REQ_CHILD_endConnectRecovery(void) +{ + STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); + STWI_send_CPR_EndREQ(); +} + +void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) +{ + const u8 *src = *src_p; + u8 *dst = *dst_p; + s32 i; + + for (i = size - 1; i != -1; --i) + *dst++ = *src++; + *src_p = src; + *dst_p = dst; +} + +void rfu_REQ_changeMasterSlave(void) +{ + if (STWI_read_status(1) == 1) + { + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_MS_ChangeREQ(); + } + else + { + rfu_STC_REQ_callback(39, 0); + } +} + +bool8 rfu_getMasterSlave(void) +{ + bool8 r2 = STWI_read_status(1); + + if (r2 == 1) + { + if (gRfuState->unk_2c) + { + if (gRfuState->reqActiveCommand == 39 + || gRfuState->reqActiveCommand == 37 + || gRfuState->reqActiveCommand == 55) + r2 = 0; + } + } + return r2; +} + +void rfu_clearAllSlot(void) +{ + u16 i; + u16 IMEBackup = REG_IME; + + REG_IME = 0; + for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i) + { + CpuFill16(0, gRfuSlotStatusNI[i], sizeof(gRfuSlotStatusNI[i]->sub)); + CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(gRfuSlotStatusUNI[i]->sub)); + gRfuLinkStatus->remainLLFrameSizeChild[i] = 16; + } + gRfuLinkStatus->remainLLFrameSizeParent = 87; + gRfuLinkStatus->sendSlotNIFlag = 0; + gRfuLinkStatus->recvSlotNIFlag = 0; + gRfuLinkStatus->sendSlotUNIFlag = 0; + gRfuStatic->recvRenewalFlag = 0; + REG_IME = IMEBackup; +} + +void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) +{ + + if (!(gRfuStatic->flags & 0x80)) + { + if (r3 == 0) + gRfuLinkStatus->remainLLFrameSizeParent += r4->payloadSize; + gRfuLinkStatus->remainLLFrameSizeParent += 3; + } + else + { + if (r3 == 0) + gRfuLinkStatus->remainLLFrameSizeChild[r5] += r4->payloadSize; + gRfuLinkStatus->remainLLFrameSizeChild[r5] += 2; + } +} + +s32 rfu_clearSlot(u8 r8, u8 r7) +{ + u16 r10, r3, r1; + struct NIComm *r4; + + if (r7 > 3) + return 0x400; + if ((r8 & 0xF) == 0) + return 0x600; + r10 = REG_IME; + REG_IME = 0; + if (r8 & 0xC) + { + for (r3 = 0; r3 < 2; ++r3) + { + r4 = NULL; + if (r3 == 0) + { + if (r8 & 4) + { + r4 = &gRfuSlotStatusNI[r7]->sub.send; + gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg; + } + } + else + { + if (r8 & 8) + { + r4 = &gRfuSlotStatusNI[r7]->sub.recv; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << r7); + } + } + if (r4 != NULL) + { + if (r4->state & 0x8000) + { + rfu_STC_releaseFrame(r7, r3, r4); + for (r1 = 0; r1 < 4; ++r1) + if ((r4->bmSlotOrg >> r1) & 1) + r4->failCounter = 0; + } + CpuFill16(0, r4, sizeof(struct NIComm)); + } + } + } + if (r8 & 1) + { + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; + + if (r3->sub.send.state & 0x8000) + { + if (!(gRfuStatic->flags & 0x80)) + gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->sub.send.payloadSize; + else + gRfuLinkStatus->remainLLFrameSizeChild[r7] += 2 + (u8)r3->sub.send.payloadSize; + gRfuLinkStatus->sendSlotUNIFlag &= ~r3->sub.send.bmSlot; + } + CpuFill16(0, &r3->sub.send, sizeof(struct UNISend)); + } + if (r8 & 2) + { + CpuFill16(0, &gRfuSlotStatusUNI[r7]->sub.recv, sizeof(struct UNIRecv)); + } + REG_IME = r10; + return 0; +} + +s32 rfu_setRecvBuffer(u8 r3, u8 r4, void *r5, size_t r6) +{ + if (r4 > 3) + return 0x400; + if (r3 & 0x20) + { + gRfuSlotStatusNI[r4]->recvBuffer = r5; + gRfuSlotStatusNI[r4]->recvBufferSize = r6; + } + else if (!(r3 & 0x10)) + { + return 0x600; + } + else + { + gRfuSlotStatusUNI[r4]->recvBuffer = r5; + gRfuSlotStatusUNI[r4]->recvBufferSize = r6; + } + return 0; +} + +s32 rfu_NI_setSendData(u8 a1, u8 a2, const void *a3, u32 a4) +{ + return rfu_STC_setSendData_org(32, a1, a2, a3, a4); +} + +s32 rfu_UNI_setSendData(u8 flag, const void *ptr, u8 size) +{ + u8 r0; + + if (gRfuLinkStatus->connMode == 1) + r0 = size + 3; + else + r0 = size + 2; + return rfu_STC_setSendData_org(16, flag, r0, ptr, 0); +} + +s32 rfu_NI_CHILD_setSendGameName(u8 a1, u8 a2) +{ + return rfu_STC_setSendData_org(64, 1 << a1, a2, &gRfuLinkStatus->my.serialNum, 26); +} + +u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) +{ + u8 r2, r0; + u8 r4; + u8 *r9; + u8 r5; + u8 i; + u16 sp04; + struct RfuSlotStatusUNI *r1; + struct RfuSlotStatusNI *r12; + + if (gRfuLinkStatus->connMode == 0xFF) + return 0x301; + if (!(r3 & 0xF)) + return 0x400; + if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r3) != r3) + return 0x401; + if (r6 & 0x10) + r0 = gRfuLinkStatus->sendSlotUNIFlag; + else + r0 = gRfuLinkStatus->sendSlotNIFlag; + if (r0 & r3) + return 0x402; + for (r2 = 0; r2 < 4 && !((r3 >> r2) & 1); ++r2) + ; + if (gRfuLinkStatus->connMode == 1) + r9 = &gRfuLinkStatus->remainLLFrameSizeParent; + else if (gRfuLinkStatus->connMode == 0) + r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; + r4 = _Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + if (r8 > *r9 || r8 <= r4) + return 0x500; + sp04 = REG_IME; + REG_IME = 0; + r5 = r6 & 0x20; + if (r5 || r6 == 0x40) + { + u8 *r1; // a hack to swap instructions + + r12 = gRfuSlotStatusNI[r2]; + r1 = NULL; + r12->sub.send.errorCode = 0; + *r12->sub.send.nowP = r1 = &r12->sub.send.dataType; + r12->sub.send.remainSize = 7; + r12->sub.send.bmSlotOrg = r3; + r12->sub.send.bmSlot = r3; + r12->sub.send.payloadSize = r8 - r4; + if (r5 != 0) + *r1 = 0; + else + *r1 = 1; + r12->sub.send.dataSize = sp28; + r12->sub.send.src = sp00; + r12->sub.send.ack = 0; + r12->sub.send.phase = 0; + #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette + asm("":::"r2"); + #endif + for (i = 0; i < NELEMS(r12->sub.send.recvAckFlag); ++i) + { + r12->sub.send.recvAckFlag[i] = 0; + r12->sub.send.n[i] = 1; + } + for (r2 = 0; r2 < NELEMS(gRfuSlotStatusNI); ++r2) + if ((r3 >> r2) & 1) + gRfuSlotStatusNI[r2]->sub.send.failCounter = 0; + gRfuLinkStatus->sendSlotNIFlag |= r3; + *r9 -= r8; + r12->sub.send.state = 0x8021; + } + else if (r6 & 0x10) + { + r1 = gRfuSlotStatusUNI[r2]; + r1->sub.send.bmSlot = r3; + r1->sub.send.src = sp00; + r1->sub.send.payloadSize = r8 - r4; + *r9 -= r8; + r1->sub.send.state = 0x8024; + gRfuLinkStatus->sendSlotUNIFlag |= r3; + } + REG_IME = sp04; + return 0; +} + +s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) +{ + struct RfuSlotStatusNI *r5; + u16 r8; + u8 r2; + + if (r7 >= NELEMS(gRfuSlotStatusNI)) + return 0x400; + if (r3 == 0x20) + { + r5 = gRfuSlotStatusNI[r7]; + if ((r5->sub.send.state & 0x8000) + && (r5->sub.send.state & 0x20)) + { + r3 = r6 ^ r5->sub.send.bmSlot; + + if (!(r3 & r6)) + { + if (r3) + { + r8 = REG_IME; + REG_IME = 0; + for (r2 = 0; r2 < NELEMS(gRfuSlotStatusNI); ++r2) + { + if ((r3 >> r2) & 1) + gRfuSlotStatusNI[r2]->sub.send.failCounter = 0; + } + gRfuLinkStatus->sendSlotNIFlag &= ~r3; + r5->sub.send.bmSlot = r6; + if ((r6 << 24) == 0) // The shift doesn't make any sense. + { + rfu_STC_releaseFrame(r7, 0, &r5->sub.send); + r5->sub.send.state = 39; + } + REG_IME = r8; + } + } + else + { + return 0x404; + } + } + else + { + return 0x403; + } + } + else + { + if (r3 == 16) + { + s32 r3; + + if (gRfuSlotStatusUNI[r7]->sub.send.state != 0x8024) + return 0x403; + for (r3 = 0, r2 = 0; r2 < NELEMS(gRfuSlotStatusUNI); ++r2) + if (r2 != r7) + r3 |= gRfuSlotStatusUNI[r2]->sub.send.bmSlot; + if (r6 & r3) + return 0x404; + r8 = REG_IME; + REG_IME = 0; + gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[r7]->sub.send.bmSlot; + gRfuLinkStatus->sendSlotUNIFlag |= r6; + gRfuSlotStatusUNI[r7]->sub.send.bmSlot = r6; + REG_IME = r8; + } + else + { + return 0x600; + } + } + return 0; +} + +s32 rfu_NI_stopReceivingData(u8 who) +{ +#ifndef NONMATCHING // r4, r5 register swap + register struct NIComm *r5 asm("r5"); +#else + struct NIComm *r5; +#endif + u16 r4, r1; + + if (who > 3) + return 0x400; + r5 = &gRfuSlotStatusNI[who]->sub.recv; + r4 = REG_IME; + REG_IME = 0; + if (gRfuSlotStatusNI[who]->sub.recv.state & 0x8000) + { + if (gRfuSlotStatusNI[who]->sub.recv.state == 0x8043) + gRfuSlotStatusNI[who]->sub.recv.state = 72; + else + gRfuSlotStatusNI[who]->sub.recv.state = 71; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << who); + rfu_STC_releaseFrame(who, 1, r5); + } + REG_IME = r4; + return 0; +} + +s32 rfu_UNI_changeAndReadySendData(u8 r3, const void *r7, u8 r5) +{ + struct UNISend *r4; + u8 *r6; + u16 r1; + u8 r3_; + + if (r3 >= 4) + return 0x400; + r4 = &gRfuSlotStatusUNI[r3]->sub.send; + if (r4->state != 0x8024) + return 0x403; + if (gRfuLinkStatus->connMode == 1) + { + r6 = &gRfuLinkStatus->remainLLFrameSizeParent; + r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize; + } + else + { + r6 = &gRfuLinkStatus->remainLLFrameSizeChild[r3]; + r3_ = gRfuLinkStatus->remainLLFrameSizeChild[r3] + (u8)r4->payloadSize; + } + if (r3_ < r5) + return 0x500; + r1 = REG_IME; + REG_IME = 0; + r4->src = r7; + *r6 = r3_ - r5; + r4->payloadSize = r5; + r4->dataReadyFlag = 1; + REG_IME = r1; + return 0; +} + +void rfu_UNI_readySendData(u8 a1) +{ + if (a1 < NELEMS(gRfuSlotStatusUNI)) + { + if (gRfuSlotStatusUNI[a1]->sub.send.state == 0x8024) + gRfuSlotStatusUNI[a1]->sub.send.dataReadyFlag = 1; + } +} + +void rfu_UNI_clearRecvNewDataFlag(u8 a1) +{ + if (a1 < NELEMS(gRfuSlotStatusUNI)) + gRfuSlotStatusUNI[a1]->sub.recv.newDataFlag = 0; +} + +void rfu_REQ_sendData(u8 r5) +{ + if (gRfuLinkStatus->connMode != 0xFF) + { + if (gRfuLinkStatus->connMode == 1 + && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)) + { + if (gRfuStatic->commExistFlag) + { + gRfuStatic->emberCount = 16; + gRfuStatic->nullFrameCount = 0; + } + if (gRfuStatic->emberCount) + --gRfuStatic->emberCount; + else + ++gRfuStatic->nullFrameCount; + if (gRfuStatic->emberCount + || !(gRfuStatic->nullFrameCount & 0xF)) + { + gRfuFixed->LLFBuffer[0] = 1; + gRfuFixed->LLFBuffer[4] = 0xFF; + STWI_set_Callback_M(rfu_CB_sendData3); + if (r5 == 0) + STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, 1); + else + STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, 1); + return; + } + } + else + { + if (!gRfuLinkStatus->LLFReadyFlag) + rfu_constructSendLLFrame(); + if (gRfuLinkStatus->LLFReadyFlag) + { + STWI_set_Callback_M(rfu_CB_sendData); + if (r5 != 0) + { + STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); + return; + } + STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); + } + } + if (r5 != 0) + { + if (gRfuLinkStatus->connMode == 1) + { + if (gRfuState->callbackS != NULL) + gRfuState->callbackS(39); + } + else + { + STWI_set_Callback_M(rfu_CB_sendData2); + STWI_send_MS_ChangeREQ(); + } + } + } +} + +void rfu_CB_sendData(UNUSED u8 r0, u16 r7) +{ + u8 r6; + struct NIComm *r4; + + if (r7 == 0) + { + for (r6 = 0; r6 < NELEMS(gRfuSlotStatusNI); ++r6) + { + if (gRfuSlotStatusUNI[r6]->sub.send.dataReadyFlag) + gRfuSlotStatusUNI[r6]->sub.send.dataReadyFlag = 0; + r4 = &gRfuSlotStatusNI[r6]->sub.send; + if (r4->state == 0x8020) + { + rfu_STC_releaseFrame(r6, 0, r4); + gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot; + if (r4->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << r6; + r4->state = 38; + } + } + } + gRfuLinkStatus->LLFReadyFlag = 0; + rfu_STC_REQ_callback(36, r7); +} + +void rfu_CB_sendData2(UNUSED u8 r0, u16 r1) +{ + rfu_STC_REQ_callback(36, r1); +} + +void rfu_CB_sendData3(u8 r0, u16 r1) +{ + if (r1 != 0) + rfu_STC_REQ_callback(36, r1); + else if (r0 == 0xFF) + rfu_STC_REQ_callback(0xFF, 0); +} + +void rfu_constructSendLLFrame(void) +{ + u32 r8, r5; + u8 r6; + u8 *sp00; + struct RfuSlotStatusNI *r2; + + if (gRfuLinkStatus->connMode != 0xFF + && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) + { + gRfuLinkStatus->LLFReadyFlag = 0; + r8 = 0; + sp00 = (u8 *)&gRfuFixed->LLFBuffer[1]; + for (r6 = 0; r6 < NELEMS(gRfuSlotStatusUNI); ++r6) + { + r5 = 0; + if (gRfuSlotStatusNI[r6]->sub.send.state & 0x8000) + r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->sub.send); + if (gRfuSlotStatusNI[r6]->sub.recv.state & 0x8000) + r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->sub.recv); + if (gRfuSlotStatusUNI[r6]->sub.send.state == 0x8024) + r5 += rfu_STC_UNI_constructLLSF(r6, &sp00); + if (r5 != 0) + { + if (gRfuLinkStatus->connMode == 1) + r8 += r5; + else + r8 |= r5 << (5 * r6 + 8); + } + } + if (r8 != 0) + { + while ((u32)sp00 & 3) + *sp00++ = 0; + gRfuFixed->LLFBuffer[0] = r8; + if (gRfuLinkStatus->connMode == 0) + { + u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]); + + // Does the volatile qualifier make sense? + // It's the same as: + // asm("":::"memory"); + r8 = r0 - *(u8 *volatile *)&gRfuFixed; + } + } + gRfuStatic->totalPacketSize = r8; + } +} + +u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) +{ + u16 r5; + u32 sp00; + u8 i; + u8 *r2; + const u8 *r8 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + + if (r4->state == 0x8022) + { + while (r4->nowP[r4->phase] >= (const u8 *)r4->src + r4->dataSize) + { + ++r4->phase; + if (r4->phase == 4) + r4->phase = 0; + } + } + if (r4->state & 0x40) + { + r5 = 0; + } + else if (r4->state == 0x8022) + { + if (r4->nowP[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) + r5 = (const u8 *)r4->src + r4->dataSize - r4->nowP[r4->phase]; + else + r5 = r4->payloadSize; + } + else + { + if (r4->remainSize >= r4->payloadSize) + r5 = r4->payloadSize; + else + r5 = r4->remainSize; + } + sp00 = (r4->state & 0xF) << r8[3] + | r4->ack << r8[4] + | r4->phase << r8[5] + | r4->n[r4->phase] << r8[6] + | r5; + if (gRfuLinkStatus->connMode == 1) + sp00 |= r4->bmSlot << 18; + r2 = (u8 *)&sp00; + for (i = 0; i < *r8; ++i) + *(*r12)++ = *r2++; + if (r5 != 0) + { + const u8 *sp04 = r4->nowP[r4->phase]; + + gRfuFixed->fastCopyPtr(&sp04, r12, r5); + } + if (r4->state == 0x8022) + { + ++r4->phase; + if (r4->phase == 4) + r4->phase = 0; + } + if (gRfuLinkStatus->connMode == 1) + gRfuLinkStatus->LLFReadyFlag = 1; + else + gRfuLinkStatus->LLFReadyFlag |= 1 << r10; + return r5 + *r8; +} + +u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) +{ + const u8 *r5; + const u8 *sp04; + u32 sp00; + u8 *r2; + u8 i; + struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->sub.send; + + if (!r4->dataReadyFlag || !r4->bmSlot) + return 0; + r5 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + sp00 = (r4->state & 0xF) << r5[3] + | r4->payloadSize; + if (gRfuLinkStatus->connMode == 1) + sp00 |= r4->bmSlot << 18; + r2 = (u8 *)&sp00; + for (i = 0; i < *r5; ++i) + *(*r6)++ = *r2++; + sp04 = r4->src; + gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); + if (gRfuLinkStatus->connMode == 1) + gRfuLinkStatus->LLFReadyFlag = 16; + else + gRfuLinkStatus->LLFReadyFlag |= 16 << r8; + return *r5 + r4->payloadSize; +} + +void rfu_REQ_recvData(void) +{ + if (gRfuLinkStatus->connMode != 0xFF) + { + gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag; + gRfuStatic->recvErrorFlag = 0; + STWI_set_Callback_M(rfu_CB_recvData); + STWI_send_DataRxREQ(); + } +} + +void rfu_CB_recvData(u8 r9, u16 r7) +{ + u8 r6; + struct RfuSlotStatusNI *r4; + struct NIComm *r5; + + if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) + { + gRfuStatic->NIEndRecvFlag = 0; + if (gRfuLinkStatus->connMode == 1) + rfu_STC_PARENT_analyzeRecvPacket(); + else + rfu_STC_CHILD_analyzeRecvPacket(); + for (r6 = 0; r6 < NELEMS(gRfuSlotStatusNI); ++r6) + { + r4 = gRfuSlotStatusNI[r6]; + if (r4->sub.recv.state == 0x8043 && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) + { + r5 = &r4->sub.recv; + if (r5->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << r6; + rfu_STC_releaseFrame(r6, 1, r5); + gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot; + r4->sub.recv.state = 70; + } + } + if ( gRfuStatic->recvErrorFlag ) + r7 = gRfuStatic->recvErrorFlag | 0x700; + } + rfu_STC_REQ_callback(r9, r7); +} + +void rfu_STC_PARENT_analyzeRecvPacket(void) +{ + u32 r3; + u8 r5; + u8 sp[4]; + u8 *r6; + + r3 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; + for (r5 = 0; r5 < NELEMS(sp); ++r5) + { + sp[r5] = r3 & 0x1F; + r3 >>= 5; + if (sp[r5] == 0) + gRfuStatic->NIEndRecvFlag |= 1 << r5; + } + r6 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + for (r5 = 0; r5 < NELEMS(sp); ++r5) + { + if (sp[r5]) + { + u8 *r4 = &sp[r5]; + + do + { + u8 r0 = rfu_STC_analyzeLLSF(r5, r6, *r4); + + r6 += r0; + *r4 -= r0; + } while (!(*r4 & 0x80) && (*r4)); + } + } +} + +void rfu_STC_CHILD_analyzeRecvPacket(void) +{ + u16 r4; + u8 *r5; + u16 r0; + + r4 = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F; + r5 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + if (r4 == 0) + gRfuStatic->NIEndRecvFlag = 15; + do + { + if (r4 == 0) + break; + r0 = rfu_STC_analyzeLLSF(0, r5, r4); + r5 += r0; + r4 -= r0; + } while (!(r4 & 0x8000)); +} -- cgit v1.2.3 From 5bf8d1c62d6907b44d92f75f4402c4a0dee28a2c Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Wed, 1 Jan 2020 21:46:36 +0800 Subject: fix rfu_STC_analyzeLLSF Co-authored-by: Normmatt --- asm/librfu.s | 388 --------------------------------------------------- data/librfu_rodata.s | 1 + include/librfu.h | 1 - src/librfu_rfu.c | 175 +++++++++++++++++++++-- 4 files changed, 161 insertions(+), 404 deletions(-) diff --git a/asm/librfu.s b/asm/librfu.s index c98ee854c..f94aaabf3 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,394 +5,6 @@ .text - thumb_func_start rfu_STC_analyzeLLSF -rfu_STC_analyzeLLSF: @ 81E2C40 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - adds r7, r1, 0 - lsls r0, 24 - lsrs r0, 24 - mov r12, r0 - lsls r2, 16 - lsrs r3, r2, 16 - ldr r2, _081E2C74 @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r0, [r0] - mvns r0, r0 - movs r1, 0x1 - ands r0, r1 - lsls r0, 4 - ldr r1, _081E2C78 @ =_Str_RfuHeader - adds r6, r0, r1 - ldrb r0, [r6] - cmp r3, r0 - bcs _081E2C7C - adds r0, r3, 0 - b _081E2E6E - .align 2, 0 -_081E2C74: .4byte gRfuLinkStatus -_081E2C78: .4byte _Str_RfuHeader -_081E2C7C: - movs r5, 0 - movs r4, 0 - ldrb r3, [r6, 0x1] - ldrb r1, [r6, 0x7] - mov r8, r1 - ldr r2, [sp] - mov r9, r2 - cmp r4, r0 - bcs _081E2CA4 - adds r2, r0, 0 -_081E2C90: - ldrb r0, [r7] - lsls r1, r4, 3 - lsls r0, r1 - orrs r5, r0 - adds r7, 0x1 - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, r2 - bcc _081E2C90 -_081E2CA4: - adds r0, r5, 0 - lsrs r0, r3 - mov r3, r8 - ands r0, r3 - ldr r1, _081E2D7C @ =0xffffff00 - mov r10, r1 - mov r3, r10 - mov r2, r9 - ands r3, r2 - orrs r3, r0 - str r3, [sp] - adds r0, r5, 0 - ldrb r1, [r6, 0x2] - lsrs r0, r1 - ldrb r1, [r6, 0x8] - ands r0, r1 - lsls r0, 8 - ldr r4, _081E2D80 @ =0xffff00ff - adds r2, r4, 0 - ands r2, r3 - orrs r2, r0 - str r2, [sp] - adds r0, r5, 0 - ldrb r3, [r6, 0x3] - lsrs r0, r3 - ldrb r1, [r6, 0x9] - ands r0, r1 - lsls r0, 16 - ldr r3, _081E2D84 @ =0xff00ffff - ands r3, r2 - orrs r3, r0 - str r3, [sp] - adds r0, r5, 0 - ldrb r1, [r6, 0x4] - lsrs r0, r1 - ldrb r1, [r6, 0xA] - ands r0, r1 - lsls r0, 24 - ldr r2, _081E2D88 @ =0x00ffffff - mov r8, r2 - mov r1, r8 - ands r1, r3 - orrs r1, r0 - mov r8, r1 - str r1, [sp] - adds r1, r5, 0 - ldrb r2, [r6, 0x5] - lsrs r1, r2 - ldrb r0, [r6, 0xB] - ands r1, r0 - mov r9, sp - ldr r2, [sp, 0x4] - mov r3, r10 - ands r2, r3 - orrs r2, r1 - str r2, [sp, 0x4] - adds r0, r5, 0 - ldrb r1, [r6, 0x6] - lsrs r0, r1 - ldrb r1, [r6, 0xC] - ands r0, r1 - lsls r0, 8 - ands r4, r2 - orrs r4, r0 - str r4, [sp, 0x4] - ldrh r0, [r6, 0xE] - ands r5, r0 - lsls r1, r5, 16 - ldr r0, _081E2D8C @ =0x0000ffff - ands r0, r4 - orrs r0, r1 - str r0, [sp, 0x4] - lsrs r0, 16 - ldrb r6, [r6] - adds r0, r6 - lsls r0, 16 - lsrs r0, 16 - mov r10, r0 - mov r0, sp - ldrb r0, [r0] - cmp r0, 0 - beq _081E2D4A - b _081E2E6C -_081E2D4A: - ldr r2, _081E2D90 @ =gRfuLinkStatus - ldr r3, [r2] - ldrb r2, [r3] - cmp r2, 0x1 - bne _081E2E08 - ldrb r0, [r3, 0x2] - mov r5, r12 - asrs r0, r5 - ands r0, r2 - cmp r0, 0 - bne _081E2D62 - b _081E2E6C -_081E2D62: - mov r1, r8 - lsrs r0, r1, 16 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bne _081E2D94 - mov r0, r12 - mov r1, sp - adds r2, r7, 0 - bl rfu_STC_UNI_receive - b _081E2E6C - .align 2, 0 -_081E2D7C: .4byte 0xffffff00 -_081E2D80: .4byte 0xffff00ff -_081E2D84: .4byte 0xff00ffff -_081E2D88: .4byte 0x00ffffff -_081E2D8C: .4byte 0x0000ffff -_081E2D90: .4byte gRfuLinkStatus -_081E2D94: - mov r5, r9 - ldrb r0, [r5, 0x3] - cmp r0, 0 - bne _081E2DA8 - mov r0, r12 - mov r1, sp - adds r2, r7, 0 - bl rfu_STC_NI_receive_Receiver - b _081E2E6C -_081E2DA8: - movs r4, 0 - ldr r1, _081E2DC0 @ =gRfuSlotStatusNI - ldr r0, [r1] - ldrb r0, [r0, 0x1A] - mov r5, r12 - asrs r0, r5 - ands r0, r2 - cmp r0, 0 - beq _081E2DC4 - ldrb r0, [r3, 0x4] - b _081E2DEA - .align 2, 0 -_081E2DC0: .4byte gRfuSlotStatusNI -_081E2DC4: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bhi _081E2E6C - lsls r0, r4, 2 - adds r0, r1 - ldr r0, [r0] - ldrb r0, [r0, 0x1A] - mov r2, r12 - asrs r0, r2 - movs r2, 0x1 - ands r0, r2 - cmp r0, 0 - beq _081E2DC4 - ldr r3, _081E2E04 @ =gRfuLinkStatus - ldr r0, [r3] - ldrb r0, [r0, 0x4] - mov r5, r12 -_081E2DEA: - asrs r0, r5 - ands r0, r2 - cmp r0, 0 - beq _081E2DC4 - cmp r4, 0x3 - bhi _081E2E6C - adds r0, r4, 0 - mov r1, r12 - mov r2, sp - adds r3, r7, 0 - bl rfu_STC_NI_receive_Sender - b _081E2E6C - .align 2, 0 -_081E2E04: .4byte gRfuLinkStatus -_081E2E08: - ldrb r1, [r3, 0x2] - mov r2, r9 - ldrb r0, [r2, 0x1] - adds r5, r1, 0 - ands r5, r0 - cmp r5, 0 - beq _081E2E6C - movs r4, 0 - movs r6, 0x1 -_081E2E1A: - adds r0, r5, 0 - asrs r0, r4 - ands r0, r6 - cmp r0, 0 - beq _081E2E62 - mov r1, sp - ldrb r0, [r1, 0x2] - cmp r0, 0x4 - bne _081E2E36 - adds r0, r4, 0 - adds r2, r7, 0 - bl rfu_STC_UNI_receive - b _081E2E62 -_081E2E36: - ldrb r0, [r1, 0x3] - cmp r0, 0 - bne _081E2E48 - adds r0, r4, 0 - mov r1, sp - adds r2, r7, 0 - bl rfu_STC_NI_receive_Receiver - b _081E2E62 -_081E2E48: - ldr r0, _081E2E80 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0, 0x4] - asrs r0, r4 - ands r0, r6 - cmp r0, 0 - beq _081E2E62 - adds r0, r4, 0 - adds r1, r4, 0 - mov r2, sp - adds r3, r7, 0 - bl rfu_STC_NI_receive_Sender -_081E2E62: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E2E1A -_081E2E6C: - mov r0, r10 -_081E2E6E: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E2E80: .4byte gRfuLinkStatus - thumb_func_end rfu_STC_analyzeLLSF - - thumb_func_start rfu_STC_UNI_receive -rfu_STC_UNI_receive: @ 81E2E84 - push {r4-r7,lr} - sub sp, 0x8 - adds r6, r1, 0 - str r2, [sp] - lsls r0, 24 - lsrs r7, r0, 24 - ldr r2, _081E2EB8 @ =gRfuSlotStatusUNI - lsls r1, r7, 2 - adds r1, r2 - ldr r3, [r1] - adds r5, r3, 0 - adds r5, 0xC - movs r4, 0 - movs r0, 0 - strh r0, [r5, 0x2] - ldr r0, [r1] - ldr r0, [r0, 0x18] - adds r1, r2, 0 - ldrh r2, [r6, 0x6] - cmp r0, r2 - bcs _081E2EC0 - movs r0, 0x49 - strh r0, [r3, 0xC] - ldr r0, _081E2EBC @ =0x00000701 - strh r0, [r5, 0x2] - b _081E2F0E - .align 2, 0 -_081E2EB8: .4byte gRfuSlotStatusUNI -_081E2EBC: .4byte 0x00000701 -_081E2EC0: - ldrb r0, [r5, 0x7] - cmp r0, 0 - beq _081E2ED8 - ldrb r0, [r5, 0x6] - cmp r0, 0 - beq _081E2EE4 - ldr r0, _081E2ED4 @ =0x00000709 - strh r0, [r5, 0x2] - b _081E2F0E - .align 2, 0 -_081E2ED4: .4byte 0x00000709 -_081E2ED8: - ldrb r0, [r5, 0x6] - cmp r0, 0 - beq _081E2EE4 - movs r0, 0xE1 - lsls r0, 3 - strh r0, [r5, 0x2] -_081E2EE4: - movs r4, 0 - ldr r0, _081E2F2C @ =0x00008042 - strh r0, [r5] - ldrh r0, [r6, 0x6] - strh r0, [r5, 0x4] - ldrh r2, [r6, 0x6] - lsls r0, r7, 2 - adds r0, r1 - ldr r0, [r0] - ldr r0, [r0, 0x14] - str r0, [sp, 0x4] - ldr r0, _081E2F30 @ =gRfuFixed - ldr r0, [r0] - add r1, sp, 0x4 - ldr r3, [r0, 0x4] - mov r0, sp - bl _call_via_r3 - movs r0, 0x1 - strb r0, [r5, 0x6] - strh r4, [r5] -_081E2F0E: - ldrh r0, [r5, 0x2] - cmp r0, 0 - beq _081E2F22 - ldr r0, _081E2F34 @ =gRfuStatic - ldr r2, [r0] - movs r0, 0x10 - lsls r0, r7 - ldrb r1, [r2, 0x4] - orrs r0, r1 - strb r0, [r2, 0x4] -_081E2F22: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2F2C: .4byte 0x00008042 -_081E2F30: .4byte gRfuFixed -_081E2F34: .4byte gRfuStatic - thumb_func_end rfu_STC_UNI_receive - thumb_func_start rfu_STC_NI_receive_Sender rfu_STC_NI_receive_Sender: @ 81E2F38 push {r4-r7,lr} diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s index d5e847aa3..e5b15c6c5 100644 --- a/data/librfu_rodata.s +++ b/data/librfu_rodata.s @@ -11,6 +11,7 @@ _Str_RfuHeader:: .byte 3, 22, 18, 14, 13, 9, 11, 3 .byte 15, 15, 1, 3, 3, 0, 0x7f, 0 + @ .ascii "RFU_V1024" .ascii "RFU_V" .byte VERSION_MAJOR + 0x30 .byte VERSION_MINOR + 0x30 diff --git a/include/librfu.h b/include/librfu.h index ff160e207..e50f5cc89 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -284,7 +284,6 @@ extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; // librfu_rfu -void rfu_STC_clearAPIVariables(void); void rfu_REQ_stopMode(void); u16 rfu_waitREQComplete(void); s32 rfu_REQBN_softReset_and_checkID(void); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 3bfa3b601..e53aade49 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -1,6 +1,35 @@ #include "global.h" #include "librfu.h" +struct RfuHeader +{ + u8 unk00; + u8 unk01; + u8 unk02; + u8 unk03; + u8 unk04; + u8 unk05; + u8 unk06; + u8 unk07; + u8 unk08; + u8 unk09; + u8 unk0A; + u8 unk0B; + u8 unk0C; + u16 unk0E; +}; + +struct RfuTest +{ + u8 unk00; + u8 unk01; + u8 unk02; + u8 unk03; + u8 unk04; + u8 unk05; + u16 unk06; +}; + void rfu_CB_defaultCallback(u8, u16); void rfu_CB_reset(u8, u16); void rfu_CB_configGameData(u8, u16); @@ -19,6 +48,7 @@ void rfu_CB_sendData3(u8, u16); void rfu_CB_recvData(u8, u16); s32 sub_81E349C(u8); void rfu_enableREQCallback(bool8); +void rfu_STC_clearAPIVariables(void); void rfu_STC_readChildList(void); void rfu_STC_readParentCandidateList(void); void rfu_STC_REQ_callback(u8, u16); @@ -32,10 +62,13 @@ u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); u16 rfu_STC_UNI_constructLLSF(u8, u8 **); void rfu_STC_PARENT_analyzeRecvPacket(void); void rfu_STC_CHILD_analyzeRecvPacket(void); -u16 rfu_STC_analyzeLLSF(u8, u8 *, u16); +u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16); +void rfu_STC_UNI_receive(u8, const struct RfuTest *, const u8 *); +void rfu_STC_NI_receive_Receiver(u8, const struct RfuTest *, const u8 *); +void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuTest *, UNUSED const u8 *); extern const char _Str_RFU_MBOOT[]; -extern const u8 _Str_RfuHeader[]; +extern const struct RfuHeader _Str_RfuHeader[2]; struct RfuStruct *gRfuState; ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; @@ -1284,7 +1317,7 @@ u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) r9 = &gRfuLinkStatus->remainLLFrameSizeParent; else if (gRfuLinkStatus->connMode == 0) r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; - r4 = _Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + r4 = _Str_RfuHeader[gRfuLinkStatus->connMode].unk00; if (r8 > *r9 || r8 <= r4) return 0x500; sp04 = REG_IME; @@ -1644,7 +1677,7 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) u32 sp00; u8 i; u8 *r2; - const u8 *r8 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + const struct RfuHeader *r8 = &_Str_RfuHeader[gRfuLinkStatus->connMode]; if (r4->state == 0x8022) { @@ -1673,15 +1706,15 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) else r5 = r4->remainSize; } - sp00 = (r4->state & 0xF) << r8[3] - | r4->ack << r8[4] - | r4->phase << r8[5] - | r4->n[r4->phase] << r8[6] + sp00 = (r4->state & 0xF) << r8->unk03 + | r4->ack << r8->unk04 + | r4->phase << r8->unk05 + | r4->n[r4->phase] << r8->unk06 | r5; if (gRfuLinkStatus->connMode == 1) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; - for (i = 0; i < *r8; ++i) + for (i = 0; i < r8->unk00; ++i) *(*r12)++ = *r2++; if (r5 != 0) { @@ -1699,12 +1732,12 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) gRfuLinkStatus->LLFReadyFlag = 1; else gRfuLinkStatus->LLFReadyFlag |= 1 << r10; - return r5 + *r8; + return r5 + r8->unk00; } u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) { - const u8 *r5; + const struct RfuHeader *r5; const u8 *sp04; u32 sp00; u8 *r2; @@ -1713,13 +1746,13 @@ u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) if (!r4->dataReadyFlag || !r4->bmSlot) return 0; - r5 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; - sp00 = (r4->state & 0xF) << r5[3] + r5 = &_Str_RfuHeader[gRfuLinkStatus->connMode]; + sp00 = (r4->state & 0xF) << r5->unk03 | r4->payloadSize; if (gRfuLinkStatus->connMode == 1) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; - for (i = 0; i < *r5; ++i) + for (i = 0; i < r5->unk00; ++i) *(*r6)++ = *r2++; sp04 = r4->src; gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); @@ -1727,7 +1760,7 @@ u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) gRfuLinkStatus->LLFReadyFlag = 16; else gRfuLinkStatus->LLFReadyFlag |= 16 << r8; - return *r5 + r4->payloadSize; + return r5->unk00 + r4->payloadSize; } void rfu_REQ_recvData(void) @@ -1825,3 +1858,115 @@ void rfu_STC_CHILD_analyzeRecvPacket(void) r4 -= r0; } while (!(r4 & 0x8000)); } + +u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) +{ + struct RfuTest sp00; + const struct RfuHeader *r6; + u32 r5; + u8 r4; + u32 r0; + u16 r10; + + r6 = &_Str_RfuHeader[~gRfuLinkStatus->connMode & 1]; + if (r3 < r6->unk00) + return r3; + r5 = 0; + for (r4 = 0; r4 < r6->unk00; ++r4) + r5 |= *r7++ << 8 * r4; + sp00.unk00 = (r5 >> r6->unk01) & r6->unk07; + sp00.unk01 = (r5 >> r6->unk02) & r6->unk08; + sp00.unk02 = (r5 >> r6->unk03) & r6->unk09; + sp00.unk03 = (r5 >> r6->unk04) & r6->unk0A; + sp00.unk04 = (r5 >> r6->unk05) & r6->unk0B; + sp00.unk05 = (r5 >> r6->unk06) & r6->unk0C; + sp00.unk06 = (r5 & r6->unk0E) & r5; + r10 = sp00.unk06 + r6->unk00; + if (sp00.unk00 == 0) + { + if (gRfuLinkStatus->connMode == 1) + { + if ((gRfuLinkStatus->connSlotFlag >> r12) & 1) + { + if (sp00.unk02 == 4) + { + rfu_STC_UNI_receive(r12, &sp00, r7); + } + else if (sp00.unk03 == 0) + { + rfu_STC_NI_receive_Receiver(r12, &sp00, r7); + } + else + { + for (r4 = 0; r4 < NELEMS(gRfuSlotStatusNI); ++r4) + if (((gRfuSlotStatusNI[r4]->sub.send.bmSlot >> r12) & 1) + && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) + break; + if (r4 <= 3) + rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7); + } + } + } + else + { + s32 r5 = gRfuLinkStatus->connSlotFlag & sp00.unk01; + + if (r5) + { + for (r4 = 0; r4 < 4; ++r4) + { + if ((r5 >> r4) & 1) + { + if (sp00.unk02 == 4) + rfu_STC_UNI_receive(r4, &sp00, r7); + else if (sp00.unk03 == 0) + rfu_STC_NI_receive_Receiver(r4, &sp00, r7); + else if ((gRfuLinkStatus->sendSlotNIFlag >> r4) & 1) + rfu_STC_NI_receive_Sender(r4, r4, &sp00, r7); + } + } + } + } + } + return r10; +} + +void rfu_STC_UNI_receive(u8 r7, const struct RfuTest *r6, const u8 *sp00) +{ + u8 *sp04; + u32 r2; + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; + struct UNIRecv *r5 = &r3->sub.recv; + + r5->errorCode = 0; + if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06) + { + r3->sub.recv.state = 73; + r5->errorCode = 0x701; + } + else + { + if (r5->dataBlockFlag) + { + if (r5->newDataFlag) + { + r5->errorCode = 0x709; + goto _081E2F0E; + } + } + else + { + if (r5->newDataFlag) + r5->errorCode = 0x708; + } + r5->state = 0x8042; + r2 = r5->dataSize = r6->unk06; + sp04 = gRfuSlotStatusUNI[r7]->recvBuffer; + gRfuFixed->fastCopyPtr(&sp00, &sp04, r2); + r5->newDataFlag = 1; + r5->state = 0; + } +_081E2F0E: + if (r5->errorCode) + gRfuStatic->recvErrorFlag |= 16 << r7; +} -- cgit v1.2.3 From 1fda78fd0a1b0235ec0ee2db85e5ebbfa9fc50b5 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Thu, 2 Jan 2020 06:19:23 +0800 Subject: k.o. librfu_rfu --- asm/librfu.s | 1111 ----------------------------------------------------- include/librfu.h | 14 +- ld_script.txt | 1 - src/librfu_rfu.c | 552 ++++++++++++++++++++++---- src/librfu_stwi.c | 4 +- 5 files changed, 487 insertions(+), 1195 deletions(-) delete mode 100644 asm/librfu.s diff --git a/asm/librfu.s b/asm/librfu.s deleted file mode 100644 index f94aaabf3..000000000 --- a/asm/librfu.s +++ /dev/null @@ -1,1111 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start rfu_STC_NI_receive_Sender -rfu_STC_NI_receive_Sender: @ 81E2F38 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r6, r2, 0 - lsls r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - ldr r1, _081E3004 @ =gRfuSlotStatusNI - lsrs r0, 22 - adds r0, r1 - ldr r0, [r0] - mov r12, r0 - ldrh r0, [r0] - mov r9, r0 - mov r0, r12 - adds r0, 0x21 - ldrb r2, [r6, 0x4] - adds r0, r2 - ldrb r0, [r0] - str r0, [sp] - ldrb r2, [r6, 0x2] - cmp r2, 0x2 - bne _081E2F74 - ldr r0, _081E3008 @ =0x00008022 - cmp r9, r0 - beq _081E2F8E -_081E2F74: - cmp r2, 0x1 - bne _081E2F7E - ldr r0, _081E300C @ =0x00008021 - cmp r9, r0 - beq _081E2F8E -_081E2F7E: - movs r3, 0x1B - add r3, r12 - mov r8, r3 - cmp r2, 0x3 - bne _081E2FB2 - ldr r0, _081E3010 @ =0x00008023 - cmp r9, r0 - bne _081E2FB2 -_081E2F8E: - ldrb r1, [r6, 0x4] - mov r0, r12 - adds r0, 0x21 - adds r0, r1 - ldrb r0, [r0] - movs r7, 0x1B - add r7, r12 - mov r8, r7 - ldrb r2, [r6, 0x5] - cmp r0, r2 - bne _081E2FB2 - adds r0, r7, r1 - movs r1, 0x1 - mov r3, r10 - lsls r1, r3 - ldrb r2, [r0] - orrs r1, r2 - strb r1, [r0] -_081E2FB2: - ldrb r2, [r6, 0x4] - mov r7, r8 - adds r0, r7, r2 - ldrb r0, [r0] - mov r3, r12 - ldrb r1, [r3, 0x1A] - ands r0, r1 - cmp r0, r1 - bne _081E30AE - adds r3, 0x21 - adds r2, r3, r2 - ldrb r0, [r2] - adds r0, 0x1 - movs r1, 0x3 - ands r0, r1 - movs r1, 0 - strb r0, [r2] - ldrb r0, [r6, 0x4] - add r0, r8 - strb r1, [r0] - mov r7, r12 - ldrh r1, [r7] - ldr r2, _081E3014 @ =0x00007fdf - adds r0, r1, r2 - lsls r0, 16 - lsrs r0, 16 - adds r5, r3, 0 - cmp r0, 0x1 - bhi _081E30A0 - ldr r0, _081E300C @ =0x00008021 - cmp r1, r0 - bne _081E3018 - ldrb r1, [r6, 0x4] - lsls r1, 2 - subs r3, 0x1D - adds r1, r3, r1 - ldrh r2, [r7, 0x2E] - ldr r0, [r1] - adds r0, r2 - str r0, [r1] - b _081E302E - .align 2, 0 -_081E3004: .4byte gRfuSlotStatusNI -_081E3008: .4byte 0x00008022 -_081E300C: .4byte 0x00008021 -_081E3010: .4byte 0x00008023 -_081E3014: .4byte 0x00007fdf -_081E3018: - ldrb r2, [r6, 0x4] - lsls r2, 2 - mov r3, r12 - adds r3, 0x4 - adds r2, r3, r2 - mov r7, r12 - ldrh r1, [r7, 0x2E] - lsls r1, 2 - ldr r0, [r2] - adds r0, r1 - str r0, [r2] -_081E302E: - mov r0, r12 - ldrh r1, [r0, 0x2E] - ldr r0, [r0, 0x14] - subs r0, r1 - mov r1, r12 - str r0, [r1, 0x14] - cmp r0, 0 - beq _081E3042 - cmp r0, 0 - bge _081E30AE -_081E3042: - mov r0, r12 - adds r0, 0x20 - movs r2, 0 - strb r2, [r0] - mov r7, r12 - ldrh r1, [r7] - ldr r0, _081E3084 @ =0x00008021 - cmp r1, r0 - bne _081E308C - movs r4, 0 -_081E3056: - adds r0, r5, r4 - movs r1, 0x1 - strb r1, [r0] - lsls r1, r4, 2 - adds r1, r3, r1 - mov r2, r12 - ldrh r0, [r2, 0x2E] - adds r2, r0, 0 - muls r2, r4 - mov r7, r12 - ldr r0, [r7, 0x28] - adds r0, r2 - str r0, [r1] - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E3056 - ldr r0, [r7, 0x30] - str r0, [r7, 0x14] - ldr r0, _081E3088 @ =0x00008022 - strh r0, [r7] - b _081E30AE - .align 2, 0 -_081E3084: .4byte 0x00008021 -_081E3088: .4byte 0x00008022 -_081E308C: - strb r2, [r5] - mov r0, r12 - str r2, [r0, 0x14] - ldr r0, _081E309C @ =0x00008023 - mov r1, r12 - strh r0, [r1] - b _081E30AE - .align 2, 0 -_081E309C: .4byte 0x00008023 -_081E30A0: - lsls r1, 16 - ldr r0, _081E3110 @ =0x80230000 - cmp r1, r0 - bne _081E30AE - ldr r0, _081E3114 @ =0x00008020 - mov r2, r12 - strh r0, [r2] -_081E30AE: - mov r3, r12 - ldrh r0, [r3] - cmp r0, r9 - bne _081E30D8 - ldrb r2, [r6, 0x4] - mov r0, r12 - adds r0, 0x21 - adds r0, r2 - ldrb r0, [r0] - ldr r7, [sp] - cmp r0, r7 - bne _081E30D8 - mov r1, r8 - adds r0, r1, r2 - ldrb r0, [r0] - mov r2, r10 - asrs r0, r2 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E30FE -_081E30D8: - ldr r4, _081E3118 @ =0x04000208 - ldrh r2, [r4] - movs r0, 0 - strh r0, [r4] - ldr r0, _081E311C @ =gRfuStatic - ldr r3, [r0] - movs r0, 0x10 - mov r7, r10 - lsls r0, r7 - ldrb r1, [r3, 0x2] - orrs r0, r1 - movs r1, 0 - strb r0, [r3, 0x2] - lsls r0, r7, 2 - ldr r3, _081E3120 @ =gRfuSlotStatusNI - adds r0, r3 - ldr r0, [r0] - strh r1, [r0, 0x2] - strh r2, [r4] -_081E30FE: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E3110: .4byte 0x80230000 -_081E3114: .4byte 0x00008020 -_081E3118: .4byte 0x04000208 -_081E311C: .4byte gRfuStatic -_081E3120: .4byte gRfuSlotStatusNI - thumb_func_end rfu_STC_NI_receive_Sender - - thumb_func_start rfu_STC_NI_receive_Receiver -rfu_STC_NI_receive_Receiver: @ 81E3124 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r6, r1, 0 - str r2, [sp] - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - movs r7, 0 - ldr r1, _081E3184 @ =gRfuSlotStatusNI - lsls r0, 2 - adds r0, r1 - ldr r4, [r0] - adds r5, r4, 0 - adds r5, 0x34 - ldrh r0, [r4, 0x34] - mov r9, r0 - ldrb r0, [r6, 0x4] - adds r3, r4, 0 - adds r3, 0x55 - adds r0, r3, r0 - ldrb r0, [r0] - mov r10, r0 - ldrb r0, [r6, 0x2] - cmp r0, 0x3 - bne _081E3194 - ldr r0, _081E3188 @ =gRfuStatic - ldr r2, [r0] - movs r0, 0x1 - mov r1, r8 - lsls r0, r1 - ldrb r1, [r2, 0x1] - orrs r0, r1 - strb r0, [r2, 0x1] - ldrh r1, [r4, 0x34] - ldr r0, _081E318C @ =0x00008042 - cmp r1, r0 - bne _081E31DA - adds r0, r4, 0 - adds r0, 0x54 - strb r7, [r0] - strb r7, [r3] - ldr r0, _081E3190 @ =0x00008043 - strh r0, [r4, 0x34] - b _081E31DA - .align 2, 0 -_081E3184: .4byte gRfuSlotStatusNI -_081E3188: .4byte gRfuStatic -_081E318C: .4byte 0x00008042 -_081E3190: .4byte 0x00008043 -_081E3194: - cmp r0, 0x2 - bne _081E31C0 - ldr r0, _081E31B8 @ =0x00008041 - cmp r9, r0 - bne _081E31AC - ldr r0, [r5, 0x14] - cmp r0, 0 - bne _081E31AC - mov r0, r8 - adds r1, r5, 0 - bl rfu_STC_NI_initSlot_asRecvDataEntity -_081E31AC: - ldrh r1, [r5] - ldr r0, _081E31BC @ =0x00008042 - cmp r1, r0 - bne _081E31DA - b _081E31DE - .align 2, 0 -_081E31B8: .4byte 0x00008041 -_081E31BC: .4byte 0x00008042 -_081E31C0: - cmp r0, 0x1 - bne _081E31DA - ldr r7, _081E328C @ =0x00008041 - cmp r9, r7 - beq _081E31DE - mov r0, r8 - adds r1, r5, 0 - bl rfu_STC_NI_initSlot_asRecvControllData - ldrh r0, [r4, 0x34] - cmp r0, r7 - bne _081E327A - movs r7, 0x1 -_081E31DA: - cmp r7, 0 - beq _081E3234 -_081E31DE: - ldrb r2, [r6, 0x5] - ldrb r3, [r6, 0x4] - adds r4, r5, 0 - adds r4, 0x21 - adds r0, r4, r3 - ldrb r0, [r0] - adds r0, 0x1 - movs r1, 0x3 - ands r0, r1 - cmp r2, r0 - bne _081E3234 - ldr r0, _081E3290 @ =gRfuFixed - ldr r0, [r0] - lsls r1, r3, 2 - adds r1, 0x4 - adds r1, r5, r1 - ldrh r2, [r6, 0x6] - ldr r3, [r0, 0x4] - mov r0, sp - bl _call_via_r3 - ldrh r1, [r5] - ldr r0, _081E3294 @ =0x00008042 - cmp r1, r0 - bne _081E3224 - ldrb r0, [r6, 0x4] - lsls r0, 2 - adds r2, r5, 0x4 - adds r2, r0 - ldrh r0, [r5, 0x2E] - lsls r1, r0, 1 - adds r1, r0 - ldr r0, [r2] - adds r0, r1 - str r0, [r2] -_081E3224: - ldrh r1, [r6, 0x6] - ldr r0, [r5, 0x14] - subs r0, r1 - str r0, [r5, 0x14] - ldrb r0, [r6, 0x4] - adds r0, r4, r0 - ldrb r1, [r6, 0x5] - strb r1, [r0] -_081E3234: - ldrh r0, [r5, 0x18] - cmp r0, 0 - bne _081E327A - ldrb r0, [r6, 0x4] - adds r1, r5, 0 - adds r1, 0x20 - strb r0, [r1] - ldrh r0, [r5] - cmp r0, r9 - bne _081E325C - adds r0, r5, 0 - adds r0, 0x21 - ldrb r2, [r6, 0x4] - adds r0, r2 - ldrb r0, [r0] - cmp r0, r10 - bne _081E325C - ldrb r6, [r6, 0x5] - cmp r0, r6 - bne _081E327A -_081E325C: - ldr r3, _081E3298 @ =0x04000208 - ldrh r2, [r3] - movs r0, 0 - strh r0, [r3] - ldr r0, _081E329C @ =gRfuStatic - ldr r4, [r0] - movs r0, 0x1 - mov r1, r8 - lsls r0, r1 - ldrb r1, [r4, 0x2] - orrs r0, r1 - movs r1, 0 - strb r0, [r4, 0x2] - strh r1, [r5, 0x2] - strh r2, [r3] -_081E327A: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E328C: .4byte 0x00008041 -_081E3290: .4byte gRfuFixed -_081E3294: .4byte 0x00008042 -_081E3298: .4byte 0x04000208 -_081E329C: .4byte gRfuStatic - thumb_func_end rfu_STC_NI_receive_Receiver - - thumb_func_start rfu_STC_NI_initSlot_asRecvControllData -rfu_STC_NI_initSlot_asRecvControllData: @ 81E32A0 - push {r4-r7,lr} - adds r2, r1, 0 - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _081E32BC @ =gRfuLinkStatus - ldr r3, [r0] - ldrb r1, [r3] - mov r12, r0 - cmp r1, 0x1 - bne _081E32C0 - movs r5, 0x3 - adds r1, r3, 0 - adds r1, 0xF - b _081E32C8 - .align 2, 0 -_081E32BC: .4byte gRfuLinkStatus -_081E32C0: - movs r5, 0x2 - adds r0, r4, 0 - adds r0, 0x10 - adds r1, r3, r0 -_081E32C8: - movs r7, 0x1 - adds r0, r7, 0 - lsls r0, r4 - lsls r0, 24 - lsrs r6, r0, 24 - adds r4, r6, 0 - ldrh r3, [r2] - cmp r3, 0 - bne _081E3326 - ldrb r0, [r1] - cmp r0, r5 - bcs _081E3300 - movs r0, 0x49 - strh r0, [r2] - ldr r0, _081E32F8 @ =0x00000702 - strh r0, [r2, 0x18] - ldr r0, _081E32FC @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2, 0x4] - adds r0, r6, 0 - orrs r0, r1 - strb r0, [r2, 0x4] - b _081E3326 - .align 2, 0 -_081E32F8: .4byte 0x00000702 -_081E32FC: .4byte gRfuStatic -_081E3300: - strh r3, [r2, 0x18] - ldrb r0, [r1] - subs r0, r5 - strb r0, [r1] - adds r0, r2, 0 - adds r0, 0x2D - str r0, [r2, 0x4] - movs r0, 0x7 - str r0, [r2, 0x14] - strb r7, [r2, 0x1F] - strh r3, [r2, 0x2E] - strb r4, [r2, 0x1A] - ldr r0, _081E332C @ =0x00008041 - strh r0, [r2] - mov r0, r12 - ldr r1, [r0] - ldrb r0, [r1, 0x5] - orrs r4, r0 - strb r4, [r1, 0x5] -_081E3326: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E332C: .4byte 0x00008041 - thumb_func_end rfu_STC_NI_initSlot_asRecvControllData - - thumb_func_start rfu_STC_NI_initSlot_asRecvDataEntity -rfu_STC_NI_initSlot_asRecvDataEntity: @ 81E3330 - push {r4-r7,lr} - adds r4, r1, 0 - lsls r0, 24 - lsrs r5, r0, 24 - adds r0, r4, 0 - adds r0, 0x2D - ldrb r0, [r0] - cmp r0, 0x1 - bne _081E3354 - ldr r0, _081E3350 @ =gRfuLinkStatus - lsls r1, r5, 5 - adds r1, 0x14 - ldr r0, [r0] - adds r0, r1 - adds r0, 0x4 - b _081E33AA - .align 2, 0 -_081E3350: .4byte gRfuLinkStatus -_081E3354: - ldr r1, _081E3398 @ =gRfuSlotStatusNI - lsls r0, r5, 2 - adds r0, r1 - ldr r2, [r0] - ldr r1, [r4, 0x30] - ldr r0, [r2, 0x6C] - cmp r1, r0 - bls _081E33A8 - movs r1, 0x80 - lsls r1, 17 - lsls r1, r5 - lsrs r1, 24 - ldr r0, _081E339C @ =gRfuStatic - ldr r3, [r0] - ldrb r2, [r3, 0x4] - adds r0, r1, 0 - orrs r0, r2 - strb r0, [r3, 0x4] - ldr r0, _081E33A0 @ =gRfuLinkStatus - ldr r2, [r0] - ldrb r0, [r2, 0x5] - bics r0, r1 - strb r0, [r2, 0x5] - ldr r0, _081E33A4 @ =0x00000701 - strh r0, [r4, 0x18] - movs r0, 0x47 - strh r0, [r4] - adds r0, r5, 0 - movs r1, 0x1 - adds r2, r4, 0 - bl rfu_STC_releaseFrame - b _081E33DC - .align 2, 0 -_081E3398: .4byte gRfuSlotStatusNI -_081E339C: .4byte gRfuStatic -_081E33A0: .4byte gRfuLinkStatus -_081E33A4: .4byte 0x00000701 -_081E33A8: - ldr r0, [r2, 0x68] -_081E33AA: - str r0, [r4, 0x4] - movs r3, 0 - adds r6, r4, 0 - adds r6, 0x21 - movs r7, 0 - adds r5, r4, 0x4 -_081E33B6: - adds r0, r6, r3 - strb r7, [r0] - lsls r1, r3, 2 - adds r1, r5, r1 - ldrh r0, [r4, 0x2E] - adds r2, r0, 0 - muls r2, r3 - ldr r0, [r4, 0x4] - adds r0, r2 - str r0, [r1] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x3 - bls _081E33B6 - ldr r0, [r4, 0x30] - str r0, [r4, 0x14] - ldr r0, _081E33E4 @ =0x00008042 - strh r0, [r4] -_081E33DC: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E33E4: .4byte 0x00008042 - thumb_func_end rfu_STC_NI_initSlot_asRecvDataEntity - - thumb_func_start rfu_NI_checkCommFailCounter -rfu_NI_checkCommFailCounter: @ 81E33E8 - push {r4-r7,lr} - ldr r2, _081E3474 @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r1, [r0, 0x4] - ldrb r0, [r0, 0x5] - orrs r0, r1 - cmp r0, 0 - beq _081E346E - ldr r1, _081E3478 @ =0x04000208 - ldrh r0, [r1] - mov r12, r0 - movs r0, 0 - strh r0, [r1] - ldr r1, _081E347C @ =gRfuStatic - ldr r0, [r1] - ldrb r0, [r0, 0x2] - lsrs r7, r0, 4 - movs r3, 0 - adds r6, r1, 0 - adds r5, r2, 0 - ldr r4, _081E3480 @ =gRfuSlotStatusNI -_081E3412: - movs r0, 0x80 - lsls r0, 17 - lsls r0, r3 - lsrs r2, r0, 24 - ldr r0, [r5] - ldrb r0, [r0, 0x4] - ands r0, r2 - cmp r0, 0 - beq _081E343A - ldr r0, [r6] - ldrb r0, [r0, 0x2] - ands r0, r2 - cmp r0, 0 - bne _081E343A - lsls r0, r3, 2 - adds r0, r4 - ldr r1, [r0] - ldrh r0, [r1, 0x2] - adds r0, 0x1 - strh r0, [r1, 0x2] -_081E343A: - ldr r0, [r5] - ldrb r0, [r0, 0x5] - ands r0, r2 - cmp r0, 0 - beq _081E3458 - adds r0, r7, 0 - ands r0, r2 - cmp r0, 0 - bne _081E3458 - lsls r0, r3, 2 - adds r0, r4 - ldr r1, [r0] - ldrh r0, [r1, 0x36] - adds r0, 0x1 - strh r0, [r1, 0x36] -_081E3458: - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x3 - bls _081E3412 - ldr r0, [r6] - movs r1, 0 - strb r1, [r0, 0x2] - ldr r0, _081E3478 @ =0x04000208 - mov r1, r12 - strh r1, [r0] -_081E346E: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E3474: .4byte gRfuLinkStatus -_081E3478: .4byte 0x04000208 -_081E347C: .4byte gRfuStatic -_081E3480: .4byte gRfuSlotStatusNI - thumb_func_end rfu_NI_checkCommFailCounter - - thumb_func_start rfu_REQ_noise -rfu_REQ_noise: @ 81E3484 - push {lr} - ldr r0, _081E3498 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - movs r0, 0x1 - movs r1, 0 - bl STWI_send_TestModeREQ - pop {r0} - bx r0 - .align 2, 0 -_081E3498: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_noise - - thumb_func_start sub_81E349C -sub_81E349C: @ 81E349C - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _081E34B4 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081E34B8 - movs r0, 0x1 - negs r0, r0 - b _081E3538 - .align 2, 0 -_081E34B4: .4byte 0x04000208 -_081E34B8: - ldr r0, _081E34E4 @ =0x04000200 - ldrh r0, [r0] - mov r8, r0 - ldr r4, _081E34E8 @ =gRfuState - ldr r1, [r4] - movs r0, 0xA - str r0, [r1] - ldr r0, _081E34EC @ =sub_81E36B8 - bl STWI_set_Callback_ID - bl sub_81E3550 - ldr r0, [r4] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r1, _081E34F0 @ =0x04000100 - adds r4, r0, r1 - lsls r0, r5, 27 - lsrs r5, r0, 24 - movs r7, 0 - b _081E3506 - .align 2, 0 -_081E34E4: .4byte 0x04000200 -_081E34E8: .4byte gRfuState -_081E34EC: .4byte sub_81E36B8 -_081E34F0: .4byte 0x04000100 -_081E34F4: - strh r6, [r4, 0x2] - strh r6, [r4] - movs r0, 0x83 - strh r0, [r4, 0x2] -_081E34FC: - ldrh r0, [r4] - cmp r0, 0x1F - bls _081E34FC - strh r7, [r4, 0x2] - strh r7, [r4] -_081E3506: - subs r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0xFF - beq _081E351A - bl sub_81E35C4 - adds r6, r0, 0 - cmp r6, 0 - beq _081E34F4 -_081E351A: - ldr r1, _081E3544 @ =0x04000208 - movs r0, 0 - strh r0, [r1] - ldr r0, _081E3548 @ =0x04000200 - mov r2, r8 - strh r2, [r0] - movs r0, 0x1 - strh r0, [r1] - ldr r0, _081E354C @ =gRfuState - ldr r1, [r0] - movs r0, 0 - str r0, [r1] - bl STWI_set_Callback_ID - adds r0, r6, 0 -_081E3538: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E3544: .4byte 0x04000208 -_081E3548: .4byte 0x04000200 -_081E354C: .4byte gRfuState - thumb_func_end sub_81E349C - - thumb_func_start sub_81E3550 -sub_81E3550: @ 81E3550 - push {r4,r5,lr} - sub sp, 0x4 - ldr r3, _081E35A8 @ =0x04000208 - movs r4, 0 - strh r4, [r3] - ldr r2, _081E35AC @ =0x04000200 - ldr r0, _081E35B0 @ =gRfuState - ldr r0, [r0] - movs r1, 0x8 - ldrb r0, [r0, 0xA] - lsls r1, r0 - movs r5, 0x80 - orrs r1, r5 - ldrh r0, [r2] - bics r0, r1 - strh r0, [r2] - movs r0, 0x1 - strh r0, [r3] - ldr r0, _081E35B4 @ =0x04000134 - strh r4, [r0] - subs r2, 0xD8 - movs r1, 0x80 - lsls r1, 5 - adds r0, r1, 0 - strh r0, [r2] - ldrh r0, [r2] - movs r3, 0x81 - lsls r3, 7 - adds r1, r3, 0 - orrs r0, r1 - strh r0, [r2] - movs r0, 0 - str r0, [sp] - ldr r1, _081E35B8 @ =gUnknown_3007470 - ldr r2, _081E35BC @ =0x05000003 - mov r0, sp - bl CpuSet - ldr r0, _081E35C0 @ =0x04000202 - strh r5, [r0] - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E35A8: .4byte 0x04000208 -_081E35AC: .4byte 0x04000200 -_081E35B0: .4byte gRfuState -_081E35B4: .4byte 0x04000134 -_081E35B8: .4byte gUnknown_3007470 -_081E35BC: .4byte 0x05000003 -_081E35C0: .4byte 0x04000202 - thumb_func_end sub_81E3550 - - thumb_func_start sub_81E35C4 -sub_81E35C4: @ 81E35C4 - push {r4-r7,lr} - ldr r0, _081E35D8 @ =gUnknown_3007470 - ldrb r1, [r0, 0x1] - mov r12, r1 - adds r7, r0, 0 - cmp r1, 0 - beq _081E35DC - cmp r1, 0x1 - beq _081E3614 - b _081E36AC - .align 2, 0 -_081E35D8: .4byte gUnknown_3007470 -_081E35DC: - movs r6, 0x1 - strb r6, [r7] - ldr r3, _081E3608 @ =0x04000128 - ldrh r0, [r3] - movs r5, 0x1 - orrs r0, r5 - strh r0, [r3] - ldr r4, _081E360C @ =0x04000208 - mov r0, r12 - strh r0, [r4] - ldr r2, _081E3610 @ =0x04000200 - ldrh r0, [r2] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r2] - strh r6, [r4] - strb r5, [r7, 0x1] - ldrb r0, [r3] - orrs r0, r1 - strb r0, [r3] - b _081E36B0 - .align 2, 0 -_081E3608: .4byte 0x04000128 -_081E360C: .4byte 0x04000208 -_081E3610: .4byte 0x04000200 -_081E3614: - ldrh r0, [r7, 0xA] - cmp r0, 0 - bne _081E36A8 - ldrb r0, [r7] - cmp r0, 0x1 - bne _081E3644 - ldrh r0, [r7, 0x2] - cmp r0, 0 - bne _081E36B0 - ldr r3, _081E363C @ =0x04000208 - strh r0, [r3] - ldr r2, _081E3640 @ =0x04000128 - ldrh r0, [r2] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r2] - mov r1, r12 - strh r1, [r3] - b _081E36B0 - .align 2, 0 -_081E363C: .4byte 0x04000208 -_081E3640: .4byte 0x04000128 -_081E3644: - ldrh r1, [r7, 0x4] - ldr r0, _081E3690 @ =0x00008001 - cmp r1, r0 - beq _081E36B0 - ldrh r6, [r7, 0x2] - cmp r6, 0 - bne _081E36B0 - ldr r4, _081E3694 @ =0x04000208 - strh r6, [r4] - ldr r3, _081E3698 @ =0x04000200 - ldrh r1, [r3] - ldr r0, _081E369C @ =0x0000ff7f - ands r0, r1 - strh r0, [r3] - mov r7, r12 - strh r7, [r4] - ldr r2, _081E36A0 @ =0x04000128 - strh r6, [r2] - movs r1, 0x80 - lsls r1, 5 - adds r0, r1, 0 - strh r0, [r2] - ldr r0, _081E36A4 @ =0x04000202 - movs r5, 0x80 - strh r5, [r0] - ldrh r0, [r2] - movs r7, 0x81 - lsls r7, 7 - adds r1, r7, 0 - orrs r0, r1 - strh r0, [r2] - strh r6, [r4] - ldrh r0, [r3] - orrs r0, r5 - strh r0, [r3] - mov r0, r12 - strh r0, [r4] - b _081E36B0 - .align 2, 0 -_081E3690: .4byte 0x00008001 -_081E3694: .4byte 0x04000208 -_081E3698: .4byte 0x04000200 -_081E369C: .4byte 0x0000ff7f -_081E36A0: .4byte 0x04000128 -_081E36A4: .4byte 0x04000202 -_081E36A8: - movs r0, 0x2 - strb r0, [r7, 0x1] -_081E36AC: - ldrh r0, [r7, 0xA] - b _081E36B2 -_081E36B0: - movs r0, 0 -_081E36B2: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_81E35C4 - - thumb_func_start sub_81E36B8 -sub_81E36B8: @ 81E36B8 - push {r4,r5,lr} - ldr r0, _081E3700 @ =0x04000120 - ldr r5, [r0] - ldr r0, _081E3704 @ =gUnknown_3007470 - ldrb r1, [r0] - adds r4, r0, 0 - cmp r1, 0x1 - beq _081E36D2 - ldr r0, _081E3708 @ =0x04000128 - ldrh r1, [r0] - movs r2, 0x80 - orrs r1, r2 - strh r1, [r0] -_081E36D2: - ldrb r2, [r4] - lsls r1, r2, 4 - adds r0, r5, 0 - lsls r0, r1 - lsrs r1, r0, 16 - movs r0, 0x1 - subs r0, r2 - lsls r0, 4 - lsls r5, r0 - adds r0, r5, 0 - lsrs r5, r0, 16 - ldrh r0, [r4, 0xA] - cmp r0, 0 - bne _081E3726 - ldrh r2, [r4, 0x6] - cmp r1, r2 - bne _081E3724 - ldrh r3, [r4, 0x2] - cmp r3, 0x3 - bls _081E370C - strh r5, [r4, 0xA] - b _081E3726 - .align 2, 0 -_081E3700: .4byte 0x04000120 -_081E3704: .4byte gUnknown_3007470 -_081E3708: .4byte 0x04000128 -_081E370C: - ldrh r0, [r4, 0x4] - mvns r0, r0 - lsls r0, 16 - lsrs r0, 16 - cmp r1, r0 - bne _081E3726 - mvns r0, r2 - lsls r0, 16 - lsrs r0, 16 - cmp r5, r0 - bne _081E3726 - adds r0, r3, 0x1 -_081E3724: - strh r0, [r4, 0x2] -_081E3726: - ldrh r0, [r4, 0x2] - cmp r0, 0x3 - bhi _081E373C - lsls r0, 1 - ldr r1, _081E3738 @ =_Str_Sio32ID - adds r0, r1 - ldrh r0, [r0] - b _081E373E - .align 2, 0 -_081E3738: .4byte _Str_Sio32ID -_081E373C: - ldr r0, _081E3794 @ =0x00008001 -_081E373E: - strh r0, [r4, 0x4] - mvns r0, r5 - strh r0, [r4, 0x6] - ldr r3, _081E3798 @ =0x04000120 - ldrh r2, [r4, 0x4] - ldrb r1, [r4] - movs r0, 0x1 - subs r0, r1 - lsls r0, 4 - lsls r2, r0 - ldrh r0, [r4, 0x6] - lsls r1, 4 - lsls r0, r1 - adds r2, r0 - str r2, [r3] - ldrb r0, [r4] - cmp r0, 0x1 - bne _081E378C - ldrh r0, [r4, 0x2] - cmp r0, 0 - bne _081E376E - ldr r0, _081E379C @ =0x0000494e - cmp r5, r0 - bne _081E378C -_081E376E: - movs r0, 0 - ldr r1, _081E37A0 @ =0x00000257 -_081E3772: - adds r0, 0x1 - lsls r0, 16 - lsrs r0, 16 - cmp r0, r1 - bls _081E3772 - ldrh r0, [r4, 0xA] - cmp r0, 0 - bne _081E378C - ldr r0, _081E37A4 @ =0x04000128 - ldrh r1, [r0] - movs r2, 0x80 - orrs r1, r2 - strh r1, [r0] -_081E378C: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E3794: .4byte 0x00008001 -_081E3798: .4byte 0x04000120 -_081E379C: .4byte 0x0000494e -_081E37A0: .4byte 0x00000257 -_081E37A4: .4byte 0x04000128 - thumb_func_end sub_81E36B8 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/librfu.h b/include/librfu.h index e50f5cc89..8bc1e636d 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -3,9 +3,11 @@ #include "main.h" -/* TODOs: +/* TODOs: + * - decide file boundaries * - documentation * - check if any field needs to be volatile + * - check if field names make sense * - decompile librfu_intr.s once arm support is back again */ @@ -124,7 +126,7 @@ struct RfuStruct u8 unk_17; void (*callbackM)(); void (*callbackS)(u16); - u32 callbackId; + void (*unk_20)(void); union RfuPacket *txPacket; union RfuPacket *rxPacket; vu8 unk_2c; @@ -168,7 +170,7 @@ struct NIComm u16 state; u16 failCounter; const u8 *nowP[4]; - u32 remainSize; + s32 remainSize; u16 errorCode; u8 bmSlot; u8 recvAckFlag[4]; @@ -261,7 +263,8 @@ struct Unk_3007470 u8 unk1; u16 unk2; u16 unk4; - u8 fill6[4]; + u16 unk6; + u16 unk8; // unused u16 unkA; }; @@ -330,6 +333,7 @@ void rfu_UNI_readySendData(u8 a0); void rfu_UNI_clearRecvNewDataFlag(u8 a0); void rfu_REQ_PARENT_resumeRetransmitAndChange(void); s32 rfu_NI_setSendData(u8, u8, const void *, u32); +void rfu_REQ_noise(void); // librfu_intr void IntrSIO32(void); @@ -343,7 +347,7 @@ void STWI_set_Callback_M(void *callbackM); void STWI_set_Callback_S(void (*callbackS)(u16)); void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect); void AgbRFU_SoftReset(void); -void STWI_set_Callback_ID(u32 id); +void STWI_set_CallbackUnk(void (*func)(void)); u16 STWI_read_status(u8 index); u16 STWI_poll_CommandEnd(void); void STWI_send_DataRxREQ(void); diff --git a/ld_script.txt b/ld_script.txt index 89bf60c16..08adda00d 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -320,7 +320,6 @@ SECTIONS { src/librfu_stwi.o(.text); asm/librfu_intr.o(.text); src/librfu_rfu.o(.text); - asm/librfu.o(.text); src/isagbprn.o(.text); asm/libagbsyscall.o(.text); *libgcc.a:_call_via_rX.o(.text); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index e53aade49..140aa353e 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -19,7 +19,7 @@ struct RfuHeader u16 unk0E; }; -struct RfuTest +struct RfuLocalStruct { u8 unk00; u8 unk01; @@ -30,45 +30,51 @@ struct RfuTest u16 unk06; }; -void rfu_CB_defaultCallback(u8, u16); -void rfu_CB_reset(u8, u16); -void rfu_CB_configGameData(u8, u16); -void rfu_CB_stopMode(u8, u16); -void rfu_CB_startSearchChild(u8, u16); -void rfu_CB_pollAndEndSearchChild(u8, u16); -void rfu_CB_startSearchParent(u8, u16); -void rfu_CB_pollSearchParent(u8, u16); -void rfu_CB_pollConnectParent(u8, u16); -void rfu_CB_pollConnectParent(u8, u16); -void rfu_CB_disconnect(u8, u16); -void rfu_CB_CHILD_pollConnectRecovery(u8, u16); -void rfu_CB_sendData(UNUSED u8, u16); -void rfu_CB_sendData2(UNUSED u8, u16); -void rfu_CB_sendData3(u8, u16); -void rfu_CB_recvData(u8, u16); -s32 sub_81E349C(u8); -void rfu_enableREQCallback(bool8); -void rfu_STC_clearAPIVariables(void); -void rfu_STC_readChildList(void); -void rfu_STC_readParentCandidateList(void); -void rfu_STC_REQ_callback(u8, u16); -void rfu_STC_removeLinkData(u8, u8); -void rfu_STC_fastCopy(const u8 **, u8 **, s32); -void rfu_STC_clearLinkStatus(u8); -void rfu_NI_checkCommFailCounter(void); -u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32); -void rfu_constructSendLLFrame(void); -u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); -u16 rfu_STC_UNI_constructLLSF(u8, u8 **); -void rfu_STC_PARENT_analyzeRecvPacket(void); -void rfu_STC_CHILD_analyzeRecvPacket(void); -u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16); -void rfu_STC_UNI_receive(u8, const struct RfuTest *, const u8 *); -void rfu_STC_NI_receive_Receiver(u8, const struct RfuTest *, const u8 *); -void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuTest *, UNUSED const u8 *); +static void rfu_CB_defaultCallback(u8, u16); +static void rfu_CB_reset(u8, u16); +static void rfu_CB_configGameData(u8, u16); +static void rfu_CB_stopMode(u8, u16); +static void rfu_CB_startSearchChild(u8, u16); +static void rfu_CB_pollAndEndSearchChild(u8, u16); +static void rfu_CB_startSearchParent(u8, u16); +static void rfu_CB_pollSearchParent(u8, u16); +static void rfu_CB_pollConnectParent(u8, u16); +static void rfu_CB_pollConnectParent(u8, u16); +static void rfu_CB_disconnect(u8, u16); +static void rfu_CB_CHILD_pollConnectRecovery(u8, u16); +static void rfu_CB_sendData(UNUSED u8, u16); +static void rfu_CB_sendData2(UNUSED u8, u16); +static void rfu_CB_sendData3(u8, u16); +static void rfu_CB_recvData(u8, u16); +static s32 sub_81E349C(u8); +static void sub_81E36B8(void); +static void sub_81E3550(void); +static s32 sub_81E35C4(void); +static void rfu_enableREQCallback(bool8); +static void rfu_STC_clearAPIVariables(void); +static void rfu_STC_readChildList(void); +static void rfu_STC_readParentCandidateList(void); +static void rfu_STC_REQ_callback(u8, u16); +static void rfu_STC_removeLinkData(u8, u8); +static void rfu_STC_fastCopy(const u8 **, u8 **, s32); +static void rfu_STC_clearLinkStatus(u8); +static void rfu_NI_checkCommFailCounter(void); +static u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32); +static void rfu_constructSendLLFrame(void); +static u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); +static u16 rfu_STC_UNI_constructLLSF(u8, u8 **); +static void rfu_STC_PARENT_analyzeRecvPacket(void); +static void rfu_STC_CHILD_analyzeRecvPacket(void); +static u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16); +static void rfu_STC_UNI_receive(u8, const struct RfuLocalStruct *, const u8 *); +static void rfu_STC_NI_receive_Receiver(u8, const struct RfuLocalStruct *, const u8 *); +static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, UNUSED const u8 *); +static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *); +static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *); extern const char _Str_RFU_MBOOT[]; extern const struct RfuHeader _Str_RfuHeader[2]; +extern const u16 _Str_Sio32ID[]; struct RfuStruct *gRfuState; ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; @@ -91,7 +97,6 @@ u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, b // is not 4-byte aligned? if ((u32)unk0 & 3) return 2; - // Nintendo pls, just use a ternary for once if (copyInterruptToRam) { // An assert/debug print may have existed before, ie @@ -140,7 +145,7 @@ u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, b return 0; } -void rfu_STC_clearAPIVariables(void) +static void rfu_STC_clearAPIVariables(void) { u16 IMEBackup = REG_IME; u8 i, r4; @@ -169,6 +174,7 @@ void rfu_REQ_PARENT_resumeRetransmitAndChange(void) u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) { struct RfuIntrStruct *buf; + *ackFlag = 0; if (gRfuLinkStatus->connMode != 1) return 0x300; @@ -208,7 +214,7 @@ void rfu_setREQCallback(void (*callback)(u16, u16)) rfu_enableREQCallback(callback != NULL); } -void rfu_enableREQCallback(bool8 enable) +static void rfu_enableREQCallback(bool8 enable) { if (enable) gRfuStatic->flags |= 8; @@ -216,7 +222,7 @@ void rfu_enableREQCallback(bool8 enable) gRfuStatic->flags &= 0xF7; } -void rfu_STC_REQ_callback(u8 r5, u16 reqResult) +static void rfu_STC_REQ_callback(u8 r5, u16 reqResult) { STWI_set_Callback_M(rfu_CB_defaultCallback); gRfuStatic->reqResult = reqResult; @@ -224,7 +230,7 @@ void rfu_STC_REQ_callback(u8 r5, u16 reqResult) gRfuFixed->reqCallback(r5, reqResult); } -void rfu_CB_defaultCallback(u8 r0, u16 reqResult) +static void rfu_CB_defaultCallback(u8 r0, u16 reqResult) { s32 r5; u8 i; @@ -264,7 +270,7 @@ u32 rfu_getRFUStatus(u8 *status) return 0; } -s32 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) +static s32 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) { const char *s1 = _Str_RFU_MBOOT; char *s2 = (char *)0x30000F0; @@ -318,7 +324,7 @@ void rfu_REQ_stopMode(void) } } -void rfu_CB_stopMode(u8 a1, u16 reqResult) +static void rfu_CB_stopMode(u8 a1, u16 reqResult) { if (reqResult == 0) REG_SIOCNT = SIO_MULTI_MODE; @@ -344,7 +350,7 @@ void rfu_REQ_reset(void) STWI_send_ResetREQ(); } -void rfu_CB_reset(u8 a1, u16 reqResult) +static void rfu_CB_reset(u8 a1, u16 reqResult) { if (reqResult == 0) rfu_STC_clearAPIVariables(); @@ -397,7 +403,7 @@ void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7) STWI_send_GameConfigREQ(sp, r7); } -void rfu_CB_configGameData(u8 ip, u16 r7) +static void rfu_CB_configGameData(u8 ip, u16 r7) { s32 r2, r3; u8 *r4; @@ -448,14 +454,14 @@ void rfu_REQ_startSearchChild(void) STWI_send_SC_StartREQ(); } -void rfu_CB_startSearchChild(u8 r3, u16 reqResult) +static void rfu_CB_startSearchChild(u8 r3, u16 reqResult) { if (reqResult == 0) gRfuStatic->SCStartFlag = 1; rfu_STC_REQ_callback(r3, reqResult); } -void rfu_STC_clearLinkStatus(u8 r4) +static void rfu_STC_clearLinkStatus(u8 r4) { u8 i; @@ -485,7 +491,7 @@ void rfu_REQ_endSearchChild(void) STWI_send_SC_EndREQ(); } -void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) +static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) { if (reqResult == 0) rfu_STC_readChildList(); @@ -508,7 +514,7 @@ void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) rfu_STC_REQ_callback(r4, reqResult); } -void rfu_STC_readChildList(void) +static void rfu_STC_readChildList(void) { u32 r5; u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; @@ -562,7 +568,7 @@ void rfu_REQ_startSearchParent(void) STWI_send_SP_StartREQ(); } -void rfu_CB_startSearchParent(u8 r5, u16 reqResult) +static void rfu_CB_startSearchParent(u8 r5, u16 reqResult) { if (reqResult == 0) rfu_STC_clearLinkStatus(0); @@ -575,7 +581,7 @@ void rfu_REQ_pollSearchParent(void) STWI_send_SP_PollingREQ(); } -void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) +static void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) { if (reqResult == 0) rfu_STC_readParentCandidateList(); @@ -588,7 +594,7 @@ void rfu_REQ_endSearchParent(void) STWI_send_SP_EndREQ(); } -void rfu_STC_readParentCandidateList(void) +static void rfu_STC_readParentCandidateList(void) { u8 r7, r6, r5, r4, r3; u8 *r1, *r2; @@ -662,7 +668,7 @@ void rfu_REQ_pollConnectParent(void) STWI_send_CP_PollingREQ(); } -void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) +static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) { u16 id; u8 slot; @@ -955,7 +961,7 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) return 0; } -void rfu_STC_removeLinkData(u8 r7, u8 r12) +static void rfu_STC_removeLinkData(u8 r7, u8 r12) { u8 r5 = 1 << r7; s32 r6; @@ -1002,7 +1008,7 @@ void rfu_REQ_disconnect(u8 who) } } -void rfu_CB_disconnect(u8 r6, u16 r5) +static void rfu_CB_disconnect(u8 r6, u16 r5) { u8 r4, r0; @@ -1055,7 +1061,7 @@ void rfu_REQ_CHILD_pollConnectRecovery(void) STWI_send_CPR_PollingREQ(); } -void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) +static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) { u8 r3, r4; struct RfuLinkStatus *r2; @@ -1100,7 +1106,7 @@ void rfu_REQ_CHILD_endConnectRecovery(void) STWI_send_CPR_EndREQ(); } -void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) +static void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) { const u8 *src = *src_p; u8 *dst = *dst_p; @@ -1162,7 +1168,7 @@ void rfu_clearAllSlot(void) REG_IME = IMEBackup; } -void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) +static void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) { if (!(gRfuStatic->flags & 0x80)) @@ -1288,7 +1294,7 @@ s32 rfu_NI_CHILD_setSendGameName(u8 a1, u8 a2) return rfu_STC_setSendData_org(64, 1 << a1, a2, &gRfuLinkStatus->my.serialNum, 26); } -u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) +static u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) { u8 r2, r0; u8 r4; @@ -1401,7 +1407,7 @@ s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) } gRfuLinkStatus->sendSlotNIFlag &= ~r3; r5->sub.send.bmSlot = r6; - if ((r6 << 24) == 0) // The shift doesn't make any sense. + if (r5->sub.send.bmSlot == 0) { rfu_STC_releaseFrame(r7, 0, &r5->sub.send); r5->sub.send.state = 39; @@ -1583,7 +1589,7 @@ void rfu_REQ_sendData(u8 r5) } } -void rfu_CB_sendData(UNUSED u8 r0, u16 r7) +static void rfu_CB_sendData(UNUSED u8 r0, u16 r7) { u8 r6; struct NIComm *r4; @@ -1609,12 +1615,12 @@ void rfu_CB_sendData(UNUSED u8 r0, u16 r7) rfu_STC_REQ_callback(36, r7); } -void rfu_CB_sendData2(UNUSED u8 r0, u16 r1) +static void rfu_CB_sendData2(UNUSED u8 r0, u16 r1) { rfu_STC_REQ_callback(36, r1); } -void rfu_CB_sendData3(u8 r0, u16 r1) +static void rfu_CB_sendData3(u8 r0, u16 r1) { if (r1 != 0) rfu_STC_REQ_callback(36, r1); @@ -1622,7 +1628,7 @@ void rfu_CB_sendData3(u8 r0, u16 r1) rfu_STC_REQ_callback(0xFF, 0); } -void rfu_constructSendLLFrame(void) +static void rfu_constructSendLLFrame(void) { u32 r8, r5; u8 r6; @@ -1671,7 +1677,7 @@ void rfu_constructSendLLFrame(void) } } -u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) +static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) { u16 r5; u32 sp00; @@ -1701,7 +1707,7 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) } else { - if (r4->remainSize >= r4->payloadSize) + if ((u32)r4->remainSize >= r4->payloadSize) r5 = r4->payloadSize; else r5 = r4->remainSize; @@ -1735,7 +1741,7 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) return r5 + r8->unk00; } -u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) +static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) { const struct RfuHeader *r5; const u8 *sp04; @@ -1774,7 +1780,7 @@ void rfu_REQ_recvData(void) } } -void rfu_CB_recvData(u8 r9, u16 r7) +static void rfu_CB_recvData(u8 r9, u16 r7) { u8 r6; struct RfuSlotStatusNI *r4; @@ -1800,13 +1806,13 @@ void rfu_CB_recvData(u8 r9, u16 r7) r4->sub.recv.state = 70; } } - if ( gRfuStatic->recvErrorFlag ) + if (gRfuStatic->recvErrorFlag) r7 = gRfuStatic->recvErrorFlag | 0x700; } rfu_STC_REQ_callback(r9, r7); } -void rfu_STC_PARENT_analyzeRecvPacket(void) +static void rfu_STC_PARENT_analyzeRecvPacket(void) { u32 r3; u8 r5; @@ -1839,7 +1845,7 @@ void rfu_STC_PARENT_analyzeRecvPacket(void) } } -void rfu_STC_CHILD_analyzeRecvPacket(void) +static void rfu_STC_CHILD_analyzeRecvPacket(void) { u16 r4; u8 *r5; @@ -1859,9 +1865,9 @@ void rfu_STC_CHILD_analyzeRecvPacket(void) } while (!(r4 & 0x8000)); } -u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) +static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) { - struct RfuTest sp00; + struct RfuLocalStruct sp00; const struct RfuHeader *r6; u32 r5; u8 r4; @@ -1900,7 +1906,7 @@ u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) { for (r4 = 0; r4 < NELEMS(gRfuSlotStatusNI); ++r4) if (((gRfuSlotStatusNI[r4]->sub.send.bmSlot >> r12) & 1) - && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) + && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) break; if (r4 <= 3) rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7); @@ -1931,7 +1937,7 @@ u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) return r10; } -void rfu_STC_UNI_receive(u8 r7, const struct RfuTest *r6, const u8 *sp00) +static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 *sp00) { u8 *sp04; u32 r2; @@ -1970,3 +1976,397 @@ _081E2F0E: if (r5->errorCode) gRfuStatic->recvErrorFlag |= 16 << r7; } + +static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct *r6, const u8 *r3) +{ + struct NIComm *r12 = &gRfuSlotStatusNI[r0]->sub.send; + u16 r9 = r12->state; + u8 sp00 = r12->n[r6->unk04]; + u8 *r8; + u8 r4; + u16 r2; + + if ((r6->unk02 == 2 && r9 == 0x8022) + || (r6->unk02 == 1 && r9 == 0x8021) + || (r6->unk02 == 3 && r9 == 0x8023)) + { + if (r12->n[r6->unk04] == r6->unk05) + r12->recvAckFlag[r6->unk04] |= 1 << r10; + } + if ((r12->recvAckFlag[r6->unk04] & r12->bmSlot) == r12->bmSlot) + { + r12->n[r6->unk04] = (r12->n[r6->unk04] + 1) & 3; + r12->recvAckFlag[r6->unk04] = 0; + if ((u16)(r12->state + ~0x8020) <= 1) + { + if (r12->state == 0x8021) + r12->nowP[r6->unk04] += r12->payloadSize; + else + r12->nowP[r6->unk04] += r12->payloadSize << 2; + r12->remainSize -= r12->payloadSize; + if (r12->remainSize != 0) + if (r12->remainSize >= 0) + goto _081E30AE; + // Above is a hack to avoid optimization over comparison. + // rfu_STC_NI_constructLLSF uses this field as u32. + // It's equivalent to the following condition: + // if (r12->remainSize == 0 || r12->remainSize < 0) + { + r12->phase = 0; + if (r12->state == 0x8021) + { + for (r4 = 0; r4 < NELEMS(r12->n); ++r4) + { + r12->n[r4] = 1; + r12->nowP[r4] = r12->src + r12->payloadSize * r4; + } + r12->remainSize = r12->dataSize; + r12->state = 0x8022; + } + else + { + r12->n[0] = 0; + r12->remainSize = 0; + r12->state = 0x8023; + } + } + _081E30AE: + } + else if (r12->state == 0x8023) + { + r12->state = 0x8020; + } + } + if (r12->state != r9 + || r12->n[r6->unk04] != sp00 + || (r12->recvAckFlag[r6->unk04] >> r10) & 1) + { + r2 = REG_IME; + REG_IME = 0; + gRfuStatic->recvRenewalFlag |= 16 << r10; + gRfuSlotStatusNI[r10]->sub.send.failCounter = 0; + REG_IME = r2; + } +} + +static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, const u8 *sp00) +{ + u16 r2; + u32 r7 = 0; + struct RfuSlotStatusNI *r4 = gRfuSlotStatusNI[r8]; + struct NIComm *r5 = &r4->sub.recv; + u16 r9 = r4->sub.recv.state; + u8 r10 = r4->sub.recv.n[r6->unk04]; + + if (r6->unk02 == 3) + { + gRfuStatic->NIEndRecvFlag |= 1 << r8; + if (r4->sub.recv.state == 0x8042) + { + r4->sub.recv.phase = 0; + r4->sub.recv.n[0] = 0; + r4->sub.recv.state = 0x8043; + } + } + else if (r6->unk02 == 2) + { + if (r9 == 0x8041 && !r5->remainSize) + rfu_STC_NI_initSlot_asRecvDataEntity(r8, r5); + if (r5->state == 0x8042) + r7 = 1; + } + else if (r6->unk02 == 1) + { + if (r9 == 0x8041) + { + r7 = 1; + } + else + { + rfu_STC_NI_initSlot_asRecvControllData(r8, r5); + if (r4->sub.recv.state != 0x8041) + return; + r7 = 1; + } + } + if (r7 != 0) + { + if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3)) + { + gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->nowP[r6->unk04], r6->unk06); + if (r5->state == 0x8042) + r5->nowP[r6->unk04] += 3 * r5->payloadSize; + r5->remainSize -= r6->unk06; + r5->n[r6->unk04] = r6->unk05; + } + } + if (r5->errorCode == 0) + { + r5->phase = r6->unk04; + if (r5->state != r9 || r5->n[r6->unk04] != r10 || r5->n[r6->unk04] == r6->unk05) + { + r2 = REG_IME; + REG_IME = 0; + gRfuStatic->recvRenewalFlag |= 1 << r8; + r5->failCounter = 0; + REG_IME = r2; + } + } +} + +static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) +{ + u8 *r1; + u32 r5; + u8 r6; + + if (gRfuLinkStatus->connMode == 1) + { + r5 = 3; + r1 = &gRfuLinkStatus->remainLLFrameSizeParent; + } + else + { + r5 = 2; + r1 = &gRfuLinkStatus->remainLLFrameSizeChild[r4]; + } + r6 = 1 << r4; + if (r2->state == 0) + { + if (*r1 < r5) + { + r2->state = 73; + r2->errorCode = 0x702; + gRfuStatic->recvErrorFlag |= r6; + } + else + { + r2->errorCode = 0; + *r1 -= r5; + r2->nowP[0] = &r2->dataType; + r2->remainSize = 7; + r2->ack = 1; + r2->payloadSize = 0; + r2->bmSlot = r6; + r2->state = 0x8041; + gRfuLinkStatus->recvSlotNIFlag |= r6; + } + } +} + +static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4) +{ + u8 r1, r3; + + if (r4->dataType == 1) + { + r4->nowP[0] = (void *)&gRfuLinkStatus->partner[r5].serialNum; + } + else + { + if (r4->dataSize > gRfuSlotStatusNI[r5]->recvBufferSize) + { + r1 = 1 << r5; + gRfuStatic->recvErrorFlag |= r1; + gRfuLinkStatus->recvSlotNIFlag &= ~r1; + r4->errorCode = 0x701; + r4->state = 71; + rfu_STC_releaseFrame(r5, 1, r4); + return; + } + r4->nowP[0] = gRfuSlotStatusNI[r5]->recvBuffer; + } + for (r3 = 0; r3 < 4; ++r3) + { + r4->n[r3] = 0; + r4->nowP[r3] = &r4->nowP[0][r4->payloadSize * r3]; + } + r4->remainSize = r4->dataSize; + r4->state = 0x8042; +} + +static void rfu_NI_checkCommFailCounter(void) +{ + u16 r12; + u32 r7; + u8 r2, r3; + + if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) + { + r12 = REG_IME; + REG_IME = 0; + r7 = gRfuStatic->recvRenewalFlag >> 4; + for (r3 = 0; r3 < NELEMS(gRfuSlotStatusNI); ++r3) + { + r2 = 1 << r3; + if (gRfuLinkStatus->sendSlotNIFlag & r2 + && !(gRfuStatic->recvRenewalFlag & r2)) + ++gRfuSlotStatusNI[r3]->sub.send.failCounter; + if (gRfuLinkStatus->recvSlotNIFlag & r2 + && !(r7 & r2)) + ++gRfuSlotStatusNI[r3]->sub.recv.failCounter; + } + gRfuStatic->recvRenewalFlag = 0; + REG_IME = r12; + } +} + +void rfu_REQ_noise(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_TestModeREQ(1, 0); +} + +static s32 sub_81E349C(u8 r5) +{ + u16 r8; + vu16 *r4; + s32 r6; + + if (REG_IME == 0) + return -1; + r8 = REG_IE; + gRfuState->state = 10; + STWI_set_CallbackUnk(sub_81E36B8); + sub_81E3550(); + r4 = ®_TMCNT_L(gRfuState->timerSelect); + r5 *= 8; + while (--r5 != 0xFF) + { + r6 = sub_81E35C4(); + if (r6 != 0) + break; + r4[1] = 0; + r4[0] = 0; + r4[1] = TIMER_1024CLK | TIMER_ENABLE; + while (r4[0] < 32) + ; + r4[1] = 0; + r4[0] = 0; + } + REG_IME = 0; + REG_IE = r8; + REG_IME = 1; + gRfuState->state = 0; + STWI_set_CallbackUnk(NULL); + return r6; +} + +static void sub_81E3550(void) +{ + REG_IME = 0; + REG_IE &= ~((8 << gRfuState->timerSelect) | INTR_FLAG_SERIAL); + REG_IME = 1; + REG_RCNT = 0; + REG_SIOCNT = SIO_32BIT_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + CpuFill32(0, &gUnknown_3007470, sizeof(struct Unk_3007470)); + REG_IF = INTR_FLAG_SERIAL; +} + +static s32 sub_81E35C4(void) +{ + u8 r12; + + switch (r12 = gUnknown_3007470.unk1) + { + case 0: + gUnknown_3007470.unk0 = 1; + REG_SIOCNT |= SIO_38400_BPS; + REG_IME = r12; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = 1; + gUnknown_3007470.unk1 = 1; + *(vu8 *)®_SIOCNT |= SIO_ENABLE; + break; + case 1: + if (gUnknown_3007470.unkA == 0) + { + if (gUnknown_3007470.unk0 == 1) + { + if (gUnknown_3007470.unk2 == 0) + { + REG_IME = gUnknown_3007470.unk2; + REG_SIOCNT |= SIO_ENABLE; + REG_IME = r12; + } + } + else if (gUnknown_3007470.unk4 != 0x8001 && !gUnknown_3007470.unk2) + { + REG_IME = gUnknown_3007470.unk2; + REG_IE &= ~INTR_FLAG_SERIAL; + REG_IME = r12; + REG_SIOCNT = gUnknown_3007470.unk2; + REG_SIOCNT = SIO_32BIT_MODE; + REG_IF = INTR_FLAG_SERIAL; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + REG_IME = gUnknown_3007470.unk2; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = r12; + } + break; + } + else + { + gUnknown_3007470.unk1 = 2; + // fallthrough + } + default: + return gUnknown_3007470.unkA; + } + return 0; +} + +static void sub_81E36B8(void) +{ + u32 r5; + u16 r0; +#ifndef NONMATCHING + register u32 r1 asm("a2"); + register u16 r0_ asm("a1"); +#else + u32 r1; + u16 r0_; +#endif + + r5 = REG_SIODATA32; + if (gUnknown_3007470.unk0 != 1) + REG_SIOCNT |= SIO_ENABLE; + r1 = 16 * gUnknown_3007470.unk0; // to handle side effect of inline asm + r1 = (r5 << r1) >> 16; + r5 = (r5 << 16 * (1 - gUnknown_3007470.unk0)) >> 16; + if (gUnknown_3007470.unkA == 0) + { + if (r1 == gUnknown_3007470.unk6) + { + if (gUnknown_3007470.unk2 > 3) + { + gUnknown_3007470.unkA = r5; + } + else if (r1 == (u16)~gUnknown_3007470.unk4) + { + r0_ = ~gUnknown_3007470.unk6; + if (r5 == r0_) + ++gUnknown_3007470.unk2; + } + } + else + { + gUnknown_3007470.unk2 = gUnknown_3007470.unkA; + } + } + if (gUnknown_3007470.unk2 < 4) + gUnknown_3007470.unk4 = *(gUnknown_3007470.unk2 + _Str_Sio32ID); + else + gUnknown_3007470.unk4 = 0x8001; + gUnknown_3007470.unk6 = ~r5; + REG_SIODATA32 = (gUnknown_3007470.unk4 << 16 * (1 - gUnknown_3007470.unk0)) + + (gUnknown_3007470.unk6 << 16 * gUnknown_3007470.unk0); + if (gUnknown_3007470.unk0 == 1 && (gUnknown_3007470.unk2 || r5 == 0x494E)) + { + for (r0 = 0; r0 < 600; ++r0) + ; + if (gUnknown_3007470.unkA == 0) + REG_SIOCNT |= SIO_ENABLE; + } +} diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index c8df0ccfa..c6c3441ec 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -128,9 +128,9 @@ void STWI_set_Callback_S(void (*callbackS)(u16)) gRfuState->callbackS = callbackS; } -void STWI_set_Callback_ID(u32 id) +void STWI_set_CallbackUnk(void (*func)(void)) { - gRfuState->callbackId = id; + gRfuState->unk_20 = func; } u16 STWI_poll_CommandEnd(void) -- cgit v1.2.3 From a7ec7175f1eadf79ab6cb4efbde1b9694535806f Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Tue, 7 Jan 2020 12:09:18 +0800 Subject: resolve a fake match --- include/librfu.h | 2 +- src/librfu_rfu.c | 13 +++++-------- src/librfu_stwi.c | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/include/librfu.h b/include/librfu.h index 8bc1e636d..9440ffd7b 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -347,7 +347,7 @@ void STWI_set_Callback_M(void *callbackM); void STWI_set_Callback_S(void (*callbackS)(u16)); void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect); void AgbRFU_SoftReset(void); -void STWI_set_CallbackUnk(void (*func)(void)); +void STWI_set_Callback_ID(void (*func)(void)); u16 STWI_read_status(u8 index); u16 STWI_poll_CommandEnd(void); void STWI_send_DataRxREQ(void); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 140aa353e..6a4fee158 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -1455,17 +1455,14 @@ s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) s32 rfu_NI_stopReceivingData(u8 who) { -#ifndef NONMATCHING // r4, r5 register swap - register struct NIComm *r5 asm("r5"); -#else struct NIComm *r5; -#endif u16 r4, r1; if (who > 3) return 0x400; r5 = &gRfuSlotStatusNI[who]->sub.recv; r4 = REG_IME; + ++r4; --r4; // fix r4, r5 register swap REG_IME = 0; if (gRfuSlotStatusNI[who]->sub.recv.state & 0x8000) { @@ -2227,7 +2224,7 @@ static s32 sub_81E349C(u8 r5) return -1; r8 = REG_IE; gRfuState->state = 10; - STWI_set_CallbackUnk(sub_81E36B8); + STWI_set_Callback_ID(sub_81E36B8); sub_81E3550(); r4 = ®_TMCNT_L(gRfuState->timerSelect); r5 *= 8; @@ -2248,7 +2245,7 @@ static s32 sub_81E349C(u8 r5) REG_IE = r8; REG_IME = 1; gRfuState->state = 0; - STWI_set_CallbackUnk(NULL); + STWI_set_Callback_ID(NULL); return r6; } @@ -2322,8 +2319,8 @@ static void sub_81E36B8(void) u32 r5; u16 r0; #ifndef NONMATCHING - register u32 r1 asm("a2"); - register u16 r0_ asm("a1"); + register u32 r1 asm("r1"); + register u16 r0_ asm("r0"); #else u32 r1; u16 r0_; diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index c6c3441ec..8e27c04d8 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -128,7 +128,7 @@ void STWI_set_Callback_S(void (*callbackS)(u16)) gRfuState->callbackS = callbackS; } -void STWI_set_CallbackUnk(void (*func)(void)) +void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer { gRfuState->unk_20 = func; } -- cgit v1.2.3 From f12c1edf3f626fd608b837c125514768f264dc2c Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 02:13:35 +0800 Subject: update documentation & func types --- common_syms/librfu_rfu.txt | 1 - common_syms/librfu_s32id.txt | 1 + include/librfu.h | 649 +++++++++++++++++++++++++---------- ld_script.txt | 1 + src/librfu_rfu.c | 787 +++++++++++++++++-------------------------- src/librfu_s32id.c | 163 +++++++++ src/librfu_stwi.c | 67 ++-- sym_common.txt | 2 + 8 files changed, 985 insertions(+), 686 deletions(-) create mode 100644 common_syms/librfu_s32id.txt create mode 100644 src/librfu_s32id.c diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt index 142895733..94600cdf8 100644 --- a/common_syms/librfu_rfu.txt +++ b/common_syms/librfu_rfu.txt @@ -4,4 +4,3 @@ gRfuSlotStatusNI gRfuLinkStatus gRfuStatic gRfuFixed -gUnknown_3007470 diff --git a/common_syms/librfu_s32id.txt b/common_syms/librfu_s32id.txt new file mode 100644 index 000000000..6c24cc4a4 --- /dev/null +++ b/common_syms/librfu_s32id.txt @@ -0,0 +1 @@ +gRfuS32Id diff --git a/include/librfu.h b/include/librfu.h index 9440ffd7b..1e128d209 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -1,83 +1,276 @@ #ifndef GUARD_LIBRFU_H #define GUARD_LIBRFU_H +#include "global.h" #include "main.h" /* TODOs: - * - decide file boundaries + * - split files * - documentation + * - decompile librfu_intr.s once arm support is back again + (for internal structs not documented in SDK) * - check if any field needs to be volatile * - check if field names make sense - * - decompile librfu_intr.s once arm support is back again */ -enum -{ - RFU_RESET = 0x10, - RFU_LINK_STATUS, - RFU_VERSION_STATUS, - RFU_SYSTEM_STATUS, - RFU_SLOT_STATUS, - RFU_CONFIG_STATUS, - RFU_GAME_CONFIG, - RFU_SYSTEM_CONFIG, - RFU_UNK18, - RFU_SC_START, - RFU_SC_POLLING, - RFU_SC_END, - RFU_SP_START, - RFU_SP_POLLING, - RFU_SP_END, - RFU_CP_START, - RFU_CP_POLLING, - RFU_CP_END, - RFU_UNK22, - RFU_UNK23, - RFU_DATA_TX, - RFU_DATA_TX_AND_CHANGE, - RFU_DATA_RX, - RFU_MS_CHANGE, - RFU_DATA_READY_AND_CHANGE, - RFU_DISCONNECTED_AND_CHANGE, - RFU_UNK2A, - RFU_UNK2B, - RFU_UNK2C, - RFU_UNK2D, - RFU_UNK2E, - RFU_UNK2F, - RFU_DISCONNECT, - RFU_TEST_MODE, - RFU_CPR_START, - RFU_CPR_POLLING, - RFU_CPR_END, - RFU_UNK35, - RFU_UNK36, - RFU_RESUME_RETRANSMIT_AND_CHANGE, - RFU_UNK38, - RFU_UNK39, - RFU_UNK3A, - RFU_UNK3B, - RFU_UNK3C, - RFU_STOP_MODE, //3D -}; +// -------------------------------------------------------------------------- +// +// Restrictions When Using RFU +// +// -------------------------------------------------------------------------- +/* + The following restrictions apply when using RFU. -struct RfuPacket8 -{ - u8 data[0x74]; -}; + + (a) The timer for Sound DMA uses only 0 + (b) The prescaler for the timer count for the Sound DMA uses 59.5 ns. + (c) The sound sampling rate is Max36.314KHz. -struct RfuPacket32 -{ - u32 command; - u32 data[0x1C]; -}; + + These types of DMA can be operated on a maximum CPU cycle of 42 cycles. + Calculate the number of the transferable DMA count based on this 42 cycles and the access cycles of the destination and source. + For example, if both the CPU internal RAM --> VRAM have a one cycle access, then a 21 count DMA can occur. -union RfuPacket -{ - struct RfuPacket32 rfuPacket32; - struct RfuPacket8 rfuPacket8; -}; + + If RFU is used outside of these restrictions, problems, such as the loss of data caused by the failure of the AGB, as a clock slave, + to notify that data has been received from the RFU, will occur. + When this problem occurs, the REQ callback will send a REQ_commandID=ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ notification. + (When using Link Manager, the LMAN call back will send a LMAN_msg=LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA notification.) + +*/ + +// REQ-COMMAND (STWI) ID CODE LIST + +// REQ Command ID returned by the REQ callback +#define ID_RESET_REQ 0x0010 +#define ID_LINK_STATUS_REQ 0x0011 +#define ID_VERSION_STATUS_REQ 0x0012 // not defined in SDK header +#define ID_SYSTEM_STATUS_REQ 0x0013 +#define ID_SLOT_STATUS_REQ 0x0014 // not defined in SDK header +#define ID_CONFIG_STATUS_REQ 0x0015 // not defined in SDK header +#define ID_GAME_CONFIG_REQ 0x0016 +#define ID_SYSTEM_CONFIG_REQ 0x0017 +#define ID_SC_START_REQ 0x0019 +#define ID_SC_POLL_REQ 0x001a +#define ID_SC_END_REQ 0x001b +#define ID_SP_START_REQ 0x001c +#define ID_SP_POLL_REQ 0x001d +#define ID_SP_END_REQ 0x001e +#define ID_CP_START_REQ 0x001f +#define ID_CP_POLL_REQ 0x0020 +#define ID_CP_END_REQ 0x0021 +#define ID_DATA_TX_REQ 0x0024 +#define ID_DATA_TX_AND_CHANGE_REQ 0x0025 +#define ID_DATA_RX_REQ 0x0026 +#define ID_MS_CHANGE_REQ 0x0027 // When returned by the REQ callback, this ID indicates that execution of rfu_REQ_changeMasterSlave has finished. + // This ID is returned by both the REQ callback and the MSC callback. + // When returned by the MSC callback, this is notification that after the AGB has been made into the clock slave, the MC_Timer expired and the RFU returned the AGB to be the clock master. +#define ID_DISCONNECT_REQ 0x0030 +#define ID_TEST_MODE_REQ 0x0031 // not defined in SDK header +#define ID_CPR_START_REQ 0x0032 +#define ID_CPR_POLL_REQ 0x0033 +#define ID_CPR_END_REQ 0x0034 +#define ID_UNK35_REQ 0x0035 // not defined in SDK header +#define ID_RESUME_RETRANSMIT_AND_CHANGE_REQ 0x0037 +#define ID_STOP_MODE_REQ 0x003d +#define ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ 0x00ff // When the AGB is the clock slave, the RFU generates an informational notice, and an automatically started DMA, such as HDMA, is generated at the instant the AGB is being returned as the clock master. This ID is notified by a REQ callback when the exchange of this information (REQ command) fails. + +// REQ Command ID returned by the MSC callback +#define ID_DISCONNECTED_AND_CHANGE_REQ 0x0029 +#define ID_DATA_READY_AND_CHANGE_REQ 0x0028 +#define ID_DRAC_REQ_WITH_ACK_FLAG 0x0128 + +// -------------------------------------------------------------------------- +// +// Data Definitions +// +// -------------------------------------------------------------------------- + +#define RFU_ID 0x00008001 // ID number of AGB-RFU device: ID returned by execution of rfu_REQBN_softReset_and_checkID. + +#define RFU_MBOOT_DOWNLOADER_SERIAL_NO 0x0000 // The game serial number of the multi-boot downloader (programs that boot without a Game Pak) + +#define RFU_API_BUFF_SIZE_RAM 0x0e8c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM) +#define RFU_API_BUFF_SIZE_ROM 0x052c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM) + +#define RFU_CHILD_MAX 4 // Maximum number of slaves that can be connected to one parent device + +#define RFU_GAME_NAME_LENGTH 13 // Possible length of game name set by rfu_REQB_configGameData +#define RFU_USER_NAME_LENGTH 8 // Possible length of user name set by rfu_REQB_configGameData + +#define RFU_H_DMA_MAX_CPU_CYCLE 42 // Maximum number of CPU cycles for H-DMA or DMA that starts with V-Blank that can operate when using RFU + +// Value to determine the level of the icon that displays the link strength of the wireless status (value of rfuLinkStatus->strength[0-3]) +#define RFU_LINK_ICON_LEVEL4_MAX 255 // 90% -100% (If the value is betwen 229 and 255, the icon level is 4) +#define RFU_LINK_ICON_LEVEL4_MIN 229 +#define RFU_LINK_ICON_LEVEL3_MAX 228 // 50% - 89% (If the value is betwen 127 and 228, the icon level is 3) +#define RFU_LINK_ICON_LEVEL3_MIN 127 +#define RFU_LINK_ICON_LEVEL2_MAX 126 // 10% - 49% (If the value is betwen 25 and 126, the icon level is 2) +#define RFU_LINK_ICON_LEVEL2_MIN 25 +#define RFU_LINK_ICON_LEVEL1_MAX 24 // 0% - 9% (If the value is betwen 0 and 24, the icon level is 1) +#define RFU_LINK_ICON_LEVEL1_MIN 0 + + +// ******************************************************* +// Definition Data for Arguments Used in Library Functions +// ******************************************************* +// Specified by u16 mbootFlag in rfu_REQ_configGameData +#define RFU_MBOOT_FLAG 0x01 // Enabling this flag, allows connection to a multi-boot program. + +// AvailSlot (number of slots available for connection) used in u16 availSlotFlag in rfu_REQ_configSystem +#define AVAIL_SLOT4 0x0000 +#define AVAIL_SLOT3 0x0001 +#define AVAIL_SLOT2 0x0002 +#define AVAIL_SLOT1 0x0003 + +// u8 connTypeFlag specified by rfu_setRecvBuffer +#define TYPE_UNI 0x10 // UNI-type +#define TYPE_NI 0x20 // NI-type + +// u8 connTypeFlag specified by rfu_clearSlot +#define TYPE_UNI_SEND 0x01 // UNI-type send +#define TYPE_UNI_RECV 0x02 // UNI-type receive +#define TYPE_NI_SEND 0x04 // NI-type send +#define TYPE_NI_RECV 0x08 // NI-type receive + +// ******************************************************* +// Definition Data Returned by Return Values for Library Functions +// ******************************************************* + +// Value of u8 *status for rfu_REQ_pollConnectParent (Connection Trial Status) +#define CP_STATUS_DONE 0x00 // Connection successful +#define CP_STATUS_IN_PROCESS 0x01 // Connecting +#define CP_STATUS_SLOT_CLOSED 0x02 // Parent device is not in connection mode with child device +#define CP_STATUS_DISCONNECTED 0x03 // Disconnected by parent device while connecting +#define CP_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error + +// Value of u8 *status argument for rfu_REQ_pollRecoveryConnect (Link Restore Status) +#define RC_STATUS_DONE 0x00 // Connection restore successful +#define RC_STATUS_FAILED 0x01 // Connection restore failure (meaningless to try anymore) +#define RC_STATUS_SEARCHING_PARENT 0x02 // Searching for parent device +#define RC_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error + +// Value of u8 *linkLossReason argument for rfu_REQBN_watchLink (Reason for Link Loss) +#define REASON_DISCONNECTED 0x00 // State of complete disconnection with rfuLL_disconnect and no possibility of restoring the link (can detect only child device) +#define REASON_LINK_LOSS 0x01 // State of link loss that allows for the possibility for the link to be restored + + +// ******************************************************* +// Definition Data Returned with Return Values for Library Functions +// ******************************************************* + +// Value returned by rfu_getMasterSlave +#define AGB_CLK_SLAVE 0 // AGB clock slave +#define AGB_CLK_MASTER 1 // AGB clock master + +// ******************************************************* +// Error Code Group for Library Functions +// ******************************************************* + +// Error codes returned by u16 REQ_result with a REQ callback when a REQ-API function is executed +#define ERR_REQ_CMD 0x0000 +#define ERR_REQ_CMD_CLOCK_DRIFT (ERR_REQ_CMD | 0x0001) // Clock drift occurs when a REQ command is sent +#define ERR_REQ_CMD_SENDING (ERR_REQ_CMD | 0x0002) // The next command cannot be issued because a REQ command is being sent +#define ERR_REQ_CMD_ACK_REJECTION (ERR_REQ_CMD | 0x0003) // The REQ command was refused when issued +#define ERR_REQ_CMD_CLOCK_SLAVE (ERR_REQ_CMD | 0x0004) // Issuing the REQ command was attempted but failed because the AGB is the clock slave +#define ERR_REQ_CMD_IME_DISABLE (ERR_REQ_CMD | 0x0006) // Issuing the REQ command was attempted but failed because the IME register is 0 + +#define ERR_PID_NOT_FOUND 0x0100 // The specified PID does not exist in the gRfuLinkStatus->partner[0-3].id list + +// Error code returned by the return value of rfu_initializeAPI +#define ERR_RFU_API_BUFF_SIZE 0x0001 +#define ERR_RFU_API_BUFF_ADR 0x0002 + +// Error codes returned by return values for rfu_REQBN_softReset_and_checkID +#define ERR_ID_CHECK_IME_DISABLE 0xffffffff // ID check could not be executed because REG_IME=0 when executing rfu_REQBN_softReset_and_checkID + +// Error codes returned by rfu_getConnectParentStatus and rfu_CHILD_getConnectRecoveryStatus +#define ERR_REQ_CMD_ID (ERR_REQ_CMD | 0x0010) // A required REQ command was not executed within this function execution + +// Error codes returned by rfu_NI_setSendData, rfu_UNI_setSendData, and rfu_NI_CHILD_setSendGameName +#define ERR_MODE 0x0300 +#define ERR_MODE_NOT_CONNECTED (ERR_MODE | 0x0001) // RFU is not in connection mode (parent or child) + +#define ERR_SLOT 0x0400 +#define ERR_SLOT_NO (ERR_SLOT | 0x0000) // The specified slot number is not right +#define ERR_SLOT_NOT_CONNECTED (ERR_SLOT | 0x0001) // The specified slot is not connected +#define ERR_SLOT_BUSY (ERR_SLOT | 0x0002) // The specified slot is already communicating +#define ERR_SLOT_NOT_SENDING (ERR_SLOT | 0x0003) // The specified slot is not currently sending (Note: This is returned by rfu_UNI_re_setSendData) +#define ERR_SLOT_TARGET (ERR_SLOT | 0x0004) // The specified target slot is not right + +#define ERR_SUBFRAME_SIZE 0x0500 // The specified subframe size is either larger than the remaining communication frame size or smaller than the link layer subframe header size + +// Error code returned by rfu_clearSlot, rfu_setRecvBuffer, and rfu_changeSendTarget +#define ERR_COMM_TYPE 0x0600 // The specified communication format is not right + +// Error code returned by rfu_REQ_recvData (when receiving NI-type or UNI-type data) +#define ERR_DATA_RECV 0x0700 // Error notification is issued in the following format. + // "ERR_DATA_RECV | (slot number issuing error with 0x0010<recv.errorCode. + +// Error code during NI-type communication (code entered into gRfuSlotStatusNI[x]->recv.errorCode) +#define ERR_RECV_BUFF_OVER (ERR_DATA_RECV | 0x0001) // The receive data size is larger than the receive buffer (Note: This error is used for both NI and UNI) +#define ERR_RECV_REPLY_SUBFRAME_SIZE (ERR_DATA_RECV | 0x0002) // All frames are already in use by other communications, and a subframe for reception response could not be secured + +// Error code during UNI-type communication (code entered into gRfuSlotStatusUNI[x]->recv.errorCode) +#define ERR_RECV_DATA_OVERWRITED (ERR_DATA_RECV | 0x0008) // Received new data when gRfuSlotStatusUNI[x]->recv.newDataFlag=1 + + +// ******************************************************* +// Definition Data Used by Global Variables in the Library +// ******************************************************* + +// gRfuLinkStatus------------------------------------------- +// Connection status (refer to gRfuLinkStatus->parentChild) +#define MODE_NEUTRAL 0xff // Initialization +#define MODE_CHILD 0x00 // Child +#define MODE_PARENT 0x01 // Parent + + +// gRfuSlotStatusNI,UNI----------------------------------- +// Definition data for NI-(Numbered Information) and UNI-(Un-Numbered Information) type communication + +// Definition data common to NI- and UNI-type communication +#define LLF_P_SIZE 87 // Maximum link layer communication frame size for the Parent (Maximum number of bytes per transmission) +#define LLF_C_SIZE 16 // " " for the Child +#define LLSF_P_HEADER_SIZE 3 // Header size used by one link layer subframe (NI or UNI frame) for the Parent +#define LLSF_C_HEADER_SIZE 2 // " " for the Child + +// Link Layer Communication Code +#define LCOM_NULL 0x0000 +#define LCOM_NI_START 0x0001 +#define LCOM_NI 0x0002 +#define LCOM_NI_END 0x0003 +#define LCOM_UNI 0x0004 + +// Flag for Slot Status Data +#define SLOT_BUSY_FLAG 0x8000 // Slot in use +#define SLOT_SEND_FLAG 0x0020 // Send +#define SLOT_RECV_FLAG 0x0040 // Receive + +// NI- and UNI-type shared slot stand-by data (same state as gRfuSlotStatusNI[x]->send or ->recv.state or gRfuSlotStatusUNI) +#define SLOT_STATE_READY 0x0000 // Slot initialization + +// Status data for NI-type communication (gRfuSlotStatusNI[x]->send or ->recv.state) +#define SLOT_STATE_SEND_START (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_START) // Start transmission +#define SLOT_STATE_SENDING (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI) // Transmitting +#define SLOT_STATE_SEND_LAST (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NI_END) // Verify transmission end +#define SLOT_STATE_SEND_NULL (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_NULL) // Send NULL subframe to notify end of transmission +#define SLOT_STATE_SEND_SUCCESS ( SLOT_SEND_FLAG | 0x006) // Transmission successful +#define SLOT_STATE_SEND_FAILED ( SLOT_SEND_FLAG | 0x007) // Transmission failed + // Distinction of slot where transmission succeeded/failed compares gRfuSlotStatusNI[x]->send.bmSlot and same bmSlot_org +#define SLOT_STATE_RECV_START (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_START) // Start reception +#define SLOT_STATE_RECEIVING (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI) // Receiving +#define SLOT_STATE_RECV_LAST (SLOT_BUSY_FLAG | SLOT_RECV_FLAG | LCOM_NI_END) // Verify reception end +#define SLOT_STATE_RECV_SUCCESS ( SLOT_RECV_FLAG | 0x006) // Reception successful +#define SLOT_STATE_RECV_FAILED ( SLOT_RECV_FLAG | 0x007) // Reception failed +#define SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN (SLOT_RECV_FLAG | 0x008) // The data was received successful, but because the end of the communication was incomplete, whether the transmission side status is successful or failed is unknown +#define SLOT_STATE_RECV_IGNORE ( SLOT_RECV_FLAG | 0x009) // Ignore reception (refer to gRfuSlotStatusNI[x]->recv.errorCode for reason for ignoring) + +// Status data for UNI-type communication (refer to gRfuSlotStatusUNI[x]->send.state) +#define SLOT_STATE_SEND_UNI (SLOT_BUSY_FLAG | SLOT_SEND_FLAG | LCOM_UNI) // Transmitting +// TODO: move the 2 structs to some other header as they're declared by GF struct UnkLinkRfuStruct_02022B14Substruct { u16 unk_00_0:4; @@ -105,7 +298,25 @@ struct __attribute__((packed, aligned(2))) UnkLinkRfuStruct_02022B14 u8 unk_0c; }; -struct RfuStruct +// the following structs are not documented in SDK +struct RfuPacket8 +{ + u8 data[0x74]; +}; + +struct RfuPacket32 +{ + u32 command; + u32 data[0x1C]; +}; + +union RfuPacket +{ + struct RfuPacket32 rfuPacket32; + struct RfuPacket8 rfuPacket8; +}; + +struct STWIStatus { vs32 state; u8 reqLength; @@ -132,69 +343,116 @@ struct RfuStruct vu8 unk_2c; }; +// This struct is used as u8 array in SDK. struct RfuIntrStruct { union RfuPacket rxPacketAlloc; union RfuPacket txPacketAlloc; u8 block1[0x960]; // size of librfu_intr.s binary - struct RfuStruct block2; + struct STWIStatus block2; }; +// Data Structure for Transmitting UNI-Type Data +struct UNISend +{ + u16 state; // Slot communication state (SLOT_STATE_READY, SLOT_STATE_SEND_UNI) + u8 dataReadyFlag; // Flag indicating transmission data is prepared (0: data sent; 1: transmission data ready) + // Set with rfu_UNI_re_setSendData or rfu_UNI_readySendData, cleared when data is sent with rfu_REQ_sendData. + u8 bmSlot; // Expresses transmission destination slot as bits + u16 payloadSize; // Payload size of 1 transmission. "size" specified by rfu_UNI_setSendData or rfu_UNI_re_setSendData is used. + const void *src; // Beginning address of transmission data +}; + +// Data Structure for Receiving UNI Data +struct UNIRecv +{ + u16 state; // Slot communication state (SLOT_STATE_READY, SLOT_STATE_RECEIVING, SLOT_STATE_RECV_IGNORE) + u16 errorCode; // Error code during reception + u16 dataSize; // Size of receive data + u8 newDataFlag; // Flag indicating whether receive data has newly arrived (0: no newly arrived data; 1: newly arrived data) + // The flag is cleared with rfu_UNI_clearRecvNewDataFlag; it is set when data is received with rfu_REQ_recvData. + u8 dataBlockFlag; // Flag for unreferenced receive data overwrite block (default is 0 Note: not used) +}; + +// Slot Status Data Structure for UNI-Type Communication struct RfuSlotStatusUNI { - struct - { - struct UNISend - { - u16 state; - u8 dataReadyFlag; - u8 bmSlot; - u16 payloadSize; - const void *src; - } send; - struct UNIRecv - { - u16 state; - u16 errorCode; - u16 dataSize; - u8 newDataFlag; - u8 dataBlockFlag; - } recv; - } sub; - void *recvBuffer; - u32 recvBufferSize; + struct UNISend send; // Transmission Status + struct UNIRecv recv; // Reception Status + void *recvBuffer; // Reception Buffer Address + u32 recvBufferSize; // Reception Buffer Size }; +#define WINDOW_COUNT 4 + struct NIComm { - u16 state; - u16 failCounter; - const u8 *nowP[4]; - s32 remainSize; - u16 errorCode; - u8 bmSlot; - u8 recvAckFlag[4]; + u16 state; // Communication state of slot + u16 failCounter; // Count of failed transmissions/receptions (Count is increased when transmission/reception of data does not succeed within 1PF=16.7 ms) + const u8 *now_p[WINDOW_COUNT]; // Address of current send/receive (The data is divided into WINDOW_COUNT blocks and sent in payloadSize units.) + // remainSize is u32 in SDK. This is a hack to match ASM + s32 remainSize; // Size of remaining communication data + u16 errorCode; // Error code + u8 bmSlot; // Expresses the current communication slot in bits + // (When sending from the Master, because multiple slaves can be specified with bmSlot, communications are terminated based on the failCounter for each child device) + // Parameters used inside the Library + u8 recvAckFlag[WINDOW_COUNT]; u8 ack; u8 phase; - u8 n[4]; - const void *src; - u8 bmSlotOrg; - u8 dataType; - u16 payloadSize; - u32 dataSize; + u8 n[WINDOW_COUNT]; + // Parameters indicating the current communication content + const void *src; // Start address transmission data (valid only for transmitting device) + u8 bmSlotOrg; // Expresses the communication source slot at the beginning of the transmission in bits (valid only for transmitting device) + u8 dataType; // Transmission/reception data type (0: User data; 1: Game identification information) + u16 payloadSize; // Payload size for one transmission + u32 dataSize; // Size of transmission/reception data + // Calculated by subtracting link layer header size from subFrameSize specified by the rfu_NI_setSendData function }; struct RfuSlotStatusNI { - struct - { - struct NIComm send; - struct NIComm recv; - } sub; - void *recvBuffer; - u32 recvBufferSize; + struct NIComm send; // Transmission Status + struct NIComm recv; // Reception Status + void *recvBuffer; // Reception Buffer Address + u32 recvBufferSize; // Reception Buffer Size +}; + +// Game Identification Information Data Structure +struct RfuTgtData +{ + u16 id; // ID of parent candidate ID of connection partner + u8 slot; // Slot number where parent candidate can enter Connection slot number + u8 mbootFlag; // Flag to indicate whether or not the parent candidate Flag to indicate whether or not the connection partner + // is multiboot program for download is multiboot program for download + u16 serialNo; // Game serial number of parent candidate Game serial number of connection partner + u8 gname[RFU_GAME_NAME_LENGTH + 2]; // Game name of parent candidate Game name of connection partner + u8 uname[RFU_USER_NAME_LENGTH + 1]; // User name for parent candidate User name for connection partner +}; + +struct RfuLinkStatus +{ + u8 parentChild; // Connection status (0x01:MODE_PARENT 0x00:MODE_CHILD 0xff:MODE_NEUTRAL) + u8 connCount; // Number of connections + u8 connSlotFlag; // Flag to indicate in bits the connection slot (0x01<linkStatus; - gRfuStatic = &unk0->static_; - gRfuFixed = &unk0->fixed; - gRfuSlotStatusNI[0] = &unk0->NI[0]; - gRfuSlotStatusUNI[0] = &unk0->UNI[0]; - for (i = 1; i < NELEMS(gRfuSlotStatusNI); ++i) + gRfuLinkStatus = &APIBuffer->linkStatus; + gRfuStatic = &APIBuffer->static_; + gRfuFixed = &APIBuffer->fixed; + gRfuSlotStatusNI[0] = &APIBuffer->NI[0]; + gRfuSlotStatusUNI[0] = &APIBuffer->UNI[0]; + for (i = 1; i < RFU_CHILD_MAX; ++i) { gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1]; } // TODO: Is it possible to fix the following 2 statements? // It's equivalent to: - // gRfuFixed->STWIBuffer = &unk0->intr; - // STWI_init_all(&unk0->intr, interrupt, copyInterruptToRam); + // gRfuFixed->STWIBuffer = &APIBuffer->intr; + // STWI_init_all(&APIBuffer->intr, sioIntrTable_p, copyInterruptToRam); gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1]; - STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], interrupt, copyInterruptToRam); + STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], sioIntrTable_p, copyInterruptToRam); rfu_STC_clearAPIVariables(); - for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i) + for (i = 0; i < RFU_CHILD_MAX; ++i) { gRfuSlotStatusNI[i]->recvBuffer = 0; gRfuSlotStatusNI[i]->recvBufferSize = 0; @@ -157,7 +150,7 @@ static void rfu_STC_clearAPIVariables(void) CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); gRfuLinkStatus->watchInterval = 4; gRfuStatic->nowWatchInterval = 0; - gRfuLinkStatus->connMode = 0xFF; + gRfuLinkStatus->parentChild = 0xFF; rfu_clearAllSlot(); gRfuStatic->SCStartFlag = 0; for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i) @@ -176,7 +169,7 @@ u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) struct RfuIntrStruct *buf; *ackFlag = 0; - if (gRfuLinkStatus->connMode != 1) + if (gRfuLinkStatus->parentChild != 1) return 0x300; buf = rfu_getSTWIRecvBuffer(); switch (buf->rxPacketAlloc.rfuPacket8.data[0]) @@ -193,9 +186,9 @@ u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) } } -void rfu_setTimerInterrupt(u8 which, IntrFunc *intr) +void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p) { - STWI_init_timer(intr, which); + STWI_init_timer(timerIntrTable_p, timerNo); } struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) @@ -203,12 +196,12 @@ struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) return gRfuFixed->STWIBuffer; } -void rfu_setMSCCallback(void (*callback)(u16)) +void rfu_setMSCCallback(void (*callback)(u16 reqCommandId)) { STWI_set_Callback_S(callback); } -void rfu_setREQCallback(void (*callback)(u16, u16)) +void rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult)) { gRfuFixed->reqCallback = callback; rfu_enableREQCallback(callback != NULL); @@ -243,7 +236,7 @@ static void rfu_CB_defaultCallback(u8 r0, u16 reqResult) for (i = 0; i < 4; ++i) if ((r5 >> i) & 1) rfu_STC_removeLinkData(i, 1); - gRfuLinkStatus->connMode = 0xFF; + gRfuLinkStatus->parentChild = 0xFF; } } @@ -259,18 +252,18 @@ void rfu_REQ_RFUStatus(void) STWI_send_SystemStatusREQ(); } -u32 rfu_getRFUStatus(u8 *status) +u16 rfu_getRFUStatus(u8 *rfuState) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93) return 0x10; if (STWI_poll_CommandEnd() == 0) - *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; + *rfuState = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; else - *status = 0xFF; + *rfuState = 0xFF; return 0; } -static s32 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) +u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) { const char *s1 = _Str_RFU_MBOOT; char *s2 = (char *)0x30000F0; @@ -305,7 +298,7 @@ void rfu_REQ_stopMode(void) { AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); - if (sub_81E349C(8) == 0x8001) + if (AgbRFU_checkID(8) == 0x8001) { timerReg = ®_TMCNT(gRfuState->timerSelect); *timerReg = 0; @@ -331,7 +324,7 @@ static void rfu_CB_stopMode(u8 a1, u16 reqResult) rfu_STC_REQ_callback(a1, reqResult); } -s32 rfu_REQBN_softReset_and_checkID(void) +u32 rfu_REQBN_softReset_and_checkID(void) { s32 r2; @@ -339,7 +332,7 @@ s32 rfu_REQBN_softReset_and_checkID(void) return -1; AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); - if ((r2 = sub_81E349C(30)) == 0) + if ((r2 = AgbRFU_checkID(30)) == 0) REG_SIOCNT = SIO_MULTI_MODE; return r2; } @@ -357,11 +350,11 @@ static void rfu_CB_reset(u8 a1, u16 reqResult) rfu_STC_REQ_callback(a1, reqResult); } -void rfu_REQ_configSystem(u16 r4, u8 r5, u8 r6) +void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) { STWI_set_Callback_M(rfu_STC_REQ_callback); - STWI_send_SystemConfigREQ((r4 & 3) | 0x3C, r5, r6); - if (r6 == 0) + STWI_send_SystemConfigREQ((availSlotFlag & 3) | 0x3C, maxMFrame, mcTimer); + if (mcTimer == 0) { gRfuStatic->unk_1a = 1; } @@ -370,37 +363,37 @@ void rfu_REQ_configSystem(u16 r4, u8 r5, u8 r6) u16 IMEBackup = REG_IME; REG_IME = 0; - gRfuStatic->unk_1a = Div(600, r6); + gRfuStatic->unk_1a = Div(600, mcTimer); REG_IME = IMEBackup; } } -void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7) +void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname) { u8 sp[16]; u8 i; u8 r3; - const u8 *r5 = r4; - const u8 *r1; + const u8 *gnameBackup = gname; + const u8 *unameBackup; - sp[0] = r2; - sp[1] = r2 >> 8; - if (r6 != 0) - sp[1] = (r2 >> 8) | 0x80; + sp[0] = serialNo; + sp[1] = serialNo >> 8; + if (mbootFlag != 0) + sp[1] = (serialNo >> 8) | 0x80; for (i = 2; i < 15; ++i) - sp[i] = *r4++; + sp[i] = *gname++; r3 = 0; - r1 = r7; + unameBackup = uname; for (i = 0; i < 8; ++i) { - r3 += *r1++; - r3 += *r5++; + r3 += *unameBackup++; + r3 += *gnameBackup++; } sp[15] = ~r3; - if (r6 != 0) + if (mbootFlag != 0) sp[14] = 0; STWI_set_Callback_M(rfu_CB_configGameData); - STWI_send_GameConfigREQ(sp, r7); + STWI_send_GameConfigREQ(sp, uname); } static void rfu_CB_configGameData(u8 ip, u16 r7) @@ -413,22 +406,22 @@ static void rfu_CB_configGameData(u8 ip, u16 r7) if (r7 == 0) { r1 = gRfuState->txPacket->rfuPacket8.data; - r2 = gRfuLinkStatus->my.serialNum = r1[4]; - gRfuLinkStatus->my.serialNum = (r1[5] << 8) | r2; + r2 = gRfuLinkStatus->my.serialNo = r1[4]; + gRfuLinkStatus->my.serialNo = (r1[5] << 8) | r2; r4 = &r1[6]; - if (gRfuLinkStatus->my.serialNum & 0x8000) + if (gRfuLinkStatus->my.serialNo & 0x8000) { - gRfuLinkStatus->my.serialNum = gRfuLinkStatus->my.serialNum ^ 0x8000; - gRfuLinkStatus->my.multibootFlag = 1; + gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000; + gRfuLinkStatus->my.mbootFlag = 1; } else { - gRfuLinkStatus->my.multibootFlag = 0; + gRfuLinkStatus->my.mbootFlag = 0; } - for (i = 0; i < NELEMS(gRfuLinkStatus->my.gname) - 2; ++i) + for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i) gRfuLinkStatus->my.gname[i] = *r4++; ++r4; - for (i = 0; i < NELEMS(gRfuLinkStatus->my.uname) - 1; ++i) + for (i = 0; i < RFU_USER_NAME_LENGTH; ++i) gRfuLinkStatus->my.uname[i] = *r4++; } rfu_STC_REQ_callback(ip, r7); @@ -471,7 +464,7 @@ static void rfu_STC_clearLinkStatus(u8 r4) CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); gRfuLinkStatus->findParentCount = 0; } - for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + for (i = 0; i < RFU_CHILD_MAX; ++i) gRfuLinkStatus->strength[i] = 0; gRfuLinkStatus->connCount = 0; gRfuLinkStatus->connSlotFlag = 0; @@ -507,7 +500,7 @@ static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) } else if (r4 == 27) { - if (gRfuLinkStatus->connMode == 255) + if (gRfuLinkStatus->parentChild == 255) gRfuLinkStatus->my.id = 0; gRfuStatic->SCStartFlag = 0; } @@ -553,7 +546,7 @@ static void rfu_STC_readChildList(void) ++gRfuLinkStatus->connCount; gRfuLinkStatus->partner[r2].id = *(u16 *)r4; gRfuLinkStatus->partner[r2].slot = r2; - gRfuLinkStatus->connMode = 1; + gRfuLinkStatus->parentChild = 1; gRfuStatic->flags &= 0x7F; gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id; } @@ -626,35 +619,35 @@ static void rfu_STC_readParentCandidateList(void) r2 += 2; r4_->slot = *r2; r2 += 2; - r4_->serialNum = *(u16 *)r2 & 0x7FFF; + r4_->serialNo = *(u16 *)r2 & 0x7FFF; if (*(u16 *)r2 & 0x8000) - r4_->multibootFlag = 1; + r4_->mbootFlag = 1; else - r4_->multibootFlag = 0; + r4_->mbootFlag = 0; r2 += 2; - for (r3 = 0; r3 < NELEMS(r4_->gname) - 2; ++r3) + for (r3 = 0; r3 < RFU_GAME_NAME_LENGTH; ++r3) r4_->gname[r3] = *r2++; ++r2; - for (r3 = 0; r3 < NELEMS(r4_->uname) - 1; ++r3) + for (r3 = 0; r3 < RFU_USER_NAME_LENGTH; ++r3) r4_->uname[r3] = *r2++; ++gRfuLinkStatus->findParentCount; } } } -void rfu_REQ_startConnectParent(u16 r4) +void rfu_REQ_startConnectParent(u16 pid) { u16 r3 = 0; u8 i; - for (i = 0; i < NELEMS(gRfuLinkStatus->partner) && gRfuLinkStatus->partner[i].id != r4; ++i) + for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i) ; if (i == 4) r3 = 256; if (r3 == 0) { - gRfuStatic->tryPid = r4; + gRfuStatic->tryPid = pid; STWI_set_Callback_M(rfu_STC_REQ_callback); - STWI_send_CP_StartREQ(r4); + STWI_send_CP_StartREQ(pid); } else { @@ -689,9 +682,9 @@ static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) gRfuLinkStatus->linkLossSlotFlag &= ~r2; gRfuLinkStatus->my.id = id; ++gRfuLinkStatus->connCount; - gRfuLinkStatus->connMode = 0; + gRfuLinkStatus->parentChild = 0; gRfuStatic->flags |= 0x80; - for (r5 = 0; r5 < NELEMS(gRfuLinkStatus->partner); ++r5) + for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5) { if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid) { @@ -720,7 +713,7 @@ static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) rfu_STC_REQ_callback(sp24, sp28); } -u16 rfu_getConnectParentStatus(u8 *status, u8 *r1) +u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo) { u8 r0, *r2; @@ -730,7 +723,7 @@ u16 rfu_getConnectParentStatus(u8 *status, u8 *r1) if (r0 <= 1) { r2 += 6; - *r1 = r2[0]; + *connectSlotNo = r2[0]; *status = r2[1]; return 0; } @@ -751,7 +744,7 @@ u16 rfu_syncVBlank(void) s32 r5; rfu_NI_checkCommFailCounter(); - if (gRfuLinkStatus->connMode == 0xFF) + if (gRfuLinkStatus->parentChild == 0xFF) return 0; if (gRfuStatic->nowWatchInterval != 0) --gRfuStatic->nowWatchInterval; @@ -781,26 +774,26 @@ u16 rfu_syncVBlank(void) for (r4 = 0; r4 < 4; ++r4) if ((r5 >> r4) & 1) rfu_STC_removeLinkData(r4, 1); - gRfuLinkStatus->connMode = 0xFF; + gRfuLinkStatus->parentChild = 0xFF; return 1; } --gRfuStatic->watchdogTimer; return 0; } -s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) +u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot) { u8 sp08 = 0; u8 sp0C = 0; u8 i; s32 sp10, sp14; u8 *r2; - u8 r9, r6, r3, r1, r0; + u8 r9, r6, r3, connSlotFlag, r0; - *r8 = 0; - *sp00 = 0; - *sp04 = 0; - if (gRfuLinkStatus->connMode == 0xFF || gRfuState->msMode == 0) + *bmLinkLossSlot = 0; + *linkLossReason = 0; + *parentBmLinkRecoverySlot = 0; + if (gRfuLinkStatus->parentChild == 0xFF || gRfuState->msMode == 0) return 0; if (gRfuStatic->flags & 4) gRfuStatic->watchdogTimer = 360; @@ -809,27 +802,27 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval; sp08 = 1; } - if ((u8)r5 == 41) + if ((u8)reqCommandId == 41) { u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; - *r8 = r1[4]; - *sp00 = r1[5]; - if (*sp00 == 1) - *r8 = gRfuLinkStatus->connSlotFlag; + *bmLinkLossSlot = r1[4]; + *linkLossReason = r1[5]; + if (*linkLossReason == 1) + *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag; sp08 = 2; } else { - if (r5 == 310) + if (reqCommandId == 310) { r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; r6 ^= gRfuLinkStatus->connSlotFlag; - *r8 = r6 & gRfuLinkStatus->connSlotFlag; - *sp00 = 1; - for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + *bmLinkLossSlot = r6 & gRfuLinkStatus->connSlotFlag; + *linkLossReason = 1; + for (i = 0; i < RFU_CHILD_MAX; ++i) { - if ((*r8 >> i) & 1) + if ((*bmLinkLossSlot >> i) & 1) { gRfuLinkStatus->strength[i] = 0; rfu_STC_removeLinkData(i, 0); @@ -847,7 +840,7 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) if (sp0C == 0) { r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; - for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + for (i = 0; i < RFU_CHILD_MAX; ++i) gRfuLinkStatus->strength[i] = *r2++; r9 = 0; i = 0; @@ -866,13 +859,13 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) { if (gRfuLinkStatus->strength[i] == 0) { - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) { ++gRfuStatic->linkEmergencyFlag[i]; if (gRfuStatic->linkEmergencyFlag[i] > 3) { - *r8 |= r6; - *sp00 = sp08; // why not directly use 1? + *bmLinkLossSlot |= r6; + *linkLossReason = sp08; // why not directly use 1? } } else @@ -882,8 +875,8 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { - *r8 |= r6; - *sp00 = sp08; + *bmLinkLossSlot |= r6; + *linkLossReason = sp08; } else { @@ -892,8 +885,8 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) gRfuStatic->linkEmergencyFlag[i] = 0; STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); STWI_poll_CommandEnd(); - *r8 |= r6; - *sp00 = sp08; // why not directly use 1? + *bmLinkLossSlot |= r6; + *linkLossReason = sp08; // why not directly use 1? } } } @@ -904,13 +897,13 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? } } - if (gRfuLinkStatus->connMode == 1 && gRfuLinkStatus->strength[i] != 0) + if (gRfuLinkStatus->parentChild == 1 && gRfuLinkStatus->strength[i] != 0) { if (r6 & gRfuLinkStatus->linkLossSlotFlag) { if (gRfuLinkStatus->strength[i] > 10) { - *sp04 |= r6; + *parentBmLinkRecoverySlot |= r6; gRfuLinkStatus->connSlotFlag |= r6; gRfuLinkStatus->linkLossSlotFlag &= ~r6; ++gRfuLinkStatus->connCount; @@ -943,9 +936,9 @@ s32 rfu_REQBN_watchLink(u16 r5, u8 *r8, u8 *sp00, u8 *sp04) } } } - r1 = gRfuLinkStatus->connSlotFlag; - r0 = *r8; - r0 &= r1; + connSlotFlag = gRfuLinkStatus->connSlotFlag; + r0 = *bmLinkLossSlot; + r0 &= connSlotFlag; if (r6 & r0) rfu_STC_removeLinkData(i, 0); } @@ -971,7 +964,7 @@ static void rfu_STC_removeLinkData(u8 r7, u8 r12) gRfuLinkStatus->connSlotFlag &= r6 = ~r5; gRfuLinkStatus->linkLossSlotFlag |= r5; if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) - gRfuLinkStatus->connMode = 0xFF; + gRfuLinkStatus->parentChild = 0xFF; if (r12 != 0) { CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); @@ -981,16 +974,16 @@ static void rfu_STC_removeLinkData(u8 r7, u8 r12) } } -void rfu_REQ_disconnect(u8 who) +void rfu_REQ_disconnect(u8 bmDisconnectSlot) { u16 r1; - if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & who) + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot) { - gRfuStatic->recoveryBmSlot = who; - if (gRfuLinkStatus->connMode == 0xFF && gRfuStatic->flags & 0x80) + gRfuStatic->recoveryBmSlot = bmDisconnectSlot; + if (gRfuLinkStatus->parentChild == 0xFF && gRfuStatic->flags & 0x80) { - if (gRfuLinkStatus->linkLossSlotFlag & who) + if (gRfuLinkStatus->linkLossSlotFlag & bmDisconnectSlot) rfu_CB_disconnect(48, 0); } else if (gRfuStatic->SCStartFlag @@ -1003,7 +996,7 @@ void rfu_REQ_disconnect(u8 who) else { STWI_set_Callback_M(rfu_CB_disconnect); - STWI_send_DisconnectREQ(who); + STWI_send_DisconnectREQ(bmDisconnectSlot); } } } @@ -1012,7 +1005,7 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) { u8 r4, r0; - if (r5 == 3 && gRfuLinkStatus->connMode == 0) + if (r5 == 3 && gRfuLinkStatus->parentChild == 0) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); @@ -1031,7 +1024,7 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) } } if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) - gRfuLinkStatus->connMode = 0xFF; + gRfuLinkStatus->parentChild = 0xFF; rfu_STC_REQ_callback(r6, r5); if (gRfuStatic->SCStartFlag) { @@ -1043,16 +1036,16 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) } } -void rfu_REQ_CHILD_startConnectRecovery(u8 r5) +void rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot) { u8 i; - gRfuStatic->recoveryBmSlot = r5; - for (i = 0; i < 4 && !((r5 >> i) & 1); ++i) + gRfuStatic->recoveryBmSlot = bmRecoverySlot; + for (i = 0; i < 4 && !((bmRecoverySlot >> i) & 1); ++i) ; STWI_set_Callback_M(rfu_STC_REQ_callback); // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id - STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, r5); + STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, bmRecoverySlot); } void rfu_REQ_CHILD_pollConnectRecovery(void) @@ -1068,7 +1061,7 @@ static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) { - gRfuLinkStatus->connMode = 0; + gRfuLinkStatus->parentChild = 0; for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) { r3 = 1 << r4; @@ -1154,10 +1147,10 @@ void rfu_clearAllSlot(void) u16 IMEBackup = REG_IME; REG_IME = 0; - for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - CpuFill16(0, gRfuSlotStatusNI[i], sizeof(gRfuSlotStatusNI[i]->sub)); - CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(gRfuSlotStatusUNI[i]->sub)); + CpuFill16(0, gRfuSlotStatusNI[i], 2 * sizeof(struct NIComm)); + CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(struct UNISend) + sizeof(struct UNIRecv)); gRfuLinkStatus->remainLLFrameSizeChild[i] = 16; } gRfuLinkStatus->remainLLFrameSizeParent = 87; @@ -1185,43 +1178,43 @@ static void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) } } -s32 rfu_clearSlot(u8 r8, u8 r7) +u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) { u16 r10, r3, r1; struct NIComm *r4; - if (r7 > 3) + if (slotStatusIndex >= RFU_CHILD_MAX) return 0x400; - if ((r8 & 0xF) == 0) + if ((connTypeFlag & 0xF) == 0) return 0x600; r10 = REG_IME; REG_IME = 0; - if (r8 & 0xC) + if (connTypeFlag & 0xC) { for (r3 = 0; r3 < 2; ++r3) { r4 = NULL; if (r3 == 0) { - if (r8 & 4) + if (connTypeFlag & 4) { - r4 = &gRfuSlotStatusNI[r7]->sub.send; + r4 = &gRfuSlotStatusNI[slotStatusIndex]->send; gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg; } } else { - if (r8 & 8) + if (connTypeFlag & 8) { - r4 = &gRfuSlotStatusNI[r7]->sub.recv; - gRfuLinkStatus->recvSlotNIFlag &= ~(1 << r7); + r4 = &gRfuSlotStatusNI[slotStatusIndex]->recv; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); } } if (r4 != NULL) { if (r4->state & 0x8000) { - rfu_STC_releaseFrame(r7, r3, r4); + rfu_STC_releaseFrame(slotStatusIndex, r3, r4); for (r1 = 0; r1 < 4; ++r1) if ((r4->bmSlotOrg >> r1) & 1) r4->failCounter = 0; @@ -1230,71 +1223,71 @@ s32 rfu_clearSlot(u8 r8, u8 r7) } } } - if (r8 & 1) + if (connTypeFlag & 1) { - struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[slotStatusIndex]; - if (r3->sub.send.state & 0x8000) + if (r3->send.state & 0x8000) { if (!(gRfuStatic->flags & 0x80)) - gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->sub.send.payloadSize; + gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->send.payloadSize; else - gRfuLinkStatus->remainLLFrameSizeChild[r7] += 2 + (u8)r3->sub.send.payloadSize; - gRfuLinkStatus->sendSlotUNIFlag &= ~r3->sub.send.bmSlot; + gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)r3->send.payloadSize; + gRfuLinkStatus->sendSlotUNIFlag &= ~r3->send.bmSlot; } - CpuFill16(0, &r3->sub.send, sizeof(struct UNISend)); + CpuFill16(0, &r3->send, sizeof(struct UNISend)); } - if (r8 & 2) + if (connTypeFlag & 2) { - CpuFill16(0, &gRfuSlotStatusUNI[r7]->sub.recv, sizeof(struct UNIRecv)); + CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv)); } REG_IME = r10; return 0; } -s32 rfu_setRecvBuffer(u8 r3, u8 r4, void *r5, size_t r6) +u16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize) { - if (r4 > 3) + if (slotNo >= RFU_CHILD_MAX) return 0x400; - if (r3 & 0x20) + if (connType & 0x20) { - gRfuSlotStatusNI[r4]->recvBuffer = r5; - gRfuSlotStatusNI[r4]->recvBufferSize = r6; + gRfuSlotStatusNI[slotNo]->recvBuffer = buffer; + gRfuSlotStatusNI[slotNo]->recvBufferSize = buffSize; } - else if (!(r3 & 0x10)) + else if (!(connType & 0x10)) { return 0x600; } else { - gRfuSlotStatusUNI[r4]->recvBuffer = r5; - gRfuSlotStatusUNI[r4]->recvBufferSize = r6; + gRfuSlotStatusUNI[slotNo]->recvBuffer = buffer; + gRfuSlotStatusUNI[slotNo]->recvBufferSize = buffSize; } return 0; } -s32 rfu_NI_setSendData(u8 a1, u8 a2, const void *a3, u32 a4) +u16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size) { - return rfu_STC_setSendData_org(32, a1, a2, a3, a4); + return rfu_STC_setSendData_org(32, bmSendSlot, subFrameSize, src, size); } -s32 rfu_UNI_setSendData(u8 flag, const void *ptr, u8 size) +u16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size) { - u8 r0; + u8 subFrameSize; - if (gRfuLinkStatus->connMode == 1) - r0 = size + 3; + if (gRfuLinkStatus->parentChild == 1) + subFrameSize = size + 3; else - r0 = size + 2; - return rfu_STC_setSendData_org(16, flag, r0, ptr, 0); + subFrameSize = size + 2; + return rfu_STC_setSendData_org(16, bmSendSlot, subFrameSize, src, 0); } -s32 rfu_NI_CHILD_setSendGameName(u8 a1, u8 a2) +u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize) { - return rfu_STC_setSendData_org(64, 1 << a1, a2, &gRfuLinkStatus->my.serialNum, 26); + return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26); } -static u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) +static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 sp28) { u8 r2, r0; u8 r4; @@ -1305,26 +1298,26 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp struct RfuSlotStatusUNI *r1; struct RfuSlotStatusNI *r12; - if (gRfuLinkStatus->connMode == 0xFF) + if (gRfuLinkStatus->parentChild == 0xFF) return 0x301; - if (!(r3 & 0xF)) + if (!(bmSendSlot & 0xF)) return 0x400; - if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r3) != r3) + if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot) return 0x401; if (r6 & 0x10) r0 = gRfuLinkStatus->sendSlotUNIFlag; else r0 = gRfuLinkStatus->sendSlotNIFlag; - if (r0 & r3) + if (r0 & bmSendSlot) return 0x402; - for (r2 = 0; r2 < 4 && !((r3 >> r2) & 1); ++r2) + for (r2 = 0; r2 < 4 && !((bmSendSlot >> r2) & 1); ++r2) ; - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) r9 = &gRfuLinkStatus->remainLLFrameSizeParent; - else if (gRfuLinkStatus->connMode == 0) + else if (gRfuLinkStatus->parentChild == 0) r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; - r4 = _Str_RfuHeader[gRfuLinkStatus->connMode].unk00; - if (r8 > *r9 || r8 <= r4) + r4 = _Str_RfuHeader[gRfuLinkStatus->parentChild].unk00; + if (subFrameSize > *r9 || subFrameSize <= r4) return 0x500; sp04 = REG_IME; REG_IME = 0; @@ -1335,82 +1328,82 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp r12 = gRfuSlotStatusNI[r2]; r1 = NULL; - r12->sub.send.errorCode = 0; - *r12->sub.send.nowP = r1 = &r12->sub.send.dataType; - r12->sub.send.remainSize = 7; - r12->sub.send.bmSlotOrg = r3; - r12->sub.send.bmSlot = r3; - r12->sub.send.payloadSize = r8 - r4; + r12->send.errorCode = 0; + *r12->send.now_p = r1 = &r12->send.dataType; + r12->send.remainSize = 7; + r12->send.bmSlotOrg = bmSendSlot; + r12->send.bmSlot = bmSendSlot; + r12->send.payloadSize = subFrameSize - r4; if (r5 != 0) *r1 = 0; else *r1 = 1; - r12->sub.send.dataSize = sp28; - r12->sub.send.src = sp00; - r12->sub.send.ack = 0; - r12->sub.send.phase = 0; + r12->send.dataSize = sp28; + r12->send.src = src; + r12->send.ack = 0; + r12->send.phase = 0; #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette asm("":::"r2"); #endif - for (i = 0; i < NELEMS(r12->sub.send.recvAckFlag); ++i) + for (i = 0; i < WINDOW_COUNT; ++i) { - r12->sub.send.recvAckFlag[i] = 0; - r12->sub.send.n[i] = 1; + r12->send.recvAckFlag[i] = 0; + r12->send.n[i] = 1; } - for (r2 = 0; r2 < NELEMS(gRfuSlotStatusNI); ++r2) - if ((r3 >> r2) & 1) - gRfuSlotStatusNI[r2]->sub.send.failCounter = 0; - gRfuLinkStatus->sendSlotNIFlag |= r3; - *r9 -= r8; - r12->sub.send.state = 0x8021; + for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2) + if ((bmSendSlot >> r2) & 1) + gRfuSlotStatusNI[r2]->send.failCounter = 0; + gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; + *r9 -= subFrameSize; + r12->send.state = 0x8021; } else if (r6 & 0x10) { r1 = gRfuSlotStatusUNI[r2]; - r1->sub.send.bmSlot = r3; - r1->sub.send.src = sp00; - r1->sub.send.payloadSize = r8 - r4; - *r9 -= r8; - r1->sub.send.state = 0x8024; - gRfuLinkStatus->sendSlotUNIFlag |= r3; + r1->send.bmSlot = bmSendSlot; + r1->send.src = src; + r1->send.payloadSize = subFrameSize - r4; + *r9 -= subFrameSize; + r1->send.state = 0x8024; + gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot; } REG_IME = sp04; return 0; } -s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) +u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) { struct RfuSlotStatusNI *r5; u16 r8; u8 r2; - if (r7 >= NELEMS(gRfuSlotStatusNI)) + if (slotStatusIndex >= RFU_CHILD_MAX) return 0x400; - if (r3 == 0x20) + if (connType == 0x20) { - r5 = gRfuSlotStatusNI[r7]; - if ((r5->sub.send.state & 0x8000) - && (r5->sub.send.state & 0x20)) + r5 = gRfuSlotStatusNI[slotStatusIndex]; + if ((r5->send.state & 0x8000) + && (r5->send.state & 0x20)) { - r3 = r6 ^ r5->sub.send.bmSlot; + connType = bmNewTgtSlot ^ r5->send.bmSlot; - if (!(r3 & r6)) + if (!(connType & bmNewTgtSlot)) { - if (r3) + if (connType) { r8 = REG_IME; REG_IME = 0; - for (r2 = 0; r2 < NELEMS(gRfuSlotStatusNI); ++r2) + for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2) { - if ((r3 >> r2) & 1) - gRfuSlotStatusNI[r2]->sub.send.failCounter = 0; + if ((connType >> r2) & 1) + gRfuSlotStatusNI[r2]->send.failCounter = 0; } - gRfuLinkStatus->sendSlotNIFlag &= ~r3; - r5->sub.send.bmSlot = r6; - if (r5->sub.send.bmSlot == 0) + gRfuLinkStatus->sendSlotNIFlag &= ~connType; + r5->send.bmSlot = bmNewTgtSlot; + if (r5->send.bmSlot == 0) { - rfu_STC_releaseFrame(r7, 0, &r5->sub.send); - r5->sub.send.state = 39; + rfu_STC_releaseFrame(slotStatusIndex, 0, &r5->send); + r5->send.state = 39; } REG_IME = r8; } @@ -1427,22 +1420,22 @@ s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) } else { - if (r3 == 16) + if (connType == 16) { s32 r3; - if (gRfuSlotStatusUNI[r7]->sub.send.state != 0x8024) + if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != 0x8024) return 0x403; - for (r3 = 0, r2 = 0; r2 < NELEMS(gRfuSlotStatusUNI); ++r2) - if (r2 != r7) - r3 |= gRfuSlotStatusUNI[r2]->sub.send.bmSlot; - if (r6 & r3) + for (r3 = 0, r2 = 0; r2 < RFU_CHILD_MAX; ++r2) + if (r2 != slotStatusIndex) + r3 |= gRfuSlotStatusUNI[r2]->send.bmSlot; + if (bmNewTgtSlot & r3) return 0x404; r8 = REG_IME; REG_IME = 0; - gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[r7]->sub.send.bmSlot; - gRfuLinkStatus->sendSlotUNIFlag |= r6; - gRfuSlotStatusUNI[r7]->sub.send.bmSlot = r6; + gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot; + gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot; + gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot; REG_IME = r8; } else @@ -1453,84 +1446,84 @@ s32 rfu_changeSendTarget(u8 r3, u8 r7, u8 r6) return 0; } -s32 rfu_NI_stopReceivingData(u8 who) +u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) { struct NIComm *r5; u16 r4, r1; - if (who > 3) + if (slotStatusIndex > 3) return 0x400; - r5 = &gRfuSlotStatusNI[who]->sub.recv; + r5 = &gRfuSlotStatusNI[slotStatusIndex]->recv; r4 = REG_IME; ++r4; --r4; // fix r4, r5 register swap REG_IME = 0; - if (gRfuSlotStatusNI[who]->sub.recv.state & 0x8000) + if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & 0x8000) { - if (gRfuSlotStatusNI[who]->sub.recv.state == 0x8043) - gRfuSlotStatusNI[who]->sub.recv.state = 72; + if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == 0x8043) + gRfuSlotStatusNI[slotStatusIndex]->recv.state = 72; else - gRfuSlotStatusNI[who]->sub.recv.state = 71; - gRfuLinkStatus->recvSlotNIFlag &= ~(1 << who); - rfu_STC_releaseFrame(who, 1, r5); + gRfuSlotStatusNI[slotStatusIndex]->recv.state = 71; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); + rfu_STC_releaseFrame(slotStatusIndex, 1, r5); } REG_IME = r4; return 0; } -s32 rfu_UNI_changeAndReadySendData(u8 r3, const void *r7, u8 r5) +u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size) { struct UNISend *r4; u8 *r6; u16 r1; u8 r3_; - if (r3 >= 4) + if (slotStatusIndex >= RFU_CHILD_MAX) return 0x400; - r4 = &gRfuSlotStatusUNI[r3]->sub.send; + r4 = &gRfuSlotStatusUNI[slotStatusIndex]->send; if (r4->state != 0x8024) return 0x403; - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) { r6 = &gRfuLinkStatus->remainLLFrameSizeParent; r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize; } else { - r6 = &gRfuLinkStatus->remainLLFrameSizeChild[r3]; - r3_ = gRfuLinkStatus->remainLLFrameSizeChild[r3] + (u8)r4->payloadSize; + r6 = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex]; + r3_ = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)r4->payloadSize; } - if (r3_ < r5) + if (r3_ < size) return 0x500; r1 = REG_IME; REG_IME = 0; - r4->src = r7; - *r6 = r3_ - r5; - r4->payloadSize = r5; + r4->src = src; + *r6 = r3_ - size; + r4->payloadSize = size; r4->dataReadyFlag = 1; REG_IME = r1; return 0; } -void rfu_UNI_readySendData(u8 a1) +void rfu_UNI_readySendData(u8 slotStatusIndex) { - if (a1 < NELEMS(gRfuSlotStatusUNI)) + if (slotStatusIndex < RFU_CHILD_MAX) { - if (gRfuSlotStatusUNI[a1]->sub.send.state == 0x8024) - gRfuSlotStatusUNI[a1]->sub.send.dataReadyFlag = 1; + if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == 0x8024) + gRfuSlotStatusUNI[slotStatusIndex]->send.dataReadyFlag = 1; } } -void rfu_UNI_clearRecvNewDataFlag(u8 a1) +void rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex) { - if (a1 < NELEMS(gRfuSlotStatusUNI)) - gRfuSlotStatusUNI[a1]->sub.recv.newDataFlag = 0; + if (slotStatusIndex < RFU_CHILD_MAX) + gRfuSlotStatusUNI[slotStatusIndex]->recv.newDataFlag = 0; } -void rfu_REQ_sendData(u8 r5) +void rfu_REQ_sendData(u8 clockChangeFlag) { - if (gRfuLinkStatus->connMode != 0xFF) + if (gRfuLinkStatus->parentChild != 0xFF) { - if (gRfuLinkStatus->connMode == 1 + if (gRfuLinkStatus->parentChild == 1 && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)) { if (gRfuStatic->commExistFlag) @@ -1548,7 +1541,7 @@ void rfu_REQ_sendData(u8 r5) gRfuFixed->LLFBuffer[0] = 1; gRfuFixed->LLFBuffer[4] = 0xFF; STWI_set_Callback_M(rfu_CB_sendData3); - if (r5 == 0) + if (clockChangeFlag == 0) STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, 1); else STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, 1); @@ -1562,7 +1555,7 @@ void rfu_REQ_sendData(u8 r5) if (gRfuLinkStatus->LLFReadyFlag) { STWI_set_Callback_M(rfu_CB_sendData); - if (r5 != 0) + if (clockChangeFlag != 0) { STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); return; @@ -1570,9 +1563,9 @@ void rfu_REQ_sendData(u8 r5) STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); } } - if (r5 != 0) + if (clockChangeFlag != 0) { - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) { if (gRfuState->callbackS != NULL) gRfuState->callbackS(39); @@ -1593,11 +1586,11 @@ static void rfu_CB_sendData(UNUSED u8 r0, u16 r7) if (r7 == 0) { - for (r6 = 0; r6 < NELEMS(gRfuSlotStatusNI); ++r6) + for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) { - if (gRfuSlotStatusUNI[r6]->sub.send.dataReadyFlag) - gRfuSlotStatusUNI[r6]->sub.send.dataReadyFlag = 0; - r4 = &gRfuSlotStatusNI[r6]->sub.send; + if (gRfuSlotStatusUNI[r6]->send.dataReadyFlag) + gRfuSlotStatusUNI[r6]->send.dataReadyFlag = 0; + r4 = &gRfuSlotStatusNI[r6]->send; if (r4->state == 0x8020) { rfu_STC_releaseFrame(r6, 0, r4); @@ -1632,24 +1625,24 @@ static void rfu_constructSendLLFrame(void) u8 *sp00; struct RfuSlotStatusNI *r2; - if (gRfuLinkStatus->connMode != 0xFF + if (gRfuLinkStatus->parentChild != 0xFF && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) { gRfuLinkStatus->LLFReadyFlag = 0; r8 = 0; sp00 = (u8 *)&gRfuFixed->LLFBuffer[1]; - for (r6 = 0; r6 < NELEMS(gRfuSlotStatusUNI); ++r6) + for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) { r5 = 0; - if (gRfuSlotStatusNI[r6]->sub.send.state & 0x8000) - r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->sub.send); - if (gRfuSlotStatusNI[r6]->sub.recv.state & 0x8000) - r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->sub.recv); - if (gRfuSlotStatusUNI[r6]->sub.send.state == 0x8024) + if (gRfuSlotStatusNI[r6]->send.state & 0x8000) + r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->send); + if (gRfuSlotStatusNI[r6]->recv.state & 0x8000) + r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->recv); + if (gRfuSlotStatusUNI[r6]->send.state == 0x8024) r5 += rfu_STC_UNI_constructLLSF(r6, &sp00); if (r5 != 0) { - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) r8 += r5; else r8 |= r5 << (5 * r6 + 8); @@ -1660,7 +1653,7 @@ static void rfu_constructSendLLFrame(void) while ((u32)sp00 & 3) *sp00++ = 0; gRfuFixed->LLFBuffer[0] = r8; - if (gRfuLinkStatus->connMode == 0) + if (gRfuLinkStatus->parentChild == 0) { u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]); @@ -1680,11 +1673,11 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) u32 sp00; u8 i; u8 *r2; - const struct RfuHeader *r8 = &_Str_RfuHeader[gRfuLinkStatus->connMode]; + const struct RfuHeader *r8 = &_Str_RfuHeader[gRfuLinkStatus->parentChild]; if (r4->state == 0x8022) { - while (r4->nowP[r4->phase] >= (const u8 *)r4->src + r4->dataSize) + while (r4->now_p[r4->phase] >= (const u8 *)r4->src + r4->dataSize) { ++r4->phase; if (r4->phase == 4) @@ -1697,8 +1690,8 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) } else if (r4->state == 0x8022) { - if (r4->nowP[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) - r5 = (const u8 *)r4->src + r4->dataSize - r4->nowP[r4->phase]; + if (r4->now_p[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) + r5 = (const u8 *)r4->src + r4->dataSize - r4->now_p[r4->phase]; else r5 = r4->payloadSize; } @@ -1714,14 +1707,14 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) | r4->phase << r8->unk05 | r4->n[r4->phase] << r8->unk06 | r5; - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; for (i = 0; i < r8->unk00; ++i) *(*r12)++ = *r2++; if (r5 != 0) { - const u8 *sp04 = r4->nowP[r4->phase]; + const u8 *sp04 = r4->now_p[r4->phase]; gRfuFixed->fastCopyPtr(&sp04, r12, r5); } @@ -1731,7 +1724,7 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) if (r4->phase == 4) r4->phase = 0; } - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) gRfuLinkStatus->LLFReadyFlag = 1; else gRfuLinkStatus->LLFReadyFlag |= 1 << r10; @@ -1745,21 +1738,21 @@ static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) u32 sp00; u8 *r2; u8 i; - struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->sub.send; + struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->send; if (!r4->dataReadyFlag || !r4->bmSlot) return 0; - r5 = &_Str_RfuHeader[gRfuLinkStatus->connMode]; + r5 = &_Str_RfuHeader[gRfuLinkStatus->parentChild]; sp00 = (r4->state & 0xF) << r5->unk03 | r4->payloadSize; - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; for (i = 0; i < r5->unk00; ++i) *(*r6)++ = *r2++; sp04 = r4->src; gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) gRfuLinkStatus->LLFReadyFlag = 16; else gRfuLinkStatus->LLFReadyFlag |= 16 << r8; @@ -1768,7 +1761,7 @@ static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) void rfu_REQ_recvData(void) { - if (gRfuLinkStatus->connMode != 0xFF) + if (gRfuLinkStatus->parentChild != 0xFF) { gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag; gRfuStatic->recvErrorFlag = 0; @@ -1786,21 +1779,21 @@ static void rfu_CB_recvData(u8 r9, u16 r7) if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) { gRfuStatic->NIEndRecvFlag = 0; - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) rfu_STC_PARENT_analyzeRecvPacket(); else rfu_STC_CHILD_analyzeRecvPacket(); - for (r6 = 0; r6 < NELEMS(gRfuSlotStatusNI); ++r6) + for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) { r4 = gRfuSlotStatusNI[r6]; - if (r4->sub.recv.state == 0x8043 && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) + if (r4->recv.state == 0x8043 && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) { - r5 = &r4->sub.recv; + r5 = &r4->recv; if (r5->dataType == 1) gRfuLinkStatus->getNameFlag |= 1 << r6; rfu_STC_releaseFrame(r6, 1, r5); gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot; - r4->sub.recv.state = 70; + r4->recv.state = 70; } } if (gRfuStatic->recvErrorFlag) @@ -1871,7 +1864,7 @@ static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) u32 r0; u16 r10; - r6 = &_Str_RfuHeader[~gRfuLinkStatus->connMode & 1]; + r6 = &_Str_RfuHeader[~gRfuLinkStatus->parentChild & 1]; if (r3 < r6->unk00) return r3; r5 = 0; @@ -1887,7 +1880,7 @@ static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) r10 = sp00.unk06 + r6->unk00; if (sp00.unk00 == 0) { - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) { if ((gRfuLinkStatus->connSlotFlag >> r12) & 1) { @@ -1901,8 +1894,8 @@ static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) } else { - for (r4 = 0; r4 < NELEMS(gRfuSlotStatusNI); ++r4) - if (((gRfuSlotStatusNI[r4]->sub.send.bmSlot >> r12) & 1) + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + if (((gRfuSlotStatusNI[r4]->send.bmSlot >> r12) & 1) && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) break; if (r4 <= 3) @@ -1939,12 +1932,12 @@ static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 u8 *sp04; u32 r2; struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; - struct UNIRecv *r5 = &r3->sub.recv; + struct UNIRecv *r5 = &r3->recv; r5->errorCode = 0; if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06) { - r3->sub.recv.state = 73; + r3->recv.state = 73; r5->errorCode = 0x701; } else @@ -1976,7 +1969,7 @@ _081E2F0E: static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct *r6, const u8 *r3) { - struct NIComm *r12 = &gRfuSlotStatusNI[r0]->sub.send; + struct NIComm *r12 = &gRfuSlotStatusNI[r0]->send; u16 r9 = r12->state; u8 sp00 = r12->n[r6->unk04]; u8 *r8; @@ -1997,9 +1990,9 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct if ((u16)(r12->state + ~0x8020) <= 1) { if (r12->state == 0x8021) - r12->nowP[r6->unk04] += r12->payloadSize; + r12->now_p[r6->unk04] += r12->payloadSize; else - r12->nowP[r6->unk04] += r12->payloadSize << 2; + r12->now_p[r6->unk04] += r12->payloadSize << 2; r12->remainSize -= r12->payloadSize; if (r12->remainSize != 0) if (r12->remainSize >= 0) @@ -2012,10 +2005,10 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct r12->phase = 0; if (r12->state == 0x8021) { - for (r4 = 0; r4 < NELEMS(r12->n); ++r4) + for (r4 = 0; r4 < WINDOW_COUNT; ++r4) { r12->n[r4] = 1; - r12->nowP[r4] = r12->src + r12->payloadSize * r4; + r12->now_p[r4] = r12->src + r12->payloadSize * r4; } r12->remainSize = r12->dataSize; r12->state = 0x8022; @@ -2041,7 +2034,7 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct r2 = REG_IME; REG_IME = 0; gRfuStatic->recvRenewalFlag |= 16 << r10; - gRfuSlotStatusNI[r10]->sub.send.failCounter = 0; + gRfuSlotStatusNI[r10]->send.failCounter = 0; REG_IME = r2; } } @@ -2051,18 +2044,18 @@ static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, u16 r2; u32 r7 = 0; struct RfuSlotStatusNI *r4 = gRfuSlotStatusNI[r8]; - struct NIComm *r5 = &r4->sub.recv; - u16 r9 = r4->sub.recv.state; - u8 r10 = r4->sub.recv.n[r6->unk04]; + struct NIComm *r5 = &r4->recv; + u16 r9 = r4->recv.state; + u8 r10 = r4->recv.n[r6->unk04]; if (r6->unk02 == 3) { gRfuStatic->NIEndRecvFlag |= 1 << r8; - if (r4->sub.recv.state == 0x8042) + if (r4->recv.state == 0x8042) { - r4->sub.recv.phase = 0; - r4->sub.recv.n[0] = 0; - r4->sub.recv.state = 0x8043; + r4->recv.phase = 0; + r4->recv.n[0] = 0; + r4->recv.state = 0x8043; } } else if (r6->unk02 == 2) @@ -2081,7 +2074,7 @@ static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, else { rfu_STC_NI_initSlot_asRecvControllData(r8, r5); - if (r4->sub.recv.state != 0x8041) + if (r4->recv.state != 0x8041) return; r7 = 1; } @@ -2090,9 +2083,9 @@ static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, { if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3)) { - gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->nowP[r6->unk04], r6->unk06); + gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->now_p[r6->unk04], r6->unk06); if (r5->state == 0x8042) - r5->nowP[r6->unk04] += 3 * r5->payloadSize; + r5->now_p[r6->unk04] += 3 * r5->payloadSize; r5->remainSize -= r6->unk06; r5->n[r6->unk04] = r6->unk05; } @@ -2117,7 +2110,7 @@ static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) u32 r5; u8 r6; - if (gRfuLinkStatus->connMode == 1) + if (gRfuLinkStatus->parentChild == 1) { r5 = 3; r1 = &gRfuLinkStatus->remainLLFrameSizeParent; @@ -2140,7 +2133,7 @@ static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) { r2->errorCode = 0; *r1 -= r5; - r2->nowP[0] = &r2->dataType; + r2->now_p[0] = &r2->dataType; r2->remainSize = 7; r2->ack = 1; r2->payloadSize = 0; @@ -2157,7 +2150,7 @@ static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4) if (r4->dataType == 1) { - r4->nowP[0] = (void *)&gRfuLinkStatus->partner[r5].serialNum; + r4->now_p[0] = (void *)&gRfuLinkStatus->partner[r5].serialNo; } else { @@ -2171,12 +2164,12 @@ static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4) rfu_STC_releaseFrame(r5, 1, r4); return; } - r4->nowP[0] = gRfuSlotStatusNI[r5]->recvBuffer; + r4->now_p[0] = gRfuSlotStatusNI[r5]->recvBuffer; } for (r3 = 0; r3 < 4; ++r3) { r4->n[r3] = 0; - r4->nowP[r3] = &r4->nowP[0][r4->payloadSize * r3]; + r4->now_p[r3] = &r4->now_p[0][r4->payloadSize * r3]; } r4->remainSize = r4->dataSize; r4->state = 0x8042; @@ -2193,15 +2186,15 @@ static void rfu_NI_checkCommFailCounter(void) r12 = REG_IME; REG_IME = 0; r7 = gRfuStatic->recvRenewalFlag >> 4; - for (r3 = 0; r3 < NELEMS(gRfuSlotStatusNI); ++r3) + for (r3 = 0; r3 < RFU_CHILD_MAX; ++r3) { r2 = 1 << r3; if (gRfuLinkStatus->sendSlotNIFlag & r2 && !(gRfuStatic->recvRenewalFlag & r2)) - ++gRfuSlotStatusNI[r3]->sub.send.failCounter; + ++gRfuSlotStatusNI[r3]->send.failCounter; if (gRfuLinkStatus->recvSlotNIFlag & r2 && !(r7 & r2)) - ++gRfuSlotStatusNI[r3]->sub.recv.failCounter; + ++gRfuSlotStatusNI[r3]->recv.failCounter; } gRfuStatic->recvRenewalFlag = 0; REG_IME = r12; @@ -2213,157 +2206,3 @@ void rfu_REQ_noise(void) STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_TestModeREQ(1, 0); } - -static s32 sub_81E349C(u8 r5) -{ - u16 r8; - vu16 *r4; - s32 r6; - - if (REG_IME == 0) - return -1; - r8 = REG_IE; - gRfuState->state = 10; - STWI_set_Callback_ID(sub_81E36B8); - sub_81E3550(); - r4 = ®_TMCNT_L(gRfuState->timerSelect); - r5 *= 8; - while (--r5 != 0xFF) - { - r6 = sub_81E35C4(); - if (r6 != 0) - break; - r4[1] = 0; - r4[0] = 0; - r4[1] = TIMER_1024CLK | TIMER_ENABLE; - while (r4[0] < 32) - ; - r4[1] = 0; - r4[0] = 0; - } - REG_IME = 0; - REG_IE = r8; - REG_IME = 1; - gRfuState->state = 0; - STWI_set_Callback_ID(NULL); - return r6; -} - -static void sub_81E3550(void) -{ - REG_IME = 0; - REG_IE &= ~((8 << gRfuState->timerSelect) | INTR_FLAG_SERIAL); - REG_IME = 1; - REG_RCNT = 0; - REG_SIOCNT = SIO_32BIT_MODE; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - CpuFill32(0, &gUnknown_3007470, sizeof(struct Unk_3007470)); - REG_IF = INTR_FLAG_SERIAL; -} - -static s32 sub_81E35C4(void) -{ - u8 r12; - - switch (r12 = gUnknown_3007470.unk1) - { - case 0: - gUnknown_3007470.unk0 = 1; - REG_SIOCNT |= SIO_38400_BPS; - REG_IME = r12; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = 1; - gUnknown_3007470.unk1 = 1; - *(vu8 *)®_SIOCNT |= SIO_ENABLE; - break; - case 1: - if (gUnknown_3007470.unkA == 0) - { - if (gUnknown_3007470.unk0 == 1) - { - if (gUnknown_3007470.unk2 == 0) - { - REG_IME = gUnknown_3007470.unk2; - REG_SIOCNT |= SIO_ENABLE; - REG_IME = r12; - } - } - else if (gUnknown_3007470.unk4 != 0x8001 && !gUnknown_3007470.unk2) - { - REG_IME = gUnknown_3007470.unk2; - REG_IE &= ~INTR_FLAG_SERIAL; - REG_IME = r12; - REG_SIOCNT = gUnknown_3007470.unk2; - REG_SIOCNT = SIO_32BIT_MODE; - REG_IF = INTR_FLAG_SERIAL; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - REG_IME = gUnknown_3007470.unk2; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = r12; - } - break; - } - else - { - gUnknown_3007470.unk1 = 2; - // fallthrough - } - default: - return gUnknown_3007470.unkA; - } - return 0; -} - -static void sub_81E36B8(void) -{ - u32 r5; - u16 r0; -#ifndef NONMATCHING - register u32 r1 asm("r1"); - register u16 r0_ asm("r0"); -#else - u32 r1; - u16 r0_; -#endif - - r5 = REG_SIODATA32; - if (gUnknown_3007470.unk0 != 1) - REG_SIOCNT |= SIO_ENABLE; - r1 = 16 * gUnknown_3007470.unk0; // to handle side effect of inline asm - r1 = (r5 << r1) >> 16; - r5 = (r5 << 16 * (1 - gUnknown_3007470.unk0)) >> 16; - if (gUnknown_3007470.unkA == 0) - { - if (r1 == gUnknown_3007470.unk6) - { - if (gUnknown_3007470.unk2 > 3) - { - gUnknown_3007470.unkA = r5; - } - else if (r1 == (u16)~gUnknown_3007470.unk4) - { - r0_ = ~gUnknown_3007470.unk6; - if (r5 == r0_) - ++gUnknown_3007470.unk2; - } - } - else - { - gUnknown_3007470.unk2 = gUnknown_3007470.unkA; - } - } - if (gUnknown_3007470.unk2 < 4) - gUnknown_3007470.unk4 = *(gUnknown_3007470.unk2 + _Str_Sio32ID); - else - gUnknown_3007470.unk4 = 0x8001; - gUnknown_3007470.unk6 = ~r5; - REG_SIODATA32 = (gUnknown_3007470.unk4 << 16 * (1 - gUnknown_3007470.unk0)) - + (gUnknown_3007470.unk6 << 16 * gUnknown_3007470.unk0); - if (gUnknown_3007470.unk0 == 1 && (gUnknown_3007470.unk2 || r5 == 0x494E)) - { - for (r0 = 0; r0 < 600; ++r0) - ; - if (gUnknown_3007470.unkA == 0) - REG_SIOCNT |= SIO_ENABLE; - } -} diff --git a/src/librfu_s32id.c b/src/librfu_s32id.c new file mode 100644 index 000000000..c3bb922e2 --- /dev/null +++ b/src/librfu_s32id.c @@ -0,0 +1,163 @@ +#include "librfu.h" + +extern const u16 _Str_Sio32ID[]; + +static void Sio32IDIntr(void); +static void Sio32IDInit(void); +static s32 Sio32IDMain(void); + +struct RfuS32Id gRfuS32Id; + +s32 AgbRFU_checkID(u8 r5) +{ + u16 r8; + vu16 *r4; + s32 r6; + + if (REG_IME == 0) + return -1; + r8 = REG_IE; + gRfuState->state = 10; + STWI_set_Callback_ID(Sio32IDIntr); + Sio32IDInit(); + r4 = ®_TMCNT_L(gRfuState->timerSelect); + r5 *= 8; + while (--r5 != 0xFF) + { + r6 = Sio32IDMain(); + if (r6 != 0) + break; + r4[1] = 0; + r4[0] = 0; + r4[1] = TIMER_1024CLK | TIMER_ENABLE; + while (r4[0] < 32) + ; + r4[1] = 0; + r4[0] = 0; + } + REG_IME = 0; + REG_IE = r8; + REG_IME = 1; + gRfuState->state = 0; + STWI_set_Callback_ID(NULL); + return r6; +} + +static void Sio32IDInit(void) +{ + REG_IME = 0; + REG_IE &= ~((8 << gRfuState->timerSelect) | INTR_FLAG_SERIAL); + REG_IME = 1; + REG_RCNT = 0; + REG_SIOCNT = SIO_32BIT_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + CpuFill32(0, &gRfuS32Id, sizeof(struct RfuS32Id)); + REG_IF = INTR_FLAG_SERIAL; +} + +static s32 Sio32IDMain(void) +{ + u8 r12; + + switch (r12 = gRfuS32Id.unk1) + { + case 0: + gRfuS32Id.unk0 = 1; + REG_SIOCNT |= SIO_38400_BPS; + REG_IME = r12; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = 1; + gRfuS32Id.unk1 = 1; + *(vu8 *)®_SIOCNT |= SIO_ENABLE; + break; + case 1: + if (gRfuS32Id.unkA == 0) + { + if (gRfuS32Id.unk0 == 1) + { + if (gRfuS32Id.unk2 == 0) + { + REG_IME = gRfuS32Id.unk2; + REG_SIOCNT |= SIO_ENABLE; + REG_IME = r12; + } + } + else if (gRfuS32Id.unk4 != 0x8001 && !gRfuS32Id.unk2) + { + REG_IME = gRfuS32Id.unk2; + REG_IE &= ~INTR_FLAG_SERIAL; + REG_IME = r12; + REG_SIOCNT = gRfuS32Id.unk2; + REG_SIOCNT = SIO_32BIT_MODE; + REG_IF = INTR_FLAG_SERIAL; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + REG_IME = gRfuS32Id.unk2; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = r12; + } + break; + } + else + { + gRfuS32Id.unk1 = 2; + // fallthrough + } + default: + return gRfuS32Id.unkA; + } + return 0; +} + +static void Sio32IDIntr(void) +{ + u32 r5; + u16 r0; +#ifndef NONMATCHING + register u32 r1 asm("r1"); + register u16 r0_ asm("r0"); +#else + u32 r1; + u16 r0_; +#endif + + r5 = REG_SIODATA32; + if (gRfuS32Id.unk0 != 1) + REG_SIOCNT |= SIO_ENABLE; + r1 = 16 * gRfuS32Id.unk0; // to handle side effect of inline asm + r1 = (r5 << r1) >> 16; + r5 = (r5 << 16 * (1 - gRfuS32Id.unk0)) >> 16; + if (gRfuS32Id.unkA == 0) + { + if (r1 == gRfuS32Id.unk6) + { + if (gRfuS32Id.unk2 > 3) + { + gRfuS32Id.unkA = r5; + } + else if (r1 == (u16)~gRfuS32Id.unk4) + { + r0_ = ~gRfuS32Id.unk6; + if (r5 == r0_) + ++gRfuS32Id.unk2; + } + } + else + { + gRfuS32Id.unk2 = gRfuS32Id.unkA; + } + } + if (gRfuS32Id.unk2 < 4) + gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + _Str_Sio32ID); + else + gRfuS32Id.unk4 = 0x8001; + gRfuS32Id.unk6 = ~r5; + REG_SIODATA32 = (gRfuS32Id.unk4 << 16 * (1 - gRfuS32Id.unk0)) + + (gRfuS32Id.unk6 << 16 * gRfuS32Id.unk0); + if (gRfuS32Id.unk0 == 1 && (gRfuS32Id.unk2 || r5 == 0x494E)) + { + for (r0 = 0; r0 < 600; ++r0) + ; + if (gRfuS32Id.unkA == 0) + REG_SIOCNT |= SIO_ENABLE; + } +} diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index 8e27c04d8..50e102f19 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -1,4 +1,3 @@ -#include "global.h" #include "librfu.h" static void STWI_intr_timer(void); @@ -12,7 +11,7 @@ static s32 STWI_reset_ClockCounter(void); void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { // If we're copying our interrupt into RAM, DMA it to block1 and use - // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // block2 for our STWIStatus, otherwise block1 holds the STWIStatus. // interrupt usually is a pointer to gIntrTable[1] if (copyInterruptToRam == TRUE) { @@ -23,7 +22,7 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b else { *interrupt = IntrSIO32; - gRfuState = (struct RfuStruct *)interruptStruct->block1; + gRfuState = (struct STWIStatus *)interruptStruct->block1; } gRfuState->rxPacket = &interruptStruct->rxPacketAlloc; gRfuState->txPacket = &interruptStruct->txPacketAlloc; @@ -142,7 +141,7 @@ u16 STWI_poll_CommandEnd(void) void STWI_send_ResetREQ(void) { - if (!STWI_init(RFU_RESET)) + if (!STWI_init(ID_RESET_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -151,7 +150,7 @@ void STWI_send_ResetREQ(void) void STWI_send_LinkStatusREQ(void) { - if (!STWI_init(RFU_LINK_STATUS)) + if (!STWI_init(ID_LINK_STATUS_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -160,7 +159,7 @@ void STWI_send_LinkStatusREQ(void) void STWI_send_VersionStatusREQ(void) { - if (!STWI_init(RFU_VERSION_STATUS)) + if (!STWI_init(ID_VERSION_STATUS_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -169,7 +168,7 @@ void STWI_send_VersionStatusREQ(void) void STWI_send_SystemStatusREQ(void) { - if (!STWI_init(RFU_SYSTEM_STATUS)) + if (!STWI_init(ID_SYSTEM_STATUS_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -178,7 +177,7 @@ void STWI_send_SystemStatusREQ(void) void STWI_send_SlotStatusREQ(void) { - if (!STWI_init(RFU_SLOT_STATUS)) + if (!STWI_init(ID_SLOT_STATUS_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -187,7 +186,7 @@ void STWI_send_SlotStatusREQ(void) void STWI_send_ConfigStatusREQ(void) { - if (!STWI_init(RFU_CONFIG_STATUS)) + if (!STWI_init(ID_CONFIG_STATUS_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -199,7 +198,7 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) u8 *packetBytes; s32 i; - if (!STWI_init(RFU_GAME_CONFIG)) + if (!STWI_init(ID_GAME_CONFIG_REQ)) { gRfuState->reqLength = 6; // TODO: what is unk1 @@ -226,7 +225,7 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) { - if (!STWI_init(RFU_SYSTEM_CONFIG)) + if (!STWI_init(ID_SYSTEM_CONFIG_REQ)) { u8 *packetBytes; @@ -242,7 +241,7 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) void STWI_send_SC_StartREQ(void) { - if (!STWI_init(RFU_SC_START)) + if (!STWI_init(ID_SC_START_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -251,7 +250,7 @@ void STWI_send_SC_StartREQ(void) void STWI_send_SC_PollingREQ(void) { - if (!STWI_init(RFU_SC_POLLING)) + if (!STWI_init(ID_SC_POLL_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -260,7 +259,7 @@ void STWI_send_SC_PollingREQ(void) void STWI_send_SC_EndREQ(void) { - if (!STWI_init(RFU_SC_END)) + if (!STWI_init(ID_SC_END_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -269,7 +268,7 @@ void STWI_send_SC_EndREQ(void) void STWI_send_SP_StartREQ(void) { - if (!STWI_init(RFU_SP_START)) + if (!STWI_init(ID_SP_START_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -278,7 +277,7 @@ void STWI_send_SP_StartREQ(void) void STWI_send_SP_PollingREQ(void) { - if (!STWI_init(RFU_SP_POLLING)) + if (!STWI_init(ID_SP_POLL_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -287,7 +286,7 @@ void STWI_send_SP_PollingREQ(void) void STWI_send_SP_EndREQ(void) { - if (!STWI_init(RFU_SP_END)) + if (!STWI_init(ID_SP_END_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -296,7 +295,7 @@ void STWI_send_SP_EndREQ(void) void STWI_send_CP_StartREQ(u16 unk1) { - if (!STWI_init(RFU_CP_START)) + if (!STWI_init(ID_CP_START_REQ)) { gRfuState->reqLength = 1; gRfuState->txPacket->rfuPacket32.data[0] = unk1; @@ -306,7 +305,7 @@ void STWI_send_CP_StartREQ(u16 unk1) void STWI_send_CP_PollingREQ(void) { - if (!STWI_init(RFU_CP_POLLING)) + if (!STWI_init(ID_CP_POLL_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -315,7 +314,7 @@ void STWI_send_CP_PollingREQ(void) void STWI_send_CP_EndREQ(void) { - if (!STWI_init(RFU_CP_END)) + if (!STWI_init(ID_CP_END_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -324,7 +323,7 @@ void STWI_send_CP_EndREQ(void) void STWI_send_DataTxREQ(const void *in, u8 size) { - if (!STWI_init(RFU_DATA_TX)) + if (!STWI_init(ID_DATA_TX_REQ)) { u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) @@ -337,7 +336,7 @@ void STWI_send_DataTxREQ(const void *in, u8 size) void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) { - if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) + if (!STWI_init(ID_DATA_TX_AND_CHANGE_REQ)) { u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) @@ -350,7 +349,7 @@ void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) void STWI_send_DataRxREQ(void) { - if (!STWI_init(RFU_DATA_RX)) + if (!STWI_init(ID_DATA_RX_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -359,7 +358,7 @@ void STWI_send_DataRxREQ(void) void STWI_send_MS_ChangeREQ(void) { - if (!STWI_init(RFU_MS_CHANGE)) + if (!STWI_init(ID_MS_CHANGE_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -368,7 +367,7 @@ void STWI_send_MS_ChangeREQ(void) void STWI_send_DataReadyAndChangeREQ(u8 unk) { - if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) + if (!STWI_init(ID_DATA_READY_AND_CHANGE_REQ)) { if (!unk) { @@ -392,7 +391,7 @@ void STWI_send_DataReadyAndChangeREQ(u8 unk) void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) { - if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) + if (!STWI_init(ID_DISCONNECTED_AND_CHANGE_REQ)) { u8 *packetBytes; @@ -409,7 +408,7 @@ void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) void STWI_send_ResumeRetransmitAndChangeREQ(void) { - if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) + if (!STWI_init(ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -418,7 +417,7 @@ void STWI_send_ResumeRetransmitAndChangeREQ(void) void STWI_send_DisconnectREQ(u8 unk) { - if (!STWI_init(RFU_DISCONNECT)) + if (!STWI_init(ID_DISCONNECT_REQ)) { gRfuState->reqLength = 1; gRfuState->txPacket->rfuPacket32.data[0] = unk; @@ -428,7 +427,7 @@ void STWI_send_DisconnectREQ(u8 unk) void STWI_send_TestModeREQ(u8 unk0, u8 unk1) { - if (!STWI_init(RFU_TEST_MODE)) + if (!STWI_init(ID_TEST_MODE_REQ)) { gRfuState->reqLength = 1; gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); @@ -441,7 +440,7 @@ void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) u32 *packetData; u32 arg1; - if (!STWI_init(RFU_CPR_START)) + if (!STWI_init(ID_CPR_START_REQ)) { gRfuState->reqLength = 2; arg1 = unk1 | (unk0 << 16); @@ -454,7 +453,7 @@ void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) void STWI_send_CPR_PollingREQ(void) { - if (!STWI_init(RFU_CPR_POLLING)) + if (!STWI_init(ID_CPR_POLL_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -463,7 +462,7 @@ void STWI_send_CPR_PollingREQ(void) void STWI_send_CPR_EndREQ(void) { - if (!STWI_init(RFU_CPR_END)) + if (!STWI_init(ID_CPR_END_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -472,7 +471,7 @@ void STWI_send_CPR_EndREQ(void) void STWI_send_StopModeREQ(void) { - if (!STWI_init(RFU_STOP_MODE)) + if (!STWI_init(ID_STOP_MODE_REQ)) { gRfuState->reqLength = 0; STWI_start_Command(); @@ -614,7 +613,7 @@ static s32 STWI_restart_Command(void) } else { - if (gRfuState->reqActiveCommand == RFU_MS_CHANGE || gRfuState->reqActiveCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->reqActiveCommand == RFU_UNK35 || gRfuState->reqActiveCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) + if (gRfuState->reqActiveCommand == ID_MS_CHANGE_REQ || gRfuState->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gRfuState->reqActiveCommand == ID_UNK35_REQ || gRfuState->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) { gRfuState->error = 1; gRfuState->unk_2c = 0; diff --git a/sym_common.txt b/sym_common.txt index 444c2a7af..188981dbe 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -161,3 +161,5 @@ gUnknown_3005E94: @ 3005E94 .include "agb_flash.o" .align 2 .include "librfu_rfu.o" + .align 4 + .include "librfu_s32id.o" -- cgit v1.2.3 From 0ce29c0ee9e7a37089e9bea8111ef40e16d6a63e Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 03:17:00 +0800 Subject: use constants --- asm/crt0.s | 2 +- asm/librfu_intr.s | 28 ++-- asm/link_rfu_2.s | 4 +- common_syms/librfu_rfu.txt | 1 - common_syms/librfu_stwi.txt | 1 + include/librfu.h | 29 ++-- src/librfu_rfu.c | 333 ++++++++++++++++++++++---------------------- src/librfu_s32id.c | 8 +- src/librfu_stwi.c | 292 +++++++++++++++++++------------------- sym_bss.txt | 2 +- sym_common.txt | 2 + 11 files changed, 355 insertions(+), 347 deletions(-) create mode 100644 common_syms/librfu_stwi.txt diff --git a/asm/crt0.s b/asm/crt0.s index 28855d504..7f9626251 100644 --- a/asm/crt0.s +++ b/asm/crt0.s @@ -204,7 +204,7 @@ loop: jump_intr: strh r0, [r3, OFFSET_REG_IF - 0x200] bic r2, r2, r0 - ldr r0, =gRfuState + ldr r0, =gSTWIStatus ldr r0, [r0] ldrb r0, [r0, 0xA] mov r1, 0x8 diff --git a/asm/librfu_intr.s b/asm/librfu_intr.s index 63aa88f3e..10ee02e7b 100644 --- a/asm/librfu_intr.s +++ b/asm/librfu_intr.s @@ -9,7 +9,7 @@ IntrSIO32: @ 81DFC50 mov r12, sp stmdb sp!, {r11,r12,lr,pc} - ldr r3, _081DFCB0 @ =gRfuState + ldr r3, _081DFCB0 @ =gSTWIStatus ldr r0, [r3] ldr r2, [r0] sub r11, r12, 0x4 @@ -34,7 +34,7 @@ _081DFCA4: ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_081DFCB0: .4byte gRfuState +_081DFCB0: .4byte gSTWIStatus arm_func_end IntrSIO32 arm_func_start sio32intr_clock_master @@ -45,7 +45,7 @@ sio32intr_clock_master: @ 81DFCB4 sub r11, r12, 0x4 bl STWI_set_timer_in_RAM mov r4, 0x120 - ldr r2, _081DFF28 @ =gRfuState + ldr r2, _081DFF28 @ =gSTWIStatus add r4, r4, 0x4000000 ldr lr, [r4] ldr r12, [r2] @@ -208,7 +208,7 @@ _081DFEFC: bl sub_81E05A4 b _081DFF3C .align 2, 0 -_081DFF28: .4byte gRfuState +_081DFF28: .4byte gSTWIStatus _081DFF2C: add r3, r5, 0x3 strh r3, [r4] @@ -223,7 +223,7 @@ _081DFF3C: sio32intr_clock_slave: @ 81DFF44 mov r12, sp stmdb sp!, {r4-r6,r11,r12,lr,pc} - ldr r4, _081E02F0 @ =gRfuState + ldr r4, _081E02F0 @ =gSTWIStatus mov r0, 0x64 ldr r3, [r4] mov r6, 0 @@ -473,7 +473,7 @@ _081E02E0: bhi _081E02E0 b _081E031C .align 2, 0 -_081E02F0: .4byte gRfuState +_081E02F0: .4byte gSTWIStatus _081E02F4: .4byte 0x996601ee _081E02F8: mov r2, 0xFF00 @@ -510,7 +510,7 @@ handshake_wait: @ 81E0350 mov r1, 0x128 add r1, r1, 0x4000000 mov r0, r0, lsl 16 - ldr r2, _081E03B4 @ =gRfuState + ldr r2, _081E03B4 @ =gSTWIStatus sub r11, r12, 0x4 mov lr, r0, lsr 14 ldr r12, [r2] @@ -533,7 +533,7 @@ _081E03A0: ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_081E03B4: .4byte gRfuState +_081E03B4: .4byte gSTWIStatus arm_func_end handshake_wait arm_func_start STWI_set_timer_in_RAM @@ -544,7 +544,7 @@ STWI_set_timer_in_RAM: @ 81E03B8 add r1, r1, 0x4000000 mov r3, 0 sub r11, r12, 0x4 - ldr r12, _081E0470 @ =gRfuState + ldr r12, _081E0470 @ =gSTWIStatus and lr, r0, 0xFF ldr r2, [r12] cmp lr, 0x50 @@ -589,7 +589,7 @@ _081E0458: mov r3, 0x3 b _081E0488 .align 2, 0 -_081E0470: .4byte gRfuState +_081E0470: .4byte gSTWIStatus _081E0474: mvn r3, 0x850 sub r3, r3, 0x2 @@ -621,7 +621,7 @@ STWI_stop_timer_in_RAM: @ 81E04C8 mov r12, sp stmdb sp!, {r11,r12,lr,pc} mov r1, 0x100 - ldr lr, _081E0514 @ =gRfuState + ldr lr, _081E0514 @ =gSTWIStatus add r0, r1, 0x4000000 ldr r2, [lr] sub r11, r12, 0x4 @@ -638,14 +638,14 @@ STWI_stop_timer_in_RAM: @ 81E04C8 ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_081E0514: .4byte gRfuState +_081E0514: .4byte gSTWIStatus arm_func_end STWI_stop_timer_in_RAM arm_func_start STWI_init_slave STWI_init_slave: @ 81E0518 mov r12, sp stmdb sp!, {r11,r12,lr,pc} - ldr r0, _081E05A0 @ =gRfuState + ldr r0, _081E05A0 @ =gSTWIStatus ldr r2, [r0] mov r3, 0x5 str r3, [r2] @@ -678,7 +678,7 @@ STWI_init_slave: @ 81E0518 ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_081E05A0: .4byte gRfuState +_081E05A0: .4byte gSTWIStatus arm_func_end STWI_init_slave arm_func_start sub_81E05A4 diff --git a/asm/link_rfu_2.s b/asm/link_rfu_2.s index 2e3f89291..10d4fd03d 100644 --- a/asm/link_rfu_2.s +++ b/asm/link_rfu_2.s @@ -132,7 +132,7 @@ _080F86F0: .4byte 0x04000208 thumb_func_start sub_80F86F4 sub_80F86F4: @ 80F86F4 push {r4,lr} - ldr r0, _080F8728 @ =gUnknown_3001190 + ldr r0, _080F8728 @ =gRfuAPIBuffer ldr r1, _080F872C @ =0x00000e64 ldr r4, _080F8730 @ =gIntrTable + 0x4 adds r2, r4, 0 @@ -155,7 +155,7 @@ _080F8722: pop {r0} bx r0 .align 2, 0 -_080F8728: .4byte gUnknown_3001190 +_080F8728: .4byte gRfuAPIBuffer _080F872C: .4byte 0x00000e64 _080F8730: .4byte gIntrTable + 0x4 _080F8734: .4byte gLinkType diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt index 94600cdf8..4b742dcd2 100644 --- a/common_syms/librfu_rfu.txt +++ b/common_syms/librfu_rfu.txt @@ -1,4 +1,3 @@ -gRfuState gRfuSlotStatusUNI gRfuSlotStatusNI gRfuLinkStatus diff --git a/common_syms/librfu_stwi.txt b/common_syms/librfu_stwi.txt new file mode 100644 index 000000000..a1f773553 --- /dev/null +++ b/common_syms/librfu_stwi.txt @@ -0,0 +1 @@ +gSTWIStatus diff --git a/include/librfu.h b/include/librfu.h index 1e128d209..f5a7b4d96 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -137,18 +137,20 @@ // Definition Data Returned by Return Values for Library Functions // ******************************************************* +// The function doesn't have return value. // Value of u8 *status for rfu_REQ_pollConnectParent (Connection Trial Status) -#define CP_STATUS_DONE 0x00 // Connection successful -#define CP_STATUS_IN_PROCESS 0x01 // Connecting -#define CP_STATUS_SLOT_CLOSED 0x02 // Parent device is not in connection mode with child device -#define CP_STATUS_DISCONNECTED 0x03 // Disconnected by parent device while connecting -#define CP_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error +// #define CP_STATUS_DONE 0x00 // Connection successful +// #define CP_STATUS_IN_PROCESS 0x01 // Connecting +// #define CP_STATUS_SLOT_CLOSED 0x02 // Parent device is not in connection mode with child device +// #define CP_STATUS_DISCONNECTED 0x03 // Disconnected by parent device while connecting +// #define CP_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error +// The function doesn't exist. // Value of u8 *status argument for rfu_REQ_pollRecoveryConnect (Link Restore Status) -#define RC_STATUS_DONE 0x00 // Connection restore successful -#define RC_STATUS_FAILED 0x01 // Connection restore failure (meaningless to try anymore) -#define RC_STATUS_SEARCHING_PARENT 0x02 // Searching for parent device -#define RC_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error +// #define RC_STATUS_DONE 0x00 // Connection restore successful +// #define RC_STATUS_FAILED 0x01 // Connection restore failure (meaningless to try anymore) +// #define RC_STATUS_SEARCHING_PARENT 0x02 // Searching for parent device +// #define RC_STATUS_UNKNOWN 0xff // Cannot read status due to REQ-API execution error // Value of u8 *linkLossReason argument for rfu_REQBN_watchLink (Reason for Link Loss) #define REASON_DISCONNECTED 0x00 // State of complete disconnection with rfuLL_disconnect and no possibility of restoring the link (can detect only child device) @@ -189,6 +191,7 @@ // Error codes returned by rfu_NI_setSendData, rfu_UNI_setSendData, and rfu_NI_CHILD_setSendGameName #define ERR_MODE 0x0300 +#define ERR_MODE_NOT_PARENT (ERR_MODE | 0x0000) // not in SDK #define ERR_MODE_NOT_CONNECTED (ERR_MODE | 0x0001) // RFU is not in connection mode (parent or child) #define ERR_SLOT 0x0400 @@ -215,6 +218,8 @@ // Error code during UNI-type communication (code entered into gRfuSlotStatusUNI[x]->recv.errorCode) #define ERR_RECV_DATA_OVERWRITED (ERR_DATA_RECV | 0x0008) // Received new data when gRfuSlotStatusUNI[x]->recv.newDataFlag=1 +// not in SDK header +#define ERR_RECV_UNK (ERR_DATA_RECV | 0x0001 | 0x0008) // ******************************************************* // Definition Data Used by Global Variables in the Library @@ -496,7 +501,7 @@ struct RfuS32Id u16 unkA; }; -struct RfuStructsBuffer +struct RfuAPIBuffer { struct RfuLinkStatus linkStatus; struct RfuStatic static_; @@ -506,7 +511,7 @@ struct RfuStructsBuffer struct RfuIntrStruct intr; }; -extern struct STWIStatus *gRfuState; +extern struct STWIStatus *gSTWIStatus; extern struct RfuLinkStatus *gRfuLinkStatus; extern struct RfuStatic *gRfuStatic; extern struct RfuFixed *gRfuFixed; @@ -522,7 +527,7 @@ s32 AgbRFU_checkID(u8); // librfu_rfu // API Initialization and Initial Settings // API Initialization -u16 rfu_initializeAPI(struct RfuStructsBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam); +u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam); // Set Timer Interrupt void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p); // Resident Function called from within a V-Blank Interrupt diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 7e4e26fad..70d5b4990 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -70,14 +70,13 @@ static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *); extern const char _Str_RFU_MBOOT[]; extern const struct RfuHeader _Str_RfuHeader[2]; -struct STWIStatus *gRfuState; -ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; +struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX]; struct RfuLinkStatus *gRfuLinkStatus; struct RfuStatic *gRfuStatic; struct RfuFixed *gRfuFixed; -u16 rfu_initializeAPI(struct RfuStructsBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) +u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) { u16 i; u16 *dst; @@ -86,24 +85,24 @@ u16 rfu_initializeAPI(struct RfuStructsBuffer *APIBuffer, u16 buffByteSize, Intr // is in EWRAM? if (((u32)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam) - return 2; + return ERR_RFU_API_BUFF_ADR; // is not 4-byte aligned? if ((u32)APIBuffer & 3) - return 2; + return ERR_RFU_API_BUFF_ADR; if (copyInterruptToRam) { // An assert/debug print may have existed before, ie // printf("%s %u < %u", "somefile.c:12345", buffByteSize, num) // to push this into r3? - r3 = 0xe64; + r3 = sizeof(struct RfuAPIBuffer); if (buffByteSize < r3) - return 1; + return ERR_RFU_API_BUFF_SIZE; } if (!copyInterruptToRam) { - r3 = 0x504; // same as above, this should be r3 not r0 + r3 = 0x504; // same issue as above if (buffByteSize < r3) - return 1; + return ERR_RFU_API_BUFF_SIZE; } gRfuLinkStatus = &APIBuffer->linkStatus; gRfuStatic = &APIBuffer->static_; @@ -124,9 +123,9 @@ u16 rfu_initializeAPI(struct RfuStructsBuffer *APIBuffer, u16 buffByteSize, Intr rfu_STC_clearAPIVariables(); for (i = 0; i < RFU_CHILD_MAX; ++i) { - gRfuSlotStatusNI[i]->recvBuffer = 0; + gRfuSlotStatusNI[i]->recvBuffer = NULL; gRfuSlotStatusNI[i]->recvBufferSize = 0; - gRfuSlotStatusUNI[i]->recvBuffer = 0; + gRfuSlotStatusUNI[i]->recvBuffer = NULL; gRfuSlotStatusUNI[i]->recvBufferSize = 0; } src = (const u16 *)((u32)&rfu_STC_fastCopy & ~1); @@ -150,7 +149,7 @@ static void rfu_STC_clearAPIVariables(void) CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); gRfuLinkStatus->watchInterval = 4; gRfuStatic->nowWatchInterval = 0; - gRfuLinkStatus->parentChild = 0xFF; + gRfuLinkStatus->parentChild = MODE_NEUTRAL; rfu_clearAllSlot(); gRfuStatic->SCStartFlag = 0; for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i) @@ -169,8 +168,8 @@ u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) struct RfuIntrStruct *buf; *ackFlag = 0; - if (gRfuLinkStatus->parentChild != 1) - return 0x300; + if (gRfuLinkStatus->parentChild != MODE_PARENT) + return ERR_MODE_NOT_PARENT; buf = rfu_getSTWIRecvBuffer(); switch (buf->rxPacketAlloc.rfuPacket8.data[0]) { @@ -182,7 +181,7 @@ u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4]; return 0; default: - return 0x10; + return ERR_REQ_CMD_ID; } } @@ -233,10 +232,10 @@ static void rfu_CB_defaultCallback(u8 r0, u16 reqResult) if (gRfuStatic->flags & 8) gRfuFixed->reqCallback(r0, reqResult); r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; - for (i = 0; i < 4; ++i) + for (i = 0; i < RFU_CHILD_MAX; ++i) if ((r5 >> i) & 1) rfu_STC_removeLinkData(i, 1); - gRfuLinkStatus->parentChild = 0xFF; + gRfuLinkStatus->parentChild = MODE_NEUTRAL; } } @@ -255,7 +254,7 @@ void rfu_REQ_RFUStatus(void) u16 rfu_getRFUStatus(u8 *rfuState) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93) - return 0x10; + return ERR_REQ_CMD_ID; if (STWI_poll_CommandEnd() == 0) *rfuState = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; else @@ -292,7 +291,7 @@ void rfu_REQ_stopMode(void) if (REG_IME == 0) { rfu_STC_REQ_callback(61, 6); - gRfuState->error = 6; + gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; } else { @@ -300,7 +299,7 @@ void rfu_REQ_stopMode(void) rfu_STC_clearAPIVariables(); if (AgbRFU_checkID(8) == 0x8001) { - timerReg = ®_TMCNT(gRfuState->timerSelect); + timerReg = ®_TMCNT(gSTWIStatus->timerSelect); *timerReg = 0; *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16; while (*timerReg << 16 < 262 << 16) @@ -326,10 +325,10 @@ static void rfu_CB_stopMode(u8 a1, u16 reqResult) u32 rfu_REQBN_softReset_and_checkID(void) { - s32 r2; + u32 r2; if (REG_IME == 0) - return -1; + return ERR_ID_CHECK_IME_DISABLE; AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); if ((r2 = AgbRFU_checkID(30)) == 0) @@ -353,7 +352,7 @@ static void rfu_CB_reset(u8 a1, u16 reqResult) void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) { STWI_set_Callback_M(rfu_STC_REQ_callback); - STWI_send_SystemConfigREQ((availSlotFlag & 3) | 0x3C, maxMFrame, mcTimer); + STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer); if (mcTimer == 0) { gRfuStatic->unk_1a = 1; @@ -405,7 +404,7 @@ static void rfu_CB_configGameData(u8 ip, u16 r7) if (r7 == 0) { - r1 = gRfuState->txPacket->rfuPacket8.data; + r1 = gSTWIStatus->txPacket->rfuPacket8.data; r2 = gRfuLinkStatus->my.serialNo = r1[4]; gRfuLinkStatus->my.serialNo = (r1[5] << 8) | r2; r4 = &r1[6]; @@ -500,7 +499,7 @@ static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) } else if (r4 == 27) { - if (gRfuLinkStatus->parentChild == 255) + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) gRfuLinkStatus->my.id = 0; gRfuStatic->SCStartFlag = 0; } @@ -534,7 +533,7 @@ static void rfu_STC_readChildList(void) r4 += 4) { r2 = r4[2]; - if (r2 < 4 && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1)) + if (r2 < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1)) { if (sp[r2] != 0) ++gRfuStatic->lsFixedCount[r2]; @@ -546,7 +545,7 @@ static void rfu_STC_readChildList(void) ++gRfuLinkStatus->connCount; gRfuLinkStatus->partner[r2].id = *(u16 *)r4; gRfuLinkStatus->partner[r2].slot = r2; - gRfuLinkStatus->parentChild = 1; + gRfuLinkStatus->parentChild = MODE_PARENT; gRfuStatic->flags &= 0x7F; gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id; } @@ -682,7 +681,7 @@ static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) gRfuLinkStatus->linkLossSlotFlag &= ~r2; gRfuLinkStatus->my.id = id; ++gRfuLinkStatus->connCount; - gRfuLinkStatus->parentChild = 0; + gRfuLinkStatus->parentChild = MODE_CHILD; gRfuStatic->flags |= 0x80; for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5) { @@ -702,7 +701,7 @@ static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) break; } } - if (r5 < 4) + if (r5 < RFU_CHILD_MAX) { CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); gRfuLinkStatus->partner[slot].slot = slot; @@ -727,7 +726,7 @@ u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo) *status = r2[1]; return 0; } - return 0x10; + return ERR_REQ_CMD_ID; } void rfu_REQ_endConnectParent(void) @@ -744,7 +743,7 @@ u16 rfu_syncVBlank(void) s32 r5; rfu_NI_checkCommFailCounter(); - if (gRfuLinkStatus->parentChild == 0xFF) + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) return 0; if (gRfuStatic->nowWatchInterval != 0) --gRfuStatic->nowWatchInterval; @@ -771,10 +770,10 @@ u16 rfu_syncVBlank(void) { gRfuStatic->flags &= 0xFB; r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; - for (r4 = 0; r4 < 4; ++r4) + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) if ((r5 >> r4) & 1) rfu_STC_removeLinkData(r4, 1); - gRfuLinkStatus->parentChild = 0xFF; + gRfuLinkStatus->parentChild = MODE_NEUTRAL; return 1; } --gRfuStatic->watchdogTimer; @@ -791,9 +790,9 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason u8 r9, r6, r3, connSlotFlag, r0; *bmLinkLossSlot = 0; - *linkLossReason = 0; + *linkLossReason = REASON_DISCONNECTED; *parentBmLinkRecoverySlot = 0; - if (gRfuLinkStatus->parentChild == 0xFF || gRfuState->msMode == 0) + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL || gSTWIStatus->msMode == 0) return 0; if (gRfuStatic->flags & 4) gRfuStatic->watchdogTimer = 360; @@ -808,7 +807,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason *bmLinkLossSlot = r1[4]; *linkLossReason = r1[5]; - if (*linkLossReason == 1) + if (*linkLossReason == REASON_LINK_LOSS) *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag; sp08 = 2; } @@ -819,7 +818,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; r6 ^= gRfuLinkStatus->connSlotFlag; *bmLinkLossSlot = r6 & gRfuLinkStatus->connSlotFlag; - *linkLossReason = 1; + *linkLossReason = REASON_LINK_LOSS; for (i = 0; i < RFU_CHILD_MAX; ++i) { if ((*bmLinkLossSlot >> i) & 1) @@ -850,7 +849,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason rfu_STC_REQ_callback(17, sp0C); return sp0C; } - for (; i < 4; ++i) + for (; i < RFU_CHILD_MAX; ++i) { r6 = 1 << i; if (sp0C == 0) @@ -859,13 +858,13 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason { if (gRfuLinkStatus->strength[i] == 0) { - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) { ++gRfuStatic->linkEmergencyFlag[i]; if (gRfuStatic->linkEmergencyFlag[i] > 3) { *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use 1? + *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? } } else @@ -876,7 +875,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { *bmLinkLossSlot |= r6; - *linkLossReason = sp08; + *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? } else { @@ -886,7 +885,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); STWI_poll_CommandEnd(); *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use 1? + *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? } } } @@ -897,7 +896,7 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? } } - if (gRfuLinkStatus->parentChild == 1 && gRfuLinkStatus->strength[i] != 0) + if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0) { if (r6 & gRfuLinkStatus->linkLossSlotFlag) { @@ -964,7 +963,7 @@ static void rfu_STC_removeLinkData(u8 r7, u8 r12) gRfuLinkStatus->connSlotFlag &= r6 = ~r5; gRfuLinkStatus->linkLossSlotFlag |= r5; if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) - gRfuLinkStatus->parentChild = 0xFF; + gRfuLinkStatus->parentChild = MODE_NEUTRAL; if (r12 != 0) { CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); @@ -981,7 +980,7 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot) if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot) { gRfuStatic->recoveryBmSlot = bmDisconnectSlot; - if (gRfuLinkStatus->parentChild == 0xFF && gRfuStatic->flags & 0x80) + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gRfuStatic->flags & 0x80) { if (gRfuLinkStatus->linkLossSlotFlag & bmDisconnectSlot) rfu_CB_disconnect(48, 0); @@ -1005,7 +1004,7 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) { u8 r4, r0; - if (r5 == 3 && gRfuLinkStatus->parentChild == 0) + if (r5 == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); @@ -1016,7 +1015,7 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; if (r5 == 0) { - for (r4 = 0; r4 < 4; ++r4) + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) { r0 = 1 << r4; if (r0 & gRfuStatic->recoveryBmSlot) @@ -1024,7 +1023,7 @@ static void rfu_CB_disconnect(u8 r6, u16 r5) } } if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) - gRfuLinkStatus->parentChild = 0xFF; + gRfuLinkStatus->parentChild = MODE_NEUTRAL; rfu_STC_REQ_callback(r6, r5); if (gRfuStatic->SCStartFlag) { @@ -1041,7 +1040,7 @@ void rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot) u8 i; gRfuStatic->recoveryBmSlot = bmRecoverySlot; - for (i = 0; i < 4 && !((bmRecoverySlot >> i) & 1); ++i) + for (i = 0; i < RFU_CHILD_MAX && !((bmRecoverySlot >> i) & 1); ++i) ; STWI_set_Callback_M(rfu_STC_REQ_callback); // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id @@ -1061,7 +1060,7 @@ static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) { - gRfuLinkStatus->parentChild = 0; + gRfuLinkStatus->parentChild = MODE_CHILD; for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) { r3 = 1 << r4; @@ -1090,7 +1089,7 @@ u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; return 0; } - return 0x10; + return ERR_REQ_CMD_ID; } void rfu_REQ_CHILD_endConnectRecovery(void) @@ -1126,19 +1125,19 @@ void rfu_REQ_changeMasterSlave(void) bool8 rfu_getMasterSlave(void) { - bool8 r2 = STWI_read_status(1); + bool8 masterSlave = STWI_read_status(1); - if (r2 == 1) + if (masterSlave == AGB_CLK_MASTER) { - if (gRfuState->unk_2c) + if (gSTWIStatus->unk_2c) { - if (gRfuState->reqActiveCommand == 39 - || gRfuState->reqActiveCommand == 37 - || gRfuState->reqActiveCommand == 55) - r2 = 0; + if (gSTWIStatus->reqActiveCommand == 39 + || gSTWIStatus->reqActiveCommand == 37 + || gSTWIStatus->reqActiveCommand == 55) + masterSlave = AGB_CLK_SLAVE; } } - return r2; + return masterSlave; } void rfu_clearAllSlot(void) @@ -1153,7 +1152,7 @@ void rfu_clearAllSlot(void) CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(struct UNISend) + sizeof(struct UNIRecv)); gRfuLinkStatus->remainLLFrameSizeChild[i] = 16; } - gRfuLinkStatus->remainLLFrameSizeParent = 87; + gRfuLinkStatus->remainLLFrameSizeParent = LLF_P_SIZE; gRfuLinkStatus->sendSlotNIFlag = 0; gRfuLinkStatus->recvSlotNIFlag = 0; gRfuLinkStatus->sendSlotUNIFlag = 0; @@ -1184,19 +1183,19 @@ u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) struct NIComm *r4; if (slotStatusIndex >= RFU_CHILD_MAX) - return 0x400; - if ((connTypeFlag & 0xF) == 0) - return 0x600; + return ERR_SLOT_NO; + if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV))) + return ERR_COMM_TYPE; r10 = REG_IME; REG_IME = 0; - if (connTypeFlag & 0xC) + if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV)) { for (r3 = 0; r3 < 2; ++r3) { r4 = NULL; if (r3 == 0) { - if (connTypeFlag & 4) + if (connTypeFlag & TYPE_NI_SEND) { r4 = &gRfuSlotStatusNI[slotStatusIndex]->send; gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg; @@ -1204,7 +1203,7 @@ u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) } else { - if (connTypeFlag & 8) + if (connTypeFlag & TYPE_NI_RECV) { r4 = &gRfuSlotStatusNI[slotStatusIndex]->recv; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); @@ -1212,10 +1211,10 @@ u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) } if (r4 != NULL) { - if (r4->state & 0x8000) + if (r4->state & SLOT_BUSY_FLAG) { rfu_STC_releaseFrame(slotStatusIndex, r3, r4); - for (r1 = 0; r1 < 4; ++r1) + for (r1 = 0; r1 < RFU_CHILD_MAX; ++r1) if ((r4->bmSlotOrg >> r1) & 1) r4->failCounter = 0; } @@ -1223,11 +1222,11 @@ u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) } } } - if (connTypeFlag & 1) + if (connTypeFlag & TYPE_UNI_SEND) { struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[slotStatusIndex]; - if (r3->send.state & 0x8000) + if (r3->send.state & SLOT_BUSY_FLAG) { if (!(gRfuStatic->flags & 0x80)) gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->send.payloadSize; @@ -1237,7 +1236,7 @@ u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) } CpuFill16(0, &r3->send, sizeof(struct UNISend)); } - if (connTypeFlag & 2) + if (connTypeFlag & TYPE_UNI_RECV) { CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv)); } @@ -1248,15 +1247,15 @@ u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) u16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize) { if (slotNo >= RFU_CHILD_MAX) - return 0x400; - if (connType & 0x20) + return ERR_SLOT_NO; + if (connType & TYPE_NI) { gRfuSlotStatusNI[slotNo]->recvBuffer = buffer; gRfuSlotStatusNI[slotNo]->recvBufferSize = buffSize; } - else if (!(connType & 0x10)) + else if (!(connType & TYPE_UNI)) { - return 0x600; + return ERR_COMM_TYPE; } else { @@ -1275,7 +1274,7 @@ u16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size) { u8 subFrameSize; - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) subFrameSize = size + 3; else subFrameSize = size + 2; @@ -1298,27 +1297,27 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const struct RfuSlotStatusUNI *r1; struct RfuSlotStatusNI *r12; - if (gRfuLinkStatus->parentChild == 0xFF) - return 0x301; + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) + return ERR_MODE_NOT_CONNECTED; if (!(bmSendSlot & 0xF)) - return 0x400; + return ERR_SLOT_NO; if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot) - return 0x401; + return ERR_SLOT_NOT_CONNECTED; if (r6 & 0x10) r0 = gRfuLinkStatus->sendSlotUNIFlag; else r0 = gRfuLinkStatus->sendSlotNIFlag; if (r0 & bmSendSlot) - return 0x402; - for (r2 = 0; r2 < 4 && !((bmSendSlot >> r2) & 1); ++r2) + return ERR_SLOT_BUSY; + for (r2 = 0; r2 < RFU_CHILD_MAX && !((bmSendSlot >> r2) & 1); ++r2) ; - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) r9 = &gRfuLinkStatus->remainLLFrameSizeParent; - else if (gRfuLinkStatus->parentChild == 0) + else if (gRfuLinkStatus->parentChild == MODE_CHILD) r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; r4 = _Str_RfuHeader[gRfuLinkStatus->parentChild].unk00; if (subFrameSize > *r9 || subFrameSize <= r4) - return 0x500; + return ERR_SUBFRAME_SIZE; sp04 = REG_IME; REG_IME = 0; r5 = r6 & 0x20; @@ -1355,7 +1354,7 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const gRfuSlotStatusNI[r2]->send.failCounter = 0; gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; *r9 -= subFrameSize; - r12->send.state = 0x8021; + r12->send.state = SLOT_STATE_SEND_START; } else if (r6 & 0x10) { @@ -1364,7 +1363,7 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const r1->send.src = src; r1->send.payloadSize = subFrameSize - r4; *r9 -= subFrameSize; - r1->send.state = 0x8024; + r1->send.state = SLOT_STATE_SEND_UNI; gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot; } REG_IME = sp04; @@ -1378,12 +1377,12 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) u8 r2; if (slotStatusIndex >= RFU_CHILD_MAX) - return 0x400; + return ERR_SLOT_NO; if (connType == 0x20) { r5 = gRfuSlotStatusNI[slotStatusIndex]; - if ((r5->send.state & 0x8000) - && (r5->send.state & 0x20)) + if ((r5->send.state & SLOT_BUSY_FLAG) + && (r5->send.state & SLOT_SEND_FLAG)) { connType = bmNewTgtSlot ^ r5->send.bmSlot; @@ -1403,19 +1402,19 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) if (r5->send.bmSlot == 0) { rfu_STC_releaseFrame(slotStatusIndex, 0, &r5->send); - r5->send.state = 39; + r5->send.state = SLOT_STATE_SEND_FAILED; } REG_IME = r8; } } else { - return 0x404; + return ERR_SLOT_TARGET; } } else { - return 0x403; + return ERR_SLOT_NOT_SENDING; } } else @@ -1424,13 +1423,13 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) { s32 r3; - if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != 0x8024) - return 0x403; + if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI) + return ERR_SLOT_NOT_SENDING; for (r3 = 0, r2 = 0; r2 < RFU_CHILD_MAX; ++r2) if (r2 != slotStatusIndex) r3 |= gRfuSlotStatusUNI[r2]->send.bmSlot; if (bmNewTgtSlot & r3) - return 0x404; + return ERR_SLOT_TARGET; r8 = REG_IME; REG_IME = 0; gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot; @@ -1440,7 +1439,7 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) } else { - return 0x600; + return ERR_COMM_TYPE; } } return 0; @@ -1451,18 +1450,18 @@ u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) struct NIComm *r5; u16 r4, r1; - if (slotStatusIndex > 3) - return 0x400; + if (slotStatusIndex >= RFU_CHILD_MAX) + return ERR_SLOT_NO; r5 = &gRfuSlotStatusNI[slotStatusIndex]->recv; r4 = REG_IME; ++r4; --r4; // fix r4, r5 register swap REG_IME = 0; - if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & 0x8000) + if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG) { - if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == 0x8043) - gRfuSlotStatusNI[slotStatusIndex]->recv.state = 72; + if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == SLOT_STATE_RECV_LAST) + gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN; else - gRfuSlotStatusNI[slotStatusIndex]->recv.state = 71; + gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); rfu_STC_releaseFrame(slotStatusIndex, 1, r5); } @@ -1478,11 +1477,11 @@ u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size) u8 r3_; if (slotStatusIndex >= RFU_CHILD_MAX) - return 0x400; + return ERR_SLOT_NO; r4 = &gRfuSlotStatusUNI[slotStatusIndex]->send; - if (r4->state != 0x8024) - return 0x403; - if (gRfuLinkStatus->parentChild == 1) + if (r4->state != SLOT_STATE_SEND_UNI) + return ERR_SLOT_NOT_SENDING; + if (gRfuLinkStatus->parentChild == MODE_PARENT) { r6 = &gRfuLinkStatus->remainLLFrameSizeParent; r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize; @@ -1493,7 +1492,7 @@ u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size) r3_ = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)r4->payloadSize; } if (r3_ < size) - return 0x500; + return ERR_SUBFRAME_SIZE; r1 = REG_IME; REG_IME = 0; r4->src = src; @@ -1508,7 +1507,7 @@ void rfu_UNI_readySendData(u8 slotStatusIndex) { if (slotStatusIndex < RFU_CHILD_MAX) { - if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == 0x8024) + if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == SLOT_STATE_SEND_UNI) gRfuSlotStatusUNI[slotStatusIndex]->send.dataReadyFlag = 1; } } @@ -1521,7 +1520,7 @@ void rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex) void rfu_REQ_sendData(u8 clockChangeFlag) { - if (gRfuLinkStatus->parentChild != 0xFF) + if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { if (gRfuLinkStatus->parentChild == 1 && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)) @@ -1565,10 +1564,10 @@ void rfu_REQ_sendData(u8 clockChangeFlag) } if (clockChangeFlag != 0) { - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) { - if (gRfuState->callbackS != NULL) - gRfuState->callbackS(39); + if (gSTWIStatus->callbackS != NULL) + gSTWIStatus->callbackS(39); } else { @@ -1591,13 +1590,13 @@ static void rfu_CB_sendData(UNUSED u8 r0, u16 r7) if (gRfuSlotStatusUNI[r6]->send.dataReadyFlag) gRfuSlotStatusUNI[r6]->send.dataReadyFlag = 0; r4 = &gRfuSlotStatusNI[r6]->send; - if (r4->state == 0x8020) + if (r4->state == SLOT_STATE_SEND_NULL) { rfu_STC_releaseFrame(r6, 0, r4); gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot; if (r4->dataType == 1) gRfuLinkStatus->getNameFlag |= 1 << r6; - r4->state = 38; + r4->state = SLOT_STATE_SEND_SUCCESS; } } } @@ -1625,7 +1624,7 @@ static void rfu_constructSendLLFrame(void) u8 *sp00; struct RfuSlotStatusNI *r2; - if (gRfuLinkStatus->parentChild != 0xFF + if (gRfuLinkStatus->parentChild != MODE_NEUTRAL && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) { gRfuLinkStatus->LLFReadyFlag = 0; @@ -1634,15 +1633,15 @@ static void rfu_constructSendLLFrame(void) for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) { r5 = 0; - if (gRfuSlotStatusNI[r6]->send.state & 0x8000) + if (gRfuSlotStatusNI[r6]->send.state & SLOT_BUSY_FLAG) r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->send); - if (gRfuSlotStatusNI[r6]->recv.state & 0x8000) + if (gRfuSlotStatusNI[r6]->recv.state & SLOT_BUSY_FLAG) r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->recv); - if (gRfuSlotStatusUNI[r6]->send.state == 0x8024) + if (gRfuSlotStatusUNI[r6]->send.state == SLOT_STATE_SEND_UNI) r5 += rfu_STC_UNI_constructLLSF(r6, &sp00); if (r5 != 0) { - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) r8 += r5; else r8 |= r5 << (5 * r6 + 8); @@ -1653,7 +1652,7 @@ static void rfu_constructSendLLFrame(void) while ((u32)sp00 & 3) *sp00++ = 0; gRfuFixed->LLFBuffer[0] = r8; - if (gRfuLinkStatus->parentChild == 0) + if (gRfuLinkStatus->parentChild == MODE_CHILD) { u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]); @@ -1675,7 +1674,7 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) u8 *r2; const struct RfuHeader *r8 = &_Str_RfuHeader[gRfuLinkStatus->parentChild]; - if (r4->state == 0x8022) + if (r4->state == SLOT_STATE_SENDING) { while (r4->now_p[r4->phase] >= (const u8 *)r4->src + r4->dataSize) { @@ -1684,11 +1683,11 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) r4->phase = 0; } } - if (r4->state & 0x40) + if (r4->state & SLOT_RECV_FLAG) { r5 = 0; } - else if (r4->state == 0x8022) + else if (r4->state == SLOT_STATE_SENDING) { if (r4->now_p[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) r5 = (const u8 *)r4->src + r4->dataSize - r4->now_p[r4->phase]; @@ -1707,7 +1706,7 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) | r4->phase << r8->unk05 | r4->n[r4->phase] << r8->unk06 | r5; - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; for (i = 0; i < r8->unk00; ++i) @@ -1718,13 +1717,13 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) gRfuFixed->fastCopyPtr(&sp04, r12, r5); } - if (r4->state == 0x8022) + if (r4->state == SLOT_STATE_SENDING) { ++r4->phase; if (r4->phase == 4) r4->phase = 0; } - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) gRfuLinkStatus->LLFReadyFlag = 1; else gRfuLinkStatus->LLFReadyFlag |= 1 << r10; @@ -1745,14 +1744,14 @@ static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) r5 = &_Str_RfuHeader[gRfuLinkStatus->parentChild]; sp00 = (r4->state & 0xF) << r5->unk03 | r4->payloadSize; - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; for (i = 0; i < r5->unk00; ++i) *(*r6)++ = *r2++; sp04 = r4->src; gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) gRfuLinkStatus->LLFReadyFlag = 16; else gRfuLinkStatus->LLFReadyFlag |= 16 << r8; @@ -1761,7 +1760,7 @@ static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) void rfu_REQ_recvData(void) { - if (gRfuLinkStatus->parentChild != 0xFF) + if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag; gRfuStatic->recvErrorFlag = 0; @@ -1779,25 +1778,25 @@ static void rfu_CB_recvData(u8 r9, u16 r7) if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) { gRfuStatic->NIEndRecvFlag = 0; - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) rfu_STC_PARENT_analyzeRecvPacket(); else rfu_STC_CHILD_analyzeRecvPacket(); for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) { r4 = gRfuSlotStatusNI[r6]; - if (r4->recv.state == 0x8043 && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) + if (r4->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) { r5 = &r4->recv; if (r5->dataType == 1) gRfuLinkStatus->getNameFlag |= 1 << r6; rfu_STC_releaseFrame(r6, 1, r5); gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot; - r4->recv.state = 70; + r4->recv.state = SLOT_STATE_RECV_SUCCESS; } } if (gRfuStatic->recvErrorFlag) - r7 = gRfuStatic->recvErrorFlag | 0x700; + r7 = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; } rfu_STC_REQ_callback(r9, r7); } @@ -1864,7 +1863,7 @@ static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) u32 r0; u16 r10; - r6 = &_Str_RfuHeader[~gRfuLinkStatus->parentChild & 1]; + r6 = &_Str_RfuHeader[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; if (r3 < r6->unk00) return r3; r5 = 0; @@ -1880,7 +1879,7 @@ static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) r10 = sp00.unk06 + r6->unk00; if (sp00.unk00 == 0) { - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) { if ((gRfuLinkStatus->connSlotFlag >> r12) & 1) { @@ -1909,7 +1908,7 @@ static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) if (r5) { - for (r4 = 0; r4 < 4; ++r4) + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) { if ((r5 >> r4) & 1) { @@ -1937,8 +1936,8 @@ static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 r5->errorCode = 0; if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06) { - r3->recv.state = 73; - r5->errorCode = 0x701; + r3->recv.state = SLOT_STATE_RECV_IGNORE; + r5->errorCode = ERR_RECV_BUFF_OVER; } else { @@ -1946,16 +1945,16 @@ static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 { if (r5->newDataFlag) { - r5->errorCode = 0x709; + r5->errorCode = ERR_RECV_UNK; goto _081E2F0E; } } else { if (r5->newDataFlag) - r5->errorCode = 0x708; + r5->errorCode = ERR_RECV_DATA_OVERWRITED; } - r5->state = 0x8042; + r5->state = SLOT_STATE_RECEIVING; r2 = r5->dataSize = r6->unk06; sp04 = gRfuSlotStatusUNI[r7]->recvBuffer; gRfuFixed->fastCopyPtr(&sp00, &sp04, r2); @@ -1976,9 +1975,9 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct u8 r4; u16 r2; - if ((r6->unk02 == 2 && r9 == 0x8022) - || (r6->unk02 == 1 && r9 == 0x8021) - || (r6->unk02 == 3 && r9 == 0x8023)) + if ((r6->unk02 == 2 && r9 == SLOT_STATE_SENDING) + || (r6->unk02 == 1 && r9 == SLOT_STATE_SEND_START) + || (r6->unk02 == 3 && r9 == SLOT_STATE_SEND_LAST)) { if (r12->n[r6->unk04] == r6->unk05) r12->recvAckFlag[r6->unk04] |= 1 << r10; @@ -1987,9 +1986,9 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct { r12->n[r6->unk04] = (r12->n[r6->unk04] + 1) & 3; r12->recvAckFlag[r6->unk04] = 0; - if ((u16)(r12->state + ~0x8020) <= 1) + if ((u16)(r12->state + ~SLOT_STATE_SEND_NULL) <= 1) { - if (r12->state == 0x8021) + if (r12->state == SLOT_STATE_SEND_START) r12->now_p[r6->unk04] += r12->payloadSize; else r12->now_p[r6->unk04] += r12->payloadSize << 2; @@ -2003,7 +2002,7 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct // if (r12->remainSize == 0 || r12->remainSize < 0) { r12->phase = 0; - if (r12->state == 0x8021) + if (r12->state == SLOT_STATE_SEND_START) { for (r4 = 0; r4 < WINDOW_COUNT; ++r4) { @@ -2011,20 +2010,20 @@ static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct r12->now_p[r4] = r12->src + r12->payloadSize * r4; } r12->remainSize = r12->dataSize; - r12->state = 0x8022; + r12->state = SLOT_STATE_SENDING; } else { r12->n[0] = 0; r12->remainSize = 0; - r12->state = 0x8023; + r12->state = SLOT_STATE_SEND_LAST; } } _081E30AE: } - else if (r12->state == 0x8023) + else if (r12->state == SLOT_STATE_SEND_LAST) { - r12->state = 0x8020; + r12->state = SLOT_STATE_SEND_NULL; } } if (r12->state != r9 @@ -2051,30 +2050,30 @@ static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, if (r6->unk02 == 3) { gRfuStatic->NIEndRecvFlag |= 1 << r8; - if (r4->recv.state == 0x8042) + if (r4->recv.state == SLOT_STATE_RECEIVING) { r4->recv.phase = 0; r4->recv.n[0] = 0; - r4->recv.state = 0x8043; + r4->recv.state = SLOT_STATE_RECV_LAST; } } else if (r6->unk02 == 2) { - if (r9 == 0x8041 && !r5->remainSize) + if (r9 == SLOT_STATE_RECV_START && !r5->remainSize) rfu_STC_NI_initSlot_asRecvDataEntity(r8, r5); - if (r5->state == 0x8042) + if (r5->state == SLOT_STATE_RECEIVING) r7 = 1; } else if (r6->unk02 == 1) { - if (r9 == 0x8041) + if (r9 == SLOT_STATE_RECV_START) { r7 = 1; } else { rfu_STC_NI_initSlot_asRecvControllData(r8, r5); - if (r4->recv.state != 0x8041) + if (r4->recv.state != SLOT_STATE_RECV_START) return; r7 = 1; } @@ -2084,7 +2083,7 @@ static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3)) { gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->now_p[r6->unk04], r6->unk06); - if (r5->state == 0x8042) + if (r5->state == SLOT_STATE_RECEIVING) r5->now_p[r6->unk04] += 3 * r5->payloadSize; r5->remainSize -= r6->unk06; r5->n[r6->unk04] = r6->unk05; @@ -2110,7 +2109,7 @@ static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) u32 r5; u8 r6; - if (gRfuLinkStatus->parentChild == 1) + if (gRfuLinkStatus->parentChild == MODE_PARENT) { r5 = 3; r1 = &gRfuLinkStatus->remainLLFrameSizeParent; @@ -2125,8 +2124,8 @@ static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) { if (*r1 < r5) { - r2->state = 73; - r2->errorCode = 0x702; + r2->state = SLOT_STATE_RECV_IGNORE; + r2->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE; gRfuStatic->recvErrorFlag |= r6; } else @@ -2138,7 +2137,7 @@ static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) r2->ack = 1; r2->payloadSize = 0; r2->bmSlot = r6; - r2->state = 0x8041; + r2->state = SLOT_STATE_RECV_START; gRfuLinkStatus->recvSlotNIFlag |= r6; } } @@ -2159,20 +2158,20 @@ static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4) r1 = 1 << r5; gRfuStatic->recvErrorFlag |= r1; gRfuLinkStatus->recvSlotNIFlag &= ~r1; - r4->errorCode = 0x701; - r4->state = 71; + r4->errorCode = ERR_RECV_BUFF_OVER; + r4->state = SLOT_STATE_RECV_FAILED; rfu_STC_releaseFrame(r5, 1, r4); return; } r4->now_p[0] = gRfuSlotStatusNI[r5]->recvBuffer; } - for (r3 = 0; r3 < 4; ++r3) + for (r3 = 0; r3 < WINDOW_COUNT; ++r3) { r4->n[r3] = 0; r4->now_p[r3] = &r4->now_p[0][r4->payloadSize * r3]; } r4->remainSize = r4->dataSize; - r4->state = 0x8042; + r4->state = SLOT_STATE_RECEIVING; } static void rfu_NI_checkCommFailCounter(void) diff --git a/src/librfu_s32id.c b/src/librfu_s32id.c index c3bb922e2..7c99cda2d 100644 --- a/src/librfu_s32id.c +++ b/src/librfu_s32id.c @@ -17,10 +17,10 @@ s32 AgbRFU_checkID(u8 r5) if (REG_IME == 0) return -1; r8 = REG_IE; - gRfuState->state = 10; + gSTWIStatus->state = 10; STWI_set_Callback_ID(Sio32IDIntr); Sio32IDInit(); - r4 = ®_TMCNT_L(gRfuState->timerSelect); + r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); r5 *= 8; while (--r5 != 0xFF) { @@ -38,7 +38,7 @@ s32 AgbRFU_checkID(u8 r5) REG_IME = 0; REG_IE = r8; REG_IME = 1; - gRfuState->state = 0; + gSTWIStatus->state = 0; STWI_set_Callback_ID(NULL); return r6; } @@ -46,7 +46,7 @@ s32 AgbRFU_checkID(u8 r5) static void Sio32IDInit(void) { REG_IME = 0; - REG_IE &= ~((8 << gRfuState->timerSelect) | INTR_FLAG_SERIAL); + REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); REG_IME = 1; REG_RCNT = 0; REG_SIOCNT = SIO_32BIT_MODE; diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index 50e102f19..b88f21737 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -8,6 +8,8 @@ static void STWI_stop_timer(void); static s32 STWI_restart_Command(void); static s32 STWI_reset_ClockCounter(void); +struct STWIStatus *gSTWIStatus; + void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { // If we're copying our interrupt into RAM, DMA it to block1 and use @@ -17,27 +19,27 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b { *interrupt = (IntrFunc)interruptStruct->block1; DmaCopy16(3, &IntrSIO32, interruptStruct->block1, sizeof(interruptStruct->block1)); - gRfuState = &interruptStruct->block2; + gSTWIStatus = &interruptStruct->block2; } else { *interrupt = IntrSIO32; - gRfuState = (struct STWIStatus *)interruptStruct->block1; - } - gRfuState->rxPacket = &interruptStruct->rxPacketAlloc; - gRfuState->txPacket = &interruptStruct->txPacketAlloc; - gRfuState->msMode = 1; - gRfuState->state = 0; - gRfuState->reqLength = 0; - gRfuState->reqNext = 0; - gRfuState->ackLength = 0; - gRfuState->ackNext = 0; - gRfuState->ackActiveCommand = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->error = 0; - gRfuState->recoveryCount = 0; - gRfuState->unk_2c = 0; + gSTWIStatus = (struct STWIStatus *)interruptStruct->block1; + } + gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc; + gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc; + gSTWIStatus->msMode = 1; + gSTWIStatus->state = 0; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->recoveryCount = 0; + gSTWIStatus->unk_2c = 0; REG_RCNT = 0x100; // TODO: mystery bit? REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; STWI_init_Callback_M(); @@ -48,8 +50,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect) { *interrupt = STWI_intr_timer; - gRfuState->timerSelect = timerSelect; - IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); + gSTWIStatus->timerSelect = timerSelect; + IntrEnable(INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect); } void AgbRFU_SoftReset(void) @@ -59,8 +61,8 @@ void AgbRFU_SoftReset(void) REG_RCNT = 0x8000; REG_RCNT = 0x80A0; // all these bits are undocumented - timerL = ®_TMCNT_L(gRfuState->timerSelect); - timerH = ®_TMCNT_H(gRfuState->timerSelect); + timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); + timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); *timerH = 0; *timerL = 0; *timerH = TIMER_ENABLE | TIMER_1024CLK; @@ -69,24 +71,24 @@ void AgbRFU_SoftReset(void) *timerH = 3; REG_RCNT = 0x80A0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - gRfuState->state = 0; - gRfuState->reqLength = 0; - gRfuState->reqNext = 0; - gRfuState->reqActiveCommand = 0; - gRfuState->ackLength = 0; - gRfuState->ackNext = 0; - gRfuState->ackActiveCommand = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->error = 0; - gRfuState->msMode = 1; - gRfuState->recoveryCount = 0; - gRfuState->unk_2c = 0; + gSTWIStatus->state = 0; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->reqActiveCommand = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->msMode = 1; + gSTWIStatus->recoveryCount = 0; + gSTWIStatus->unk_2c = 0; } void STWI_set_MS_mode(u8 mode) { - gRfuState->msMode = mode; + gSTWIStatus->msMode = mode; } u16 STWI_read_status(u8 index) @@ -94,13 +96,13 @@ u16 STWI_read_status(u8 index) switch (index) { case 0: - return gRfuState->error; + return gSTWIStatus->error; case 1: - return gRfuState->msMode; + return gSTWIStatus->msMode; case 2: - return gRfuState->state; + return gSTWIStatus->state; case 3: - return gRfuState->reqActiveCommand; + return gSTWIStatus->reqActiveCommand; default: return 0xFFFF; } @@ -119,31 +121,31 @@ void STWI_init_Callback_S(void) // The callback can take 2 or 3 arguments. void STWI_set_Callback_M(void *callbackM) { - gRfuState->callbackM = callbackM; + gSTWIStatus->callbackM = callbackM; } void STWI_set_Callback_S(void (*callbackS)(u16)) { - gRfuState->callbackS = callbackS; + gSTWIStatus->callbackS = callbackS; } void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer { - gRfuState->unk_20 = func; + gSTWIStatus->unk_20 = func; } u16 STWI_poll_CommandEnd(void) { - while (gRfuState->unk_2c == TRUE) + while (gSTWIStatus->unk_2c == TRUE) ; - return gRfuState->error; + return gSTWIStatus->error; } void STWI_send_ResetREQ(void) { if (!STWI_init(ID_RESET_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -152,7 +154,7 @@ void STWI_send_LinkStatusREQ(void) { if (!STWI_init(ID_LINK_STATUS_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -161,7 +163,7 @@ void STWI_send_VersionStatusREQ(void) { if (!STWI_init(ID_VERSION_STATUS_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -170,7 +172,7 @@ void STWI_send_SystemStatusREQ(void) { if (!STWI_init(ID_SYSTEM_STATUS_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -179,7 +181,7 @@ void STWI_send_SlotStatusREQ(void) { if (!STWI_init(ID_SLOT_STATUS_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -188,7 +190,7 @@ void STWI_send_ConfigStatusREQ(void) { if (!STWI_init(ID_CONFIG_STATUS_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -200,9 +202,9 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) if (!STWI_init(ID_GAME_CONFIG_REQ)) { - gRfuState->reqLength = 6; + gSTWIStatus->reqLength = 6; // TODO: what is unk1 - packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *(u16 *)packetBytes = *(u16 *)unk1; packetBytes += sizeof(u16); @@ -229,8 +231,8 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) { u8 *packetBytes; - gRfuState->reqLength = 1; - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 1; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk3; *packetBytes++ = unk2; @@ -243,7 +245,7 @@ void STWI_send_SC_StartREQ(void) { if (!STWI_init(ID_SC_START_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -252,7 +254,7 @@ void STWI_send_SC_PollingREQ(void) { if (!STWI_init(ID_SC_POLL_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -261,7 +263,7 @@ void STWI_send_SC_EndREQ(void) { if (!STWI_init(ID_SC_END_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -270,7 +272,7 @@ void STWI_send_SP_StartREQ(void) { if (!STWI_init(ID_SP_START_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -279,7 +281,7 @@ void STWI_send_SP_PollingREQ(void) { if (!STWI_init(ID_SP_POLL_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -288,7 +290,7 @@ void STWI_send_SP_EndREQ(void) { if (!STWI_init(ID_SP_END_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -297,8 +299,8 @@ void STWI_send_CP_StartREQ(u16 unk1) { if (!STWI_init(ID_CP_START_REQ)) { - gRfuState->reqLength = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk1; + gSTWIStatus->reqLength = 1; + gSTWIStatus->txPacket->rfuPacket32.data[0] = unk1; STWI_start_Command(); } } @@ -307,7 +309,7 @@ void STWI_send_CP_PollingREQ(void) { if (!STWI_init(ID_CP_POLL_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -316,7 +318,7 @@ void STWI_send_CP_EndREQ(void) { if (!STWI_init(ID_CP_END_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -328,8 +330,8 @@ void STWI_send_DataTxREQ(const void *in, u8 size) u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) reqLength += 1; - gRfuState->reqLength = reqLength; - CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->reqLength * sizeof(u32)); + gSTWIStatus->reqLength = reqLength; + CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32)); STWI_start_Command(); } } @@ -341,8 +343,8 @@ void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) reqLength += 1; - gRfuState->reqLength = reqLength; - CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->reqLength * sizeof(u32)); + gSTWIStatus->reqLength = reqLength; + CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32)); STWI_start_Command(); } } @@ -351,7 +353,7 @@ void STWI_send_DataRxREQ(void) { if (!STWI_init(ID_DATA_RX_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -360,7 +362,7 @@ void STWI_send_MS_ChangeREQ(void) { if (!STWI_init(ID_MS_CHANGE_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -371,14 +373,14 @@ void STWI_send_DataReadyAndChangeREQ(u8 unk) { if (!unk) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; } else { u8 *packetBytes; - gRfuState->reqLength = 1; - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 1; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk; *packetBytes++ = 0; @@ -395,8 +397,8 @@ void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) { u8 *packetBytes; - gRfuState->reqLength = 1; - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 1; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk0; *packetBytes++ = unk1; @@ -410,7 +412,7 @@ void STWI_send_ResumeRetransmitAndChangeREQ(void) { if (!STWI_init(ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -419,8 +421,8 @@ void STWI_send_DisconnectREQ(u8 unk) { if (!STWI_init(ID_DISCONNECT_REQ)) { - gRfuState->reqLength = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk; + gSTWIStatus->reqLength = 1; + gSTWIStatus->txPacket->rfuPacket32.data[0] = unk; STWI_start_Command(); } } @@ -429,8 +431,8 @@ void STWI_send_TestModeREQ(u8 unk0, u8 unk1) { if (!STWI_init(ID_TEST_MODE_REQ)) { - gRfuState->reqLength = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); + gSTWIStatus->reqLength = 1; + gSTWIStatus->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); STWI_start_Command(); } } @@ -442,9 +444,9 @@ void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) if (!STWI_init(ID_CPR_START_REQ)) { - gRfuState->reqLength = 2; + gSTWIStatus->reqLength = 2; arg1 = unk1 | (unk0 << 16); - packetData = gRfuState->txPacket->rfuPacket32.data; + packetData = gSTWIStatus->txPacket->rfuPacket32.data; packetData[0] = arg1; packetData[1] = unk2; STWI_start_Command(); @@ -455,7 +457,7 @@ void STWI_send_CPR_PollingREQ(void) { if (!STWI_init(ID_CPR_POLL_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -464,7 +466,7 @@ void STWI_send_CPR_EndREQ(void) { if (!STWI_init(ID_CPR_END_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } @@ -473,18 +475,18 @@ void STWI_send_StopModeREQ(void) { if (!STWI_init(ID_STOP_MODE_REQ)) { - gRfuState->reqLength = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } static void STWI_intr_timer(void) { - switch (gRfuState->timerState) + switch (gSTWIStatus->timerState) { // TODO: Make an enum for these case 2: - gRfuState->timerActive = 1; + gSTWIStatus->timerActive = 1; STWI_set_timer(50); break; case 1: @@ -493,11 +495,11 @@ static void STWI_intr_timer(void) STWI_restart_Command(); break; case 3: - gRfuState->timerActive = 1; + gSTWIStatus->timerActive = 1; STWI_stop_timer(); STWI_reset_ClockCounter(); - if (gRfuState->callbackM != NULL) - gRfuState->callbackM(255, 0); + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(255, 0); break; } } @@ -507,78 +509,78 @@ static void STWI_set_timer(u8 unk) vu16 *timerL; vu16 *timerH; - timerL = ®_TMCNT_L(gRfuState->timerSelect); - timerH = ®_TMCNT_H(gRfuState->timerSelect); + timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); + timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); REG_IME = 0; switch (unk) { case 50: *timerL = 0xFCCB; - gRfuState->timerState = 1; + gSTWIStatus->timerState = 1; break; case 80: *timerL = 0xFAE0; - gRfuState->timerState = 2; + gSTWIStatus->timerState = 2; break; case 100: *timerL = 0xF996; - gRfuState->timerState = 3; + gSTWIStatus->timerState = 3; break; case 130: *timerL = 0xF7AD; - gRfuState->timerState = 4; + gSTWIStatus->timerState = 4; break; } *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; - REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; + REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect; REG_IME = 1; } static void STWI_stop_timer(void) { - gRfuState->timerState = 0; - REG_TMCNT_L(gRfuState->timerSelect) = 0; - REG_TMCNT_H(gRfuState->timerSelect) = 0; + gSTWIStatus->timerState = 0; + REG_TMCNT_L(gSTWIStatus->timerSelect) = 0; + REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; } static u16 STWI_init(u8 request) { if (!REG_IME) { - gRfuState->error = 6; - if (gRfuState->callbackM != NULL) - gRfuState->callbackM(request, gRfuState->error); + gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if (gRfuState->unk_2c == TRUE) + else if (gSTWIStatus->unk_2c == TRUE) { - gRfuState->error = 2; - gRfuState->unk_2c = FALSE; - if (gRfuState->callbackM != NULL) - gRfuState->callbackM(request, gRfuState->error); + gSTWIStatus->error = ERR_REQ_CMD_SENDING; + gSTWIStatus->unk_2c = FALSE; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if(!gRfuState->msMode) + else if(!gSTWIStatus->msMode) { - gRfuState->error = 4; - if (gRfuState->callbackM != NULL) - gRfuState->callbackM(request, gRfuState->error, gRfuState); + gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus); return TRUE; } else { - gRfuState->unk_2c = TRUE; - gRfuState->reqActiveCommand = request; - gRfuState->state = 0; - gRfuState->reqLength = 0; - gRfuState->reqNext = 0; - gRfuState->ackLength = 0; - gRfuState->ackNext = 0; - gRfuState->ackActiveCommand = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->error = 0; - gRfuState->recoveryCount = 0; + gSTWIStatus->unk_2c = TRUE; + gSTWIStatus->reqActiveCommand = request; + gSTWIStatus->state = 0; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->recoveryCount = 0; REG_RCNT = 0x100; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; return FALSE; @@ -589,15 +591,15 @@ static s32 STWI_start_Command(void) { u16 imeTemp; - // equivalent to gRfuState->txPacket->rfuPacket32.command, + // equivalent to gSTWIStatus->txPacket->rfuPacket32.command, // but the cast here is required to avoid register issue - *(u32 *)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->reqLength << 8) | gRfuState->reqActiveCommand; - REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; - gRfuState->state = 0; - gRfuState->reqNext = 1; + *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand; + REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command; + gSTWIStatus->state = 0; + gSTWIStatus->reqNext = 1; imeTemp = REG_IME; REG_IME = 0; - REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); + REG_IE |= (INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect); REG_IE |= INTR_FLAG_SERIAL; REG_IME = imeTemp; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; @@ -606,27 +608,27 @@ static s32 STWI_start_Command(void) static s32 STWI_restart_Command(void) { - if (gRfuState->recoveryCount <= 1) + if (gSTWIStatus->recoveryCount <= 1) { - ++gRfuState->recoveryCount; + ++gSTWIStatus->recoveryCount; STWI_start_Command(); } else { - if (gRfuState->reqActiveCommand == ID_MS_CHANGE_REQ || gRfuState->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gRfuState->reqActiveCommand == ID_UNK35_REQ || gRfuState->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) + if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) { - gRfuState->error = 1; - gRfuState->unk_2c = 0; - if (gRfuState->callbackM != NULL) - gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); + gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; + gSTWIStatus->unk_2c = 0; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); } else { - gRfuState->error = 1; - gRfuState->unk_2c = 0; - if (gRfuState->callbackM != NULL) - gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); - gRfuState->state = 4; // TODO: what's 4 + gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; + gSTWIStatus->unk_2c = 0; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); + gSTWIStatus->state = 4; // TODO: what's 4 } } return 0; @@ -634,9 +636,9 @@ static s32 STWI_restart_Command(void) static s32 STWI_reset_ClockCounter(void) { - gRfuState->state = 5; // TODO: what is 5 - gRfuState->reqLength = 0; - gRfuState->reqNext = 0; + gSTWIStatus->state = 5; // TODO: what is 5 + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; REG_SIODATA32 = (1 << 31); REG_SIOCNT = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; diff --git a/sym_bss.txt b/sym_bss.txt index 06502497e..08f390b01 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -74,7 +74,7 @@ gUnknown_3000FE8: @ 3000FE8 gUnknown_3001188: @ 3001188 .space 0x8 -gUnknown_3001190: @ 3001190 +gRfuAPIBuffer: @ 3001190 .space 0xE68 gUnknown_3001FF8: @ 3001FF8 diff --git a/sym_common.txt b/sym_common.txt index 188981dbe..c50f09540 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -160,6 +160,8 @@ gUnknown_3005E94: @ 3005E94 .include "m4a.o" .include "agb_flash.o" .align 2 + .include "librfu_stwi.o" + .align 4 .include "librfu_rfu.o" .align 4 .include "librfu_s32id.o" -- cgit v1.2.3 From aa9843199592012301931381bd2fe1396fe29c82 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 04:13:33 +0800 Subject: librfu rodata --- data/librfu_rodata.s | 28 ---------------------------- ld_script.txt | 3 ++- src/librfu_rfu.c | 37 ++++++++++++++++++++++++++----------- src/librfu_s32id.c | 7 ++++--- 4 files changed, 32 insertions(+), 43 deletions(-) delete mode 100644 data/librfu_rodata.s diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s deleted file mode 100644 index e5b15c6c5..000000000 --- a/data/librfu_rodata.s +++ /dev/null @@ -1,28 +0,0 @@ - .section .rodata - - .set VERSION_MAJOR, 1 - .set VERSION_MINOR, 0 - .set VERSION_REVISION, 24 - - .align 2 -_Str_RfuHeader:: - .byte 2, 14, 0, 10, 9, 5, 7, 2 - .byte 0, 15, 1, 3, 3, 0, 31, 0 - .byte 3, 22, 18, 14, 13, 9, 11, 3 - .byte 15, 15, 1, 3, 3, 0, 0x7f, 0 - - @ .ascii "RFU_V1024" - .ascii "RFU_V" - .byte VERSION_MAJOR + 0x30 - .byte VERSION_MINOR + 0x30 - .byte (VERSION_REVISION / 10) + 0x30 - .byte (VERSION_REVISION % 10) + 0x30 - .byte 0 - - .align 2 -_Str_RFU_MBOOT:: - .asciz "RFU-MBOOT" - - .align 2 -_Str_Sio32ID:: - .asciz "NINTENDOSio32ID_030820" diff --git a/ld_script.txt b/ld_script.txt index 0588a613a..614bc4c93 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -940,7 +940,8 @@ SECTIONS { src/agb_flash_1m.o(.rodata); src/agb_flash_mx.o(.rodata); src/agb_flash_le.o(.rodata); - data/librfu_rodata.o(.rodata); + src/librfu_rfu.o(.rodata); + src/librfu_s32id.o(.rodata); src/isagbprn.o(.rodata); *libgcc.a:_divdi3.o(.rodata); *libgcc.a:_udivdi3.o(.rodata); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 70d5b4990..96de99c2a 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -1,6 +1,6 @@ #include "librfu.h" -struct RfuHeader +struct LLSFStruct { u8 unk00; u8 unk01; @@ -67,15 +67,30 @@ static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, UNU static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *); static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *); -extern const char _Str_RFU_MBOOT[]; -extern const struct RfuHeader _Str_RfuHeader[2]; - struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX]; struct RfuLinkStatus *gRfuLinkStatus; struct RfuStatic *gRfuStatic; struct RfuFixed *gRfuFixed; +static const struct LLSFStruct llsf_struct[2] = { + { + 2, 14, 0, 10, 9, 5, 7, 2, + 0, 15, 1, 3, 3, 0x1f + }, { + 3, 22, 18, 14, 13, 9, 11, 3, + 15, 15, 1, 3, 3, 0x7f + } +}; + +#ifdef EMERALD +static const char lib_ver[] = "RFU_V1026"; +#else +static const char lib_ver[] = "RFU_V1024"; +#endif + +static const char str_checkMbootLL[] = "RFU-MBOOT"; + u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) { u16 i; @@ -264,7 +279,7 @@ u16 rfu_getRFUStatus(u8 *rfuState) u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) { - const char *s1 = _Str_RFU_MBOOT; + const char *s1 = str_checkMbootLL; char *s2 = (char *)0x30000F0; u16 checksum; u16 *r2; @@ -1315,7 +1330,7 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const r9 = &gRfuLinkStatus->remainLLFrameSizeParent; else if (gRfuLinkStatus->parentChild == MODE_CHILD) r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; - r4 = _Str_RfuHeader[gRfuLinkStatus->parentChild].unk00; + r4 = llsf_struct[gRfuLinkStatus->parentChild].unk00; if (subFrameSize > *r9 || subFrameSize <= r4) return ERR_SUBFRAME_SIZE; sp04 = REG_IME; @@ -1672,7 +1687,7 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) u32 sp00; u8 i; u8 *r2; - const struct RfuHeader *r8 = &_Str_RfuHeader[gRfuLinkStatus->parentChild]; + const struct LLSFStruct *r8 = &llsf_struct[gRfuLinkStatus->parentChild]; if (r4->state == SLOT_STATE_SENDING) { @@ -1732,7 +1747,7 @@ static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) { - const struct RfuHeader *r5; + const struct LLSFStruct *r5; const u8 *sp04; u32 sp00; u8 *r2; @@ -1741,7 +1756,7 @@ static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) if (!r4->dataReadyFlag || !r4->bmSlot) return 0; - r5 = &_Str_RfuHeader[gRfuLinkStatus->parentChild]; + r5 = &llsf_struct[gRfuLinkStatus->parentChild]; sp00 = (r4->state & 0xF) << r5->unk03 | r4->payloadSize; if (gRfuLinkStatus->parentChild == MODE_PARENT) @@ -1857,13 +1872,13 @@ static void rfu_STC_CHILD_analyzeRecvPacket(void) static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) { struct RfuLocalStruct sp00; - const struct RfuHeader *r6; + const struct LLSFStruct *r6; u32 r5; u8 r4; u32 r0; u16 r10; - r6 = &_Str_RfuHeader[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; + r6 = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; if (r3 < r6->unk00) return r3; r5 = 0; diff --git a/src/librfu_s32id.c b/src/librfu_s32id.c index 7c99cda2d..ed51dcd12 100644 --- a/src/librfu_s32id.c +++ b/src/librfu_s32id.c @@ -1,13 +1,14 @@ #include "librfu.h" -extern const u16 _Str_Sio32ID[]; - static void Sio32IDIntr(void); static void Sio32IDInit(void); static s32 Sio32IDMain(void); struct RfuS32Id gRfuS32Id; +static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO +static const char Sio32IDLib_Var[] = "Sio32ID_030820"; + s32 AgbRFU_checkID(u8 r5) { u16 r8; @@ -147,7 +148,7 @@ static void Sio32IDIntr(void) } } if (gRfuS32Id.unk2 < 4) - gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + _Str_Sio32ID); + gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + Sio32ConnectionData); else gRfuS32Id.unk4 = 0x8001; gRfuS32Id.unk6 = ~r5; -- cgit v1.2.3