summaryrefslogtreecommitdiff
path: root/src/rom3.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rom3.c')
-rw-r--r--src/rom3.c906
1 files changed, 869 insertions, 37 deletions
diff --git a/src/rom3.c b/src/rom3.c
index af9a9f4dd..a5227d9d9 100644
--- a/src/rom3.c
+++ b/src/rom3.c
@@ -14,7 +14,10 @@ extern u8 unk_2000000[];
extern u16 gBattleTypeFlags;
extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
-extern u32 gBitTable[];
+extern const u32 gBitTable[];
+extern u16 gBattleWeather;
+extern const struct BattleMove gBattleMoves[];
+extern struct BattlePokemon gBattleMons[];
extern u8 gUnknown_020238C4;
extern u8 gUnknown_020238C5;
@@ -27,13 +30,24 @@ extern u32 gUnknown_02024A64;
extern u8 gUnknown_02024A68;
extern u16 gUnknown_02024A6A[];
extern u8 gUnknown_02024A72[];
+extern u16 gUnknown_02024BE6;
+extern u16 gUnknown_02024BE8;
+extern u16 gUnknown_02024C04;
+extern u8 byte_2024C06;
extern u8 gUnknown_02024C07;
extern u8 gUnknown_02024C08;
extern u8 gUnknown_02024C0A;
+extern u8 gUnknown_02024C0B;
extern u8 gUnknown_02024C0C;
+extern u8 gUnknown_02024C0E;
extern u8 gUnknown_02024C78;
+extern u8 gUnknown_02024D26;
extern u8 gUnknown_02024E60[];
extern u8 gUnknown_02024E64[];
+extern u8 gUnknown_03004040[];
+extern u8 gUnknown_030041C0[];
+extern u8 gUnknown_03004290[];
+extern u8 gUnknown_030042B0[];
extern void (*gUnknown_030042D4)(void);
extern void (*gUnknown_03004330[])(void);
@@ -60,6 +74,8 @@ extern void sub_800C1A8(u8);
extern void sub_800C47C(u8);
extern void sub_8007F4C(void);
extern u8 sub_8007ECC(void);
+extern void sub_80155A4();
+extern u8 sub_8018324();
void sub_800B858(void)
{
@@ -295,7 +311,7 @@ void sub_800BD54(void)
{
if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0
- && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0x19C
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0)
{
gUnknown_02024A6A[i] = j;
@@ -306,7 +322,7 @@ void sub_800BD54(void)
{
if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0
- && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0x19C
+ && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0)
{
gUnknown_02024A6A[i] = j;
@@ -319,8 +335,8 @@ void sub_800BD54(void)
if (!(gUnknown_02024A72[i] & 1))
{
if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
- && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Why is this one not SPECIES2 like the rest?
- && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0x19C
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0
&& gUnknown_02024A6A[i - 2] != j)
{
@@ -332,7 +348,7 @@ void sub_800BD54(void)
{
if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0
- && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0x19C
+ && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0
&& gUnknown_02024A6A[i - 2] != j)
{
@@ -524,12 +540,8 @@ void sub_800C35C(void)
}
}
-/*
-extern void sub_80155A4();
-
void sub_800C47C(u8 taskId)
{
- //s16 r3;
u16 r7;
u8 r4;
u8 r2;
@@ -542,35 +554,855 @@ void sub_800C47C(u8 taskId)
gTasks[taskId].data[12] = 0;
gTasks[taskId].data[15] = 0;
}
- //_0800C4B6
- //r3 = gTasks[taskId].data[15];
- asm(""::"r"(unk_2000000));
- r4 = EWRAM_15000[gTasks[taskId].data[15] + 1];
- r7 = EWRAM_15000[gTasks[taskId].data[15] + 4] | (EWRAM_15000[gTasks[taskId].data[15] + 5] << 8);
- switch (EWRAM_15000[gTasks[taskId].data[15]])
+ r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1];
+ r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8);
+ switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0])
{
- case 0:
- if (gUnknown_02024A64 & gBitTable[r4])
- return;
- memcpy(gUnknown_02023A60[r4], &EWRAM_15000[gTasks[taskId].data[15] + 8], r7);
- sub_80155A4(r4);
- if (!(gBattleTypeFlags & 4))
- {
- gUnknown_02024C07 = EWRAM_15000[gTasks[taskId].data[15] + 2];
- gUnknown_02024C08 = EWRAM_15000[gTasks[taskId].data[15] + 3];
- gUnknown_02024C0C = EWRAM_15000[gTasks[taskId].data[15] + 6];
- gUnknown_02024C0A = EWRAM_15000[gTasks[taskId].data[15] + 7];
- }
- break;
- case 1:
- memcpy(gUnknown_02024260[r4], &EWRAM_15000[gTasks[taskId].data[15] + 8], r7);
- break;
- case 2:
- r2 = EWRAM_15000[gTasks[taskId].data[15] + 8];
- gUnknown_02024A64 &= ~(gBitTable[r4] << (r2 * 4));
- break;
+ case 0:
+ if (gUnknown_02024A64 & gBitTable[r4])
+ return;
+ memcpy(gUnknown_02023A60[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7);
+ sub_80155A4(r4);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_WILD))
+ {
+ gUnknown_02024C07 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2];
+ gUnknown_02024C08 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3];
+ gUnknown_02024C0C = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6];
+ gUnknown_02024C0A = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7];
+ }
+ break;
+ case 1:
+ memcpy(gUnknown_02024260[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7);
+ break;
+ case 2:
+ r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8];
+ gUnknown_02024A64 &= ~(gBitTable[r4] << (r2 * 4));
+ break;
}
gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8;
}
}
-*/ \ No newline at end of file
+
+void dp01_build_cmdbuf_x00_a_b_0(u8 a, int b, int c)
+{
+ gUnknown_03004040[0] = 0;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x01_a_b_0(u8 a, int b, int c)
+{
+ gUnknown_03004040[0] = 1;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, int b, int c, u8 d, u8 *e)
+{
+ int i;
+
+ gUnknown_03004040[0] = 2;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ for (i = 0; i < d; i++)
+ gUnknown_03004040[3 + i] = *(e++);
+ dp01_prepare_buffer(a, gUnknown_03004040, d + 3);
+}
+
+void unref_sub_800C6A4(u8 a, int b, u8 c, u8 *d)
+{
+ int i;
+
+ gUnknown_03004040[0] = 3;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ for (i = 0; i < c; i++)
+ gUnknown_03004040[3 + i] = *(d++);
+ dp01_prepare_buffer(a, gUnknown_03004040, c + 3);
+}
+
+void dp01_build_cmdbuf_x04_4_4_4(u8 a)
+{
+ gUnknown_03004040[0] = 4;
+ gUnknown_03004040[1] = 4;
+ gUnknown_03004040[2] = 4;
+ gUnknown_03004040[3] = 4;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void sub_800C704(u8 a, int b, int c)
+{
+ gUnknown_03004040[0] = 5;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 5;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x06_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 6;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x07_7_7_7(u8 a)
+{
+ gUnknown_03004040[0] = 7;
+ gUnknown_03004040[1] = 7;
+ gUnknown_03004040[2] = 7;
+ gUnknown_03004040[3] = 7;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x08_8_8_8(u8 a)
+{
+ gUnknown_03004040[0] = 8;
+ gUnknown_03004040[1] = 8;
+ gUnknown_03004040[2] = 8;
+ gUnknown_03004040[3] = 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x09_9_9_9(u8 a)
+{
+ gUnknown_03004040[0] = 9;
+ gUnknown_03004040[1] = 9;
+ gUnknown_03004040[2] = 9;
+ gUnknown_03004040[3] = 9;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0A_A_A_A(u8 a)
+{
+ gUnknown_03004040[0] = 10;
+ gUnknown_03004040[1] = 10;
+ gUnknown_03004040[2] = 10;
+ gUnknown_03004040[3] = 10;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0B_B_B_B(u8 a)
+{
+ gUnknown_03004040[0] = 11;
+ gUnknown_03004040[1] = 11;
+ gUnknown_03004040[2] = 11;
+ gUnknown_03004040[3] = 11;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0C_C_C_C(u8 a)
+{
+ gUnknown_03004040[0] = 12;
+ gUnknown_03004040[1] = 12;
+ gUnknown_03004040[2] = 12;
+ gUnknown_03004040[3] = 12;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0D_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 13;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void unref_sub_800C828(u8 a, u8 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 14;
+ gUnknown_03004040[1] = b;
+ for (i = 0; i < b * 3; i++)
+ gUnknown_03004040[2 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b * 3 + 2);
+}
+
+void dp01_build_cmdbuf_x0F_aa_b_cc_dddd_e_mlc_weather_00_x1Cbytes(u8 a, u16 b, u8 c, u16 d, int e, u8 f, u8 *g)
+{
+ gUnknown_03004040[0] = 15;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = c;
+ gUnknown_03004040[4] = d;
+ gUnknown_03004040[5] = (d & 0xFF00) >> 8;
+ gUnknown_03004040[6] = e;
+ gUnknown_03004040[7] = (e & 0x0000FF00) >> 8;
+ gUnknown_03004040[8] = (e & 0x00FF0000) >> 16;
+ gUnknown_03004040[9] = (e & 0xFF000000) >> 24;
+ gUnknown_03004040[10] = f;
+ gUnknown_03004040[11] = gUnknown_02024C0E;
+ if (sub_8018324(14, 0, 13, 0, 0) == 0 && sub_8018324(14, 0, 0x4D, 0, 0) == 0)
+ {
+ gUnknown_03004040[12] = gBattleWeather;
+ gUnknown_03004040[13] = (gBattleWeather & 0xFF00) >> 8;
+ }
+ else
+ {
+ gUnknown_03004040[12] = 0;
+ gUnknown_03004040[13] = 0;
+ }
+ gUnknown_03004040[14] = 0;
+ gUnknown_03004040[15] = 0;
+ memcpy(gUnknown_03004040 + 16, g, 0x1C);
+ dp01_prepare_buffer(a, gUnknown_03004040, 0x2C);
+}
+
+#ifdef NONMATCHING
+void dp01_build_cmdbuf_x10_TODO(u8 a, u16 b)
+{
+ int i;
+ //u16 *r12;
+
+ gUnknown_03004040[0] = 16;
+ gUnknown_03004040[1] = gUnknown_02024D26;
+ gUnknown_03004040[2] = b;
+ gUnknown_03004040[3] = (b & 0xFF00) >> 8;
+
+ *((u16 *)&gUnknown_03004040[4]) = gUnknown_02024BE6;
+ *((u16 *)&gUnknown_03004040[6]) = gUnknown_02024BE8;
+ *((u16 *)&gUnknown_03004040[8]) = gUnknown_02024C04;
+
+ gUnknown_03004040[10] = byte_2024C06;
+ gUnknown_03004040[11] = unk_2000000[0x16000 + 3];
+ gUnknown_03004040[12] = unk_2000000[0x16000 + 0x5E];
+ gUnknown_03004040[13] = unk_2000000[0x16000 + 0xC1];
+ gUnknown_03004040[14] = gUnknown_02024C0B;
+ gUnknown_03004040[15] = gBattleMoves[gUnknown_02024BE6].type;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_03004040[16 + i] = gBattleMons[i].ability;
+ }
+ for (i = 0; i < 16; i++)
+ {
+ gUnknown_03004040[20 + i] = gUnknown_030041C0[i];
+ gUnknown_03004040[36 + i] = gUnknown_03004290[i];
+ gUnknown_03004040[52 + i] = gUnknown_030042B0[i];
+ }
+ dp01_prepare_buffer(a, gUnknown_03004040, 0x44);
+}
+#else
+__attribute__((naked))
+void dp01_build_cmdbuf_x10_TODO(u8 a, u16 b)
+{
+ 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\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ ldr r2, _0800CA2C @ =gUnknown_03004040\n\
+ movs r0, 0x10\n\
+ strb r0, [r2]\n\
+ ldr r0, _0800CA30 @ =gUnknown_02024D26\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x1]\n\
+ strb r1, [r2, 0x2]\n\
+ lsrs r1, 8\n\
+ strb r1, [r2, 0x3]\n\
+ adds r0, r2, 0x4\n\
+ mov r12, r0\n\
+ ldr r4, _0800CA34 @ =gUnknown_02024BE6\n\
+ ldrh r0, [r4]\n\
+ strh r0, [r2, 0x4]\n\
+ ldr r0, _0800CA38 @ =gUnknown_02024BE8\n\
+ ldrh r0, [r0]\n\
+ mov r1, r12\n\
+ strh r0, [r1, 0x2]\n\
+ ldr r0, _0800CA3C @ =gUnknown_02024C04\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1, 0x4]\n\
+ ldr r0, _0800CA40 @ =byte_2024C06\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0x6]\n\
+ ldr r1, _0800CA44 @ =0x02000000\n\
+ ldr r3, _0800CA48 @ =0x00016003\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0]\n\
+ mov r7, r12\n\
+ strb r0, [r7, 0x7]\n\
+ adds r3, 0x5B\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r7, 0x8]\n\
+ ldr r7, _0800CA4C @ =0x000160c1\n\
+ adds r1, r7\n\
+ ldrb r0, [r1]\n\
+ mov r1, r12\n\
+ strb r0, [r1, 0x9]\n\
+ ldr r0, _0800CA50 @ =gUnknown_02024C0B\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0xA]\n\
+ ldr r3, _0800CA54 @ =gBattleMoves\n\
+ ldrh r1, [r4]\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ ldrb r0, [r0, 0x2]\n\
+ mov r3, r12\n\
+ strb r0, [r3, 0xB]\n\
+ movs r3, 0\n\
+ mov r9, r2\n\
+ ldr r7, _0800CA58 @ =gUnknown_030042B0\n\
+ mov r8, r7\n\
+ adds r2, 0x10\n\
+ ldr r0, _0800CA5C @ =gBattleMons\n\
+ adds r4, r0, 0\n\
+ adds r4, 0x20\n\
+_0800C9D2:\n\
+ adds r1, r2, r3\n\
+ ldrb r0, [r4]\n\
+ strb r0, [r1]\n\
+ adds r4, 0x58\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x3\n\
+ ble _0800C9D2\n\
+ movs r3, 0\n\
+ mov r5, r12\n\
+ adds r5, 0x10\n\
+ mov r4, r12\n\
+ adds r4, 0x20\n\
+ ldr r6, _0800CA60 @ =gUnknown_03004290\n\
+ mov r2, r12\n\
+ adds r2, 0x30\n\
+_0800C9F0:\n\
+ adds r1, r5, r3\n\
+ ldr r7, _0800CA64 @ =gUnknown_030041C0\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r4, r3\n\
+ adds r0, r3, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r2, r3\n\
+ mov r7, r8\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r3, 0x1\n\
+ cmp r3, 0xF\n\
+ ble _0800C9F0\n\
+ mov r0, r10\n\
+ mov r1, r9\n\
+ movs r2, 0x44\n\
+ bl dp01_prepare_buffer\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\
+_0800CA2C: .4byte gUnknown_03004040\n\
+_0800CA30: .4byte gUnknown_02024D26\n\
+_0800CA34: .4byte gUnknown_02024BE6\n\
+_0800CA38: .4byte gUnknown_02024BE8\n\
+_0800CA3C: .4byte gUnknown_02024C04\n\
+_0800CA40: .4byte byte_2024C06\n\
+_0800CA44: .4byte 0x02000000\n\
+_0800CA48: .4byte 0x00016003\n\
+_0800CA4C: .4byte 0x000160c1\n\
+_0800CA50: .4byte gUnknown_02024C0B\n\
+_0800CA54: .4byte gBattleMoves\n\
+_0800CA58: .4byte gUnknown_030042B0\n\
+_0800CA5C: .4byte gBattleMons\n\
+_0800CA60: .4byte gUnknown_03004290\n\
+_0800CA64: .4byte gUnknown_030041C0\n\
+ .syntax divided\n");
+}
+#endif
+
+__attribute__((naked))
+void dp01_build_cmdbuf_x11_TODO()
+{
+ 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\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ ldr r2, _0800CB28 @ =gUnknown_03004040\n\
+ movs r0, 0x11\n\
+ strb r0, [r2]\n\
+ strb r0, [r2, 0x1]\n\
+ strb r1, [r2, 0x2]\n\
+ lsrs r1, 8\n\
+ strb r1, [r2, 0x3]\n\
+ adds r0, r2, 0x4\n\
+ mov r12, r0\n\
+ ldr r0, _0800CB2C @ =gUnknown_02024BE6\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r2, 0x4]\n\
+ ldr r0, _0800CB30 @ =gUnknown_02024BE8\n\
+ ldrh r0, [r0]\n\
+ mov r1, r12\n\
+ strh r0, [r1, 0x2]\n\
+ ldr r0, _0800CB34 @ =gUnknown_02024C04\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1, 0x4]\n\
+ ldr r0, _0800CB38 @ =byte_2024C06\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0x6]\n\
+ ldr r0, _0800CB3C @ =0x02000000\n\
+ ldr r3, _0800CB40 @ =0x00016003\n\
+ adds r1, r0, r3\n\
+ ldrb r1, [r1]\n\
+ mov r7, r12\n\
+ strb r1, [r7, 0x7]\n\
+ ldr r1, _0800CB44 @ =0x0001605e\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r7, 0x8]\n\
+ movs r3, 0\n\
+ mov r9, r2\n\
+ ldr r7, _0800CB48 @ =gUnknown_030042B0\n\
+ mov r8, r7\n\
+ mov r4, r9\n\
+ adds r4, 0x10\n\
+ ldr r0, _0800CB4C @ =gBattleMons\n\
+ adds r2, r0, 0\n\
+ adds r2, 0x20\n\
+_0800CACE:\n\
+ adds r1, r4, r3\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r1]\n\
+ adds r2, 0x58\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x3\n\
+ ble _0800CACE\n\
+ movs r3, 0\n\
+ mov r5, r12\n\
+ adds r5, 0x10\n\
+ mov r4, r12\n\
+ adds r4, 0x20\n\
+ ldr r6, _0800CB50 @ =gUnknown_03004290\n\
+ mov r2, r12\n\
+ adds r2, 0x30\n\
+_0800CAEC:\n\
+ adds r1, r5, r3\n\
+ ldr r7, _0800CB54 @ =gUnknown_030041C0\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r4, r3\n\
+ adds r0, r3, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r2, r3\n\
+ mov r7, r8\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r3, 0x1\n\
+ cmp r3, 0xF\n\
+ ble _0800CAEC\n\
+ mov r0, r10\n\
+ mov r1, r9\n\
+ movs r2, 0x44\n\
+ bl dp01_prepare_buffer\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\
+_0800CB28: .4byte gUnknown_03004040\n\
+_0800CB2C: .4byte gUnknown_02024BE6\n\
+_0800CB30: .4byte gUnknown_02024BE8\n\
+_0800CB34: .4byte gUnknown_02024C04\n\
+_0800CB38: .4byte byte_2024C06\n\
+_0800CB3C: .4byte 0x02000000\n\
+_0800CB40: .4byte 0x00016003\n\
+_0800CB44: .4byte 0x0001605e\n\
+_0800CB48: .4byte gUnknown_030042B0\n\
+_0800CB4C: .4byte gBattleMons\n\
+_0800CB50: .4byte gUnknown_03004290\n\
+_0800CB54: .4byte gUnknown_030041C0\n\
+ .syntax divided\n");
+}
+
+void dp01_build_cmdbuf_x12_a_bb(u8 a, int b, u16 c)
+{
+ gUnknown_03004040[0] = 18;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void unref_sub_800CB84(u8 a, int b)
+{
+ gUnknown_03004040[0] = 19;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void sub_800CBA4(u8 a, int b, int c, u8 *d)
+{
+ u32 i;
+
+ gUnknown_03004040[0] = 20;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 0;
+ for (i = 0; i < 20; i++)
+ gUnknown_03004040[4 + i] = d[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 24);
+}
+
+void sub_800CBE0(u8 a, u8 *b)
+{
+ int i;
+
+ gUnknown_03004040[0] = 21;
+ for (i = 0; i < 3; i++)
+ gUnknown_03004040[1 + i] = b[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x16_a_b_c_ptr_d_e_f(u8 a, int b, int c, int d, u8 *e)
+{
+ int i;
+
+ gUnknown_03004040[0] = 22;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = d;
+ for (i = 0; i < 3; i++)
+ gUnknown_03004040[4 + i] = e[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 8); //but only 7 bytes were written
+}
+
+void dp01_build_cmdbuf_x17_17_17_17(u8 a)
+{
+ gUnknown_03004040[0] = 23;
+ gUnknown_03004040[1] = 23;
+ gUnknown_03004040[2] = 23;
+ gUnknown_03004040[3] = 23;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x18_0_aa_health_bar_update(u8 a, s16 b)
+{
+ gUnknown_03004040[0] = 24;
+ gUnknown_03004040[1] = 0;
+ gUnknown_03004040[2] = b;
+ gUnknown_03004040[3] = (b & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x19_a_bb(u8 a, int b, s16 c)
+{
+ gUnknown_03004040[0] = 25;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x1A_aaaa_bbbb(u8 a, u32 b, u32 c)
+{
+ gUnknown_03004040[0] = 26;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0x0000FF00) >> 8;
+ gUnknown_03004040[3] = (b & 0x00FF0000) >> 16;
+ gUnknown_03004040[4] = (b & 0xFF000000) >> 24;
+ gUnknown_03004040[5] = c;
+ gUnknown_03004040[6] = (c & 0x0000FF00) >> 8;
+ gUnknown_03004040[7] = (c & 0x00FF0000) >> 16;
+ gUnknown_03004040[8] = (c & 0xFF000000) >> 24;
+ dp01_prepare_buffer(a, gUnknown_03004040, 9);
+}
+
+void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, int b, u32 c)
+{
+ gUnknown_03004040[0] = 27;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0x0000FF00) >> 8;
+ gUnknown_03004040[4] = (c & 0x00FF0000) >> 16;
+ gUnknown_03004040[5] = (c & 0xFF000000) >> 24;
+ dp01_prepare_buffer(a, gUnknown_03004040, 6);
+}
+
+void dp01_build_cmdbuf_x1C_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 28;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x1D_1D_numargs_varargs(u8 a, u16 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 29;
+ gUnknown_03004040[1] = 29;
+ gUnknown_03004040[2] = b;
+ gUnknown_03004040[3] = (b & 0xFF00) >> 8;
+ for (i = 0; i < b; i++)
+ gUnknown_03004040[4 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b + 4);
+}
+
+void unref_sub_800CDD4(u8 a, u32 b, u16 c, u8 *d)
+{
+ int i;
+
+ gUnknown_03004040[0] = 30;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0x0000FF00) >> 8;
+ gUnknown_03004040[3] = (b & 0x00FF0000) >> 16;
+ gUnknown_03004040[4] = (b & 0xFF000000) >> 24;
+ gUnknown_03004040[5] = c;
+ gUnknown_03004040[6] = (c & 0xFF00) >> 8;
+ for (i = 0; i < c; i++)
+ gUnknown_03004040[7 + i] = *(d++);
+ dp01_prepare_buffer(a, gUnknown_03004040, c + 7);
+}
+
+void unref_sub_800CE3C(u8 a, u16 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 31;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ for (i = 0; i < b; i++)
+ gUnknown_03004040[3 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b + 3);
+}
+
+void unref_sub_800CE84(u8 a, u16 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 32;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ for (i = 0; i < b; i++)
+ gUnknown_03004040[3 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b + 3);
+}
+
+void dp01_build_cmdbuf_x21_a_bb(u8 a, int b, u16 c)
+{
+ gUnknown_03004040[0] = 33;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, int b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 34;
+ gUnknown_03004040[1] = b;
+ for (i = 0; i < 3; i++)
+ gUnknown_03004040[2 + i] = c[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 5);
+}
+
+void dp01_build_cmdbuf_x23_aa_0(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 35;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x24_aa_0(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 36;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x25_25_25_25(u8 a)
+{
+ gUnknown_03004040[0] = 37;
+ gUnknown_03004040[1] = 37;
+ gUnknown_03004040[2] = 37;
+ gUnknown_03004040[3] = 37;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x26_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 38;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x27_27_27_27(u8 a)
+{
+ gUnknown_03004040[0] = 39;
+ gUnknown_03004040[1] = 39;
+ gUnknown_03004040[2] = 39;
+ gUnknown_03004040[3] = 39;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x28_28_28_28(u8 a)
+{
+ gUnknown_03004040[0] = 40;
+ gUnknown_03004040[1] = 40;
+ gUnknown_03004040[2] = 40;
+ gUnknown_03004040[3] = 40;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x29_29_29_29(u8 a)
+{
+ gUnknown_03004040[0] = 41;
+ gUnknown_03004040[1] = 41;
+ gUnknown_03004040[2] = 41;
+ gUnknown_03004040[3] = 41;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2A_2A_2A_2A(u8 a)
+{
+ gUnknown_03004040[0] = 42;
+ gUnknown_03004040[1] = 42;
+ gUnknown_03004040[2] = 42;
+ gUnknown_03004040[3] = 42;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2B_aa_0(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 43;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void sub_800D074(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 44;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2D_2D_2D_2D(u8 a)
+{
+ gUnknown_03004040[0] = 45;
+ gUnknown_03004040[1] = 45;
+ gUnknown_03004040[2] = 45;
+ gUnknown_03004040[3] = 45;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2E_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 46;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x2F_2F_2F_2F(u8 a)
+{
+ gUnknown_03004040[0] = 47;
+ gUnknown_03004040[1] = 47;
+ gUnknown_03004040[2] = 47;
+ gUnknown_03004040[3] = 47;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x30_TODO(u8 a, u8 *b, u8 c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 48;
+ gUnknown_03004040[1] = c & 0x7F;
+ gUnknown_03004040[2] = (c & 0x80) >> 7;
+ gUnknown_03004040[3] = 48;
+ for (i = 0; i < 48; i++)
+ gUnknown_03004040[4 + i] = b[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 52);
+}
+
+void dp01_build_cmdbuf_x31_31_31_31(u8 a)
+{
+ gUnknown_03004040[0] = 49;
+ gUnknown_03004040[1] = 49;
+ gUnknown_03004040[2] = 49;
+ gUnknown_03004040[3] = 49;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x32_32_32_32(u8 a)
+{
+ gUnknown_03004040[0] = 50;
+ gUnknown_03004040[1] = 50;
+ gUnknown_03004040[2] = 50;
+ gUnknown_03004040[3] = 50;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x33_a_33_33(u8 a, int b)
+{
+ gUnknown_03004040[0] = 51;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = 51;
+ gUnknown_03004040[3] = 51;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, int b, u16 c)
+{
+ gUnknown_03004040[0] = 52;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void sub_800D1D8(u8 a, int b)
+{
+ gUnknown_03004040[0] = 53;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x38_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 54;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x37_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 55;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}