summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-10-03 15:56:18 -0500
committerGitHub <noreply@github.com>2018-10-03 15:56:18 -0500
commitf2f28382c4ad2b283d485f70b28d14317d58c997 (patch)
tree62b8924efe80a34e979ee6103bf68430eee89542
parent1120a5dd432365f79b7cdb9b7ad9972a6d2a8432 (diff)
parent56ff2850550f1bd642218d2c5b99e3e8a7bd21f3 (diff)
Merge pull request #694 from luckytyphlosion/master
Match a few NONMATCHINGs, document some NONMATCHINGs.
-rw-r--r--.gitignore1
-rwxr-xr-xasmdiff.sh2
-rw-r--r--src/battle/anim/shadow_minimize.c2
-rw-r--r--src/contest_painting.c111
-rw-r--r--src/daycare.c4
-rw-r--r--src/field_specials.c212
-rw-r--r--src/party_menu.c302
-rw-r--r--src/pokedex_cry_screen.c5
-rw-r--r--src/pokemon_summary_screen.c49
-rw-r--r--src/trade.c444
-rw-r--r--src/unk_text_8095904.c3
11 files changed, 230 insertions, 905 deletions
diff --git a/.gitignore b/.gitignore
index 67a81bb9f..760b36628 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,4 @@ build/
*.pl
.vs/
.projects/ARM/
+*.diff
diff --git a/asmdiff.sh b/asmdiff.sh
index a4b465b6e..4654b2101 100755
--- a/asmdiff.sh
+++ b/asmdiff.sh
@@ -4,4 +4,4 @@ OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb
OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))"
$OBJDUMP $OPTIONS baserom.gba > baserom.dump
$OBJDUMP $OPTIONS pokeruby.gba > pokeruby.dump
-diff baserom.dump pokeruby.dump
+diff -u baserom.dump pokeruby.dump | less
diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c
index be033ae6d..1a04fd58a 100644
--- a/src/battle/anim/shadow_minimize.c
+++ b/src/battle/anim/shadow_minimize.c
@@ -114,7 +114,9 @@ void sub_80D0614(struct Task* task, u8 taskId)
gSprites[r8].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
gSprites[r8].affineAnimPaused = TRUE;
r6 &= 0x1f;
+
gSprites[r8].oam.matrixNum = r6; // need to inhibit optimizing out the mov r0, 0x3f / neg r0, r0
+ // current code does subs r0, #94 (0x1f - 94 = 0xc1, !0x3f = 0xc1)
gSprites[r8].subpriority = task->data[7] - task->data[3];
task->data[3]++;
task->data[6]++;
diff --git a/src/contest_painting.c b/src/contest_painting.c
index 03840215b..d61632a8e 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -328,20 +328,19 @@ static void VBlankCB_ContestPainting(void)
TransferPlttBuffer();
}
-#ifdef NONMATCHING
static void sub_8106AC4(u16 species, u8 arg1)
{
- void *pal;
+ const void *pal;
pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->otId, gUnknown_03005E8C->personality);
LZDecompressVram(pal, gUnknown_03005E90);
- if (arg1 == 1)
+ if (arg1 == 0)
{
HandleLoadSpecialPokePic(
&gMonFrontPicTable[species],
- gMonFrontPicCoords[species].x,
- gMonFrontPicCoords[species].y,
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
0x2000000,
gUnknown_081FAF4C[1],
species,
@@ -353,8 +352,8 @@ static void sub_8106AC4(u16 species, u8 arg1)
{
HandleLoadSpecialPokePic(
&gMonBackPicTable[species],
- gMonBackPicCoords[species].x,
- gMonBackPicCoords[species].y,
+ gMonBackPicCoords[species].coords,
+ gMonBackPicCoords[species].y_offset,
0x2000000,
gUnknown_081FAF4C[0],
species,
@@ -363,104 +362,6 @@ static void sub_8106AC4(u16 species, u8 arg1)
sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10);
}
}
-#else
-NAKED
-static void sub_8106AC4(u16 arg0, u8 arg2)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, 0xC\n\
- adds r4, r1, 0\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- ldr r7, _08106B28 @ =gUnknown_03005E8C\n\
- ldr r0, [r7]\n\
- ldr r1, [r0, 0x4]\n\
- ldr r2, [r0]\n\
- adds r0, r6, 0\n\
- bl GetMonSpritePalFromOtIdPersonality\n\
- ldr r1, _08106B2C @ =gUnknown_03005E90\n\
- mov r8, r1\n\
- ldr r1, [r1]\n\
- bl LZDecompressVram\n\
- cmp r4, 0\n\
- bne _08106B40\n\
- lsls r0, r6, 3\n\
- ldr r1, _08106B30 @ =gMonFrontPicTable\n\
- adds r0, r1\n\
- ldr r1, _08106B34 @ =gMonFrontPicCoords\n\
- lsls r2, r6, 2\n\
- adds r2, r1\n\
- ldrb r1, [r2]\n\
- ldrb r2, [r2, 0x1]\n\
- movs r3, 0x80\n\
- lsls r3, 18\n\
- ldr r4, _08106B38 @ =gUnknown_081FAF4C\n\
- ldr r5, [r4, 0x4]\n\
- str r5, [sp]\n\
- str r6, [sp, 0x4]\n\
- ldr r4, [r7]\n\
- ldr r4, [r4]\n\
- str r4, [sp, 0x8]\n\
- bl HandleLoadSpecialPokePic\n\
- mov r2, r8\n\
- ldr r1, [r2]\n\
- ldr r0, _08106B3C @ =gUnknown_03005E10\n\
- ldr r2, [r0]\n\
- adds r0, r5, 0\n\
- bl sub_8106B90\n\
- b _08106B74\n\
- .align 2, 0\n\
-_08106B28: .4byte gUnknown_03005E8C\n\
-_08106B2C: .4byte gUnknown_03005E90\n\
-_08106B30: .4byte gMonFrontPicTable\n\
-_08106B34: .4byte gMonFrontPicCoords\n\
-_08106B38: .4byte gUnknown_081FAF4C\n\
-_08106B3C: .4byte gUnknown_03005E10\n\
-_08106B40:\n\
- lsls r0, r6, 3\n\
- ldr r1, _08106B80 @ =gMonBackPicTable\n\
- adds r0, r1\n\
- ldr r1, _08106B84 @ =gMonBackPicCoords\n\
- lsls r2, r6, 2\n\
- adds r2, r1\n\
- ldrb r1, [r2]\n\
- ldrb r2, [r2, 0x1]\n\
- movs r3, 0x80\n\
- lsls r3, 18\n\
- ldr r4, _08106B88 @ =gUnknown_081FAF4C\n\
- ldr r5, [r4]\n\
- str r5, [sp]\n\
- str r6, [sp, 0x4]\n\
- ldr r4, [r7]\n\
- ldr r4, [r4]\n\
- str r4, [sp, 0x8]\n\
- bl HandleLoadSpecialPokePic\n\
- mov r0, r8\n\
- ldr r1, [r0]\n\
- ldr r0, _08106B8C @ =gUnknown_03005E10\n\
- ldr r2, [r0]\n\
- adds r0, r5, 0\n\
- bl sub_8106B90\n\
-_08106B74:\n\
- add sp, 0xC\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08106B80: .4byte gMonBackPicTable\n\
-_08106B84: .4byte gMonBackPicCoords\n\
-_08106B88: .4byte gUnknown_081FAF4C\n\
-_08106B8C: .4byte gUnknown_03005E10\n\
- .syntax divided\n");
-}
-#endif
#ifdef NONMATCHING
void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8])
diff --git a/src/daycare.c b/src/daycare.c
index 795c42a96..6dade2f20 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -506,7 +506,7 @@ void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxP
{
u16 numSharedParentMoves;
u32 numLevelUpMoves;
- u16 numEggMoves;
+ u32 numEggMoves;
u16 i, j;
numSharedParentMoves = 0;
@@ -534,7 +534,7 @@ void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxP
{
if (gHatchedEggFatherMoves[i] != MOVE_NONE)
{
- for (j = 0; j < (u32)numEggMoves; j++)
+ for (j = 0; j < numEggMoves; j++)
{
if (gHatchedEggFatherMoves[i] == gHatchedEggEggMoves[j])
{
diff --git a/src/field_specials.c b/src/field_specials.c
index 043945a2f..f9ae911c8 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1142,8 +1142,9 @@ void sub_810E984(u8 taskId)
}
}
-// This function, as written, swaps the roles of r4 and r5 throughout.
-#ifdef NONMATCHING
+/* Removing the NONMATCHING block will swap the roles of r4 and r5 throughout.
+Could possibly be fixed by writing code which increases the amount of references to newPos,
+or decreasing the amount of references to i.*/
bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput)
{
u8 i;
@@ -1176,116 +1177,15 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput)
for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++)
{
Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1);
+#ifndef NONMATCHING
+ asm(""::"r"(newPos));
+ asm(""::"r"(newPos));
+ asm(""::"r"(newPos));
+#endif
}
}
return flag;
}
-#else
-NAKED
-bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r8\n"
- "\tpush {r7}\n"
- "\tlsls r0, 24\n"
- "\tlsrs r2, r0, 24\n"
- "\tadds r5, r2, 0\n"
- "\tlsls r1, 24\n"
- "\tlsrs r1, 24\n"
- "\tadds r3, r1, 0\n"
- "\tmovs r7, 0\n"
- "\tmovs r4, 0\n"
- "\tldr r0, _0810EAEC @ =gUnknown_0203925A\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x4\n"
- "\tbhi _0810EAF0\n"
- "\tmovs r0, 0\n"
- "\tb _0810EB78\n"
- "\t.align 2, 0\n"
- "_0810EAEC: .4byte gUnknown_0203925A\n"
- "_0810EAF0:\n"
- "\tcmp r1, 0x40\n"
- "\tbne _0810EB04\n"
- "\tcmp r2, 0\n"
- "\tbne _0810EB18\n"
- "\tldr r0, _0810EB00 @ =gUnknown_0203925B\n"
- "\tldrb r4, [r0]\n"
- "\tmovs r7, 0x1\n"
- "\tb _0810EB1C\n"
- "\t.align 2, 0\n"
- "_0810EB00: .4byte gUnknown_0203925B\n"
- "_0810EB04:\n"
- "\tcmp r3, 0x80\n"
- "\tbne _0810EB18\n"
- "\tcmp r5, 0x4\n"
- "\tbne _0810EB18\n"
- "\tldr r0, _0810EB84 @ =gUnknown_0203925B\n"
- "\tldrb r0, [r0]\n"
- "\tsubs r0, 0x4\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tmovs r7, 0x1\n"
- "_0810EB18:\n"
- "\tcmp r7, 0\n"
- "\tbeq _0810EB76\n"
- "_0810EB1C:\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x5\n"
- "\tbl sub_810EB90\n"
- "\tmovs r0, 0x2\n"
- "\tmovs r1, 0x1\n"
- "\tmovs r2, 0x7\n"
- "\tmovs r3, 0xA\n"
- "\tbl Menu_BlankWindowRect\n"
- "\tmovs r5, 0\n"
- "\tldr r2, _0810EB88 @ =gUnknown_03000760\n"
- "\tlsls r1, r4, 2\n"
- "\tadds r0, r1, r2\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x10\n"
- "\tbeq _0810EB76\n"
- "\tldr r0, _0810EB8C @ =gUnknown_083F8380\n"
- "\tmov r8, r0\n"
- "\tadds r6, r2, 0\n"
- "_0810EB44:\n"
- "\tadds r0, r1, r6\n"
- "\tldrb r0, [r0]\n"
- "\tlsls r0, 2\n"
- "\tadd r0, r8\n"
- "\tldr r0, [r0]\n"
- "\tlsls r2, r5, 1\n"
- "\tadds r2, 0x1\n"
- "\tlsls r2, 24\n"
- "\tlsrs r2, 24\n"
- "\tmovs r1, 0x1\n"
- "\tbl Menu_PrintText\n"
- "\tadds r0, r4, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tadds r0, r5, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r5, r0, 24\n"
- "\tcmp r5, 0x4\n"
- "\tbhi _0810EB76\n"
- "\tlsls r1, r4, 2\n"
- "\tadds r0, r1, r6\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x10\n"
- "\tbne _0810EB44\n"
- "_0810EB76:\n"
- "\tadds r0, r7, 0\n"
- "_0810EB78:\n"
- "\tpop {r3}\n"
- "\tmov r8, r3\n"
- "\tpop {r4-r7}\n"
- "\tpop {r1}\n"
- "\tbx r1\n"
- "\t.align 2, 0\n"
- "_0810EB84: .4byte gUnknown_0203925B\n"
- "_0810EB88: .4byte gUnknown_03000760\n"
- "_0810EB8C: .4byte gUnknown_083F8380");
-}
-#endif
void sub_810EB90(u8 newPos, u8 maxItems)
{
@@ -1600,8 +1500,9 @@ void sub_810F118(u8 taskId)
}
}
-// Second verse, same as the first
-#ifdef NONMATCHING
+/* Removing the NONMATCHING block will swap the roles of r4 and r5 throughout.
+Could possibly be fixed by writing code which increases the amount of references to newPos,
+or decreasing the amount of references to i.*/
bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput)
{
u8 i;
@@ -1634,96 +1535,15 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput)
for (i=0; i<5; newPos++, i++)
{
Menu_PrintText(gUnknown_083F83C0[newPos], 1, 2 * i + 1);
+#ifndef NONMATCHING
+ asm(""::"r"(newPos));
+ asm(""::"r"(newPos));
+ asm(""::"r"(newPos));
+#endif
}
}
return flag;
}
-#else
-NAKED
-bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tlsls r0, 24\n"
- "\tlsrs r2, r0, 24\n"
- "\tadds r5, r2, 0\n"
- "\tlsls r1, 24\n"
- "\tlsrs r1, 24\n"
- "\tadds r3, r1, 0\n"
- "\tmovs r6, 0\n"
- "\tmovs r4, 0\n"
- "\tldr r0, _0810F214 @ =gUnknown_0203925A\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x4\n"
- "\tbhi _0810F218\n"
- "\tmovs r0, 0\n"
- "\tb _0810F282\n"
- "\t.align 2, 0\n"
- "_0810F214: .4byte gUnknown_0203925A\n"
- "_0810F218:\n"
- "\tcmp r1, 0x40\n"
- "\tbne _0810F22C\n"
- "\tcmp r2, 0\n"
- "\tbne _0810F240\n"
- "\tldr r0, _0810F228 @ =gUnknown_0203925B\n"
- "\tldrb r4, [r0]\n"
- "\tmovs r6, 0x1\n"
- "\tb _0810F244\n"
- "\t.align 2, 0\n"
- "_0810F228: .4byte gUnknown_0203925B\n"
- "_0810F22C:\n"
- "\tcmp r3, 0x80\n"
- "\tbne _0810F240\n"
- "\tcmp r5, 0x4\n"
- "\tbne _0810F240\n"
- "\tldr r0, _0810F288 @ =gUnknown_0203925B\n"
- "\tldrb r0, [r0]\n"
- "\tsubs r0, 0x4\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tmovs r6, 0x1\n"
- "_0810F240:\n"
- "\tcmp r6, 0\n"
- "\tbeq _0810F280\n"
- "_0810F244:\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x5\n"
- "\tbl GlassWorkshopUpdateScrollIndicators\n"
- "\tmovs r0, 0x2\n"
- "\tmovs r1, 0x1\n"
- "\tmovs r2, 0x9\n"
- "\tmovs r3, 0xA\n"
- "\tbl Menu_BlankWindowRect\n"
- "\tmovs r5, 0\n"
- "\tldr r7, _0810F28C @ =gUnknown_083F83C0\n"
- "_0810F25C:\n"
- "\tlsls r0, r4, 2\n"
- "\tadds r0, r7\n"
- "\tldr r0, [r0]\n"
- "\tlsls r2, r5, 1\n"
- "\tadds r2, 0x1\n"
- "\tlsls r2, 24\n"
- "\tlsrs r2, 24\n"
- "\tmovs r1, 0x1\n"
- "\tbl Menu_PrintText\n"
- "\tadds r0, r4, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tadds r0, r5, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r5, r0, 24\n"
- "\tcmp r5, 0x4\n"
- "\tbls _0810F25C\n"
- "_0810F280:\n"
- "\tadds r0, r6, 0\n"
- "_0810F282:\n"
- "\tpop {r4-r7}\n"
- "\tpop {r1}\n"
- "\tbx r1\n"
- "\t.align 2, 0\n"
- "_0810F288: .4byte gUnknown_0203925B\n"
- "_0810F28C: .4byte gUnknown_083F83C0");
-}
-#endif
void sub_810F290(void)
{
diff --git a/src/party_menu.c b/src/party_menu.c
index 52c637879..2cb6a3960 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -84,14 +84,14 @@ static void sub_806B9A4(s16 a, u16 b, u8 c);
static void sub_806CA18(u8 taskId, u8 b);
static void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed);
static void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed);
-static void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed);
+void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed);
static void UpdateMonIconFrame_806DA0C(struct Sprite *sprite);
static void UpdateMonIconFrame_806DA38(struct Sprite *sprite);
static void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c);
static u8 sub_806CA00(u8 taskId);
static void SpriteCB_sub_806D37C(struct Sprite *sprite);
static u8 GetMonIconSpriteId(u8 taskId, u8 monIndex);
-static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite);
+void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite);
static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId);
static void ItemUseMoveMenu_HandleCancel(u8 taskId);
static bool8 SetupDefaultPartyMenu(void);
@@ -102,6 +102,8 @@ static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d);
static void sub_806BB9C(u8 a);
static void sub_806BBEC(u8 a);
+extern u16 Random();
+
EWRAM_DATA u8 gUnknown_0202E8F4 = 0;
EWRAM_DATA u8 gUnknown_0202E8F5 = 0;
EWRAM_DATA u8 gUnknown_0202E8F6 = 0;
@@ -475,7 +477,6 @@ extern u16 gMoveToLearn;
extern u16 gUnknown_08E9A300[];
extern struct Coords8 const gUnknown_08376738[12][6];
-extern const u8 gUnknown_083769C0[];
extern u8 gUnknown_02039460[];
extern struct Window gUnknown_03004210;
@@ -987,6 +988,7 @@ bool8 DrawPartyMonBackground(u8 monIndex)
return FALSE;
}
+// many expressions swapped, hard to follow asm diff
#ifdef NONMATCHING
void sub_806B908(void)
{
@@ -1274,6 +1276,7 @@ u8 sub_806BD58(u8 taskId, u8 b)
return 1;
}
+// non-shifting, some expressions swapped around
#ifdef NONMATCHING
u16 HandleDefaultPartyMenuInput(u8 taskId)
{
@@ -1721,6 +1724,7 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio
}
}
+// too many registers allocated, the function takes 0x4c more bytes
#ifdef NONMATCHING
void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed)
{
@@ -1731,81 +1735,81 @@ void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 dire
menuMovement = directionPressed + 2;
switch (menuMovement)
{
- case 2: // no movement
- gSprites[spriteId].data[1] = 0;
- break;
- case 3: // moving down
- if (menuIndex == 7) {
- gSprites[spriteId].data[0] = 0;
- } else {
- while (menuIndex != PARTY_SIZE - 1) {
- menuIndex++;
- if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES))
+ case 2: // no movement
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 3: // moving down
+ if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = 0;
+ } else {
+ while (menuIndex != PARTY_SIZE - 1) {
+ menuIndex++;
+ if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES))
+ {
+ gSprites[spriteId].data[0] = menuIndex;
+ gSprites[spriteId].data[1] = 0;
+ return;
+ }
+ }
+
+ gSprites[spriteId].data[0] = 7;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 1: // moving up
+ while (menuIndex != 0) {
+ menuIndex--;
+ if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES))
{
gSprites[spriteId].data[0] = menuIndex;
gSprites[spriteId].data[1] = 0;
return;
}
}
-
+
gSprites[spriteId].data[0] = 7;
- }
-
- gSprites[spriteId].data[1] = 0;
- break;
- case 1: // moving up
- while (menuIndex != 0) {
- menuIndex--;
- if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES))
- {
- gSprites[spriteId].data[0] = menuIndex;
- gSprites[spriteId].data[1] = 0;
- return;
- }
- }
-
- gSprites[spriteId].data[0] = 7;
- gSprites[spriteId].data[1] = 0;
- break;
- case 4: // moving right
- if (menuIndex == 0) {
- var1 = gSprites[spriteId].data[1] - 2;
- if (var1 > 1) {
- if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) {
- gSprites[spriteId].data[0] = 2;
- } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) {
- gSprites[spriteId].data[0] = 3;
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 4: // moving right
+ if (menuIndex == 0) {
+ var1 = gSprites[spriteId].data[1] - 2;
+ if (var1 > 1) {
+ if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 2;
+ } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 3;
+ }
+ } else {
+ gSprites[spriteId].data[0] = 1;
}
- } else {
- gSprites[spriteId].data[0] = 1;
- }
- } else if (menuIndex == 1) {
- var1 = gSprites[spriteId].data[1] - 4;
- if (var1 <= 1) {
- gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
- } else {
- if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) {
- gSprites[spriteId].data[0] = 4;
- } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) {
- gSprites[spriteId].data[0] = 5;
+ } else if (menuIndex == 1) {
+ var1 = gSprites[spriteId].data[1] - 4;
+ if (var1 <= 1) {
+ gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
+ } else {
+ if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 4;
+ } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 5;
+ }
}
}
- }
- break;
- case 0: // moving left
- var2 = menuIndex - 2;
- if (var2 <= 1) {
- gSprites[spriteId].data[0] = 0;
- gSprites[spriteId].data[1] = menuIndex;
- } else {
- var2 = menuIndex - 4;
+ break;
+ case 0: // moving left
+ var2 = menuIndex - 2;
if (var2 <= 1) {
- gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[0] = 0;
gSprites[spriteId].data[1] = menuIndex;
+ } else {
+ var2 = menuIndex - 4;
+ if (var2 <= 1) {
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[1] = menuIndex;
+ }
}
- }
-
- break;
+
+ break;
}
}
@@ -2396,6 +2400,7 @@ void SwapValues_s16(s16 *a, s16 *b)
*b = temp;
}
+// not really sure, but creates +4
#ifdef NONMATCHING
void sub_806CF04(void)
{
@@ -2955,6 +2960,7 @@ void CreateHeldItemIcons_806DC34(u8 taskId)
}
}
+// too many registers allocated
#ifdef NONMATCHING
void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item)
{
@@ -2962,7 +2968,7 @@ void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item)
u8 heldItemSpriteId;
monIconSpriteId = GetMonIconSpriteId(taskId, monIndex);
- heldItemSpriteId = CreateSprite(gSpriteTemplate_837660C, 0xFA, 0xAA, 4);
+ heldItemSpriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, 4);
gSprites[heldItemSpriteId].pos2.x = 4;
gSprites[heldItemSpriteId].pos2.y = 10;
@@ -3142,12 +3148,12 @@ u16 GetMonHeldItemIconSpriteId(u8 taskId, u8 monIndex)
return retVal;
}
-#ifdef NONMATCHING
+// #ifdef NONMATCHING (for grep)
void SetHeldItemIconVisibility(u8 taskId, u8 monIndex)
{
u8 spriteId;
u16 heldItem;
-
+
spriteId = GetMonHeldItemIconSpriteId(taskId, monIndex);
if (!GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM))
{
@@ -3155,107 +3161,27 @@ void SetHeldItemIconVisibility(u8 taskId, u8 monIndex)
}
else
{
- struct Sprite *sprite;
-
+ register struct Sprite *sprite asm("r4");
+// sprite2 is required to mimic a failed optimization where r0 would have been loaded at the end of the if statement
+ register struct Sprite *sprite2 asm("r0");
+ u8 animNum;
heldItem = GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM);
- sprite = &gSprites[spriteId];
if (ItemIsMail(heldItem))
{
- StartSpriteAnim(sprite, 1);
+ sprite = &gSprites[spriteId];
+ sprite2 = sprite; // hack
+ animNum = 1;
}
else
{
- StartSpriteAnim(sprite, 0);
+ sprite = &gSprites[spriteId];
+ sprite2 = sprite; // hack
+ animNum = 0;
}
-
+ StartSpriteAnim(sprite2, animNum);
sprite->invisible = 0;
}
}
-#else
-NAKED
-void SetHeldItemIconVisibility(u8 a, u8 monIndex)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- adds r4, r1, 0\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- adds r1, r4, 0\n\
- bl GetMonHeldItemIconSpriteId\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- adds r6, r5, 0\n\
- movs r0, 0x64\n\
- adds r1, r4, 0\n\
- muls r1, r0\n\
- ldr r0, _0806DFA4 @ =gPlayerParty\n\
- adds r4, r1, r0\n\
- adds r0, r4, 0\n\
- movs r1, 0xC\n\
- bl GetMonData\n\
- cmp r0, 0\n\
- bne _0806DFAC\n\
- ldr r1, _0806DFA8 @ =gSprites\n\
- lsls r0, r5, 4\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- adds r0, 0x3E\n\
- ldrb r1, [r0]\n\
- movs r2, 0x4\n\
- orrs r1, r2\n\
- strb r1, [r0]\n\
- b _0806DFF6\n\
- .align 2, 0\n\
-_0806DFA4: .4byte gPlayerParty\n\
-_0806DFA8: .4byte gSprites\n\
-_0806DFAC:\n\
- adds r0, r4, 0\n\
- movs r1, 0xC\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- bl ItemIsMail\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0806DFD8\n\
- lsls r4, r5, 4\n\
- adds r4, r5\n\
- lsls r4, 2\n\
- ldr r0, _0806DFD4 @ =gSprites\n\
- adds r4, r0\n\
- adds r0, r4, 0\n\
- movs r1, 0x1\n\
- b _0806DFE6\n\
- .align 2, 0\n\
-_0806DFD4: .4byte gSprites\n\
-_0806DFD8:\n\
- lsls r4, r6, 4\n\
- adds r4, r6\n\
- lsls r4, 2\n\
- ldr r0, _0806DFFC @ =gSprites\n\
- adds r4, r0\n\
- adds r0, r4, 0\n\
- movs r1, 0\n\
-_0806DFE6:\n\
- bl StartSpriteAnim\n\
- adds r4, 0x3E\n\
- ldrb r1, [r4]\n\
- movs r0, 0x5\n\
- negs r0, r0\n\
- ands r0, r1\n\
- strb r0, [r4]\n\
-_0806DFF6:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0806DFFC: .4byte gSprites\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer)
{
@@ -4994,12 +4920,19 @@ void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c)
}
}
-#ifdef NONMATCHING
u8 GetItemEffectType(u16 item)
{
const u8 *itemEffect;
+#ifndef NONMATCHING
register u8 itemEffect0 asm("r1");
+ register u8 itemEffect3 asm("r3");
+ register u32 itemEffect0_r0 asm("r0"); // u32 to prevent shifting when transferring itemEffect0 to this
u8 mask;
+#else
+#define itemEffect0 itemEffect[0]
+#define itemEffect3 itemEffect[3]
+#define mask 0x3F
+#endif
// Read the item's effect properties.
if (item == ITEM_ENIGMA_BERRY)
@@ -5011,10 +4944,19 @@ u8 GetItemEffectType(u16 item)
itemEffect = gItemEffectTable[item - ITEM_POTION];
}
+#ifndef NONMATCHING
itemEffect0 = itemEffect[0];
mask = 0x3F;
+#endif
- if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80))
+ if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2])
+ {
+ return 0;
+ }
+#ifndef NONMATCHING
+ itemEffect3 = itemEffect[3];
+#endif
+ if (itemEffect3 & 0x80)
{
return 0;
}
@@ -5022,37 +4964,45 @@ u8 GetItemEffectType(u16 item)
{
return 10;
}
- else if (itemEffect[3] & 0x40)
+ else if (itemEffect3 & 0x40)
{
return 1;
}
- else if ((itemEffect[3] & mask) || (itemEffect0 >> 7))
+ else if ((itemEffect3 & mask) || (itemEffect0 >> 7))
{
- if ((itemEffect[3] & mask) == 0x20)
+ if ((itemEffect3 & mask) == 0x20)
{
return 4;
}
- else if ((itemEffect[3] & mask) == 0x10)
+ else if ((itemEffect3 & mask) == 0x10)
{
return 3;
}
- else if ((itemEffect[3] & mask) == 0x8)
+ else if ((itemEffect3 & mask) == 0x8)
{
return 5;
}
- else if ((itemEffect[3] & mask) == 0x4)
+ else if ((itemEffect3 & mask) == 0x4)
{
return 6;
}
- else if ((itemEffect[3] & mask) == 0x2)
+ else if ((itemEffect3 & mask) == 0x2)
{
return 7;
}
- else if ((itemEffect[3] & mask) == 0x1)
+ else if ((itemEffect3 & mask) == 0x1)
{
return 8;
}
- else if ((itemEffect0 >> 7) != 0 && (itemEffect[3] & mask) == 0)
+ // alternate fakematching
+ // itemEffect0_r0 = itemEffect0 >> 7;
+ // asm(""); // increase live length for greg
+ // if ((itemEffect0_r0 != 0) && (itemEffect3 & mask) == 0)
+#ifndef NONMATCHING
+ else if (((itemEffect0_r0 = itemEffect0 >> 7) != 0) && (itemEffect3 & mask) == 0)
+#else
+ else if (((itemEffect[0] >> 7) != 0) && (itemEffect[3] & 0x3F) == 0)
+#endif
{
return 9;
}
@@ -5109,8 +5059,13 @@ u8 GetItemEffectType(u16 item)
{
return 22;
}
+#ifdef NONMATCHING
+#undef itemEffect0
+#undef itemEffect3
+#undef mask
+#endif
}
-#else
+#if 0
NAKED
u8 GetItemEffectType(u16 item)
{
@@ -5307,8 +5262,7 @@ _08070F8A:\n\
bx r1\n\
.syntax divided\n");
}
-#endif // NONMATCHING
-
+#endif
// Maybe this goes in start_menu.c
#if !DEBUG
@@ -5318,4 +5272,4 @@ void unref_sub_8070F90(void)
FlagSet(FLAG_SYS_POKEMON_GET);
FlagSet(FLAG_SYS_POKENAV_GET);
}
-#endif
+#endif \ No newline at end of file
diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c
index 72972bf06..e07b5e1c0 100644
--- a/src/pokedex_cry_screen.c
+++ b/src/pokedex_cry_screen.c
@@ -203,6 +203,7 @@ struct SpritePalette gCryMeterNeedleSpritePalettes[] = {
#endif
#ifdef NONMATCHING
+// caused by some switch branch weirdness
u8 sub_8119E3C(struct CryRelatedStruct *cry, u8 arg1)
{
u8 i;
@@ -496,18 +497,22 @@ void sub_811A0A0(u16 species)
gPokedexCryScreenPtr->unk0010 = 1;
}
+// compiler refuses to put src into r0. this can't be solved with greg asm hacks
#ifdef NONMATCHING
void sub_811A0C0(void)
{
const s8 * src;
u8 i;
+
if (gPcmDmaCounter < 2)
src = gSoundInfo.pcmBuffer;
else
src = gSoundInfo.pcmBuffer + (gSoundInfo.pcmDmaPeriod + 1 - gPcmDmaCounter) * gSoundInfo.pcmSamplesPerVBlank;
+
src += PCM_DMA_BUF_SIZE;
for (i = 0; i < 16; i++)
gPokedexCryScreenPtr->unk0000[i] = src[i * 2] * 2;
+
}
#else
NAKED void sub_811A0C0(void)
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index fe908de03..13cadd6ec 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -68,7 +68,7 @@ static void SummaryScreen_DestroyTask(u8 taskId);
static void sub_80A1950(void);
static void sub_809DE64(void);
static void SummaryScreenHandleAButton(u8);
-static void SummaryScreenHandleUpDownInput(u8, s8);
+void SummaryScreenHandleUpDownInput(u8, s8);
static bool8 SummaryScreen_CanForgetSelectedMove(u8);
static void sub_809F9D0(u8, u8);
static void SummaryScreen_MoveSelect_Cancel(u8);
@@ -81,7 +81,7 @@ static void SummaryScreenHandleKeyInput(u8);
static void sub_80A1B1C(u8);
static void sub_80A16CC(u8);
static void sub_80A1A30(u8);
-static void DrawSummaryScreenNavigationDots(void);
+void DrawSummaryScreenNavigationDots(void);
static void sub_80A00F4(u8);
static void sub_80A029C(struct Pokemon *);
static void sub_809FBE4(void);
@@ -106,7 +106,7 @@ static void sub_80A1918(u8, u8);
static void SummaryScreen_DrawTypeIcon(u8, u8, u8, u8);
static u16 GetMonMove(struct Pokemon *, u8);
static void sub_80A04CC(u16);
-static void sub_80A057C(u16);
+void sub_80A057C(u16);
static void sub_80A0498(u16);
static void sub_80A046C(u16);
static void sub_80A20A8(u8);
@@ -1567,8 +1567,9 @@ static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction)
}
}
+// direction should be implicitly casted to a u8 during the var1 assign but it is not in this code
#ifdef NONMATCHING
-static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
+void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
{
s8 var3;
u8 var1 = direction;
@@ -1613,7 +1614,7 @@ static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
}
#else
NAKED
-static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
+void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
{
asm(".syntax unified\n\
push {r4-r6,lr}\n\
@@ -1722,7 +1723,7 @@ s8 sub_809F284(s8 a)
{
struct Pokemon *mons = pssData.monList.partyMons;
s8 r6 = 0;
-
+
if (pssData.page == PSS_PAGE_INFO)
{
if (a == -1 && pssData.monIndex == 0)
@@ -2605,7 +2606,7 @@ static void sub_80A04CC(u16 move)
}
#ifdef NONMATCHING // The two vramAddr lines are non-matching.
-static void sub_80A057C(u16 move)
+void sub_80A057C(u16 move)
{
u8 appeal;
u8 jam;
@@ -2626,7 +2627,7 @@ static void sub_80A057C(u16 move)
if (appeal != 0xFF && i < appeal)
tile = 0x103A;
- *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
+ *(&vramAddr[((i >> 2) << 5) + (i & and)] + offset) = tile;
}
if (move == 0xFFFF) return;
@@ -2647,12 +2648,12 @@ static void sub_80A057C(u16 move)
tile = 0x103C;
}
- *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
+ *(&vramAddr[((i >> 2) << 5) + (i & and)] + offset) = tile;
}
}
#else
NAKED
-static void sub_80A057C(u16 move)
+void sub_80A057C(u16 move)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -2701,8 +2702,8 @@ _080A05CC:\n\
lsls r0, 5\n\
adds r1, r2, 0\n\
ands r1, r7\n\
- adds r1, r0\n\
- lsls r1, 1\n\
+ adds r1, r0\n" // start of nonmatching
+ "lsls r1, 1\n\
add r1, r8\n\
adds r1, r6\n\
strh r3, [r1]\n\
@@ -3204,39 +3205,38 @@ static void DrawPokerusSurvivorDot(struct Pokemon *mon)
}
// Draws the 4 small navigation circles at the top of the pokemon summary screen.
+// complex nonmatching
#ifdef NONMATCHING
-static void DrawSummaryScreenNavigationDots(void)
+void DrawSummaryScreenNavigationDots(void)
{
- void *dest;
u16 arr[8];
u8 i = 0;
- struct PokemonSummaryScreenStruct *SS = (struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000);
+ struct PokemonSummaryScreenStruct *SS = &pssData;
u16 var1 = 0x4040;
u16 var2 = 0x404A;
-
for (i = 0; i < 4; i++)
{
- if (i < SS->unk75)
+ if (i < SS->firstPage)
{
arr[i * 2] = var1;
arr[(i * 2) + 1] = var1 + 1;
}
- else if (i > SS->unk76)
+ else if (i > SS->lastPage)
{
arr[i * 2] = var2;
arr[(i * 2) + 1] = var2 + 1;
}
else
{
- if (i < SS->unkB)
+ if (i < SS->page)
{
arr[i * 2] = 0x4046;
arr[(i * 2) + 1] = 0x4046 + 1;
}
- if (i == SS->unkB)
+ if (i == SS->page)
{
- if (i != SS->unk76)
+ if (i != SS->lastPage)
{
arr[i * 2] = 0x4041;
arr[(i * 2) + 1] = 0x4041 + 1;
@@ -3248,9 +3248,9 @@ static void DrawSummaryScreenNavigationDots(void)
}
}
- if (i > SS->unkB)
+ if (i > SS->page)
{
- if (i != SS->unk76)
+ if (i != SS->lastPage)
{
arr[i * 2] = 0x4043;
arr[(i * 2) + 1] = 0x4043 + 1;
@@ -3275,7 +3275,7 @@ static void DrawSummaryScreenNavigationDots(void)
}
#else
NAKED
-static void DrawSummaryScreenNavigationDots(void)
+void DrawSummaryScreenNavigationDots(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -4250,6 +4250,7 @@ static void sub_80A1654(s8 a, u8 b)
gTasks[taskId].data[3] = b;
}
+// not enough registers allocated (need to allocate r8 and r9)
#ifdef NONMATCHING
static void sub_80A16CC(u8 a)
{
diff --git a/src/trade.c b/src/trade.c
index 50de29b7f..d20f4efec 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -41,6 +41,10 @@
#include "trade.h"
#include "ewram.h"
+#ifndef NONMATCHING
+asm(".include \"constants/gba_constants.inc\"");
+#endif
+
#ifdef ENGLISH
#define sub_804A96C_alt sub_804A96C
asm(".set sub_804A96C_alt, sub_804A96C");
@@ -160,7 +164,7 @@ static void sub_804AF10(void);
static void sub_80494D8(void);
static void sub_8048AB4(void);
static void sub_804A940(struct UnkStructD *);
-static void sub_804B41C(void);
+void sub_804B41C(void);
static void sub_8049DE0(void);
static void sub_804AB30(void);
static void sub_8049ED4(u8);
@@ -173,19 +177,10 @@ static void sub_804AADC(u16, u8);
static void sub_804A80C(void);
static u8 sub_80499F0(const u8 *, u8, u8);
static void sub_804A840(u8);
-#ifdef NONMATCHING
-static
-#endif
u8 sub_804A2B4(u8 *, u8, u8);
static void sub_804A96C_alt(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16);
static void sub_804A96C(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16);
-#ifdef NONMATCHING
-static
-#endif
void sub_804A33C(u8 *, u8, u8);
-#ifdef NONMATCHING
-static
-#endif
void sub_804A51C(u8, u8, u8, u8, u8, u8);
static void sub_804D7AC(struct Sprite *);
static bool8 sub_804C29C(void);
@@ -208,9 +203,6 @@ static void sub_804BBCC(void);
static void sub_804D8E4(void);
static void sub_804C164(void);
static void SetTradeSceneStrings(void);
-#ifdef NONMATCHING
-static
-#endif
void sub_804DB84(void);
EWRAM_DATA u8 *gUnknown_020296CC[13] = {0};
@@ -1448,11 +1440,7 @@ static void sub_8048AB4(void)
UpdatePaletteFade();
}
-#ifdef NONMATCHING
-// Only minor register permutations
-#pragma push_macro("BLOCKSIZE")
-#define BLOCKSIZE 0x800
-static void sub_8048B0C(u8 a0)
+void sub_8048B0C(u8 a0)
{
int i;
@@ -1489,175 +1477,8 @@ static void sub_8048B0C(u8 a0)
break;
}
}
-#pragma pop_macro("BLOCKSIZE")
-#else
-asm(".include \"constants/gba_constants.inc\"");
-NAKED
-static void sub_8048B0C(u8 a0)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, 0\n"
- "\tbeq _08048B1C\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _08048BD0\n"
- "\tb _08048C3A\n"
- "_08048B1C:\n"
- "\tldr r5, _08048BA0 @ =gUnknown_08EA0348\n"
- "\tldr r0, _08048BA4 @ =gTradeStripesBG2Tilemap\n"
- "\tmov r12, r0\n"
- "\tldr r1, _08048BA8 @ =gUnknown_08EA02C8\n"
- "\tldr r4, _08048BAC @ =gPlttBufferFaded\n"
- "\tldr r3, _08048BB0 @ =gPlttBufferUnfaded\n"
- "\tmovs r2, 0x2F\n"
- "_08048B2A:\n"
- "\tldrh r0, [r1]\n"
- "\tstrh r0, [r3]\n"
- "\tldrh r0, [r1]\n"
- "\tstrh r0, [r4]\n"
- "\tadds r1, 0x2\n"
- "\tadds r4, 0x2\n"
- "\tadds r3, 0x2\n"
- "\tsubs r2, 0x1\n"
- "\tcmp r2, 0\n"
- "\tbge _08048B2A\n"
- "\tadds r3, r5, 0\n"
- "\tmovs r4, 0xC0\n"
- "\tlsls r4, 19\n"
- "\tmovs r5, 0x94\n"
- "\tlsls r5, 5\n"
- "\tldr r1, _08048BB4 @ =0x040000d4\n"
- "\tldr r6, _08048BB8 @ =0x80000800\n"
- "\tmovs r2, 0x80\n"
- "\tlsls r2, 5\n"
- "\tmovs r7, 0x80\n"
- "\tlsls r7, 24\n"
- "_08048B54:\n"
- "\tstr r3, [r1]\n"
- "\tstr r4, [r1, 0x4]\n"
- "\tstr r6, [r1, 0x8]\n"
- "\tldr r0, [r1, 0x8]\n"
- "\tadds r3, r2\n"
- "\tadds r4, r2\n"
- "\tsubs r5, r2\n"
- "\tcmp r5, r2\n"
- "\tbhi _08048B54\n"
- "\tstr r3, [r1]\n"
- "\tstr r4, [r1, 0x4]\n"
- "\tlsrs r0, r5, 1\n"
- "\torrs r0, r7\n"
- "\tstr r0, [r1, 0x8]\n"
- "\tldr r0, [r1, 0x8]\n"
- "\tmovs r2, 0\n"
- "\tldr r5, _08048BBC @ =0x000003ff\n"
- "\tldr r4, _08048BC0 @ =gUnknown_03004824\n"
- "\tldr r3, _08048BC4 @ =gUnknown_08EA15C8\n"
- "_08048B7A:\n"
- "\tldr r0, [r4]\n"
- "\tlsls r1, r2, 1\n"
- "\tadds r0, 0xDA\n"
- "\tadds r0, r1\n"
- "\tldrh r1, [r3]\n"
- "\tstrh r1, [r0]\n"
- "\tadds r3, 0x2\n"
- "\tadds r2, 0x1\n"
- "\tcmp r2, r5\n"
- "\tble _08048B7A\n"
- "\tldr r1, _08048BC8 @ =0x06003000\n"
- "\tldr r0, _08048BB4 @ =0x040000d4\n"
- "\tmov r2, r12\n"
- "\tstr r2, [r0]\n"
- "\tstr r1, [r0, 0x4]\n"
- "\tldr r1, _08048BCC @ =0x80000400\n"
- "\tstr r1, [r0, 0x8]\n"
- "\tldr r0, [r0, 0x8]\n"
- "\tb _08048C3A\n"
- "\t.align 2, 0\n"
- "_08048BA0: .4byte gUnknown_08EA0348\n"
- "_08048BA4: .4byte gTradeStripesBG2Tilemap\n"
- "_08048BA8: .4byte gUnknown_08EA02C8\n"
- "_08048BAC: .4byte gPlttBufferFaded\n"
- "_08048BB0: .4byte gPlttBufferUnfaded\n"
- "_08048BB4: .4byte 0x040000d4\n"
- "_08048BB8: .4byte 0x80000800\n"
- "_08048BBC: .4byte 0x000003ff\n"
- "_08048BC0: .4byte gUnknown_03004824\n"
- "_08048BC4: .4byte gUnknown_08EA15C8\n"
- "_08048BC8: .4byte 0x06003000\n"
- "_08048BCC: .4byte 0x80000400\n"
- "_08048BD0:\n"
- "\tldr r1, _08048C40 @ =gTradeStripesBG3Tilemap\n"
- "\tldr r2, _08048C44 @ =0x06003800\n"
- "\tldr r0, _08048C48 @ =0x040000d4\n"
- "\tstr r1, [r0]\n"
- "\tstr r2, [r0, 0x4]\n"
- "\tldr r1, _08048C4C @ =0x80000400\n"
- "\tstr r1, [r0, 0x8]\n"
- "\tldr r0, [r0, 0x8]\n"
- "\tmovs r0, 0\n"
- "\tbl sub_804A6DC\n"
- "\tmovs r0, 0x1\n"
- "\tbl sub_804A6DC\n"
- "\tldr r0, _08048C50 @ =gUnknown_03004824\n"
- "\tldr r0, [r0]\n"
- "\tadds r0, 0xC8\n"
- "\tbl sub_804A938\n"
- "\tldr r2, _08048C54 @ =REG_BG0CNT\n"
- "\tldrh r1, [r2]\n"
- "\tldr r0, _08048C58 @ =0x0000fffc\n"
- "\tands r0, r1\n"
- "\tstrh r0, [r2]\n"
- "\tldr r1, _08048C5C @ =REG_BG1CNT\n"
- "\tldr r2, _08048C60 @ =0x00000501\n"
- "\tadds r0, r2, 0\n"
- "\tstrh r0, [r1]\n"
- "\tadds r1, 0x2\n"
- "\tldr r2, _08048C64 @ =0x00000602\n"
- "\tadds r0, r2, 0\n"
- "\tstrh r0, [r1]\n"
- "\tadds r1, 0x2\n"
- "\tldr r2, _08048C68 @ =0x00000703\n"
- "\tadds r0, r2, 0\n"
- "\tstrh r0, [r1]\n"
- "\tldr r0, _08048C6C @ =REG_BG0HOFS\n"
- "\tmovs r1, 0\n"
- "\tstrh r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tstrh r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tstrh r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tstrh r1, [r0]\n"
- "\tsubs r0, 0xA\n"
- "\tstrh r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tstrh r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tstrh r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tstrh r1, [r0]\n"
- "_08048C3A:\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
- "_08048C40: .4byte gTradeStripesBG3Tilemap\n"
- "_08048C44: .4byte 0x06003800\n"
- "_08048C48: .4byte 0x040000d4\n"
- "_08048C4C: .4byte 0x80000400\n"
- "_08048C50: .4byte gUnknown_03004824\n"
- "_08048C54: .4byte REG_BG0CNT\n"
- "_08048C58: .4byte 0x0000fffc\n"
- "_08048C5C: .4byte REG_BG1CNT\n"
- "_08048C60: .4byte 0x00000501\n"
- "_08048C64: .4byte 0x00000602\n"
- "_08048C68: .4byte 0x00000703\n"
- "_08048C6C: .4byte REG_BG0HOFS");
-}
-#endif
-static void sub_8048C70(void)
+void sub_8048C70(void)
{
int i;
for (i = 0; i < PARTY_SIZE; i ++)
@@ -2973,9 +2794,6 @@ static void sub_8049ED4(u8 a0)
}
#endif
-#ifdef NONMATCHING
-static
-#endif
u8 sub_804A2B4(u8 *a0, u8 whichParty, u8 whichPokemon)
{
u8 string[11];
@@ -2996,9 +2814,6 @@ u8 sub_804A2B4(u8 *a0, u8 whichParty, u8 whichPokemon)
return Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, a0);
}
-#ifdef NONMATCHING
-static
-#endif
void sub_804A33C(u8 *a0, u8 whichParty, u8 whichPokemon)
{
u16 i;
@@ -3185,9 +3000,6 @@ static void sub_804A41C(u8 whichParty)
}
#endif
-#ifdef NONMATCHING
-static
-#endif
void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5)
{
u8 nickname[24];
@@ -3240,6 +3052,7 @@ void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5)
#endif
}
+// simple nonmatching, supposedly from a CSE optimization
#ifdef NONMATCHING
static void sub_804A6DC(u8 whichParty)
{
@@ -3509,231 +3322,58 @@ static void sub_804ACD8(const u8 *src, u8 *dest, u8 a2)
sub_804AFB8(&gWindowTemplate_81E725C, dest, src, a2);
}
-#ifdef NONMATCHING
+// replacing [who] with [0]/[1] depending on case compiles better code
static void sub_804ACF4(u8 who)
{
struct Pokemon *pokemon;
int i;
+
switch (who)
{
case 0:
- for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++)
+ for (i = 0; i < gUnknown_03004824->partyCounts[who]; i++)
{
pokemon = &gPlayerParty[i];
if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE)
{
- gUnknown_03004824->unk_0051[0][i] = 0;
- gUnknown_03004824->unk_005d[0][i] = 1;
+ gUnknown_03004824->unk_0051[who][i] = 0;
+ gUnknown_03004824->unk_005d[who][i] = 1;
}
else if (GetMonData(pokemon, MON_DATA_HP) == 0)
{
- gUnknown_03004824->unk_0051[0][i] = 0;
- gUnknown_03004824->unk_005d[0][i] = 0;
+ gUnknown_03004824->unk_0051[who][i] = 0;
+ gUnknown_03004824->unk_005d[who][i] = 0;
}
else
{
- gUnknown_03004824->unk_0051[0][i] = 1;
- gUnknown_03004824->unk_005d[0][i] = 0;
+ gUnknown_03004824->unk_0051[who][i] = 1;
+ gUnknown_03004824->unk_005d[who][i] = 0;
}
}
break;
case 1:
- for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++)
+ for (i = 0; i < gUnknown_03004824->partyCounts[who]; i++)
{
pokemon = &gEnemyParty[i];
if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE)
{
- gUnknown_03004824->unk_0051[1][i] = 0;
- gUnknown_03004824->unk_005d[1][i] = 1;
+ gUnknown_03004824->unk_0051[who][i] = 0;
+ gUnknown_03004824->unk_005d[who][i] = 1;
}
else if (GetMonData(pokemon, MON_DATA_HP) == 0)
{
- gUnknown_03004824->unk_0051[1][i] = 0;
- gUnknown_03004824->unk_005d[1][i] = 0;
+ gUnknown_03004824->unk_0051[who][i] = 0;
+ gUnknown_03004824->unk_005d[who][i] = 0;
}
else
{
- gUnknown_03004824->unk_0051[1][i] = 1;
- gUnknown_03004824->unk_005d[1][i] = 0;
+ gUnknown_03004824->unk_0051[who][i] = 1;
+ gUnknown_03004824->unk_005d[who][i] = 0;
}
}
break;
}
}
-#else
-static NAKED void sub_804ACF4(u8 who)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r9\n"
- "\tmov r6, r8\n"
- "\tpush {r6,r7}\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tmov r8, r0\n"
- "\tcmp r0, 0\n"
- "\tbeq _0804AD0C\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _0804ADA0\n"
- "\tb _0804AE2C\n"
- "_0804AD0C:\n"
- "\tmovs r7, 0\n"
- "\tldr r1, _0804AD4C @ =gUnknown_03004824\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0x42\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r7, r0\n"
- "\tblt _0804AD1C\n"
- "\tb _0804AE2C\n"
- "_0804AD1C:\n"
- "\tadds r6, r1, 0\n"
- "\tmovs r5, 0\n"
- "\tmov r9, r5\n"
- "_0804AD22:\n"
- "\tmovs r0, 0x64\n"
- "\tadds r1, r7, 0\n"
- "\tmuls r1, r0\n"
- "\tldr r0, _0804AD50 @ =gPlayerParty\n"
- "\tadds r4, r1, r0\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x2D\n"
- "\tbl GetMonData\n"
- "\tadds r1, r0, 0\n"
- "\tcmp r1, 0x1\n"
- "\tbne _0804AD54\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x51\n"
- "\tadds r0, r5\n"
- "\tmov r2, r9\n"
- "\tstrb r2, [r0]\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x5D\n"
- "\tadds r0, r5\n"
- "\tb _0804AD84\n"
- "\t.align 2, 0\n"
- "_0804AD4C: .4byte gUnknown_03004824\n"
- "_0804AD50: .4byte gPlayerParty\n"
- "_0804AD54:\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x39\n"
- "\tbl GetMonData\n"
- "\tadds r1, r0, 0\n"
- "\tcmp r1, 0\n"
- "\tbne _0804AD72\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x51\n"
- "\tadds r0, r5\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x5D\n"
- "\tadds r0, r5\n"
- "\tb _0804AD84\n"
- "_0804AD72:\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x51\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x1\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x5D\n"
- "\tadds r0, r5\n"
- "\tmov r1, r9\n"
- "_0804AD84:\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, _0804AD9C @ =gUnknown_03004824\n"
- "\tadds r5, 0x1\n"
- "\tadds r7, 0x1\n"
- "\tldr r0, [r0]\n"
- "\tadds r0, 0x42\n"
- "\tadd r0, r8\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r7, r0\n"
- "\tblt _0804AD22\n"
- "\tb _0804AE2C\n"
- "\t.align 2, 0\n"
- "_0804AD9C: .4byte gUnknown_03004824\n"
- "_0804ADA0:\n"
- "\tmovs r7, 0\n"
- "\tldr r1, _0804ADE0 @ =gUnknown_03004824\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0x43\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r7, r0\n"
- "\tbge _0804AE2C\n"
- "\tadds r6, r1, 0\n"
- "\tmovs r5, 0x6\n"
- "\tmovs r2, 0\n"
- "\tmov r9, r2\n"
- "_0804ADB6:\n"
- "\tmovs r0, 0x64\n"
- "\tadds r1, r7, 0\n"
- "\tmuls r1, r0\n"
- "\tldr r0, _0804ADE4 @ =gEnemyParty\n"
- "\tadds r4, r1, r0\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x2D\n"
- "\tbl GetMonData\n"
- "\tadds r1, r0, 0\n"
- "\tcmp r1, 0x1\n"
- "\tbne _0804ADE8\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x51\n"
- "\tadds r0, r5\n"
- "\tmov r2, r9\n"
- "\tstrb r2, [r0]\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x5D\n"
- "\tadds r0, r5\n"
- "\tb _0804AE18\n"
- "\t.align 2, 0\n"
- "_0804ADE0: .4byte gUnknown_03004824\n"
- "_0804ADE4: .4byte gEnemyParty\n"
- "_0804ADE8:\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x39\n"
- "\tbl GetMonData\n"
- "\tadds r1, r0, 0\n"
- "\tcmp r1, 0\n"
- "\tbne _0804AE06\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x51\n"
- "\tadds r0, r5\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x5D\n"
- "\tadds r0, r5\n"
- "\tb _0804AE18\n"
- "_0804AE06:\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x51\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x1\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r6]\n"
- "\tadds r0, 0x5D\n"
- "\tadds r0, r5\n"
- "\tmov r1, r9\n"
- "_0804AE18:\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, _0804AE38 @ =gUnknown_03004824\n"
- "\tadds r5, 0x1\n"
- "\tadds r7, 0x1\n"
- "\tldr r0, [r0]\n"
- "\tadds r0, 0x42\n"
- "\tadd r0, r8\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r7, r0\n"
- "\tblt _0804ADB6\n"
- "_0804AE2C:\n"
- "\tpop {r3,r4}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
- "_0804AE38: .4byte gUnknown_03004824");
-}
-#endif
static void sub_804AE3C(u8 who)
{
@@ -3853,15 +3493,16 @@ static void sub_804B128(void)
REG_BG2Y = dest.dy;
}
+// register swap with volatile, wtf !how
#ifdef NONMATCHING
static void sub_804B1BC(void)
{
- REG_BG1VOFS = gUnknown_03004828->bg1vofs;
- REG_BG1HOFS = gUnknown_03004828->bg1hofs;
- if ((REG_DISPCNT & 7) == DISPCNT_MODE_0)
+ REG_BG1VOFS = gUnknown_03004828->bg1vofs, REG_BG1HOFS = gUnknown_03004828->bg1hofs;
+ //temp = ;
+ //asm(""::"r"(gUnknown_03004828->bg2vofs));
+ if (REG_DISPCNT % 8 == 0)
{
- REG_BG2VOFS = gUnknown_03004828->bg2vofs;
- REG_BG2HOFS = gUnknown_03004828->bg2hofs;
+ REG_BG2VOFS = gUnknown_03004828->bg2vofs, REG_BG2HOFS = gUnknown_03004828->bg2hofs;
}
else
{
@@ -3930,9 +3571,6 @@ static void sub_804B228(void)
gUnknown_03004828->unk_00b3 = 0;
}
-#ifdef NONMATCHING
-static
-#endif
void sub_804B24C(void)
{
if (gUnknown_03004828->unk_00b2 == gUnknown_03004828->unk_00b3)
@@ -3996,8 +3634,11 @@ static void sub_804B2D0(u8 whichParty, u8 a1)
}
}
+// non-shifting nonmatch
+// out of order statements + register swaps?
+// r4 is loaded with 0 way before it's used (and it should be r2)
#ifdef NONMATCHING
-static void sub_804B41C(void)
+void sub_804B41C(void)
// Link trade init
{
switch (gMain.state)
@@ -4014,15 +3655,17 @@ static void sub_804B41C(void)
Text_LoadWindowTemplate(&gWindowTemplate_81E6F84);
Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84);
gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2);
+ //
+ // start of nonmatching here?
TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window);
Menu_EraseScreen();
gLinkType = 0x1144;
- gMain.state ++;
+ gMain.state++;
LZDecompressVram(gBattleTextboxTiles, (void *)VRAM);
- CpuCopy16(gBattleTextboxTilemap, ewram, 0x1000);
- DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500);
+ CpuCopy16(gBattleTextboxTilemap, gSharedMem, 0x1000);
+ DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500);
LoadCompressedPalette(gBattleTextboxPalette, 0, 32);
- gUnknown_03004828->unk_00b6 = 0;
+ gUnknown_03004828->unk_00b6 = 0; // nonmatching code writes to this address with r4, as opposed to r2 in matching code. r4 is also loaded with zero way before
gUnknown_03004828->unk_00c4 = 0;
gUnknown_03004828->isLinkTrade = TRUE;
gUnknown_03004828->unk_0104 = 0x40;
@@ -4113,7 +3756,7 @@ static void sub_804B41C(void)
UpdatePaletteFade();
}
#else
-static NAKED void sub_804B41C(void)
+NAKED void sub_804B41C(void)
{
asm_unified("\tpush {r4-r6,lr}\n"
"\tsub sp, 0x4\n"
@@ -4176,7 +3819,7 @@ static NAKED void sub_804B41C(void)
"\tbl TextWindow_SetBaseTileNum\n"
"\tldr r1, [r6]\n"
"\tadds r1, 0x34\n"
- "\tstrb r0, [r1]\n"
+ "\tstrb r0, [r1]\n" // start of nonmatching
"\tldr r0, [r6]\n"
"\tadds r0, 0x4\n"
"\tbl TextWindow_LoadStdFrameGraphics\n"
@@ -5477,9 +5120,6 @@ void CreateInGameTradePokemon(void)
_CreateInGameTradePokemon(gSpecialVar_0x8005, gSpecialVar_0x8004);
}
-#ifdef NONMATCHING
-static
-#endif
void sub_804DB84(void)
{
if (sub_804C29C() == TRUE)
diff --git a/src/unk_text_8095904.c b/src/unk_text_8095904.c
index df0a35e7c..b619cbbe4 100644
--- a/src/unk_text_8095904.c
+++ b/src/unk_text_8095904.c
@@ -12,6 +12,7 @@ extern const u32 gFont3LatinGlyphs[];
// text
+// some CSE stuff + register swaps (possibly DUE to CSE)
#ifdef NONMATCHING
void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
{
@@ -38,7 +39,7 @@ void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *b
u16 j;
for (j = 0; j < strlen; j++) // r5
{
- const u32 *glyphs = (const u8 *)(gFont3LatinGlyphs + (i * 0x80) + ((src[j] & 0xfff0) * 16) + ((src[j] & 0xf) * 8));
+ const u32 *glyphs = (const u32 *)(gFont3LatinGlyphs + (i * 0x80) + ((src[j] & 0xfff0) * 16) + ((src[j] & 0xf) * 8));
u16 k; // r6
for (k = 0; k < 32; k++)