summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2017-01-18 23:43:25 -0600
committerYamaArashi <YamaArashi@users.noreply.github.com>2017-01-18 21:43:25 -0800
commit5fae4fddf5c41eba64c96cbd5e7c132f5b6d400f (patch)
tree4471805a0b1d1720e8b10f03ffeddee5580d045f /src
parent56f432fca2d552d8f0cda1a7fbab8aeb7d926fa2 (diff)
decompile more of rom3 (#199)
* start decompiling rom3 * newline * decompile sub_800BA78 * decompile more of rom3 * battle type constants * decompile sub_800C35C * remove sh.exe.stackdump
Diffstat (limited to 'src')
-rw-r--r--src/rom3.c333
1 files changed, 326 insertions, 7 deletions
diff --git a/src/rom3.c b/src/rom3.c
index 9bd2674c5..af9a9f4dd 100644
--- a/src/rom3.c
+++ b/src/rom3.c
@@ -7,13 +7,30 @@
#include "species.h"
#include "task.h"
+extern u8 unk_2000000[];
+
+#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000))
+#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000))
+
extern u16 gBattleTypeFlags;
+extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
+extern u32 gBitTable[];
+extern u8 gUnknown_020238C4;
+extern u8 gUnknown_020238C5;
+extern u8 gUnknown_020238C6;
extern u32 gUnknown_020239FC;
+extern u8 gUnknown_02023A60[][0x200];
+extern u8 gUnknown_02024260[][0x200];
+extern u8 gUnknown_02024A60;
extern u32 gUnknown_02024A64;
extern u8 gUnknown_02024A68;
extern u16 gUnknown_02024A6A[];
extern u8 gUnknown_02024A72[];
+extern u8 gUnknown_02024C07;
+extern u8 gUnknown_02024C08;
+extern u8 gUnknown_02024C0A;
+extern u8 gUnknown_02024C0C;
extern u8 gUnknown_02024C78;
extern u8 gUnknown_02024E60[];
extern u8 gUnknown_02024E64[];
@@ -38,10 +55,15 @@ extern void sub_802BF74(void);
extern void sub_8032AE0(void);
extern void sub_8037510(void);
extern void sub_811DA78(void);
+extern void dp01_prepare_buffer_wireless_probably(u8 a, u16, u8 *c);
+extern void sub_800C1A8(u8);
+extern void sub_800C47C(u8);
+extern void sub_8007F4C(void);
+extern u8 sub_8007ECC(void);
void sub_800B858(void)
{
- if (gBattleTypeFlags & 2)
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
OpenLink();
CreateTask(sub_8083C50, 0);
@@ -66,7 +88,7 @@ void setup_poochyena_battle(void)
battle_anim_clear_some_data();
sub_8040710();
BattleAI_HandleItemUseBeforeAISetup();
- if (gBattleTypeFlags & 0x10)
+ if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
{
ZeroEnemyPartyMons();
CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0);
@@ -81,12 +103,12 @@ void sub_800B950(void)
{
s32 i;
- if (gBattleTypeFlags & 2)
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
sub_800BA78();
else
sub_800B9A8();
sub_800BD54();
- if (!(gBattleTypeFlags & 0x40))
+ if (!(gBattleTypeFlags & BATTLE_TYPE_40))
{
for (i = 0; i < gUnknown_02024A68; i++)
sub_8094978(i, 0);
@@ -95,12 +117,12 @@ void sub_800B950(void)
void sub_800B9A8(void)
{
- if (!(gBattleTypeFlags & 1))
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
gUnknown_030042D4 = sub_8010800;
- if (gBattleTypeFlags & 0x80)
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
gUnknown_03004330[0] = sub_812B468;
- else if (gBattleTypeFlags & 0x200)
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
gUnknown_03004330[0] = sub_8137224;
else
gUnknown_03004330[0] = sub_802BF74;
@@ -255,3 +277,300 @@ void sub_800BA78(void)
}
gUnknown_02024A68 = 4;
}
+
+void sub_800BD54(void)
+{
+ int i;
+ int j;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_40))
+ {
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ for (j = 0; j < 6; j++)
+ {
+ if (i < 2)
+ {
+ if (!(gUnknown_02024A72[i] & 1))
+ {
+ 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_IS_EGG) == 0)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ else
+ {
+ 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_IS_EGG) == 0)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ }
+ else
+ {
+ 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_IS_EGG) == 0
+ && gUnknown_02024A6A[i - 2] != j)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ else
+ {
+ 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_IS_EGG) == 0
+ && gUnknown_02024A6A[i - 2] != j)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void dp01_prepare_buffer(u8 a, u8 *b, u16 c)
+{
+ int i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ dp01_prepare_buffer_wireless_probably(a, c, b);
+ }
+ else
+ {
+ switch (a)
+ {
+ case 0:
+ for (i = 0; i < c; i++)
+ {
+ gUnknown_02023A60[gUnknown_02024A60][i] = *b;
+ b++;
+ }
+ break;
+ case 1:
+ for (i = 0; i < c; i++)
+ {
+ gUnknown_02024260[gUnknown_02024A60][i] = *b;
+ b++;
+ }
+ break;
+ }
+ }
+}
+
+void sub_800BF28(void)
+{
+ gUnknown_020238C4 = CreateTask(sub_800C1A8, 0);
+ gTasks[gUnknown_020238C4].data[11] = 0;
+ gTasks[gUnknown_020238C4].data[12] = 0;
+ gTasks[gUnknown_020238C4].data[13] = 0;
+ gTasks[gUnknown_020238C4].data[14] = 0;
+ gTasks[gUnknown_020238C4].data[15] = 0;
+ gUnknown_020238C5 = CreateTask(sub_800C47C, 0);
+ gTasks[gUnknown_020238C5].data[12] = 0;
+ gTasks[gUnknown_020238C5].data[13] = 0;
+ gTasks[gUnknown_020238C5].data[14] = 0;
+ gTasks[gUnknown_020238C5].data[15] = 0;
+ gUnknown_020238C6 = 0;
+ CpuFill16(0, EWRAM_14000, 0x2000);
+}
+
+void dp01_prepare_buffer_wireless_probably(u8 a, u16 b, u8 *c)
+{
+ s32 r9;
+ int i;
+
+ r9 = b - b % 4 + 4;
+ if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000)
+ {
+ gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14];
+ gTasks[gUnknown_020238C4].data[14] = 0;
+ }
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gUnknown_02024A60;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gUnknown_02024C07;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gUnknown_02024C08;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gUnknown_02024C0C;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gUnknown_02024C0A;
+ for (i = 0; i < b; i++)
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = c[i];
+ gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8;
+}
+
+void sub_800C1A8(u8 taskId)
+{
+ u16 var;
+
+ switch (gTasks[taskId].data[11])
+ {
+ case 0:
+ gTasks[taskId].data[10] = 100;
+ gTasks[taskId].data[11]++;
+ break;
+ case 1:
+ gTasks[taskId].data[10]--;
+ if (gTasks[taskId].data[10] == 0)
+ gTasks[taskId].data[11]++;
+ break;
+ case 2:
+ GetLinkPlayerCount_2();
+ if (IsLinkMaster())
+ {
+ sub_8007F4C();
+ gTasks[taskId].data[11]++;
+ break;
+ }
+ gTasks[taskId].data[11]++;
+ break;
+ case 3:
+ if (gTasks[taskId].data[15] != gTasks[taskId].data[14])
+ {
+ if (gTasks[taskId].data[13] == 0)
+ {
+ if (gTasks[taskId].data[15] > gTasks[taskId].data[14]
+ && gTasks[taskId].data[15] == gTasks[taskId].data[12])
+ {
+ gTasks[taskId].data[12] = 0;
+ gTasks[taskId].data[15] = 0;
+ }
+ var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8;
+ SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var);
+ gTasks[taskId].data[11]++;
+ }
+ else
+ {
+ gTasks[taskId].data[13]--;
+ break;
+ }
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8);
+ gTasks[taskId].data[13] = 1;
+ gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8;
+ gTasks[taskId].data[11] = 3;
+ }
+ break;
+ case 5:
+ gTasks[taskId].data[13]--;
+ if (gTasks[taskId].data[13] == 0)
+ {
+ gTasks[taskId].data[13] = 1;
+ gTasks[taskId].data[11] = 3;
+ }
+ break;
+ }
+}
+
+//fix me
+void sub_800C35C(void)
+{
+ u8 i; //r4
+ s32 j; //r2
+ u16 r6; //r6
+ u8 *recvBuffer; //r3
+ u8 *dest; //r5
+ u8 *src; //r4
+
+ if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211)
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (GetBlockReceivedStatus() & gBitTable[i])
+ {
+ ResetBlockReceivedFlag(i);
+ recvBuffer = (u8 *)&gBlockRecvBuffer[i];
+#ifndef NONMATCHING
+ asm("");
+ recvBuffer = (u8 *)&gBlockRecvBuffer[i];
+#endif
+ r6 = gBlockRecvBuffer[i][2];
+ if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000)
+ {
+ gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14];
+ gTasks[gUnknown_020238C5].data[14] = 0;
+ }
+ //_0800C402
+ dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14];
+ src = recvBuffer;
+ for (j = 0; j < r6 + 8; j++)
+ dest[j] = src[j];
+ gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8;
+ }
+ //_0800C446
+ }
+ }
+}
+
+/*
+extern void sub_80155A4();
+
+void sub_800C47C(u8 taskId)
+{
+ //s16 r3;
+ u16 r7;
+ u8 r4;
+ u8 r2;
+
+ if (gTasks[taskId].data[15] != gTasks[taskId].data[14])
+ {
+ if (gTasks[taskId].data[15] > gTasks[taskId].data[14]
+ && gTasks[taskId].data[15] == gTasks[taskId].data[12])
+ {
+ 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]])
+ {
+ 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;
+ }
+ gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8;
+ }
+}
+*/ \ No newline at end of file