diff options
-rw-r--r-- | asm/librfu.s | 1111 | ||||
-rw-r--r-- | include/librfu.h | 14 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/librfu_rfu.c | 552 | ||||
-rw-r--r-- | src/librfu_stwi.c | 4 |
5 files changed, 487 insertions, 1195 deletions
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) |