summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshinyquagsire23 <mtinc2@gmail.com>2017-09-07 00:51:59 -0600
committershinyquagsire23 <mtinc2@gmail.com>2017-09-07 00:55:52 -0600
commitf1216076d7cb6a383682f423c9b5c14e152e484b (patch)
tree458eca3c9964e7eb1a582013614cdc73aafbef17
parent7ea0d462c49360351006f246f0a300aaa765a843 (diff)
Begin librfu decompilation
-rw-r--r--asm/crt0.s2
-rw-r--r--asm/librfu.s454
-rw-r--r--include/gba/io_reg.h6
-rw-r--r--include/gba/macro.h10
-rw-r--r--ld_script.txt1
-rw-r--r--src/librfu.c217
-rw-r--r--sym_common.txt2
7 files changed, 292 insertions, 400 deletions
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 = &REG_TMCNT_L(gRfuState.rfuStruct->timerSelect);
+ vu16 *timerH = &REG_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