matched several functions from pokeem
This commit is contained in:
+32
-296
@@ -6,6 +6,7 @@
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/battle_ai.h"
|
||||
#include "constants/battle_move_effects.h"
|
||||
#include "constants/moves.h"
|
||||
|
||||
extern u16 Random(void);
|
||||
extern void sub_80C7164(void);
|
||||
@@ -230,10 +231,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,
|
||||
@@ -970,331 +968,69 @@ static void BattleAICmd_get_move_power(void)
|
||||
gAIScriptPtr += 1;
|
||||
}
|
||||
|
||||
// still a nonmatching
|
||||
#ifdef NONMATCHING
|
||||
static void BattleAICmd_is_most_powerful_move(void)
|
||||
{
|
||||
int i, j;
|
||||
s32 damages[MAX_MON_MOVES];
|
||||
s32 i, checkedMove;
|
||||
s32 moveDmgs[4];
|
||||
|
||||
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;
|
||||
eDmgMultiplier = 1;
|
||||
*(&gBattleStruct->dynamicMoveType) = 0;
|
||||
gBattleScripting.dmgMultiplier = 1;
|
||||
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[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j])
|
||||
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
|
||||
{
|
||||
if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
|
||||
break;
|
||||
}
|
||||
|
||||
// _081082BA
|
||||
if (gBattleMons[gBankAttacker].moves[i]
|
||||
&& sDiscouragedPowerfulMoveEffects[j] == 0xFFFF
|
||||
&& gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1)
|
||||
if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
|
||||
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
|
||||
&& gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
|
||||
{
|
||||
gCurrentMove = gBattleMons[gBankAttacker].moves[i];
|
||||
AI_CalcDmg(gBankAttacker, gBankTarget);
|
||||
TypeCalc(gCurrentMove, gBankAttacker, gBankTarget);
|
||||
damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100;
|
||||
|
||||
if (damages[i] == 0) // moves always do at least 1 damage.
|
||||
damages[i] = 1;
|
||||
gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
|
||||
AI_CalcDmg(sBattler_AI, gBattlerTarget);
|
||||
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
|
||||
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 = MOVE_MOST_POWERFUL; // Is the most powerful.
|
||||
else
|
||||
AI_THINKING_STRUCT->funcResult = 1;
|
||||
AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
|
||||
}
|
||||
else
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = 0;
|
||||
AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // 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, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
ldrh r1, [r0]\n\
|
||||
ldr r5, _080C80A8 @ =0x0000ffff\n\
|
||||
ldr r6, _080C80AC @ =gBattleMoves\n\
|
||||
ldr r2, _080C80B0 @ =gBattleResources\n\
|
||||
cmp r1, r5\n\
|
||||
beq _080C7FA2\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrh r1, [r0, 0x2]\n\
|
||||
lsls r0, r1, 1\n\
|
||||
adds r0, r1\n\
|
||||
lsls r0, 2\n\
|
||||
adds r0, r6\n\
|
||||
ldrb r4, [r0]\n\
|
||||
ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
_080C7F92:\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r4, r0\n\
|
||||
beq _080C7FA2\n\
|
||||
adds r1, 0x2\n\
|
||||
adds r3, 0x1\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r0, r5\n\
|
||||
bne _080C7F92\n\
|
||||
_080C7FA2:\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrh r1, [r0, 0x2]\n\
|
||||
lsls r0, r1, 1\n\
|
||||
adds r0, r1\n\
|
||||
lsls r0, 2\n\
|
||||
adds r0, r6\n\
|
||||
ldrb r0, [r0, 0x1]\n\
|
||||
cmp r0, 0x1\n\
|
||||
bhi _080C7FB8\n\
|
||||
b _080C8142\n\
|
||||
_080C7FB8:\n\
|
||||
lsls r0, r3, 1\n\
|
||||
ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
adds r0, r1\n\
|
||||
ldrh r3, [r0]\n\
|
||||
ldr r0, _080C80A8 @ =0x0000ffff\n\
|
||||
cmp r3, r0\n\
|
||||
beq _080C7FC8\n\
|
||||
b _080C8142\n\
|
||||
_080C7FC8:\n\
|
||||
ldr r0, _080C80B4 @ =gDynamicBasePower\n\
|
||||
movs r1, 0\n\
|
||||
strh r1, [r0]\n\
|
||||
ldr r0, _080C80B8 @ =gBattleStruct\n\
|
||||
ldr r0, [r0]\n\
|
||||
strb r1, [r0, 0x13]\n\
|
||||
ldr r0, _080C80BC @ =gBattleScripting\n\
|
||||
movs r2, 0x1\n\
|
||||
strb r2, [r0, 0xE]\n\
|
||||
ldr r0, _080C80C0 @ =gMoveResultFlags\n\
|
||||
strb r1, [r0]\n\
|
||||
ldr r0, _080C80C4 @ =gCritMultiplier\n\
|
||||
strb r2, [r0]\n\
|
||||
movs r6, 0\n\
|
||||
mov r9, r3\n\
|
||||
ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
ldrh r2, [r2]\n\
|
||||
str r2, [sp, 0x10]\n\
|
||||
_080C7FEC:\n\
|
||||
movs r3, 0\n\
|
||||
ldr r5, _080C80C8 @ =gBattleMons\n\
|
||||
lsls r4, r6, 1\n\
|
||||
ldr r7, _080C80CC @ =sBattler_AI\n\
|
||||
lsls r0, r6, 2\n\
|
||||
mov r8, r0\n\
|
||||
adds r1, r6, 0x1\n\
|
||||
mov r10, r1\n\
|
||||
ldr r2, [sp, 0x10]\n\
|
||||
cmp r2, r9\n\
|
||||
beq _080C8030\n\
|
||||
ldr r2, _080C80AC @ =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, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
_080C8020:\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r2, r0\n\
|
||||
beq _080C8030\n\
|
||||
adds r1, 0x2\n\
|
||||
adds r3, 0x1\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r0, r9\n\
|
||||
bne _080C8020\n\
|
||||
_080C8030:\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 _080C80DC\n\
|
||||
lsls r0, r3, 1\n\
|
||||
ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
adds r0, r2\n\
|
||||
ldrh r0, [r0]\n\
|
||||
cmp r0, r9\n\
|
||||
bne _080C80DC\n\
|
||||
ldr r0, _080C80AC @ =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 _080C80DC\n\
|
||||
ldr r5, _080C80D0 @ =gCurrentMove\n\
|
||||
strh r2, [r5]\n\
|
||||
ldrb r0, [r7]\n\
|
||||
ldr r4, _080C80D4 @ =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, _080C80D8 @ =gBattleMoveDamage\n\
|
||||
ldr r0, _080C80B0 @ =gBattleResources\n\
|
||||
ldr r0, [r0]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
adds r0, 0x18\n\
|
||||
adds r0, r6\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 _080C80E4\n\
|
||||
movs r0, 0x1\n\
|
||||
str r0, [r4]\n\
|
||||
b _080C80E4\n\
|
||||
.align 2, 0\n\
|
||||
_080C80A4: .4byte sDiscouragedPowerfulMoveEffects\n\
|
||||
_080C80A8: .4byte 0x0000ffff\n\
|
||||
_080C80AC: .4byte gBattleMoves\n\
|
||||
_080C80B0: .4byte gBattleResources\n\
|
||||
_080C80B4: .4byte gDynamicBasePower\n\
|
||||
_080C80B8: .4byte gBattleStruct\n\
|
||||
_080C80BC: .4byte gBattleScripting\n\
|
||||
_080C80C0: .4byte gMoveResultFlags\n\
|
||||
_080C80C4: .4byte gCritMultiplier\n\
|
||||
_080C80C8: .4byte gBattleMons\n\
|
||||
_080C80CC: .4byte sBattler_AI\n\
|
||||
_080C80D0: .4byte gCurrentMove\n\
|
||||
_080C80D4: .4byte gBattlerTarget\n\
|
||||
_080C80D8: .4byte gBattleMoveDamage\n\
|
||||
_080C80DC:\n\
|
||||
mov r1, sp\n\
|
||||
add r1, r8\n\
|
||||
movs r0, 0\n\
|
||||
str r0, [r1]\n\
|
||||
_080C80E4:\n\
|
||||
mov r6, r10\n\
|
||||
cmp r6, 0x3\n\
|
||||
bgt _080C80EC\n\
|
||||
b _080C7FEC\n\
|
||||
_080C80EC:\n\
|
||||
movs r6, 0\n\
|
||||
ldr r2, _080C8130 @ =gBattleResources\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrb r0, [r0, 0x1]\n\
|
||||
lsls r0, 2\n\
|
||||
add r0, sp\n\
|
||||
ldr r1, [sp]\n\
|
||||
ldr r0, [r0]\n\
|
||||
ldr r5, _080C8134 @ =gAIScriptPtr\n\
|
||||
cmp r1, r0\n\
|
||||
bgt _080C8122\n\
|
||||
adds r4, r2, 0\n\
|
||||
mov r3, sp\n\
|
||||
_080C8108:\n\
|
||||
adds r3, 0x4\n\
|
||||
adds r6, 0x1\n\
|
||||
cmp r6, 0x3\n\
|
||||
bgt _080C8122\n\
|
||||
ldr r0, [r4]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrb r0, [r0, 0x1]\n\
|
||||
lsls r0, 2\n\
|
||||
add r0, sp\n\
|
||||
ldr r1, [r3]\n\
|
||||
ldr r0, [r0]\n\
|
||||
cmp r1, r0\n\
|
||||
ble _080C8108\n\
|
||||
_080C8122:\n\
|
||||
cmp r6, 0x4\n\
|
||||
bne _080C8138\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r1, [r0, 0x14]\n\
|
||||
movs r0, 0x2\n\
|
||||
str r0, [r1, 0x8]\n\
|
||||
b _080C814C\n\
|
||||
.align 2, 0\n\
|
||||
_080C8130: .4byte gBattleResources\n\
|
||||
_080C8134: .4byte gAIScriptPtr\n\
|
||||
_080C8138:\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r1, [r0, 0x14]\n\
|
||||
movs r0, 0x1\n\
|
||||
str r0, [r1, 0x8]\n\
|
||||
b _080C814C\n\
|
||||
_080C8142:\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r1, [r0, 0x14]\n\
|
||||
movs r0, 0\n\
|
||||
str r0, [r1, 0x8]\n\
|
||||
ldr r5, _080C8164 @ =gAIScriptPtr\n\
|
||||
_080C814C:\n\
|
||||
ldr r0, [r5]\n\
|
||||
adds r0, 0x1\n\
|
||||
str r0, [r5]\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\
|
||||
_080C8164: .4byte gAIScriptPtr\n\
|
||||
.syntax divided\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
static void BattleAICmd_get_move(void)
|
||||
{
|
||||
|
||||
@@ -605,88 +605,25 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)
|
||||
return (u8)cursor;
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr
|
||||
bool8 IsDma3ManagerBusyWithBgCopy(void)
|
||||
{
|
||||
u8 mod;
|
||||
u8 div;
|
||||
s8 reqSpace;
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 0x80; i++)
|
||||
{
|
||||
div = i / 0x20;
|
||||
mod = i % 0x20;
|
||||
u8 div = i / 0x20;
|
||||
u8 mod = i % 0x20;
|
||||
|
||||
if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE)
|
||||
if ((sDmaBusyBitfield[div] & (1 << mod)))
|
||||
{
|
||||
reqSpace = CheckForSpaceForDma3Request(i);
|
||||
s8 reqSpace = CheckForSpaceForDma3Request(i);
|
||||
if (reqSpace == -1)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
sDmaBusyBitfield[div] &= ~(1 << mod);
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
bool8 IsDma3ManagerBusyWithBgCopy(void)
|
||||
{
|
||||
asm("push {r4-r7,lr}\n\
|
||||
mov r5, #0\n\
|
||||
mov r7, #0x1\n\
|
||||
neg r7, r7\n\
|
||||
_08001ADC:\n\
|
||||
add r0, r5, #0\n\
|
||||
cmp r5, #0\n\
|
||||
bge _08001AE4\n\
|
||||
add r0, #0x1F\n\
|
||||
_08001AE4:\n\
|
||||
asr r0, #5\n\
|
||||
lsl r2, r0, #24\n\
|
||||
lsl r0, #5\n\
|
||||
sub r0, r5, r0\n\
|
||||
lsl r0, #24\n\
|
||||
lsr r0, #24\n\
|
||||
ldr r1, =sDmaBusyBitfield\n\
|
||||
lsr r2, #22\n\
|
||||
add r4, r2, r1\n\
|
||||
mov r6, #0x1\n\
|
||||
lsl r6, r0\n\
|
||||
ldr r0, [r4]\n\
|
||||
and r0, r6\n\
|
||||
cmp r0, #0\n\
|
||||
beq _08001B22\n\
|
||||
lsl r0, r5, #16\n\
|
||||
asr r0, #16\n\
|
||||
bl CheckForSpaceForDma3Request\n\
|
||||
lsl r0, #24\n\
|
||||
asr r0, #24\n\
|
||||
cmp r0, r7\n\
|
||||
bne _08001B1C\n\
|
||||
mov r0, #0x1\n\
|
||||
b _08001B2A\n\
|
||||
.pool\n\
|
||||
_08001B1C:\n\
|
||||
ldr r0, [r4]\n\
|
||||
bic r0, r6\n\
|
||||
str r0, [r4]\n\
|
||||
_08001B22:\n\
|
||||
add r5, #0x1\n\
|
||||
cmp r5, #0x7F\n\
|
||||
ble _08001ADC\n\
|
||||
mov r0, #0\n\
|
||||
_08001B2A:\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r1}\n\
|
||||
bx r1\n");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void ShowBg(u8 bg)
|
||||
{
|
||||
|
||||
+34
-371
@@ -1,6 +1,13 @@
|
||||
#include "global.h"
|
||||
#include "dma3.h"
|
||||
|
||||
#define MAX_DMA_REQUESTS 128
|
||||
|
||||
#define DMA_REQUEST_COPY32 1
|
||||
#define DMA_REQUEST_FILL32 2
|
||||
#define DMA_REQUEST_COPY16 3
|
||||
#define DMA_REQUEST_FILL16 4
|
||||
|
||||
static /*IWRAM_DATA*/ struct {
|
||||
/* 0x00 */ const u8 *src;
|
||||
/* 0x04 */ u8 *dest;
|
||||
@@ -29,78 +36,50 @@ void ClearDma3Requests(void)
|
||||
gDma3ManagerLocked = FALSE;
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
void ProcessDma3Requests(void)
|
||||
{
|
||||
// NOTE: the fillerA member of the DMA struct is actually u32 value;
|
||||
u16 total_size;
|
||||
u16 bytesTransferred;
|
||||
|
||||
if (gDma3ManagerLocked)
|
||||
return;
|
||||
|
||||
total_size = 0;
|
||||
bytesTransferred = 0;
|
||||
|
||||
// as long as there are DMA requests to process (unless size or vblank is an issue), do not exit
|
||||
while (gDma3Requests[gDma3RequestCursor].size)
|
||||
while (gDma3Requests[gDma3RequestCursor].size != 0)
|
||||
{
|
||||
total_size += gDma3Requests[gDma3RequestCursor].size;
|
||||
bytesTransferred += gDma3Requests[gDma3RequestCursor].size;
|
||||
|
||||
if (total_size > 0xA000)
|
||||
return; // don't do too much at once
|
||||
|
||||
if (REG_VCOUNT > 224)
|
||||
return;// we're about to leave vblank, stop
|
||||
if (bytesTransferred > 40 * 1024)
|
||||
return; // don't transfer more than 40 KiB
|
||||
if (*(u8 *)REG_ADDR_VCOUNT > 224)
|
||||
return; // we're about to leave vblank, stop
|
||||
|
||||
switch (gDma3Requests[gDma3RequestCursor].mode)
|
||||
{
|
||||
case 1: // regular 32-bit copy
|
||||
// _08000C8C
|
||||
if(gDma3Requests[gDma3RequestCursor].size <= 0x1000)
|
||||
{
|
||||
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
}
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].src += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_COPY32: // regular 32-bit copy
|
||||
Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
case 2: // repeat a single 32-bit value across RAM
|
||||
// _08000CD0
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM
|
||||
Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
case 3: // regular 16-bit copy
|
||||
// _08000D3C
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].src += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_COPY16: // regular 16-bit copy
|
||||
Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
case 4: // repeat a single 16-bit value across RAM
|
||||
// _08000D88
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM
|
||||
Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
}
|
||||
|
||||
// Free the request
|
||||
gDma3Requests[gDma3RequestCursor].src = NULL;
|
||||
gDma3Requests[gDma3RequestCursor].dest = NULL;
|
||||
gDma3Requests[gDma3RequestCursor].size = 0;
|
||||
@@ -108,326 +87,10 @@ void ProcessDma3Requests(void)
|
||||
gDma3Requests[gDma3RequestCursor].value = 0;
|
||||
gDma3RequestCursor++;
|
||||
|
||||
if (gDma3RequestCursor >= 128) // loop back to the first DMA request
|
||||
if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request
|
||||
gDma3RequestCursor = 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
__attribute__((naked))
|
||||
void ProcessDma3Requests(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, 0xC\n\
|
||||
ldr r0, =gDma3ManagerLocked\n\
|
||||
ldrb r0, [r0]\n\
|
||||
cmp r0, 0\n\
|
||||
beq _08000C06\n\
|
||||
b _08000E46\n\
|
||||
_08000C06:\n\
|
||||
movs r0, 0\n\
|
||||
str r0, [sp, 0x8]\n\
|
||||
ldr r1, =gDma3Requests\n\
|
||||
ldr r2, =gDma3RequestCursor\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
ldrh r0, [r0, 0x8]\n\
|
||||
mov r12, r2\n\
|
||||
cmp r0, 0\n\
|
||||
bne _08000C1E\n\
|
||||
b _08000E46\n\
|
||||
_08000C1E:\n\
|
||||
mov r8, r1\n\
|
||||
adds r1, 0x4\n\
|
||||
mov r10, r1\n\
|
||||
movs r6, 0x80\n\
|
||||
lsls r6, 5\n\
|
||||
ldr r7, =0x040000D4 @REG_DMA3\n\
|
||||
movs r2, 0\n\
|
||||
mov r9, r2\n\
|
||||
_08000C2E:\n\
|
||||
mov r3, r12 @ gDma3RequestCursor\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r5, r0, 4\n\
|
||||
mov r0, r8 @ gDma3Requests\n\
|
||||
adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\
|
||||
ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\
|
||||
ldr r2, [sp, 0x8]\n\
|
||||
adds r0, r2, r0\n\
|
||||
lsls r0, 16\n\
|
||||
lsrs r0, 16\n\
|
||||
str r0, [sp, 0x8]\n\
|
||||
movs r0, 0xA0\n\
|
||||
lsls r0, 8\n\
|
||||
ldr r3, [sp, 0x8]\n\
|
||||
cmp r3, r0\n\
|
||||
bls _08000C50\n\
|
||||
b _08000E46\n\
|
||||
_08000C50:\n\
|
||||
ldr r0, =0x04000006 @REG_VCOUNT\n\
|
||||
ldrb r0, [r0]\n\
|
||||
cmp r0, 0xE0\n\
|
||||
bls _08000C5A\n\
|
||||
b _08000E46\n\
|
||||
_08000C5A:\n\
|
||||
ldrh r0, [r1, 0xA]\n\
|
||||
cmp r0, 0x2\n\
|
||||
beq _08000CD0\n\
|
||||
cmp r0, 0x2\n\
|
||||
bgt _08000C80\n\
|
||||
cmp r0, 0x1\n\
|
||||
beq _08000C8C\n\
|
||||
b _08000DF0\n\
|
||||
.pool\n\
|
||||
_08000C80:\n\
|
||||
cmp r0, 0x3\n\
|
||||
beq _08000D3C\n\
|
||||
cmp r0, 0x4\n\
|
||||
bne _08000C8A\n\
|
||||
b _08000D88\n\
|
||||
_08000C8A:\n\
|
||||
b _08000DF0\n\
|
||||
_08000C8C:\n\
|
||||
ldr r3, [r1]\n\
|
||||
mov r2, r10\n\
|
||||
adds r0, r5, r2\n\
|
||||
ldr r2, [r0]\n\
|
||||
ldrh r1, [r1, 0x8]\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CA6\n\
|
||||
str r3, [r7]\n\
|
||||
str r2, [r7, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x84\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DAA\n\
|
||||
_08000CA6:\n\
|
||||
ldr r4, =0x040000D4 @REG_DMA3\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
ldr r0, =0x84000400\n\
|
||||
str r0, [r4, 0x8]\n\
|
||||
ldr r0, [r4, 0x8]\n\
|
||||
adds r3, r6\n\
|
||||
adds r2, r6\n\
|
||||
subs r1, r6\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CA6\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x84\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000D76\n\
|
||||
.pool\n\
|
||||
_08000CD0:\n\
|
||||
mov r3, r10\n\
|
||||
adds r0, r5, r3\n\
|
||||
ldr r4, [r0]\n\
|
||||
ldrh r1, [r1, 0x8]\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CF4\n\
|
||||
mov r0, r8\n\
|
||||
adds r0, 0xC\n\
|
||||
adds r0, r5, r0\n\
|
||||
ldr r0, [r0]\n\
|
||||
str r0, [sp]\n\
|
||||
mov r5, sp\n\
|
||||
str r5, [r7]\n\
|
||||
str r4, [r7, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x85\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DAA\n\
|
||||
_08000CF4:\n\
|
||||
mov r2, r12\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
mov r5, r8\n\
|
||||
adds r5, 0xC\n\
|
||||
adds r0, r5\n\
|
||||
ldr r0, [r0]\n\
|
||||
str r0, [sp]\n\
|
||||
ldr r3, =0x040000D4 @REG_DMA3\n\
|
||||
mov r0, sp\n\
|
||||
str r0, [r3]\n\
|
||||
str r4, [r3, 0x4]\n\
|
||||
ldr r0, =0x85000400\n\
|
||||
str r0, [r3, 0x8]\n\
|
||||
ldr r0, [r3, 0x8]\n\
|
||||
adds r4, r6\n\
|
||||
subs r1, r6\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CF4\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r5\n\
|
||||
ldr r0, [r0]\n\
|
||||
str r0, [sp]\n\
|
||||
mov r2, sp\n\
|
||||
str r2, [r3]\n\
|
||||
str r4, [r3, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x85\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DEA\n\
|
||||
.pool\n\
|
||||
_08000D3C:\n\
|
||||
ldr r3, [r1]\n\
|
||||
mov r2, r10\n\
|
||||
adds r0, r5, r2\n\
|
||||
ldr r2, [r0]\n\
|
||||
ldrh r1, [r1, 0x8]\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000D56\n\
|
||||
str r3, [r7]\n\
|
||||
str r2, [r7, 0x4]\n\
|
||||
lsrs r0, r1, 1\n\
|
||||
movs r1, 0x80\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DAA\n\
|
||||
_08000D56:\n\
|
||||
ldr r4, =0x040000D4 @REG_DMA3\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
ldr r0, =0x80000800\n\
|
||||
str r0, [r4, 0x8]\n\
|
||||
ldr r0, [r4, 0x8]\n\
|
||||
adds r3, r6\n\
|
||||
adds r2, r6\n\
|
||||
subs r1, r6\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000D56\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
lsrs r0, r1, 1\n\
|
||||
movs r1, 0x80\n\
|
||||
lsls r1, 24\n\
|
||||
_08000D76:\n\
|
||||
orrs r0, r1\n\
|
||||
str r0, [r4, 0x8]\n\
|
||||
ldr r0, [r4, 0x8]\n\
|
||||
b _08000DF0\n\
|
||||
.pool\n\
|
||||
_08000D88:\n\
|
||||
mov r3, r10\n\
|
||||
adds r0, r5, r3\n\
|
||||
ldr r2, [r0]\n\
|
||||
ldrh r4, [r1, 0x8]\n\
|
||||
add r1, sp, 0x4\n\
|
||||
cmp r4, r6\n\
|
||||
bhi _08000DB2\n\
|
||||
mov r0, r8\n\
|
||||
adds r0, 0xC\n\
|
||||
adds r0, r5, r0\n\
|
||||
ldr r0, [r0]\n\
|
||||
strh r0, [r1]\n\
|
||||
str r1, [r7]\n\
|
||||
str r2, [r7, 0x4]\n\
|
||||
lsrs r0, r4, 1\n\
|
||||
movs r1, 0x81\n\
|
||||
lsls r1, 24\n\
|
||||
_08000DAA:\n\
|
||||
orrs r0, r1\n\
|
||||
str r0, [r7, 0x8]\n\
|
||||
ldr r0, [r7, 0x8]\n\
|
||||
b _08000DF0\n\
|
||||
_08000DB2:\n\
|
||||
mov r5, r12\n\
|
||||
ldrb r0, [r5]\n\
|
||||
lsls r0, 4\n\
|
||||
ldr r3, =gDma3Requests + 0x0C\n\
|
||||
adds r0, r3\n\
|
||||
ldr r0, [r0]\n\
|
||||
strh r0, [r1]\n\
|
||||
ldr r3, =0x040000D4 @REG_DMA3\n\
|
||||
str r1, [r3]\n\
|
||||
str r2, [r3, 0x4]\n\
|
||||
ldr r0, =0x81000800\n\
|
||||
str r0, [r3, 0x8]\n\
|
||||
ldr r0, [r3, 0x8]\n\
|
||||
adds r2, r6\n\
|
||||
subs r4, r6\n\
|
||||
cmp r4, r6\n\
|
||||
bhi _08000DB2\n\
|
||||
ldrb r0, [r5]\n\
|
||||
lsls r0, 4\n\
|
||||
ldr r5, =gDma3Requests + 0x0C\n\
|
||||
adds r0, r5\n\
|
||||
ldr r0, [r0]\n\
|
||||
strh r0, [r1]\n\
|
||||
str r1, [r3]\n\
|
||||
str r2, [r3, 0x4]\n\
|
||||
lsrs r0, r4, 1\n\
|
||||
movs r1, 0x81\n\
|
||||
lsls r1, 24\n\
|
||||
_08000DEA:\n\
|
||||
orrs r0, r1\n\
|
||||
str r0, [r3, 0x8]\n\
|
||||
ldr r0, [r3, 0x8]\n\
|
||||
_08000DF0:\n\
|
||||
ldr r1, =gDma3Requests\n\
|
||||
mov r3, r12\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
mov r2, r9\n\
|
||||
str r2, [r0]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
add r0, r10\n\
|
||||
str r2, [r0]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
movs r4, 0\n\
|
||||
strh r2, [r0, 0x8]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
mov r5, r9\n\
|
||||
strh r5, [r0, 0xA]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r1, 0xC\n\
|
||||
adds r0, r1\n\
|
||||
mov r1, r9\n\
|
||||
str r1, [r0]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
adds r0, 0x1\n\
|
||||
strb r0, [r3]\n\
|
||||
lsls r0, 24\n\
|
||||
cmp r0, 0\n\
|
||||
bge _08000E34\n\
|
||||
strb r4, [r3]\n\
|
||||
_08000E34:\n\
|
||||
mov r2, r12\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
ldr r3, =gDma3Requests\n\
|
||||
adds r0, r3\n\
|
||||
ldrh r0, [r0, 0x8]\n\
|
||||
cmp r0, 0\n\
|
||||
beq _08000E46\n\
|
||||
b _08000C2E\n\
|
||||
_08000E46:\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\
|
||||
.pool\n\
|
||||
.syntax divided");
|
||||
}
|
||||
#endif
|
||||
|
||||
s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
|
||||
{
|
||||
|
||||
+24
-90
@@ -250,12 +250,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
|
||||
AffineAnimCmd_frame,
|
||||
};
|
||||
|
||||
static const s32 gUnknown_082EC6F4[24] =
|
||||
static const s32 sUnknown_082EC6F4[3][4][2] =
|
||||
{
|
||||
8, 8, 0x10, 0x10, 0x20, 0x20,
|
||||
0x40, 0x40, 0x10, 8, 0x20, 8,
|
||||
0x20, 0x10, 0x40, 0x20, 8, 0x10,
|
||||
8, 0x20, 0x10, 0x20, 0x20, 0x40,
|
||||
{
|
||||
{8, 8},
|
||||
{0x10, 0x10},
|
||||
{0x20, 0x20},
|
||||
{0x40, 0x40},
|
||||
},
|
||||
{
|
||||
{0x10, 8},
|
||||
{0x20, 8},
|
||||
{0x20, 0x10},
|
||||
{0x40, 0x20},
|
||||
},
|
||||
{
|
||||
{8, 0x10},
|
||||
{8, 0x20},
|
||||
{0x10, 0x20},
|
||||
{0x20, 0x40},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct OamDimensions sOamDimensions[3][4] =
|
||||
@@ -1227,106 +1241,26 @@ s32 sub_800800C(s32 a0, s32 a1, s32 a2)
|
||||
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
|
||||
void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
|
||||
{
|
||||
s32 var0, var1, var2;
|
||||
u8 matrixNum = sprite->oam.matrixNum;
|
||||
|
||||
u32 matrixNum = sprite->oam.matrixNum;
|
||||
if (a1 != 0x800)
|
||||
{
|
||||
var0 = gUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32];
|
||||
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0];
|
||||
var1 = var0 << 8;
|
||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
|
||||
sprite->pos2.x = sub_800800C(var1, var2, a1);
|
||||
}
|
||||
if (a2 != 0x800)
|
||||
{
|
||||
var0 = gUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)];
|
||||
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1];
|
||||
var1 = var0 << 8;
|
||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
|
||||
sprite->pos2.y = sub_800800C(var1, var2, a2);
|
||||
}
|
||||
}
|
||||
#else
|
||||
__attribute__((naked))
|
||||
void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r9\n\
|
||||
mov r6, r8\n\
|
||||
push {r6,r7}\n\
|
||||
adds r5, r0, 0\n\
|
||||
adds r6, r1, 0\n\
|
||||
mov r8, r2\n\
|
||||
ldrb r1, [r5, 0x3]\n\
|
||||
lsls r0, r1, 26\n\
|
||||
lsrs r7, r0, 27\n\
|
||||
movs r0, 0x80\n\
|
||||
lsls r0, 4\n\
|
||||
mov r9, r0\n\
|
||||
cmp r6, r9\n\
|
||||
beq _08007EA2\n\
|
||||
ldr r2, =gUnknown_082EC6F4\n\
|
||||
lsrs r1, 6\n\
|
||||
lsls r1, 3\n\
|
||||
ldrb r0, [r5, 0x1]\n\
|
||||
lsrs r0, 6\n\
|
||||
lsls r0, 5\n\
|
||||
adds r1, r0\n\
|
||||
adds r1, r2\n\
|
||||
ldr r0, [r1]\n\
|
||||
lsls r4, r0, 8\n\
|
||||
lsls r0, 16\n\
|
||||
ldr r2, =gOamMatrices\n\
|
||||
lsls r1, r7, 3\n\
|
||||
adds r1, r2\n\
|
||||
movs r2, 0\n\
|
||||
ldrsh r1, [r1, r2]\n\
|
||||
bl __divsi3\n\
|
||||
adds r1, r0, 0\n\
|
||||
adds r0, r4, 0\n\
|
||||
adds r2, r6, 0\n\
|
||||
bl sub_800800C\n\
|
||||
strh r0, [r5, 0x24]\n\
|
||||
_08007EA2:\n\
|
||||
cmp r8, r9\n\
|
||||
beq _08007EDA\n\
|
||||
ldr r2, =gUnknown_082EC6F4\n\
|
||||
ldrb r1, [r5, 0x3]\n\
|
||||
lsrs r1, 6\n\
|
||||
lsls r1, 3\n\
|
||||
ldrb r0, [r5, 0x1]\n\
|
||||
lsrs r0, 6\n\
|
||||
lsls r0, 5\n\
|
||||
adds r1, r0\n\
|
||||
adds r2, 0x4\n\
|
||||
adds r1, r2\n\
|
||||
ldr r0, [r1]\n\
|
||||
lsls r4, r0, 8\n\
|
||||
lsls r0, 16\n\
|
||||
ldr r2, =gOamMatrices\n\
|
||||
lsls r1, r7, 3\n\
|
||||
adds r1, r2\n\
|
||||
movs r2, 0x6\n\
|
||||
ldrsh r1, [r1, r2]\n\
|
||||
bl __divsi3\n\
|
||||
adds r1, r0, 0\n\
|
||||
adds r0, r4, 0\n\
|
||||
mov r2, r8\n\
|
||||
bl sub_800800C\n\
|
||||
strh r0, [r5, 0x26]\n\
|
||||
_08007EDA:\n\
|
||||
pop {r3,r4}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.pool\n\
|
||||
.syntax divided");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip)
|
||||
{
|
||||
|
||||
+59
-681
@@ -378,696 +378,74 @@ void FillWindowPixelBuffer(u8 windowId, u8 fillValue)
|
||||
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
|
||||
}
|
||||
|
||||
// functionally equivalent, its fucking hard to match
|
||||
#ifdef NONMATCHING
|
||||
#define MOVE_TILES_DOWN(a) \
|
||||
{ \
|
||||
destOffset = i + (a); \
|
||||
srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
|
||||
if (srcOffset < size) \
|
||||
*(u32*)(tileData + destOffset) = *(u32*)(tileData + srcOffset); \
|
||||
else \
|
||||
*(u32*)(tileData + destOffset) = fillValue32; \
|
||||
distanceLoop++; \
|
||||
}
|
||||
|
||||
#define MOVE_TILES_UP(a) \
|
||||
{ \
|
||||
destOffset = i + (a); \
|
||||
srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
|
||||
if (srcOffset < size) \
|
||||
*(u32*)(tileData - destOffset) = *(u32*)(tileData - srcOffset); \
|
||||
else \
|
||||
*(u32*)(tileData - destOffset) = fillValue32; \
|
||||
distanceLoop++; \
|
||||
}
|
||||
|
||||
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||
{
|
||||
s32 i, id1, id2, size;
|
||||
u32 distanceLoop, toFill, width;
|
||||
u8 *tileData;
|
||||
struct WindowTemplate window;
|
||||
struct WindowTemplate window = gWindows[windowId].window;
|
||||
u8 *tileData = gWindows[windowId].tileData;
|
||||
u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue;
|
||||
s32 size = window.height * window.width * 32;
|
||||
u32 width = window.width;
|
||||
s32 i;
|
||||
s32 srcOffset, destOffset;
|
||||
u32 distanceLoop;
|
||||
|
||||
tileData = gWindows[windowId].tileData;
|
||||
toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue;
|
||||
window = gWindows[windowId].window;
|
||||
size = 0x20 * (window.height * window.width);
|
||||
width = window.width;
|
||||
if (direction != 1)
|
||||
switch (direction)
|
||||
{
|
||||
s32 signedDirection = direction;
|
||||
if (signedDirection <= 1)
|
||||
{
|
||||
if (signedDirection == 0)
|
||||
{
|
||||
for (i = 0; i < size; i += 0x20)
|
||||
{
|
||||
distanceLoop = distance;
|
||||
id1 = i + 0;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 4;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 8;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 12;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 16;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 20;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 24;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 28;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tileData += size - 4;
|
||||
for (i = 0; i < size; i += 0x20)
|
||||
case 0:
|
||||
for (i = 0; i < size; i += 32)
|
||||
{
|
||||
distanceLoop = distance;
|
||||
id1 = i + 0;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 4;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 8;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 12;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 16;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 20;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 24;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 28;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
MOVE_TILES_DOWN(0)
|
||||
MOVE_TILES_DOWN(4)
|
||||
MOVE_TILES_DOWN(8)
|
||||
MOVE_TILES_DOWN(12)
|
||||
MOVE_TILES_DOWN(16)
|
||||
MOVE_TILES_DOWN(20)
|
||||
MOVE_TILES_DOWN(24)
|
||||
MOVE_TILES_DOWN(28)
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
tileData += size - 4;
|
||||
for (i = 0; i < size; i += 32)
|
||||
{
|
||||
distanceLoop = distance;
|
||||
MOVE_TILES_UP(0)
|
||||
MOVE_TILES_UP(4)
|
||||
MOVE_TILES_UP(8)
|
||||
MOVE_TILES_UP(12)
|
||||
MOVE_TILES_UP(16)
|
||||
MOVE_TILES_UP(20)
|
||||
MOVE_TILES_UP(24)
|
||||
MOVE_TILES_UP(28)
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
__attribute__((naked))
|
||||
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||
{
|
||||
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, 0x8\n\
|
||||
lsls r0, 24\n\
|
||||
lsrs r0, 24\n\
|
||||
lsls r1, 24\n\
|
||||
lsrs r1, 24\n\
|
||||
mov r8, r1\n\
|
||||
lsls r2, 24\n\
|
||||
lsrs r2, 24\n\
|
||||
str r2, [sp]\n\
|
||||
lsls r3, 24\n\
|
||||
lsrs r3, 24\n\
|
||||
ldr r2, =gWindows\n\
|
||||
lsls r1, r0, 1\n\
|
||||
adds r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r4, r1, r2\n\
|
||||
adds r2, 0x8\n\
|
||||
adds r1, r2\n\
|
||||
ldr r5, [r1]\n\
|
||||
lsls r7, r3, 24\n\
|
||||
lsls r0, r3, 16\n\
|
||||
orrs r7, r0\n\
|
||||
lsls r0, r3, 8\n\
|
||||
orrs r7, r0\n\
|
||||
orrs r7, r3\n\
|
||||
ldr r1, [r4]\n\
|
||||
ldr r2, [r4, 0x4]\n\
|
||||
ldrb r3, [r4, 0x4]\n\
|
||||
lsrs r0, r1, 24\n\
|
||||
muls r0, r3\n\
|
||||
lsls r6, r0, 5\n\
|
||||
lsrs r1, 24\n\
|
||||
mov r12, r1\n\
|
||||
mov r0, r8\n\
|
||||
cmp r0, 0x1\n\
|
||||
bne _08003CE8\n\
|
||||
b _08003E9E\n\
|
||||
_08003CE8:\n\
|
||||
cmp r0, 0x1\n\
|
||||
ble _08003CEE\n\
|
||||
b _08004046\n\
|
||||
_08003CEE:\n\
|
||||
cmp r0, 0\n\
|
||||
beq _08003CF4\n\
|
||||
b _08004046\n\
|
||||
_08003CF4:\n\
|
||||
movs r4, 0\n\
|
||||
cmp r4, r6\n\
|
||||
blt _08003CFC\n\
|
||||
b _08004046\n\
|
||||
_08003CFC:\n\
|
||||
movs r1, 0x8\n\
|
||||
negs r1, r1\n\
|
||||
mov r9, r1\n\
|
||||
movs r2, 0x7\n\
|
||||
mov r8, r2\n\
|
||||
mov r10, r5\n\
|
||||
_08003D08:\n\
|
||||
ldr r3, [sp]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r2, r8\n\
|
||||
ands r0, r2\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003D34\n\
|
||||
adds r0, r5, r1\n\
|
||||
ldr r0, [r0]\n\
|
||||
mov r1, r10\n\
|
||||
str r0, [r1]\n\
|
||||
b _08003D38\n\
|
||||
.pool\n\
|
||||
_08003D34:\n\
|
||||
mov r2, r10\n\
|
||||
str r7, [r2]\n\
|
||||
_08003D38:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0x4\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003D64\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003D68\n\
|
||||
_08003D64:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003D68:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x8\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003D96\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003D9A\n\
|
||||
_08003D96:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003D9A:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0xC\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003DC8\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003DCC\n\
|
||||
_08003DC8:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003DCC:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x10\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003DFA\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003DFE\n\
|
||||
_08003DFA:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003DFE:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x14\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003E2C\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003E30\n\
|
||||
_08003E2C:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003E30:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x18\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003E5E\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003E62\n\
|
||||
_08003E5E:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003E62:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x1C\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r1, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r3, r1\n\
|
||||
orrs r0, r3\n\
|
||||
lsls r0, 2\n\
|
||||
adds r1, r4, r0\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003E8C\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003E90\n\
|
||||
_08003E8C:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003E90:\n\
|
||||
movs r2, 0x20\n\
|
||||
add r10, r2\n\
|
||||
adds r4, 0x20\n\
|
||||
cmp r4, r6\n\
|
||||
bge _08003E9C\n\
|
||||
b _08003D08\n\
|
||||
_08003E9C:\n\
|
||||
b _08004046\n\
|
||||
_08003E9E:\n\
|
||||
subs r0, r6, 0x4\n\
|
||||
adds r5, r0\n\
|
||||
movs r4, 0\n\
|
||||
cmp r4, r6\n\
|
||||
blt _08003EAA\n\
|
||||
b _08004046\n\
|
||||
_08003EAA:\n\
|
||||
movs r0, 0x8\n\
|
||||
negs r0, r0\n\
|
||||
mov r9, r0\n\
|
||||
movs r1, 0x7\n\
|
||||
mov r8, r1\n\
|
||||
mov r10, r5\n\
|
||||
_08003EB6:\n\
|
||||
ldr r3, [sp]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r2, r9\n\
|
||||
ands r0, r2\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r2, r8\n\
|
||||
ands r0, r2\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003EDC\n\
|
||||
subs r0, r5, r1\n\
|
||||
ldr r0, [r0]\n\
|
||||
mov r1, r10\n\
|
||||
str r0, [r1]\n\
|
||||
b _08003EE0\n\
|
||||
_08003EDC:\n\
|
||||
mov r2, r10\n\
|
||||
str r7, [r2]\n\
|
||||
_08003EE0:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0x4\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003F0C\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003F10\n\
|
||||
_08003F0C:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003F10:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x8\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003F3E\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003F42\n\
|
||||
_08003F3E:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003F42:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0xC\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003F70\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003F74\n\
|
||||
_08003F70:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003F74:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x10\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003FA2\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003FA6\n\
|
||||
_08003FA2:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003FA6:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x14\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003FD4\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003FD8\n\
|
||||
_08003FD4:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003FD8:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x18\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08004006\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _0800400A\n\
|
||||
_08004006:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_0800400A:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x1C\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r1, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r3, r1\n\
|
||||
orrs r0, r3\n\
|
||||
lsls r0, 2\n\
|
||||
adds r1, r4, r0\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08004034\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08004038\n\
|
||||
_08004034:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08004038:\n\
|
||||
movs r2, 0x20\n\
|
||||
negs r2, r2\n\
|
||||
add r10, r2\n\
|
||||
adds r4, 0x20\n\
|
||||
cmp r4, r6\n\
|
||||
bge _08004046\n\
|
||||
b _08003EB6\n\
|
||||
_08004046:\n\
|
||||
add sp, 0x8\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");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void CallWindowFunction(u8 windowId, WindowFunc func)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user