summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/librfu.s388
-rw-r--r--data/librfu_rodata.s1
-rw-r--r--include/librfu.h1
-rw-r--r--src/librfu_rfu.c175
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;
+}