diff options
author | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-12-27 05:17:41 +0800 |
---|---|---|
committer | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2020-01-09 12:38:57 +0800 |
commit | 8f1a8972c19f5cd2522c9e7982bd330ac05305e9 (patch) | |
tree | 8d06f9dcc3b9167e07a03f82ab70305bfe2c050a | |
parent | a436d79177fc54927d14cc2114802dee74176a6b (diff) |
librfu_stwi
Co-authored-by: Max Thomas <mtinc2@gmail.com>
-rw-r--r-- | asm/librfu_stwi.s | 1560 | ||||
-rw-r--r-- | include/gba/io_reg.h | 6 | ||||
-rw-r--r-- | include/gba/macro.h | 12 | ||||
-rw-r--r-- | include/librfu.h | 67 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/librfu_stwi.c | 645 |
6 files changed, 715 insertions, 1577 deletions
diff --git a/asm/librfu_stwi.s b/asm/librfu_stwi.s deleted file mode 100644 index 5434d037f..000000000 --- a/asm/librfu_stwi.s +++ /dev/null @@ -1,1560 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start STWI_init_all -STWI_init_all: @ 81DF114 - push {r4,lr} - adds r3, r0, 0 - lsls r2, 24 - lsrs r2, 24 - cmp r2, 0x1 - bne _081DF150 - adds r2, r3, 0 - adds r2, 0xE8 - str r2, [r1] - ldr r1, _081DF13C @ =0x040000d4 - ldr r0, _081DF140 @ =IntrSIO32 - str r0, [r1] - str r2, [r1, 0x4] - ldr r0, _081DF144 @ =0x800004b0 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - ldr r1, _081DF148 @ =gRfuState - ldr r2, _081DF14C @ =0x00000a48 - adds r0, r3, r2 - b _081DF15A - .align 2, 0 -_081DF13C: .4byte 0x040000d4 -_081DF140: .4byte IntrSIO32 -_081DF144: .4byte 0x800004b0 -_081DF148: .4byte gRfuState -_081DF14C: .4byte 0x00000a48 -_081DF150: - ldr r0, _081DF1D4 @ =IntrSIO32 - str r0, [r1] - ldr r1, _081DF1D8 @ =gRfuState - adds r0, r3, 0 - adds r0, 0xE8 -_081DF15A: - 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, _081DF1DC @ =0x04000134 - movs r2, 0x80 - lsls r2, 1 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r2, _081DF1E0 @ =0x00005003 - adds r0, r2, 0 - strh r0, [r1] - bl STWI_init_Callback_M - bl STWI_init_Callback_S - ldr r3, _081DF1E4 @ =0x04000208 - ldrh r2, [r3] - strh r4, [r3] - ldr r4, _081DF1E8 @ =0x04000200 - ldrh r0, [r4] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF1D4: .4byte IntrSIO32 -_081DF1D8: .4byte gRfuState -_081DF1DC: .4byte 0x04000134 -_081DF1E0: .4byte 0x00005003 -_081DF1E4: .4byte 0x04000208 -_081DF1E8: .4byte 0x04000200 - thumb_func_end STWI_init_all - - thumb_func_start STWI_init_timer -STWI_init_timer: @ 81DF1EC - push {r4,r5,lr} - ldr r2, _081DF218 @ =STWI_intr_timer - str r2, [r0] - ldr r5, _081DF21C @ =gRfuState - ldr r0, [r5] - movs r4, 0 - strb r1, [r0, 0xA] - ldr r3, _081DF220 @ =0x04000208 - ldrh r2, [r3] - strh r4, [r3] - ldr r4, _081DF224 @ =0x04000200 - 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 -_081DF218: .4byte STWI_intr_timer -_081DF21C: .4byte gRfuState -_081DF220: .4byte 0x04000208 -_081DF224: .4byte 0x04000200 - thumb_func_end STWI_init_timer - - thumb_func_start AgbRFU_SoftReset -AgbRFU_SoftReset: @ 81DF228 - push {r4,r5,lr} - ldr r5, _081DF2C0 @ =0x04000134 - movs r1, 0x80 - lsls r1, 8 - adds r0, r1, 0 - strh r0, [r5] - ldr r2, _081DF2C4 @ =0x000080a0 - adds r0, r2, 0 - strh r0, [r5] - ldr r1, _081DF2C8 @ =gRfuState - ldr r0, [r1] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r3, _081DF2CC @ =0x04000100 - adds r2, r0, r3 - ldr r4, _081DF2D0 @ =0x04000102 - 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 _081DF268 - ldr r0, _081DF2D4 @ =0x000080a2 - adds r1, r0, 0 -_081DF260: - strh r1, [r5] - ldrh r0, [r2] - cmp r0, 0x11 - bls _081DF260 -_081DF268: - movs r0, 0x3 - strh r0, [r3] - ldr r1, _081DF2C0 @ =0x04000134 - ldr r2, _081DF2C4 @ =0x000080a0 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r3, _081DF2D8 @ =0x00005003 - 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 -_081DF2C0: .4byte 0x04000134 -_081DF2C4: .4byte 0x000080a0 -_081DF2C8: .4byte gRfuState -_081DF2CC: .4byte 0x04000100 -_081DF2D0: .4byte 0x04000102 -_081DF2D4: .4byte 0x000080a2 -_081DF2D8: .4byte 0x00005003 - thumb_func_end AgbRFU_SoftReset - - thumb_func_start STWI_set_MS_mode -STWI_set_MS_mode: @ 81DF2DC - lsls r0, 24 - lsrs r0, 24 - ldr r1, _081DF2EC @ =gRfuState - ldr r1, [r1] - ldrb r2, [r1, 0x14] - strb r0, [r1, 0x14] - bx lr - .align 2, 0 -_081DF2EC: .4byte gRfuState - thumb_func_end STWI_set_MS_mode - - thumb_func_start STWI_read_status -STWI_read_status: @ 81DF2F0 - push {lr} - lsls r0, 24 - lsrs r0, 24 - adds r1, r0, 0 - cmp r0, 0x1 - beq _081DF31C - cmp r0, 0x1 - bgt _081DF306 - cmp r0, 0 - beq _081DF310 - b _081DF344 -_081DF306: - cmp r1, 0x2 - beq _081DF328 - cmp r1, 0x3 - beq _081DF338 - b _081DF344 -_081DF310: - ldr r0, _081DF318 @ =gRfuState - ldr r0, [r0] - ldrh r0, [r0, 0x12] - b _081DF346 - .align 2, 0 -_081DF318: .4byte gRfuState -_081DF31C: - ldr r0, _081DF324 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0x14] - b _081DF346 - .align 2, 0 -_081DF324: .4byte gRfuState -_081DF328: - ldr r0, _081DF334 @ =gRfuState - ldr r0, [r0] - ldr r0, [r0] - lsls r0, 16 - lsrs r0, 16 - b _081DF346 - .align 2, 0 -_081DF334: .4byte gRfuState -_081DF338: - ldr r0, _081DF340 @ =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0x6] - b _081DF346 - .align 2, 0 -_081DF340: .4byte gRfuState -_081DF344: - ldr r0, _081DF34C @ =0x0000ffff -_081DF346: - pop {r1} - bx r1 - .align 2, 0 -_081DF34C: .4byte 0x0000ffff - thumb_func_end STWI_read_status - - thumb_func_start STWI_init_Callback_M -STWI_init_Callback_M: @ 81DF350 - 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: @ 81DF35C - 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: @ 81DF368 - ldr r1, _081DF370 @ =gRfuState - ldr r1, [r1] - str r0, [r1, 0x18] - bx lr - .align 2, 0 -_081DF370: .4byte gRfuState - thumb_func_end STWI_set_Callback_M - - thumb_func_start STWI_set_Callback_S -STWI_set_Callback_S: @ 81DF374 - ldr r1, _081DF37C @ =gRfuState - ldr r1, [r1] - str r0, [r1, 0x1C] - bx lr - .align 2, 0 -_081DF37C: .4byte gRfuState - thumb_func_end STWI_set_Callback_S - - thumb_func_start STWI_set_Callback_ID -STWI_set_Callback_ID: @ 81DF380 - ldr r1, _081DF388 @ =gRfuState - ldr r1, [r1] - str r0, [r1, 0x20] - bx lr - .align 2, 0 -_081DF388: .4byte gRfuState - thumb_func_end STWI_set_Callback_ID - - thumb_func_start STWI_poll_CommandEnd -STWI_poll_CommandEnd: @ 81DF38C - push {lr} - ldr r0, _081DF3B0 @ =gRfuState - ldr r1, [r0] - adds r2, r1, 0 - adds r2, 0x2C - ldrb r1, [r2] - adds r3, r0, 0 - cmp r1, 0x1 - bne _081DF3A6 - adds r1, r2, 0 -_081DF3A0: - ldrb r0, [r1] - cmp r0, 0x1 - beq _081DF3A0 -_081DF3A6: - ldr r0, [r3] - ldrh r0, [r0, 0x12] - pop {r1} - bx r1 - .align 2, 0 -_081DF3B0: .4byte gRfuState - thumb_func_end STWI_poll_CommandEnd - - thumb_func_start STWI_send_ResetREQ -STWI_send_ResetREQ: @ 81DF3B4 - push {lr} - movs r0, 0x10 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF3CE - ldr r0, _081DF3D4 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF3CE: - pop {r0} - bx r0 - .align 2, 0 -_081DF3D4: .4byte gRfuState - thumb_func_end STWI_send_ResetREQ - - thumb_func_start STWI_send_LinkStatusREQ -STWI_send_LinkStatusREQ: @ 81DF3D8 - push {lr} - movs r0, 0x11 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF3F2 - ldr r0, _081DF3F8 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF3F2: - pop {r0} - bx r0 - .align 2, 0 -_081DF3F8: .4byte gRfuState - thumb_func_end STWI_send_LinkStatusREQ - - thumb_func_start STWI_send_VersionStatusREQ -STWI_send_VersionStatusREQ: @ 81DF3FC - push {lr} - movs r0, 0x12 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF416 - ldr r0, _081DF41C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF416: - pop {r0} - bx r0 - .align 2, 0 -_081DF41C: .4byte gRfuState - thumb_func_end STWI_send_VersionStatusREQ - - thumb_func_start STWI_send_SystemStatusREQ -STWI_send_SystemStatusREQ: @ 81DF420 - push {lr} - movs r0, 0x13 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF43A - ldr r0, _081DF440 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF43A: - pop {r0} - bx r0 - .align 2, 0 -_081DF440: .4byte gRfuState - thumb_func_end STWI_send_SystemStatusREQ - - thumb_func_start STWI_send_SlotStatusREQ -STWI_send_SlotStatusREQ: @ 81DF444 - push {lr} - movs r0, 0x14 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF45E - ldr r0, _081DF464 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF45E: - pop {r0} - bx r0 - .align 2, 0 -_081DF464: .4byte gRfuState - thumb_func_end STWI_send_SlotStatusREQ - - thumb_func_start STWI_send_ConfigStatusREQ -STWI_send_ConfigStatusREQ: @ 81DF468 - push {lr} - movs r0, 0x15 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF482 - ldr r0, _081DF488 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF482: - pop {r0} - bx r0 - .align 2, 0 -_081DF488: .4byte gRfuState - thumb_func_end STWI_send_ConfigStatusREQ - - thumb_func_start STWI_send_GameConfigREQ -STWI_send_GameConfigREQ: @ 81DF48C - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r0, 0x16 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF4D8 - ldr r2, _081DF4E0 @ =gRfuState - ldr r1, [r2] - movs r0, 0x6 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r1, [r0, 0x24] - adds r1, 0x4 - ldrh r0, [r4] - strh r0, [r1] - adds r1, 0x2 - adds r4, 0x2 - movs r2, 0xD -_081DF4B6: - ldrb r0, [r4] - strb r0, [r1] - adds r1, 0x1 - adds r4, 0x1 - subs r2, 0x1 - cmp r2, 0 - bge _081DF4B6 - movs r2, 0x7 -_081DF4C6: - ldrb r0, [r5] - strb r0, [r1] - adds r1, 0x1 - adds r5, 0x1 - subs r2, 0x1 - cmp r2, 0 - bge _081DF4C6 - bl STWI_start_Command -_081DF4D8: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF4E0: .4byte gRfuState - thumb_func_end STWI_send_GameConfigREQ - - thumb_func_start STWI_send_SystemConfigREQ -STWI_send_SystemConfigREQ: @ 81DF4E4 - push {r4-r6,lr} - lsls r0, 16 - lsrs r6, r0, 16 - lsls r1, 24 - lsrs r5, r1, 24 - lsls r2, 24 - lsrs r4, r2, 24 - movs r0, 0x17 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF51A - ldr r2, _081DF520 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - adds r0, 0x4 - strb r4, [r0] - adds r0, 0x1 - strb r5, [r0] - adds r0, 0x1 - strh r6, [r0] - bl STWI_start_Command -_081DF51A: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF520: .4byte gRfuState - thumb_func_end STWI_send_SystemConfigREQ - - thumb_func_start STWI_send_SC_StartREQ -STWI_send_SC_StartREQ: @ 81DF524 - push {lr} - movs r0, 0x19 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF53E - ldr r0, _081DF544 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF53E: - pop {r0} - bx r0 - .align 2, 0 -_081DF544: .4byte gRfuState - thumb_func_end STWI_send_SC_StartREQ - - thumb_func_start STWI_send_SC_PollingREQ -STWI_send_SC_PollingREQ: @ 81DF548 - push {lr} - movs r0, 0x1A - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF562 - ldr r0, _081DF568 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF562: - pop {r0} - bx r0 - .align 2, 0 -_081DF568: .4byte gRfuState - thumb_func_end STWI_send_SC_PollingREQ - - thumb_func_start STWI_send_SC_EndREQ -STWI_send_SC_EndREQ: @ 81DF56C - push {lr} - movs r0, 0x1B - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF586 - ldr r0, _081DF58C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF586: - pop {r0} - bx r0 - .align 2, 0 -_081DF58C: .4byte gRfuState - thumb_func_end STWI_send_SC_EndREQ - - thumb_func_start STWI_send_SP_StartREQ -STWI_send_SP_StartREQ: @ 81DF590 - push {lr} - movs r0, 0x1C - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF5AA - ldr r0, _081DF5B0 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF5AA: - pop {r0} - bx r0 - .align 2, 0 -_081DF5B0: .4byte gRfuState - thumb_func_end STWI_send_SP_StartREQ - - thumb_func_start STWI_send_SP_PollingREQ -STWI_send_SP_PollingREQ: @ 81DF5B4 - push {lr} - movs r0, 0x1D - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF5CE - ldr r0, _081DF5D4 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF5CE: - pop {r0} - bx r0 - .align 2, 0 -_081DF5D4: .4byte gRfuState - thumb_func_end STWI_send_SP_PollingREQ - - thumb_func_start STWI_send_SP_EndREQ -STWI_send_SP_EndREQ: @ 81DF5D8 - push {lr} - movs r0, 0x1E - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF5F2 - ldr r0, _081DF5F8 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF5F2: - pop {r0} - bx r0 - .align 2, 0 -_081DF5F8: .4byte gRfuState - thumb_func_end STWI_send_SP_EndREQ - - thumb_func_start STWI_send_CP_StartREQ -STWI_send_CP_StartREQ: @ 81DF5FC - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - movs r0, 0x1F - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF620 - ldr r2, _081DF628 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - str r4, [r0, 0x4] - bl STWI_start_Command -_081DF620: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF628: .4byte gRfuState - thumb_func_end STWI_send_CP_StartREQ - - thumb_func_start STWI_send_CP_PollingREQ -STWI_send_CP_PollingREQ: @ 81DF62C - push {lr} - movs r0, 0x20 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF646 - ldr r0, _081DF64C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF646: - pop {r0} - bx r0 - .align 2, 0 -_081DF64C: .4byte gRfuState - thumb_func_end STWI_send_CP_PollingREQ - - thumb_func_start STWI_send_CP_EndREQ -STWI_send_CP_EndREQ: @ 81DF650 - push {lr} - movs r0, 0x21 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF66A - ldr r0, _081DF670 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF66A: - pop {r0} - bx r0 - .align 2, 0 -_081DF670: .4byte gRfuState - thumb_func_end STWI_send_CP_EndREQ - - thumb_func_start STWI_send_DataTxREQ -STWI_send_DataTxREQ: @ 81DF674 - push {r4-r6,lr} - adds r6, r0, 0 - lsls r4, r1, 24 - lsrs r5, r4, 24 - movs r0, 0x24 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF6B2 - lsrs r2, r4, 26 - movs r0, 0x3 - ands r0, r5 - cmp r0, 0 - beq _081DF694 - adds r2, 0x1 -_081DF694: - ldr r1, _081DF6B8 @ =gRfuState - ldr r0, [r1] - strb r2, [r0, 0x4] - ldr r0, [r1] - ldr r1, [r0, 0x24] - adds r1, 0x4 - ldrb r2, [r0, 0x4] - movs r0, 0x80 - lsls r0, 19 - orrs r2, r0 - adds r0, r6, 0 - bl CpuSet - bl STWI_start_Command -_081DF6B2: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF6B8: .4byte gRfuState - thumb_func_end STWI_send_DataTxREQ - - thumb_func_start STWI_send_DataTxAndChangeREQ -STWI_send_DataTxAndChangeREQ: @ 81DF6BC - push {r4-r6,lr} - adds r6, r0, 0 - lsls r4, r1, 24 - lsrs r5, r4, 24 - movs r0, 0x25 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF6FA - lsrs r2, r4, 26 - movs r0, 0x3 - ands r0, r5 - cmp r0, 0 - beq _081DF6DC - adds r2, 0x1 -_081DF6DC: - ldr r1, _081DF700 @ =gRfuState - ldr r0, [r1] - strb r2, [r0, 0x4] - ldr r0, [r1] - ldr r1, [r0, 0x24] - adds r1, 0x4 - ldrb r2, [r0, 0x4] - movs r0, 0x80 - lsls r0, 19 - orrs r2, r0 - adds r0, r6, 0 - bl CpuSet - bl STWI_start_Command -_081DF6FA: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF700: .4byte gRfuState - thumb_func_end STWI_send_DataTxAndChangeREQ - - thumb_func_start STWI_send_DataRxREQ -STWI_send_DataRxREQ: @ 81DF704 - push {lr} - movs r0, 0x26 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF71E - ldr r0, _081DF724 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF71E: - pop {r0} - bx r0 - .align 2, 0 -_081DF724: .4byte gRfuState - thumb_func_end STWI_send_DataRxREQ - - thumb_func_start STWI_send_MS_ChangeREQ -STWI_send_MS_ChangeREQ: @ 81DF728 - push {lr} - movs r0, 0x27 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF742 - ldr r0, _081DF748 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF742: - pop {r0} - bx r0 - .align 2, 0 -_081DF748: .4byte gRfuState - thumb_func_end STWI_send_MS_ChangeREQ - - thumb_func_start STWI_send_DataReadyAndChangeREQ -STWI_send_DataReadyAndChangeREQ: @ 81DF74C - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r5, r4, 0 - movs r0, 0x28 - bl STWI_init - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0 - bne _081DF792 - cmp r4, 0 - bne _081DF774 - ldr r0, _081DF770 @ =gRfuState - ldr r0, [r0] - strb r3, [r0, 0x4] - b _081DF78E - .align 2, 0 -_081DF770: .4byte gRfuState -_081DF774: - ldr r2, _081DF798 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - adds r0, 0x4 - strb r5, [r0] - adds r0, 0x1 - strb r3, [r0] - adds r0, 0x1 - strb r3, [r0] - strb r3, [r0, 0x1] -_081DF78E: - bl STWI_start_Command -_081DF792: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF798: .4byte gRfuState - thumb_func_end STWI_send_DataReadyAndChangeREQ - - thumb_func_start STWI_send_DisconnectedAndChangeREQ -STWI_send_DisconnectedAndChangeREQ: @ 81DF79C - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - movs r0, 0x29 - bl STWI_init - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0 - bne _081DF7D2 - ldr r2, _081DF7D8 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - adds r0, 0x4 - strb r4, [r0] - adds r0, 0x1 - strb r5, [r0] - adds r0, 0x1 - strb r3, [r0] - strb r3, [r0, 0x1] - bl STWI_start_Command -_081DF7D2: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF7D8: .4byte gRfuState - thumb_func_end STWI_send_DisconnectedAndChangeREQ - - thumb_func_start STWI_send_ResumeRetransmitAndChangeREQ -STWI_send_ResumeRetransmitAndChangeREQ: @ 81DF7DC - push {lr} - movs r0, 0x37 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF7F6 - ldr r0, _081DF7FC @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF7F6: - pop {r0} - bx r0 - .align 2, 0 -_081DF7FC: .4byte gRfuState - thumb_func_end STWI_send_ResumeRetransmitAndChangeREQ - - thumb_func_start STWI_send_DisconnectREQ -STWI_send_DisconnectREQ: @ 81DF800 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r0, 0x30 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF824 - ldr r2, _081DF82C @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r0, [r0, 0x24] - str r4, [r0, 0x4] - bl STWI_start_Command -_081DF824: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081DF82C: .4byte gRfuState - thumb_func_end STWI_send_DisconnectREQ - - thumb_func_start STWI_send_TestModeREQ -STWI_send_TestModeREQ: @ 81DF830 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 24 - lsrs r4, r1, 24 - movs r0, 0x31 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF85C - ldr r2, _081DF864 @ =gRfuState - ldr r1, [r2] - movs r0, 0x1 - strb r0, [r1, 0x4] - ldr r0, [r2] - ldr r1, [r0, 0x24] - lsls r0, r4, 8 - orrs r0, r5 - str r0, [r1, 0x4] - bl STWI_start_Command -_081DF85C: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081DF864: .4byte gRfuState - thumb_func_end STWI_send_TestModeREQ - - thumb_func_start STWI_send_CPR_StartREQ -STWI_send_CPR_StartREQ: @ 81DF868 - push {r4-r6,lr} - lsls r0, 16 - lsrs r5, r0, 16 - lsls r1, 16 - lsrs r4, r1, 16 - lsls r2, 24 - lsrs r6, r2, 24 - movs r0, 0x32 - bl STWI_init - lsls r0, 16 - cmp r0, 0 - bne _081DF89A - ldr r2, _081DF8A0 @ =gRfuState - ldr r1, [r2] - movs r0, 0x2 - strb r0, [r1, 0x4] - lsls r0, r5, 16 - orrs r0, r4 - ldr r1, [r2] - ldr r1, [r1, 0x24] - str r0, [r1, 0x4] - str r6, [r1, 0x8] - bl STWI_start_Command -_081DF89A: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_081DF8A0: .4byte gRfuState - thumb_func_end STWI_send_CPR_StartREQ - - thumb_func_start STWI_send_CPR_PollingREQ -STWI_send_CPR_PollingREQ: @ 81DF8A4 - push {lr} - movs r0, 0x33 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF8BE - ldr r0, _081DF8C4 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF8BE: - pop {r0} - bx r0 - .align 2, 0 -_081DF8C4: .4byte gRfuState - thumb_func_end STWI_send_CPR_PollingREQ - - thumb_func_start STWI_send_CPR_EndREQ -STWI_send_CPR_EndREQ: @ 81DF8C8 - push {lr} - movs r0, 0x34 - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF8E2 - ldr r0, _081DF8E8 @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF8E2: - pop {r0} - bx r0 - .align 2, 0 -_081DF8E8: .4byte gRfuState - thumb_func_end STWI_send_CPR_EndREQ - - thumb_func_start STWI_send_StopModeREQ -STWI_send_StopModeREQ: @ 81DF8EC - push {lr} - movs r0, 0x3D - bl STWI_init - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - bne _081DF906 - ldr r0, _081DF90C @ =gRfuState - ldr r0, [r0] - strb r1, [r0, 0x4] - bl STWI_start_Command -_081DF906: - pop {r0} - bx r0 - .align 2, 0 -_081DF90C: .4byte gRfuState - thumb_func_end STWI_send_StopModeREQ - - thumb_func_start STWI_intr_timer -STWI_intr_timer: @ 81DF910 - push {r4,lr} - ldr r4, _081DF928 @ =gRfuState - ldr r1, [r4] - ldr r0, [r1, 0xC] - cmp r0, 0x2 - beq _081DF936 - cmp r0, 0x2 - bhi _081DF92C - cmp r0, 0x1 - beq _081DF944 - b _081DF96C - .align 2, 0 -_081DF928: .4byte gRfuState -_081DF92C: - cmp r0, 0x3 - beq _081DF94E - cmp r0, 0x4 - beq _081DF944 - b _081DF96C -_081DF936: - ldrb r0, [r1, 0x10] - movs r0, 0x1 - strb r0, [r1, 0x10] - movs r0, 0x32 - bl STWI_set_timer - b _081DF96C -_081DF944: - bl STWI_stop_timer - bl STWI_restart_Command - b _081DF96C -_081DF94E: - ldrb r0, [r1, 0x10] - movs r0, 0x1 - strb r0, [r1, 0x10] - bl STWI_stop_timer - bl STWI_reset_ClockCounter - ldr r0, [r4] - ldr r2, [r0, 0x18] - cmp r2, 0 - beq _081DF96C - movs r0, 0xFF - movs r1, 0 - bl _call_via_r2 -_081DF96C: - pop {r4} - pop {r0} - bx r0 - thumb_func_end STWI_intr_timer - - thumb_func_start STWI_set_timer -STWI_set_timer: @ 81DF974 - push {r4-r7,lr} - lsls r0, 24 - lsrs r3, r0, 24 - adds r5, r3, 0 - ldr r2, _081DF9A4 @ =gRfuState - ldr r0, [r2] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r1, _081DF9A8 @ =0x04000100 - adds r4, r0, r1 - adds r1, 0x2 - adds r7, r0, r1 - ldr r1, _081DF9AC @ =0x04000208 - movs r0, 0 - strh r0, [r1] - adds r6, r2, 0 - cmp r3, 0x50 - beq _081DF9CC - cmp r3, 0x50 - bgt _081DF9B0 - cmp r3, 0x32 - beq _081DF9BA - b _081DF9F8 - .align 2, 0 -_081DF9A4: .4byte gRfuState -_081DF9A8: .4byte 0x04000100 -_081DF9AC: .4byte 0x04000208 -_081DF9B0: - cmp r5, 0x64 - beq _081DF9DC - cmp r5, 0x82 - beq _081DF9EC - b _081DF9F8 -_081DF9BA: - ldr r1, _081DF9C8 @ =0x0000fccb - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x1 - b _081DF9F6 - .align 2, 0 -_081DF9C8: .4byte 0x0000fccb -_081DF9CC: - ldr r1, _081DF9D8 @ =0x0000fae0 - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x2 - b _081DF9F6 - .align 2, 0 -_081DF9D8: .4byte 0x0000fae0 -_081DF9DC: - ldr r1, _081DF9E8 @ =0x0000f996 - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x3 - b _081DF9F6 - .align 2, 0 -_081DF9E8: .4byte 0x0000f996 -_081DF9EC: - ldr r1, _081DFA14 @ =0x0000f7ad - adds r0, r1, 0 - strh r0, [r4] - ldr r1, [r6] - movs r0, 0x4 -_081DF9F6: - str r0, [r1, 0xC] -_081DF9F8: - movs r0, 0xC3 - strh r0, [r7] - ldr r2, _081DFA18 @ =0x04000202 - ldr r1, [r6] - movs r0, 0x8 - ldrb r1, [r1, 0xA] - lsls r0, r1 - strh r0, [r2] - ldr r1, _081DFA1C @ =0x04000208 - movs r0, 0x1 - strh r0, [r1] - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_081DFA14: .4byte 0x0000f7ad -_081DFA18: .4byte 0x04000202 -_081DFA1C: .4byte 0x04000208 - thumb_func_end STWI_set_timer - - thumb_func_start STWI_stop_timer -STWI_stop_timer: @ 81DFA20 - ldr r2, _081DFA40 @ =gRfuState - ldr r0, [r2] - movs r1, 0 - str r1, [r0, 0xC] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r3, _081DFA44 @ =0x04000100 - adds r0, r3 - strh r1, [r0] - ldr r0, [r2] - ldrb r0, [r0, 0xA] - lsls r0, 2 - ldr r2, _081DFA48 @ =0x04000102 - adds r0, r2 - strh r1, [r0] - bx lr - .align 2, 0 -_081DFA40: .4byte gRfuState -_081DFA44: .4byte 0x04000100 -_081DFA48: .4byte 0x04000102 - thumb_func_end STWI_stop_timer - - thumb_func_start STWI_init -STWI_init: @ 81DFA4C - push {r4-r6,lr} - lsls r0, 24 - lsrs r5, r0, 24 - adds r6, r5, 0 - ldr r0, _081DFA78 @ =0x04000208 - ldrh r0, [r0] - cmp r0, 0 - bne _081DFA80 - ldr r0, _081DFA7C @ =gRfuState - ldr r1, [r0] - ldrh r0, [r1, 0x12] - movs r0, 0x6 - strh r0, [r1, 0x12] - ldr r2, [r1, 0x18] - cmp r2, 0 - beq _081DFACA - ldrh r1, [r1, 0x12] - adds r0, r5, 0 - bl _call_via_r2 - b _081DFACA - .align 2, 0 -_081DFA78: .4byte 0x04000208 -_081DFA7C: .4byte gRfuState -_081DFA80: - ldr r4, _081DFAAC @ =gRfuState - ldr r2, [r4] - adds r3, r2, 0 - adds r3, 0x2C - ldrb r0, [r3] - cmp r0, 0x1 - bne _081DFAB0 - ldrh r0, [r2, 0x12] - movs r1, 0 - movs r0, 0x2 - strh r0, [r2, 0x12] - ldrb r0, [r3] - strb r1, [r3] - ldr r0, [r4] - ldr r2, [r0, 0x18] - cmp r2, 0 - beq _081DFACA - ldrh r1, [r0, 0x12] - adds r0, r5, 0 - bl _call_via_r2 - b _081DFACA - .align 2, 0 -_081DFAAC: .4byte gRfuState -_081DFAB0: - ldrb r0, [r2, 0x14] - cmp r0, 0 - bne _081DFACE - ldrh r0, [r2, 0x12] - movs r0, 0x4 - strh r0, [r2, 0x12] - ldr r3, [r2, 0x18] - cmp r3, 0 - beq _081DFACA - ldrh r1, [r2, 0x12] - adds r0, r5, 0 - bl _call_via_r3 -_081DFACA: - movs r0, 0x1 - b _081DFB16 -_081DFACE: - ldrb r0, [r3] - movs r1, 0 - movs r0, 0x1 - strb r0, [r3] - ldr r0, [r4] - strb r6, [r0, 0x6] - ldr r0, [r4] - str r1, [r0] - strb r1, [r0, 0x4] - ldr r0, [r4] - strb r1, [r0, 0x5] - ldr r0, [r4] - strb r1, [r0, 0x7] - ldr r0, [r4] - strb r1, [r0, 0x8] - ldr r0, [r4] - strb r1, [r0, 0x9] - ldr r0, [r4] - str r1, [r0, 0xC] - ldrb r2, [r0, 0x10] - strb r1, [r0, 0x10] - ldr r0, [r4] - ldrh r2, [r0, 0x12] - movs r2, 0 - strh r1, [r0, 0x12] - strb r2, [r0, 0x15] - ldr r1, _081DFB1C @ =0x04000134 - movs r2, 0x80 - lsls r2, 1 - adds r0, r2, 0 - strh r0, [r1] - subs r1, 0xC - ldr r2, _081DFB20 @ =0x00005003 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 -_081DFB16: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_081DFB1C: .4byte 0x04000134 -_081DFB20: .4byte 0x00005003 - thumb_func_end STWI_init - - thumb_func_start STWI_start_Command -STWI_start_Command: @ 81DFB24 - push {r4,r5,lr} - ldr r5, _081DFB7C @ =gRfuState - ldr r0, [r5] - ldr r3, [r0, 0x24] - ldrb r1, [r0, 0x4] - lsls r1, 8 - ldrb r0, [r0, 0x6] - ldr r2, _081DFB80 @ =0x99660000 - orrs r0, r2 - orrs r1, r0 - str r1, [r3] - ldr r2, _081DFB84 @ =0x04000120 - ldr r1, [r5] - ldr r0, [r1, 0x24] - ldr r0, [r0] - str r0, [r2] - movs r2, 0 - str r2, [r1] - movs r0, 0x1 - strb r0, [r1, 0x5] - ldr r4, _081DFB88 @ =0x04000208 - ldrh r3, [r4] - strh r2, [r4] - ldr r2, _081DFB8C @ =0x04000200 - ldr r1, [r5] - movs r0, 0x8 - ldrb r1, [r1, 0xA] - lsls r0, r1 - ldrh r1, [r2] - orrs r0, r1 - strh r0, [r2] - ldrh r0, [r2] - movs r1, 0x80 - orrs r0, r1 - strh r0, [r2] - strh r3, [r4] - ldr r1, _081DFB90 @ =0x04000128 - ldr r2, _081DFB94 @ =0x00005083 - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_081DFB7C: .4byte gRfuState -_081DFB80: .4byte 0x99660000 -_081DFB84: .4byte 0x04000120 -_081DFB88: .4byte 0x04000208 -_081DFB8C: .4byte 0x04000200 -_081DFB90: .4byte 0x04000128 -_081DFB94: .4byte 0x00005083 - thumb_func_end STWI_start_Command - - thumb_func_start STWI_restart_Command -STWI_restart_Command: @ 81DFB98 - push {r4,lr} - ldr r4, _081DFBB0 @ =gRfuState - ldr r2, [r4] - ldrb r0, [r2, 0x15] - adds r3, r4, 0 - cmp r0, 0x1 - bhi _081DFBB4 - adds r0, 0x1 - strb r0, [r2, 0x15] - bl STWI_start_Command - b _081DFC0E - .align 2, 0 -_081DFBB0: .4byte gRfuState -_081DFBB4: - ldrb r0, [r2, 0x6] - cmp r0, 0x27 - beq _081DFBC6 - cmp r0, 0x25 - beq _081DFBC6 - cmp r0, 0x35 - beq _081DFBC6 - cmp r0, 0x37 - bne _081DFBE8 -_081DFBC6: - ldr r0, [r3] - ldrh r1, [r0, 0x12] - movs r2, 0 - movs r1, 0x1 - strh r1, [r0, 0x12] - adds r0, 0x2C - ldrb r1, [r0] - strb r2, [r0] - ldr r1, [r3] - ldr r2, [r1, 0x18] - cmp r2, 0 - beq _081DFC0E - ldrb r0, [r1, 0x6] - ldrh r1, [r1, 0x12] - bl _call_via_r2 - b _081DFC0E -_081DFBE8: - ldrh r0, [r2, 0x12] - movs r1, 0 - movs r0, 0x1 - strh r0, [r2, 0x12] - adds r0, r2, 0 - adds r0, 0x2C - ldrb r2, [r0] - strb r1, [r0] - ldr r1, [r4] - ldr r2, [r1, 0x18] - cmp r2, 0 - beq _081DFC08 - ldrb r0, [r1, 0x6] - ldrh r1, [r1, 0x12] - bl _call_via_r2 -_081DFC08: - ldr r1, [r4] - movs r0, 0x4 - str r0, [r1] -_081DFC0E: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end STWI_restart_Command - - thumb_func_start STWI_reset_ClockCounter -STWI_reset_ClockCounter: @ 81DFC18 - ldr r3, _081DFC44 @ =gRfuState - ldr r1, [r3] - movs r0, 0x5 - str r0, [r1] - movs r2, 0 - strb r2, [r1, 0x4] - ldr r0, [r3] - strb r2, [r0, 0x5] - ldr r1, _081DFC48 @ =0x04000120 - movs r0, 0x80 - lsls r0, 24 - str r0, [r1] - adds r1, 0x8 - strh r2, [r1] - ldr r2, _081DFC4C @ =0x00005003 - adds r0, r2, 0 - strh r0, [r1] - adds r2, 0x7F - adds r0, r2, 0 - strh r0, [r1] - movs r0, 0 - bx lr - .align 2, 0 -_081DFC44: .4byte gRfuState -_081DFC48: .4byte 0x04000120 -_081DFC4C: .4byte 0x00005003 - thumb_func_end STWI_reset_ClockCounter diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 6d54bc5fb..8eacc8aa7 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 e416c3577..a3e870210 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -105,7 +105,7 @@ } \ } -#define DmaClearLarge(dmaNum, dest, size, block, bit) \ +#define DmaClearLarge(dmaNum, dest, size, block, bit) \ { \ u32 _size = size; \ while (1) \ @@ -170,4 +170,14 @@ #define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16) #define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32) +#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/include/librfu.h b/include/librfu.h index 5eb9fd7a0..709074f9c 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -108,7 +108,7 @@ struct RfuStruct u8 ackActiveCommand; u8 timerSelect; u8 unk_b; - s32 timerState; + u32 timerState; // this field is s32 in emerald vu8 timerActive; u8 unk_11; vu16 error; @@ -126,10 +126,10 @@ struct RfuStruct struct RfuIntrStruct { - u8 rxPacketAlloc[0x74]; - u8 txPacketAlloc[0x74]; - u8 block1[0x960]; - u8 block2[0x30]; + union RfuPacket rxPacketAlloc; + union RfuPacket txPacketAlloc; + u8 block1[0x960]; // size of librfu_intr.s binary + struct RfuStruct block2; }; struct RfuSlotStatusUNI @@ -248,14 +248,6 @@ struct Unk_3007470 u16 unkA; }; -struct STWIStruct -{ - // TODO: resolve the struct - u8 unk_0[232]; - u8 function[2400]; - struct RfuStruct STWIStatus; -}; - struct Unk_3001190 { struct RfuLinkStatus linkStatus; @@ -263,7 +255,7 @@ struct Unk_3001190 struct RfuFixed fixed; struct RfuSlotStatusNI NI[4]; struct RfuSlotStatusUNI UNI[4]; - struct STWIStruct STWI; + struct RfuIntrStruct intr; }; extern struct RfuStruct *gRfuState; @@ -275,7 +267,6 @@ extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; void rfu_STC_clearAPIVariables(void); -void STWI_init_all(struct RfuIntrStruct * interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_REQ_stopMode(void); void rfu_waitREQComplete(void); u32 rfu_REQBN_softReset_and_checkID(void); @@ -323,4 +314,50 @@ void rfu_UNI_clearRecvNewDataFlag(u8 a0); void rfu_REQ_PARENT_resumeRetransmitAndChange(void); void rfu_NI_setSendData(u8, u8, const void *, u32); +// librfu_intr +void IntrSIO32(void); + +// librfu_stwi +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_init_timer(IntrFunc *interrupt, s32 timerSelect); +void AgbRFU_SoftReset(void); +void STWI_set_Callback_ID(u32 id); +u16 STWI_read_status(u8 index); +u16 STWI_poll_CommandEnd(void); +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_ResetREQ(void); +void STWI_send_LinkStatusREQ(void); +void STWI_send_VersionStatusREQ(void); +void STWI_send_SlotStatusREQ(void); +void STWI_send_ConfigStatusREQ(void); +void STWI_send_ResumeRetransmitAndChangeREQ(void); +void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3); +void STWI_send_SC_StartREQ(void); +void STWI_send_SC_PollingREQ(void); +void STWI_send_SC_EndREQ(void); +void STWI_send_SP_StartREQ(void); +void STWI_send_SP_PollingREQ(void); +void STWI_send_SP_EndREQ(void); +void STWI_send_CP_StartREQ(u16 unk1); +void STWI_send_CP_PollingREQ(void); +void STWI_send_CP_EndREQ(void); +void STWI_send_DataTxREQ(const void *in, u8 size); +void STWI_send_DataTxAndChangeREQ(const void *in, u8 size); +void STWI_send_DataReadyAndChangeREQ(u8 unk); +void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1); +void STWI_send_DisconnectREQ(u8 unk); +void STWI_send_TestModeREQ(u8 unk0, u8 unk1); +void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2); +void STWI_send_CPR_PollingREQ(void); +void STWI_send_CPR_EndREQ(void); + #endif // GUARD_LIBRFU_H diff --git a/ld_script.txt b/ld_script.txt index aeb11a271..c57b7b4a0 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -317,7 +317,7 @@ SECTIONS { src/agb_flash_1m.o(.text); src/agb_flash_mx.o(.text); src/agb_flash_le.o(.text); - asm/librfu_stwi.o(.text); + src/librfu_stwi.o(.text); asm/librfu_intr.o(.text); asm/librfu.o(.text); src/isagbprn.o(.text); diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c new file mode 100644 index 000000000..fe8a4ef76 --- /dev/null +++ b/src/librfu_stwi.c @@ -0,0 +1,645 @@ +#include "global.h" +#include "librfu.h" + +static void STWI_intr_timer(void); +static u16 STWI_init(u8 request); +static s32 STWI_start_Command(void); +static void STWI_set_timer(u8 unk); +static void STWI_stop_timer(void); +static s32 STWI_restart_Command(void); +static s32 STWI_reset_ClockCounter(void); + +void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + // 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, interruptStruct->block1, sizeof(interruptStruct->block1)); + gRfuState = &interruptStruct->block2; + } + else + { + *interrupt = IntrSIO32; + gRfuState = (struct RfuStruct *)interruptStruct->block1; + } + gRfuState->rxPacket = &interruptStruct->rxPacketAlloc; + gRfuState->txPacket = &interruptStruct->txPacketAlloc; + gRfuState->msMode = 1; + gRfuState->state = 0; + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + gRfuState->ackLength = 0; + gRfuState->ackNext = 0; + gRfuState->ackActiveCommand = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->error = 0; + gRfuState->recoveryCount = 0; + gRfuState->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, s32 timerSelect) +{ + *interrupt = STWI_intr_timer; + gRfuState->timerSelect = timerSelect; + IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); +} + +void AgbRFU_SoftReset(void) +{ + vu16 *timerL; + vu16 *timerH; + + REG_RCNT = 0x8000; + REG_RCNT = 0x80A0; // all these bits are undocumented + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->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; + gRfuState->state = 0; + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + gRfuState->reqActiveCommand = 0; + gRfuState->ackLength = 0; + gRfuState->ackNext = 0; + gRfuState->ackActiveCommand = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->error = 0; + gRfuState->msMode = 1; + gRfuState->recoveryCount = 0; + gRfuState->unk_2c = 0; +} + +void STWI_set_MS_mode(u8 mode) +{ + gRfuState->msMode = mode; +} + +u16 STWI_read_status(u8 index) +{ + switch (index) + { + case 0: + return gRfuState->error; + case 1: + return gRfuState->msMode; + case 2: + return gRfuState->state; + case 3: + return gRfuState->reqActiveCommand; + default: + return 0xFFFF; + } +} + +void STWI_init_Callback_M(void) +{ + STWI_set_Callback_M(NULL); +} + +void STWI_init_Callback_S(void) +{ + STWI_set_Callback_S(NULL); +} + +void STWI_set_Callback_M(void (*callbackM)()) +{ + gRfuState->callbackM = callbackM; +} + +void STWI_set_Callback_S(void (*callbackS)()) +{ + gRfuState->callbackS = callbackS; +} + +void STWI_set_Callback_ID(u32 id) +{ + gRfuState->callbackId = id; +} + +u16 STWI_poll_CommandEnd(void) +{ + while (gRfuState->unk_2c == TRUE) + ; + return gRfuState->error; +} + +void STWI_send_ResetREQ(void) +{ + if (!STWI_init(RFU_RESET)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_LinkStatusREQ(void) +{ + if (!STWI_init(RFU_LINK_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_VersionStatusREQ(void) +{ + if (!STWI_init(RFU_VERSION_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SystemStatusREQ(void) +{ + if (!STWI_init(RFU_SYSTEM_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SlotStatusREQ(void) +{ + if (!STWI_init(RFU_SLOT_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_ConfigStatusREQ(void) +{ + if (!STWI_init(RFU_CONFIG_STATUS)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_GameConfigREQ(u8 *unk1, u8 *data) +{ + u8 *packetBytes; + s32 i; + + if (!STWI_init(RFU_GAME_CONFIG)) + { + gRfuState->reqLength = 6; + // TODO: what is unk1 + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *(u16 *)packetBytes = *(u16 *)unk1; + packetBytes += sizeof(u16); + unk1 += sizeof(u16); + for (i = 0; i < 14; ++i) + { + *packetBytes = *unk1; + ++packetBytes; + ++unk1; + } + for (i = 0; i < 8; ++i) + { + *packetBytes = *data; + ++packetBytes; + ++data; + } + STWI_start_Command(); + } +} + +void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) +{ + if (!STWI_init(RFU_SYSTEM_CONFIG)) + { + u8 *packetBytes; + + gRfuState->reqLength = 1; + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *packetBytes++ = unk3; + *packetBytes++ = unk2; + *(u16*)packetBytes = unk1; + STWI_start_Command(); + } +} + +void STWI_send_SC_StartREQ(void) +{ + if (!STWI_init(RFU_SC_START)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_PollingREQ(void) +{ + if (!STWI_init(RFU_SC_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_EndREQ(void) +{ + if (!STWI_init(RFU_SC_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_StartREQ(void) +{ + if (!STWI_init(RFU_SP_START)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_PollingREQ(void) +{ + if (!STWI_init(RFU_SP_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_EndREQ(void) +{ + if (!STWI_init(RFU_SP_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_StartREQ(u16 unk1) +{ + if (!STWI_init(RFU_CP_START)) + { + gRfuState->reqLength = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk1; + STWI_start_Command(); + } +} + +void STWI_send_CP_PollingREQ(void) +{ + if (!STWI_init(RFU_CP_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_EndREQ(void) +{ + if (!STWI_init(RFU_CP_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataTxREQ(const void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX)) + { + u8 reqLength = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + reqLength += 1; + gRfuState->reqLength = reqLength; + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->reqLength * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) + { + u8 reqLength = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + reqLength += 1; + gRfuState->reqLength = reqLength; + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->reqLength * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataRxREQ(void) +{ + if (!STWI_init(RFU_DATA_RX)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_MS_ChangeREQ(void) +{ + if (!STWI_init(RFU_MS_CHANGE)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataReadyAndChangeREQ(u8 unk) +{ + if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) + { + if (!unk) + { + gRfuState->reqLength = 0; + } + else + { + u8 *packetBytes; + + gRfuState->reqLength = 1; + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *packetBytes++ = unk; + *packetBytes++ = 0; + *packetBytes++ = 0; + *packetBytes = 0; + } + STWI_start_Command(); + } +} + +void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) + { + u8 *packetBytes; + + gRfuState->reqLength = 1; + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *packetBytes++ = unk0; + *packetBytes++ = unk1; + *packetBytes++ = 0; + *packetBytes = 0; + STWI_start_Command(); + } +} + +void STWI_send_ResumeRetransmitAndChangeREQ(void) +{ + if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_DisconnectREQ(u8 unk) +{ + if (!STWI_init(RFU_DISCONNECT)) + { + gRfuState->reqLength = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk; + STWI_start_Command(); + } +} + +void STWI_send_TestModeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_TEST_MODE)) + { + gRfuState->reqLength = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); + STWI_start_Command(); + } +} + +void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) +{ + u32 *packetData; + u32 arg1; + + if (!STWI_init(RFU_CPR_START)) + { + gRfuState->reqLength = 2; + arg1 = unk1 | (unk0 << 16); + packetData = gRfuState->txPacket->rfuPacket32.data; + packetData[0] = arg1; + packetData[1] = unk2; + STWI_start_Command(); + } +} + +void STWI_send_CPR_PollingREQ(void) +{ + if (!STWI_init(RFU_CPR_POLLING)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_CPR_EndREQ(void) +{ + if (!STWI_init(RFU_CPR_END)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +void STWI_send_StopModeREQ(void) +{ + if (!STWI_init(RFU_STOP_MODE)) + { + gRfuState->reqLength = 0; + STWI_start_Command(); + } +} + +static void STWI_intr_timer(void) +{ + switch (gRfuState->timerState) + { + // TODO: Make an enum for these + case 2: + gRfuState->timerActive = 1; + STWI_set_timer(50); + break; + case 1: + case 4: + STWI_stop_timer(); + STWI_restart_Command(); + break; + case 3: + gRfuState->timerActive = 1; + STWI_stop_timer(); + STWI_reset_ClockCounter(); + if (gRfuState->callbackM) + gRfuState->callbackM(255, 0); + break; + } +} + +static void STWI_set_timer(u8 unk) +{ + vu16 *timerL; + vu16 *timerH; + + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + REG_IME = 0; + switch (unk) + { + case 50: + *timerL = 0xFCCB; + gRfuState->timerState = 1; + break; + case 80: + *timerL = 0xFAE0; + gRfuState->timerState = 2; + break; + case 100: + *timerL = 0xF996; + gRfuState->timerState = 3; + break; + case 130: + *timerL = 0xF7AD; + gRfuState->timerState = 4; + break; + } + *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; + REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; + REG_IME = 1; +} + +static void STWI_stop_timer(void) +{ + gRfuState->timerState = 0; + REG_TMCNT_L(gRfuState->timerSelect) = 0; + REG_TMCNT_H(gRfuState->timerSelect) = 0; +} + +static u16 STWI_init(u8 request) +{ + if (!REG_IME) + { + gRfuState->error = 6; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->error); + return TRUE; + } + else if (gRfuState->unk_2c == TRUE) + { + gRfuState->error = 2; + gRfuState->unk_2c = FALSE; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->error); + return TRUE; + } + else if(!gRfuState->msMode) + { + gRfuState->error = 4; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->error, gRfuState); + return TRUE; + } + else + { + gRfuState->unk_2c = TRUE; + gRfuState->reqActiveCommand = request; + gRfuState->state = 0; + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + gRfuState->ackLength = 0; + gRfuState->ackNext = 0; + gRfuState->ackActiveCommand = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->error = 0; + gRfuState->recoveryCount = 0; + REG_RCNT = 0x100; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + return FALSE; + } +} + +static s32 STWI_start_Command(void) +{ + u16 imeTemp; + + // equivalent to gRfuState->txPacket->rfuPacket32.command, + // but the cast here is required to avoid register issue + *(u32 *)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->reqLength << 8) | gRfuState->reqActiveCommand; + REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; + gRfuState->state = 0; + gRfuState->reqNext = 1; + imeTemp = REG_IME; + REG_IME = 0; + REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = imeTemp; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; + return 0; +} + +static s32 STWI_restart_Command(void) +{ + if (gRfuState->recoveryCount <= 1) + { + ++gRfuState->recoveryCount; + STWI_start_Command(); + } + else + { + if (gRfuState->reqActiveCommand == RFU_MS_CHANGE || gRfuState->reqActiveCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->reqActiveCommand == RFU_UNK35 || gRfuState->reqActiveCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) + { + gRfuState->error = 1; + gRfuState->unk_2c = 0; + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); + } + else + { + gRfuState->error = 1; + gRfuState->unk_2c = 0; + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->reqActiveCommand, gRfuState->error); + gRfuState->state = 4; // TODO: what's 4 + } + } + return 0; +} + +static s32 STWI_reset_ClockCounter(void) +{ + gRfuState->state = 5; // TODO: what is 5 + gRfuState->reqLength = 0; + gRfuState->reqNext = 0; + REG_SIODATA32 = (1 << 31); + REG_SIOCNT = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; + return 0; +} |