summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Naściszewski <matin1111@wp.pl>2020-12-15 00:00:08 +0100
committerMateusz Naściszewski <matin1111@wp.pl>2020-12-15 00:51:45 +0100
commitefdaf621cbebae7d73800cfb2def92a5466127ff (patch)
tree8c2940e84822ec0ca0cdd9c13e8ce807256d4efe
parent4b7009286856fea6a6727dc09169e8ba7b3eefc0 (diff)
Translating Decompression
Hopefully part one of many, some NONMATCHINGs in the larger functions, sadly.
-rw-r--r--asm/code_2.s2
-rw-r--r--asm/code_800AAA0.s1074
-rw-r--r--asm/code_800D090.s8
-rw-r--r--asm/code_8048480.s8
-rw-r--r--asm/code_808DAB4.s2
-rw-r--r--asm/code_80A7714.s8
-rw-r--r--asm/text.s2
-rw-r--r--data/data_80B9BB8.s13
-rw-r--r--src/file_system.c1431
-rw-r--r--sym_ewram.txt8
10 files changed, 1454 insertions, 1102 deletions
diff --git a/asm/code_2.s b/asm/code_2.s
index 78c393a..8d2cf42 100644
--- a/asm/code_2.s
+++ b/asm/code_2.s
@@ -360,7 +360,7 @@ sub_8000634:
adds r0, r7, 0
movs r1, 0
mov r2, r8
- bl sub_800AAA8
+ bl DecompressATFile
movs r2, 0
ldr r0, _0800071C
movs r3, 0xC0
diff --git a/asm/code_800AAA0.s b/asm/code_800AAA0.s
index e7cb49c..5c8980b 100644
--- a/asm/code_800AAA0.s
+++ b/asm/code_800AAA0.s
@@ -5,1080 +5,6 @@
.text
- thumb_func_start sub_800AAB4
-sub_800AAB4:
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x2C
- mov r12, r0
- str r1, [sp, 0x24]
- mov r8, r2
- ldrb r0, [r2, 0x5]
- ldrb r1, [r2, 0x6]
- lsls r1, 8
- adds r0, r1
- str r0, [sp, 0x28]
- movs r6, 0
- mov r10, r6
- movs r0, 0x8
- mov r9, r0
- ldrb r0, [r2]
- cmp r0, 0x41
- bne _0800AB04
- ldrb r0, [r2, 0x1]
- adds r1, r0, 0
- cmp r1, 0x54
- bne _0800AB0C
- ldrb r0, [r2, 0x2]
- cmp r0, 0x34
- bne _0800AB0C
- ldrb r0, [r2, 0x3]
- cmp r0, 0x50
- bne _0800AB0C
- ldrb r1, [r2, 0x10]
- ldrb r0, [r2, 0x11]
- lsls r0, 8
- adds r1, r0
- ldr r2, [sp, 0x24]
- cmp r2, 0
- beq _0800AB08
- cmp r2, r1
- beq _0800AB08
-_0800AB04:
- movs r0, 0
- b _0800AE16
-_0800AB08:
- movs r1, 0x12
- b _0800AB26
-_0800AB0C:
- mov r3, r8
- ldrb r0, [r3]
- cmp r0, 0x41
- bne _0800AB04
- cmp r1, 0x54
- bne _0800AB04
- ldrb r0, [r3, 0x2]
- cmp r0, 0x33
- bne _0800AB04
- ldrb r0, [r3, 0x3]
- cmp r0, 0x50
- bne _0800AB04
- movs r1, 0x10
-_0800AB26:
- mov r2, r8
- ldrb r0, [r2, 0x4]
- cmp r0, 0x4E
- bne _0800AB4A
- movs r7, 0
- b _0800AB40
-_0800AB32:
- mov r1, r12
- adds r0, r1, r7
- mov r2, r8
- adds r1, r7, r2
- ldrb r1, [r1, 0x7]
- strb r1, [r0]
- adds r7, 0x1
-_0800AB40:
- ldr r3, [sp, 0x28]
- cmp r7, r3
- blt _0800AB32
- adds r0, r7, 0
- b _0800AE16
-_0800AB4A:
- mov r2, r8
- ldrb r0, [r2, 0x7]
- adds r0, 0x3
- str r0, [sp]
- ldrb r0, [r2, 0x8]
- adds r0, 0x3
- str r0, [sp, 0x4]
- ldrb r0, [r2, 0x9]
- adds r0, 0x3
- str r0, [sp, 0x8]
- ldrb r0, [r2, 0xA]
- adds r0, 0x3
- str r0, [sp, 0xC]
- ldrb r0, [r2, 0xB]
- adds r0, 0x3
- str r0, [sp, 0x10]
- ldrb r0, [r2, 0xC]
- adds r0, 0x3
- str r0, [sp, 0x14]
- ldrb r0, [r2, 0xD]
- adds r0, 0x3
- str r0, [sp, 0x18]
- ldrb r0, [r2, 0xE]
- adds r0, 0x3
- str r0, [sp, 0x1C]
- ldrb r0, [r2, 0xF]
- adds r0, 0x3
- str r0, [sp, 0x20]
- adds r7, r1, 0
- ldr r3, [sp, 0x28]
- cmp r7, r3
- blt _0800AB8C
- b _0800AE14
-_0800AB8C:
- ldr r0, [sp, 0x24]
- cmp r0, 0
- beq _0800AB96
- cmp r6, r0
- bge _0800AB04
-_0800AB96:
- mov r1, r9
- cmp r1, 0x8
- bne _0800ABAA
- mov r2, r8
- adds r0, r2, r7
- ldrb r0, [r0]
- mov r10, r0
- adds r7, 0x1
- movs r3, 0
- mov r9, r3
-_0800ABAA:
- movs r0, 0x80
- mov r1, r10
- ands r0, r1
- cmp r0, 0
- beq _0800ABB6
- b _0800ADF0
-_0800ABB6:
- mov r3, r8
- adds r2, r3, r7
- ldrb r1, [r2]
- lsrs r0, r1, 4
- adds r3, r0, 0x3
- movs r0, 0xF
- ands r0, r1
- lsls r5, r0, 8
- ldr r0, [sp]
- cmp r3, r0
- bne _0800ABCE
- movs r3, 0x1F
-_0800ABCE:
- ldr r0, [sp, 0x4]
- cmp r3, r0
- bne _0800ABD6
- movs r3, 0x1E
-_0800ABD6:
- ldr r0, [sp, 0x8]
- cmp r3, r0
- bne _0800ABDE
- movs r3, 0x1D
-_0800ABDE:
- ldr r0, [sp, 0xC]
- cmp r3, r0
- bne _0800ABE6
- movs r3, 0x1C
-_0800ABE6:
- ldr r0, [sp, 0x10]
- cmp r3, r0
- bne _0800ABEE
- movs r3, 0x1B
-_0800ABEE:
- ldr r0, [sp, 0x14]
- cmp r3, r0
- bne _0800ABF6
- movs r3, 0x1A
-_0800ABF6:
- ldr r0, [sp, 0x18]
- cmp r3, r0
- bne _0800ABFE
- movs r3, 0x19
-_0800ABFE:
- ldr r0, [sp, 0x1C]
- cmp r3, r0
- bne _0800AC06
- movs r3, 0x18
-_0800AC06:
- ldr r0, [sp, 0x20]
- cmp r3, r0
- bne _0800AC0E
- movs r3, 0x17
-_0800AC0E:
- adds r0, r3, 0
- subs r0, 0x17
- cmp r0, 0x8
- bls _0800AC18
- b _0800ADB0
-_0800AC18:
- lsls r0, 2
- ldr r1, _0800AC24
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0800AC24: .4byte _0800AC28
- .align 2, 0
-_0800AC28:
- .4byte _0800AD7C
- .4byte _0800AD48
- .4byte _0800AD20
- .4byte _0800ACFA
- .4byte _0800ACD6
- .4byte _0800ACB4
- .4byte _0800AC8C
- .4byte _0800AC66
- .4byte _0800AC4C
-_0800AC4C:
- ldrb r1, [r2]
- movs r0, 0xF
- adds r7, 0x1
- mov r3, r12
- adds r2, r3, r6
- ands r0, r1
- lsls r1, r0, 4
- orrs r1, r0
- strb r1, [r2]
- adds r6, 0x1
- adds r0, r3, r6
- strb r1, [r0]
- b _0800ADA4
-_0800AC66:
- ldrb r0, [r2]
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r1, r12
- adds r3, r1, r6
- movs r2, 0xF
- lsls r0, r5, 4
- adds r1, r5, 0x1
- ands r1, r2
- orrs r0, r1
- strb r0, [r3]
- adds r6, 0x1
- mov r3, r12
- adds r2, r3, r6
- lsls r0, r1, 4
- orrs r0, r1
- strb r0, [r2]
- b _0800ADA4
-_0800AC8C:
- ldrb r0, [r2]
- movs r3, 0xF
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r1, r12
- adds r4, r1, r6
- adds r2, r5, 0
- ands r2, r3
- lsls r1, r2, 4
- subs r0, r5, 0x1
- ands r0, r3
- orrs r0, r1
- strb r0, [r4]
- adds r6, 0x1
- mov r3, r12
- adds r0, r3, r6
- orrs r1, r2
- strb r1, [r0]
- b _0800ADA4
-_0800ACB4:
- ldrb r0, [r2]
- movs r3, 0xF
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r1, r12
- adds r2, r1, r6
- adds r1, r5, 0
- ands r1, r3
- lsls r0, r1, 4
- orrs r0, r1
- strb r0, [r2]
- adds r6, 0x1
- mov r0, r12
- adds r2, r0, r6
- subs r0, r5, 0x1
- b _0800AD68
-_0800ACD6:
- ldrb r0, [r2]
- movs r4, 0xF
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r2, r12
- adds r3, r2, r6
- adds r1, r5, 0
- ands r1, r4
- lsls r2, r1, 4
- adds r0, r2, 0
- orrs r0, r1
- strb r0, [r3]
- adds r6, 0x1
- mov r3, r12
- adds r1, r3, r6
- subs r0, r5, 0x1
- b _0800AD9E
-_0800ACFA:
- ldrb r0, [r2]
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r1, r12
- adds r3, r1, r6
- movs r2, 0xF
- lsls r0, r5, 4
- subs r1, r5, 0x1
- ands r1, r2
- orrs r0, r1
- strb r0, [r3]
- adds r6, 0x1
- mov r3, r12
- adds r2, r3, r6
- lsls r0, r1, 4
- orrs r0, r1
- strb r0, [r2]
- b _0800ADA4
-_0800AD20:
- ldrb r0, [r2]
- movs r3, 0xF
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r1, r12
- adds r4, r1, r6
- adds r2, r5, 0
- ands r2, r3
- lsls r1, r2, 4
- adds r0, r5, 0x1
- ands r0, r3
- orrs r0, r1
- strb r0, [r4]
- adds r6, 0x1
- mov r3, r12
- adds r0, r3, r6
- orrs r1, r2
- strb r1, [r0]
- b _0800ADA4
-_0800AD48:
- ldrb r0, [r2]
- movs r3, 0xF
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r1, r12
- adds r2, r1, r6
- adds r1, r5, 0
- ands r1, r3
- lsls r0, r1, 4
- orrs r0, r1
- strb r0, [r2]
- adds r6, 0x1
- mov r0, r12
- adds r2, r0, r6
- adds r0, r5, 0x1
-_0800AD68:
- ands r0, r3
- lsls r0, 4
- orrs r0, r1
- strb r0, [r2]
- adds r6, 0x1
- mov r4, r9
- adds r4, 0x1
- mov r1, r10
- lsls r2, r1, 1
- b _0800AE08
-_0800AD7C:
- ldrb r0, [r2]
- movs r4, 0xF
- movs r5, 0xF
- ands r5, r0
- adds r7, 0x1
- mov r2, r12
- adds r3, r2, r6
- adds r1, r5, 0
- ands r1, r4
- lsls r2, r1, 4
- adds r0, r2, 0
- orrs r0, r1
- strb r0, [r3]
- adds r6, 0x1
- mov r3, r12
- adds r1, r3, r6
- adds r0, r5, 0x1
-_0800AD9E:
- ands r0, r4
- orrs r2, r0
- strb r2, [r1]
-_0800ADA4:
- adds r6, 0x1
- mov r4, r9
- adds r4, 0x1
- mov r0, r10
- lsls r2, r0, 1
- b _0800AE08
-_0800ADB0:
- adds r7, 0x1
- mov r1, r8
- adds r0, r1, r7
- ldrb r0, [r0]
- adds r5, r0
- adds r7, 0x1
- ldr r2, _0800ADEC
- adds r0, r5, r2
- adds r5, r0, r6
- mov r4, r9
- adds r4, 0x1
- mov r0, r10
- lsls r2, r0, 1
- cmp r3, 0
- beq _0800AE08
-_0800ADCE:
- mov r1, r12
- adds r1, r6
- mov r10, r1
- mov r0, r12
- adds r0, r5
- ldrb r1, [r0]
- mov r0, r10
- strb r1, [r0]
- adds r6, 0x1
- adds r5, 0x1
- subs r3, 0x1
- cmp r3, 0
- bne _0800ADCE
- b _0800AE08
- .align 2, 0
-_0800ADEC: .4byte 0xfffff000
-_0800ADF0:
- mov r1, r12
- adds r0, r1, r6
- mov r2, r8
- adds r1, r2, r7
- ldrb r1, [r1]
- strb r1, [r0]
- adds r6, 0x1
- adds r7, 0x1
- mov r4, r9
- adds r4, 0x1
- mov r3, r10
- lsls r2, r3, 1
-_0800AE08:
- mov r9, r4
- mov r10, r2
- ldr r0, [sp, 0x28]
- cmp r7, r0
- bge _0800AE14
- b _0800AB8C
-_0800AE14:
- adds r0, r6, 0
-_0800AE16:
- add sp, 0x2C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_800AAB4
-
- thumb_func_start sub_800AE28
-sub_800AE28:
- push {lr}
- ldr r2, [r2, 0x4]
- bl sub_800AE34
- pop {r1}
- bx r1
- thumb_func_end sub_800AE28
-
- thumb_func_start sub_800AE34
-sub_800AE34:
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x34
- str r1, [sp, 0x24]
- mov r10, r2
- ldrb r2, [r2, 0x5]
- mov r3, r10
- ldrb r1, [r3, 0x6]
- lsls r1, 8
- adds r2, r1
- str r2, [sp, 0x28]
- movs r1, 0
- mov r9, r1
- movs r2, 0
- str r2, [sp, 0x2C]
- movs r3, 0x8
- str r3, [sp, 0x30]
- bl sub_800B1BC
- mov r1, r10
- ldrb r0, [r1]
- cmp r0, 0x41
- bne _0800AE90
- ldrb r0, [r1, 0x1]
- adds r1, r0, 0
- cmp r1, 0x54
- bne _0800AE98
- mov r2, r10
- ldrb r0, [r2, 0x2]
- cmp r0, 0x34
- bne _0800AE98
- ldrb r0, [r2, 0x3]
- cmp r0, 0x50
- bne _0800AE98
- ldrb r1, [r2, 0x10]
- ldrb r0, [r2, 0x11]
- lsls r0, 8
- adds r1, r0
- ldr r3, [sp, 0x24]
- cmp r3, 0
- beq _0800AE94
- cmp r3, r1
- beq _0800AE94
-_0800AE90:
- movs r0, 0
- b _0800B1AA
-_0800AE94:
- movs r1, 0x12
- b _0800AEB2
-_0800AE98:
- mov r2, r10
- ldrb r0, [r2]
- cmp r0, 0x41
- bne _0800AE90
- cmp r1, 0x54
- bne _0800AE90
- ldrb r0, [r2, 0x2]
- cmp r0, 0x33
- bne _0800AE90
- ldrb r0, [r2, 0x3]
- cmp r0, 0x50
- bne _0800AE90
- movs r1, 0x10
-_0800AEB2:
- mov r3, r10
- ldrb r0, [r3, 0x4]
- cmp r0, 0x4E
- bne _0800AEE0
- movs r0, 0
- mov r8, r0
- ldr r1, [sp, 0x28]
- cmp r8, r1
- bge _0800AED8
-_0800AEC4:
- mov r0, r8
- add r0, r10
- ldrb r0, [r0, 0x7]
- bl sub_800B220
- movs r2, 0x1
- add r8, r2
- ldr r3, [sp, 0x28]
- cmp r8, r3
- blt _0800AEC4
-_0800AED8:
- bl sub_800B270
- mov r0, r8
- b _0800B1AA
-_0800AEE0:
- mov r2, r10
- ldrb r0, [r2, 0x7]
- adds r0, 0x3
- str r0, [sp]
- ldrb r0, [r2, 0x8]
- adds r0, 0x3
- str r0, [sp, 0x4]
- ldrb r0, [r2, 0x9]
- adds r0, 0x3
- str r0, [sp, 0x8]
- ldrb r0, [r2, 0xA]
- adds r0, 0x3
- str r0, [sp, 0xC]
- ldrb r0, [r2, 0xB]
- adds r0, 0x3
- str r0, [sp, 0x10]
- ldrb r0, [r2, 0xC]
- adds r0, 0x3
- str r0, [sp, 0x14]
- ldrb r0, [r2, 0xD]
- adds r0, 0x3
- str r0, [sp, 0x18]
- ldrb r0, [r2, 0xE]
- adds r0, 0x3
- str r0, [sp, 0x1C]
- ldrb r0, [r2, 0xF]
- adds r0, 0x3
- str r0, [sp, 0x20]
- mov r8, r1
- ldr r3, [sp, 0x28]
- cmp r8, r3
- blt _0800AF22
- b _0800B1A4
-_0800AF22:
- ldr r0, [sp, 0x24]
- cmp r0, 0
- beq _0800AF2C
- cmp r9, r0
- bge _0800AE90
-_0800AF2C:
- ldr r1, [sp, 0x30]
- cmp r1, 0x8
- bne _0800AF42
- mov r0, r10
- add r0, r8
- ldrb r0, [r0]
- str r0, [sp, 0x2C]
- movs r2, 0x1
- add r8, r2
- movs r3, 0
- str r3, [sp, 0x30]
-_0800AF42:
- movs r0, 0x80
- ldr r1, [sp, 0x2C]
- ands r0, r1
- cmp r0, 0
- beq _0800AF4E
- b _0800B180
-_0800AF4E:
- mov r2, r10
- add r2, r8
- ldrb r1, [r2]
- lsrs r0, r1, 4
- adds r3, r0, 0x3
- movs r0, 0xF
- ands r0, r1
- lsls r7, r0, 8
- ldr r0, [sp]
- cmp r3, r0
- bne _0800AF66
- movs r3, 0x1F
-_0800AF66:
- ldr r0, [sp, 0x4]
- cmp r3, r0
- bne _0800AF6E
- movs r3, 0x1E
-_0800AF6E:
- ldr r0, [sp, 0x8]
- cmp r3, r0
- bne _0800AF76
- movs r3, 0x1D
-_0800AF76:
- ldr r0, [sp, 0xC]
- cmp r3, r0
- bne _0800AF7E
- movs r3, 0x1C
-_0800AF7E:
- ldr r0, [sp, 0x10]
- cmp r3, r0
- bne _0800AF86
- movs r3, 0x1B
-_0800AF86:
- ldr r0, [sp, 0x14]
- cmp r3, r0
- bne _0800AF8E
- movs r3, 0x1A
-_0800AF8E:
- ldr r0, [sp, 0x18]
- cmp r3, r0
- bne _0800AF96
- movs r3, 0x19
-_0800AF96:
- ldr r0, [sp, 0x1C]
- cmp r3, r0
- bne _0800AF9E
- movs r3, 0x18
-_0800AF9E:
- ldr r0, [sp, 0x20]
- cmp r3, r0
- bne _0800AFA6
- movs r3, 0x17
-_0800AFA6:
- adds r0, r3, 0
- subs r0, 0x17
- cmp r0, 0x8
- bls _0800AFB0
- b _0800B13C
-_0800AFB0:
- lsls r0, 2
- ldr r1, _0800AFBC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0800AFBC: .4byte _0800AFC0
- .align 2, 0
-_0800AFC0:
- .4byte _0800B104
- .4byte _0800B0DE
- .4byte _0800B0BA
- .4byte _0800B090
- .4byte _0800B06E
- .4byte _0800B048
- .4byte _0800B024
- .4byte _0800AFFE
- .4byte _0800AFE4
-_0800AFE4:
- ldrb r0, [r2]
- movs r1, 0xF
- movs r2, 0x1
- add r8, r2
- ands r1, r0
- lsls r4, r1, 4
- orrs r4, r1
- adds r0, r4, 0
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- b _0800B128
-_0800AFFE:
- ldrb r0, [r2]
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- movs r1, 0xF
- lsls r0, r6, 4
- adds r4, r6, 0x1
- ands r4, r1
- orrs r0, r4
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- lsls r0, r4, 4
- orrs r0, r4
- lsls r0, 24
- lsrs r0, 24
- b _0800B12A
-_0800B024:
- ldrb r0, [r2]
- movs r1, 0xF
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- adds r5, r6, 0
- ands r5, r1
- lsls r4, r5, 4
- subs r0, r6, 0x1
- ands r0, r1
- orrs r0, r4
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- orrs r4, r5
- b _0800B128
-_0800B048:
- ldrb r0, [r2]
- movs r5, 0xF
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- adds r4, r6, 0
- ands r4, r5
- lsls r0, r4, 4
- orrs r0, r4
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- subs r0, r6, 0x1
- ands r0, r5
- lsls r0, 4
- orrs r0, r4
- b _0800B12A
-_0800B06E:
- ldrb r0, [r2]
- movs r5, 0xF
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- adds r1, r6, 0
- ands r1, r5
- lsls r4, r1, 4
- adds r0, r4, 0
- orrs r0, r1
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- subs r0, r6, 0x1
- b _0800B124
-_0800B090:
- ldrb r0, [r2]
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- movs r1, 0xF
- lsls r0, r6, 4
- subs r4, r6, 0x1
- ands r4, r1
- orrs r0, r4
- lsls r0, 24
- lsrs r0, 24
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- lsls r0, r4, 4
- orrs r0, r4
- lsls r0, 24
- lsrs r0, 24
- b _0800B12A
-_0800B0BA:
- ldrb r0, [r2]
- movs r1, 0xF
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- adds r5, r6, 0
- ands r5, r1
- lsls r4, r5, 4
- adds r0, r6, 0x1
- ands r0, r1
- orrs r0, r4
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- orrs r4, r5
- b _0800B128
-_0800B0DE:
- ldrb r0, [r2]
- movs r5, 0xF
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- adds r4, r6, 0
- ands r4, r5
- lsls r0, r4, 4
- orrs r0, r4
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- adds r0, r6, 0x1
- ands r0, r5
- lsls r0, 4
- orrs r0, r4
- b _0800B12A
-_0800B104:
- ldrb r0, [r2]
- movs r5, 0xF
- movs r6, 0xF
- ands r6, r0
- movs r2, 0x1
- add r8, r2
- adds r1, r6, 0
- ands r1, r5
- lsls r4, r1, 4
- adds r0, r4, 0
- orrs r0, r1
- bl sub_800B220
- movs r3, 0x1
- add r9, r3
- adds r0, r6, 0x1
-_0800B124:
- ands r0, r5
- orrs r4, r0
-_0800B128:
- adds r0, r4, 0
-_0800B12A:
- bl sub_800B220
- movs r0, 0x1
- add r9, r0
- ldr r5, [sp, 0x30]
- adds r5, 0x1
- ldr r1, [sp, 0x2C]
- lsls r4, r1, 1
- b _0800B198
-_0800B13C:
- movs r2, 0x1
- add r8, r2
- mov r0, r10
- add r0, r8
- ldrb r0, [r0]
- adds r7, r0
- add r8, r2
- ldr r1, _0800B17C
- adds r0, r7, r1
- mov r2, r9
- adds r7, r0, r2
- ldr r5, [sp, 0x30]
- adds r5, 0x1
- ldr r0, [sp, 0x2C]
- lsls r4, r0, 1
- cmp r3, 0
- beq _0800B198
- adds r6, r3, 0
-_0800B160:
- adds r0, r7, 0
- bl sub_800B1E0
- lsls r0, 24
- lsrs r0, 24
- bl sub_800B220
- movs r1, 0x1
- add r9, r1
- adds r7, 0x1
- subs r6, 0x1
- cmp r6, 0
- bne _0800B160
- b _0800B198
- .align 2, 0
-_0800B17C: .4byte 0xfffff000
-_0800B180:
- mov r0, r10
- add r0, r8
- ldrb r0, [r0]
- bl sub_800B220
- movs r2, 0x1
- add r9, r2
- add r8, r2
- ldr r5, [sp, 0x30]
- adds r5, 0x1
- ldr r3, [sp, 0x2C]
- lsls r4, r3, 1
-_0800B198:
- str r5, [sp, 0x30]
- str r4, [sp, 0x2C]
- ldr r0, [sp, 0x28]
- cmp r8, r0
- bge _0800B1A4
- b _0800AF22
-_0800B1A4:
- bl sub_800B270
- mov r0, r9
-_0800B1AA:
- add sp, 0x34
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_800AE34
-
- thumb_func_start sub_800B1BC
-sub_800B1BC:
- ldr r1, _0800B1D0
- str r0, [r1]
- ldr r1, _0800B1D4
- str r0, [r1]
- ldr r0, _0800B1D8
- movs r1, 0
- str r1, [r0]
- ldr r0, _0800B1DC
- str r1, [r0]
- bx lr
- .align 2, 0
-_0800B1D0: .4byte gUnknown_202D4A8
-_0800B1D4: .4byte gUnknown_202D4AC
-_0800B1D8: .4byte gUnknown_202D4B0
-_0800B1DC: .4byte gUnknown_202D4B4
- thumb_func_end sub_800B1BC
-
- thumb_func_start sub_800B1E0
-sub_800B1E0:
- push {lr}
- adds r2, r0, 0
- cmp r2, 0
- bge _0800B1EA
- adds r0, r2, 0x3
-_0800B1EA:
- asrs r0, 2
- ldr r1, _0800B20C
- ldr r1, [r1]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- movs r1, 0x3
- ands r1, r2
- cmp r1, 0x1
- beq _0800B210
- cmp r1, 0x1
- ble _0800B216
- cmp r1, 0x2
- beq _0800B214
- cmp r1, 0x3
- beq _0800B218
- b _0800B216
- .align 2, 0
-_0800B20C: .4byte gUnknown_202D4AC
-_0800B210:
- lsrs r0, 8
- b _0800B216
-_0800B214:
- lsrs r0, 16
-_0800B216:
- lsls r0, 24
-_0800B218:
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end sub_800B1E0
-
- thumb_func_start sub_800B220
-sub_800B220:
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r4, _0800B260
- ldr r2, _0800B264
- ldr r3, _0800B268
- ldr r1, [r3]
- lsls r1, 2
- adds r1, r2
- ldr r1, [r1]
- lsls r0, r1
- ldr r1, [r4]
- orrs r1, r0
- str r1, [r4]
- ldr r2, _0800B26C
- ldr r0, [r2]
- str r1, [r0]
- ldr r0, [r3]
- adds r0, 0x1
- str r0, [r3]
- cmp r0, 0x4
- bne _0800B258
- ldr r0, [r2]
- adds r0, 0x4
- str r0, [r2]
- movs r0, 0
- str r0, [r4]
- str r0, [r3]
-_0800B258:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B260: .4byte gUnknown_202D4B0
-_0800B264: .4byte gUnknown_80B9BB8
-_0800B268: .4byte gUnknown_202D4B4
-_0800B26C: .4byte gUnknown_202D4A8
- thumb_func_end sub_800B220
-
- thumb_func_start sub_800B270
-sub_800B270:
- push {lr}
- ldr r0, _0800B288
- ldr r0, [r0]
- cmp r0, 0
- beq _0800B284
- ldr r0, _0800B28C
- ldr r1, [r0]
- ldr r0, _0800B290
- ldr r0, [r0]
- str r0, [r1]
-_0800B284:
- pop {r0}
- bx r0
- .align 2, 0
-_0800B288: .4byte gUnknown_202D4B4
-_0800B28C: .4byte gUnknown_202D4A8
-_0800B290: .4byte gUnknown_202D4B0
- thumb_func_end sub_800B270
-
thumb_func_start sub_800B294
sub_800B294:
push {lr}
diff --git a/asm/code_800D090.s b/asm/code_800D090.s
index 671646a..004cb28 100644
--- a/asm/code_800D090.s
+++ b/asm/code_800D090.s
@@ -7137,7 +7137,7 @@ sub_801059C:
ldr r0, _08010714
movs r1, 0
ldr r2, [sp, 0xC]
- bl sub_800AE28
+ bl DecompressATGlobalFile
ldr r1, [r4]
ldr r2, _08010718
adds r0, r1, r2
@@ -7151,7 +7151,7 @@ sub_801059C:
ldr r3, _0801071C
adds r0, r3
ldr r2, [sp, 0x10]
- bl sub_800AAA8
+ bl DecompressATFile
ldr r1, [r4]
ldr r2, _08010720
adds r0, r1, r2
@@ -8101,7 +8101,7 @@ sub_8010DA4:
ldr r0, _08010EDC
movs r1, 0
mov r2, r10
- bl sub_800AE28
+ bl DecompressATGlobalFile
ldr r1, [r4]
ldr r2, _08010EE0
adds r0, r1, r2
@@ -8113,7 +8113,7 @@ sub_8010DA4:
ldr r0, [r4]
adds r0, 0x14
adds r2, r7, 0
- bl sub_800AAA8
+ bl DecompressATFile
ldr r1, [r4]
ldr r3, _08010EE4
adds r0, r1, r3
diff --git a/asm/code_8048480.s b/asm/code_8048480.s
index 0776cfd..35b6f10 100644
--- a/asm/code_8048480.s
+++ b/asm/code_8048480.s
@@ -2158,7 +2158,7 @@ sub_804966C:
ldr r0, _08049748
movs r1, 0
adds r2, r4, 0
- bl sub_800AE28
+ bl DecompressATGlobalFile
adds r0, r4, 0
bl CloseFile
ldr r1, _0804974C
@@ -2191,7 +2191,7 @@ sub_804966C:
adds r0, r1
ldr r1, _0804975C
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
ldr r0, [r6]
@@ -2215,7 +2215,7 @@ sub_804966C:
movs r1, 0x93
lsls r1, 4
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
b _08049794
@@ -2249,7 +2249,7 @@ _08049768:
movs r1, 0x90
lsls r1, 2
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
_08049794:
diff --git a/asm/code_808DAB4.s b/asm/code_808DAB4.s
index 5279fc2..bfc6812 100644
--- a/asm/code_808DAB4.s
+++ b/asm/code_808DAB4.s
@@ -267,7 +267,7 @@ sub_808E010:
ldr r0, _0808E078
movs r1, 0
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
_0808E04A:
diff --git a/asm/code_80A7714.s b/asm/code_80A7714.s
index 48ee9ba..015f8ab 100644
--- a/asm/code_80A7714.s
+++ b/asm/code_80A7714.s
@@ -13496,7 +13496,7 @@ _080ADDFA:
ldr r0, [sp, 0x28]
movs r1, 0
adds r2, r4, 0
- bl sub_800AE28
+ bl DecompressATGlobalFile
adds r0, r4, 0
bl CloseFile
ldr r1, _080ADEC4
@@ -13519,7 +13519,7 @@ _080ADDFA:
ldr r1, _080ADECC
ldr r0, [sp, 0x2C]
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
mov r2, r8
@@ -13537,7 +13537,7 @@ _080ADDFA:
movs r1, 0x93
lsls r1, 4
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
b _080ADEFC
@@ -13564,7 +13564,7 @@ _080ADED4:
lsls r1, 2
mov r0, r10
adds r2, r4, 0
- bl sub_800AAA8
+ bl DecompressATFile
adds r0, r4, 0
bl CloseFile
_080ADEFC:
diff --git a/asm/text.s b/asm/text.s
index bbf990b..659c236 100644
--- a/asm/text.s
+++ b/asm/text.s
@@ -4046,7 +4046,7 @@ sub_800829C:
lsls r1, 5
muls r1, r2
adds r2, r3, 0
- bl sub_800AAB4
+ bl DecompressAT
movs r2, 0
movs r1, 0x8
ldrsh r0, [r4, r1]
diff --git a/data/data_80B9BB8.s b/data/data_80B9BB8.s
index 0a9f43a..c564236 100644
--- a/data/data_80B9BB8.s
+++ b/data/data_80B9BB8.s
@@ -3,12 +3,13 @@
.string "pksdir0\0"
.align 2,0
- .global gUnknown_80B9BB8
-gUnknown_80B9BB8: @ 80B9BB8
- .byte 0x00, 0x00, 0x00, 0x00
- .byte 0x08, 0x00, 0x00, 0x00
- .byte 0x10, 0x00, 0x00, 0x00
- .byte 0x18, 0x00, 0x00, 0x00
+ .global gByteShiftLookup
+gByteShiftLookup: @ 80B9BB8
+ .4byte 0
+ .4byte 8
+ .4byte 16
+ .4byte 24
+
.string "pksdir0\0"
.string "pksdir0\0"
.string "PKD ROM USER DATA 000000\0"
diff --git a/src/file_system.c b/src/file_system.c
index c328d6a..b2aad05 100644
--- a/src/file_system.c
+++ b/src/file_system.c
@@ -6,9 +6,22 @@ extern struct OpenedFile gFileCache[64];
extern u32 gFileCacheCursorPosition;
extern u32 gUnknown_202D2A4;
+extern const u32 gByteShiftLookup[4];
+
+extern u32 *gDecompressBufferPtr;
+extern u32 *gDecompressBufferStart;
+extern u32 gDecompressBufferCurrent;
+extern u32 gDecompressBufferByteInInt;
+
extern int sprintf(char *, const char *, ...);
-extern u32 sub_800AAB4(u32 r0, u32 r1, u32 r2);
+void DecompressAT_Init(u32 *buffer);
+void DecompressAT_AppendByte(char value);
+void DecompressAT_Finish(void);
+char DecompressAT_GetByte(int index);
+
+u32 DecompressAT(char *result, u32 resultLength, const char *compressedData);
+u32 DecompressATGlobal(u32 *result, u32 resultLength, const char *compressedData);
u8 *GetSiroPtr(struct OpenedFile *);
void NDS_DecompressRLE(void *);
@@ -203,7 +216,1419 @@ void nullsub_175(void)
{
}
-u32 sub_800AAA8(u32 r0, u32 r1, struct UnkFileStruct1 *r2)
+u32 DecompressATFile(char *result, u32 resultLength, struct OpenedFile *file)
+{
+ return DecompressAT(result, resultLength, file->data);
+}
+
+// 800AAB4
+#ifndef NONMATCHING
+NAKED
+#endif
+u32 DecompressAT(char *result, u32 resultLength, const char *compressedData)
+{
+#ifdef NONMATCHING
+
+ // This function is an absolute mess, the compiler does some extremely weird things
+ // which makes matching it difficult.
+
+ // As-is, it's likely that this implementation is nonfunctional
+ // as I've shuffled things around a lot while trying to make some parts match.
+
+ int flags1;
+ int flags2;
+ int flags3;
+ int flags4;
+ int flags5;
+ int flags6;
+ int flags7;
+ int flags8;
+ int flags9;
+ int compressedLength;
+ char c10;
+ char c11;
+ u32 curIndex;
+ int v12;
+ char c13;
+ const char *p;
+ int command;
+ int resultIndex;
+ int v16;
+ int cmdBit;
+ int currentByte;
+
+ compressedLength = compressedData[5] + (compressedData[6] << 8);
+ resultIndex = 0;
+ currentByte = 0;
+ cmdBit = 8;
+
+ if (compressedData[0] == 'A'
+ && compressedData[1] == 'T'
+ && compressedData[2] == '4'
+ && compressedData[3] == 'P') {
+ if (resultLength != compressedData[0x10] + (compressedData[0x11] << 8) && resultLength != 0)
+ return 0;
+ curIndex = 0x12;
+ } else if (compressedData[0] == 'A'
+ && compressedData[1] == 'T'
+ && compressedData[2] == '3'
+ && compressedData[3] == 'P') {
+ // Can't get this to match - compiler chooses beq, b pairs instead of bne
+ // I tried multiple if (... != 'x') return 0;
+ // I tried != chained with ||
+ // I tried == chained with &&
+ // I tried nested if (... == 'x')
+ // None of that produced matching code.
+ curIndex = 0x10;
+ } else {
+ return 0;
+ }
+
+ if (compressedData[5] == 'N') {
+ // uncompressed mode, unused
+ int i;
+ for (i = 0; i < compressedLength; i++)
+ result[i] = compressedData[i + 7];
+ return i;
+ }
+
+ flags1 = compressedData[0x7] + 3;
+ flags2 = compressedData[0x8] + 3;
+ flags3 = compressedData[0x9] + 3;
+ flags4 = compressedData[0xa] + 3;
+ flags5 = compressedData[0xb] + 3;
+ flags6 = compressedData[0xc] + 3;
+ flags7 = compressedData[0xd] + 3;
+ flags8 = compressedData[0xe] + 3;
+ flags9 = compressedData[0xf] + 3;
+
+ // Some mismatches regarding the signedness of these two conditionals, extremely fragile
+ if (curIndex < compressedLength) {
+ while (resultLength == 0 || resultIndex < resultLength) {
+ if (cmdBit == 8) {
+ currentByte = compressedData[curIndex++];
+ cmdBit = 0;
+ }
+ if (currentByte & 0x80) { // some weird reordering happens here, couldn't figure it out
+ result[resultIndex++] = compressedData[curIndex++];
+ goto end_800AE08;
+ }
+ p = &compressedData[curIndex];
+ command = (*p >> 4) + 3;
+ if (command == flags1) command = 0x1f;
+ if (command == flags2) command = 0x1e;
+ if (command == flags3) command = 0x1d;
+ if (command == flags4) command = 0x1c;
+ if (command == flags5) command = 0x1b;
+ if (command == flags6) command = 0x1a;
+ if (command == flags7) command = 0x19;
+ if (command == flags8) command = 0x18;
+ if (command == flags9) command = 0x17;
+
+ switch (command) {
+ case 0x1f:
+ c10 = *p & 0xf;
+ c10 = c10 | (c10 << 4);
+ result[resultIndex++] = c10;
+ result[resultIndex++] = c10;
+ curIndex++;
+ // if curIndex is incremented inside each case, the compiler leaves them inside, but if curIndex is moved after the switch
+ // then it moves the second result assignment (just the 'strb' instruction) after the switch.
+ // Can't figure out how to make the compiler move only one without the other.
+ break;
+ case 0x1e:
+ v12 = *p & 0xf;
+ v12 = (v12 + 1) & 0xf;
+ c10 = v12;
+ result[resultIndex++] = ((*p & 0xf) << 4) | c10;
+ result[resultIndex++] = (v12 << 4) | c10;
+ curIndex++;
+ break;
+ case 0x1d:
+ c11 = *p & 0xf;
+ c10 = c11 << 4;
+ result[resultIndex++] = ((c11 - 1) & 0xf) | c10;
+ result[resultIndex++] = c10 | c11;
+ curIndex++;
+ break;
+ case 0x1c:
+ v12 = *p & 0xf;
+ c10 = v12;
+ result[resultIndex++] = (v12 << 4) | c10;
+ result[resultIndex++] = ((v12 & 0xf) << 4) | c10;
+ v12--;
+ curIndex++;
+ break;
+ case 0x1b:
+ c10 = *p;
+ c11 = c10 & 0xf;
+ c13 = c11 << 4;
+ result[resultIndex++] = c13 | c11;
+ c10 = (c10 & 0xf) - 1;
+ result[resultIndex++] = c13 | (c10 & 0xf);
+ curIndex++;
+ break;
+ case 0x1a:
+ v12 = ((*p & 0xf) - 1) & 0xf;
+ c10 = v12;
+ result[resultIndex++] = ((*p & 0xf) << 4) | c10;
+ result[resultIndex++] = (v12 << 4) | c10;
+ curIndex++;
+ break;
+ case 0x19:
+ c11 = *p & 0xf;
+ c10 = c11 << 4;
+ result[resultIndex++] = ((c11 + 1) & 0xf) | c10;
+ result[resultIndex++] = c10 | c11;
+ curIndex++;
+ break;
+ case 0x18:
+ v12 = *p & 0xf;
+ c10 = v12;
+ result[resultIndex++] = (v12 << 4) | c10;
+ v12++;
+ curIndex++;
+ result[resultIndex++] = ((v12 & 0xf) << 4) | c10;
+ break;
+ case 0x17:
+ c10 = *p;
+ c11 = c10 & 0xf;
+ c13 = c11 << 4;
+ result[resultIndex++] = c11 | c13;
+ c10 = (c10 & 0xf) + 1;
+ result[resultIndex++] = c13 | (c10 & 0xf);
+ curIndex++;
+ break;
+ default:
+ v16 = curIndex + 1;
+ curIndex += 2;
+ v16 = ((*p & 0xf) << 8) + compressedData[v16] + (-0x1000) + resultIndex;
+ while (command) {
+ result[resultIndex++] = result[v16++];
+ command--;
+ }
+ break;
+ }
+end_800AE08:
+ cmdBit++;
+ currentByte <<= 1;
+ if (curIndex > compressedLength)
+ return resultIndex;
+ }
+ }
+
+ return 0;
+#else
+ asm_unified(
+ "DecompressAT:\n"
+ " push {r4-r7,lr}\n"
+ " mov r7, r10\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5-r7}\n"
+ " sub sp, 0x2C\n"
+ " mov r12, r0\n"
+ " str r1, [sp, 0x24]\n"
+ " mov r8, r2\n"
+ " ldrb r0, [r2, 0x5]\n"
+ " ldrb r1, [r2, 0x6]\n"
+ " lsls r1, 8\n"
+ " adds r0, r1\n"
+ " str r0, [sp, 0x28]\n"
+ " movs r6, 0\n"
+ " mov r10, r6\n"
+ " movs r0, 0x8\n"
+ " mov r9, r0\n"
+ " ldrb r0, [r2]\n"
+ " cmp r0, 0x41\n"
+ " bne _0800AB04\n"
+ " ldrb r0, [r2, 0x1]\n"
+ " adds r1, r0, 0\n"
+ " cmp r1, 0x54\n"
+ " bne _0800AB0C\n"
+ " ldrb r0, [r2, 0x2]\n"
+ " cmp r0, 0x34\n"
+ " bne _0800AB0C\n"
+ " ldrb r0, [r2, 0x3]\n"
+ " cmp r0, 0x50\n"
+ " bne _0800AB0C\n"
+ " ldrb r1, [r2, 0x10]\n"
+ " ldrb r0, [r2, 0x11]\n"
+ " lsls r0, 8\n"
+ " adds r1, r0\n"
+ " ldr r2, [sp, 0x24]\n"
+ " cmp r2, 0\n"
+ " beq _0800AB08\n"
+ " cmp r2, r1\n"
+ " beq _0800AB08\n"
+ "_0800AB04:\n"
+ " movs r0, 0\n"
+ " b _0800AE16\n"
+ "_0800AB08:\n"
+ " movs r1, 0x12\n"
+ " b _0800AB26\n"
+ "_0800AB0C:\n"
+ " mov r3, r8\n"
+ " ldrb r0, [r3]\n"
+ " cmp r0, 0x41\n"
+ " bne _0800AB04\n"
+ " cmp r1, 0x54\n"
+ " bne _0800AB04\n"
+ " ldrb r0, [r3, 0x2]\n"
+ " cmp r0, 0x33\n"
+ " bne _0800AB04\n"
+ " ldrb r0, [r3, 0x3]\n"
+ " cmp r0, 0x50\n"
+ " bne _0800AB04\n"
+ " movs r1, 0x10\n"
+ "_0800AB26:\n"
+ " mov r2, r8\n"
+ " ldrb r0, [r2, 0x4]\n"
+ " cmp r0, 0x4E\n"
+ " bne _0800AB4A\n"
+ " movs r7, 0\n"
+ " b _0800AB40\n"
+ "_0800AB32:\n"
+ " mov r1, r12\n"
+ " adds r0, r1, r7\n"
+ " mov r2, r8\n"
+ " adds r1, r7, r2\n"
+ " ldrb r1, [r1, 0x7]\n"
+ " strb r1, [r0]\n"
+ " adds r7, 0x1\n"
+ "_0800AB40:\n"
+ " ldr r3, [sp, 0x28]\n"
+ " cmp r7, r3\n"
+ " blt _0800AB32\n"
+ " adds r0, r7, 0\n"
+ " b _0800AE16\n"
+ "_0800AB4A:\n"
+ " mov r2, r8\n"
+ " ldrb r0, [r2, 0x7]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp]\n"
+ " ldrb r0, [r2, 0x8]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x4]\n"
+ " ldrb r0, [r2, 0x9]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x8]\n"
+ " ldrb r0, [r2, 0xA]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0xC]\n"
+ " ldrb r0, [r2, 0xB]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x10]\n"
+ " ldrb r0, [r2, 0xC]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x14]\n"
+ " ldrb r0, [r2, 0xD]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x18]\n"
+ " ldrb r0, [r2, 0xE]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x1C]\n"
+ " ldrb r0, [r2, 0xF]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x20]\n"
+ " adds r7, r1, 0\n"
+ " ldr r3, [sp, 0x28]\n"
+ " cmp r7, r3\n"
+ " blt _0800AB8C\n"
+ " b _0800AE14\n"
+ "_0800AB8C:\n"
+ " ldr r0, [sp, 0x24]\n"
+ " cmp r0, 0\n"
+ " beq _0800AB96\n"
+ " cmp r6, r0\n"
+ " bge _0800AB04\n"
+ "_0800AB96:\n"
+ " mov r1, r9\n"
+ " cmp r1, 0x8\n"
+ " bne _0800ABAA\n"
+ " mov r2, r8\n"
+ " adds r0, r2, r7\n"
+ " ldrb r0, [r0]\n"
+ " mov r10, r0\n"
+ " adds r7, 0x1\n"
+ " movs r3, 0\n"
+ " mov r9, r3\n"
+ "_0800ABAA:\n"
+ " movs r0, 0x80\n"
+ " mov r1, r10\n"
+ " ands r0, r1\n"
+ " cmp r0, 0\n"
+ " beq _0800ABB6\n"
+ " b _0800ADF0\n"
+ "_0800ABB6:\n"
+ " mov r3, r8\n"
+ " adds r2, r3, r7\n"
+ " ldrb r1, [r2]\n"
+ " lsrs r0, r1, 4\n"
+ " adds r3, r0, 0x3\n"
+ " movs r0, 0xF\n"
+ " ands r0, r1\n"
+ " lsls r5, r0, 8\n"
+ " ldr r0, [sp]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABCE\n"
+ " movs r3, 0x1F\n"
+ "_0800ABCE:\n"
+ " ldr r0, [sp, 0x4]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABD6\n"
+ " movs r3, 0x1E\n"
+ "_0800ABD6:\n"
+ " ldr r0, [sp, 0x8]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABDE\n"
+ " movs r3, 0x1D\n"
+ "_0800ABDE:\n"
+ " ldr r0, [sp, 0xC]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABE6\n"
+ " movs r3, 0x1C\n"
+ "_0800ABE6:\n"
+ " ldr r0, [sp, 0x10]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABEE\n"
+ " movs r3, 0x1B\n"
+ "_0800ABEE:\n"
+ " ldr r0, [sp, 0x14]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABF6\n"
+ " movs r3, 0x1A\n"
+ "_0800ABF6:\n"
+ " ldr r0, [sp, 0x18]\n"
+ " cmp r3, r0\n"
+ " bne _0800ABFE\n"
+ " movs r3, 0x19\n"
+ "_0800ABFE:\n"
+ " ldr r0, [sp, 0x1C]\n"
+ " cmp r3, r0\n"
+ " bne _0800AC06\n"
+ " movs r3, 0x18\n"
+ "_0800AC06:\n"
+ " ldr r0, [sp, 0x20]\n"
+ " cmp r3, r0\n"
+ " bne _0800AC0E\n"
+ " movs r3, 0x17\n"
+ "_0800AC0E:\n"
+ " adds r0, r3, 0\n"
+ " subs r0, 0x17\n"
+ " cmp r0, 0x8\n"
+ " bls _0800AC18\n"
+ " b _0800ADB0\n"
+ "_0800AC18:\n"
+ " lsls r0, 2\n"
+ " ldr r1, _0800AC24\n"
+ " adds r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ " .align 2, 0\n"
+ "_0800AC24: .4byte _0800AC28\n"
+ " .align 2, 0\n"
+ "_0800AC28:\n"
+ " .4byte _0800AD7C\n"
+ " .4byte _0800AD48\n"
+ " .4byte _0800AD20\n"
+ " .4byte _0800ACFA\n"
+ " .4byte _0800ACD6\n"
+ " .4byte _0800ACB4\n"
+ " .4byte _0800AC8C\n"
+ " .4byte _0800AC66\n"
+ " .4byte _0800AC4C\n"
+ "_0800AC4C:\n"
+ " ldrb r1, [r2]\n"
+ " movs r0, 0xF\n"
+ " adds r7, 0x1\n"
+ " mov r3, r12\n"
+ " adds r2, r3, r6\n"
+ " ands r0, r1\n"
+ " lsls r1, r0, 4\n"
+ " orrs r1, r0\n"
+ " strb r1, [r2]\n"
+ " adds r6, 0x1\n"
+ " adds r0, r3, r6\n"
+ " strb r1, [r0]\n"
+ " b _0800ADA4\n"
+ "_0800AC66:\n"
+ " ldrb r0, [r2]\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r1, r12\n"
+ " adds r3, r1, r6\n"
+ " movs r2, 0xF\n"
+ " lsls r0, r5, 4\n"
+ " adds r1, r5, 0x1\n"
+ " ands r1, r2\n"
+ " orrs r0, r1\n"
+ " strb r0, [r3]\n"
+ " adds r6, 0x1\n"
+ " mov r3, r12\n"
+ " adds r2, r3, r6\n"
+ " lsls r0, r1, 4\n"
+ " orrs r0, r1\n"
+ " strb r0, [r2]\n"
+ " b _0800ADA4\n"
+ "_0800AC8C:\n"
+ " ldrb r0, [r2]\n"
+ " movs r3, 0xF\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r1, r12\n"
+ " adds r4, r1, r6\n"
+ " adds r2, r5, 0\n"
+ " ands r2, r3\n"
+ " lsls r1, r2, 4\n"
+ " subs r0, r5, 0x1\n"
+ " ands r0, r3\n"
+ " orrs r0, r1\n"
+ " strb r0, [r4]\n"
+ " adds r6, 0x1\n"
+ " mov r3, r12\n"
+ " adds r0, r3, r6\n"
+ " orrs r1, r2\n"
+ " strb r1, [r0]\n"
+ " b _0800ADA4\n"
+ "_0800ACB4:\n"
+ " ldrb r0, [r2]\n"
+ " movs r3, 0xF\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r1, r12\n"
+ " adds r2, r1, r6\n"
+ " adds r1, r5, 0\n"
+ " ands r1, r3\n"
+ " lsls r0, r1, 4\n"
+ " orrs r0, r1\n"
+ " strb r0, [r2]\n"
+ " adds r6, 0x1\n"
+ " mov r0, r12\n"
+ " adds r2, r0, r6\n"
+ " subs r0, r5, 0x1\n"
+ " b _0800AD68\n"
+ "_0800ACD6:\n"
+ " ldrb r0, [r2]\n"
+ " movs r4, 0xF\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r2, r12\n"
+ " adds r3, r2, r6\n"
+ " adds r1, r5, 0\n"
+ " ands r1, r4\n"
+ " lsls r2, r1, 4\n"
+ " adds r0, r2, 0\n"
+ " orrs r0, r1\n"
+ " strb r0, [r3]\n"
+ " adds r6, 0x1\n"
+ " mov r3, r12\n"
+ " adds r1, r3, r6\n"
+ " subs r0, r5, 0x1\n"
+ " b _0800AD9E\n"
+ "_0800ACFA:\n"
+ " ldrb r0, [r2]\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r1, r12\n"
+ " adds r3, r1, r6\n"
+ " movs r2, 0xF\n"
+ " lsls r0, r5, 4\n"
+ " subs r1, r5, 0x1\n"
+ " ands r1, r2\n"
+ " orrs r0, r1\n"
+ " strb r0, [r3]\n"
+ " adds r6, 0x1\n"
+ " mov r3, r12\n"
+ " adds r2, r3, r6\n"
+ " lsls r0, r1, 4\n"
+ " orrs r0, r1\n"
+ " strb r0, [r2]\n"
+ " b _0800ADA4\n"
+ "_0800AD20:\n"
+ " ldrb r0, [r2]\n"
+ " movs r3, 0xF\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r1, r12\n"
+ " adds r4, r1, r6\n"
+ " adds r2, r5, 0\n"
+ " ands r2, r3\n"
+ " lsls r1, r2, 4\n"
+ " adds r0, r5, 0x1\n"
+ " ands r0, r3\n"
+ " orrs r0, r1\n"
+ " strb r0, [r4]\n"
+ " adds r6, 0x1\n"
+ " mov r3, r12\n"
+ " adds r0, r3, r6\n"
+ " orrs r1, r2\n"
+ " strb r1, [r0]\n"
+ " b _0800ADA4\n"
+ "_0800AD48:\n"
+ " ldrb r0, [r2]\n"
+ " movs r3, 0xF\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r1, r12\n"
+ " adds r2, r1, r6\n"
+ " adds r1, r5, 0\n"
+ " ands r1, r3\n"
+ " lsls r0, r1, 4\n"
+ " orrs r0, r1\n"
+ " strb r0, [r2]\n"
+ " adds r6, 0x1\n"
+ " mov r0, r12\n"
+ " adds r2, r0, r6\n"
+ " adds r0, r5, 0x1\n"
+ "_0800AD68:\n"
+ " ands r0, r3\n"
+ " lsls r0, 4\n"
+ " orrs r0, r1\n"
+ " strb r0, [r2]\n"
+ " adds r6, 0x1\n"
+ " mov r4, r9\n"
+ " adds r4, 0x1\n"
+ " mov r1, r10\n"
+ " lsls r2, r1, 1\n"
+ " b _0800AE08\n"
+ "_0800AD7C:\n"
+ " ldrb r0, [r2]\n"
+ " movs r4, 0xF\n"
+ " movs r5, 0xF\n"
+ " ands r5, r0\n"
+ " adds r7, 0x1\n"
+ " mov r2, r12\n"
+ " adds r3, r2, r6\n"
+ " adds r1, r5, 0\n"
+ " ands r1, r4\n"
+ " lsls r2, r1, 4\n"
+ " adds r0, r2, 0\n"
+ " orrs r0, r1\n"
+ " strb r0, [r3]\n"
+ " adds r6, 0x1\n"
+ " mov r3, r12\n"
+ " adds r1, r3, r6\n"
+ " adds r0, r5, 0x1\n"
+ "_0800AD9E:\n"
+ " ands r0, r4\n"
+ " orrs r2, r0\n"
+ " strb r2, [r1]\n"
+ "_0800ADA4:\n"
+ " adds r6, 0x1\n"
+ " mov r4, r9\n"
+ " adds r4, 0x1\n"
+ " mov r0, r10\n"
+ " lsls r2, r0, 1\n"
+ " b _0800AE08\n"
+ "_0800ADB0:\n"
+ " adds r7, 0x1\n"
+ " mov r1, r8\n"
+ " adds r0, r1, r7\n"
+ " ldrb r0, [r0]\n"
+ " adds r5, r0\n"
+ " adds r7, 0x1\n"
+ " ldr r2, _0800ADEC\n"
+ " adds r0, r5, r2\n"
+ " adds r5, r0, r6\n"
+ " mov r4, r9\n"
+ " adds r4, 0x1\n"
+ " mov r0, r10\n"
+ " lsls r2, r0, 1\n"
+ " cmp r3, 0\n"
+ " beq _0800AE08\n"
+ "_0800ADCE:\n"
+ " mov r1, r12\n"
+ " adds r1, r6\n"
+ " mov r10, r1\n"
+ " mov r0, r12\n"
+ " adds r0, r5\n"
+ " ldrb r1, [r0]\n"
+ " mov r0, r10\n"
+ " strb r1, [r0]\n"
+ " adds r6, 0x1\n"
+ " adds r5, 0x1\n"
+ " subs r3, 0x1\n"
+ " cmp r3, 0\n"
+ " bne _0800ADCE\n"
+ " b _0800AE08\n"
+ " .align 2, 0\n"
+ "_0800ADEC: .4byte 0xfffff000\n"
+ "_0800ADF0:\n"
+ " mov r1, r12\n"
+ " adds r0, r1, r6\n"
+ " mov r2, r8\n"
+ " adds r1, r2, r7\n"
+ " ldrb r1, [r1]\n"
+ " strb r1, [r0]\n"
+ " adds r6, 0x1\n"
+ " adds r7, 0x1\n"
+ " mov r4, r9\n"
+ " adds r4, 0x1\n"
+ " mov r3, r10\n"
+ " lsls r2, r3, 1\n"
+ "_0800AE08:\n"
+ " mov r9, r4\n"
+ " mov r10, r2\n"
+ " ldr r0, [sp, 0x28]\n"
+ " cmp r7, r0\n"
+ " bge _0800AE14\n"
+ " b _0800AB8C\n"
+ "_0800AE14:\n"
+ " adds r0, r6, 0\n"
+ "_0800AE16:\n"
+ " add sp, 0x2C\n"
+ " pop {r3-r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov r10, r5\n"
+ " pop {r4-r7}\n"
+ " pop {r1}\n"
+ " bx r1");
+#endif
+}
+
+u32 DecompressATGlobalFile(u32 *result, u32 resultLength, struct OpenedFile *file)
+{
+ return DecompressATGlobal(result, resultLength, file->data);
+}
+
+// 800AE34
+#ifndef NONMATCHING
+NAKED
+#endif
+u32 DecompressATGlobal(u32 *result, u32 resultLength, const char *compressedData)
{
- return sub_800AAB4(r0, r1, r2->unk4);
+#ifdef NONMATCHING
+
+ // This function has the same issues as above, except is possibly a bit nicer due to the function calls
+ // I'd say this one is more likely to be at least correct
+
+ int flags1;
+ int flags2;
+ int flags3;
+ int flags4;
+ int flags5;
+ int flags6;
+ int flags7;
+ int flags8;
+ int flags9;
+ int compressedLength;
+ u32 c10;
+ char c11;
+ u32 curIndex;
+ const char *p;
+ int command;
+ int bytesWritten;
+ int v16;
+ int cmdBit;
+ int currentByte;
+
+ compressedLength = compressedData[5] + (compressedData[6] << 8);
+ bytesWritten = 0;
+ currentByte = 0;
+ cmdBit = 8;
+
+ DecompressAT_Init(result);
+
+ if (compressedData[0] == 'A'
+ && compressedData[1] == 'T'
+ && compressedData[2] == '4'
+ && compressedData[3] == 'P') {
+ if (resultLength != compressedData[0x10] + (compressedData[0x11] << 8) && resultLength != 0)
+ return 0;
+ curIndex = 0x12;
+ } else if (compressedData[0] == 'A'
+ && compressedData[1] == 'T'
+ && compressedData[2] == '3'
+ && compressedData[3] == 'P') {
+ curIndex = 0x10;
+ } else {
+ return 0;
+ }
+
+ if (compressedData[5] == 'N') {
+ // uncompressed mode, unused
+ int i;
+ for (i = 0; i < compressedLength; i++)
+ DecompressAT_AppendByte(compressedData[i + 7]);
+ DecompressAT_Finish();
+ return i;
+ }
+
+ flags1 = compressedData[0x7] + 3;
+ flags2 = compressedData[0x8] + 3;
+ flags3 = compressedData[0x9] + 3;
+ flags4 = compressedData[0xa] + 3;
+ flags5 = compressedData[0xb] + 3;
+ flags6 = compressedData[0xc] + 3;
+ flags7 = compressedData[0xd] + 3;
+ flags8 = compressedData[0xe] + 3;
+ flags9 = compressedData[0xf] + 3;
+
+ // Some mismatches regarding the signedness of these two conditionals, extremely fragile
+ if (curIndex < compressedLength) {
+ while (resultLength == 0 || bytesWritten < resultLength) {
+ if (cmdBit == 8) {
+ currentByte = compressedData[curIndex++];
+ cmdBit = 0;
+ }
+ if (currentByte & 0x80) { // some weird reordering happens here, couldn't figure it out
+ DecompressAT_AppendByte(compressedData[curIndex++]);
+ goto end_800B198;
+ }
+ p = &compressedData[curIndex];
+ command = (*p >> 4) + 3;
+ if (command == flags1) command = 0x1f;
+ if (command == flags2) command = 0x1e;
+ if (command == flags3) command = 0x1d;
+ if (command == flags4) command = 0x1c;
+ if (command == flags5) command = 0x1b;
+ if (command == flags6) command = 0x1a;
+ if (command == flags7) command = 0x19;
+ if (command == flags8) command = 0x18;
+ if (command == flags9) command = 0x17;
+
+ switch (command) {
+ case 0x1f:
+ c10 = *p & 0xf;
+ c10 = c10 | (c10 << 4);
+ DecompressAT_AppendByte(c10);
+ break;
+ case 0x1e:
+ c10 = ((*p & 0xf) + 1) & 0xf;
+ DecompressAT_AppendByte(((*p & 0xf) << 4) | c10);
+ c10 |= c10 << 4;
+ break;
+ case 0x1d:
+ c10 = *p & 0xf;
+ DecompressAT_AppendByte(((c10 - 1) & 0xf) | (c10 << 4));
+ c10 |= c10 << 4;
+ break;
+ case 0x1c:
+ c10 = *p & 0xf;
+ DecompressAT_AppendByte((c10 << 4) | c10);
+ c10 |= ((c10 - 1) & 0xf) << 4;
+ break;
+ case 0x1b:
+ c11 = *p & 0xf;
+ c10 = c11 << 4;
+ DecompressAT_AppendByte(c10 | c11);
+ c11--;
+ c10 |= c11 & 0xf;
+ break;
+ case 0x1a:
+ c10 = ((*p & 0xf) - 1) & 0xf;
+ DecompressAT_AppendByte(((*p & 0xf) << 4) | c10);
+ c10 |= c10 << 4;
+ break;
+ case 0x19:
+ c10 = *p & 0xf;
+ DecompressAT_AppendByte(((c10 + 1) & 0xf) | (c10 << 4));
+ c10 |= c10 << 4;
+ break;
+ case 0x18:
+ c10 = *p & 0xf;
+ DecompressAT_AppendByte((c10 << 4) | c10);
+ c10 |= ((c10 + 1) & 0xf) << 4;
+ break;
+ case 0x17:
+ c11 = *p & 0xf;
+ c10 = c11 << 4;
+ DecompressAT_AppendByte(c10 | c11);
+ c11++;
+ c10 |= c11 & 0xf;
+ break;
+ default:
+ v16 = curIndex + 1;
+ curIndex += 2;
+ v16 = ((*p & 0xf) << 8) + compressedData[v16] + (-0x1000) + bytesWritten;
+ while (command) {
+ char c = DecompressAT_GetByte(v16);
+ DecompressAT_AppendByte(c);
+ bytesWritten++;
+ v16++;
+ command--;
+ }
+ goto end_800B198;
+ }
+ curIndex++;
+ DecompressAT_AppendByte(c10);
+ bytesWritten += 2;
+end_800B198:
+ cmdBit++;
+ currentByte <<= 1;
+ if (curIndex > compressedLength)
+ break;
+ }
+ DecompressAT_Finish();
+ return bytesWritten;
+ }
+
+ return 0;
+#else
+ asm_unified(
+ "DecompressATGlobal:\n"
+ " push {r4-r7,lr}\n"
+ " mov r7, r10\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5-r7}\n"
+ " sub sp, 0x34\n"
+ " str r1, [sp, 0x24]\n"
+ " mov r10, r2\n"
+ " ldrb r2, [r2, 0x5]\n"
+ " mov r3, r10\n"
+ " ldrb r1, [r3, 0x6]\n"
+ " lsls r1, 8\n"
+ " adds r2, r1\n"
+ " str r2, [sp, 0x28]\n"
+ " movs r1, 0\n"
+ " mov r9, r1\n"
+ " movs r2, 0\n"
+ " str r2, [sp, 0x2C]\n"
+ " movs r3, 0x8\n"
+ " str r3, [sp, 0x30]\n"
+ " bl DecompressAT_Init\n"
+ " mov r1, r10\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, 0x41\n"
+ " bne _0800AE90\n"
+ " ldrb r0, [r1, 0x1]\n"
+ " adds r1, r0, 0\n"
+ " cmp r1, 0x54\n"
+ " bne _0800AE98\n"
+ " mov r2, r10\n"
+ " ldrb r0, [r2, 0x2]\n"
+ " cmp r0, 0x34\n"
+ " bne _0800AE98\n"
+ " ldrb r0, [r2, 0x3]\n"
+ " cmp r0, 0x50\n"
+ " bne _0800AE98\n"
+ " ldrb r1, [r2, 0x10]\n"
+ " ldrb r0, [r2, 0x11]\n"
+ " lsls r0, 8\n"
+ " adds r1, r0\n"
+ " ldr r3, [sp, 0x24]\n"
+ " cmp r3, 0\n"
+ " beq _0800AE94\n"
+ " cmp r3, r1\n"
+ " beq _0800AE94\n"
+ "_0800AE90:\n"
+ " movs r0, 0\n"
+ " b _0800B1AA\n"
+ "_0800AE94:\n"
+ " movs r1, 0x12\n"
+ " b _0800AEB2\n"
+ "_0800AE98:\n"
+ " mov r2, r10\n"
+ " ldrb r0, [r2]\n"
+ " cmp r0, 0x41\n"
+ " bne _0800AE90\n"
+ " cmp r1, 0x54\n"
+ " bne _0800AE90\n"
+ " ldrb r0, [r2, 0x2]\n"
+ " cmp r0, 0x33\n"
+ " bne _0800AE90\n"
+ " ldrb r0, [r2, 0x3]\n"
+ " cmp r0, 0x50\n"
+ " bne _0800AE90\n"
+ " movs r1, 0x10\n"
+ "_0800AEB2:\n"
+ " mov r3, r10\n"
+ " ldrb r0, [r3, 0x4]\n"
+ " cmp r0, 0x4E\n"
+ " bne _0800AEE0\n"
+ " movs r0, 0\n"
+ " mov r8, r0\n"
+ " ldr r1, [sp, 0x28]\n"
+ " cmp r8, r1\n"
+ " bge _0800AED8\n"
+ "_0800AEC4:\n"
+ " mov r0, r8\n"
+ " add r0, r10\n"
+ " ldrb r0, [r0, 0x7]\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " ldr r3, [sp, 0x28]\n"
+ " cmp r8, r3\n"
+ " blt _0800AEC4\n"
+ "_0800AED8:\n"
+ " bl DecompressAT_Finish\n"
+ " mov r0, r8\n"
+ " b _0800B1AA\n"
+ "_0800AEE0:\n"
+ " mov r2, r10\n"
+ " ldrb r0, [r2, 0x7]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp]\n"
+ " ldrb r0, [r2, 0x8]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x4]\n"
+ " ldrb r0, [r2, 0x9]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x8]\n"
+ " ldrb r0, [r2, 0xA]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0xC]\n"
+ " ldrb r0, [r2, 0xB]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x10]\n"
+ " ldrb r0, [r2, 0xC]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x14]\n"
+ " ldrb r0, [r2, 0xD]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x18]\n"
+ " ldrb r0, [r2, 0xE]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x1C]\n"
+ " ldrb r0, [r2, 0xF]\n"
+ " adds r0, 0x3\n"
+ " str r0, [sp, 0x20]\n"
+ " mov r8, r1\n"
+ " ldr r3, [sp, 0x28]\n"
+ " cmp r8, r3\n"
+ " blt _0800AF22\n"
+ " b _0800B1A4\n"
+ "_0800AF22:\n"
+ " ldr r0, [sp, 0x24]\n"
+ " cmp r0, 0\n"
+ " beq _0800AF2C\n"
+ " cmp r9, r0\n"
+ " bge _0800AE90\n"
+ "_0800AF2C:\n"
+ " ldr r1, [sp, 0x30]\n"
+ " cmp r1, 0x8\n"
+ " bne _0800AF42\n"
+ " mov r0, r10\n"
+ " add r0, r8\n"
+ " ldrb r0, [r0]\n"
+ " str r0, [sp, 0x2C]\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " movs r3, 0\n"
+ " str r3, [sp, 0x30]\n"
+ "_0800AF42:\n"
+ " movs r0, 0x80\n"
+ " ldr r1, [sp, 0x2C]\n"
+ " ands r0, r1\n"
+ " cmp r0, 0\n"
+ " beq _0800AF4E\n"
+ " b _0800B180\n"
+ "_0800AF4E:\n"
+ " mov r2, r10\n"
+ " add r2, r8\n"
+ " ldrb r1, [r2]\n"
+ " lsrs r0, r1, 4\n"
+ " adds r3, r0, 0x3\n"
+ " movs r0, 0xF\n"
+ " ands r0, r1\n"
+ " lsls r7, r0, 8\n"
+ " ldr r0, [sp]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF66\n"
+ " movs r3, 0x1F\n"
+ "_0800AF66:\n"
+ " ldr r0, [sp, 0x4]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF6E\n"
+ " movs r3, 0x1E\n"
+ "_0800AF6E:\n"
+ " ldr r0, [sp, 0x8]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF76\n"
+ " movs r3, 0x1D\n"
+ "_0800AF76:\n"
+ " ldr r0, [sp, 0xC]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF7E\n"
+ " movs r3, 0x1C\n"
+ "_0800AF7E:\n"
+ " ldr r0, [sp, 0x10]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF86\n"
+ " movs r3, 0x1B\n"
+ "_0800AF86:\n"
+ " ldr r0, [sp, 0x14]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF8E\n"
+ " movs r3, 0x1A\n"
+ "_0800AF8E:\n"
+ " ldr r0, [sp, 0x18]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF96\n"
+ " movs r3, 0x19\n"
+ "_0800AF96:\n"
+ " ldr r0, [sp, 0x1C]\n"
+ " cmp r3, r0\n"
+ " bne _0800AF9E\n"
+ " movs r3, 0x18\n"
+ "_0800AF9E:\n"
+ " ldr r0, [sp, 0x20]\n"
+ " cmp r3, r0\n"
+ " bne _0800AFA6\n"
+ " movs r3, 0x17\n"
+ "_0800AFA6:\n"
+ " adds r0, r3, 0\n"
+ " subs r0, 0x17\n"
+ " cmp r0, 0x8\n"
+ " bls _0800AFB0\n"
+ " b _0800B13C\n"
+ "_0800AFB0:\n"
+ " lsls r0, 2\n"
+ " ldr r1, _0800AFBC\n"
+ " adds r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ " .align 2, 0\n"
+ "_0800AFBC: .4byte _0800AFC0\n"
+ " .align 2, 0\n"
+ "_0800AFC0:\n"
+ " .4byte _0800B104\n"
+ " .4byte _0800B0DE\n"
+ " .4byte _0800B0BA\n"
+ " .4byte _0800B090\n"
+ " .4byte _0800B06E\n"
+ " .4byte _0800B048\n"
+ " .4byte _0800B024\n"
+ " .4byte _0800AFFE\n"
+ " .4byte _0800AFE4\n"
+ "_0800AFE4:\n"
+ " ldrb r0, [r2]\n"
+ " movs r1, 0xF\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " ands r1, r0\n"
+ " lsls r4, r1, 4\n"
+ " orrs r4, r1\n"
+ " adds r0, r4, 0\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " b _0800B128\n"
+ "_0800AFFE:\n"
+ " ldrb r0, [r2]\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " movs r1, 0xF\n"
+ " lsls r0, r6, 4\n"
+ " adds r4, r6, 0x1\n"
+ " ands r4, r1\n"
+ " orrs r0, r4\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " lsls r0, r4, 4\n"
+ " orrs r0, r4\n"
+ " lsls r0, 24\n"
+ " lsrs r0, 24\n"
+ " b _0800B12A\n"
+ "_0800B024:\n"
+ " ldrb r0, [r2]\n"
+ " movs r1, 0xF\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " adds r5, r6, 0\n"
+ " ands r5, r1\n"
+ " lsls r4, r5, 4\n"
+ " subs r0, r6, 0x1\n"
+ " ands r0, r1\n"
+ " orrs r0, r4\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " orrs r4, r5\n"
+ " b _0800B128\n"
+ "_0800B048:\n"
+ " ldrb r0, [r2]\n"
+ " movs r5, 0xF\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " adds r4, r6, 0\n"
+ " ands r4, r5\n"
+ " lsls r0, r4, 4\n"
+ " orrs r0, r4\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " subs r0, r6, 0x1\n"
+ " ands r0, r5\n"
+ " lsls r0, 4\n"
+ " orrs r0, r4\n"
+ " b _0800B12A\n"
+ "_0800B06E:\n"
+ " ldrb r0, [r2]\n"
+ " movs r5, 0xF\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " adds r1, r6, 0\n"
+ " ands r1, r5\n"
+ " lsls r4, r1, 4\n"
+ " adds r0, r4, 0\n"
+ " orrs r0, r1\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " subs r0, r6, 0x1\n"
+ " b _0800B124\n"
+ "_0800B090:\n"
+ " ldrb r0, [r2]\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " movs r1, 0xF\n"
+ " lsls r0, r6, 4\n"
+ " subs r4, r6, 0x1\n"
+ " ands r4, r1\n"
+ " orrs r0, r4\n"
+ " lsls r0, 24\n"
+ " lsrs r0, 24\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " lsls r0, r4, 4\n"
+ " orrs r0, r4\n"
+ " lsls r0, 24\n"
+ " lsrs r0, 24\n"
+ " b _0800B12A\n"
+ "_0800B0BA:\n"
+ " ldrb r0, [r2]\n"
+ " movs r1, 0xF\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " adds r5, r6, 0\n"
+ " ands r5, r1\n"
+ " lsls r4, r5, 4\n"
+ " adds r0, r6, 0x1\n"
+ " ands r0, r1\n"
+ " orrs r0, r4\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " orrs r4, r5\n"
+ " b _0800B128\n"
+ "_0800B0DE:\n"
+ " ldrb r0, [r2]\n"
+ " movs r5, 0xF\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " adds r4, r6, 0\n"
+ " ands r4, r5\n"
+ " lsls r0, r4, 4\n"
+ " orrs r0, r4\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " adds r0, r6, 0x1\n"
+ " ands r0, r5\n"
+ " lsls r0, 4\n"
+ " orrs r0, r4\n"
+ " b _0800B12A\n"
+ "_0800B104:\n"
+ " ldrb r0, [r2]\n"
+ " movs r5, 0xF\n"
+ " movs r6, 0xF\n"
+ " ands r6, r0\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " adds r1, r6, 0\n"
+ " ands r1, r5\n"
+ " lsls r4, r1, 4\n"
+ " adds r0, r4, 0\n"
+ " orrs r0, r1\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r3, 0x1\n"
+ " add r9, r3\n"
+ " adds r0, r6, 0x1\n"
+ "_0800B124:\n"
+ " ands r0, r5\n"
+ " orrs r4, r0\n"
+ "_0800B128:\n"
+ " adds r0, r4, 0\n"
+ "_0800B12A:\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r0, 0x1\n"
+ " add r9, r0\n"
+ " ldr r5, [sp, 0x30]\n"
+ " adds r5, 0x1\n"
+ " ldr r1, [sp, 0x2C]\n"
+ " lsls r4, r1, 1\n"
+ " b _0800B198\n"
+ "_0800B13C:\n"
+ " movs r2, 0x1\n"
+ " add r8, r2\n"
+ " mov r0, r10\n"
+ " add r0, r8\n"
+ " ldrb r0, [r0]\n"
+ " adds r7, r0\n"
+ " add r8, r2\n"
+ " ldr r1, _0800B17C\n"
+ " adds r0, r7, r1\n"
+ " mov r2, r9\n"
+ " adds r7, r0, r2\n"
+ " ldr r5, [sp, 0x30]\n"
+ " adds r5, 0x1\n"
+ " ldr r0, [sp, 0x2C]\n"
+ " lsls r4, r0, 1\n"
+ " cmp r3, 0\n"
+ " beq _0800B198\n"
+ " adds r6, r3, 0\n"
+ "_0800B160:\n"
+ " adds r0, r7, 0\n"
+ " bl DecompressAT_GetByte\n"
+ " lsls r0, 24\n"
+ " lsrs r0, 24\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r1, 0x1\n"
+ " add r9, r1\n"
+ " adds r7, 0x1\n"
+ " subs r6, 0x1\n"
+ " cmp r6, 0\n"
+ " bne _0800B160\n"
+ " b _0800B198\n"
+ " .align 2, 0\n"
+ "_0800B17C: .4byte 0xfffff000\n"
+ "_0800B180:\n"
+ " mov r0, r10\n"
+ " add r0, r8\n"
+ " ldrb r0, [r0]\n"
+ " bl DecompressAT_AppendByte\n"
+ " movs r2, 0x1\n"
+ " add r9, r2\n"
+ " add r8, r2\n"
+ " ldr r5, [sp, 0x30]\n"
+ " adds r5, 0x1\n"
+ " ldr r3, [sp, 0x2C]\n"
+ " lsls r4, r3, 1\n"
+ "_0800B198:\n"
+ " str r5, [sp, 0x30]\n"
+ " str r4, [sp, 0x2C]\n"
+ " ldr r0, [sp, 0x28]\n"
+ " cmp r8, r0\n"
+ " bge _0800B1A4\n"
+ " b _0800AF22\n"
+ "_0800B1A4:\n"
+ " bl DecompressAT_Finish\n"
+ " mov r0, r9\n"
+ "_0800B1AA:\n"
+ " add sp, 0x34\n"
+ " pop {r3-r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov r10, r5\n"
+ " pop {r4-r7}\n"
+ " pop {r1}\n"
+ " bx r1");
+#endif
+}
+
+// 800B1BC
+void DecompressAT_Init(u32 *buffer) {
+ gDecompressBufferPtr = buffer;
+ gDecompressBufferStart = buffer;
+ gDecompressBufferCurrent = 0;
+ gDecompressBufferByteInInt = 0;
+}
+
+// 800B1E0
+#ifndef NONMATCHING
+NAKED
+#endif
+char DecompressAT_GetByte(int index) {
+#ifdef NONMATCHING
+ char result;
+ u32 data;
+ int offset;
+
+ offset = index < 0 ? index + 3 : index;
+
+ data = gDecompressBufferStart[offset >> 2];
+ // compiler inserts a ldrb here for some reason?
+ result = data;
+ index &= 3;
+ // Need to reorder these somehow to match
+ if (index == 1) result = data >> 8;
+ else if (index == 2) result = data >> 16;
+ else if (index == 3) return data >> 24;
+ return result;
+#else
+ asm_unified(
+ "DecompressAT_GetByte:\n"
+ " push {lr}\n"
+ " adds r2, r0, 0\n"
+ " cmp r2, 0\n"
+ " bge _0800B1EA\n"
+ " adds r0, r2, 0x3\n"
+ "_0800B1EA:\n"
+ " asrs r0, 2\n"
+ " ldr r1, _0800B20C\n"
+ " ldr r1, [r1]\n"
+ " lsls r0, 2\n"
+ " adds r0, r1\n"
+ " ldr r0, [r0]\n"
+ " movs r1, 0x3\n"
+ " ands r1, r2\n"
+ " cmp r1, 0x1\n"
+ " beq _0800B210\n"
+ " cmp r1, 0x1\n"
+ " ble _0800B216\n"
+ " cmp r1, 0x2\n"
+ " beq _0800B214\n"
+ " cmp r1, 0x3\n"
+ " beq _0800B218\n"
+ " b _0800B216\n"
+ " .align 2, 0\n"
+ "_0800B20C: .4byte gDecompressBufferStart\n"
+ "_0800B210:\n"
+ " lsrs r0, 8\n"
+ " b _0800B216\n"
+ "_0800B214:\n"
+ " lsrs r0, 16\n"
+ "_0800B216:\n"
+ " lsls r0, 24\n"
+ "_0800B218:\n"
+ " lsrs r0, 24\n"
+ " pop {r1}\n"
+ " bx r1");
+#endif
+}
+
+// 800B220
+void DecompressAT_AppendByte(char value) {
+ gDecompressBufferCurrent |= value << gByteShiftLookup[gDecompressBufferByteInInt];
+ *gDecompressBufferPtr = gDecompressBufferCurrent;
+ gDecompressBufferByteInInt++;
+ if (gDecompressBufferByteInInt == 4) {
+ gDecompressBufferPtr++;
+ gDecompressBufferCurrent = 0;
+ gDecompressBufferByteInInt = 0;
+ }
+}
+
+// 800B270
+void DecompressAT_Finish(void) {
+ if (gDecompressBufferByteInInt)
+ *gDecompressBufferPtr = gDecompressBufferCurrent;
}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 7050885..b3ce7fe 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -244,16 +244,16 @@ gUnknown_202D2A4 = .; /* 202D2A4 */
gFileCache = .; /* 202D2A8 */
. += 0x200;
-gUnknown_202D4A8 = .; /* 202D4A8 */
+gDecompressBufferPtr = .; /* 202D4A8 */
. += 0x4;
-gUnknown_202D4AC = .; /* 202D4AC */
+gDecompressBufferStart = .; /* 202D4AC */
. += 0x4;
-gUnknown_202D4B0 = .; /* 202D4B0 */
+gDecompressBufferCurrent = .; /* 202D4B0 */
. += 0x4;
-gUnknown_202D4B4 = .; /* 202D4B4 */
+gDecompressBufferByteInInt = .; /* 202D4B4 */
. += 0x4;
gUnknown_202D4B8 = .; /* 202D4B8 */