diff options
author | Kaz <kazbloxmc@gmail.com> | 2020-06-02 06:26:27 -0400 |
---|---|---|
committer | Kaz <kazbloxmc@gmail.com> | 2020-06-02 06:26:27 -0400 |
commit | 1ce50ad12ec0e62f5ae6325767254fcfb7a04fdb (patch) | |
tree | a6c9b43f37c5343904847caa6da7f41691336fc2 /src | |
parent | 7c0c109b7553596129694f9c2dc7481403520031 (diff) |
contest_painting.c: sub_8106B90 and sub_8106630 matching
secret_base.c: better fakematch for sub_80BC6B0
Diffstat (limited to 'src')
-rw-r--r-- | src/contest_painting.c | 192 | ||||
-rw-r--r-- | src/secret_base.c | 6 |
2 files changed, 49 insertions, 149 deletions
diff --git a/src/contest_painting.c b/src/contest_painting.c index e3cc6cdae..b5c085b3a 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -101,40 +101,18 @@ static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); static void ContestPaintingInitBG(void); static void ContestPaintingInitVars(u8 arg0); static void VBlankCB_ContestPainting(void); -void sub_8106B90(); //should be static +static void sub_8106B90(u8 *a, u16 *b, u16 *c); static void sub_8107090(u8 arg0, u8 arg1); -NAKED -void sub_8106630(u32 arg0) +void sub_8106630(u32 contestWinnerId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r2, _0810665C @ =gSharedMem + 0x15DE0\n\ - subs r4, r2, 0x2\n\ - subs r5, r2, 0x1\n\ - ldr r3, _08106660 @ =gSaveBlock1\n\ - subs r0, 0x1\n\ - lsls r1, r0, 5\n\ - adds r1, r3\n\ - ldr r3, _08106664 @ =0x00002dfc\n\ - adds r1, r3\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r6,r7}\n\ - stm r2!, {r6,r7}\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - strb r0, [r5]\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0810665C: .4byte gSharedMem + 0x15DE0\n\ -_08106660: .4byte gSaveBlock1\n\ -_08106664: .4byte 0x00002dfc\n\ - .syntax divided\n"); + // probably fakematching + struct ContestWinner *ptr1 = (struct ContestWinner*)&ewram15DE0; // TODO: resolve messy struct duplicates + u8 *ptr2 = (u8*)&ewram15DDE; + u8 *ptr3 = (u8*)&ewram15DDF; + *ptr1 = gSaveBlock1.contestWinners[contestWinnerId - 1]; + *ptr2 = contestWinnerId - 1; + *ptr3 = 0; } void CB2_ContestPainting(void) @@ -346,7 +324,7 @@ static void sub_8106AC4(u16 species, u8 arg1) species, (u32)gUnknown_03005E8C->personality ); - sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); + sub_8106B90((u8*)gUnknown_081FAF4C[1], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10); } else { @@ -359,18 +337,26 @@ static void sub_8106AC4(u16 species, u8 arg1) species, (u32)gUnknown_03005E8C->personality ); - sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); + sub_8106B90((u8*)gUnknown_081FAF4C[0], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10); } } -#ifdef NONMATCHING -void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) + +static void sub_8106B90(u8 *a, u16 *b, u16 *c) { u16 i; u16 j; u16 k; u16 l; + /* + Raw arithmetics are required to match this function. + At least it's the first known way to match it. The extreme + sensitivity of this match and Game Freak proving to not have + been an array of C's advanced array features, preferring to + calculate dimensions manually (as proven in other functions) + tell that it may have been this way in the original code. + */ for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) @@ -379,128 +365,38 @@ void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) { for (l = 0; l < 8; l++) { - //u8 *arr = a[i][j][k]; - //u8 r1 = arr[l / 2]; - u8 r1 = a[i][j][k][l / 2]; + /* + Parenthesis/group hack absolutely required to match regalloc. Remove any + unneeded parentheses and the function gets thrown off. See the comments + in CopyWallpaperTilemap for documentation on a similar behavior. + */ + u8 temp = ((u8*)a + ((((i << 3) + j) << 5) + (k << 2) + (l >> 1)))[0]; + /* + The shifts have to be there to match r0 and r2's order in one instruction: + add r5, r2, r0 + This also makes agbcc's expression order parsing even more super sensitive + and obscene when it comes to parentheses affecting regalloc regardless if + unnecessary, requiring j must be placed in the front to match, or else + regalloc breaks again and does this a few instructions above: + add r0, r3, r7 <- regswap + */ if (l & 1) - r1 /= 16; + temp /= 16; else - r1 %= 16; - //_08106BEA - if (r1 == 0) - c[i][k][j][l] = 0x8000; + temp %= 16; + + // Same order as above needs to be written here, or else this happens: + // add r0, r7, r1 <- regswap + if (temp == 0) + ((u16*)c + (((i << 3) + k) << 6) + ((j << 3)+l))[0] = 0x8000; else - c[i][k][j][l] = b[r1]; + ((u16*)c + (((i << 3) + k) << 6) + ((j << 3)+l))[0] = b[temp]; } } } } } -#else -NAKED -void sub_8106B90() -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - mov r10, r0\n\ - mov r9, r1\n\ - str r2, [sp]\n\ - movs r0, 0\n\ -_08106BA4:\n\ - movs r3, 0\n\ - adds r1, r0, 0x1\n\ - str r1, [sp, 0x4]\n\ - lsls r0, 3\n\ - str r0, [sp, 0x8]\n\ -_08106BAE:\n\ - movs r1, 0\n\ - adds r2, r3, 0x1\n\ - mov r8, r2\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r3\n\ - lsls r0, 5\n\ - mov r12, r0\n\ - lsls r4, r3, 3\n\ -_08106BBE:\n\ - movs r3, 0\n\ - lsls r0, r1, 2\n\ - adds r6, r1, 0x1\n\ - mov r2, r12\n\ - adds r5, r2, r0\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r1\n\ - lsls r0, 7\n\ - ldr r1, [sp]\n\ - adds r2, r0, r1\n\ -_08106BD2:\n\ - lsrs r0, r3, 1\n\ - adds r0, r5, r0\n\ - add r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08106BE6\n\ - lsrs r1, 4\n\ - b _08106BEA\n\ -_08106BE6:\n\ - movs r0, 0xF\n\ - ands r1, r0\n\ -_08106BEA:\n\ - cmp r1, 0\n\ - bne _08106BFC\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - movs r7, 0x80\n\ - lsls r7, 8\n\ - adds r1, r7, 0\n\ - b _08106C08\n\ -_08106BFC:\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - lsls r1, 1\n\ - add r1, r9\n\ - ldrh r1, [r1]\n\ -_08106C08:\n\ - strh r1, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BD2\n\ - lsls r0, r6, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0x7\n\ - bls _08106BBE\n\ - mov r1, r8\n\ - lsls r0, r1, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BAE\n\ - ldr r2, [sp, 0x4]\n\ - lsls r0, r2, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x7\n\ - bls _08106BA4\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif static void sub_8106C40(u8 arg0, u8 arg1) { diff --git a/src/secret_base.c b/src/secret_base.c index 097d95cfe..345d3d8e5 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -859,7 +859,11 @@ void sub_80BC6B0(u8 taskId) Menu_PrintText(gOtherText_Exit, 18, 2 * n + 2); DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (n != 7) - Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match + { + n++; + n--; + Menu_BlankWindowRect(18, n * 2 + 4, 28, 18); + } } else { |