From 3a8006e30cb16cf5ea98f4ae0703ee1d1f3f1c05 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 06:25:57 +0800 Subject: s32 to sio32 --- common_syms/librfu_s32id.txt | 1 - common_syms/librfu_sio32id.txt | 1 + include/librfu.h | 4 +- ld_script.txt | 4 +- src/librfu_s32id.c | 164 ----------------------------------------- src/librfu_sio32id.c | 164 +++++++++++++++++++++++++++++++++++++++++ sym_common.txt | 2 +- 7 files changed, 170 insertions(+), 170 deletions(-) delete mode 100644 common_syms/librfu_s32id.txt create mode 100644 common_syms/librfu_sio32id.txt delete mode 100644 src/librfu_s32id.c create mode 100644 src/librfu_sio32id.c diff --git a/common_syms/librfu_s32id.txt b/common_syms/librfu_s32id.txt deleted file mode 100644 index 6c24cc4a4..000000000 --- a/common_syms/librfu_s32id.txt +++ /dev/null @@ -1 +0,0 @@ -gRfuS32Id diff --git a/common_syms/librfu_sio32id.txt b/common_syms/librfu_sio32id.txt new file mode 100644 index 000000000..97395e84b --- /dev/null +++ b/common_syms/librfu_sio32id.txt @@ -0,0 +1 @@ +gRfuSIO32Id diff --git a/include/librfu.h b/include/librfu.h index f5a7b4d96..cf409ca69 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -490,7 +490,7 @@ struct RfuStatic u32 totalPacketSize; }; -struct RfuS32Id +struct RfuSIO32Id { u8 unk0; u8 unk1; @@ -517,7 +517,7 @@ extern struct RfuStatic *gRfuStatic; extern struct RfuFixed *gRfuFixed; extern struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX]; extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; -extern struct RfuS32Id gRfuS32Id; +extern struct RfuSIO32Id gRfuSIO32Id; // librfu_s32id s32 AgbRFU_checkID(u8); diff --git a/ld_script.txt b/ld_script.txt index 614bc4c93..c060394f6 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -320,7 +320,7 @@ SECTIONS { src/librfu_stwi.o(.text); asm/librfu_intr.o(.text); src/librfu_rfu.o(.text); - src/librfu_s32id.o(.text); + src/librfu_sio32id.o(.text); src/isagbprn.o(.text); asm/libagbsyscall.o(.text); *libgcc.a:_call_via_rX.o(.text); @@ -941,7 +941,7 @@ SECTIONS { src/agb_flash_mx.o(.rodata); src/agb_flash_le.o(.rodata); src/librfu_rfu.o(.rodata); - src/librfu_s32id.o(.rodata); + src/librfu_sio32id.o(.rodata); src/isagbprn.o(.rodata); *libgcc.a:_divdi3.o(.rodata); *libgcc.a:_udivdi3.o(.rodata); diff --git a/src/librfu_s32id.c b/src/librfu_s32id.c deleted file mode 100644 index ed51dcd12..000000000 --- a/src/librfu_s32id.c +++ /dev/null @@ -1,164 +0,0 @@ -#include "librfu.h" - -static void Sio32IDIntr(void); -static void Sio32IDInit(void); -static s32 Sio32IDMain(void); - -struct RfuS32Id gRfuS32Id; - -static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO -static const char Sio32IDLib_Var[] = "Sio32ID_030820"; - -s32 AgbRFU_checkID(u8 r5) -{ - u16 r8; - vu16 *r4; - s32 r6; - - if (REG_IME == 0) - return -1; - r8 = REG_IE; - gSTWIStatus->state = 10; - STWI_set_Callback_ID(Sio32IDIntr); - Sio32IDInit(); - r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); - r5 *= 8; - while (--r5 != 0xFF) - { - r6 = Sio32IDMain(); - if (r6 != 0) - break; - r4[1] = 0; - r4[0] = 0; - r4[1] = TIMER_1024CLK | TIMER_ENABLE; - while (r4[0] < 32) - ; - r4[1] = 0; - r4[0] = 0; - } - REG_IME = 0; - REG_IE = r8; - REG_IME = 1; - gSTWIStatus->state = 0; - STWI_set_Callback_ID(NULL); - return r6; -} - -static void Sio32IDInit(void) -{ - REG_IME = 0; - REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); - REG_IME = 1; - REG_RCNT = 0; - REG_SIOCNT = SIO_32BIT_MODE; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - CpuFill32(0, &gRfuS32Id, sizeof(struct RfuS32Id)); - REG_IF = INTR_FLAG_SERIAL; -} - -static s32 Sio32IDMain(void) -{ - u8 r12; - - switch (r12 = gRfuS32Id.unk1) - { - case 0: - gRfuS32Id.unk0 = 1; - REG_SIOCNT |= SIO_38400_BPS; - REG_IME = r12; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = 1; - gRfuS32Id.unk1 = 1; - *(vu8 *)®_SIOCNT |= SIO_ENABLE; - break; - case 1: - if (gRfuS32Id.unkA == 0) - { - if (gRfuS32Id.unk0 == 1) - { - if (gRfuS32Id.unk2 == 0) - { - REG_IME = gRfuS32Id.unk2; - REG_SIOCNT |= SIO_ENABLE; - REG_IME = r12; - } - } - else if (gRfuS32Id.unk4 != 0x8001 && !gRfuS32Id.unk2) - { - REG_IME = gRfuS32Id.unk2; - REG_IE &= ~INTR_FLAG_SERIAL; - REG_IME = r12; - REG_SIOCNT = gRfuS32Id.unk2; - REG_SIOCNT = SIO_32BIT_MODE; - REG_IF = INTR_FLAG_SERIAL; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - REG_IME = gRfuS32Id.unk2; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = r12; - } - break; - } - else - { - gRfuS32Id.unk1 = 2; - // fallthrough - } - default: - return gRfuS32Id.unkA; - } - return 0; -} - -static void Sio32IDIntr(void) -{ - u32 r5; - u16 r0; -#ifndef NONMATCHING - register u32 r1 asm("r1"); - register u16 r0_ asm("r0"); -#else - u32 r1; - u16 r0_; -#endif - - r5 = REG_SIODATA32; - if (gRfuS32Id.unk0 != 1) - REG_SIOCNT |= SIO_ENABLE; - r1 = 16 * gRfuS32Id.unk0; // to handle side effect of inline asm - r1 = (r5 << r1) >> 16; - r5 = (r5 << 16 * (1 - gRfuS32Id.unk0)) >> 16; - if (gRfuS32Id.unkA == 0) - { - if (r1 == gRfuS32Id.unk6) - { - if (gRfuS32Id.unk2 > 3) - { - gRfuS32Id.unkA = r5; - } - else if (r1 == (u16)~gRfuS32Id.unk4) - { - r0_ = ~gRfuS32Id.unk6; - if (r5 == r0_) - ++gRfuS32Id.unk2; - } - } - else - { - gRfuS32Id.unk2 = gRfuS32Id.unkA; - } - } - if (gRfuS32Id.unk2 < 4) - gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + Sio32ConnectionData); - else - gRfuS32Id.unk4 = 0x8001; - gRfuS32Id.unk6 = ~r5; - REG_SIODATA32 = (gRfuS32Id.unk4 << 16 * (1 - gRfuS32Id.unk0)) - + (gRfuS32Id.unk6 << 16 * gRfuS32Id.unk0); - if (gRfuS32Id.unk0 == 1 && (gRfuS32Id.unk2 || r5 == 0x494E)) - { - for (r0 = 0; r0 < 600; ++r0) - ; - if (gRfuS32Id.unkA == 0) - REG_SIOCNT |= SIO_ENABLE; - } -} diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c new file mode 100644 index 000000000..fc5701986 --- /dev/null +++ b/src/librfu_sio32id.c @@ -0,0 +1,164 @@ +#include "librfu.h" + +static void Sio32IDIntr(void); +static void Sio32IDInit(void); +static s32 Sio32IDMain(void); + +struct RfuSIO32Id gRfuSIO32Id; + +static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO +static const char Sio32IDLib_Var[] = "Sio32ID_030820"; + +s32 AgbRFU_checkID(u8 r5) +{ + u16 r8; + vu16 *r4; + s32 r6; + + if (REG_IME == 0) + return -1; + r8 = REG_IE; + gSTWIStatus->state = 10; + STWI_set_Callback_ID(Sio32IDIntr); + Sio32IDInit(); + r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); + r5 *= 8; + while (--r5 != 0xFF) + { + r6 = Sio32IDMain(); + if (r6 != 0) + break; + r4[1] = 0; + r4[0] = 0; + r4[1] = TIMER_1024CLK | TIMER_ENABLE; + while (r4[0] < 32) + ; + r4[1] = 0; + r4[0] = 0; + } + REG_IME = 0; + REG_IE = r8; + REG_IME = 1; + gSTWIStatus->state = 0; + STWI_set_Callback_ID(NULL); + return r6; +} + +static void Sio32IDInit(void) +{ + REG_IME = 0; + REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); + REG_IME = 1; + REG_RCNT = 0; + REG_SIOCNT = SIO_32BIT_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + CpuFill32(0, &gRfuSIO32Id, sizeof(struct RfuSIO32Id)); + REG_IF = INTR_FLAG_SERIAL; +} + +static s32 Sio32IDMain(void) +{ + u8 r12; + + switch (r12 = gRfuSIO32Id.unk1) + { + case 0: + gRfuSIO32Id.unk0 = 1; + REG_SIOCNT |= SIO_38400_BPS; + REG_IME = r12; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = 1; + gRfuSIO32Id.unk1 = 1; + *(vu8 *)®_SIOCNT |= SIO_ENABLE; + break; + case 1: + if (gRfuSIO32Id.unkA == 0) + { + if (gRfuSIO32Id.unk0 == 1) + { + if (gRfuSIO32Id.unk2 == 0) + { + REG_IME = gRfuSIO32Id.unk2; + REG_SIOCNT |= SIO_ENABLE; + REG_IME = r12; + } + } + else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2) + { + REG_IME = gRfuSIO32Id.unk2; + REG_IE &= ~INTR_FLAG_SERIAL; + REG_IME = r12; + REG_SIOCNT = gRfuSIO32Id.unk2; + REG_SIOCNT = SIO_32BIT_MODE; + REG_IF = INTR_FLAG_SERIAL; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + REG_IME = gRfuSIO32Id.unk2; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = r12; + } + break; + } + else + { + gRfuSIO32Id.unk1 = 2; + // fallthrough + } + default: + return gRfuSIO32Id.unkA; + } + return 0; +} + +static void Sio32IDIntr(void) +{ + u32 r5; + u16 r0; +#ifndef NONMATCHING + register u32 r1 asm("r1"); + register u16 r0_ asm("r0"); +#else + u32 r1; + u16 r0_; +#endif + + r5 = REG_SIODATA32; + if (gRfuSIO32Id.unk0 != 1) + REG_SIOCNT |= SIO_ENABLE; + r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm + r1 = (r5 << r1) >> 16; + r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16; + if (gRfuSIO32Id.unkA == 0) + { + if (r1 == gRfuSIO32Id.unk6) + { + if (gRfuSIO32Id.unk2 > 3) + { + gRfuSIO32Id.unkA = r5; + } + else if (r1 == (u16)~gRfuSIO32Id.unk4) + { + r0_ = ~gRfuSIO32Id.unk6; + if (r5 == r0_) + ++gRfuSIO32Id.unk2; + } + } + else + { + gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA; + } + } + if (gRfuSIO32Id.unk2 < 4) + gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData); + else + gRfuSIO32Id.unk4 = 0x8001; + gRfuSIO32Id.unk6 = ~r5; + REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0)) + + (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0); + if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E)) + { + for (r0 = 0; r0 < 600; ++r0) + ; + if (gRfuSIO32Id.unkA == 0) + REG_SIOCNT |= SIO_ENABLE; + } +} diff --git a/sym_common.txt b/sym_common.txt index c50f09540..753ce9ebd 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -164,4 +164,4 @@ gUnknown_3005E94: @ 3005E94 .align 4 .include "librfu_rfu.o" .align 4 - .include "librfu_s32id.o" + .include "librfu_sio32id.o" -- cgit v1.2.3