From f1216076d7cb6a383682f423c9b5c14e152e484b Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Thu, 7 Sep 2017 00:51:59 -0600 Subject: [PATCH] Begin librfu decompilation --- asm/crt0.s | 2 +- asm/librfu.s | 454 ++++++------------------------------------- include/gba/io_reg.h | 6 + include/gba/macro.h | 10 + ld_script.txt | 1 + src/librfu.c | 217 +++++++++++++++++++++ sym_common.txt | 2 +- 7 files changed, 292 insertions(+), 400 deletions(-) create mode 100644 src/librfu.c diff --git a/asm/crt0.s b/asm/crt0.s index 14675fe4c..3a3034a37 100644 --- a/asm/crt0.s +++ b/asm/crt0.s @@ -115,7 +115,7 @@ IntrMain: @ 8000248 IntrMain_FoundIntr: strh r0, [r3, OFFSET_REG_IF - 0x200] bic r2, r2, r0 - ldr r0, =gUnknown_03007868 + ldr r0, =gRfuState ldr r0, [r0] ldrb r0, [r0, 0xA] mov r1, 0x8 diff --git a/asm/librfu.s b/asm/librfu.s index d8ca7538c..2f0359f37 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -4,348 +4,6 @@ .text - thumb_func_start STWI_init_all -STWI_init_all: @ 82E2A18 - push {r4,lr} - adds r3, r0, 0 - lsls r2, 24 - lsrs r2, 24 - cmp r2, 0x1 - bne _082E2A54 - adds r2, r3, 0 - adds r2, 0xE8 - str r2, [r1] - ldr r1, _082E2A40 - ldr r0, _082E2A44 - str r0, [r1] - str r2, [r1, 0x4] - ldr r0, _082E2A48 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - ldr r1, _082E2A4C - ldr r2, _082E2A50 - adds r0, r3, r2 - b _082E2A5E - .align 2, 0 -_082E2A40: .4byte 0x040000d4 -_082E2A44: .4byte IntrSIO32 -_082E2A48: .4byte 0x800004b0 -_082E2A4C: .4byte gUnknown_03007868 -_082E2A50: .4byte 0x00000a48 -_082E2A54: - ldr r0, _082E2AD8 - str r0, [r1] - ldr r1, _082E2ADC - adds r0, r3, 0 - adds r0, 0xE8 -_082E2A5E: - str r0, [r1] - adds r2, r1, 0 - ldr r1, [r2] - str r3, [r1, 0x28] - adds r0, r3, 0 - adds r0, 0x74 - str r0, [r1, 0x24] - ldrb r0, [r1, 0x14] - movs r4, 0 - movs r0, 0x1 - strb r0, [r1, 0x14] - ldr r0, [r2] - str r4, [r0] - strb r4, [r0, 0x4] - ldr r0, [r2] - strb r4, [r0, 0x5] - ldr r0, [r2] - strb r4, [r0, 0x7] - ldr r0, [r2] - strb r4, [r0, 0x8] - ldr r0, [r2] - strb r4, [r0, 0x9] - ldr r0, [r2] - str r4, [r0, 0xC] - ldrb r1, [r0, 0x10] - strb r4, [r0, 0x10] - ldr r0, [r2] - ldrh r1, [r0, 0x12] - movs r1, 0 - strh r4, [r0, 0x12] - strb r1, [r0, 0x15] - ldr r0, [r2] - adds r0, 0x2C - ldrb r2, [r0] - strb r1, [r0] - ldr r1, _082E2AE0 - movs r2, 0x80 - lsls r2, 1 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r2, _082E2AE4 - adds r0, r2, 0 - strh r0, [r1] - bl STWI_init_Callback_M - bl STWI_init_Callback_S - ldr r3, _082E2AE8 - ldrh r2, [r3] - strh r4, [r3] - ldr r4, _082E2AEC - ldrh r0, [r4] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_082E2AD8: .4byte IntrSIO32 -_082E2ADC: .4byte gUnknown_03007868 -_082E2AE0: .4byte 0x04000134 -_082E2AE4: .4byte 0x00005003 -_082E2AE8: .4byte 0x04000208 -_082E2AEC: .4byte 0x04000200 - thumb_func_end STWI_init_all - - thumb_func_start STWI_init_timer -STWI_init_timer: @ 82E2AF0 - push {r4,r5,lr} - ldr r2, _082E2B1C - str r2, [r0] - ldr r5, _082E2B20 - ldr r0, [r5] - movs r4, 0 - strb r1, [r0, 0xA] - ldr r3, _082E2B24 - ldrh r2, [r3] - strh r4, [r3] - ldr r4, _082E2B28 - ldr r1, [r5] - movs r0, 0x8 - ldrb r1, [r1, 0xA] - lsls r0, r1 - ldrh r1, [r4] - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_082E2B1C: .4byte STWI_intr_timer -_082E2B20: .4byte gUnknown_03007868 -_082E2B24: .4byte 0x04000208 -_082E2B28: .4byte 0x04000200 - thumb_func_end STWI_init_timer - - thumb_func_start AgbRFU_SoftReset -AgbRFU_SoftReset: @ 82E2B2C - push {r4,r5,lr} - ldr r5, _082E2BC4 - movs r1, 0x80 - lsls r1, 8 - adds r0, r1, 0 - strh r0, [r5] - ldr r2, _082E2BC8 - adds r0, r2, 0 - strh r0, [r5] - ldr r1, _082E2BCC - ldr r0, [r1] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r3, _082E2BD0 - adds r2, r0, r3 - ldr r4, _082E2BD4 - adds r3, r0, r4 - movs r0, 0 - strh r0, [r3] - strh r0, [r2] - movs r0, 0x83 - strh r0, [r3] - ldrh r0, [r2] - adds r4, r1, 0 - cmp r0, 0x11 - bhi _082E2B6C - ldr r0, _082E2BD8 - adds r1, r0, 0 -_082E2B64: - strh r1, [r5] - ldrh r0, [r2] - cmp r0, 0x11 - bls _082E2B64 -_082E2B6C: - movs r0, 0x3 - strh r0, [r3] - ldr r1, _082E2BC4 - ldr r2, _082E2BC8 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r3, _082E2BDC - adds r0, r3, 0 - strh r0, [r1] - ldr r0, [r4] - movs r2, 0 - str r2, [r0] - strb r2, [r0, 0x4] - ldr r0, [r4] - strb r2, [r0, 0x5] - ldr r0, [r4] - strb r2, [r0, 0x6] - ldr r0, [r4] - strb r2, [r0, 0x7] - ldr r0, [r4] - strb r2, [r0, 0x8] - ldr r0, [r4] - strb r2, [r0, 0x9] - ldr r0, [r4] - str r2, [r0, 0xC] - ldrb r1, [r0, 0x10] - strb r2, [r0, 0x10] - ldr r1, [r4] - ldrh r0, [r1, 0x12] - movs r3, 0 - strh r2, [r1, 0x12] - ldrb r0, [r1, 0x14] - movs r0, 0x1 - strb r0, [r1, 0x14] - ldr r0, [r4] - strb r3, [r0, 0x15] - ldr r0, [r4] - adds r0, 0x2C - ldrb r1, [r0] - strb r3, [r0] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_082E2BC4: .4byte 0x04000134 -_082E2BC8: .4byte 0x000080a0 -_082E2BCC: .4byte gUnknown_03007868 -_082E2BD0: .4byte 0x04000100 -_082E2BD4: .4byte 0x04000102 -_082E2BD8: .4byte 0x000080a2 -_082E2BDC: .4byte 0x00005003 - thumb_func_end AgbRFU_SoftReset - - thumb_func_start STWI_set_MS_mode -STWI_set_MS_mode: @ 82E2BE0 - lsls r0, 24 - lsrs r0, 24 - ldr r1, _082E2BF0 - ldr r1, [r1] - ldrb r2, [r1, 0x14] - strb r0, [r1, 0x14] - bx lr - .align 2, 0 -_082E2BF0: .4byte gUnknown_03007868 - thumb_func_end STWI_set_MS_mode - - thumb_func_start STWI_read_status -STWI_read_status: @ 82E2BF4 - push {lr} - lsls r0, 24 - lsrs r0, 24 - adds r1, r0, 0 - cmp r0, 0x1 - beq _082E2C20 - cmp r0, 0x1 - bgt _082E2C0A - cmp r0, 0 - beq _082E2C14 - b _082E2C48 -_082E2C0A: - cmp r1, 0x2 - beq _082E2C2C - cmp r1, 0x3 - beq _082E2C3C - b _082E2C48 -_082E2C14: - ldr r0, _082E2C1C - ldr r0, [r0] - ldrh r0, [r0, 0x12] - b _082E2C4A - .align 2, 0 -_082E2C1C: .4byte gUnknown_03007868 -_082E2C20: - ldr r0, _082E2C28 - ldr r0, [r0] - ldrb r0, [r0, 0x14] - b _082E2C4A - .align 2, 0 -_082E2C28: .4byte gUnknown_03007868 -_082E2C2C: - ldr r0, _082E2C38 - ldr r0, [r0] - ldr r0, [r0] - lsls r0, 16 - lsrs r0, 16 - b _082E2C4A - .align 2, 0 -_082E2C38: .4byte gUnknown_03007868 -_082E2C3C: - ldr r0, _082E2C44 - ldr r0, [r0] - ldrb r0, [r0, 0x6] - b _082E2C4A - .align 2, 0 -_082E2C44: .4byte gUnknown_03007868 -_082E2C48: - ldr r0, _082E2C50 -_082E2C4A: - pop {r1} - bx r1 - .align 2, 0 -_082E2C50: .4byte 0x0000ffff - thumb_func_end STWI_read_status - - thumb_func_start STWI_init_Callback_M -STWI_init_Callback_M: @ 82E2C54 - push {lr} - movs r0, 0 - bl STWI_set_Callback_M - pop {r0} - bx r0 - thumb_func_end STWI_init_Callback_M - - thumb_func_start STWI_init_Callback_S -STWI_init_Callback_S: @ 82E2C60 - push {lr} - movs r0, 0 - bl STWI_set_Callback_S - pop {r0} - bx r0 - thumb_func_end STWI_init_Callback_S - - thumb_func_start STWI_set_Callback_M -STWI_set_Callback_M: @ 82E2C6C - ldr r1, _082E2C74 - ldr r1, [r1] - str r0, [r1, 0x18] - bx lr - .align 2, 0 -_082E2C74: .4byte gUnknown_03007868 - thumb_func_end STWI_set_Callback_M - - thumb_func_start STWI_set_Callback_S -STWI_set_Callback_S: @ 82E2C78 - ldr r1, _082E2C80 - ldr r1, [r1] - str r0, [r1, 0x1C] - bx lr - .align 2, 0 -_082E2C80: .4byte gUnknown_03007868 - thumb_func_end STWI_set_Callback_S - - thumb_func_start STWI_set_Callback_ID -STWI_set_Callback_ID: @ 82E2C84 - ldr r1, _082E2C8C - ldr r1, [r1] - str r0, [r1, 0x20] - bx lr - .align 2, 0 -_082E2C8C: .4byte gUnknown_03007868 - thumb_func_end STWI_set_Callback_ID - thumb_func_start STWI_poll_CommandEnd STWI_poll_CommandEnd: @ 82E2C90 push {lr} @@ -368,7 +26,7 @@ _082E2CAA: pop {r1} bx r1 .align 2, 0 -_082E2CB4: .4byte gUnknown_03007868 +_082E2CB4: .4byte gRfuState thumb_func_end STWI_poll_CommandEnd thumb_func_start STWI_send_ResetREQ @@ -388,7 +46,7 @@ _082E2CD2: pop {r0} bx r0 .align 2, 0 -_082E2CD8: .4byte gUnknown_03007868 +_082E2CD8: .4byte gRfuState thumb_func_end STWI_send_ResetREQ thumb_func_start STWI_send_LinkStatusREQ @@ -408,7 +66,7 @@ _082E2CF6: pop {r0} bx r0 .align 2, 0 -_082E2CFC: .4byte gUnknown_03007868 +_082E2CFC: .4byte gRfuState thumb_func_end STWI_send_LinkStatusREQ thumb_func_start STWI_send_VersionStatusREQ @@ -428,7 +86,7 @@ _082E2D1A: pop {r0} bx r0 .align 2, 0 -_082E2D20: .4byte gUnknown_03007868 +_082E2D20: .4byte gRfuState thumb_func_end STWI_send_VersionStatusREQ thumb_func_start STWI_send_SystemStatusREQ @@ -448,7 +106,7 @@ _082E2D3E: pop {r0} bx r0 .align 2, 0 -_082E2D44: .4byte gUnknown_03007868 +_082E2D44: .4byte gRfuState thumb_func_end STWI_send_SystemStatusREQ thumb_func_start STWI_send_SlotStatusREQ @@ -468,7 +126,7 @@ _082E2D62: pop {r0} bx r0 .align 2, 0 -_082E2D68: .4byte gUnknown_03007868 +_082E2D68: .4byte gRfuState thumb_func_end STWI_send_SlotStatusREQ thumb_func_start STWI_send_ConfigStatusREQ @@ -488,7 +146,7 @@ _082E2D86: pop {r0} bx r0 .align 2, 0 -_082E2D8C: .4byte gUnknown_03007868 +_082E2D8C: .4byte gRfuState thumb_func_end STWI_send_ConfigStatusREQ thumb_func_start STWI_send_GameConfigREQ @@ -536,7 +194,7 @@ _082E2DDC: pop {r0} bx r0 .align 2, 0 -_082E2DE4: .4byte gUnknown_03007868 +_082E2DE4: .4byte gRfuState thumb_func_end STWI_send_GameConfigREQ thumb_func_start STWI_send_SystemConfigREQ @@ -571,7 +229,7 @@ _082E2E1E: pop {r0} bx r0 .align 2, 0 -_082E2E24: .4byte gUnknown_03007868 +_082E2E24: .4byte gRfuState thumb_func_end STWI_send_SystemConfigREQ thumb_func_start STWI_send_SC_StartREQ @@ -591,7 +249,7 @@ _082E2E42: pop {r0} bx r0 .align 2, 0 -_082E2E48: .4byte gUnknown_03007868 +_082E2E48: .4byte gRfuState thumb_func_end STWI_send_SC_StartREQ thumb_func_start STWI_send_SC_PollingREQ @@ -611,7 +269,7 @@ _082E2E66: pop {r0} bx r0 .align 2, 0 -_082E2E6C: .4byte gUnknown_03007868 +_082E2E6C: .4byte gRfuState thumb_func_end STWI_send_SC_PollingREQ thumb_func_start STWI_send_SC_EndREQ @@ -631,7 +289,7 @@ _082E2E8A: pop {r0} bx r0 .align 2, 0 -_082E2E90: .4byte gUnknown_03007868 +_082E2E90: .4byte gRfuState thumb_func_end STWI_send_SC_EndREQ thumb_func_start STWI_send_SP_StartREQ @@ -651,7 +309,7 @@ _082E2EAE: pop {r0} bx r0 .align 2, 0 -_082E2EB4: .4byte gUnknown_03007868 +_082E2EB4: .4byte gRfuState thumb_func_end STWI_send_SP_StartREQ thumb_func_start STWI_send_SP_PollingREQ @@ -671,7 +329,7 @@ _082E2ED2: pop {r0} bx r0 .align 2, 0 -_082E2ED8: .4byte gUnknown_03007868 +_082E2ED8: .4byte gRfuState thumb_func_end STWI_send_SP_PollingREQ thumb_func_start STWI_send_SP_EndREQ @@ -691,7 +349,7 @@ _082E2EF6: pop {r0} bx r0 .align 2, 0 -_082E2EFC: .4byte gUnknown_03007868 +_082E2EFC: .4byte gRfuState thumb_func_end STWI_send_SP_EndREQ thumb_func_start STWI_send_CP_StartREQ @@ -717,7 +375,7 @@ _082E2F24: pop {r0} bx r0 .align 2, 0 -_082E2F2C: .4byte gUnknown_03007868 +_082E2F2C: .4byte gRfuState thumb_func_end STWI_send_CP_StartREQ thumb_func_start STWI_send_CP_PollingREQ @@ -737,7 +395,7 @@ _082E2F4A: pop {r0} bx r0 .align 2, 0 -_082E2F50: .4byte gUnknown_03007868 +_082E2F50: .4byte gRfuState thumb_func_end STWI_send_CP_PollingREQ thumb_func_start STWI_send_CP_EndREQ @@ -757,7 +415,7 @@ _082E2F6E: pop {r0} bx r0 .align 2, 0 -_082E2F74: .4byte gUnknown_03007868 +_082E2F74: .4byte gRfuState thumb_func_end STWI_send_CP_EndREQ thumb_func_start STWI_send_DataTxREQ @@ -796,7 +454,7 @@ _082E2FB6: pop {r0} bx r0 .align 2, 0 -_082E2FBC: .4byte gUnknown_03007868 +_082E2FBC: .4byte gRfuState thumb_func_end STWI_send_DataTxREQ thumb_func_start STWI_send_DataTxAndChangeREQ @@ -835,7 +493,7 @@ _082E2FFE: pop {r0} bx r0 .align 2, 0 -_082E3004: .4byte gUnknown_03007868 +_082E3004: .4byte gRfuState thumb_func_end STWI_send_DataTxAndChangeREQ thumb_func_start STWI_send_DataRxREQ @@ -855,7 +513,7 @@ _082E3022: pop {r0} bx r0 .align 2, 0 -_082E3028: .4byte gUnknown_03007868 +_082E3028: .4byte gRfuState thumb_func_end STWI_send_DataRxREQ thumb_func_start STWI_send_MS_ChangeREQ @@ -875,7 +533,7 @@ _082E3046: pop {r0} bx r0 .align 2, 0 -_082E304C: .4byte gUnknown_03007868 +_082E304C: .4byte gRfuState thumb_func_end STWI_send_MS_ChangeREQ thumb_func_start STWI_send_DataReadyAndChangeREQ @@ -897,7 +555,7 @@ STWI_send_DataReadyAndChangeREQ: @ 82E3050 strb r3, [r0, 0x4] b _082E3092 .align 2, 0 -_082E3074: .4byte gUnknown_03007868 +_082E3074: .4byte gRfuState _082E3078: ldr r2, _082E309C ldr r1, [r2] @@ -919,7 +577,7 @@ _082E3096: pop {r0} bx r0 .align 2, 0 -_082E309C: .4byte gUnknown_03007868 +_082E309C: .4byte gRfuState thumb_func_end STWI_send_DataReadyAndChangeREQ thumb_func_start STWI_send_DisconnectedAndChangeREQ @@ -954,7 +612,7 @@ _082E30D6: pop {r0} bx r0 .align 2, 0 -_082E30DC: .4byte gUnknown_03007868 +_082E30DC: .4byte gRfuState thumb_func_end STWI_send_DisconnectedAndChangeREQ thumb_func_start STWI_send_ResumeRetransmitAndChangeREQ @@ -974,7 +632,7 @@ _082E30FA: pop {r0} bx r0 .align 2, 0 -_082E3100: .4byte gUnknown_03007868 +_082E3100: .4byte gRfuState thumb_func_end STWI_send_ResumeRetransmitAndChangeREQ thumb_func_start STWI_send_DisconnectREQ @@ -1000,7 +658,7 @@ _082E3128: pop {r0} bx r0 .align 2, 0 -_082E3130: .4byte gUnknown_03007868 +_082E3130: .4byte gRfuState thumb_func_end STWI_send_DisconnectREQ thumb_func_start STWI_send_TestModeREQ @@ -1030,7 +688,7 @@ _082E3160: pop {r0} bx r0 .align 2, 0 -_082E3168: .4byte gUnknown_03007868 +_082E3168: .4byte gRfuState thumb_func_end STWI_send_TestModeREQ thumb_func_start STWI_send_CPR_StartREQ @@ -1063,7 +721,7 @@ _082E319E: pop {r0} bx r0 .align 2, 0 -_082E31A4: .4byte gUnknown_03007868 +_082E31A4: .4byte gRfuState thumb_func_end STWI_send_CPR_StartREQ thumb_func_start STWI_send_CPR_PollingREQ @@ -1083,7 +741,7 @@ _082E31C2: pop {r0} bx r0 .align 2, 0 -_082E31C8: .4byte gUnknown_03007868 +_082E31C8: .4byte gRfuState thumb_func_end STWI_send_CPR_PollingREQ thumb_func_start STWI_send_CPR_EndREQ @@ -1103,7 +761,7 @@ _082E31E6: pop {r0} bx r0 .align 2, 0 -_082E31EC: .4byte gUnknown_03007868 +_082E31EC: .4byte gRfuState thumb_func_end STWI_send_CPR_EndREQ thumb_func_start STWI_send_StopModeREQ @@ -1123,7 +781,7 @@ _082E320A: pop {r0} bx r0 .align 2, 0 -_082E3210: .4byte gUnknown_03007868 +_082E3210: .4byte gRfuState thumb_func_end STWI_send_StopModeREQ thumb_func_start STWI_intr_timer @@ -1140,7 +798,7 @@ STWI_intr_timer: @ 82E3214 beq _082E3248 b _082E3270 .align 2, 0 -_082E322C: .4byte gUnknown_03007868 +_082E322C: .4byte gRfuState _082E3230: cmp r0, 0x3 beq _082E3252 @@ -1203,7 +861,7 @@ STWI_set_timer: @ 82E3278 beq _082E32BE b _082E32FC .align 2, 0 -_082E32A8: .4byte gUnknown_03007868 +_082E32A8: .4byte gRfuState _082E32AC: .4byte 0x04000100 _082E32B0: .4byte 0x04000208 _082E32B4: @@ -1287,7 +945,7 @@ STWI_stop_timer: @ 82E3324 strh r1, [r0] bx lr .align 2, 0 -_082E3344: .4byte gUnknown_03007868 +_082E3344: .4byte gRfuState _082E3348: .4byte 0x04000100 _082E334C: .4byte 0x04000102 thumb_func_end STWI_stop_timer @@ -1316,7 +974,7 @@ STWI_init: @ 82E3350 b _082E33CE .align 2, 0 _082E337C: .4byte 0x04000208 -_082E3380: .4byte gUnknown_03007868 +_082E3380: .4byte gRfuState _082E3384: ldr r4, _082E33B0 ldr r2, [r4] @@ -1340,7 +998,7 @@ _082E3384: bl _call_via_r2 b _082E33CE .align 2, 0 -_082E33B0: .4byte gUnknown_03007868 +_082E33B0: .4byte gRfuState _082E33B4: ldrb r0, [r2, 0x14] cmp r0, 0 @@ -1450,7 +1108,7 @@ STWI_start_Command: @ 82E3428 pop {r1} bx r1 .align 2, 0 -_082E3480: .4byte gUnknown_03007868 +_082E3480: .4byte gRfuState _082E3484: .4byte 0x99660000 _082E3488: .4byte 0x04000120 _082E348C: .4byte 0x04000208 @@ -1473,7 +1131,7 @@ STWI_restart_Command: @ 82E349C bl STWI_start_Command b _082E3512 .align 2, 0 -_082E34B4: .4byte gUnknown_03007868 +_082E34B4: .4byte gRfuState _082E34B8: ldrb r0, [r2, 0x6] cmp r0, 0x27 @@ -1553,7 +1211,7 @@ STWI_reset_ClockCounter: @ 82E351C movs r0, 0 bx lr .align 2, 0 -_082E3548: .4byte gUnknown_03007868 +_082E3548: .4byte gRfuState _082E354C: .4byte 0x04000120 _082E3550: .4byte 0x00005003 thumb_func_end STWI_reset_ClockCounter @@ -1587,7 +1245,7 @@ _082E35A8: ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_082E35B4: .4byte gUnknown_03007868 +_082E35B4: .4byte gRfuState arm_func_end IntrSIO32 arm_func_start sio32intr_clock_master @@ -1761,7 +1419,7 @@ _082E3800: bl sub_82E3EA8 b _082E3840 .align 2, 0 -_082E382C: .4byte gUnknown_03007868 +_082E382C: .4byte gRfuState _082E3830: add r3, r5, 0x3 strh r3, [r4] @@ -2026,7 +1684,7 @@ _082E3BE4: bhi _082E3BE4 b _082E3C20 .align 2, 0 -_082E3BF4: .4byte gUnknown_03007868 +_082E3BF4: .4byte gRfuState _082E3BF8: .4byte 0x996601ee _082E3BFC: mov r2, 0xFF00 @@ -2086,7 +1744,7 @@ _082E3CA4: ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_082E3CB8: .4byte gUnknown_03007868 +_082E3CB8: .4byte gRfuState arm_func_end handshake_wait arm_func_start STWI_set_timer_in_RAM @@ -2142,7 +1800,7 @@ _082E3D5C: mov r3, 0x3 b _082E3D8C .align 2, 0 -_082E3D74: .4byte gUnknown_03007868 +_082E3D74: .4byte gRfuState _082E3D78: mvn r3, 0x850 sub r3, r3, 0x2 @@ -2191,7 +1849,7 @@ STWI_stop_timer_in_RAM: @ 82E3DCC ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_082E3E18: .4byte gUnknown_03007868 +_082E3E18: .4byte gRfuState arm_func_end STWI_stop_timer_in_RAM arm_func_start STWI_init_slave @@ -2231,7 +1889,7 @@ STWI_init_slave: @ 82E3E1C ldmdb r11, {r11,sp,lr} bx lr .align 2, 0 -_082E3EA4: .4byte gUnknown_03007868 +_082E3EA4: .4byte gRfuState arm_func_end STWI_init_slave arm_func_start sub_82E3EA8 @@ -2838,7 +2496,7 @@ rfu_REQ_stopMode: @ 82E42C4 b _082E4362 .align 2, 0 _082E42E4: .4byte 0x04000208 -_082E42E8: .4byte gUnknown_03007868 +_082E42E8: .4byte gRfuState _082E42EC: bl AgbRFU_SoftReset bl rfu_STC_clearAPIVariables @@ -2878,7 +2536,7 @@ _082E432A: b _082E4362 .align 2, 0 _082E433C: .4byte 0x00008001 -_082E4340: .4byte gUnknown_03007868 +_082E4340: .4byte gRfuState _082E4344: .4byte 0x04000100 _082E4348: .4byte 0x0105ffff _082E434C: .4byte rfu_CB_stopMode @@ -3156,7 +2814,7 @@ rfu_CB_configGameData: @ 82E4500 movs r0, 0x1 b _082E4552 .align 2, 0 -_082E4544: .4byte gUnknown_03007868 +_082E4544: .4byte gRfuState _082E4548: .4byte gUnknown_03007890 _082E454C: adds r1, r6, 0 @@ -4225,7 +3883,7 @@ _082E4D18: b _082E4D88 .align 2, 0 _082E4D20: .4byte gUnknown_03007890 -_082E4D24: .4byte gUnknown_03007868 +_082E4D24: .4byte gRfuState _082E4D28: .4byte gUnknown_03007894 _082E4D2C: .4byte gUnknown_03007898 _082E4D30: @@ -5195,7 +4853,7 @@ _082E547E: pop {r1} bx r1 .align 2, 0 -_082E5484: .4byte gUnknown_03007868 +_082E5484: .4byte gRfuState thumb_func_end rfu_getMasterSlave thumb_func_start rfu_clearAllSlot @@ -6506,7 +6164,7 @@ _082E5E12: _082E5E34: .4byte gUnknown_03007898 _082E5E38: .4byte gUnknown_03007894 _082E5E3C: .4byte gUnknown_03007890 -_082E5E40: .4byte gUnknown_03007868 +_082E5E40: .4byte gRfuState _082E5E44: ldr r0, _082E5E54 bl STWI_set_Callback_M @@ -8564,7 +8222,7 @@ _082E6D88: b _082E6DD6 .align 2, 0 _082E6DB4: .4byte 0x04000200 -_082E6DB8: .4byte gUnknown_03007868 +_082E6DB8: .4byte gRfuState _082E6DBC: .4byte sub_82E6F88 _082E6DC0: .4byte 0x04000100 _082E6DC4: @@ -8612,7 +8270,7 @@ _082E6E08: .align 2, 0 _082E6E14: .4byte 0x04000208 _082E6E18: .4byte 0x04000200 -_082E6E1C: .4byte gUnknown_03007868 +_082E6E1C: .4byte gRfuState thumb_func_end sub_82E6D6C thumb_func_start sub_82E6E20 @@ -8663,7 +8321,7 @@ sub_82E6E20: @ 82E6E20 .align 2, 0 _082E6E78: .4byte 0x04000208 _082E6E7C: .4byte 0x04000200 -_082E6E80: .4byte gUnknown_03007868 +_082E6E80: .4byte gRfuState _082E6E84: .4byte 0x04000134 _082E6E88: .4byte gUnknown_030078A0 _082E6E8C: .4byte 0x05000003 diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 5234e5b6c..2b21086e3 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -137,6 +137,8 @@ #define REG_OFFSET_DMA3CNT_H 0xde #define REG_OFFSET_TMCNT 0x100 +#define REG_OFFSET_TMCNT_L 0x100 +#define REG_OFFSET_TMCNT_H 0x102 #define REG_OFFSET_TM0CNT 0x100 #define REG_OFFSET_TM0CNT_L 0x100 #define REG_OFFSET_TM0CNT_H 0x102 @@ -298,6 +300,8 @@ #define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H) #define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT) +#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L) +#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H) #define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT) #define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L) #define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H) @@ -458,6 +462,8 @@ #define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) #define REG_TMCNT(n) (*(vu16 *)(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) #define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L) #define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H) diff --git a/include/gba/macro.h b/include/gba/macro.h index 0217898e8..7b6b98c06 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -86,4 +86,14 @@ dmaRegs[5]; \ } +#define IntrEnable(flags) \ +{ \ + u16 imeTemp; \ + \ + imeTemp = REG_IME; \ + REG_IME = 0; \ + REG_IE |= flags; \ + REG_IME = imeTemp; \ +} \ + #endif // GUARD_GBA_MACRO_H diff --git a/ld_script.txt b/ld_script.txt index d0ae744d1..301f199f9 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -244,6 +244,7 @@ SECTIONS { src/agb_flash_1m.o(.text); src/agb_flash_mx.o(.text); src/siirtc.o(.text); + src/librfu.o(.text); asm/librfu.o(.text); asm/libagbsyscall.o(.text); tools/agbcc/lib/libgcc.a:_call_via_rX.o(.text); diff --git a/src/librfu.c b/src/librfu.c new file mode 100644 index 000000000..2cf5d6dad --- /dev/null +++ b/src/librfu.c @@ -0,0 +1,217 @@ +#include "global.h" + +#include "main.h" + +typedef struct RfuStruct +{ + s32 unk_0; + u8 unk_4; + u8 unk_5; + u8 unk_6; + u8 unk_7; + u8 unk_8; + u8 unk_9; + u8 timerSelect; + u8 unk_b; + u32 unk_c; + vu8 unk_10; + u8 unk_11; + vu16 unk_12; + vu8 msMode; + u8 unk_15; + u8 unk_16; + u8 unk_17; + void * callbackM; + void * callbackS; + u32 callbackID; + void * unk_24; + void * unk_28; + vu8 unk_2c; + u8 padding[3]; +} RfuStruct; + +typedef struct RfuIntrStruct +{ + u8 unk28Data[0x74]; + u8 unk24Data[0x74]; + u8 block1[0x960]; + u8 block2[0x30]; +} RfuIntrStruct; + +typedef struct RfuState +{ + RfuStruct *rfuStruct; +} RfuState; + +extern IntrFunc IntrSIO32(); +extern struct RfuState gRfuState; +void STWI_init_Callback_M(); +void STWI_init_Callback_S(); +void STWI_set_Callback_M(void * callback); +void STWI_set_Callback_S(void * callback); +extern void STWI_intr_timer(); + +void STWI_init_all(RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + struct RfuStruct *rfuStructTemp; + struct RfuStruct **rfuStructPtr; + u16 ime_temp; + int ret; + + // If we're copying our interrupt into RAM, DMA it to block1 and use + // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // interrupt usually is a pointer to gIntrTable[1] + if (copyInterruptToRam == TRUE) + { + *interrupt = (IntrFunc)(&interruptStruct->block1); + DmaCopy16(3, &IntrSIO32, (void*)(&interruptStruct->block1), 0x960); + + gRfuState.rfuStruct = (struct RfuStruct*)(&interruptStruct->block2); + } + else + { + *interrupt = (IntrFunc)&IntrSIO32; + gRfuState.rfuStruct = (struct RfuStruct*)(&interruptStruct->block1); + } + + rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; + (*rfuStructPtr)->unk_28 = (void*)&interruptStruct->unk28Data; + (*rfuStructPtr)->unk_24 = (void*)(&interruptStruct->unk24Data); + (*rfuStructPtr)->msMode = 1; + + (*rfuStructPtr)->unk_0 = 0; + (*rfuStructPtr)->unk_4 = 0; + (*rfuStructPtr)->unk_5 = 0; + (*rfuStructPtr)->unk_7 = 0; + (*rfuStructPtr)->unk_8 = 0; + (*rfuStructPtr)->unk_9 = 0; + (*rfuStructPtr)->unk_c = 0; + (*rfuStructPtr)->unk_10 = 0; + + // Don't @ me + rfuStructTemp = *rfuStructPtr; + rfuStructTemp->unk_12 = 0; + rfuStructTemp->unk_15 = 0; + + (*rfuStructPtr)->unk_2c = 0; + + REG_RCNT = 0x100; //TODO: mystery bit? + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + STWI_init_Callback_M(); + STWI_init_Callback_S(); + + IntrEnable(INTR_FLAG_SERIAL); +} + +void STWI_init_timer(IntrFunc *interrupt, int timerSelect) +{ + *interrupt = &STWI_intr_timer; + gRfuState.rfuStruct->timerSelect = timerSelect; + + IntrEnable(INTR_FLAG_TIMER0 << gRfuState.rfuStruct->timerSelect); +} + +void AgbRFU_SoftReset() +{ + struct RfuStruct **rfuStructPtr; + struct RfuStruct *rfuStructTemp; + + REG_RCNT = 0x8000; + REG_RCNT = 0x80A0; // all these bits are undocumented + + { + vu16 *timerL = ®_TMCNT_L(gRfuState.rfuStruct->timerSelect); + vu16 *timerH = ®_TMCNT_H(gRfuState.rfuStruct->timerSelect); + + *timerH = 0; + *timerL = 0; + *timerH = 0x83; + + while (*timerL <= 0x11) + { + REG_RCNT = 0x80A2; + } + + *timerH = 3; + } + REG_RCNT = 0x80A0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + + rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; + + (*rfuStructPtr)->unk_0 = 0; + (*rfuStructPtr)->unk_4 = 0; + (*rfuStructPtr)->unk_5 = 0; + (*rfuStructPtr)->unk_6 = 0; + (*rfuStructPtr)->unk_7 = 0; + (*rfuStructPtr)->unk_8 = 0; + (*rfuStructPtr)->unk_9 = 0; + (*rfuStructPtr)->unk_c = 0; + (*rfuStructPtr)->unk_10 = 0; + + // Yeah this is the second time, there's probably something in the struct that I'm missing + rfuStructTemp = *rfuStructPtr; + rfuStructTemp->unk_12 = 0; + rfuStructTemp->msMode = 1; + (*rfuStructPtr)->unk_15 = 0; + + (*rfuStructPtr)->unk_2c = 0; +} + +void STWI_set_MS_mode(u8 mode) +{ + gRfuState.rfuStruct->msMode = mode; +} + +u32 STWI_read_status(u8 index) +{ + int result; + switch(index) + { + case 0: + return gRfuState.rfuStruct->unk_12; + case 1: + return gRfuState.rfuStruct->msMode; + case 2: + // something got inlined here? + //TODO: figure this one out + result = (gRfuState.rfuStruct->unk_0); + __asm__("lsl r0, r0, #16"); + __asm__("lsr r0, r0, #16"); + break; + + case 3: + return gRfuState.rfuStruct->unk_6; + break; + default: + return 0xFFFF; + break; + } + return result; +} + +void STWI_init_Callback_M() +{ + STWI_set_Callback_M(0); +} + +void STWI_init_Callback_S() +{ + STWI_set_Callback_S(0); +} + +void STWI_set_Callback_M(void * callback) +{ + gRfuState.rfuStruct->callbackM = callback; +} + +void STWI_set_Callback_S(void * callback) +{ + gRfuState.rfuStruct->callbackS = callback; +} + +void STWI_set_Callback_ID(u32 id) +{ + gRfuState.rfuStruct->callbackID = id; +} + diff --git a/sym_common.txt b/sym_common.txt index dbf6c17a8..233466e1c 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -448,7 +448,7 @@ gUnknown_03006370: @ 3006370 .include "agb_flash.o" -gUnknown_03007868: @ 3007868 +gRfuState: @ 3007868 .space 0x8 gUnknown_03007870: @ 3007870