diff options
-rw-r--r-- | asm/code_2.s | 2 | ||||
-rw-r--r-- | asm/code_800AAA0.s | 1074 | ||||
-rw-r--r-- | asm/code_800D090.s | 8 | ||||
-rw-r--r-- | asm/code_8048480.s | 8 | ||||
-rw-r--r-- | asm/code_808DAB4.s | 2 | ||||
-rw-r--r-- | asm/code_80A7714.s | 8 | ||||
-rw-r--r-- | asm/text.s | 2 | ||||
-rw-r--r-- | data/data_80B9BB8.s | 13 | ||||
-rw-r--r-- | src/file_system.c | 1431 | ||||
-rw-r--r-- | sym_ewram.txt | 8 |
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: @@ -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 */ |