diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2021-07-10 16:03:33 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2021-07-10 16:03:33 -0400 |
commit | 5fe1a85bd8e28f978bdb998cc118fcb85c0d0959 (patch) | |
tree | 7c304838e734e9afe3aa0cfffd64763e2fa16010 | |
parent | 7dffc82a62ecb72f274a94ff08e1d81a52429cd7 (diff) |
Match sub_80EF624
-rw-r--r-- | include/global.h | 12 | ||||
-rw-r--r-- | src/pokenav.c | 216 |
2 files changed, 42 insertions, 186 deletions
diff --git a/include/global.h b/include/global.h index 7897e20c2..3a26a2c3e 100644 --- a/include/global.h +++ b/include/global.h @@ -96,16 +96,22 @@ enum }) // Converts a number to Q8.8 fixed-point format -#define Q_8_8(n) ((s16)((n) * 256)) +#define Q_8_8(n) ((s16)((n) * 256)) // Converts a number from Q8.8 fixed-point format to integer #define Q_8_8_TO_INT(n) ((s16)((n) >> 8)) // Converts a number to Q4.12 fixed-point format -#define Q_4_12(n) ((s16)((n) * 4096)) +#define Q_4_12(n) ((s16)((n) * 4096)) // Converts a number from Q4.12 fixed-point format to integer -#define Q_4_12_TO_INT(n) ((s16)((n) >> 12)) +#define Q_4_12_TO_INT(n) ((s16)((n) >> 12)) + +// Converts a number to Q24.8 fixed-point format +#define Q_24_8(n) ((s32)((n) * 256)) + +// Converts a number from Q24.8 fixed-point format to integer +#define Q_24_8_TO_INT(x) ((s32)((x) >> 8)) // Credits to Made (dolphin emoji) #define S16TOPOSFLOAT(val) \ diff --git a/src/pokenav.c b/src/pokenav.c index 8a498e954..e84752f73 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -462,198 +462,48 @@ void sub_80EF58C(u8 a) } } -#ifdef NONMATCHING +#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) + void sub_80EF624(const u16 *a, const u16 *b, u8 c, u8 d, u16 *palettes) { - u16 red1, green1, blue1; - u16 red2, green2, blue2; - s32 redDiv, greenDiv, blueDiv; - u16 *palettes2; - u16 i, j; - - i = 0; - while (i < d) - { - red1 = (*a & 0x1F) << 8; - green1 = ((*a >> 5) & 0x1F) << 8; - blue1 = ((*a >> 10) & 0x1F) << 8; - - red2 = (*b & 0x1F) << 8; - green2 = ((*b >> 5) & 0x1F) << 8; - blue2 = ((*b >> 10) & 0x1F) << 8; - - redDiv = (red2 - red1) / c; - greenDiv = (green2 - green1) / c; - blueDiv = (blue2 - blue1) / c; - - palettes2 = palettes; + u16 i; + u16 j; + u16 * r3; + + for (i = 0; i < d; i++) + { + s32 r1 = Q_24_8((((*a) >> 0)) & 0x1F); + s32 g1 = Q_24_8((((*a) >> 5)) & 0x1F); + s32 b1 = Q_24_8((((*a) >> 10)) & 0x1F); + s32 r2 = Q_24_8((((*b) >> 0)) & 0x1F); + s32 g2 = Q_24_8((((*b) >> 5)) & 0x1F); + s32 b2 = Q_24_8((((*b) >> 10)) & 0x1F); + s32 dr = (r2 - r1) / c; + s32 dg = (g2 - g1) / c; + s32 db = (b2 - b1) / c; + u16 rf, gf, bf; + + r3 = palettes; for (j = 0; j < c - 1; j++) { - *palettes2 = (((blue1 << 8) >> 16) << 10) | (((green1 << 8) >> 16) << 5) | ((red1 << 8) >> 16); - palettes2 += d; - red1 += redDiv; - green1 += greenDiv; - blue1 += blueDiv; + rf = Q_24_8_TO_INT(r1); + gf = Q_24_8_TO_INT(g1); + bf = Q_24_8_TO_INT(b1); + *r3 = RGB2(rf, gf, bf); + r3 += d; + r1 += dr; + g1 += dg; + b1 += db; } - - *palettes2 = (red2 >> 8) | (blue2 << 2) | (green2 >> 3); - palettes++; - + rf = Q_24_8_TO_INT(r2); + gf = Q_24_8_TO_INT(g2); + bf = Q_24_8_TO_INT(b2); + *r3 = RGB2(rf, gf, bf); a++; b++; - i++; + palettes++; } } -#else -NAKED -void sub_80EF624(const u16 *a, const u16 *b, u8 c, u8 d, u16 *palettes) -{ - 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, 0x38\n\ - str r0, [sp]\n\ - str r1, [sp, 0x4]\n\ - ldr r4, [sp, 0x58]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp, 0x8]\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - str r3, [sp, 0xC]\n\ - movs r0, 0\n\ - str r0, [sp, 0x10]\n\ - lsls r0, r3, 16\n\ - ldr r1, [sp, 0x10]\n\ - cmp r1, r3\n\ - bcs _080EF72E\n\ - subs r2, 0x1\n\ - str r2, [sp, 0x20]\n\ - str r0, [sp, 0x2C]\n\ -_080EF654:\n\ - ldr r2, [sp]\n\ - ldrh r1, [r2]\n\ - movs r0, 0x1F\n\ - ands r0, r1\n\ - lsls r7, r0, 8\n\ - lsls r1, 16\n\ - lsrs r0, r1, 21\n\ - movs r2, 0x1F\n\ - ands r0, r2\n\ - lsls r6, r0, 8\n\ - lsrs r1, 26\n\ - ands r1, r2\n\ - lsls r5, r1, 8\n\ - ldr r0, [sp, 0x4]\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1F\n\ - ands r0, r1\n\ - lsls r0, 8\n\ - str r0, [sp, 0x14]\n\ - lsls r1, 16\n\ - lsrs r0, r1, 21\n\ - ands r0, r2\n\ - lsls r0, 8\n\ - str r0, [sp, 0x18]\n\ - lsrs r1, 26\n\ - ands r1, r2\n\ - lsls r1, 8\n\ - str r1, [sp, 0x1C]\n\ - ldr r1, [sp, 0x14]\n\ - subs r0, r1, r7\n\ - ldr r1, [sp, 0x8]\n\ - bl __divsi3\n\ - mov r10, r0\n\ - ldr r2, [sp, 0x18]\n\ - subs r0, r2, r6\n\ - ldr r1, [sp, 0x8]\n\ - bl __divsi3\n\ - mov r9, r0\n\ - ldr r1, [sp, 0x1C]\n\ - subs r0, r1, r5\n\ - ldr r1, [sp, 0x8]\n\ - bl __divsi3\n\ - mov r8, r0\n\ - adds r3, r4, 0\n\ - movs r4, 0\n\ - ldr r2, [sp]\n\ - adds r2, 0x2\n\ - str r2, [sp, 0x30]\n\ - ldr r0, [sp, 0x4]\n\ - adds r0, 0x2\n\ - str r0, [sp, 0x34]\n\ - adds r1, r3, 0x2\n\ - str r1, [sp, 0x24]\n\ - ldr r2, [sp, 0x10]\n\ - adds r2, 0x1\n\ - str r2, [sp, 0x28]\n\ - ldr r0, [sp, 0x20]\n\ - cmp r4, r0\n\ - bge _080EF700\n\ - ldr r1, [sp, 0xC]\n\ - lsls r1, 1\n\ - mov r12, r1\n\ -_080EF6D6:\n\ - lsls r0, r7, 8\n\ - lsrs r2, r0, 16\n\ - lsls r0, r6, 8\n\ - lsrs r1, r0, 16\n\ - lsls r0, r5, 8\n\ - lsrs r0, 16\n\ - lsls r0, 10\n\ - lsls r1, 5\n\ - orrs r0, r1\n\ - orrs r2, r0\n\ - strh r2, [r3]\n\ - add r3, r12\n\ - add r7, r10\n\ - add r6, r9\n\ - add r5, r8\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - ldr r2, [sp, 0x20]\n\ - cmp r4, r2\n\ - blt _080EF6D6\n\ -_080EF700:\n\ - ldr r4, [sp, 0x14]\n\ - lsrs r2, r4, 8\n\ - ldr r1, [sp, 0x1C]\n\ - lsls r0, r1, 2\n\ - ldr r4, [sp, 0x18]\n\ - lsrs r1, r4, 3\n\ - orrs r0, r1\n\ - orrs r2, r0\n\ - strh r2, [r3]\n\ - ldr r0, [sp, 0x30]\n\ - str r0, [sp]\n\ - ldr r1, [sp, 0x34]\n\ - str r1, [sp, 0x4]\n\ - ldr r4, [sp, 0x24]\n\ - ldr r2, [sp, 0x28]\n\ - lsls r0, r2, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x10]\n\ - ldr r1, [sp, 0x2C]\n\ - lsrs r0, r1, 16\n\ - ldr r2, [sp, 0x10]\n\ - cmp r2, r0\n\ - bcc _080EF654\n\ -_080EF72E:\n\ - add sp, 0x38\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 // NONMATCHING void sub_80EF740(void) { |