diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2021-07-12 09:34:36 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2021-07-12 09:34:36 -0400 |
commit | 3aa136cea39073f0a0a1cf28bbdba436eedb6355 (patch) | |
tree | 38272dc69d4a1e3183461fbd400602acb908c80d | |
parent | 4be32ca5d11227fd092e01c96c0e365b0ed5fb43 (diff) |
Port sub_80F5688 from Emerald
-rw-r--r-- | src/pokenav.c | 435 |
1 files changed, 103 insertions, 332 deletions
diff --git a/src/pokenav.c b/src/pokenav.c index c810d43fb..fa057f480 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -4222,335 +4222,106 @@ void sub_80F567C(u8 *a0, struct UnkPokenav11 a1[]) sub_80F55AC(a0, a1); } -/* TODO -// emerald: sub_81D2278 -void sub_80F5688(u16 * r6, u16 * r5, u16 * sp0, u8 r9, u16 * r7) +void sub_80F5688(u16 * arg1, struct UnkPokenav11 * arg2, struct UnkPokenav11 * arg3, u8 arg4, u16 * arg5) { - u16 sp04; - u16 r0; - u16 r4; - u16 r10; - if (r5[1] < sp0[1]) + u16 i, r8, r10, r0, var_30; + u16 *ptr; + s32 r4, var_2C; + + var_2C = 0; + if (arg2->unk2 < arg3->unk2) { - sp04 = r5[1]; - r4 = r5[0] << 10; - r0 = sp0[1]; - r10 = sp0[0]; + r10 = arg2->unk2; + r0 = arg3->unk2; + r4 = arg2->unk0 << 10; + var_30 = arg3->unk0; + r8 = r0 - r10; + if (r8 != 0) + var_2C = ((var_30 - arg2->unk0) << 10) / r8; + } + else + { + r0 = arg2->unk2; + r10 = arg3->unk2; + r4 = arg3->unk0 << 10; + var_30 = arg2->unk0; + r8 = r0 - r10; + if (r8 != 0) + var_2C = ((var_30 - arg3->unk0) << 10) / r8; } -} -*/ -NAKED -void sub_80F5688(u16 r6[66][2], struct UnkPokenav11 * r5, struct UnkPokenav11 * sp0, u8 r9, u16 r7[66][2]) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x14\n" - "\tadds r6, r0, 0\n" - "\tadds r5, r1, 0\n" - "\tstr r2, [sp]\n" - "\tldr r7, [sp, 0x34]\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tmov r9, r3\n" - "\tmovs r0, 0\n" - "\tstr r0, [sp, 0x8]\n" - "\tldrh r0, [r5, 0x2]\n" - "\tldrh r1, [r2, 0x2]\n" - "\tcmp r0, r1\n" - "\tbcs _080F56D0\n" - "\tadds r2, r0, 0\n" - "\tstr r2, [sp, 0x4]\n" - "\tldr r3, [sp]\n" - "\tldrh r0, [r3, 0x2]\n" - "\tldrh r1, [r5]\n" - "\tlsls r4, r1, 10\n" - "\tldrh r2, [r3]\n" - "\tmov r10, r2\n" - "\tldr r3, [sp, 0x4]\n" - "\tsubs r0, r3\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tcmp r0, 0\n" - "\tbeq _080F56FC\n" - "\tsubs r0, r2, r1\n" - "\tb _080F56F2\n" - "_080F56D0:\n" - "\tldrh r0, [r5, 0x2]\n" - "\tldr r1, [sp]\n" - "\tldrh r1, [r1, 0x2]\n" - "\tstr r1, [sp, 0x4]\n" - "\tldr r2, [sp]\n" - "\tldrh r1, [r2]\n" - "\tlsls r4, r1, 10\n" - "\tldrh r3, [r5]\n" - "\tmov r10, r3\n" - "\tldr r2, [sp, 0x4]\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tcmp r0, 0\n" - "\tbeq _080F56FC\n" - "\tsubs r0, r3, r1\n" - "_080F56F2:\n" - "\tlsls r0, 10\n" - "\tmov r1, r8\n" - "\tbl __divsi3\n" - "\tstr r0, [sp, 0x8]\n" - "_080F56FC:\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tcmp r7, 0\n" - "\tbne _080F5746\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x38\n" - "\tlsls r0, 2\n" - "\tadds r6, r0\n" - "\tmovs r5, 0\n" - "\tmov r3, r9\n" - "\tlsls r3, 1\n" - "\tmov r12, r3\n" - "\tmov r0, r10\n" - "\tadd r0, r9\n" - "\tstr r0, [sp, 0xC]\n" - "\tcmp r7, r8\n" - "\tbcs _080F57D4\n" - "\tmovs r7, 0x1\n" - "_080F5726:\n" - "\tadds r2, r3, r6\n" - "\tasrs r1, r4, 10\n" - "\tasrs r0, r4, 9\n" - "\tands r0, r7\n" - "\tadds r1, r0\n" - "\tadd r1, r9\n" - "\tstrh r1, [r2]\n" - "\tldr r1, [sp, 0x8]\n" - "\tadds r4, r1\n" - "\tadds r6, 0x4\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, r8\n" - "\tbcc _080F5726\n" - "\tb _080F57D4\n" - "_080F5746:\n" - "\tldr r2, [sp, 0x8]\n" - "\tcmp r2, 0\n" - "\tble _080F57E4\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x38\n" - "\tlsls r0, 2\n" - "\tadds r7, r0\n" - "\tmovs r5, 0\n" - "\tmov r3, r9\n" - "\tlsls r3, 1\n" - "\tmov r12, r3\n" - "\tmov r0, r10\n" - "\tadd r0, r9\n" - "\tstr r0, [sp, 0xC]\n" - "\tcmp r5, r8\n" - "\tbcs _080F5798\n" - "\tldr r0, _080F57D8 @ =0x00026bff\n" - "\tcmp r4, r0\n" - "\tbgt _080F5798\n" - "\tmov r1, r12\n" - "\tstr r1, [sp, 0x10]\n" - "\tmov r10, r0\n" - "_080F5772:\n" - "\tldr r3, [sp, 0x10]\n" - "\tadds r2, r3, r7\n" - "\tasrs r1, r4, 10\n" - "\tasrs r0, r4, 9\n" - "\tmovs r3, 0x1\n" - "\tands r0, r3\n" - "\tadds r1, r0\n" - "\tadd r1, r9\n" - "\tstrh r1, [r2]\n" - "\tldr r0, [sp, 0x8]\n" - "\tadds r4, r0\n" - "\tadds r7, 0x4\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, r8\n" - "\tbcs _080F5798\n" - "\tcmp r4, r10\n" - "\tble _080F5772\n" - "_080F5798:\n" - "\tldr r1, _080F57DC @ =gPokenavStructPtr\n" - "\tldr r0, [r1]\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r5\n" - "\tldr r3, _080F57E0 @ =0x00009340\n" - "\tadds r0, r3\n" - "\tstrh r1, [r0]\n" - "\tldrh r0, [r0]\n" - "\tsubs r0, 0x38\n" - "\tlsls r0, 2\n" - "\tadds r6, r0\n" - "\tcmp r5, r8\n" - "\tbcs _080F57D4\n" - "\tmov r3, r12\n" - "\tmovs r7, 0x1\n" - "_080F57B6:\n" - "\tadds r2, r3, r6\n" - "\tasrs r1, r4, 10\n" - "\tasrs r0, r4, 9\n" - "\tands r0, r7\n" - "\tadds r1, r0\n" - "\tadd r1, r9\n" - "\tstrh r1, [r2]\n" - "\tldr r0, [sp, 0x8]\n" - "\tadds r4, r0\n" - "\tadds r6, 0x4\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, r8\n" - "\tbcc _080F57B6\n" - "_080F57D4:\n" - "\tsubs r0, r6, 0x4\n" - "\tb _080F58C4\n" - "\t.align 2, 0\n" - "_080F57D8: .4byte 0x00026bff\n" - "_080F57DC: .4byte gPokenavStructPtr\n" - "_080F57E0: .4byte 0x00009340\n" - "_080F57E4:\n" - "\tldr r1, [sp, 0x8]\n" - "\tcmp r1, 0\n" - "\tbge _080F5890\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x38\n" - "\tlsls r0, 2\n" - "\tadds r6, r0\n" - "\tmovs r5, 0\n" - "\tmov r2, r9\n" - "\tlsls r2, 1\n" - "\tmov r12, r2\n" - "\tmov r3, r10\n" - "\tadd r3, r9\n" - "\tstr r3, [sp, 0xC]\n" - "\tcmp r5, r8\n" - "\tbcs _080F5842\n" - "\tadds r3, r2, r6\n" - "\tasrs r1, r4, 10\n" - "\tasrs r0, r4, 9\n" - "\tmovs r2, 0x1\n" - "\tands r0, r2\n" - "\tadds r1, r0\n" - "\tadd r1, r9\n" - "\tstrh r1, [r3]\n" - "\tb _080F5838\n" - "_080F5816:\n" - "\tldr r0, [sp, 0x8]\n" - "\tadds r4, r0\n" - "\tadds r6, 0x4\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, r8\n" - "\tbcs _080F5842\n" - "\tmov r1, r12\n" - "\tadds r3, r1, r6\n" - "\tasrs r2, r4, 10\n" - "\tasrs r0, r4, 9\n" - "\tmovs r1, 0x1\n" - "\tands r0, r1\n" - "\tadds r2, r0\n" - "\tadd r2, r9\n" - "\tstrh r2, [r3]\n" - "_080F5838:\n" - "\tldr r0, _080F5884 @ =0x00026bff\n" - "\tcmp r4, r0\n" - "\tbgt _080F5816\n" - "\tmovs r0, 0x9B\n" - "\tstrh r0, [r3]\n" - "_080F5842:\n" - "\tldr r2, _080F5888 @ =gPokenavStructPtr\n" - "\tldr r0, [r2]\n" - "\tldr r3, [sp, 0x4]\n" - "\tadds r1, r3, r5\n" - "\tldr r2, _080F588C @ =0x00009340\n" - "\tadds r0, r2\n" - "\tstrh r1, [r0]\n" - "\tldrh r0, [r0]\n" - "\tsubs r0, 0x38\n" - "\tlsls r0, 2\n" - "\tadds r7, r0\n" - "\tcmp r5, r8\n" - "\tbcs _080F587E\n" - "\tmov r3, r12\n" - "\tmovs r6, 0x1\n" - "_080F5860:\n" - "\tadds r2, r3, r7\n" - "\tasrs r1, r4, 10\n" - "\tasrs r0, r4, 9\n" - "\tands r0, r6\n" - "\tadds r1, r0\n" - "\tadd r1, r9\n" - "\tstrh r1, [r2]\n" - "\tldr r0, [sp, 0x8]\n" - "\tadds r4, r0\n" - "\tadds r7, 0x4\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, r8\n" - "\tbcc _080F5860\n" - "_080F587E:\n" - "\tsubs r0, r7, 0x4\n" - "\tb _080F58C4\n" - "\t.align 2, 0\n" - "_080F5884: .4byte 0x00026bff\n" - "_080F5888: .4byte gPokenavStructPtr\n" - "_080F588C: .4byte 0x00009340\n" - "_080F5890:\n" - "\tldr r0, _080F58BC @ =gPokenavStructPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _080F58C0 @ =0x00009340\n" - "\tadds r0, r1\n" - "\tmov r2, sp\n" - "\tldrh r2, [r2, 0x4]\n" - "\tstrh r2, [r0]\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x38\n" - "\tlsls r0, 2\n" - "\tadds r6, r0\n" - "\tadds r7, r0\n" - "\tldrh r0, [r5]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r6, 0x2]\n" - "\tldr r3, [sp]\n" - "\tldrh r0, [r3]\n" - "\tstrh r0, [r7]\n" - "\tmovs r0, 0x9B\n" - "\tstrh r0, [r7, 0x2]\n" - "\tb _080F58CC\n" - "\t.align 2, 0\n" - "_080F58BC: .4byte gPokenavStructPtr\n" - "_080F58C0: .4byte 0x00009340\n" - "_080F58C4:\n" - "\tadd r0, r12\n" - "\tmov r1, sp\n" - "\tldrh r1, [r1, 0xC]\n" - "\tstrh r1, [r0]\n" - "_080F58CC:\n" - "\tadd sp, 0x14\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); + r8++; + if (arg5 == NULL) + { + arg1 += (r10 - 56) * 2; + for (i = 0; i < r8; i++) + { + arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; + r4 += var_2C; + arg1 += 2; + } + + ptr = arg1 - 2; + } + else if (var_2C > 0) + { + arg5 += (r10 - 56) * 2; + // Less readable than the other loops, but it has to be written this way to match. + for (i = 0; i < r8; arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4, r4 += var_2C, arg5 += 2, i++) + { + if (r4 >= (155 << 10)) + break; + } + + gPokenavStructPtr->unk9340 = r10 + i; + arg1 += (gPokenavStructPtr->unk9340 - 56) * 2; + for (; i < r8; i++) + { + arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; + r4 += var_2C; + arg1 += 2; + } + + ptr = arg1 - 2; + } + else if (var_2C < 0) + { + arg1 += (r10 - 56) * 2; + for (i = 0; i < r8; i++) + { + arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; + if (r4 < (155 << 10)) + { + arg1[arg4] = 155; + break; + } + r4 += var_2C; + arg1 += 2; + } + + gPokenavStructPtr->unk9340 = r10 + i; + arg5 += (gPokenavStructPtr->unk9340 - 56) * 2; + for (; i < r8; i++) + { + arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4; + r4 += var_2C; + arg5 += 2; + } + + ptr = arg5 - 2; + } + else + { + gPokenavStructPtr->unk9340 = r10; + arg1 += (r10 - 56) * 2; + arg5 += (r10 - 56) * 2; + arg1[1] = arg2->unk0 + 1; + arg5[0] = arg3->unk0; + arg5[1] = 155; + return; + } + + ptr[arg4] = arg4 + var_30; } void sub_80F58DC(struct UnkPokenav11 * a0) @@ -4560,17 +4331,17 @@ void sub_80F58DC(struct UnkPokenav11 * a0) if (a0[0].unk2 < a0[1].unk2) { r6 = a0[0].unk2; - sub_80F5688(gPokenavStructPtr->unk9130, &a0[0], &a0[1], 1, NULL); + sub_80F5688((u16 *)gPokenavStructPtr->unk9130, &a0[0], &a0[1], 1, NULL); } else { r6 = a0[1].unk2; - sub_80F5688(gPokenavStructPtr->unk9130, &a0[1], &a0[0], 0, NULL); + sub_80F5688((u16 *)gPokenavStructPtr->unk9130, &a0[1], &a0[0], 0, NULL); } - sub_80F5688(gPokenavStructPtr->unk9130, &a0[1], &a0[2], 1, NULL); + sub_80F5688((u16 *)gPokenavStructPtr->unk9130, &a0[1], &a0[2], 1, NULL); i = a0[2].unk2 <= a0[3].unk2; - sub_80F5688(gPokenavStructPtr->unk9130, &a0[2], &a0[3], i, gPokenavStructPtr->unk9238); + sub_80F5688((u16 *)gPokenavStructPtr->unk9130, &a0[2], &a0[3], i, (u16 *)gPokenavStructPtr->unk9238); for (i = 56; i < r6; i++) { gPokenavStructPtr->unk9130[i - 56][0] = 0; @@ -4601,15 +4372,15 @@ void sub_80F5A1C(struct UnkPokenav11 *arg0) if (arg0[0].unk2 < arg0[4].unk2) { r6 = arg0[0].unk2; - sub_80F5688(gPokenavStructPtr->unk9238, &arg0[0], &arg0[4], 0, NULL); + sub_80F5688((u16 *)gPokenavStructPtr->unk9238, &arg0[0], &arg0[4], 0, NULL); } else { r6 = arg0[4].unk2; - sub_80F5688(gPokenavStructPtr->unk9238, &arg0[4], &arg0[0], 1, NULL); + sub_80F5688((u16 *)gPokenavStructPtr->unk9238, &arg0[4], &arg0[0], 1, NULL); } - sub_80F5688(gPokenavStructPtr->unk9238, &arg0[4], &arg0[3], 0, NULL); + sub_80F5688((u16 *)gPokenavStructPtr->unk9238, &arg0[4], &arg0[3], 0, NULL); for (i = 56; i < r6; i++) { |