summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-04-21 08:49:55 -0400
committerGitHub <noreply@github.com>2021-04-21 08:49:55 -0400
commitcf553c7006f2b7a290a1f000f40e437f102acb71 (patch)
tree07a783d06d71da62ffa3a436d77b84f9c4172ba2 /src
parent03fb7d24e8ec9a3cd7eba17aa80ea4273a0a8da1 (diff)
parent576e63fd0a068e30b0bfdb838920543f17c2dc88 (diff)
Merge pull request #422 from Kurausukun/final
Fix Final 2 Nonmatchings (ported from emerald)
Diffstat (limited to 'src')
-rw-r--r--src/librfu_intr.c14
-rw-r--r--src/librfu_rfu.c3
-rw-r--r--src/librfu_sio32id.c28
3 files changed, 19 insertions, 26 deletions
diff --git a/src/librfu_intr.c b/src/librfu_intr.c
index 41085182a..4c2f2573a 100644
--- a/src/librfu_intr.c
+++ b/src/librfu_intr.c
@@ -147,11 +147,7 @@ static void sio32intr_clock_slave(void)
{
u32 regSIODATA32;
u32 r0;
- #ifndef NONMATCHING
- register u32 reqLen asm("r2");
- #else
- u32 reqLen;
- #endif
+ u32 reqLen;
gSTWIStatus->timerActive = 0;
STWI_set_timer_in_RAM(100);
@@ -164,10 +160,14 @@ static void sio32intr_clock_slave(void)
((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32;
gSTWIStatus->reqNext = 1;
r0 = 0x99660000;
- if ((regSIODATA32 >> 16) == (r0 >> 16))
+ // variable reuse required
+ reqLen = (regSIODATA32 >> 16);
+ if (reqLen == (r0 >> 16))
{
+ // only reqLen = regSIODATA32 >> 8 is required to match, but it looks a bit
+ // more consistent when both lines update the variables. Might have been a macro?
gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8;
- gSTWIStatus->reqActiveCommand = regSIODATA32;
+ gSTWIStatus->reqActiveCommand = reqLen = (regSIODATA32 >> 0);
if (gSTWIStatus->reqLength == 0)
{
if (
diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c
index e82c8ed7b..9f642907b 100644
--- a/src/librfu_rfu.c
+++ b/src/librfu_rfu.c
@@ -1758,9 +1758,6 @@ static void rfu_constructSendLLFrame(void)
{
u8 *maxSize = llf_p - offsetof(struct RfuFixed, LLFBuffer[1]);
- // Does the volatile qualifier make sense?
- // It's the same as:
- // asm("":::"memory");
pakcketSize = maxSize - *(u8 *volatile *)&gRfuFixed;
}
}
diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c
index b6623540f..d726bca7b 100644
--- a/src/librfu_sio32id.c
+++ b/src/librfu_sio32id.c
@@ -123,34 +123,30 @@ static void Sio32IDIntr(void)
{
u32 regSIODATA32;
u16 delay;
-#ifndef NONMATCHING
- register u32 rfuSIO32IdUnk0_times_16 asm("r1");
- register u16 negRfuSIO32IdUnk6 asm("r0");
-#else
u32 rfuSIO32IdUnk0_times_16;
u16 negRfuSIO32IdUnk6;
-#endif
regSIODATA32 = REG_SIODATA32;
if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER)
REG_SIOCNT |= SIO_ENABLE;
- rfuSIO32IdUnk0_times_16 = 16 * gRfuSIO32Id.MS_mode; // to handle side effect of inline asm
- rfuSIO32IdUnk0_times_16 = (regSIODATA32 << rfuSIO32IdUnk0_times_16) >> 16;
+ rfuSIO32IdUnk0_times_16 = (regSIODATA32 << (16 * gRfuSIO32Id.MS_mode)) >> 16;
regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16;
if (gRfuSIO32Id.lastId == 0)
{
- if (rfuSIO32IdUnk0_times_16 == gRfuSIO32Id.recv_id)
+ u16 backup = rfuSIO32IdUnk0_times_16;
+ if (backup == gRfuSIO32Id.recv_id)
{
- if (gRfuSIO32Id.count > 3)
+ if (gRfuSIO32Id.count < 4)
{
- gRfuSIO32Id.lastId = regSIODATA32;
- }
- else if (rfuSIO32IdUnk0_times_16 == (u16)~gRfuSIO32Id.send_id)
- {
- negRfuSIO32IdUnk6 = ~gRfuSIO32Id.recv_id;
- if (regSIODATA32 == negRfuSIO32IdUnk6)
- ++gRfuSIO32Id.count;
+ backup = (u16)~gRfuSIO32Id.send_id;
+ if (gRfuSIO32Id.recv_id == backup)
+ {
+ if (regSIODATA32 == (u16)~gRfuSIO32Id.recv_id)
+ ++gRfuSIO32Id.count;
+ }
}
+ else
+ gRfuSIO32Id.lastId = regSIODATA32;
}
else
{