matched several functions from pokeem

This commit is contained in:
jiangzhengwenjz
2019-06-25 14:27:57 +08:00
parent 56dabd4626
commit 1182626739
6 changed files with 198 additions and 1505 deletions
+32 -296
View File
@@ -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)
{
+4 -67
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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)
{