diff --git a/asm/scrcmd.s b/asm/scrcmd.s index d2146d0f1..3443a699b 100644 --- a/asm/scrcmd.s +++ b/asm/scrcmd.s @@ -910,99 +910,6 @@ _021D4168: .public sub_02041770 - thumb_func_start ScrCmd_519 -ScrCmd_519: ; 0x020459AC - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x30 - add r4, r0, #0 - bl ScriptReadHalfword - add r1, r0, #0 - add r0, r4, #0 - add r0, #0x80 - ldr r0, [r0] - bl GetVarPointer - add r4, #0x80 - str r0, [sp] - ldr r0, [r4] - ldr r0, [r0, #0xc] - bl SavArray_PlayerParty_get - str r0, [sp, #0xc] - bl GetPartyCount - add r2, sp, #0x18 - mov r4, #0 - ldr r3, _02045A5C ; =_020FACC4 - str r0, [sp, #8] - add r7, r2, #0 - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldr r0, [sp, #8] - str r4, [sp, #4] - cmp r0, #0 - ble _02045A50 - mov r5, #1 - str r7, [sp, #0x14] -_020459F6: - ldr r0, [sp, #0xc] - add r1, r4, #0 - bl GetPartyMonByIndex - add r6, r0, #0 - mov r1, #5 - mov r2, #0 - bl GetMonData - str r0, [sp, #0x10] - add r0, r6, #0 - mov r1, #0x70 - mov r2, #0 - bl GetMonData - add r3, r0, #0 - mov r0, #0x67 - ldr r1, [sp, #0x10] - lsl r0, r0, #2 - cmp r1, r0 - bne _02045A46 - mov r2, #0 - add r1, r2, #0 - str r3, [r7] - cmp r4, #0 - ble _02045A3C - ldr r6, [sp, #0x14] -_02045A2C: - ldr r0, [r6] - cmp r3, r0 - bne _02045A34 - add r2, r5, #0 -_02045A34: - add r1, r1, #1 - add r6, r6, #4 - cmp r1, r4 - blt _02045A2C -_02045A3C: - cmp r2, #0 - bne _02045A46 - ldr r0, [sp, #4] - add r0, r0, #1 - str r0, [sp, #4] -_02045A46: - ldr r0, [sp, #8] - add r4, r4, #1 - add r7, r7, #4 - cmp r4, r0 - blt _020459F6 -_02045A50: - ldr r1, [sp, #4] - ldr r0, [sp] - strh r1, [r0] - mov r0, #1 - add sp, #0x30 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02045A5C: .word _020FACC4 - thumb_func_end ScrCmd_519 - thumb_func_start ScrCmd_520 ScrCmd_520: ; 0x02045A60 push {r3, lr} diff --git a/src/scrcmd_c.c b/src/scrcmd_c.c index f3aa5ab01..a452a15a5 100644 --- a/src/scrcmd_c.c +++ b/src/scrcmd_c.c @@ -3684,13 +3684,20 @@ BOOL ScrCmd_518(SCRIPTCONTEXT *ctx) { return TRUE; } -/* extern const int _020FACC4[]; +#ifdef NONMATCHING BOOL ScrCmd_519(SCRIPTCONTEXT *ctx) { u16 *sp0 = ScriptGetVarPointer(ctx); PARTY *party = SavArray_PlayerParty_get(ctx->fsys->savedata); int partyCount = GetPartyCount(party); + + // _020FACC4 needs to be a static initializer here. + // As written, this is a regswap. + // However, _020FACB0 comes before, and must be declared + // static to maintain the correct order, but cannot + // because it's referenced all the way at the end + // of asm/scrcmd.o(.text)... int sp18[PARTY_SIZE]; memcpy(sp18, _020FACC4, sizeof(sp18)); int sp4 = 0; @@ -3702,6 +3709,7 @@ BOOL ScrCmd_519(SCRIPTCONTEXT *ctx) { int species = GetMonData(pokemon, MON_DATA_SPECIES, NULL); int forme = GetMonData(pokemon, MON_DATA_FORME, NULL); if (species == SPECIES_BURMY) { + // r2/r3 regswap in this scope sp18[i] = forme; BOOL hasMultiple = FALSE; for (j = 0; j < i; j++) { @@ -3717,4 +3725,95 @@ BOOL ScrCmd_519(SCRIPTCONTEXT *ctx) { *sp0 = sp4; return TRUE; } -*/ +#else +asm +BOOL ScrCmd_519(SCRIPTCONTEXT *ctx) { + push {r3-r7,lr} + sub sp, #0x30 + add r4, r0, #0 + bl ScriptReadHalfword + add r1, r0, #0 + add r0, r4, #0 + add r0, #0x80 + ldr r0, [r0, #0] + bl GetVarPointer + add r4, #0x80 + str r0, [sp, #0] + ldr r0, [r4, #0] + ldr r0, [r0, #0xC] + bl SavArray_PlayerParty_get + str r0, [sp, #0xC] + bl GetPartyCount + add r2, sp, #0x18 + mov r4, #0 + ldr r3, =_020FACC4 + str r0, [sp, #8] + add r7, r2, #0 + ldmia r3!, {r0, r1} + stmia r2!, {r0, r1} + ldmia r3!, {r0, r1} + stmia r2!, {r0, r1} + ldmia r3!, {r0, r1} + stmia r2!, {r0, r1} + ldr r0, [sp, #8] + str r4, [sp, #4] + cmp r0, #0 + ble @breakOuter + mov r5, #TRUE + str r7, [sp, #0x14] +@loopOuter: + ldr r0, [sp, #0xC] + add r1, r4, #0 + bl GetPartyMonByIndex + add r6, r0, #0 + mov r1, #5 + mov r2, #0 + bl GetMonData + str r0, [sp, #0x10] + add r0, r6, #0 + mov r1, #0x70 + mov r2, #0 + bl GetMonData + add r3, r0, #0 + mov r0, #0x67 + ldr r1, [sp, #0x10] + lsl r0, r0, #2 + cmp r1, r0 + bne @continueOuter + mov r2, #0 + add r1, r2, #0 + str r3, [r7] + cmp r4, #0 + ble @breakInner + ldr r6, [sp, #0x14] +@loopInner: + ldr r0, [r6, #0] + cmp r3, r0 + bne @continueInner + add r2, r5, #0 +@continueInner: + add r1, r1, #1 + add r6, r6, #4 + cmp r1, r4 + blt @loopInner +@breakInner: + cmp r2, #0 + bne @continueOuter + ldr r0, [sp, #4] + add r0, r0, #1 + str r0, [sp, #4] +@continueOuter: + ldr r0, [sp, #8] + add r4, r4, #1 + add r7, r7, #4 + cmp r4, r0 + blt @loopOuter +@breakOuter: + ldr r1, [sp, #4] + ldr r0, [sp] + strh r1, [r0] + mov r0, #1 + add sp, #0x30 + pop {r3, r4, r5, r6, r7, pc} +} +#endif //NONMATCHING