summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2020-01-02 06:19:23 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2020-01-09 12:38:57 +0800
commit1fda78fd0a1b0235ec0ee2db85e5ebbfa9fc50b5 (patch)
treeae3851fb75a49ac4afd2ca5c1a12cdbb75617a73
parent5bf8d1c62d6907b44d92f75f4402c4a0dee28a2c (diff)
k.o. librfu_rfu
-rw-r--r--asm/librfu.s1111
-rw-r--r--include/librfu.h14
-rw-r--r--ld_script.txt1
-rw-r--r--src/librfu_rfu.c552
-rw-r--r--src/librfu_stwi.c4
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 = &REG_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 *)&REG_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)