diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/shadow_minimize.c | 2 | ||||
-rw-r--r-- | src/contest_painting.c | 111 | ||||
-rw-r--r-- | src/daycare.c | 4 | ||||
-rw-r--r-- | src/field_specials.c | 212 | ||||
-rw-r--r-- | src/party_menu.c | 302 | ||||
-rw-r--r-- | src/pokedex_cry_screen.c | 5 | ||||
-rw-r--r-- | src/pokemon_summary_screen.c | 49 | ||||
-rw-r--r-- | src/trade.c | 444 | ||||
-rw-r--r-- | src/unk_text_8095904.c | 3 |
9 files changed, 228 insertions, 904 deletions
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++) |