diff options
-rw-r--r-- | asm/librfu.s | 388 | ||||
-rw-r--r-- | data/librfu_rodata.s | 1 | ||||
-rw-r--r-- | include/librfu.h | 1 | ||||
-rw-r--r-- | src/librfu_rfu.c | 175 |
4 files changed, 161 insertions, 404 deletions
diff --git a/asm/librfu.s b/asm/librfu.s index c98ee854c..f94aaabf3 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,394 +5,6 @@ .text - thumb_func_start rfu_STC_analyzeLLSF -rfu_STC_analyzeLLSF: @ 81E2C40 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - adds r7, r1, 0 - lsls r0, 24 - lsrs r0, 24 - mov r12, r0 - lsls r2, 16 - lsrs r3, r2, 16 - ldr r2, _081E2C74 @ =gRfuLinkStatus - ldr r0, [r2] - ldrb r0, [r0] - mvns r0, r0 - movs r1, 0x1 - ands r0, r1 - lsls r0, 4 - ldr r1, _081E2C78 @ =_Str_RfuHeader - adds r6, r0, r1 - ldrb r0, [r6] - cmp r3, r0 - bcs _081E2C7C - adds r0, r3, 0 - b _081E2E6E - .align 2, 0 -_081E2C74: .4byte gRfuLinkStatus -_081E2C78: .4byte _Str_RfuHeader -_081E2C7C: - movs r5, 0 - movs r4, 0 - ldrb r3, [r6, 0x1] - ldrb r1, [r6, 0x7] - mov r8, r1 - ldr r2, [sp] - mov r9, r2 - cmp r4, r0 - bcs _081E2CA4 - adds r2, r0, 0 -_081E2C90: - ldrb r0, [r7] - lsls r1, r4, 3 - lsls r0, r1 - orrs r5, r0 - adds r7, 0x1 - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, r2 - bcc _081E2C90 -_081E2CA4: - adds r0, r5, 0 - lsrs r0, r3 - mov r3, r8 - ands r0, r3 - ldr r1, _081E2D7C @ =0xffffff00 - mov r10, r1 - mov r3, r10 - mov r2, r9 - ands r3, r2 - orrs r3, r0 - str r3, [sp] - adds r0, r5, 0 - ldrb r1, [r6, 0x2] - lsrs r0, r1 - ldrb r1, [r6, 0x8] - ands r0, r1 - lsls r0, 8 - ldr r4, _081E2D80 @ =0xffff00ff - adds r2, r4, 0 - ands r2, r3 - orrs r2, r0 - str r2, [sp] - adds r0, r5, 0 - ldrb r3, [r6, 0x3] - lsrs r0, r3 - ldrb r1, [r6, 0x9] - ands r0, r1 - lsls r0, 16 - ldr r3, _081E2D84 @ =0xff00ffff - ands r3, r2 - orrs r3, r0 - str r3, [sp] - adds r0, r5, 0 - ldrb r1, [r6, 0x4] - lsrs r0, r1 - ldrb r1, [r6, 0xA] - ands r0, r1 - lsls r0, 24 - ldr r2, _081E2D88 @ =0x00ffffff - mov r8, r2 - mov r1, r8 - ands r1, r3 - orrs r1, r0 - mov r8, r1 - str r1, [sp] - adds r1, r5, 0 - ldrb r2, [r6, 0x5] - lsrs r1, r2 - ldrb r0, [r6, 0xB] - ands r1, r0 - mov r9, sp - ldr r2, [sp, 0x4] - mov r3, r10 - ands r2, r3 - orrs r2, r1 - str r2, [sp, 0x4] - adds r0, r5, 0 - ldrb r1, [r6, 0x6] - lsrs r0, r1 - ldrb r1, [r6, 0xC] - ands r0, r1 - lsls r0, 8 - ands r4, r2 - orrs r4, r0 - str r4, [sp, 0x4] - ldrh r0, [r6, 0xE] - ands r5, r0 - lsls r1, r5, 16 - ldr r0, _081E2D8C @ =0x0000ffff - ands r0, r4 - orrs r0, r1 - str r0, [sp, 0x4] - lsrs r0, 16 - ldrb r6, [r6] - adds r0, r6 - lsls r0, 16 - lsrs r0, 16 - mov r10, r0 - mov r0, sp - ldrb r0, [r0] - cmp r0, 0 - beq _081E2D4A - b _081E2E6C -_081E2D4A: - ldr r2, _081E2D90 @ =gRfuLinkStatus - ldr r3, [r2] - ldrb r2, [r3] - cmp r2, 0x1 - bne _081E2E08 - ldrb r0, [r3, 0x2] - mov r5, r12 - asrs r0, r5 - ands r0, r2 - cmp r0, 0 - bne _081E2D62 - b _081E2E6C -_081E2D62: - mov r1, r8 - lsrs r0, r1, 16 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bne _081E2D94 - mov r0, r12 - mov r1, sp - adds r2, r7, 0 - bl rfu_STC_UNI_receive - b _081E2E6C - .align 2, 0 -_081E2D7C: .4byte 0xffffff00 -_081E2D80: .4byte 0xffff00ff -_081E2D84: .4byte 0xff00ffff -_081E2D88: .4byte 0x00ffffff -_081E2D8C: .4byte 0x0000ffff -_081E2D90: .4byte gRfuLinkStatus -_081E2D94: - mov r5, r9 - ldrb r0, [r5, 0x3] - cmp r0, 0 - bne _081E2DA8 - mov r0, r12 - mov r1, sp - adds r2, r7, 0 - bl rfu_STC_NI_receive_Receiver - b _081E2E6C -_081E2DA8: - movs r4, 0 - ldr r1, _081E2DC0 @ =gRfuSlotStatusNI - ldr r0, [r1] - ldrb r0, [r0, 0x1A] - mov r5, r12 - asrs r0, r5 - ands r0, r2 - cmp r0, 0 - beq _081E2DC4 - ldrb r0, [r3, 0x4] - b _081E2DEA - .align 2, 0 -_081E2DC0: .4byte gRfuSlotStatusNI -_081E2DC4: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bhi _081E2E6C - lsls r0, r4, 2 - adds r0, r1 - ldr r0, [r0] - ldrb r0, [r0, 0x1A] - mov r2, r12 - asrs r0, r2 - movs r2, 0x1 - ands r0, r2 - cmp r0, 0 - beq _081E2DC4 - ldr r3, _081E2E04 @ =gRfuLinkStatus - ldr r0, [r3] - ldrb r0, [r0, 0x4] - mov r5, r12 -_081E2DEA: - asrs r0, r5 - ands r0, r2 - cmp r0, 0 - beq _081E2DC4 - cmp r4, 0x3 - bhi _081E2E6C - adds r0, r4, 0 - mov r1, r12 - mov r2, sp - adds r3, r7, 0 - bl rfu_STC_NI_receive_Sender - b _081E2E6C - .align 2, 0 -_081E2E04: .4byte gRfuLinkStatus -_081E2E08: - ldrb r1, [r3, 0x2] - mov r2, r9 - ldrb r0, [r2, 0x1] - adds r5, r1, 0 - ands r5, r0 - cmp r5, 0 - beq _081E2E6C - movs r4, 0 - movs r6, 0x1 -_081E2E1A: - adds r0, r5, 0 - asrs r0, r4 - ands r0, r6 - cmp r0, 0 - beq _081E2E62 - mov r1, sp - ldrb r0, [r1, 0x2] - cmp r0, 0x4 - bne _081E2E36 - adds r0, r4, 0 - adds r2, r7, 0 - bl rfu_STC_UNI_receive - b _081E2E62 -_081E2E36: - ldrb r0, [r1, 0x3] - cmp r0, 0 - bne _081E2E48 - adds r0, r4, 0 - mov r1, sp - adds r2, r7, 0 - bl rfu_STC_NI_receive_Receiver - b _081E2E62 -_081E2E48: - ldr r0, _081E2E80 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0, 0x4] - asrs r0, r4 - ands r0, r6 - cmp r0, 0 - beq _081E2E62 - adds r0, r4, 0 - adds r1, r4, 0 - mov r2, sp - adds r3, r7, 0 - bl rfu_STC_NI_receive_Sender -_081E2E62: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E2E1A -_081E2E6C: - mov r0, r10 -_081E2E6E: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E2E80: .4byte gRfuLinkStatus - thumb_func_end rfu_STC_analyzeLLSF - - thumb_func_start rfu_STC_UNI_receive -rfu_STC_UNI_receive: @ 81E2E84 - push {r4-r7,lr} - sub sp, 0x8 - adds r6, r1, 0 - str r2, [sp] - lsls r0, 24 - lsrs r7, r0, 24 - ldr r2, _081E2EB8 @ =gRfuSlotStatusUNI - lsls r1, r7, 2 - adds r1, r2 - ldr r3, [r1] - adds r5, r3, 0 - adds r5, 0xC - movs r4, 0 - movs r0, 0 - strh r0, [r5, 0x2] - ldr r0, [r1] - ldr r0, [r0, 0x18] - adds r1, r2, 0 - ldrh r2, [r6, 0x6] - cmp r0, r2 - bcs _081E2EC0 - movs r0, 0x49 - strh r0, [r3, 0xC] - ldr r0, _081E2EBC @ =0x00000701 - strh r0, [r5, 0x2] - b _081E2F0E - .align 2, 0 -_081E2EB8: .4byte gRfuSlotStatusUNI -_081E2EBC: .4byte 0x00000701 -_081E2EC0: - ldrb r0, [r5, 0x7] - cmp r0, 0 - beq _081E2ED8 - ldrb r0, [r5, 0x6] - cmp r0, 0 - beq _081E2EE4 - ldr r0, _081E2ED4 @ =0x00000709 - strh r0, [r5, 0x2] - b _081E2F0E - .align 2, 0 -_081E2ED4: .4byte 0x00000709 -_081E2ED8: - ldrb r0, [r5, 0x6] - cmp r0, 0 - beq _081E2EE4 - movs r0, 0xE1 - lsls r0, 3 - strh r0, [r5, 0x2] -_081E2EE4: - movs r4, 0 - ldr r0, _081E2F2C @ =0x00008042 - strh r0, [r5] - ldrh r0, [r6, 0x6] - strh r0, [r5, 0x4] - ldrh r2, [r6, 0x6] - lsls r0, r7, 2 - adds r0, r1 - ldr r0, [r0] - ldr r0, [r0, 0x14] - str r0, [sp, 0x4] - ldr r0, _081E2F30 @ =gRfuFixed - ldr r0, [r0] - add r1, sp, 0x4 - ldr r3, [r0, 0x4] - mov r0, sp - bl _call_via_r3 - movs r0, 0x1 - strb r0, [r5, 0x6] - strh r4, [r5] -_081E2F0E: - ldrh r0, [r5, 0x2] - cmp r0, 0 - beq _081E2F22 - ldr r0, _081E2F34 @ =gRfuStatic - ldr r2, [r0] - movs r0, 0x10 - lsls r0, r7 - ldrb r1, [r2, 0x4] - orrs r0, r1 - strb r0, [r2, 0x4] -_081E2F22: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E2F2C: .4byte 0x00008042 -_081E2F30: .4byte gRfuFixed -_081E2F34: .4byte gRfuStatic - thumb_func_end rfu_STC_UNI_receive - thumb_func_start rfu_STC_NI_receive_Sender rfu_STC_NI_receive_Sender: @ 81E2F38 push {r4-r7,lr} diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s index d5e847aa3..e5b15c6c5 100644 --- a/data/librfu_rodata.s +++ b/data/librfu_rodata.s @@ -11,6 +11,7 @@ _Str_RfuHeader:: .byte 3, 22, 18, 14, 13, 9, 11, 3 .byte 15, 15, 1, 3, 3, 0, 0x7f, 0 + @ .ascii "RFU_V1024" .ascii "RFU_V" .byte VERSION_MAJOR + 0x30 .byte VERSION_MINOR + 0x30 diff --git a/include/librfu.h b/include/librfu.h index ff160e207..e50f5cc89 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -284,7 +284,6 @@ extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; // librfu_rfu -void rfu_STC_clearAPIVariables(void); void rfu_REQ_stopMode(void); u16 rfu_waitREQComplete(void); s32 rfu_REQBN_softReset_and_checkID(void); diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index 3bfa3b601..e53aade49 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -1,6 +1,35 @@ #include "global.h" #include "librfu.h" +struct RfuHeader +{ + u8 unk00; + u8 unk01; + u8 unk02; + u8 unk03; + u8 unk04; + u8 unk05; + u8 unk06; + u8 unk07; + u8 unk08; + u8 unk09; + u8 unk0A; + u8 unk0B; + u8 unk0C; + u16 unk0E; +}; + +struct RfuTest +{ + u8 unk00; + u8 unk01; + u8 unk02; + u8 unk03; + u8 unk04; + u8 unk05; + u16 unk06; +}; + void rfu_CB_defaultCallback(u8, u16); void rfu_CB_reset(u8, u16); void rfu_CB_configGameData(u8, u16); @@ -19,6 +48,7 @@ void rfu_CB_sendData3(u8, u16); void rfu_CB_recvData(u8, u16); s32 sub_81E349C(u8); void rfu_enableREQCallback(bool8); +void rfu_STC_clearAPIVariables(void); void rfu_STC_readChildList(void); void rfu_STC_readParentCandidateList(void); void rfu_STC_REQ_callback(u8, u16); @@ -32,10 +62,13 @@ u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); u16 rfu_STC_UNI_constructLLSF(u8, u8 **); void rfu_STC_PARENT_analyzeRecvPacket(void); void rfu_STC_CHILD_analyzeRecvPacket(void); -u16 rfu_STC_analyzeLLSF(u8, u8 *, u16); +u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16); +void rfu_STC_UNI_receive(u8, const struct RfuTest *, const u8 *); +void rfu_STC_NI_receive_Receiver(u8, const struct RfuTest *, const u8 *); +void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuTest *, UNUSED const u8 *); extern const char _Str_RFU_MBOOT[]; -extern const u8 _Str_RfuHeader[]; +extern const struct RfuHeader _Str_RfuHeader[2]; struct RfuStruct *gRfuState; ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; @@ -1284,7 +1317,7 @@ u16 rfu_STC_setSendData_org(u8 r6, u8 r3, u8 r8, const void *sp00, u32 sp28) r9 = &gRfuLinkStatus->remainLLFrameSizeParent; else if (gRfuLinkStatus->connMode == 0) r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; - r4 = _Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + r4 = _Str_RfuHeader[gRfuLinkStatus->connMode].unk00; if (r8 > *r9 || r8 <= r4) return 0x500; sp04 = REG_IME; @@ -1644,7 +1677,7 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) u32 sp00; u8 i; u8 *r2; - const u8 *r8 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; + const struct RfuHeader *r8 = &_Str_RfuHeader[gRfuLinkStatus->connMode]; if (r4->state == 0x8022) { @@ -1673,15 +1706,15 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) else r5 = r4->remainSize; } - sp00 = (r4->state & 0xF) << r8[3] - | r4->ack << r8[4] - | r4->phase << r8[5] - | r4->n[r4->phase] << r8[6] + sp00 = (r4->state & 0xF) << r8->unk03 + | r4->ack << r8->unk04 + | r4->phase << r8->unk05 + | r4->n[r4->phase] << r8->unk06 | r5; if (gRfuLinkStatus->connMode == 1) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; - for (i = 0; i < *r8; ++i) + for (i = 0; i < r8->unk00; ++i) *(*r12)++ = *r2++; if (r5 != 0) { @@ -1699,12 +1732,12 @@ u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) gRfuLinkStatus->LLFReadyFlag = 1; else gRfuLinkStatus->LLFReadyFlag |= 1 << r10; - return r5 + *r8; + return r5 + r8->unk00; } u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) { - const u8 *r5; + const struct RfuHeader *r5; const u8 *sp04; u32 sp00; u8 *r2; @@ -1713,13 +1746,13 @@ u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) if (!r4->dataReadyFlag || !r4->bmSlot) return 0; - r5 = &_Str_RfuHeader[16 * gRfuLinkStatus->connMode]; - sp00 = (r4->state & 0xF) << r5[3] + r5 = &_Str_RfuHeader[gRfuLinkStatus->connMode]; + sp00 = (r4->state & 0xF) << r5->unk03 | r4->payloadSize; if (gRfuLinkStatus->connMode == 1) sp00 |= r4->bmSlot << 18; r2 = (u8 *)&sp00; - for (i = 0; i < *r5; ++i) + for (i = 0; i < r5->unk00; ++i) *(*r6)++ = *r2++; sp04 = r4->src; gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); @@ -1727,7 +1760,7 @@ u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) gRfuLinkStatus->LLFReadyFlag = 16; else gRfuLinkStatus->LLFReadyFlag |= 16 << r8; - return *r5 + r4->payloadSize; + return r5->unk00 + r4->payloadSize; } void rfu_REQ_recvData(void) @@ -1825,3 +1858,115 @@ void rfu_STC_CHILD_analyzeRecvPacket(void) r4 -= r0; } while (!(r4 & 0x8000)); } + +u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) +{ + struct RfuTest sp00; + const struct RfuHeader *r6; + u32 r5; + u8 r4; + u32 r0; + u16 r10; + + r6 = &_Str_RfuHeader[~gRfuLinkStatus->connMode & 1]; + if (r3 < r6->unk00) + return r3; + r5 = 0; + for (r4 = 0; r4 < r6->unk00; ++r4) + r5 |= *r7++ << 8 * r4; + sp00.unk00 = (r5 >> r6->unk01) & r6->unk07; + sp00.unk01 = (r5 >> r6->unk02) & r6->unk08; + sp00.unk02 = (r5 >> r6->unk03) & r6->unk09; + sp00.unk03 = (r5 >> r6->unk04) & r6->unk0A; + sp00.unk04 = (r5 >> r6->unk05) & r6->unk0B; + sp00.unk05 = (r5 >> r6->unk06) & r6->unk0C; + sp00.unk06 = (r5 & r6->unk0E) & r5; + r10 = sp00.unk06 + r6->unk00; + if (sp00.unk00 == 0) + { + if (gRfuLinkStatus->connMode == 1) + { + if ((gRfuLinkStatus->connSlotFlag >> r12) & 1) + { + if (sp00.unk02 == 4) + { + rfu_STC_UNI_receive(r12, &sp00, r7); + } + else if (sp00.unk03 == 0) + { + rfu_STC_NI_receive_Receiver(r12, &sp00, r7); + } + else + { + for (r4 = 0; r4 < NELEMS(gRfuSlotStatusNI); ++r4) + if (((gRfuSlotStatusNI[r4]->sub.send.bmSlot >> r12) & 1) + && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) + break; + if (r4 <= 3) + rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7); + } + } + } + else + { + s32 r5 = gRfuLinkStatus->connSlotFlag & sp00.unk01; + + if (r5) + { + for (r4 = 0; r4 < 4; ++r4) + { + if ((r5 >> r4) & 1) + { + if (sp00.unk02 == 4) + rfu_STC_UNI_receive(r4, &sp00, r7); + else if (sp00.unk03 == 0) + rfu_STC_NI_receive_Receiver(r4, &sp00, r7); + else if ((gRfuLinkStatus->sendSlotNIFlag >> r4) & 1) + rfu_STC_NI_receive_Sender(r4, r4, &sp00, r7); + } + } + } + } + } + return r10; +} + +void rfu_STC_UNI_receive(u8 r7, const struct RfuTest *r6, const u8 *sp00) +{ + u8 *sp04; + u32 r2; + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; + struct UNIRecv *r5 = &r3->sub.recv; + + r5->errorCode = 0; + if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06) + { + r3->sub.recv.state = 73; + r5->errorCode = 0x701; + } + else + { + if (r5->dataBlockFlag) + { + if (r5->newDataFlag) + { + r5->errorCode = 0x709; + goto _081E2F0E; + } + } + else + { + if (r5->newDataFlag) + r5->errorCode = 0x708; + } + r5->state = 0x8042; + r2 = r5->dataSize = r6->unk06; + sp04 = gRfuSlotStatusUNI[r7]->recvBuffer; + gRfuFixed->fastCopyPtr(&sp00, &sp04, r2); + r5->newDataFlag = 1; + r5->state = 0; + } +_081E2F0E: + if (r5->errorCode) + gRfuStatic->recvErrorFlag |= 16 << r7; +} |