diff options
author | Kaz <kazbloxmc@gmail.com> | 2020-05-28 02:21:46 -0400 |
---|---|---|
committer | Kaz <kazbloxmc@gmail.com> | 2020-05-28 02:21:46 -0400 |
commit | 2608dd2a3383ed116c4bf32255751afd3b7f0374 (patch) | |
tree | 3b5a7a0f9aeac62d9913b9241ba5ce8d60f4bf6a /src | |
parent | 4b75f2fef9c793a1c2e9656d2bf6926913b692d7 (diff) |
Fix mauville_man, battle_anim_special, battle_ai_switch_items,
battle_ai_script_commands, roulette_gfx and util nonmatchings
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_ai_script_commands.c | 301 | ||||
-rw-r--r-- | src/battle_ai_switch_items.c | 275 | ||||
-rwxr-xr-x | src/battle_anim_special.c | 80 | ||||
-rw-r--r-- | src/mauville_man.c | 14 | ||||
-rw-r--r-- | src/roulette_gfx.c | 365 | ||||
-rw-r--r-- | src/util.c | 286 |
6 files changed, 117 insertions, 1204 deletions
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 405776db6..bf5444cf6 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -246,10 +246,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_not_taunted, // 0x5D }; -#ifdef NONMATCHING -static -#endif -const u16 sDiscouragedPowerfulMoveEffects[] = +static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, @@ -945,18 +942,19 @@ static void BattleAICmd_get_move_power(void) gAIScriptPtr += 1; } -#ifdef NONMATCHING static void BattleAICmd_is_most_powerful_move(void) { - int i, j; - s32 damages[MAX_MON_MOVES]; + s32 i, checkedMove; + s32 moveDmgs[MAX_MON_MOVES]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) break; + } if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 - && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) { gDynamicBasePower = 0; eDynamicMoveType = 0; @@ -964,294 +962,49 @@ static void BattleAICmd_is_most_powerful_move(void) gMoveResultFlags = 0; gCritMultiplier = 1; - for (i = 0; i < MAX_MON_MOVES; i++) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { - for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) - { // _08108276 - if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) + for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + { + if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i]) break; } - // _081082BA - if (gBattleMons[gBattlerAttacker].moves[i] - && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF - && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power > 1) + if (gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF + && gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].power > 1) { - gCurrentMove = gBattleMons[gBattlerAttacker].moves[i]; + gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove]; AI_CalcDmg(gBattlerAttacker, gBattlerTarget); TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); - damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100; - - if (damages[i] == 0) // moves always do at least 1 damage. - damages[i] = 1; + moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; + if (moveDmgs[checkedMove] == 0) + moveDmgs[checkedMove] = 1; } else { - damages[i] = 0; + moveDmgs[checkedMove] = 0; } } - for (i = 0; i < MAX_MON_MOVES; i++) - if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex]) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) + { + if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) break; + } - if (i == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = 2; + if (checkedMove == MAX_MON_MOVES) + AI_THINKING_STRUCT->funcResult = 2; // Is the most powerful. else - AI_THINKING_STRUCT->funcResult = 1; + AI_THINKING_STRUCT->funcResult = 1; // Not the most powerful. } else { - AI_THINKING_STRUCT->funcResult = 0; + AI_THINKING_STRUCT->funcResult = 0; // Highly discouraged in terms of power. } - gAIScriptPtr += 1; + gAIScriptPtr++; } -#else -NAKED -static void BattleAICmd_is_most_powerful_move(void) -{ - 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, 0x14\n\ - movs r3, 0\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r1, [r0]\n\ - ldr r4, _0810832C @ =0x0000ffff\n\ - ldr r6, _08108330 @ =gBattleMoves\n\ - ldr r5, _08108334 @ =gSharedMem + 0x16800\n\ - cmp r1, r4\n\ - beq _0810822E\n\ - ldrh r1, [r5, 0x2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_0810821E:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _0810822E\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r4\n\ - bne _0810821E\n\ -_0810822E:\n\ - ldrh r0, [r5, 0x2]\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r6\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bhi _08108240\n\ - b _081083B2\n\ -_08108240:\n\ - lsls r0, r3, 1\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r1\n\ - ldrh r3, [r0]\n\ - ldr r0, _0810832C @ =0x0000ffff\n\ - cmp r3, r0\n\ - beq _08108250\n\ - b _081083B2\n\ -_08108250:\n\ - ldr r0, _08108338 @ =gDynamicBasePower\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - ldr r2, _0810833C @ =0xfffff81c\n\ - adds r0, r5, r2\n\ - strb r1, [r0]\n\ - adds r2, 0x3\n\ - adds r0, r5, r2\n\ - movs r2, 0x1\n\ - strb r2, [r0]\n\ - ldr r0, _08108340 @ =gMoveResultFlags\n\ - strb r1, [r0]\n\ - ldr r0, _08108344 @ =gCritMultiplier\n\ - strb r2, [r0]\n\ - movs r6, 0\n\ - mov r9, r3\n\ - ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r0, [r0]\n\ - str r0, [sp, 0x10]\n\ -_08108276:\n\ - movs r3, 0\n\ - ldr r5, _08108348 @ =gBattleMons\n\ - lsls r4, r6, 1\n\ - ldr r7, _0810834C @ =gBattlerAttacker\n\ - lsls r1, r6, 2\n\ - mov r8, r1\n\ - adds r2, r6, 0x1\n\ - mov r10, r2\n\ - ldr r0, [sp, 0x10]\n\ - cmp r0, r9\n\ - beq _081082BA\n\ - ldr r2, _08108330 @ =gBattleMoves\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ -_081082AA:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _081082BA\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r9\n\ - bne _081082AA\n\ -_081082BA:\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _0810835C\n\ - lsls r0, r3, 1\n\ - ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r9\n\ - bne _0810835C\n\ - ldr r0, _08108330 @ =gBattleMoves\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 1\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bls _0810835C\n\ - ldr r5, _08108350 @ =gCurrentMove\n\ - strh r2, [r5]\n\ - ldrb r0, [r7]\n\ - ldr r4, _08108354 @ =gBattlerTarget\n\ - ldrb r1, [r4]\n\ - bl AI_CalcDmg\n\ - ldrh r0, [r5]\n\ - ldrb r1, [r7]\n\ - ldrb r2, [r4]\n\ - bl TypeCalc\n\ - mov r4, sp\n\ - add r4, r8\n\ - ldr r2, _08108358 @ =gBattleMoveDamage\n\ - ldr r0, _08108334 @ =gSharedMem + 0x16800\n\ - adds r0, 0x18\n\ - adds r0, r6, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [r2]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _08108364\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ - b _08108364\n\ - .align 2, 0\n\ -_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\ -_0810832C: .4byte 0x0000ffff\n\ -_08108330: .4byte gBattleMoves\n\ -_08108334: .4byte gSharedMem + 0x16800\n\ -_08108338: .4byte gDynamicBasePower\n\ -_0810833C: .4byte 0xfffff81c\n\ -_08108340: .4byte gMoveResultFlags\n\ -_08108344: .4byte gCritMultiplier\n\ -_08108348: .4byte gBattleMons\n\ -_0810834C: .4byte gBattlerAttacker\n\ -_08108350: .4byte gCurrentMove\n\ -_08108354: .4byte gBattlerTarget\n\ -_08108358: .4byte gBattleMoveDamage\n\ -_0810835C:\n\ - mov r1, sp\n\ - add r1, r8\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_08108364:\n\ - mov r6, r10\n\ - cmp r6, 0x3\n\ - ble _08108276\n\ - movs r6, 0\n\ - ldr r1, _081083A4 @ =gSharedMem + 0x16800\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r2, [sp]\n\ - ldr r0, [r0]\n\ - adds r5, r1, 0\n\ - ldr r4, _081083A8 @ =gAIScriptPtr\n\ - cmp r2, r0\n\ - bgt _0810839A\n\ - adds r3, r5, 0\n\ - mov r2, sp\n\ -_08108384:\n\ - adds r2, 0x4\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _0810839A\n\ - ldrb r0, [r3, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r1, [r2]\n\ - ldr r0, [r0]\n\ - cmp r1, r0\n\ - ble _08108384\n\ -_0810839A:\n\ - cmp r6, 0x4\n\ - bne _081083AC\n\ - movs r0, 0x2\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ - .align 2, 0\n\ -_081083A4: .4byte gSharedMem + 0x16800\n\ -_081083A8: .4byte gAIScriptPtr\n\ -_081083AC:\n\ - movs r0, 0x1\n\ - str r0, [r5, 0x8]\n\ - b _081083B8\n\ -_081083B2:\n\ - movs r0, 0\n\ - str r0, [r5, 0x8]\n\ - ldr r4, _081083D0 @ =gAIScriptPtr\n\ -_081083B8:\n\ - ldr r0, [r4]\n\ - adds r0, 0x1\n\ - str r0, [r4]\n\ - add sp, 0x14\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\ - .align 2, 0\n\ -_081083D0: .4byte gAIScriptPtr\n\ - .syntax divided\n"); -} -#endif // NONMATCHING static void BattleAICmd_get_move(void) { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index b4b2841e0..f83334be3 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -47,263 +47,60 @@ static bool8 ShouldSwitchIfPerishSong(void) return FALSE; } -#ifdef NONMATCHING static bool8 ShouldSwitchIfWonderGuard(void) { u8 opposingBattler; u8 moveFlags; s32 i, j; + u16 move; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - return FALSE; - - if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability != ABILITY_WONDER_GUARD) + if(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) return FALSE; - // check if pokemon has a super effective move - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - for (i = 0; i < 4; i++) + if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability == ABILITY_WONDER_GUARD) { - u16 move = gBattleMons[gActiveBattler].moves[i]; - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) - return FALSE; - } - - // find a pokemon in the party that has a super effective move - for (i = 0; i < 6; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0 - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG - || i == gBattlerPartyIndexes[gActiveBattler]) - continue; - - GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // unused return value - GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // unused return value - - opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - for (j = 0; j < 4; j++) + // Check if Pokemon has a super effective move. + for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), i = 0; i < MAX_MON_MOVES; ++i) { - u16 move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && (Random() % 3) < 2) + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + return FALSE; + } + // Find a Pokemon in the party that has a super effective move. + for (i = 0; i < PARTY_SIZE; ++i) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + if (i == gBattlerPartyIndexes[gActiveBattler]) + continue; + GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // Unused return value. + GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // Unused return value. + + for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), j = 0; j < MAX_MON_MOVES; ++j) { - // we found a mon - ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i; - BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); - return TRUE; + move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + if (move == MOVE_NONE) + continue; + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2) + { + // We found a mon. + ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } } } } - - return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard -} -#else -NAKED -static bool8 ShouldSwitchIfWonderGuard(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _0803606C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080360A0\n\ - b _080361C8\n\ - .align 2, 0\n\ -_0803606C: .4byte gBattleTypeFlags\n\ -_08036070:\n\ - ldr r0, _08036094 @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - ldr r1, _08036098 @ =gSharedMem\n\ - lsls r0, 24\n\ - lsrs r0, 25\n\ - ldr r2, _0803609C @ =0x000160c8\n\ - adds r0, r2\n\ - adds r0, r1\n\ - strb r6, [r0]\n\ - movs r0, 0x1\n\ - movs r1, 0x2\n\ - movs r2, 0\n\ - bl BtlController_EmitTwoReturnValues\n\ - movs r0, 0x1\n\ - b _080361CA\n\ - .align 2, 0\n\ -_08036094: .4byte gActiveBattler\n\ -_08036098: .4byte gSharedMem\n\ -_0803609C: .4byte 0x000160c8\n\ -_080360A0:\n\ - ldr r4, _080361D8 @ =gBattleMons\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x58\n\ - muls r0, r1\n\ - adds r0, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - beq _080360BC\n\ - b _080361C8\n\ -_080360BC:\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - movs r6, 0\n\ - adds r7, r4, 0\n\ - movs r5, 0x58\n\ - adds r0, r2, 0\n\ - muls r0, r5\n\ - adds r4, r0, r7\n\ - movs r3, 0x20\n\ - adds r3, r4\n\ - mov r8, r3\n\ -_080360D8:\n\ - lsls r1, r6, 1\n\ - ldr r0, _080361DC @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - muls r0, r5\n\ - adds r1, r0\n\ - adds r0, r7, 0\n\ - adds r0, 0xC\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _08036104\n\ - ldrh r1, [r4]\n\ - mov r3, r8\n\ - ldrb r2, [r3]\n\ - bl AI_TypeCalc\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - movs r0, 0x2\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _080361C8\n\ -_08036104:\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - ble _080360D8\n\ - movs r6, 0\n\ - ldr r0, _080361E0 @ =gEnemyParty\n\ - mov r9, r0\n\ -_08036110:\n\ - movs r0, 0x64\n\ - adds r5, r6, 0\n\ - muls r5, r0\n\ - mov r2, r9\n\ - adds r4, r5, r2\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _080361C2\n\ - ldr r1, _080361E4 @ =gBattlerPartyIndexes\n\ - ldr r0, _080361DC @ =gActiveBattler\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - cmp r6, r0\n\ - beq _080361C2\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - adds r0, r4, 0\n\ - movs r1, 0x2E\n\ - bl GetMonData\n\ - movs r0, 0\n\ - bl GetBattlerAtPosition\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - movs r4, 0\n\ - mov r8, r5\n\ - ldr r1, _080361D8 @ =gBattleMons\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r5, r0, r1\n\ - adds r7, r5, 0\n\ - adds r7, 0x20\n\ -_0803617C:\n\ - adds r1, r4, 0\n\ - adds r1, 0xD\n\ - mov r0, r8\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0\n\ - beq _080361BC\n\ - ldrh r1, [r5]\n\ - ldrb r2, [r7]\n\ - bl AI_TypeCalc\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - movs r0, 0x2\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _080361BC\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _080361BC\n\ - b _08036070\n\ -_080361BC:\n\ - adds r4, 0x1\n\ - cmp r4, 0x3\n\ - ble _0803617C\n\ -_080361C2:\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08036110\n\ -_080361C8:\n\ - movs r0, 0\n\ -_080361CA:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080361D8: .4byte gBattleMons\n\ -_080361DC: .4byte gActiveBattler\n\ -_080361E0: .4byte gEnemyParty\n\ -_080361E4: .4byte gBattlerPartyIndexes\n\ - .syntax divided\n"); + return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard. } -#endif // NONMATCHING static bool8 FindMonThatAbsorbsOpponentsMove(void) { diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c index d8cf71be6..bae635e9f 100755 --- a/src/battle_anim_special.c +++ b/src/battle_anim_special.c @@ -1272,18 +1272,14 @@ static void sub_81407B8(struct Sprite *sprite) sprite->callback = sub_81407F4; } -#ifdef NONMATCHING -// there is some weird typing going on with var0 and var1. static void sub_81407F4(struct Sprite *sprite) { - s16 var0, var1; - - var0 = sprite->data[0] + 0x800; - var1 = sprite->data[1] + 0x680; + s16 var0 = sprite->data[0] + 0x800; + s16 var1 = sprite->data[1] + 0x680; sprite->pos2.x -= var1 >> 8; sprite->pos2.y += var0 >> 8; - sprite->data[0] = var0 & 0xFF; - sprite->data[1] = var1 & 0xFF; + sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF; + sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF; if (sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.x + sprite->pos2.x < -8) @@ -1294,74 +1290,6 @@ static void sub_81407F4(struct Sprite *sprite) UpdateOamPriorityInAllHealthboxes(1); } } -#else -NAKED -static void sub_81407F4(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r4, r0, 0\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - adds r2, r0, 0\n\ - ldrh r1, [r4, 0x2E]\n\ - adds r2, r1\n\ - movs r0, 0xD0\n\ - lsls r0, 3\n\ - adds r3, r0, 0\n\ - ldrh r1, [r4, 0x30]\n\ - adds r3, r1\n\ - lsls r1, r3, 16\n\ - asrs r1, 24\n\ - ldrh r0, [r4, 0x24]\n\ - subs r0, r1\n\ - strh r0, [r4, 0x24]\n\ - lsls r0, r2, 16\n\ - asrs r0, 24\n\ - ldrh r1, [r4, 0x26]\n\ - adds r0, r1\n\ - strh r0, [r4, 0x26]\n\ - movs r0, 0xFF\n\ - ands r2, r0\n\ - strh r2, [r4, 0x2E]\n\ - ands r3, r0\n\ - strh r3, [r4, 0x30]\n\ - movs r2, 0x22\n\ - ldrsh r0, [r4, r2]\n\ - movs r2, 0x26\n\ - ldrsh r1, [r4, r2]\n\ - adds r0, r1\n\ - cmp r0, 0xA0\n\ - bgt _0814084A\n\ - movs r1, 0x20\n\ - ldrsh r0, [r4, r1]\n\ - movs r2, 0x24\n\ - ldrsh r1, [r4, r2]\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _0814085E\n\ -_0814084A:\n\ - movs r0, 0\n\ - strh r0, [r4, 0x2E]\n\ - ldr r0, _08140864 @ =sub_81405C8\n\ - str r0, [r4, 0x1C]\n\ - ldr r1, _08140868 @ =gDoingBattleAnim\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - bl UpdateOamPriorityInAllHealthboxes\n\ -_0814085E:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08140864: .4byte sub_81405C8\n\ -_08140868: .4byte gDoingBattleAnim\n\ - .syntax divided\n"); -} -#endif // NONMATCHING u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballIndex) { diff --git a/src/mauville_man.c b/src/mauville_man.c index 64c41f3bf..7b317e08b 100644 --- a/src/mauville_man.c +++ b/src/mauville_man.c @@ -707,9 +707,6 @@ static void Task_BardSong(u8 taskId) struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; u8 *str = gStringVar4 + task->tCharIndex; u16 wordLen = 0; - // Can't get it to match without hacking - u32 temp; - register s16 zero asm("r1"); while (*str != CHAR_SPACE && *str != CHAR_NEWLINE @@ -723,17 +720,20 @@ static void Task_BardSong(u8 taskId) gUnknown_020388BC = MACRO1(bard->songLyrics[task->tCurrWord]); else gUnknown_020388BC = MACRO1(bard->temporaryLyrics[task->tCurrWord]); - temp = gUnknown_03005DA0.var04 / wordLen; - zero = 0; - gUnknown_03005DA0.var04 = temp; + gUnknown_03005DA0.var04 /= wordLen; if (gUnknown_03005DA0.var04 <= 0) gUnknown_03005DA0.var04 = 1; task->tCurrWord++; if (task->data[2] == 0) + { task->tState = 3; + task->data[1] = 0; + } else + { task->tState = 5; - task->data[1] = zero; + task->data[1] = 0; + } } break; case 5: diff --git a/src/roulette_gfx.c b/src/roulette_gfx.c index 83e5fb149..46188123b 100644 --- a/src/roulette_gfx.c +++ b/src/roulette_gfx.c @@ -1626,32 +1626,33 @@ void sub_81193D4(struct Sprite *sprite) eRoulette->var38 = sprite; } -#ifdef NONMATCHING void sub_811952C(struct Sprite *sprite) { - u8 i; u8 z; u16 o; - u8 h = 0; // r10 (sp+12) - u8 j = 5; // r9 (r9) - u8 p = 0; // sp+12 (sp+16) - u8 s[10] = {}; // sp+0 (sp+0) - u16 t = Random(); // sp+16 (r10) + u8 h = 0; + u8 j = 5; + u8 p = 0; + u8 i = 0; + u8 val; + u8 s[10] = {}; + u16 rand = Random(); - eRoulette->var7D = 1; + eRoulette->var7D = 1; eRoulette->var03_5 = TRUE; eRoulette->var03_6 = FALSE; - eRoulette->var7E = 255; - eRoulette->var88 = sprite->data[3]; - eRoulette->var98 = 0.0f; - eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; - o = (eRoulette->var04_0 * 30 + 33) + (1 - eRoulette->var03_0) * 15; + eRoulette->var7E = 0xFF; + eRoulette->var88 = sprite->data[3]; + eRoulette->var98 = 0.0f; + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; + + o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15; for (i = 0; i < 4; i++) { if (o < sprite->data[3] && sprite->data[3] <= o + 90) { - sprite->data[0] = i << 1; - eRoulette->var03_0 = i & 1; + sprite->data[0] = i / 2; + eRoulette->var03_0 = i % 2; break; } if (i == 3) @@ -1662,358 +1663,52 @@ void sub_811952C(struct Sprite *sprite) } o += 90; } + if (eRoulette->var03_0) { if (sprite->data[0]) - { PlayCry1(SPECIES_TAILLOW, -63); - } else - { PlayCry1(SPECIES_TAILLOW, 63); - } } else { PlayCry1(SPECIES_SHROOMISH, -63); } - i = 2; + + val = 2; z = (eRoulette->var7F + 2) % 12; + if (eRoulette->var03_0 == 1 && eRoulette->var04_0 == 1) j += 6; else - j += i; - for (; i < j; i++) + j += val; + + for (i = val; i < j; i++) { if (!(eRoulette->var08 & gUnknown_083F8D90[z].var04)) { s[h++] = i; - if (!p && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var00)) - { + if (p == 0 && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var0C)) p = i; - } } - z = (z + 1) % 12; + z = (z + 1) % 0xC; } + if ((eRoulette->var03_0 + 1) & eRoulette->var02) { - if (p && (t & 0xFF) < 192) - { + if (p && (rand & 0xFF) < 0xc0) sprite->data[7] = p; - } else - { - sprite->data[7] = s[t % h]; - } + sprite->data[7] = s[rand % h]; } else { - sprite->data[7] = s[t % h]; + sprite->data[7] = s[rand % h]; } + sprite->callback = sub_8118CEC; } -#else -NAKED -void sub_811952C(struct Sprite *sprite) -{ - asm_unified("push {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 20\n" - "\tmov r8, r0\n" - "\tmovs r0, 0\n" - "\tmov r10, r0\n" - "\tmovs r1, 5\n" - "\tmov r9, r1\n" - "\tmovs r2, 0\n" - "\tstr r2, [sp, 12]\n" - "\tmov r0, sp\n" - "\tmovs r1, 0\n" - "\tmovs r2, 10\n" - "\tbl memset\n" - "\tbl Random\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp, 16]\n" - "\tldr r7, _08119610 @ =gSharedMem + 0x19000\n" - "\tadds r0, r7, 0\n" - "\tadds r0, 125\n" - "\tmovs r6, 1\n" - "\tstrb r6, [r0]\n" - "\tldrb r4, [r7, 3]\n" - "\tmovs r0, 32\n" - "\torrs r4, r0\n" - "\tmovs r0, 65\n" - "\tnegs r0, r0\n" - "\tands r4, r0\n" - "\tstrb r4, [r7, 3]\n" - "\tadds r1, r7, 0\n" - "\tadds r1, 126\n" - "\tmovs r0, 255\n" - "\tstrb r0, [r1]\n" - "\tadds r5, r7, 0\n" - "\tadds r5, 136\n" - "\tmov r3, r8\n" - "\tmovs r1, 52\n" - "\tldrsh r0, [r3, r1]\n" - "\tbl __floatsisf\n" - "\tstr r0, [r5]\n" - "\tadds r1, r7, 0\n" - "\tadds r1, 152\n" - "\tldr r0, _08119614 @ =0\n" - "\tstr r0, [r1]\n" - "\tadds r3, r7, 0\n" - "\tadds r3, 140\n" - "\tldr r2, _08119618 @ =gUnknown_083F8DF4\n" - "\tldrb r0, [r7, 4]\n" - "\tlsls r0, 30\n" - "\tlsrs r1, r0, 25\n" - "\tadds r2, 28\n" - "\tadds r1, r2\n" - "\tldr r1, [r1]\n" - "\tstr r1, [r3]\n" - "\tlsrs r0, 30\n" - "\tlsls r1, r0, 4\n" - "\tsubs r1, r0\n" - "\tlsls r1, 1\n" - "\tadds r1, 33\n" - "\tlsls r4, 27\n" - "\tlsrs r4, 27\n" - "\tsubs r6, r4\n" - "\tlsls r0, r6, 4\n" - "\tsubs r0, r6\n" - "\tadds r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tmov r5, r10\n" - "\tmov r3, r8\n" - "\tmovs r0, 52\n" - "\tldrsh r2, [r3, r0]\n" - "_081195C8:\n" - "\tcmp r1, r2\n" - "\tbge _081195D4\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 90\n" - "\tcmp r2, r0\n" - "\tble _08119638\n" - "_081195D4:\n" - "\tcmp r5, 3\n" - "\tbeq _0811961C\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 90\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tadds r0, r5, 1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, 3\n" - "\tbls _081195C8\n" - "_081195EA:\n" - "\tldr r0, _08119610 @ =gSharedMem + 0x19000\n" - "\tldrb r1, [r0, 3]\n" - "\tmovs r0, 31\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _08119664\n" - "\tmov r1, r8\n" - "\tmovs r2, 46\n" - "\tldrsh r0, [r1, r2]\n" - "\tcmp r0, 0\n" - "\tbeq _08119658\n" - "\tmovs r0, 152\n" - "\tlsls r0, 1\n" - "\tmovs r1, 63\n" - "\tnegs r1, r1\n" - "\tbl PlayCry1\n" - "\tb _08119670\n" - "\t.align 2, 0\n" - "_08119610: .4byte gSharedMem + 0x19000\n" - "_08119614: .4byte 0\n" - "_08119618: .4byte gUnknown_083F8DF4\n" - "_0811961C:\n" - "\tmovs r0, 1\n" - "\tmov r3, r8\n" - "\tstrh r0, [r3, 46]\n" - "\tldr r2, _08119634 @ =gSharedMem + 0x19000\n" - "\tldrb r1, [r2, 3]\n" - "\tsubs r0, 33\n" - "\tands r0, r1\n" - "\tmovs r1, 1\n" - "\torrs r0, r1\n" - "\tstrb r0, [r2, 3]\n" - "\tb _081195EA\n" - "\t.align 2, 0\n" - "_08119634: .4byte gSharedMem + 0x19000\n" - "_08119638:\n" - "\tlsrs r0, r5, 1\n" - "\tmov r1, r8\n" - "\tstrh r0, [r1, 46]\n" - "\tldr r3, _08119654 @ =gSharedMem + 0x19000\n" - "\tmovs r1, 1\n" - "\tands r1, r5\n" - "\tldrb r2, [r3, 3]\n" - "\tmovs r0, 32\n" - "\tnegs r0, r0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r3, 3]\n" - "\tb _081195EA\n" - "\t.align 2, 0\n" - "_08119654: .4byte gSharedMem + 0x19000\n" - "_08119658:\n" - "\tmovs r0, 152\n" - "\tlsls r0, 1\n" - "\tmovs r1, 63\n" - "\tbl PlayCry1\n" - "\tb _08119670\n" - "_08119664:\n" - "\tmovs r0, 153\n" - "\tlsls r0, 1\n" - "\tmovs r1, 63\n" - "\tnegs r1, r1\n" - "\tbl PlayCry1\n" - "_08119670:\n" - "\tmovs r5, 2\n" - "\tldr r4, _081196A0 @ =gSharedMem + 0x19000\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 127\n" - "\tldrb r0, [r0]\n" - "\tadds r0, 2\n" - "\tmovs r1, 12\n" - "\tbl __modsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tldrb r1, [r4, 3]\n" - "\tmovs r0, 31\n" - "\tands r0, r1\n" - "\tcmp r0, 1\n" - "\tbne _081196A4\n" - "\tldrb r1, [r4, 4]\n" - "\tmovs r0, 3\n" - "\tands r0, r1\n" - "\tcmp r0, 1\n" - "\tbne _081196A4\n" - "\tmov r0, r9\n" - "\tadds r0, 6\n" - "\tb _081196A8\n" - "\t.align 2, 0\n" - "_081196A0: .4byte gSharedMem + 0x19000\n" - "_081196A4:\n" - "\tmov r2, r9\n" - "\tadds r0, r2, r5\n" - "_081196A8:\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r9, r0\n" - "\tcmp r5, r9\n" - "\tbcs _0811970E\n" - "\tldr r6, _08119734 @ =gSharedMem + 0x19000\n" - "\tldr r7, _08119738 @ =gUnknown_083F8C00 + 12\n" - "_081196B6:\n" - "\tlsls r0, r3, 3\n" - "\tldr r1, _0811973C @ =gUnknown_083F8D90 + 4\n" - "\tadds r0, r1\n" - "\tldr r1, [r6, 8]\n" - "\tldr r2, [r0]\n" - "\tands r1, r2\n" - "\tcmp r1, 0\n" - "\tbne _081196F8\n" - "\tmov r0, r10\n" - "\tadds r1, r0, 1\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tmov r10, r1\n" - "\tadd r0, sp\n" - "\tstrb r5, [r0]\n" - "\tldr r0, [sp, 12]\n" - "\tcmp r0, 0\n" - "\tbne _081196F8\n" - "\tldrb r0, [r6, 26]\n" - "\tlsls r0, 28\n" - "\tlsrs r0, 28\n" - "\tldr r1, _08119740 @ =gSharedMem + 0x1901b\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tlsls r0, r1, 2\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r7\n" - "\tldr r0, [r0]\n" - "\tands r2, r0\n" - "\tcmp r2, 0\n" - "\tbeq _081196F8\n" - "\tstr r5, [sp, 12]\n" - "_081196F8:\n" - "\tadds r0, r3, 1\n" - "\tmovs r1, 12\n" - "\tbl __modsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tadds r0, r5, 1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, r9\n" - "\tbcc _081196B6\n" - "_0811970E:\n" - "\tldrb r0, [r4, 3]\n" - "\tlsls r0, 27\n" - "\tlsrs r0, 27\n" - "\tadds r0, 1\n" - "\tldrb r1, [r4, 2]\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _08119756\n" - "\tldr r2, [sp, 12]\n" - "\tcmp r2, 0\n" - "\tbeq _08119744\n" - "\tmovs r0, 255\n" - "\tldr r3, [sp, 16]\n" - "\tands r0, r3\n" - "\tcmp r0, 191\n" - "\tbhi _08119744\n" - "\tmov r0, r8\n" - "\tstrh r2, [r0, 60]\n" - "\tb _08119766\n" - "\t.align 2, 0\n" - "_08119734: .4byte gSharedMem + 0x19000\n" - "_08119738: .4byte gUnknown_083F8C00 + 12\n" - "_0811973C: .4byte gUnknown_083F8D90 + 4\n" - "_08119740: .4byte gSharedMem + 0x1901b\n" - "_08119744:\n" - "\tldr r0, [sp, 16]\n" - "\tmov r1, r10\n" - "\tbl __modsi3\n" - "\tadd r0, sp\n" - "\tldrb r0, [r0]\n" - "\tmov r1, r8\n" - "\tstrh r0, [r1, 60]\n" - "\tb _08119766\n" - "_08119756:\n" - "\tldr r0, [sp, 16]\n" - "\tmov r1, r10\n" - "\tbl __modsi3\n" - "\tadd r0, sp\n" - "\tldrb r0, [r0]\n" - "\tmov r2, r8\n" - "\tstrh r0, [r2, 60]\n" - "_08119766:\n" - "\tldr r3, _0811977C @ =sub_8118CEC\n" - "\tmov r0, r8\n" - "\tstr r3, [r0, 28]\n" - "\tadd sp, 20\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\n" - "\t.align 2, 0\n" - "_0811977C: .4byte sub_8118CEC"); -} -#endif const u16 gUnknown_083FA61E[] = { BLDALPHA_BLEND( 7, 9), diff --git a/src/util.c b/src/util.c index 2e76cf4de..ed59ac241 100644 --- a/src/util.c +++ b/src/util.c @@ -152,10 +152,6 @@ void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s BgAffineSet(&src, dest, 1); } -#ifdef NONMATCHING - -// Functionally equivalent. -// Only the two yflip loops don't match. void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) { u8 x, y; @@ -170,27 +166,22 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) for (x = 0; x < w; x++) { - int tile = (*tilemap & 0x3ff) * 32; + u16 tile = (*tilemap & 0x3ff) * 32; int attr = *tilemap & 0xc00; if (attr == 0) { - void *src = tiles + tile; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); + DmaCopy32Defvars(3, tiles + tile, output, 32); } else if (attr == 0x800) // yflip { for (i = 0; i < 8; i++) { - void *src = tiles; - void *dest = output; - int length = 4; - // this is likely wrong, but makes it closer to matching - src += tile + (7 - i) * 4; - dest += i * 4; - DmaCopy32(3, src, dest, length); + u8 requiredForMatching = 0; + + ++requiredForMatching; + --requiredForMatching; + DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4); } } else // xflip @@ -200,26 +191,22 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) for (j = 0; j < 4; j++) { u8 i2 = i * 4; - xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4; - xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4; + xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4; + xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4; } } if (*tilemap & 0x800) // yflip { for (i = 0; i < 8; i++) { - void *src = xflip + (7-i) * 4; - void *dest = output + i*4; - int length = 4; - DmaCopy32(3, src, dest, length); + ++tile; + --tile; + DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4); } } else { - void *src = xflip; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); + DmaCopy32Defvars(3, xflip, output, 32); } } tilemap++; @@ -229,253 +216,6 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) } } -#else - -NAKED void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) -{ - asm("\n" - " .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, 0x3C\n" - " str r2, [sp, 0x20]\n" - " adds r4, r3, 0\n" - " ldr r7, [sp, 0x5C]\n" - " lsls r0, 24\n" - " lsls r1, 24\n" - " ldr r2, _08041008 @ =gSpriteDimensions\n" - " lsrs r1, 23\n" - " lsrs r0, 21\n" - " adds r1, r0\n" - " adds r0, r2, 0x1\n" - " adds r0, r1, r0\n" - " ldrb r0, [r0]\n" - " str r0, [sp, 0x24]\n" - " adds r1, r2\n" - " ldrb r1, [r1]\n" - " str r1, [sp, 0x28]\n" - " movs r1, 0\n" - " cmp r1, r0\n" - " bcc _08040FB4\n" - " b _08041136\n" - "_08040FB4:\n" - " movs r0, 0x20\n" - " ldr r2, [sp, 0x28]\n" - " subs r0, r2\n" - " lsls r0, 1\n" - " str r0, [sp, 0x2C]\n" - "_08040FBE:\n" - " movs r2, 0\n" - " adds r1, 0x1\n" - " str r1, [sp, 0x34]\n" - " ldr r3, [sp, 0x28]\n" - " cmp r2, r3\n" - " bcc _08040FCC\n" - " b _08041124\n" - "_08040FCC:\n" - " ldr r0, _0804100C @ =0x040000d4\n" - " mov r8, r0\n" - "_08040FD0:\n" - " ldrh r1, [r4]\n" - " ldr r0, _08041010 @ =0x000003ff\n" - " ands r0, r1\n" - " lsls r0, 5\n" - " mov r12, r0\n" - " movs r0, 0xC0\n" - " lsls r0, 4\n" - " ands r0, r1\n" - " mov r3, sp\n" - " strh r1, [r3, 0x38]\n" - " cmp r0, 0\n" - " bne _08041018\n" - " ldr r0, [sp, 0x20]\n" - " add r0, r12\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r3, _08041014 @ =0x84000008\n" - " str r3, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " adds r7, 0x20\n" - " mov r10, r7\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041008: .4byte gSpriteDimensions\n" - "_0804100C: .4byte 0x040000d4\n" - "_08041010: .4byte 0x000003ff\n" - "_08041014: .4byte 0x84000008\n" - "_08041018:\n" - " movs r1, 0x80\n" - " lsls r1, 4\n" - " cmp r0, r1\n" - " bne _08041068\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " ldr r4, _08041060 @ =0x040000d4\n" - " ldr r6, _08041064 @ =0x84000001\n" - " movs r5, 0x7\n" - "_08041036:\n" - " lsls r2, r3, 24\n" - " asrs r2, 24\n" - " subs r0, r5, r2\n" - " lsls r0, 2\n" - " add r0, r12\n" - " ldr r1, [sp, 0x20]\n" - " adds r0, r1, r0\n" - " lsls r1, r2, 2\n" - " adds r1, r7, r1\n" - " str r0, [r4]\n" - " str r1, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r2, 0x1\n" - " lsls r2, 24\n" - " lsrs r3, r2, 24\n" - " asrs r2, 24\n" - " cmp r2, 0x7\n" - " ble _08041036\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041060: .4byte 0x040000d4\n" - "_08041064: .4byte 0x84000001\n" - "_08041068:\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - "_08041078:\n" - " movs r2, 0\n" - " lsls r4, r3, 24\n" - " lsls r0, r4, 2\n" - " lsrs r0, 24\n" - " adds r6, r0, 0x3\n" - " mov r1, r12\n" - " adds r5, r1, r0\n" - "_08041086:\n" - " lsls r1, r2, 24\n" - " asrs r1, 24\n" - " subs r0, r6, r1\n" - " mov r2, sp\n" - " adds r3, r2, r0\n" - " adds r0, r5, r1\n" - " ldr r2, [sp, 0x20]\n" - " adds r0, r2, r0\n" - " ldrb r2, [r0]\n" - " movs r0, 0xF\n" - " ands r0, r2\n" - " lsls r0, 4\n" - " lsrs r2, 4\n" - " orrs r0, r2\n" - " strb r0, [r3]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r2, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x3\n" - " ble _08041086\n" - " movs r3, 0x80\n" - " lsls r3, 17\n" - " adds r0, r4, r3\n" - " lsrs r3, r0, 24\n" - " asrs r0, 24\n" - " cmp r0, 0x7\n" - " ble _08041078\n" - " movs r0, 0x80\n" - " lsls r0, 4\n" - " mov r1, sp\n" - " ldrh r1, [r1, 0x38]\n" - " ands r0, r1\n" - " cmp r0, 0\n" - " beq _08041104\n" - " movs r3, 0\n" - " ldr r4, _080410FC @ =0x040000d4\n" - " ldr r6, _08041100 @ =0x84000001\n" - " movs r5, 0x7\n" - "_080410D4:\n" - " lsls r1, r3, 24\n" - " asrs r1, 24\n" - " subs r0, r5, r1\n" - " lsls r0, 2\n" - " mov r3, sp\n" - " adds r2, r3, r0\n" - " lsls r0, r1, 2\n" - " adds r0, r7, r0\n" - " str r2, [r4]\n" - " str r0, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r3, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x7\n" - " ble _080410D4\n" - " b _08041112\n" - " .align 2, 0\n" - "_080410FC: .4byte 0x040000d4\n" - "_08041100: .4byte 0x84000001\n" - "_08041104:\n" - " mov r0, sp\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r2, _08041148 @ =0x84000008\n" - " str r2, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - "_08041112:\n" - " ldr r4, [sp, 0x30]\n" - " mov r7, r10\n" - " mov r3, r9\n" - " lsls r0, r3, 24\n" - " lsrs r2, r0, 24\n" - " ldr r0, [sp, 0x28]\n" - " cmp r2, r0\n" - " bcs _08041124\n" - " b _08040FD0\n" - "_08041124:\n" - " ldr r1, [sp, 0x2C]\n" - " adds r4, r1\n" - " ldr r2, [sp, 0x34]\n" - " lsls r0, r2, 24\n" - " lsrs r1, r0, 24\n" - " ldr r3, [sp, 0x24]\n" - " cmp r1, r3\n" - " bcs _08041136\n" - " b _08040FBE\n" - "_08041136:\n" - " add sp, 0x3C\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" - " .align 2, 0\n" - "_08041148: .4byte 0x84000008\n" - " .syntax divided\n" - ); -} - -#endif - int CountTrailingZeroBits(u32 value) { u8 i; |