matched several functions from pokeem
This commit is contained in:
@@ -3,6 +3,51 @@
|
|||||||
|
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
|
// Maximum amount of data we will transfer in one operation
|
||||||
|
#define MAX_DMA_BLOCK_SIZE 0x1000
|
||||||
|
|
||||||
|
#define Dma3CopyLarge_(src, dest, size, bit) \
|
||||||
|
{ \
|
||||||
|
const void *_src = src; \
|
||||||
|
void *_dest = dest; \
|
||||||
|
u32 _size = size; \
|
||||||
|
while (1) \
|
||||||
|
{ \
|
||||||
|
if (_size <= MAX_DMA_BLOCK_SIZE) \
|
||||||
|
{ \
|
||||||
|
DmaCopy##bit(3, _src, _dest, _size); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
|
||||||
|
_src += MAX_DMA_BLOCK_SIZE; \
|
||||||
|
_dest += MAX_DMA_BLOCK_SIZE; \
|
||||||
|
_size -= MAX_DMA_BLOCK_SIZE; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
|
||||||
|
#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
|
||||||
|
|
||||||
|
#define Dma3FillLarge_(value, dest, size, bit) \
|
||||||
|
{ \
|
||||||
|
void *_dest = dest; \
|
||||||
|
u32 _size = size; \
|
||||||
|
while (1) \
|
||||||
|
{ \
|
||||||
|
if (_size <= MAX_DMA_BLOCK_SIZE) \
|
||||||
|
{ \
|
||||||
|
DmaFill##bit(3, value, _dest, _size); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
|
||||||
|
_dest += MAX_DMA_BLOCK_SIZE; \
|
||||||
|
_size -= MAX_DMA_BLOCK_SIZE; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
|
||||||
|
#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
|
||||||
|
|
||||||
void ClearDma3Requests(void);
|
void ClearDma3Requests(void);
|
||||||
void ProcessDma3Requests(void);
|
void ProcessDma3Requests(void);
|
||||||
s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode);
|
s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode);
|
||||||
|
|||||||
+32
-296
@@ -6,6 +6,7 @@
|
|||||||
#include "constants/abilities.h"
|
#include "constants/abilities.h"
|
||||||
#include "constants/battle_ai.h"
|
#include "constants/battle_ai.h"
|
||||||
#include "constants/battle_move_effects.h"
|
#include "constants/battle_move_effects.h"
|
||||||
|
#include "constants/moves.h"
|
||||||
|
|
||||||
extern u16 Random(void);
|
extern u16 Random(void);
|
||||||
extern void sub_80C7164(void);
|
extern void sub_80C7164(void);
|
||||||
@@ -230,10 +231,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
|
|||||||
BattleAICmd_if_not_taunted, // 0x5D
|
BattleAICmd_if_not_taunted, // 0x5D
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef NONMATCHING
|
static const u16 sDiscouragedPowerfulMoveEffects[] =
|
||||||
static
|
|
||||||
#endif
|
|
||||||
const u16 sDiscouragedPowerfulMoveEffects[] =
|
|
||||||
{
|
{
|
||||||
EFFECT_EXPLOSION,
|
EFFECT_EXPLOSION,
|
||||||
EFFECT_DREAM_EATER,
|
EFFECT_DREAM_EATER,
|
||||||
@@ -970,331 +968,69 @@ static void BattleAICmd_get_move_power(void)
|
|||||||
gAIScriptPtr += 1;
|
gAIScriptPtr += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// still a nonmatching
|
|
||||||
#ifdef NONMATCHING
|
|
||||||
static void BattleAICmd_is_most_powerful_move(void)
|
static void BattleAICmd_is_most_powerful_move(void)
|
||||||
{
|
{
|
||||||
int i, j;
|
s32 i, checkedMove;
|
||||||
s32 damages[MAX_MON_MOVES];
|
s32 moveDmgs[4];
|
||||||
|
|
||||||
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
|
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
|
||||||
|
{
|
||||||
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
|
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
|
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
|
||||||
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
|
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
|
||||||
{
|
{
|
||||||
gDynamicBasePower = 0;
|
gDynamicBasePower = 0;
|
||||||
eDynamicMoveType = 0;
|
*(&gBattleStruct->dynamicMoveType) = 0;
|
||||||
eDmgMultiplier = 1;
|
gBattleScripting.dmgMultiplier = 1;
|
||||||
gMoveResultFlags = 0;
|
gMoveResultFlags = 0;
|
||||||
gCritMultiplier = 1;
|
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++)
|
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
|
||||||
{ // _08108276
|
{
|
||||||
if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j])
|
if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// _081082BA
|
if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
|
||||||
if (gBattleMons[gBankAttacker].moves[i]
|
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
|
||||||
&& sDiscouragedPowerfulMoveEffects[j] == 0xFFFF
|
&& gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
|
||||||
&& gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1)
|
|
||||||
{
|
{
|
||||||
gCurrentMove = gBattleMons[gBankAttacker].moves[i];
|
gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
|
||||||
AI_CalcDmg(gBankAttacker, gBankTarget);
|
AI_CalcDmg(sBattler_AI, gBattlerTarget);
|
||||||
TypeCalc(gCurrentMove, gBankAttacker, gBankTarget);
|
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
|
||||||
damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100;
|
moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
|
||||||
|
if (moveDmgs[checkedMove] == 0)
|
||||||
if (damages[i] == 0) // moves always do at least 1 damage.
|
moveDmgs[checkedMove] = 1;
|
||||||
damages[i] = 1;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
damages[i] = 0;
|
moveDmgs[checkedMove] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
|
||||||
if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex])
|
{
|
||||||
|
if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (i == MAX_MON_MOVES)
|
if (checkedMove == MAX_MON_MOVES)
|
||||||
AI_THINKING_STRUCT->funcResult = 2;
|
AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.
|
||||||
else
|
else
|
||||||
AI_THINKING_STRUCT->funcResult = 1;
|
AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
|
||||||
}
|
}
|
||||||
else
|
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)
|
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;
|
return (u8)cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr
|
|
||||||
bool8 IsDma3ManagerBusyWithBgCopy(void)
|
bool8 IsDma3ManagerBusyWithBgCopy(void)
|
||||||
{
|
{
|
||||||
u8 mod;
|
|
||||||
u8 div;
|
|
||||||
s8 reqSpace;
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 0x80; i++)
|
for (i = 0; i < 0x80; i++)
|
||||||
{
|
{
|
||||||
div = i / 0x20;
|
u8 div = i / 0x20;
|
||||||
mod = 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)
|
if (reqSpace == -1)
|
||||||
{
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
|
||||||
|
|
||||||
sDmaBusyBitfield[div] &= ~(1 << mod);
|
sDmaBusyBitfield[div] &= ~(1 << mod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
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)
|
void ShowBg(u8 bg)
|
||||||
{
|
{
|
||||||
|
|||||||
+34
-371
@@ -1,6 +1,13 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "dma3.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 {
|
static /*IWRAM_DATA*/ struct {
|
||||||
/* 0x00 */ const u8 *src;
|
/* 0x00 */ const u8 *src;
|
||||||
/* 0x04 */ u8 *dest;
|
/* 0x04 */ u8 *dest;
|
||||||
@@ -29,78 +36,50 @@ void ClearDma3Requests(void)
|
|||||||
gDma3ManagerLocked = FALSE;
|
gDma3ManagerLocked = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NONMATCHING
|
|
||||||
void ProcessDma3Requests(void)
|
void ProcessDma3Requests(void)
|
||||||
{
|
{
|
||||||
// NOTE: the fillerA member of the DMA struct is actually u32 value;
|
u16 bytesTransferred;
|
||||||
u16 total_size;
|
|
||||||
|
|
||||||
if (gDma3ManagerLocked)
|
if (gDma3ManagerLocked)
|
||||||
return;
|
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
|
// 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)
|
if (bytesTransferred > 40 * 1024)
|
||||||
return; // don't do too much at once
|
return; // don't transfer more than 40 KiB
|
||||||
|
if (*(u8 *)REG_ADDR_VCOUNT > 224)
|
||||||
if (REG_VCOUNT > 224)
|
return; // we're about to leave vblank, stop
|
||||||
return;// we're about to leave vblank, stop
|
|
||||||
|
|
||||||
switch (gDma3Requests[gDma3RequestCursor].mode)
|
switch (gDma3Requests[gDma3RequestCursor].mode)
|
||||||
{
|
{
|
||||||
case 1: // regular 32-bit copy
|
case DMA_REQUEST_COPY32: // regular 32-bit copy
|
||||||
// _08000C8C
|
Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,
|
||||||
if(gDma3Requests[gDma3RequestCursor].size <= 0x1000)
|
gDma3Requests[gDma3RequestCursor].dest,
|
||||||
{
|
gDma3Requests[gDma3RequestCursor].size);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
case 2: // repeat a single 32-bit value across RAM
|
case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM
|
||||||
// _08000CD0
|
Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,
|
||||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
gDma3Requests[gDma3RequestCursor].dest,
|
||||||
{
|
gDma3Requests[gDma3RequestCursor].size);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
case 3: // regular 16-bit copy
|
case DMA_REQUEST_COPY16: // regular 16-bit copy
|
||||||
// _08000D3C
|
Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,
|
||||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
gDma3Requests[gDma3RequestCursor].dest,
|
||||||
{
|
gDma3Requests[gDma3RequestCursor].size);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
case 4: // repeat a single 16-bit value across RAM
|
case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM
|
||||||
// _08000D88
|
Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,
|
||||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
gDma3Requests[gDma3RequestCursor].dest,
|
||||||
{
|
gDma3Requests[gDma3RequestCursor].size);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Free the request
|
||||||
gDma3Requests[gDma3RequestCursor].src = NULL;
|
gDma3Requests[gDma3RequestCursor].src = NULL;
|
||||||
gDma3Requests[gDma3RequestCursor].dest = NULL;
|
gDma3Requests[gDma3RequestCursor].dest = NULL;
|
||||||
gDma3Requests[gDma3RequestCursor].size = 0;
|
gDma3Requests[gDma3RequestCursor].size = 0;
|
||||||
@@ -108,326 +87,10 @@ void ProcessDma3Requests(void)
|
|||||||
gDma3Requests[gDma3RequestCursor].value = 0;
|
gDma3Requests[gDma3RequestCursor].value = 0;
|
||||||
gDma3RequestCursor++;
|
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;
|
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)
|
s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
|
||||||
{
|
{
|
||||||
|
|||||||
+24
-90
@@ -250,12 +250,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
|
|||||||
AffineAnimCmd_frame,
|
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,
|
{8, 8},
|
||||||
0x20, 0x10, 0x40, 0x20, 8, 0x10,
|
{0x10, 0x10},
|
||||||
8, 0x20, 0x10, 0x20, 0x20, 0x40,
|
{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] =
|
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);
|
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;
|
s32 var0, var1, var2;
|
||||||
u8 matrixNum = sprite->oam.matrixNum;
|
|
||||||
|
u32 matrixNum = sprite->oam.matrixNum;
|
||||||
if (a1 != 0x800)
|
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;
|
var1 = var0 << 8;
|
||||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
|
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
|
||||||
sprite->pos2.x = sub_800800C(var1, var2, a1);
|
sprite->pos2.x = sub_800800C(var1, var2, a1);
|
||||||
}
|
}
|
||||||
if (a2 != 0x800)
|
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;
|
var1 = var0 << 8;
|
||||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
|
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
|
||||||
sprite->pos2.y = sub_800800C(var1, var2, a2);
|
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)
|
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);
|
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// functionally equivalent, its fucking hard to match
|
#define MOVE_TILES_DOWN(a) \
|
||||||
#ifdef NONMATCHING
|
{ \
|
||||||
|
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)
|
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||||
{
|
{
|
||||||
s32 i, id1, id2, size;
|
struct WindowTemplate window = gWindows[windowId].window;
|
||||||
u32 distanceLoop, toFill, width;
|
u8 *tileData = gWindows[windowId].tileData;
|
||||||
u8 *tileData;
|
u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue;
|
||||||
struct WindowTemplate window;
|
s32 size = window.height * window.width * 32;
|
||||||
|
u32 width = window.width;
|
||||||
|
s32 i;
|
||||||
|
s32 srcOffset, destOffset;
|
||||||
|
u32 distanceLoop;
|
||||||
|
|
||||||
tileData = gWindows[windowId].tileData;
|
switch (direction)
|
||||||
toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue;
|
|
||||||
window = gWindows[windowId].window;
|
|
||||||
size = 0x20 * (window.height * window.width);
|
|
||||||
width = window.width;
|
|
||||||
if (direction != 1)
|
|
||||||
{
|
{
|
||||||
s32 signedDirection = direction;
|
case 0:
|
||||||
if (signedDirection <= 1)
|
for (i = 0; i < size; i += 32)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
distanceLoop = distance;
|
distanceLoop = distance;
|
||||||
id1 = i + 0;
|
MOVE_TILES_DOWN(0)
|
||||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
MOVE_TILES_DOWN(4)
|
||||||
if (id2 < size)
|
MOVE_TILES_DOWN(8)
|
||||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
MOVE_TILES_DOWN(12)
|
||||||
else
|
MOVE_TILES_DOWN(16)
|
||||||
*(u32*)(tileData - id1) = toFill;
|
MOVE_TILES_DOWN(20)
|
||||||
|
MOVE_TILES_DOWN(24)
|
||||||
distanceLoop++;
|
MOVE_TILES_DOWN(28)
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
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)
|
void CallWindowFunction(u8 windowId, WindowFunc func)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user