summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2020-05-20 17:44:18 -0400
committerGitHub <noreply@github.com>2020-05-20 17:44:18 -0400
commit1ed41f7446d3e59f9538fb593c88638ef4611af5 (patch)
tree31df86246d58a603f0db29932dce34cf37fa6325
parentf302fcc134bf354c3655e3423be68fd7a99cb396 (diff)
parent8488e786b4369de37fa393ef8ad9c0f055bed96a (diff)
Merge pull request #783 from Missingmew/unused-decompress
Decompile unref_sub_800D42C
-rw-r--r--asm/decompress.s350
-rw-r--r--ld_script.txt1
-rw-r--r--src/decompress.c144
3 files changed, 144 insertions, 351 deletions
diff --git a/asm/decompress.s b/asm/decompress.s
deleted file mode 100644
index 99e449d8f..000000000
--- a/asm/decompress.s
+++ /dev/null
@@ -1,350 +0,0 @@
- .include "constants/gba_constants.inc"
-
- .include "include/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start unref_sub_800D42C
-unref_sub_800D42C: @ 800D42C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x24
- mov r9, r0
- str r1, [sp]
- str r2, [sp, 0x4]
- adds r5, r3, 0
- movs r0, 0x1
- mov r1, r9
- ands r0, r1
- cmp r0, 0
- bne _0800D44C
- b _0800D5E4
-_0800D44C:
- asrs r0, r1, 1
- adds r0, 0x4
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x8]
- movs r0, 0
- ldr r2, [sp]
- cmp r0, r2
- blt _0800D460
- b _0800D674
-_0800D460:
- movs r4, 0x8
- subs r1, r4, r1
- str r1, [sp, 0x10]
-_0800D466:
- movs r7, 0
- adds r0, 0x1
- str r0, [sp, 0x14]
- ldr r0, [sp, 0x10]
- cmp r7, r0
- bge _0800D4E2
- ldr r1, [sp, 0x8]
- lsls r1, 8
- str r1, [sp, 0x18]
- movs r2, 0
- mov r10, r2
- mov r0, r9
- movs r4, 0x8
- subs r0, r4, r0
- str r0, [sp, 0xC]
-_0800D484:
- movs r3, 0
- asrs r0, r7, 1
- adds r1, r7, 0
- movs r2, 0x1
- ands r1, r2
- str r1, [sp, 0x20]
- lsls r0, 8
- mov r8, r0
- mov r12, r5
-_0800D496:
- lsls r1, r3, 5
- ldr r4, [sp, 0x18]
- adds r0, r5, r4
- adds r0, r1
- mov r1, r8
- adds r2, r0, r1
- mov r1, r12
- add r1, r8
- movs r6, 0xF
-_0800D4A8:
- ldr r4, [sp, 0x20]
- cmp r4, 0
- bne _0800D4B8
- strb r4, [r1]
- add r4, sp, 0x20
- ldrb r4, [r4]
- strb r4, [r2, 0x10]
- b _0800D4C6
-_0800D4B8:
- mov r0, r10
- strb r0, [r1, 0x10]
- movs r4, 0x80
- lsls r4, 1
- adds r4, r2, r4
- str r4, [sp, 0x1C]
- strb r0, [r4]
-_0800D4C6:
- adds r2, 0x1
- adds r1, 0x1
- subs r6, 0x1
- cmp r6, 0
- bge _0800D4A8
- movs r0, 0x20
- add r12, r0
- adds r3, 0x1
- cmp r3, 0x7
- ble _0800D496
- adds r7, 0x1
- ldr r1, [sp, 0xC]
- cmp r7, r1
- blt _0800D484
-_0800D4E2:
- movs r7, 0
- movs r2, 0
-_0800D4E6:
- movs r6, 0
- adds r4, r7, 0x1
- mov r8, r4
- lsls r4, r7, 5
-_0800D4EE:
- adds r0, r6, 0x1
- mov r10, r0
- lsls r1, r6, 8
- adds r0, r1, 0
- adds r0, 0xC0
- adds r0, r5, r0
- adds r0, r4
- adds r1, r5, r1
- adds r1, r4
- movs r3, 0x1F
-_0800D502:
- strb r2, [r1]
- strb r2, [r0]
- adds r0, 0x1
- adds r1, 0x1
- subs r3, 0x1
- cmp r3, 0
- bge _0800D502
- mov r6, r10
- cmp r6, 0x7
- ble _0800D4EE
- mov r7, r8
- cmp r7, 0x1
- ble _0800D4E6
- mov r1, r9
- cmp r1, 0x5
- bne _0800D528
- movs r2, 0x90
- lsls r2, 1
- adds r5, r2
-_0800D528:
- movs r7, 0
- cmp r7, r9
- bge _0800D5BE
-_0800D52E:
- movs r3, 0
- adds r7, 0x1
- mov r8, r7
- cmp r3, r9
- bge _0800D59E
-_0800D538:
- adds r3, 0x1
- mov r10, r3
- ldr r4, [sp, 0x4]
- adds r4, 0x20
- adds r7, r5, 0
- adds r7, 0x20
- movs r0, 0x12
- adds r0, r5
- mov r12, r0
- ldr r2, [sp, 0x4]
- adds r3, r5, 0
- movs r6, 0x3
-_0800D550:
- ldrb r0, [r2]
- mov r1, r12
- strb r0, [r1]
- ldrb r0, [r2, 0x1]
- strb r0, [r1, 0x1]
- ldrb r0, [r2, 0x2]
- strb r0, [r1, 0x1E]
- ldrb r0, [r2, 0x3]
- strb r0, [r1, 0x1F]
- movs r0, 0x81
- lsls r0, 1
- adds r1, r3, r0
- ldrb r0, [r2, 0x10]
- strb r0, [r1]
- ldr r0, _0800D5A8 @ =0x00000103
- adds r1, r3, r0
- ldrb r0, [r2, 0x11]
- strb r0, [r1]
- movs r0, 0x90
- lsls r0, 1
- adds r1, r3, r0
- ldrb r0, [r2, 0x12]
- strb r0, [r1]
- ldr r0, _0800D5AC @ =0x00000121
- adds r1, r3, r0
- ldrb r0, [r2, 0x13]
- strb r0, [r1]
- movs r1, 0x4
- add r12, r1
- adds r2, 0x4
- adds r3, 0x4
- subs r6, 0x1
- cmp r6, 0
- bge _0800D550
- str r4, [sp, 0x4]
- adds r5, r7, 0
- mov r3, r10
- cmp r3, r9
- blt _0800D538
-_0800D59E:
- mov r2, r9
- cmp r2, 0x7
- bne _0800D5B0
- adds r5, 0x20
- b _0800D5B8
- .align 2, 0
-_0800D5A8: .4byte 0x00000103
-_0800D5AC: .4byte 0x00000121
-_0800D5B0:
- mov r4, r9
- cmp r4, 0x5
- bne _0800D5B8
- adds r5, 0x60
-_0800D5B8:
- mov r7, r8
- cmp r7, r9
- blt _0800D52E
-_0800D5BE:
- mov r0, r9
- cmp r0, 0x7
- bne _0800D5CC
- movs r1, 0x80
- lsls r1, 1
- adds r5, r1
- b _0800D5D8
-_0800D5CC:
- mov r2, r9
- cmp r2, 0x5
- bne _0800D5D8
- movs r4, 0xF0
- lsls r4, 1
- adds r5, r4
-_0800D5D8:
- ldr r0, [sp, 0x14]
- ldr r1, [sp]
- cmp r0, r1
- bge _0800D5E2
- b _0800D466
-_0800D5E2:
- b _0800D674
-_0800D5E4:
- movs r6, 0
- ldr r2, [sp]
- cmp r6, r2
- bge _0800D674
-_0800D5EC:
- adds r6, 0x1
- mov r10, r6
- mov r4, r9
- cmp r4, 0x6
- bne _0800D604
- movs r0, 0
- movs r3, 0xFF
-_0800D5FA:
- strb r0, [r5]
- adds r5, 0x1
- subs r3, 0x1
- cmp r3, 0
- bge _0800D5FA
-_0800D604:
- movs r7, 0
- cmp r7, r9
- bge _0800D658
-_0800D60A:
- adds r7, 0x1
- mov r8, r7
- mov r1, r9
- lsls r0, r1, 5
- cmp r1, 0x6
- bne _0800D624
- movs r1, 0
- movs r3, 0x1F
-_0800D61A:
- strb r1, [r5]
- adds r5, 0x1
- subs r3, 0x1
- cmp r3, 0
- bge _0800D61A
-_0800D624:
- adds r1, r0, 0
- cmp r1, 0
- ble _0800D63E
- adds r3, r1, 0
-_0800D62C:
- ldr r2, [sp, 0x4]
- ldrb r0, [r2]
- strb r0, [r5]
- adds r2, 0x1
- str r2, [sp, 0x4]
- adds r5, 0x1
- subs r3, 0x1
- cmp r3, 0
- bne _0800D62C
-_0800D63E:
- mov r4, r9
- cmp r4, 0x6
- bne _0800D652
- movs r0, 0
- movs r3, 0x1F
-_0800D648:
- strb r0, [r5]
- adds r5, 0x1
- subs r3, 0x1
- cmp r3, 0
- bge _0800D648
-_0800D652:
- mov r7, r8
- cmp r7, r9
- blt _0800D60A
-_0800D658:
- mov r0, r9
- cmp r0, 0x6
- bne _0800D66C
- movs r0, 0
- movs r3, 0xFF
-_0800D662:
- strb r0, [r5]
- adds r5, 0x1
- subs r3, 0x1
- cmp r3, 0
- bge _0800D662
-_0800D66C:
- mov r6, r10
- ldr r1, [sp]
- cmp r6, r1
- blt _0800D5EC
-_0800D674:
- add sp, 0x24
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end unref_sub_800D42C
-
- .align 2, 0
diff --git a/ld_script.txt b/ld_script.txt
index 46004c7c7..2606c7d1a 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -49,7 +49,6 @@ SECTIONS {
src/main_menu.o(.text);
src/battle_controllers.o(.text);
src/decompress.o(.text);
- asm/decompress.o(.text);
src/battle_bg.o(.text);
src/battle_main.o(.text);
src/battle_util.o(.text);
diff --git a/src/decompress.c b/src/decompress.c
index d6c52439f..9f8916d52 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -111,3 +111,147 @@ void Unused_LZDecompressWramIndirect(const void **src, void *dest)
{
LZ77UnCompWram(*src, dest);
}
+
+void unref_sub_800D42C(int object_size, int object_count, unsigned char *src_tiles, unsigned char *dest_tiles)
+{
+ /*
+ This function appears to emulate behaviour found in the GB(C) versions regarding how the Pokemon images
+ are stitched together to be displayed on the battle screen.
+ Given "compacted" tiles, an object count and a bounding box/object size, place the tiles in such a way
+ that the result will have each object centered in a 8x8 tile canvas.
+ */
+ int i, j, k, l;
+ unsigned char *src = src_tiles, *dest = dest_tiles;
+ unsigned char bottom_off;
+
+ if (object_size & 1)
+ {
+ // Object size is odd
+ bottom_off = (object_size >> 1) + 4;
+ for (l = 0; l < object_count; l++)
+ {
+ // Clear all unused rows of tiles plus the half-tile required due to centering
+ for (j = 0; j < 8-object_size; j++)
+ {
+ for (k = 0; k < 8; k++)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if (j % 2 == 0)
+ {
+ // Clear top half of top tile and bottom half of bottom tile when on even j
+ ((dest+i) + (k << 5))[((j >> 1) << 8)] = 0;
+ ((bottom_off << 8) + (dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0;
+ }
+ else
+ {
+ // Clear bottom half of top tile and top half of tile following bottom tile when on odd j
+ ((dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0;
+ ((bottom_off << 8) + (dest+i) + (k << 5) + 256)[((j >> 1) << 8)] = 0;
+ }
+ }
+ }
+ }
+
+ // Clear the columns to the left and right that wont be used completely
+ // Unlike the previous loops, this will clear the later used space as well
+ for (j = 0; j < 2; j++)
+ {
+ for (i = 0; i < 8; i++)
+ {
+ for (k = 0; k < 32; k++)
+ {
+ // Left side
+ ((dest+k) + (i << 8))[(j << 5)] = 0;
+ // Right side
+ ((dest+k) + (i << 8))[(j << 5)+192] = 0;
+ }
+ }
+ }
+
+ // Skip the top row and first tile on the second row for objects of size 5
+ if (object_size == 5) dest += 0x120;
+
+ // Copy tile data
+ for (j = 0; j < object_size; j++)
+ {
+ for (k = 0; k < object_size; k++)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ // Offset the tile by +4px in both x and y directions
+ (dest + (i << 2))[18] = (src + (i << 2))[0];
+ (dest + (i << 2))[19] = (src + (i << 2))[1];
+ (dest + (i << 2))[48] = (src + (i << 2))[2];
+ (dest + (i << 2))[49] = (src + (i << 2))[3];
+
+ (dest + (i << 2))[258] = (src + (i << 2))[16];
+ (dest + (i << 2))[259] = (src + (i << 2))[17];
+ (dest + (i << 2))[288] = (src + (i << 2))[18];
+ (dest + (i << 2))[289] = (src + (i << 2))[19];
+ }
+ src += 32;
+ dest += 32;
+ }
+
+ // At the end of a row, skip enough tiles to get to the beginning of the next row
+ if (object_size == 7) dest += 0x20;
+ else if (object_size == 5) dest += 0x60;
+ }
+
+ // Skip remaining unused space to go to the beginning of the next object
+ if (object_size == 7) dest += 0x100;
+ else if (object_size == 5) dest += 0x1e0;
+ }
+ }
+ else
+ {
+ // Object size is even
+ for (i = 0; i < object_count; i++)
+ {
+ // For objects of size 6, the first and last row and column will be cleared
+ // While the remaining space will be filled with actual data
+ if (object_size == 6)
+ {
+ for (k = 0; k < 256; k++) {
+ *dest = 0;
+ dest++;
+ }
+ }
+
+ for (j = 0; j < object_size; j++)
+ {
+ if (object_size == 6)
+ {
+ for (k = 0; k < 32; k++) {
+ *dest = 0;
+ dest++;
+ }
+ }
+
+ // Copy tile data
+ for (k = 0; k < 32 * object_size; k++) {
+ *dest = *src;
+ src++;
+ dest++;
+ }
+
+ if (object_size == 6)
+ {
+ for (k = 0; k < 32; k++) {
+ *dest = 0;
+ dest++;
+ }
+ }
+ }
+
+ if (object_size == 6)
+ {
+ for (k = 0; k < 256; k++) {
+ *dest = 0;
+ dest++;
+ }
+ }
+ }
+ }
+}