diff options
-rw-r--r-- | asm/librfu.s | 1943 | ||||
-rw-r--r-- | common_syms/librfu_rfu.txt | 7 | ||||
-rw-r--r-- | data/librfu_rodata.s | 1 | ||||
-rw-r--r-- | include/constants/trade.h | 4 | ||||
-rw-r--r-- | include/gba/io_reg.h | 2 | ||||
-rw-r--r-- | include/gba/syscall.h | 2 | ||||
-rw-r--r-- | include/librfu.h | 37 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/agb_flash.c | 2 | ||||
-rw-r--r-- | src/librfu_rfu.c | 736 | ||||
-rw-r--r-- | src/librfu_stwi.c | 21 | ||||
-rw-r--r-- | sym_common.txt | 23 |
12 files changed, 782 insertions, 1997 deletions
diff --git a/asm/librfu.s b/asm/librfu.s index 2e17aef23..d3b48f07e 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -5,1949 +5,6 @@ .text - thumb_func_start rfu_initializeAPI -rfu_initializeAPI: @ 81E05B0 - push {r4-r7,lr} - adds r4, r0, 0 - mov r12, r2 - lsls r1, 16 - lsrs r2, r1, 16 - lsls r3, 24 - lsrs r7, r3, 24 - movs r0, 0xF0 - lsls r0, 20 - ands r0, r4 - movs r1, 0x80 - lsls r1, 18 - cmp r0, r1 - bne _081E05D0 - cmp r7, 0 - bne _081E05D8 -_081E05D0: - movs r0, 0x3 - ands r0, r4 - cmp r0, 0 - beq _081E05DC -_081E05D8: - movs r0, 0x2 - b _081E06C6 -_081E05DC: - cmp r7, 0 - beq _081E05E8 - ldr r3, _081E05E4 @ =0x00000e64 - b _081E05EA - .align 2, 0 -_081E05E4: .4byte 0x00000e64 -_081E05E8: - ldr r3, _081E05F4 @ =0x00000504 -_081E05EA: - cmp r2, r3 - bcs _081E05F8 - movs r0, 0x1 - b _081E06C6 - .align 2, 0 -_081E05F4: .4byte 0x00000504 -_081E05F8: - ldr r0, _081E06CC @ =gRfuLinkStatus - str r4, [r0] - ldr r1, _081E06D0 @ =gRfuStatic - adds r0, r4, 0 - adds r0, 0xB4 - str r0, [r1] - ldr r1, _081E06D4 @ =gRfuFixed - adds r0, 0x28 - str r0, [r1] - ldr r2, _081E06D8 @ =gRfuSlotStatusNI - movs r1, 0xDE - lsls r1, 1 - adds r0, r4, r1 - str r0, [r2] - ldr r1, _081E06DC @ =gRfuSlotStatusUNI - movs r3, 0xDF - lsls r3, 2 - adds r0, r4, r3 - str r0, [r1] - movs r5, 0x1 - adds r6, r2, 0 - adds r4, r1, 0 -_081E0624: - lsls r2, r5, 2 - adds r3, r2, r6 - subs r1, r5, 0x1 - lsls r1, 2 - adds r0, r1, r6 - ldr r0, [r0] - adds r0, 0x70 - str r0, [r3] - adds r2, r4 - adds r1, r4 - ldr r0, [r1] - adds r0, 0x1C - str r0, [r2] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _081E0624 - ldr r0, _081E06D4 @ =gRfuFixed - ldr r1, [r0] - adds r1, 0xDC - ldr r4, _081E06DC @ =gRfuSlotStatusUNI - ldr r0, [r4, 0xC] - adds r0, 0x1C - str r0, [r1] - mov r1, r12 - adds r2, r7, 0 - bl STWI_init_all - bl rfu_STC_clearAPIVariables - movs r5, 0 - ldr r3, _081E06D8 @ =gRfuSlotStatusNI - movs r2, 0 -_081E0668: - lsls r1, r5, 2 - adds r0, r1, r3 - ldr r0, [r0] - str r2, [r0, 0x68] - str r2, [r0, 0x6C] - adds r1, r4 - ldr r0, [r1] - str r2, [r0, 0x14] - str r2, [r0, 0x18] - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _081E0668 - ldr r1, _081E06E0 @ =rfu_STC_fastCopy - movs r5, 0x2 - negs r5, r5 - ands r5, r1 - ldr r2, _081E06D4 @ =gRfuFixed - ldr r0, [r2] - adds r4, r0, 0 - adds r4, 0x8 - ldr r0, _081E06E4 @ =rfu_REQ_changeMasterSlave - subs r0, r1 - lsls r0, 15 - lsrs r3, r0, 16 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - ldr r0, _081E06E8 @ =0x0000ffff - cmp r3, r0 - beq _081E06BC - adds r6, r0, 0 -_081E06AA: - ldrh r0, [r5] - strh r0, [r4] - adds r5, 0x2 - adds r4, 0x2 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, r6 - bne _081E06AA -_081E06BC: - ldr r1, [r2] - adds r0, r1, 0 - adds r0, 0x9 - str r0, [r1, 0x4] - movs r0, 0 -_081E06C6: - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081E06CC: .4byte gRfuLinkStatus -_081E06D0: .4byte gRfuStatic -_081E06D4: .4byte gRfuFixed -_081E06D8: .4byte gRfuSlotStatusNI -_081E06DC: .4byte gRfuSlotStatusUNI -_081E06E0: .4byte rfu_STC_fastCopy -_081E06E4: .4byte rfu_REQ_changeMasterSlave -_081E06E8: .4byte 0x0000ffff - thumb_func_end rfu_initializeAPI - - thumb_func_start rfu_STC_clearAPIVariables -rfu_STC_clearAPIVariables: @ 81E06EC - push {r4-r7,lr} - sub sp, 0x4 - ldr r1, _081E0760 @ =0x04000208 - ldrh r0, [r1] - adds r7, r0, 0 - movs r6, 0 - strh r6, [r1] - ldr r5, _081E0764 @ =gRfuStatic - ldr r1, [r5] - ldrb r4, [r1] - mov r0, sp - strh r6, [r0] - ldr r2, _081E0768 @ =0x01000014 - bl CpuSet - ldr r2, [r5] - movs r0, 0x8 - ands r4, r0 - movs r1, 0 - strb r4, [r2] - mov r0, sp - adds r0, 0x2 - strh r1, [r0] - ldr r4, _081E076C @ =gRfuLinkStatus - ldr r1, [r4] - ldr r2, _081E0770 @ =0x0100005a - bl CpuSet - ldr r1, [r4] - movs r0, 0x4 - strb r0, [r1, 0x9] - ldr r0, [r5] - strb r6, [r0, 0x6] - ldr r1, [r4] - movs r0, 0xFF - strb r0, [r1] - bl rfu_clearAllSlot - ldr r0, [r5] - strb r6, [r0, 0x9] - movs r2, 0 - movs r3, 0 -_081E0740: - ldr r0, [r5] - lsls r1, r2, 1 - adds r0, 0x12 - adds r0, r1 - strh r3, [r0] - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E0740 - ldr r0, _081E0760 @ =0x04000208 - strh r7, [r0] - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0760: .4byte 0x04000208 -_081E0764: .4byte gRfuStatic -_081E0768: .4byte 0x01000014 -_081E076C: .4byte gRfuLinkStatus -_081E0770: .4byte 0x0100005a - thumb_func_end rfu_STC_clearAPIVariables - - thumb_func_start rfu_REQ_PARENT_resumeRetransmitAndChange -rfu_REQ_PARENT_resumeRetransmitAndChange: @ 81E0774 - push {lr} - ldr r0, _081E0784 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_ResumeRetransmitAndChangeREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0784: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_PARENT_resumeRetransmitAndChange - - thumb_func_start rfu_UNI_PARENT_getDRAC_ACK -rfu_UNI_PARENT_getDRAC_ACK: @ 81E0788 - push {r4,r5,lr} - adds r4, r0, 0 - movs r0, 0 - strb r0, [r4] - ldr r5, _081E07A0 @ =gRfuLinkStatus - ldr r0, [r5] - ldrb r0, [r0] - cmp r0, 0x1 - beq _081E07A4 - movs r0, 0xC0 - lsls r0, 2 - b _081E07CA - .align 2, 0 -_081E07A0: .4byte gRfuLinkStatus -_081E07A4: - bl rfu_getSTWIRecvBuffer - adds r1, r0, 0 - ldrb r0, [r1] - cmp r0, 0x28 - beq _081E07B4 - cmp r0, 0x36 - bne _081E07C8 -_081E07B4: - ldrb r0, [r1, 0x1] - cmp r0, 0 - bne _081E07C0 - ldr r0, [r5] - ldrb r0, [r0, 0x2] - b _081E07C2 -_081E07C0: - ldrb r0, [r1, 0x4] -_081E07C2: - strb r0, [r4] - movs r0, 0 - b _081E07CA -_081E07C8: - movs r0, 0x10 -_081E07CA: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end rfu_UNI_PARENT_getDRAC_ACK - - thumb_func_start rfu_setTimerInterrupt -rfu_setTimerInterrupt: @ 81E07D0 - push {lr} - adds r2, r0, 0 - adds r0, r1, 0 - lsls r2, 24 - lsrs r2, 24 - adds r1, r2, 0 - bl STWI_init_timer - pop {r0} - bx r0 - thumb_func_end rfu_setTimerInterrupt - - thumb_func_start rfu_getSTWIRecvBuffer -rfu_getSTWIRecvBuffer: @ 81E07E4 - ldr r0, _081E07F0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - bx lr - .align 2, 0 -_081E07F0: .4byte gRfuFixed - thumb_func_end rfu_getSTWIRecvBuffer - - thumb_func_start rfu_setMSCCallback -rfu_setMSCCallback: @ 81E07F4 - push {lr} - bl STWI_set_Callback_S - pop {r0} - bx r0 - thumb_func_end rfu_setMSCCallback - - thumb_func_start rfu_setREQCallback -rfu_setREQCallback: @ 81E0800 - push {lr} - adds r1, r0, 0 - ldr r0, _081E0818 @ =gRfuFixed - ldr r0, [r0] - str r1, [r0] - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - bl rfu_enableREQCallback - pop {r0} - bx r0 - .align 2, 0 -_081E0818: .4byte gRfuFixed - thumb_func_end rfu_setREQCallback - - thumb_func_start rfu_enableREQCallback -rfu_enableREQCallback: @ 81E081C - push {lr} - lsls r0, 24 - cmp r0, 0 - beq _081E0834 - ldr r0, _081E0830 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0x8 - orrs r0, r1 - b _081E083E - .align 2, 0 -_081E0830: .4byte gRfuStatic -_081E0834: - ldr r0, _081E0844 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0xF7 - ands r0, r1 -_081E083E: - strb r0, [r2] - pop {r0} - bx r0 - .align 2, 0 -_081E0844: .4byte gRfuStatic - thumb_func_end rfu_enableREQCallback - - thumb_func_start rfu_STC_REQ_callback -rfu_STC_REQ_callback: @ 81E0848 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r4, r1, 16 - ldr r0, _081E087C @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - ldr r0, _081E0880 @ =gRfuStatic - ldr r0, [r0] - strh r4, [r0, 0x1C] - ldrb r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _081E0876 - ldr r0, _081E0884 @ =gRfuFixed - ldr r0, [r0] - ldr r2, [r0] - adds r0, r5, 0 - adds r1, r4, 0 - bl _call_via_r2 -_081E0876: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E087C: .4byte rfu_CB_defaultCallback -_081E0880: .4byte gRfuStatic -_081E0884: .4byte gRfuFixed - thumb_func_end rfu_STC_REQ_callback - - thumb_func_start rfu_CB_defaultCallback -rfu_CB_defaultCallback: @ 81E0888 - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 16 - lsrs r3, r1, 16 - cmp r0, 0xFF - bne _081E08E4 - ldr r0, _081E08EC @ =gRfuStatic - ldr r0, [r0] - ldrb r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _081E08B2 - ldr r0, _081E08F0 @ =gRfuFixed - ldr r0, [r0] - ldr r2, [r0] - movs r0, 0xFF - adds r1, r3, 0 - bl _call_via_r2 -_081E08B2: - ldr r0, _081E08F4 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r1, [r0, 0x2] - ldrb r0, [r0, 0x3] - adds r5, r0, 0 - orrs r5, r1 - movs r4, 0 -_081E08C0: - adds r0, r5, 0 - asrs r0, r4 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E08D2 - adds r0, r4, 0 - bl rfu_STC_removeLinkData -_081E08D2: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E08C0 - ldr r0, _081E08F4 @ =gRfuLinkStatus - ldr r1, [r0] - movs r0, 0xFF - strb r0, [r1] -_081E08E4: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E08EC: .4byte gRfuStatic -_081E08F0: .4byte gRfuFixed -_081E08F4: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_defaultCallback - - thumb_func_start rfu_waitREQComplete -rfu_waitREQComplete: @ 81E08F8 - push {lr} - bl STWI_poll_CommandEnd - ldr r0, _081E0908 @ =gRfuStatic - ldr r0, [r0] - ldrh r0, [r0, 0x1C] - pop {r1} - bx r1 - .align 2, 0 -_081E0908: .4byte gRfuStatic - thumb_func_end rfu_waitREQComplete - - thumb_func_start rfu_REQ_RFUStatus -rfu_REQ_RFUStatus: @ 81E090C - push {lr} - ldr r0, _081E091C @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - pop {r0} - bx r0 - .align 2, 0 -_081E091C: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_RFUStatus - - thumb_func_start rfu_getRFUStatus -rfu_getRFUStatus: @ 81E0920 - push {r4,r5,lr} - adds r4, r0, 0 - ldr r5, _081E0938 @ =gRfuFixed - ldr r0, [r5] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0x93 - beq _081E093C - movs r0, 0x10 - b _081E0956 - .align 2, 0 -_081E0938: .4byte gRfuFixed -_081E093C: - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E0950 - ldr r0, [r5] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - b _081E0952 -_081E0950: - movs r0, 0xFF -_081E0952: - strb r0, [r4] - movs r0, 0 -_081E0956: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end rfu_getRFUStatus - - thumb_func_start rfu_MBOOT_CHILD_inheritanceLinkStatus -rfu_MBOOT_CHILD_inheritanceLinkStatus: @ 81E095C - push {lr} - ldr r2, _081E0964 @ =_Str_RFU_MBOOT - ldr r3, _081E0968 @ =0x30000F0 - b _081E0976 - .align 2, 0 -_081E0964: .4byte _Str_RFU_MBOOT -_081E0968: .4byte 0x30000F0 -_081E096C: - ldrb r0, [r3] - adds r3, 0x1 - adds r2, 0x1 - cmp r1, r0 - bne _081E09CC -_081E0976: - ldrb r1, [r2] - cmp r1, 0 - bne _081E096C - movs r2, 0xC0 - lsls r2, 18 - movs r3, 0 - movs r1, 0 -_081E0984: - ldrh r0, [r2] - adds r0, r3, r0 - lsls r0, 16 - lsrs r3, r0, 16 - adds r2, 0x2 - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x59 - bls _081E0984 - ldr r0, _081E09C0 @ =0x30000FA - ldrh r0, [r0] - cmp r3, r0 - bne _081E09CC - movs r0, 0xC0 - lsls r0, 18 - ldr r1, _081E09C4 @ =gRfuLinkStatus - ldr r1, [r1] - movs r2, 0x5A - bl CpuSet - ldr r0, _081E09C8 @ =gRfuStatic - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0x80 - orrs r0, r1 - strb r0, [r2] - movs r0, 0 - b _081E09CE - .align 2, 0 -_081E09C0: .4byte 0x30000FA -_081E09C4: .4byte gRfuLinkStatus -_081E09C8: .4byte gRfuStatic -_081E09CC: - movs r0, 0x1 -_081E09CE: - pop {r1} - bx r1 - thumb_func_end rfu_MBOOT_CHILD_inheritanceLinkStatus - - thumb_func_start rfu_REQ_stopMode -rfu_REQ_stopMode: @ 81E09D4 - push {lr} - ldr r0, _081E09F4 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081E09FC - movs r0, 0x3D - movs r1, 0x6 - bl rfu_STC_REQ_callback - ldr r0, _081E09F8 @ =gRfuState - ldr r1, [r0] - ldrh r0, [r1, 0x12] - movs r0, 0x6 - strh r0, [r1, 0x12] - b _081E0A72 - .align 2, 0 -_081E09F4: .4byte 0x04000208 -_081E09F8: .4byte gRfuState -_081E09FC: - bl AgbRFU_SoftReset - bl rfu_STC_clearAPIVariables - movs r0, 0x8 - bl sub_81E349C - ldr r1, _081E0A4C @ =0x00008001 - cmp r0, r1 - bne _081E0A60 - ldr r0, _081E0A50 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r2, _081E0A54 @ =0x04000100 - adds r1, r0, r2 - movs r0, 0 - str r0, [r1] - movs r0, 0x83 - lsls r0, 16 - str r0, [r1] - ldr r0, [r1] - lsls r0, 16 - ldr r2, _081E0A58 @ =0x0105ffff - ldr r3, _081E0A5C @ =rfu_CB_stopMode - cmp r0, r2 - bhi _081E0A3A -_081E0A32: - ldr r0, [r1] - lsls r0, 16 - cmp r0, r2 - bls _081E0A32 -_081E0A3A: - movs r0, 0 - str r0, [r1] - adds r0, r3, 0 - bl STWI_set_Callback_M - bl STWI_send_StopModeREQ - b _081E0A72 - .align 2, 0 -_081E0A4C: .4byte 0x00008001 -_081E0A50: .4byte gRfuState -_081E0A54: .4byte 0x04000100 -_081E0A58: .4byte 0x0105ffff -_081E0A5C: .4byte rfu_CB_stopMode -_081E0A60: - ldr r1, _081E0A78 @ =0x04000128 - movs r2, 0x80 - lsls r2, 6 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0x3D - movs r1, 0 - bl rfu_STC_REQ_callback -_081E0A72: - pop {r0} - bx r0 - .align 2, 0 -_081E0A78: .4byte 0x04000128 - thumb_func_end rfu_REQ_stopMode - - thumb_func_start rfu_CB_stopMode -rfu_CB_stopMode: @ 81E0A7C - push {r4,lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r2, r1, 0 - cmp r2, 0 - bne _081E0A96 - ldr r1, _081E0AA4 @ =0x04000128 - movs r4, 0x80 - lsls r4, 6 - adds r0, r4, 0 - strh r0, [r1] -_081E0A96: - adds r0, r3, 0 - adds r1, r2, 0 - bl rfu_STC_REQ_callback - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081E0AA4: .4byte 0x04000128 - thumb_func_end rfu_CB_stopMode - - thumb_func_start rfu_REQBN_softReset_and_checkID -rfu_REQBN_softReset_and_checkID: @ 81E0AA8 - push {lr} - ldr r0, _081E0AB8 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081E0ABC - movs r0, 0x1 - negs r0, r0 - b _081E0ADC - .align 2, 0 -_081E0AB8: .4byte 0x04000208 -_081E0ABC: - bl AgbRFU_SoftReset - bl rfu_STC_clearAPIVariables - movs r0, 0x1E - bl sub_81E349C - adds r2, r0, 0 - cmp r2, 0 - bne _081E0ADA - ldr r1, _081E0AE0 @ =0x04000128 - movs r3, 0x80 - lsls r3, 6 - adds r0, r3, 0 - strh r0, [r1] -_081E0ADA: - adds r0, r2, 0 -_081E0ADC: - pop {r1} - bx r1 - .align 2, 0 -_081E0AE0: .4byte 0x04000128 - thumb_func_end rfu_REQBN_softReset_and_checkID - - thumb_func_start rfu_REQ_reset -rfu_REQ_reset: @ 81E0AE4 - push {lr} - ldr r0, _081E0AF4 @ =rfu_CB_reset - bl STWI_set_Callback_M - bl STWI_send_ResetREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0AF4: .4byte rfu_CB_reset - thumb_func_end rfu_REQ_reset - - thumb_func_start rfu_CB_reset -rfu_CB_reset: @ 81E0AF8 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r4, r1, 0 - cmp r4, 0 - bne _081E0B0C - bl rfu_STC_clearAPIVariables -_081E0B0C: - adds r0, r5, 0 - adds r1, r4, 0 - bl rfu_STC_REQ_callback - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_CB_reset - - thumb_func_start rfu_REQ_configSystem -rfu_REQ_configSystem: @ 81E0B1C - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 24 - lsrs r5, 24 - lsls r2, 24 - lsrs r6, r2, 24 - ldr r0, _081E0B54 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - movs r0, 0x3 - ands r4, r0 - movs r0, 0x3C - orrs r4, r0 - adds r0, r4, 0 - adds r1, r5, 0 - adds r2, r6, 0 - bl STWI_send_SystemConfigREQ - cmp r6, 0 - bne _081E0B5C - ldr r0, _081E0B58 @ =gRfuStatic - ldr r1, [r0] - movs r0, 0x1 - strh r0, [r1, 0x1A] - b _081E0B76 - .align 2, 0 -_081E0B54: .4byte rfu_STC_REQ_callback -_081E0B58: .4byte gRfuStatic -_081E0B5C: - ldr r5, _081E0B7C @ =0x04000208 - ldrh r4, [r5] - movs r0, 0 - strh r0, [r5] - movs r0, 0x96 - lsls r0, 2 - adds r1, r6, 0 - bl Div - ldr r1, _081E0B80 @ =gRfuStatic - ldr r1, [r1] - strh r0, [r1, 0x1A] - strh r4, [r5] -_081E0B76: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E0B7C: .4byte 0x04000208 -_081E0B80: .4byte gRfuStatic - thumb_func_end rfu_REQ_configSystem - - thumb_func_start rfu_REQ_configGameData -rfu_REQ_configGameData: @ 81E0B84 - push {r4-r7,lr} - sub sp, 0x10 - adds r4, r2, 0 - adds r7, r3, 0 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r2, r1, 16 - adds r5, r4, 0 - mov r0, sp - strb r1, [r0] - lsrs r2, 24 - strb r2, [r0, 0x1] - cmp r6, 0 - beq _081E0BAA - movs r1, 0x80 - orrs r2, r1 - movs r1, 0 - orrs r2, r1 - strb r2, [r0, 0x1] -_081E0BAA: - movs r2, 0x2 - ldr r0, _081E0C0C @ =rfu_CB_configGameData - mov r12, r0 -_081E0BB0: - mov r3, sp - adds r1, r3, r2 - ldrb r0, [r4] - strb r0, [r1] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0xE - bls _081E0BB0 - movs r3, 0 - adds r1, r7, 0 - movs r2, 0 -_081E0BCA: - ldrb r0, [r1] - adds r0, r3, r0 - lsls r0, 24 - adds r1, 0x1 - lsrs r0, 24 - ldrb r3, [r5] - adds r0, r3 - lsls r0, 24 - lsrs r3, r0, 24 - adds r5, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x7 - bls _081E0BCA - mov r1, sp - mvns r0, r3 - strb r0, [r1, 0xF] - cmp r6, 0 - beq _081E0BF6 - movs r0, 0 - strb r0, [r1, 0xE] -_081E0BF6: - mov r0, r12 - bl STWI_set_Callback_M - mov r0, sp - adds r1, r7, 0 - bl STWI_send_GameConfigREQ - add sp, 0x10 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0C0C: .4byte rfu_CB_configGameData - thumb_func_end rfu_REQ_configGameData - - thumb_func_start rfu_CB_configGameData -rfu_CB_configGameData: @ 81E0C10 - push {r4-r7,lr} - lsls r0, 24 - lsrs r0, 24 - mov r12, r0 - lsls r1, 16 - lsrs r7, r1, 16 - cmp r7, 0 - bne _081E0C9A - ldr r0, _081E0C54 @ =gRfuState - ldr r0, [r0] - ldr r1, [r0, 0x24] - ldr r0, _081E0C58 @ =gRfuLinkStatus - ldr r6, [r0] - ldrb r2, [r1, 0x4] - adds r5, r6, 0 - adds r5, 0x98 - strh r2, [r5] - ldrb r0, [r1, 0x5] - lsls r3, r0, 8 - orrs r3, r2 - strh r3, [r5] - adds r4, r1, 0x6 - movs r1, 0x80 - lsls r1, 8 - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _081E0C5C - eors r3, r1 - strh r3, [r5] - adds r1, r6, 0 - adds r1, 0x97 - movs r0, 0x1 - b _081E0C62 - .align 2, 0 -_081E0C54: .4byte gRfuState -_081E0C58: .4byte gRfuLinkStatus -_081E0C5C: - adds r1, r6, 0 - adds r1, 0x97 - movs r0, 0 -_081E0C62: - strb r0, [r1] - movs r2, 0 - ldr r3, _081E0CA8 @ =gRfuLinkStatus -_081E0C68: - ldr r0, [r3] - adds r0, 0x9A - adds r0, r2 - ldrb r1, [r4] - strb r1, [r0] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0xC - bls _081E0C68 - adds r4, 0x1 - movs r2, 0 - ldr r3, _081E0CA8 @ =gRfuLinkStatus -_081E0C84: - ldr r0, [r3] - adds r0, 0xA9 - adds r0, r2 - ldrb r1, [r4] - strb r1, [r0] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x7 - bls _081E0C84 -_081E0C9A: - mov r0, r12 - adds r1, r7, 0 - bl rfu_STC_REQ_callback - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0CA8: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_configGameData - - thumb_func_start rfu_REQ_startSearchChild -rfu_REQ_startSearchChild: @ 81E0CAC - push {lr} - ldr r0, _081E0CDC @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081E0CE4 - ldr r0, _081E0CE0 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E0CEA - movs r0, 0x1 - bl rfu_STC_clearLinkStatus - b _081E0CEA - .align 2, 0 -_081E0CDC: .4byte rfu_CB_defaultCallback -_081E0CE0: .4byte gRfuFixed -_081E0CE4: - movs r0, 0x19 - bl rfu_STC_REQ_callback -_081E0CEA: - ldr r0, _081E0CF8 @ =rfu_CB_startSearchChild - bl STWI_set_Callback_M - bl STWI_send_SC_StartREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0CF8: .4byte rfu_CB_startSearchChild - thumb_func_end rfu_REQ_startSearchChild - - thumb_func_start rfu_CB_startSearchChild -rfu_CB_startSearchChild: @ 81E0CFC - push {lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r2, r1, 0 - cmp r2, 0 - bne _081E0D14 - ldr r0, _081E0D20 @ =gRfuStatic - ldr r1, [r0] - movs r0, 0x1 - strb r0, [r1, 0x9] -_081E0D14: - adds r0, r3, 0 - adds r1, r2, 0 - bl rfu_STC_REQ_callback - pop {r0} - bx r0 - .align 2, 0 -_081E0D20: .4byte gRfuStatic - thumb_func_end rfu_CB_startSearchChild - - thumb_func_start rfu_STC_clearLinkStatus -rfu_STC_clearLinkStatus: @ 81E0D24 - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl rfu_clearAllSlot - cmp r4, 0 - beq _081E0D4C - mov r0, sp - movs r5, 0 - strh r5, [r0] - ldr r4, _081E0D80 @ =gRfuLinkStatus - ldr r1, [r4] - adds r1, 0x14 - ldr r2, _081E0D84 @ =0x01000040 - bl CpuSet - ldr r0, [r4] - strb r5, [r0, 0x8] -_081E0D4C: - movs r1, 0 - ldr r2, _081E0D80 @ =gRfuLinkStatus - adds r4, r2, 0 - movs r3, 0 -_081E0D54: - ldr r0, [r4] - adds r0, 0xA - adds r0, r1 - strb r3, [r0] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x3 - bls _081E0D54 - ldr r0, [r2] - movs r1, 0 - strb r1, [r0, 0x1] - ldr r0, [r2] - strb r1, [r0, 0x2] - ldr r0, [r2] - strb r1, [r0, 0x3] - ldr r0, [r2] - strb r1, [r0, 0x7] - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081E0D80: .4byte gRfuLinkStatus -_081E0D84: .4byte 0x01000040 - thumb_func_end rfu_STC_clearLinkStatus - - thumb_func_start rfu_REQ_pollSearchChild -rfu_REQ_pollSearchChild: @ 81E0D88 - push {lr} - ldr r0, _081E0D98 @ =rfu_CB_pollAndEndSearchChild - bl STWI_set_Callback_M - bl STWI_send_SC_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0D98: .4byte rfu_CB_pollAndEndSearchChild - thumb_func_end rfu_REQ_pollSearchChild - - thumb_func_start rfu_REQ_endSearchChild -rfu_REQ_endSearchChild: @ 81E0D9C - push {lr} - ldr r0, _081E0DAC @ =rfu_CB_pollAndEndSearchChild - bl STWI_set_Callback_M - bl STWI_send_SC_EndREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0DAC: .4byte rfu_CB_pollAndEndSearchChild - thumb_func_end rfu_REQ_endSearchChild - - thumb_func_start rfu_CB_pollAndEndSearchChild -rfu_CB_pollAndEndSearchChild: @ 81E0DB0 - push {r4-r6,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 16 - lsrs r6, r1, 16 - cmp r6, 0 - bne _081E0DC2 - bl rfu_STC_readChildList -_081E0DC2: - cmp r4, 0x1A - bne _081E0E04 - ldr r5, _081E0DF8 @ =gRfuLinkStatus - ldr r0, [r5] - adds r0, 0x94 - ldrh r0, [r0] - cmp r0, 0 - bne _081E0E20 - ldr r0, _081E0DFC @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_SystemStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E0E20 - ldr r1, [r5] - ldr r0, _081E0E00 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrh r0, [r0, 0x4] - adds r1, 0x94 - strh r0, [r1] - b _081E0E20 - .align 2, 0 -_081E0DF8: .4byte gRfuLinkStatus -_081E0DFC: .4byte rfu_CB_defaultCallback -_081E0E00: .4byte gRfuFixed -_081E0E04: - cmp r4, 0x1B - bne _081E0E20 - ldr r0, _081E0E30 @ =gRfuLinkStatus - ldr r1, [r0] - ldrb r0, [r1] - cmp r0, 0xFF - bne _081E0E18 - adds r1, 0x94 - movs r0, 0 - strh r0, [r1] -_081E0E18: - ldr r0, _081E0E34 @ =gRfuStatic - ldr r1, [r0] - movs r0, 0 - strb r0, [r1, 0x9] -_081E0E20: - adds r0, r4, 0 - adds r1, r6, 0 - bl rfu_STC_REQ_callback - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081E0E30: .4byte gRfuLinkStatus -_081E0E34: .4byte gRfuStatic - thumb_func_end rfu_CB_pollAndEndSearchChild - - thumb_func_start rfu_STC_readChildList -rfu_STC_readChildList: @ 81E0E38 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - ldr r1, _081E0F64 @ =gRfuFixed - ldr r0, [r1] - adds r0, 0xDC - ldr r0, [r0] - ldrb r2, [r0, 0x1] - mov r8, r2 - adds r4, r1, 0 - cmp r2, 0 - beq _081E0E96 - ldr r5, [r0, 0x4] - ldr r0, _081E0F68 @ =rfu_CB_defaultCallback - bl STWI_set_Callback_M - bl STWI_send_LinkStatusREQ - bl STWI_poll_CommandEnd - lsls r0, 16 - cmp r0, 0 - bne _081E0E8A - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - adds r4, r0, 0x4 - movs r2, 0 -_081E0E76: - mov r0, sp - adds r1, r0, r2 - ldrb r0, [r4] - strb r0, [r1] - adds r4, 0x1 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _081E0E76 -_081E0E8A: - ldr r0, _081E0F64 @ =gRfuFixed - ldr r1, [r0] - adds r1, 0xDC - ldr r1, [r1] - str r5, [r1, 0x4] - adds r4, r0, 0 -_081E0E96: - ldr r0, [r4] - adds r0, 0xDC - ldr r0, [r0] - adds r4, r0, 0x4 - mov r1, r8 - cmp r1, 0 - beq _081E0F52 - ldr r2, _081E0F6C @ =gRfuStatic - mov r9, r2 - ldr r7, _081E0F70 @ =gRfuLinkStatus - mov r10, r9 -_081E0EAC: - ldrb r2, [r4, 0x2] - adds r5, r2, 0 - cmp r2, 0x3 - bhi _081E0F42 - ldr r1, [r7] - ldrb r0, [r1, 0x2] - asrs r0, r2 - movs r6, 0x1 - ands r0, r6 - cmp r0, 0 - bne _081E0F42 - ldrb r3, [r1, 0x3] - asrs r3, r2 - ands r3, r6 - cmp r3, 0 - bne _081E0F42 - mov r1, sp - adds r0, r1, r2 - ldrb r0, [r0] - mov r12, r10 - cmp r0, 0 - beq _081E0EE6 - mov r0, r9 - ldr r1, [r0] - adds r1, 0xE - adds r1, r2 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] -_081E0EE6: - mov r1, r9 - ldr r0, [r1] - adds r0, 0xE - adds r1, r0, r5 - ldrb r0, [r1] - cmp r0, 0x3 - bls _081E0F42 - strb r3, [r1] - ldr r0, [r7] - adds r0, 0xA - adds r0, r5 - movs r1, 0xFF - strb r1, [r0] - ldr r2, [r7] - adds r0, r6, 0 - lsls r0, r5 - ldrb r1, [r2, 0x2] - orrs r0, r1 - strb r0, [r2, 0x2] - ldr r1, [r7] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r1, [r7] - lsls r3, r5, 5 - adds r1, r3 - ldrh r0, [r4] - strh r0, [r1, 0x14] - strb r5, [r1, 0x16] - ldr r0, [r7] - strb r6, [r0] - mov r0, r12 - ldr r2, [r0] - ldrb r1, [r2] - movs r0, 0x7F - ands r0, r1 - strb r0, [r2] - mov r2, r12 - ldr r1, [r2] - lsls r0, r5, 1 - adds r1, 0x12 - adds r1, r0 - ldr r0, [r7] - adds r0, r3 - ldrh r0, [r0, 0x14] - strh r0, [r1] -_081E0F42: - mov r0, r8 - subs r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - adds r4, 0x4 - cmp r0, 0 - bne _081E0EAC -_081E0F52: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E0F64: .4byte gRfuFixed -_081E0F68: .4byte rfu_CB_defaultCallback -_081E0F6C: .4byte gRfuStatic -_081E0F70: .4byte gRfuLinkStatus - thumb_func_end rfu_STC_readChildList - - thumb_func_start rfu_REQ_startSearchParent -rfu_REQ_startSearchParent: @ 81E0F74 - push {lr} - ldr r0, _081E0F84 @ =rfu_CB_startSearchParent - bl STWI_set_Callback_M - bl STWI_send_SP_StartREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0F84: .4byte rfu_CB_startSearchParent - thumb_func_end rfu_REQ_startSearchParent - - thumb_func_start rfu_CB_startSearchParent -rfu_CB_startSearchParent: @ 81E0F88 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r4, r1, 0 - cmp r4, 0 - bne _081E0F9E - movs r0, 0 - bl rfu_STC_clearLinkStatus -_081E0F9E: - adds r0, r5, 0 - adds r1, r4, 0 - bl rfu_STC_REQ_callback - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_CB_startSearchParent - - thumb_func_start rfu_REQ_pollSearchParent -rfu_REQ_pollSearchParent: @ 81E0FAC - push {lr} - ldr r0, _081E0FBC @ =rfu_CB_pollSearchParent - bl STWI_set_Callback_M - bl STWI_send_SP_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0FBC: .4byte rfu_CB_pollSearchParent - thumb_func_end rfu_REQ_pollSearchParent - - thumb_func_start rfu_CB_pollSearchParent -rfu_CB_pollSearchParent: @ 81E0FC0 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r1, 16 - adds r4, r1, 0 - cmp r4, 0 - bne _081E0FD4 - bl rfu_STC_readParentCandidateList -_081E0FD4: - adds r0, r5, 0 - adds r1, r4, 0 - bl rfu_STC_REQ_callback - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_CB_pollSearchParent - - thumb_func_start rfu_REQ_endSearchParent -rfu_REQ_endSearchParent: @ 81E0FE4 - push {lr} - ldr r0, _081E0FF4 @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - bl STWI_send_SP_EndREQ - pop {r0} - bx r0 - .align 2, 0 -_081E0FF4: .4byte rfu_STC_REQ_callback - thumb_func_end rfu_REQ_endSearchParent - - thumb_func_start rfu_STC_readParentCandidateList -rfu_STC_readParentCandidateList: @ 81E0FF8 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - mov r0, sp - movs r4, 0 - strh r4, [r0] - ldr r5, _081E10A0 @ =gRfuLinkStatus - ldr r1, [r5] - adds r1, 0x14 - ldr r2, _081E10A4 @ =0x01000040 - bl CpuSet - ldr r0, _081E10A8 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r2, [r0] - ldrb r7, [r2, 0x1] - adds r2, 0x4 - ldr r0, [r5] - strb r4, [r0, 0x8] - movs r6, 0 - cmp r7, 0 - beq _081E10FC - mov r12, r5 - ldr r0, _081E10AC @ =0x00007fff - mov r8, r0 -_081E102E: - subs r0, r7, 0x7 - lsls r0, 24 - lsrs r7, r0, 24 - adds r1, r2, 0x6 - adds r2, 0x13 - ldrb r0, [r2] - mvns r0, r0 - lsls r0, 24 - lsrs r5, r0, 24 - adds r2, 0x1 - movs r4, 0 - movs r3, 0 - adds r6, 0x1 -_081E1048: - ldrb r0, [r2] - adds r0, r4, r0 - lsls r0, 24 - adds r2, 0x1 - lsrs r0, 24 - ldrb r4, [r1] - adds r0, r4 - lsls r0, 24 - lsrs r4, r0, 24 - adds r1, 0x1 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x7 - bls _081E1048 - cmp r4, r5 - bne _081E10F0 - subs r2, 0x1C - mov r0, r12 - ldr r1, [r0] - ldrb r0, [r1, 0x8] - lsls r0, 5 - adds r0, 0x14 - adds r4, r1, r0 - ldrh r0, [r2] - movs r3, 0 - strh r0, [r4] - adds r2, 0x2 - ldrb r0, [r2] - strb r0, [r4, 0x2] - adds r2, 0x2 - ldrh r1, [r2] - mov r0, r8 - ands r0, r1 - strh r0, [r4, 0x4] - ldrh r1, [r2] - movs r0, 0x80 - lsls r0, 8 - ands r0, r1 - cmp r0, 0 - beq _081E10B0 - movs r0, 0x1 - strb r0, [r4, 0x3] - b _081E10B2 - .align 2, 0 -_081E10A0: .4byte gRfuLinkStatus -_081E10A4: .4byte 0x01000040 -_081E10A8: .4byte gRfuFixed -_081E10AC: .4byte 0x00007fff -_081E10B0: - strb r3, [r4, 0x3] -_081E10B2: - adds r2, 0x2 - movs r3, 0 - adds r5, r4, 0 - adds r5, 0x15 - adds r4, 0x6 -_081E10BC: - adds r1, r4, r3 - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0xC - bls _081E10BC - adds r2, 0x1 - movs r3, 0 - adds r4, r5, 0 -_081E10D4: - adds r1, r4, r3 - ldrb r0, [r2] - strb r0, [r1] - adds r2, 0x1 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x7 - bls _081E10D4 - mov r4, r12 - ldr r1, [r4] - ldrb r0, [r1, 0x8] - adds r0, 0x1 - strb r0, [r1, 0x8] -_081E10F0: - lsls r0, r6, 24 - lsrs r6, r0, 24 - cmp r6, 0x3 - bhi _081E10FC - cmp r7, 0 - bne _081E102E -_081E10FC: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end rfu_STC_readParentCandidateList - - thumb_func_start rfu_REQ_startConnectParent -rfu_REQ_startConnectParent: @ 81E1108 - push {r4,r5,lr} - lsls r0, 16 - lsrs r4, r0, 16 - movs r3, 0 - movs r2, 0 - ldr r1, _081E1154 @ =gRfuLinkStatus - ldr r0, [r1] - ldrh r0, [r0, 0x14] - cmp r0, r4 - beq _081E1134 - adds r5, r1, 0 -_081E111E: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bhi _081E1134 - ldr r0, [r5] - lsls r1, r2, 5 - adds r0, r1 - ldrh r0, [r0, 0x14] - cmp r0, r4 - bne _081E111E -_081E1134: - cmp r2, 0x4 - bne _081E113C - movs r3, 0x80 - lsls r3, 1 -_081E113C: - cmp r3, 0 - bne _081E1160 - ldr r0, _081E1158 @ =gRfuStatic - ldr r0, [r0] - strh r4, [r0, 0x1E] - ldr r0, _081E115C @ =rfu_STC_REQ_callback - bl STWI_set_Callback_M - adds r0, r4, 0 - bl STWI_send_CP_StartREQ - b _081E1168 - .align 2, 0 -_081E1154: .4byte gRfuLinkStatus -_081E1158: .4byte gRfuStatic -_081E115C: .4byte rfu_STC_REQ_callback -_081E1160: - movs r0, 0x1F - adds r1, r3, 0 - bl rfu_STC_REQ_callback -_081E1168: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end rfu_REQ_startConnectParent - - thumb_func_start rfu_REQ_pollConnectParent -rfu_REQ_pollConnectParent: @ 81E1170 - push {lr} - ldr r0, _081E1180 @ =rfu_CB_pollConnectParent - bl STWI_set_Callback_M - bl STWI_send_CP_PollingREQ - pop {r0} - bx r0 - .align 2, 0 -_081E1180: .4byte rfu_CB_pollConnectParent - thumb_func_end rfu_REQ_pollConnectParent - - thumb_func_start rfu_CB_pollConnectParent -rfu_CB_pollConnectParent: @ 81E1184 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x2C - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x24] - lsls r1, 16 - lsrs r1, 16 - str r1, [sp, 0x28] - cmp r1, 0 - bne _081E1286 - ldr r0, _081E1240 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r0, [r0] - ldrh r5, [r0, 0x4] - ldrb r1, [r0, 0x6] - mov r10, r1 - ldrb r0, [r0, 0x7] - cmp r0, 0 - bne _081E1286 - movs r0, 0x80 - lsls r0, 17 - lsls r0, r1 - lsrs r2, r0, 24 - ldr r4, _081E1244 @ =gRfuLinkStatus - ldr r3, [r4] - ldrb r1, [r3, 0x2] - adds r0, r2, 0 - ands r0, r1 - cmp r0, 0 - bne _081E1286 - adds r0, r2, 0 - orrs r0, r1 - strb r0, [r3, 0x2] - ldr r1, [r4] - ldrb r0, [r1, 0x3] - bics r0, r2 - strb r0, [r1, 0x3] - ldr r1, [r4] - adds r0, r1, 0 - adds r0, 0x94 - movs r2, 0 - strh r5, [r0] - ldrb r0, [r1, 0x1] - adds r0, 0x1 - strb r0, [r1, 0x1] - ldr r0, [r4] - strb r2, [r0] - ldr r3, _081E1248 @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x80 - orrs r0, r1 - strb r0, [r2] - movs r5, 0 - adds r7, r4, 0 - add r6, sp, 0x20 - movs r0, 0 - mov r8, r0 -_081E1202: - ldr r2, [r7] - lsls r4, r5, 5 - adds r0, r2, r4 - ldr r1, [r3] - ldrh r0, [r0, 0x14] - ldrh r1, [r1, 0x1E] - cmp r0, r1 - bne _081E125A - ldrb r0, [r2, 0x8] - cmp r0, 0 - beq _081E1250 - mov r9, sp - adds r0, r4, 0 - adds r0, 0x14 - adds r0, r2, r0 - mov r1, sp - movs r2, 0x10 - bl CpuSet - mov r1, r8 - strh r1, [r6] - ldr r1, [r7] - adds r1, 0x14 - adds r0, r6, 0 - ldr r2, _081E124C @ =0x01000040 - bl CpuSet - ldr r0, [r7] - mov r1, r8 - strb r1, [r0, 0x8] - b _081E1264 - .align 2, 0 -_081E1240: .4byte gRfuFixed -_081E1244: .4byte gRfuLinkStatus -_081E1248: .4byte gRfuStatic -_081E124C: .4byte 0x01000040 -_081E1250: - adds r0, r4, 0 - adds r0, 0x14 - adds r2, r0 - mov r9, r2 - b _081E1264 -_081E125A: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x3 - bls _081E1202 -_081E1264: - cmp r5, 0x3 - bhi _081E1286 - ldr r4, _081E12A0 @ =gRfuLinkStatus - mov r0, r10 - lsls r5, r0, 5 - adds r0, r5, 0 - adds r0, 0x14 - ldr r1, [r4] - adds r1, r0 - mov r0, r9 - movs r2, 0x10 - bl CpuSet - ldr r0, [r4] - adds r0, r5 - mov r1, r10 - strb r1, [r0, 0x16] -_081E1286: - ldr r0, [sp, 0x24] - ldr r1, [sp, 0x28] - bl rfu_STC_REQ_callback - add sp, 0x2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081E12A0: .4byte gRfuLinkStatus - thumb_func_end rfu_CB_pollConnectParent - - thumb_func_start rfu_getConnectParentStatus -rfu_getConnectParentStatus: @ 81E12A4 - push {lr} - adds r3, r0, 0 - movs r0, 0xFF - strb r0, [r3] - ldr r0, _081E12C4 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r2, [r0] - ldrb r0, [r2] - adds r0, 0x60 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _081E12C8 - movs r0, 0x10 - b _081E12D4 - .align 2, 0 -_081E12C4: .4byte gRfuFixed -_081E12C8: - adds r2, 0x6 - ldrb r0, [r2] - strb r0, [r1] - ldrb r0, [r2, 0x1] - strb r0, [r3] - movs r0, 0 -_081E12D4: - pop {r1} - bx r1 - thumb_func_end rfu_getConnectParentStatus - - thumb_func_start rfu_REQ_endConnectParent -rfu_REQ_endConnectParent: @ 81E12D8 - push {lr} - ldr r0, _081E1304 @ =rfu_CB_pollConnectParent - bl STWI_set_Callback_M - bl STWI_send_CP_EndREQ - ldr r0, _081E1308 @ =gRfuFixed - ldr r0, [r0] - adds r0, 0xDC - ldr r1, [r0] - ldrb r0, [r1, 0x6] - cmp r0, 0x3 - bhi _081E1300 - ldr r0, _081E130C @ =gRfuStatic - ldr r0, [r0] - adds r0, 0xA - ldrb r1, [r1, 0x6] - adds r0, r1 - movs r1, 0 - strb r1, [r0] -_081E1300: - pop {r0} - bx r0 - .align 2, 0 -_081E1304: .4byte rfu_CB_pollConnectParent -_081E1308: .4byte gRfuFixed -_081E130C: .4byte gRfuStatic - thumb_func_end rfu_REQ_endConnectParent - - thumb_func_start rfu_syncVBlank -rfu_syncVBlank: @ 81E1310 - push {r4,r5,lr} - bl rfu_NI_checkCommFailCounter - ldr r0, _081E1358 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, 0xFF - beq _081E13E8 - ldr r4, _081E135C @ =gRfuStatic - ldr r1, [r4] - ldrb r0, [r1, 0x6] - cmp r0, 0 - beq _081E132E - subs r0, 0x1 - strb r0, [r1, 0x6] -_081E132E: - bl rfu_getMasterSlave - lsls r0, 24 - lsrs r3, r0, 24 - ldr r2, [r4] - ldrb r1, [r2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _081E1360 - cmp r3, 0 - bne _081E136E - movs r0, 0x4 - orrs r0, r1 - strb r0, [r2] - ldr r1, [r4] - movs r0, 0xB4 - lsls r0, 1 - strh r0, [r1, 0x20] - b _081E136A - .align 2, 0 -_081E1358: .4byte gRfuLinkStatus -_081E135C: .4byte gRfuStatic -_081E1360: - cmp r3, 0 - beq _081E1380 - movs r0, 0xFB - ands r0, r1 - strb r0, [r2] -_081E136A: - cmp r3, 0 - beq _081E1380 -_081E136E: - ldr r3, _081E137C @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0xFD - ands r0, r1 - b _081E138A - .align 2, 0 -_081E137C: .4byte gRfuStatic -_081E1380: - ldr r3, _081E13DC @ =gRfuStatic - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x2 - orrs r0, r1 -_081E138A: - strb r0, [r2] - ldr r3, [r3] - ldrb r1, [r3] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _081E13E8 - ldrh r0, [r3, 0x20] - cmp r0, 0 - bne _081E13E4 - movs r0, 0xFB - ands r0, r1 - strb r0, [r3] - ldr r0, _081E13E0 @ =gRfuLinkStatus - ldr r0, [r0] - ldrb r1, [r0, 0x2] - ldrb r0, [r0, 0x3] - adds r5, r0, 0 - orrs r5, r1 - movs r4, 0 -_081E13B2: - adds r0, r5, 0 - asrs r0, r4 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _081E13C4 - adds r0, r4, 0 - bl rfu_STC_removeLinkData -_081E13C4: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3 - bls _081E13B2 - ldr r0, _081E13E0 @ =gRfuLinkStatus - ldr r1, [r0] - movs r0, 0xFF - strb r0, [r1] - movs r0, 0x1 - b _081E13EA - .align 2, 0 -_081E13DC: .4byte gRfuStatic -_081E13E0: .4byte gRfuLinkStatus -_081E13E4: - subs r0, 0x1 - strh r0, [r3, 0x20] -_081E13E8: - movs r0, 0 -_081E13EA: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end rfu_syncVBlank - thumb_func_start rfu_REQBN_watchLink rfu_REQBN_watchLink: @ 81E13F0 push {r4-r7,lr} diff --git a/common_syms/librfu_rfu.txt b/common_syms/librfu_rfu.txt new file mode 100644 index 000000000..142895733 --- /dev/null +++ b/common_syms/librfu_rfu.txt @@ -0,0 +1,7 @@ +gRfuState +gRfuSlotStatusUNI +gRfuSlotStatusNI +gRfuLinkStatus +gRfuStatic +gRfuFixed +gUnknown_3007470 diff --git a/data/librfu_rodata.s b/data/librfu_rodata.s index c6ca84f4b..d5e847aa3 100644 --- a/data/librfu_rodata.s +++ b/data/librfu_rodata.s @@ -25,4 +25,3 @@ _Str_RFU_MBOOT:: .align 2 _Str_Sio32ID:: .asciz "NINTENDOSio32ID_030820" - diff --git a/include/constants/trade.h b/include/constants/trade.h index b1371caab..b22cd26d2 100644 --- a/include/constants/trade.h +++ b/include/constants/trade.h @@ -1,4 +1,4 @@ - #ifndef GUARD_CONSTANTS_TRADE_H +#ifndef GUARD_CONSTANTS_TRADE_H #define GUARD_CONSTANTS_TRADE_H // TODO: document trade.c and trade_scene.c with corresponding macros @@ -115,4 +115,4 @@ #define CANT_REGISTER_MON 1 #define CANT_REGISTER_EGG 2 -#endif //GUARD_CONSTANTS_TRADE_H +#endif // GUARD_CONSTANTS_TRADE_H diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 8eacc8aa7..548e27163 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -461,7 +461,7 @@ #define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L) #define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) -#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4))) +#define REG_TMCNT(n) (*(vu32 *)(REG_ADDR_TMCNT + ((n) * 4))) #define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4))) #define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4))) #define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT) diff --git a/include/gba/syscall.h b/include/gba/syscall.h index deddec5ba..22fdf09fa 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -45,4 +45,6 @@ void RLUnCompVram(const void *src, void *dest); int MultiBoot(struct MultiBootParam *mp); +s32 Div(s32 num, s32 denom); + #endif // GUARD_GBA_SYSCALL_H diff --git a/include/librfu.h b/include/librfu.h index 709074f9c..9482b94c4 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -117,7 +117,7 @@ struct RfuStruct u8 unk_16; u8 unk_17; void (*callbackM)(); - void (*callbackS)(); + void (*callbackS)(u16); u32 callbackId; union RfuPacket *txPacket; union RfuPacket *rxPacket; @@ -145,7 +145,7 @@ struct RfuSlotStatusUNI u8 newDataFlag; u8 dataBlockFlag; void *recvBuffer; - u32 recvBuffSize; + u32 recvBufferSize; }; struct NIComm @@ -178,12 +178,12 @@ struct RfuSlotStatusNI struct RfuFixed { - void *reqCallback; + void (*reqCallback)(u16, u16); void *fastCopyPtr; u16 fastCopyBuffer[24]; u32 fastCopyBuffer2[12]; u32 LLFBuffer[29]; - u8 *STWIBuffer; + struct RfuIntrStruct *STWIBuffer; }; struct RfuStatic @@ -204,7 +204,7 @@ struct RfuStatic u16 unk_1a; u16 reqResult; u16 tryPid; - u32 watchdogTimer; + u16 watchdogTimer; u32 totalPacketSize; }; @@ -230,7 +230,7 @@ struct RfuLinkStatus u8 getNameFlag; u8 findParentCount; u8 watchInterval; - u8 stength[4]; + u8 strength[4]; u8 LLFReadyFlag; u8 remainLLFrameSizeParent; u8 remainLLFrameSizeChild[4]; @@ -266,19 +266,20 @@ extern struct RfuSlotStatusNI *gRfuSlotStatusNI[4]; extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; +// librfu_rfu void rfu_STC_clearAPIVariables(void); void rfu_REQ_stopMode(void); -void rfu_waitREQComplete(void); -u32 rfu_REQBN_softReset_and_checkID(void); +u16 rfu_waitREQComplete(void); +s32 rfu_REQBN_softReset_and_checkID(void); void rfu_REQ_sendData(u8); void rfu_setMSCCallback(void (*func)(u16)); void rfu_setREQCallback(void (*func)(u16, u16)); bool8 rfu_getMasterSlave(void); void rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); -bool16 rfu_syncVBlank(void); +u16 rfu_syncVBlank(void); void rfu_REQ_reset(void); void rfu_REQ_configSystem(u16, u8, u8); -void rfu_REQ_configGameData(u8, u16, struct UnkLinkRfuStruct_02022B14 *, u8 *); +void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7); void rfu_REQ_startSearchChild(void); void rfu_REQ_pollSearchChild(void); void rfu_REQ_endSearchChild(void); @@ -293,18 +294,18 @@ void rfu_REQ_CHILD_pollConnectRecovery(void); void rfu_REQ_CHILD_endConnectRecovery(void); void rfu_REQ_changeMasterSlave(void); void rfu_REQ_RFUStatus(void); -void rfu_getRFUStatus(u8 *status); -u8 *rfu_getSTWIRecvBuffer(void); +u32 rfu_getRFUStatus(u8 *status); +struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void); u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); void rfu_clearSlot(u8 a0, u8 a1); void rfu_clearAllSlot(void); bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); -bool16 rfu_getConnectParentStatus(u8 *status, u8 *a1); +u16 rfu_getConnectParentStatus(u8 *status, u8 *a1); bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0); void rfu_REQ_disconnect(u8 who); void rfu_changeSendTarget(u8 a0, u8 who, u8 a2); void rfu_NI_stopReceivingData(u8 who); -u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); +u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_setTimerInterrupt(u8 which, IntrFunc *intr); void rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); bool16 rfu_UNI_setSendData(u8 flag, void *ptr, u8 size); @@ -318,12 +319,12 @@ void rfu_NI_setSendData(u8, u8, const void *, u32); void IntrSIO32(void); // librfu_stwi -void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); +void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); void STWI_set_MS_mode(u8 mode); void STWI_init_Callback_M(void); void STWI_init_Callback_S(void); -void STWI_set_Callback_M(void (*callbackM)()); -void STWI_set_Callback_S(void (*callbackS)()); +void STWI_set_Callback_M(void *callbackM); +void STWI_set_Callback_S(void (*callbackS)(u16)); void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect); void AgbRFU_SoftReset(void); void STWI_set_Callback_ID(u32 id); @@ -333,7 +334,7 @@ void STWI_send_DataRxREQ(void); void STWI_send_MS_ChangeREQ(void); void STWI_send_StopModeREQ(void); void STWI_send_SystemStatusREQ(void); -void STWI_send_GameConfigREQ(u8 *unk1, u8 *data); +void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data); void STWI_send_ResetREQ(void); void STWI_send_LinkStatusREQ(void); void STWI_send_VersionStatusREQ(void); diff --git a/ld_script.txt b/ld_script.txt index c57b7b4a0..89bf60c16 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -319,6 +319,7 @@ SECTIONS { src/agb_flash_le.o(.text); src/librfu_stwi.o(.text); asm/librfu_intr.o(.text); + src/librfu_rfu.o(.text); asm/librfu.o(.text); src/isagbprn.o(.text); asm/libagbsyscall.o(.text); diff --git a/src/agb_flash.c b/src/agb_flash.c index 5b171abcb..7eb4ae737 100644 --- a/src/agb_flash.c +++ b/src/agb_flash.c @@ -74,7 +74,7 @@ u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) return 1; sTimerNum = timerNum; - sTimerReg = ®_TMCNT(sTimerNum); + sTimerReg = ®_TMCNT_L(sTimerNum); *intrFunc = FlashTimerIntr; return 0; } diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c new file mode 100644 index 000000000..96f4e9519 --- /dev/null +++ b/src/librfu_rfu.c @@ -0,0 +1,736 @@ +#include "global.h" +#include "librfu.h" + +void rfu_CB_defaultCallback(u8, u16); +void rfu_CB_reset(u8, u16); +void rfu_CB_configGameData(u8, u16); +void rfu_CB_stopMode(u8, u16); +void rfu_CB_startSearchChild(u8, u16); +void rfu_CB_pollAndEndSearchChild(u8, u16); +void rfu_CB_startSearchParent(u8, u16); +void rfu_CB_pollSearchParent(u8, u16); +void rfu_CB_pollConnectParent(u8, u16); +void rfu_CB_pollConnectParent(u8, u16); +s32 sub_81E349C(u8); +void rfu_enableREQCallback(bool8); +void rfu_STC_readChildList(void); +void rfu_STC_readParentCandidateList(void); +void rfu_STC_REQ_callback(u8, u16); +void rfu_STC_removeLinkData(u8, u8); +void rfu_STC_fastCopy(u8 **a1, u8 **a2, s32 a3); +void rfu_STC_clearLinkStatus(u8); +void rfu_NI_checkCommFailCounter(void); + +extern const char _Str_RFU_MBOOT[]; + +struct RfuStruct *gRfuState; +ALIGNED(8) struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; +struct RfuSlotStatusNI *gRfuSlotStatusNI[4]; +struct RfuLinkStatus *gRfuLinkStatus; +struct RfuStatic *gRfuStatic; +struct RfuFixed *gRfuFixed; +ALIGNED(8) struct Unk_3007470 gUnknown_3007470; + +u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + u16 i; + u16 *dst; + const u16 *src; + u16 r3; + + // is in EWRAM? + if (((u32)unk0 & 0xF000000) == 0x2000000 && copyInterruptToRam) + return 2; + // is not 4-byte aligned? + if ((u32)unk0 & 3) + return 2; + // Nintendo pls, just use a ternary for once + if (copyInterruptToRam) + { + // An assert/debug print may have existed before, ie + // printf("%s %u < %u", "somefile.c:12345", unk1, num) + // to push this into r3? + r3 = 0xe64; + if (unk1 < r3) + return 1; + } + if (!copyInterruptToRam) + { + r3 = 0x504; // same as above, this should be r3 not r0 + if (unk1 < r3) + return 1; + } + gRfuLinkStatus = &unk0->linkStatus; + gRfuStatic = &unk0->static_; + gRfuFixed = &unk0->fixed; + gRfuSlotStatusNI[0] = &unk0->NI[0]; + gRfuSlotStatusUNI[0] = &unk0->UNI[0]; + for (i = 1; i < NELEMS(gRfuSlotStatusNI); ++i) + { + gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; + gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1]; + } + // TODO: Is it possible to fix the following 2 statements? + // It's equivalent to: + // gRfuFixed->STWIBuffer = &unk0->intr; + // STWI_init_all(&unk0->intr, interrupt, copyInterruptToRam); + gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1]; + STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], interrupt, copyInterruptToRam); + rfu_STC_clearAPIVariables(); + for (i = 0; i < NELEMS(gRfuSlotStatusNI); ++i) + { + gRfuSlotStatusNI[i]->recvBuffer = 0; + gRfuSlotStatusNI[i]->recvBufferSize = 0; + gRfuSlotStatusUNI[i]->recvBuffer = 0; + gRfuSlotStatusUNI[i]->recvBufferSize = 0; + } + src = (const u16 *)((u32)&rfu_STC_fastCopy & ~1); + dst = gRfuFixed->fastCopyBuffer; + // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy + for (r3 = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --r3; r3 != 0xFFFF; --r3) + *dst++ = *src++; + gRfuFixed->fastCopyPtr = (u8 *)gRfuFixed->fastCopyBuffer + 1; + return 0; +} + +void rfu_STC_clearAPIVariables(void) +{ + u16 IMEBackup = REG_IME; + u8 i, r4; + + REG_IME = 0; + r4 = gRfuStatic->flags; + CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic)); + gRfuStatic->flags = r4 & 8; + CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + gRfuLinkStatus->watchInterval = 4; + gRfuStatic->nowWatchInterval = 0; + gRfuLinkStatus->connMode = 0xFF; + rfu_clearAllSlot(); + gRfuStatic->SCStartFlag = 0; + for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i) + gRfuStatic->cidBak[i] = 0; + REG_IME = IMEBackup; +} + +void rfu_REQ_PARENT_resumeRetransmitAndChange(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_ResumeRetransmitAndChangeREQ(); +} + +u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) +{ + struct RfuIntrStruct *buf; + *ackFlag = 0; + if (gRfuLinkStatus->connMode != 1) + return 0x300; + buf = rfu_getSTWIRecvBuffer(); + switch (buf->rxPacketAlloc.rfuPacket8.data[0]) + { + case 40: + case 54: + if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0) + *ackFlag = gRfuLinkStatus->connSlotFlag; + else + *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4]; + return 0; + default: + return 0x10; + } +} + +void rfu_setTimerInterrupt(u8 which, IntrFunc *intr) +{ + STWI_init_timer(intr, which); +} + +struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) +{ + return gRfuFixed->STWIBuffer; +} + +void rfu_setMSCCallback(void (*callback)(u16)) +{ + STWI_set_Callback_S(callback); +} + +void rfu_setREQCallback(void (*callback)(u16, u16)) +{ + gRfuFixed->reqCallback = callback; + rfu_enableREQCallback(callback != NULL); +} + +void rfu_enableREQCallback(bool8 enable) +{ + if (enable) + gRfuStatic->flags |= 8; + else + gRfuStatic->flags &= 0xF7; +} + +void rfu_STC_REQ_callback(u8 r5, u16 reqResult) +{ + STWI_set_Callback_M(rfu_CB_defaultCallback); + gRfuStatic->reqResult = reqResult; + if (gRfuStatic->flags & 8) + gRfuFixed->reqCallback(r5, reqResult); +} + +void rfu_CB_defaultCallback(u8 r0, u16 reqResult) +{ + s32 r5; + u8 i; + + if (r0 == 0xFF) + { + if (gRfuStatic->flags & 8) + gRfuFixed->reqCallback(r0, reqResult); + r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (i = 0; i < 4; ++i) + if ((r5 >> i) & 1) + rfu_STC_removeLinkData(i, 1); + gRfuLinkStatus->connMode = 0xFF; + } +} + +u16 rfu_waitREQComplete(void) +{ + STWI_poll_CommandEnd(); + return gRfuStatic->reqResult; +} + +void rfu_REQ_RFUStatus(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SystemStatusREQ(); +} + +u32 rfu_getRFUStatus(u8 *status) +{ + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93) + return 0x10; + if (STWI_poll_CommandEnd() == 0) + *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; + else + *status = 0xFF; + return 0; +} + +s32 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) +{ + const char *s1 = _Str_RFU_MBOOT; + char *s2 = (char *)0x30000F0; + u16 checksum; + u16 *r2; + u8 i; + + while (*s1 != '\0') + if (*s1++ != *s2++) + return 1; + r2 = (u16 *)0x3000000; + checksum = 0; + for (i = 0; i < 90; ++i) + checksum += *r2++; + if (checksum != *(u16 *)0x30000FA) + return 1; + CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + gRfuStatic->flags |= 0x80; + return 0; +} + +void rfu_REQ_stopMode(void) +{ + vu32 *timerReg; + + if (REG_IME == 0) + { + rfu_STC_REQ_callback(61, 6); + gRfuState->error = 6; + } + else + { + AgbRFU_SoftReset(); + rfu_STC_clearAPIVariables(); + if (sub_81E349C(8) == 0x8001) + { + timerReg = ®_TMCNT(gRfuState->timerSelect); + *timerReg = 0; + *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16; + while (*timerReg << 16 < 262 << 16) + ; + *timerReg = 0; + STWI_set_Callback_M(rfu_CB_stopMode); + STWI_send_StopModeREQ(); + } + else + { + REG_SIOCNT = SIO_MULTI_MODE; + rfu_STC_REQ_callback(61, 0); + } + } +} + +void rfu_CB_stopMode(u8 a1, u16 reqResult) +{ + if (reqResult == 0) + REG_SIOCNT = SIO_MULTI_MODE; + rfu_STC_REQ_callback(a1, reqResult); +} + +s32 rfu_REQBN_softReset_and_checkID(void) +{ + s32 r2; + + if (REG_IME == 0) + return -1; + AgbRFU_SoftReset(); + rfu_STC_clearAPIVariables(); + if ((r2 = sub_81E349C(30)) == 0) + REG_SIOCNT = SIO_MULTI_MODE; + return r2; +} + +void rfu_REQ_reset(void) +{ + STWI_set_Callback_M(rfu_CB_reset); + STWI_send_ResetREQ(); +} + +void rfu_CB_reset(u8 a1, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_clearAPIVariables(); + rfu_STC_REQ_callback(a1, reqResult); +} + +void rfu_REQ_configSystem(u16 r4, u8 r5, u8 r6) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SystemConfigREQ((r4 & 3) | 0x3C, r5, r6); + if (r6 == 0) + { + gRfuStatic->unk_1a = 1; + } + else + { + u16 IMEBackup = REG_IME; + + REG_IME = 0; + gRfuStatic->unk_1a = Div(600, r6); + REG_IME = IMEBackup; + } +} + +void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7) +{ + u8 sp[16]; + u8 i; + u8 r3; + const u8 *r5 = r4; + const u8 *r1; + + sp[0] = r2; + sp[1] = r2 >> 8; + if (r6 != 0) + sp[1] = (r2 >> 8) | 0x80; + for (i = 2; i < 15; ++i) + sp[i] = *r4++; + r3 = 0; + r1 = r7; + for (i = 0; i < 8; ++i) + { + r3 += *r1++; + r3 += *r5++; + } + sp[15] = ~r3; + if (r6 != 0) + sp[14] = 0; + STWI_set_Callback_M(rfu_CB_configGameData); + STWI_send_GameConfigREQ(sp, r7); +} + +void rfu_CB_configGameData(u8 ip, u16 r7) +{ + s32 r2, r3; + u8 *r4; + u8 i; + u8 *r1; + + if (r7 == 0) + { + r1 = gRfuState->txPacket->rfuPacket8.data; + r2 = gRfuLinkStatus->my.serialNum = r1[4]; + gRfuLinkStatus->my.serialNum = (r1[5] << 8) | r2; + r4 = &r1[6]; + if (gRfuLinkStatus->my.serialNum & 0x8000) + { + gRfuLinkStatus->my.serialNum = gRfuLinkStatus->my.serialNum ^ 0x8000; + gRfuLinkStatus->my.multibootFlag = 1; + } + else + { + gRfuLinkStatus->my.multibootFlag = 0; + } + for (i = 0; i < NELEMS(gRfuLinkStatus->my.gname) - 2; ++i) + gRfuLinkStatus->my.gname[i] = *r4++; + ++r4; + for (i = 0; i < NELEMS(gRfuLinkStatus->my.uname) - 1; ++i) + gRfuLinkStatus->my.uname[i] = *r4++; + } + rfu_STC_REQ_callback(ip, r7); +} + +void rfu_REQ_startSearchChild(void) +{ + u16 r1; + + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + r1 = STWI_poll_CommandEnd(); + if (r1 == 0) + { + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + rfu_STC_clearLinkStatus(1); + } + else + { + rfu_STC_REQ_callback(25, r1); + } + STWI_set_Callback_M(rfu_CB_startSearchChild); + STWI_send_SC_StartREQ(); +} + +void rfu_CB_startSearchChild(u8 r3, u16 reqResult) +{ + if (reqResult == 0) + gRfuStatic->SCStartFlag = 1; + rfu_STC_REQ_callback(r3, reqResult); +} + +void rfu_STC_clearLinkStatus(u8 r4) +{ + u8 i; + + rfu_clearAllSlot(); + if (r4 != 0) + { + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + gRfuLinkStatus->findParentCount = 0; + } + for (i = 0; i < NELEMS(gRfuLinkStatus->strength); ++i) + gRfuLinkStatus->strength[i] = 0; + gRfuLinkStatus->connCount = 0; + gRfuLinkStatus->connSlotFlag = 0; + gRfuLinkStatus->linkLossSlotFlag = 0; + gRfuLinkStatus->getNameFlag = 0; +} + +void rfu_REQ_pollSearchChild(void) +{ + STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); + STWI_send_SC_PollingREQ(); +} + +void rfu_REQ_endSearchChild(void) +{ + STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); + STWI_send_SC_EndREQ(); +} + +void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_readChildList(); + if (r4 == 26) + { + if (gRfuLinkStatus->my.id == 0) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + } + } + else if (r4 == 27) + { + if (gRfuLinkStatus->connMode == 255) + gRfuLinkStatus->my.id = 0; + gRfuStatic->SCStartFlag = 0; + } + rfu_STC_REQ_callback(r4, reqResult); +} + +void rfu_STC_readChildList(void) +{ + u32 r5; + u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; + u8 *r4; + u8 i; + u8 sp[4]; + u8 r2; + + if (r8 != 0) + { + r5 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_LinkStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + { + r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + for (i = 0; i < NELEMS(sp); ++i) + sp[i] = *r4++; + } + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = r5; + } + for (r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + r8 != 0; + r4 += 4) + { + r2 = r4[2]; + if (r2 < 4 && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1)) + { + if (sp[r2] != 0) + ++gRfuStatic->lsFixedCount[r2]; + if (gRfuStatic->lsFixedCount[r2] >= 4) + { + gRfuStatic->lsFixedCount[r2] = 0; + gRfuLinkStatus->strength[r2] = 0xFF; + gRfuLinkStatus->connSlotFlag |= 1 << r2; + ++gRfuLinkStatus->connCount; + gRfuLinkStatus->partner[r2].id = *(u16 *)r4; + gRfuLinkStatus->partner[r2].slot = r2; + gRfuLinkStatus->connMode = 1; + gRfuStatic->flags &= 0x7F; + gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id; + } + } + --r8; + } +} + +void rfu_REQ_startSearchParent(void) +{ + STWI_set_Callback_M(rfu_CB_startSearchParent); + STWI_send_SP_StartREQ(); +} + +void rfu_CB_startSearchParent(u8 r5, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_clearLinkStatus(0); + rfu_STC_REQ_callback(r5, reqResult); +} + +void rfu_REQ_pollSearchParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollSearchParent); + STWI_send_SP_PollingREQ(); +} + +void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_readParentCandidateList(); + rfu_STC_REQ_callback(r5, reqResult); +} + +void rfu_REQ_endSearchParent(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SP_EndREQ(); +} + +void rfu_STC_readParentCandidateList(void) +{ + u8 r7, r6, r5, r4, r3; + u8 *r1, *r2; + struct RfuTgtData *r4_; + + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0]; + r7 = r2[1]; + r2 += 4; + gRfuLinkStatus->findParentCount = 0; + for (r6 = 0; r6 < 4 && r7 != 0; ++r6) + { + r7 -= 7; + r1 = r2 + 6; + r2 += 19; + r5 = ~*r2; + ++r2; + r4 = 0; + for (r3 = 0; r3 < 8; ++r3) + { + r4 += *r2++; + r4 += *r1++; + } + if (r4 == r5) + { + r2 -= 28; + r4_ = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount]; + r4_->id = *(u16 *)r2; + r2 += 2; + r4_->slot = *r2; + r2 += 2; + r4_->serialNum = *(u16 *)r2 & 0x7FFF; + if (*(u16 *)r2 & 0x8000) + r4_->multibootFlag = 1; + else + r4_->multibootFlag = 0; + r2 += 2; + for (r3 = 0; r3 < NELEMS(r4_->gname) - 2; ++r3) + r4_->gname[r3] = *r2++; + ++r2; + for (r3 = 0; r3 < NELEMS(r4_->uname) - 1; ++r3) + r4_->uname[r3] = *r2++; + ++gRfuLinkStatus->findParentCount; + } + } +} + +void rfu_REQ_startConnectParent(u16 r4) +{ + u16 r3 = 0; + u8 i; + for (i = 0; i < NELEMS(gRfuLinkStatus->partner) && gRfuLinkStatus->partner[i].id != r4; ++i) + ; + if (i == 4) + r3 = 256; + if (r3 == 0) + { + gRfuStatic->tryPid = r4; + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_CP_StartREQ(r4); + } + else + { + rfu_STC_REQ_callback(31, r3); + } +} + +void rfu_REQ_pollConnectParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollConnectParent); + STWI_send_CP_PollingREQ(); +} + +void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) +{ + u16 id; + u8 slot; + u8 r2, r5; + struct RfuTgtData *r9; + struct RfuTgtData sp; + + if (sp28 == 0) + { + id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]; + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + { + r2 = 1 << slot; + if (!(r2 & gRfuLinkStatus->connSlotFlag)) + { + gRfuLinkStatus->connSlotFlag |= r2; + gRfuLinkStatus->linkLossSlotFlag &= ~r2; + gRfuLinkStatus->my.id = id; + ++gRfuLinkStatus->connCount; + gRfuLinkStatus->connMode = 0; + gRfuStatic->flags |= 0x80; + for (r5 = 0; r5 < NELEMS(gRfuLinkStatus->partner); ++r5) + { + if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid) + { + if (gRfuLinkStatus->findParentCount != 0) + { + r9 = &sp; + CpuCopy16(&gRfuLinkStatus->partner[r5], &sp, sizeof(struct RfuTgtData)); + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + gRfuLinkStatus->findParentCount = 0; + } + else + { + r9 = &gRfuLinkStatus->partner[r5]; + } + break; + } + } + if (r5 < 4) + { + CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); + gRfuLinkStatus->partner[slot].slot = slot; + } + } + } + } + rfu_STC_REQ_callback(sp24, sp28); +} + +u16 rfu_getConnectParentStatus(u8 *status, u8 *r1) +{ + u8 r0, *r2; + + *status = 0xFF; + r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + r0 = r2[0] + 96; + if (r0 <= 1) + { + r2 += 6; + *r1 = r2[0]; + *status = r2[1]; + return 0; + } + return 0x10; +} + +void rfu_REQ_endConnectParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollConnectParent); + STWI_send_CP_EndREQ(); + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6] < 4) + gRfuStatic->linkEmergencyFlag[gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]] = 0; +} + +u16 rfu_syncVBlank(void) +{ + u8 r3, r4; + s32 r5; + + rfu_NI_checkCommFailCounter(); + if (gRfuLinkStatus->connMode == 0xFF) + return 0; + if (gRfuStatic->nowWatchInterval != 0) + --gRfuStatic->nowWatchInterval; + r3 = rfu_getMasterSlave(); + if (!(gRfuStatic->flags & 2)) + { + if (r3 == 0) + { + gRfuStatic->flags |= 4; + gRfuStatic->watchdogTimer = 360; + } + } + else if (r3 != 0) + { + gRfuStatic->flags &= 0xFB; + } + if (r3 != 0) + gRfuStatic->flags &= 0xFD; + else + gRfuStatic->flags |= 2; + if (!(gRfuStatic->flags & 4)) + return 0; + if (gRfuStatic->watchdogTimer == 0) + { + gRfuStatic->flags &= 0xFB; + r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (r4 = 0; r4 < 4; ++r4) + if ((r5 >> r4) & 1) + rfu_STC_removeLinkData(r4, 1); + gRfuLinkStatus->connMode = 0xFF; + return 1; + } + --gRfuStatic->watchdogTimer; + return 0; +} diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index fe8a4ef76..c8df0ccfa 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -64,7 +64,7 @@ void AgbRFU_SoftReset(void) timerH = ®_TMCNT_H(gRfuState->timerSelect); *timerH = 0; *timerL = 0; - *timerH = 0x83; + *timerH = TIMER_ENABLE | TIMER_1024CLK; while (*timerL <= 0x11) REG_RCNT = 0x80A2; *timerH = 3; @@ -117,12 +117,13 @@ void STWI_init_Callback_S(void) STWI_set_Callback_S(NULL); } -void STWI_set_Callback_M(void (*callbackM)()) +// The callback can take 2 or 3 arguments. +void STWI_set_Callback_M(void *callbackM) { gRfuState->callbackM = callbackM; } -void STWI_set_Callback_S(void (*callbackS)()) +void STWI_set_Callback_S(void (*callbackS)(u16)) { gRfuState->callbackS = callbackS; } @@ -193,7 +194,7 @@ void STWI_send_ConfigStatusREQ(void) } } -void STWI_send_GameConfigREQ(u8 *unk1, u8 *data) +void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) { u8 *packetBytes; s32 i; @@ -496,7 +497,7 @@ static void STWI_intr_timer(void) gRfuState->timerActive = 1; STWI_stop_timer(); STWI_reset_ClockCounter(); - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(255, 0); break; } @@ -546,7 +547,7 @@ static u16 STWI_init(u8 request) if (!REG_IME) { gRfuState->error = 6; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(request, gRfuState->error); return TRUE; } @@ -554,14 +555,14 @@ static u16 STWI_init(u8 request) { gRfuState->error = 2; gRfuState->unk_2c = FALSE; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(request, gRfuState->error); return TRUE; } else if(!gRfuState->msMode) { gRfuState->error = 4; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(request, gRfuState->error, gRfuState); return TRUE; } @@ -617,14 +618,14 @@ static s32 STWI_restart_Command(void) { gRfuState->error = 1; gRfuState->unk_2c = 0; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); } else { gRfuState->error = 1; gRfuState->unk_2c = 0; - if (gRfuState->callbackM) + if (gRfuState->callbackM != NULL) gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); gRfuState->state = 4; // TODO: what's 4 } diff --git a/sym_common.txt b/sym_common.txt index e72f9a03c..444c2a7af 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -159,24 +159,5 @@ gUnknown_3005E94: @ 3005E94 .include "berry_fix_program.o" .include "m4a.o" .include "agb_flash.o" - -gRfuState: @ 3007438 - .space 0x8 - -gRfuSlotStatusUNI: @ 3007440 - .space 0x10 - -gRfuSlotStatusNI: @ 3007450 - .space 0x10 - -gRfuLinkStatus: @ 3007460 - .space 0x4 - -gRfuStatic: @ 3007464 - .space 0x4 - -gRfuFixed: @ 3007468 - .space 0x8 - -gUnknown_3007470: @ 3007470 - .space 0xC + .align 2 + .include "librfu_rfu.o" |