diff options
author | Kaz <kazbloxmc@gmail.com> | 2020-05-31 05:52:38 -0400 |
---|---|---|
committer | Kaz <kazbloxmc@gmail.com> | 2020-05-31 05:52:38 -0400 |
commit | 8d0b9655ba2a71edc1c561f9efb7e977acc5b527 (patch) | |
tree | e34d7a82c7a82c8b26f00a2926cb8e77e92edbea /src | |
parent | d0fe3640817c119099662d4fce83d2bdc7ac1f1d (diff) |
pokemon_system_storage_4.c: CopyWallpaperTilemap and
ClearLowestWallpaperTiles. File is now fully matching.
Fix NONMATCHING target.
Diffstat (limited to 'src')
-rw-r--r-- | src/pokemon_storage_system_4.c | 541 |
1 files changed, 131 insertions, 410 deletions
diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_4.c index 06d47435b..ccf72f28c 100644 --- a/src/pokemon_storage_system_4.c +++ b/src/pokemon_storage_system_4.c @@ -46,8 +46,8 @@ EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL; void sub_809900C(u8 boxId, s8 a1); s8 sub_8099D90(u8 boxId); void sub_8099EB0(u8 boxId, s8 a1); -void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3); -void sub_809A14C(u16 *vdest); +void CopyWallpaperTilemap(u16 *buffer, const u16 *tilemap, s8 direction, u8 offset); +void ClearLowestWallpaperTiles(u16 *buffer); void sub_809A23C(u8 boxId); void sub_809A3D0(u8 boxId, s8 a1); void sub_809A598(void); @@ -444,448 +444,169 @@ void sub_8099EB0(u8 boxId, s8 a1) if (a1) { gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE; - sub_809A14C(BG_SCREEN_ADDR(26)); + ClearLowestWallpaperTiles(BG_SCREEN_ADDR(26)); } wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId]; LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60); LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62); - sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); + CopyWallpaperTilemap(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); } -#ifdef NONMATCHING -void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +/* + Copies the wallpaper rectangle tilemap to a buffer, + depending on the wallpaper type. + + - buffer : Where to copy the wallpaper to. + - tilemap : The wallpaper tilemap to copy. + - direction : The direction of the wallpaper. + - offset : The offset of the wallpaper tilemap. + + Also depends on stored BG2 X variable in PSS. +*/ +void CopyWallpaperTilemap(u16 *buffer, const u16 *tilemap, s8 direction, u8 offset) { - s16 r6; - s16 r3; - u16 sp0 = a3 << 8; - u16 sp4 = (a3 * 3 + 4) << 12; - u16 *r4; - u16 *r7; - u16 i; - u16 j; - s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f; - if (sp8 < 13) + u16 *dest; // For either all of the wallpaper tilemap, or the first half of it. + u16 *dest2; // The second half of wallpaper tilemap; used in case of two halves. + u16 *fillDest; // For blanking; used when direction is set. + + u16 x, y; // Temps for copying the tilemap. + + // Temps for copying the tile and palette metadata of the wallpaper. + u16 tileMeta; + u16 tileOffset = offset * 256; + u16 paletteMeta; + u16 paletteOffset = (offset * 3 + 4) << 12; + + s16 rectWidth; // The width of the wallpaper, or it's first half. + s16 rectWidth2; // Used in case of two halves. + s16 rectX = ((gPokemonStorageSystemPtr->unk_08b4 / 8 + 10) + (direction * 24)) & 0x3F; + + s16 fillX; // For blanking; used when direction is set. + + /* + Bull**** agbcc behavior discovered here + while attempting to match this function: + x + (y + z) is NOT the same as x + y + z. + Even though it SHOULDN'T make a difference. + + Rather, it's the same as x + z + y. That's + old codegen for you. + */ + if (rectX < 13) { - r6 = 20; - r3 = 0; - r4 = vdest + sp8 + 0x40; - r7 = NULL; + // Copy the wallpaper in full. + rectWidth = 20; + rectWidth2 = 0; + dest = buffer + (rectX + 64); + dest2 = NULL; } - else if (sp8 < 32) + else if (rectX < 32) { - r6 = 32 - sp8; - r3 = 20 - r6; - r4 = vdest + sp8 + 0x40; - r7 = vdest + 0x440; + // Split copying the wallpaper into two operations. + rectWidth = 32 - rectX; + rectWidth2 = 20 - rectWidth; + dest = buffer + (rectX + 64); + dest2 = buffer + 0x440; } - else if (sp8 < 45) + else if (rectX < 45) { - r6 = 20; - r3 = 0; - r4 = vdest + sp8 + 0x420; - r7 = NULL; + // Copy the wallpaper in full. + rectWidth = 20; + rectWidth2 = 0; + dest = buffer + (rectX + 0x420); + dest2 = NULL; } else { - r6 = 64 - sp8; - r3 = 20 - r6; - r4 = vdest + sp8 + 0x420; - r7 = vdest + 0x40; + // Split copying the wallpaper into two operations. + rectWidth = 64 - rectX; + rectWidth2 = 20 - rectWidth; + dest = buffer + (rectX + 0x420); + dest2 = buffer + 0x40; } - for (i = 0; i < 18; i++) + + for (y = 0; y < 18; y++) { - for (j = 0; j < r6; j++) + for(x = 0; x < rectWidth; x++) { - u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); - r4[j] = tile; - src++; + // Get the tile and palette metadata for each + // 2 bytes, and copy over into the buffer. + tileMeta = (*tilemap & 0xfff) + tileOffset; + paletteMeta = (*tilemap & 0xf000) + paletteOffset; + dest[x] = paletteMeta | tileMeta; + tilemap++; } - for (j = 0; j < r3; j++) + for(x = 0; x < rectWidth2; x++) { - u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); - r7[j] = tile; - src++; + // Repeat the same process again in case we need + // to copy halves. + tileMeta = (*tilemap & 0xfff) + tileOffset; + paletteMeta = (*tilemap & 0xf000) + paletteOffset; + dest2[x] = paletteMeta | tileMeta; + tilemap++; } - r4 += 0x20; - r7 += 0x20; + dest += 0x20; + dest2 += 0x20; } - if (a2) + + if (direction != 0) { - s16 r4_2; - u16 *r2; - if (a2 > 0) - r4_2 = (sp8 + 20) & 0x3f; + fillX = (direction > 0 ? rectX + 20 : rectX - 4) & 0x3F; + + if(fillX < 32) + fillDest = buffer + (fillX + 0x40); else - r4_2 = (sp8 - 4) & 0x3f; - r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; - for (i = 0; i < 4; i++) + fillDest = buffer + (fillX + 0x420); + + for(x = 0; x < 4; x++) { - for (j = 0; j < 18; j++) + for(y = 0; y < 18; y++) { - *r2 = 0; - r2 += 0x20; + *fillDest = 0; // Blank the buffer. + fillDest += 0x20; } - r4_2++; - r4_2 &= 0x3f; - r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + // Needs to be one statement, or else it won't match. + // fillX = ++fillX & 0x3F; matches, but to have consistency + // with ClearLowestWallpaperTiles, which requires var + 1 + // instead for a similar operation, we'll use that. + fillX = (fillX + 1) & 0x3F; + + if (fillX < 32) + fillDest = buffer + (fillX + 0x40); + else + fillDest = buffer + (fillX + 0x420); } } } -#else -NAKED void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x20\n" - "\tmov r9, r0\n" - "\tadds r5, r1, 0\n" - "\tlsls r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tlsls r0, r3, 8\n" - "\tstr r0, [sp]\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r3\n" - "\tadds r0, 0x4\n" - "\tlsls r0, 28\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _08099FBC @ =0x000008b4\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0]\n" - "\tlsrs r1, 3\n" - "\tadds r1, 0xA\n" - "\tlsrs r0, r2, 24\n" - "\tmov r8, r0\n" - "\tasrs r2, 24\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, r2\n" - "\tlsls r0, 3\n" - "\tadds r1, r0\n" - "\tmovs r0, 0x3F\n" - "\tands r1, r0\n" - "\tstr r1, [sp, 0x8]\n" - "\tadds r2, r1, 0\n" - "\tcmp r2, 0xC\n" - "\tbgt _08099FC0\n" - "\tmovs r6, 0x14\n" - "\tmovs r3, 0\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, 0x80\n" - "\tmov r1, r9\n" - "\tadds r4, r1, r0\n" - "\tmovs r7, 0\n" - "\tb _0809A020\n" - "\t.align 2, 0\n" - "_08099FB8: .4byte gPokemonStorageSystemPtr\n" - "_08099FBC: .4byte 0x000008b4\n" - "_08099FC0:\n" - "\tcmp r2, 0x1F\n" - "\tbgt _08099FE6\n" - "\tmovs r0, 0x20\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tmovs r1, 0x14\n" - "\tlsrs r6, r0, 16\n" - "\tasrs r0, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r3, r1, 16\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, 0x80\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmovs r7, 0x88\n" - "\tlsls r7, 4\n" - "\tadd r7, r9\n" - "\tb _0809A020\n" - "_08099FE6:\n" - "\tcmp r2, 0x2C\n" - "\tbgt _08099FFE\n" - "\tmovs r6, 0x14\n" - "\tmovs r3, 0\n" - "\tlsls r0, r2, 1\n" - "\tmovs r1, 0x84\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmovs r7, 0\n" - "\tb _0809A020\n" - "_08099FFE:\n" - "\tmovs r0, 0x40\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tmovs r1, 0x14\n" - "\tlsrs r6, r0, 16\n" - "\tasrs r0, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r3, r1, 16\n" - "\tlsls r0, r2, 1\n" - "\tmovs r1, 0x84\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmov r7, r9\n" - "\tadds r7, 0x80\n" - "_0809A020:\n" - "\tmovs r1, 0\n" - "\tmov r0, r8\n" - "\tlsls r0, 24\n" - "\tstr r0, [sp, 0x14]\n" - "\tlsls r0, r6, 16\n" - "\tasrs r0, 16\n" - "\tmov r8, r0\n" - "\tlsls r3, 16\n" - "\tstr r3, [sp, 0xC]\n" - "\tasrs r2, r3, 16\n" - "\tstr r2, [sp, 0x10]\n" - "_0809A036:\n" - "\tmovs r3, 0\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 0x40\n" - "\tstr r0, [sp, 0x18]\n" - "\tadds r2, r7, 0\n" - "\tadds r2, 0x40\n" - "\tstr r2, [sp, 0x1C]\n" - "\tadds r1, 0x1\n" - "\tmov r10, r1\n" - "\tcmp r3, r8\n" - "\tbge _0809A07A\n" - "\tldr r0, _0809A0D4 @ =0x00000fff\n" - "\tmov r12, r0\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 8\n" - "_0809A054:\n" - "\tldrh r2, [r5]\n" - "\tmov r0, r12\n" - "\tands r0, r2\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r6, 0\n" - "\tands r1, r2\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r1\n" - "\torrs r1, r0\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r4\n" - "\tstrh r1, [r0]\n" - "\tadds r5, 0x2\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, r8\n" - "\tblt _0809A054\n" - "_0809A07A:\n" - "\tmovs r3, 0\n" - "\tldr r0, [sp, 0x10]\n" - "\tcmp r3, r0\n" - "\tbge _0809A0B4\n" - "\tldr r1, _0809A0D4 @ =0x00000fff\n" - "\tmov r12, r1\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 8\n" - "\tldr r2, [sp, 0xC]\n" - "\tasrs r4, r2, 16\n" - "_0809A08E:\n" - "\tldrh r2, [r5]\n" - "\tmov r0, r12\n" - "\tands r0, r2\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r6, 0\n" - "\tands r1, r2\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r1\n" - "\torrs r1, r0\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r7\n" - "\tstrh r1, [r0]\n" - "\tadds r5, 0x2\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, r4\n" - "\tblt _0809A08E\n" - "_0809A0B4:\n" - "\tldr r4, [sp, 0x18]\n" - "\tldr r7, [sp, 0x1C]\n" - "\tmov r1, r10\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0x11\n" - "\tbls _0809A036\n" - "\tldr r0, [sp, 0x14]\n" - "\tasrs r2, r0, 24\n" - "\tcmp r2, 0\n" - "\tbeq _0809A13A\n" - "\tcmp r2, 0\n" - "\tble _0809A0D8\n" - "\tldr r1, [sp, 0x8]\n" - "\tadds r1, 0x14\n" - "\tb _0809A0DC\n" - "\t.align 2, 0\n" - "_0809A0D4: .4byte 0x00000fff\n" - "_0809A0D8:\n" - "\tldr r1, [sp, 0x8]\n" - "\tsubs r1, 0x4\n" - "_0809A0DC:\n" - "\tmovs r0, 0x3F\n" - "\tands r1, r0\n" - "\tadds r4, r1, 0\n" - "\tadds r0, r4, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A0EE\n" - "\tlsls r0, 1\n" - "\tadds r0, 0x80\n" - "\tb _0809A0F6\n" - "_0809A0EE:\n" - "\tlsls r0, 1\n" - "\tmovs r2, 0x84\n" - "\tlsls r2, 4\n" - "\tadds r0, r2\n" - "_0809A0F6:\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r0\n" - "\tmovs r3, 0\n" - "\tmovs r6, 0\n" - "_0809A0FE:\n" - "\tmovs r1, 0\n" - "\tadds r5, r3, 0x1\n" - "\tlsls r3, r4, 16\n" - "_0809A104:\n" - "\tstrh r6, [r2]\n" - "\tadds r2, 0x40\n" - "\tadds r0, r1, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0x11\n" - "\tbls _0809A104\n" - "\tasrs r0, r3, 16\n" - "\tadds r4, r0, 0x1\n" - "\tmovs r0, 0x3F\n" - "\tands r4, r0\n" - "\tadds r0, r4, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A126\n" - "\tlsls r0, 1\n" - "\tadds r0, 0x80\n" - "\tb _0809A12E\n" - "_0809A126:\n" - "\tlsls r0, 1\n" - "\tmovs r2, 0x84\n" - "\tlsls r2, 4\n" - "\tadds r0, r2\n" - "_0809A12E:\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r0\n" - "\tlsls r0, r5, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, 0x3\n" - "\tbls _0809A0FE\n" - "_0809A13A:\n" - "\tadd sp, 0x20\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif -#ifdef NONMATCHING -void sub_809A14C(u16 *vdest) +/* + Clears the lowest line of a wallpaper buffer. + Depends on stored BG2 X variable in PSS. + + - buffer : Wallpaper buffer. +*/ +void ClearLowestWallpaperTiles(u16 *buffer) { - u16 *r2; - u16 i; - int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f; - r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640); - for (i = 0; i < 0x2b; i++) - { - *r2++ = 0; - r3++; - r3 &= 0x3f; - if (r3 == 0) - r2 -= 0x420; - if (r3 == 0x20) - r2 += 0x3e0; - } -} -#else -NAKED void sub_809A14C(u16 *vdest) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r2, r0, 0\n" - "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _0809A178 @ =0x000008b4\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0]\n" - "\tlsrs r0, 3\n" - "\tadds r3, r0, 0\n" - "\tadds r3, 0x1E\n" - "\tmovs r0, 0x3F\n" - "\tands r3, r0\n" - "\tadds r0, r3, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A17C\n" - "\tlsls r0, 1\n" - "\tmovs r6, 0x98\n" - "\tlsls r6, 3\n" - "\tadds r0, r6\n" - "\tb _0809A184\n" - "\t.align 2, 0\n" - "_0809A174: .4byte gPokemonStorageSystemPtr\n" - "_0809A178: .4byte 0x000008b4\n" - "_0809A17C:\n" - "\tlsls r0, 1\n" - "\tmovs r1, 0xC8\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "_0809A184:\n" - "\tadds r2, r0\n" - "\tmovs r0, 0\n" - "\tmovs r5, 0\n" - "\tmovs r4, 0x3F\n" - "_0809A18C:\n" - "\tstrh r5, [r2]\n" - "\tadds r2, 0x2\n" - "\tadds r3, 0x1\n" - "\tands r3, r4\n" - "\tadds r1, r3, 0\n" - "\tcmp r1, 0\n" - "\tbne _0809A19E\n" - "\tldr r6, _0809A1B8 @ =0xfffff7c0\n" - "\tadds r2, r6\n" - "_0809A19E:\n" - "\tcmp r1, 0x20\n" - "\tbne _0809A1A8\n" - "\tmovs r1, 0xF8\n" - "\tlsls r1, 3\n" - "\tadds r2, r1\n" - "_0809A1A8:\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x2B\n" - "\tbls _0809A18C\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0809A1B8: .4byte 0xfffff7c0"); + u16 x; + s16 rectX = ((gPokemonStorageSystemPtr->unk_08b4 / 8) + 30) & 0x3F; + + if (rectX < 32) + buffer += rectX + 0x260; + else + buffer += rectX + 0x640; + + for (x = 0; x < 44; x++) + { + *buffer++ = 0; + // Needs to be one statement in order to match. + rectX = (rectX + 1) & 0x3F; + if (rectX == 0) + buffer -= 0x420; + if (rectX == 32) + buffer += 0x3e0; + } } -#endif void sub_809A1BC(const u8 *a0, const u8 *text) { |