diff options
-rw-r--r-- | asm/intro.s | 479 | ||||
-rw-r--r-- | src/intro.c | 180 | ||||
-rw-r--r-- | sym_ewram.txt | 9 |
3 files changed, 179 insertions, 489 deletions
diff --git a/asm/intro.s b/asm/intro.s index ba8795a42..8e908cebe 100644 --- a/asm/intro.s +++ b/asm/intro.s @@ -5,485 +5,6 @@ .text - thumb_func_start sub_80ED4C0 -sub_80ED4C0: @ 80ED4C0 - push {r4,r5,lr} - sub sp, 0x4 - adds r5, r0, 0 - ldrb r4, [r5, 0x4] - cmp r4, 0x1 - beq _080ED59C - cmp r4, 0x1 - bgt _080ED4D6 - cmp r4, 0 - beq _080ED4E4 - b _080ED68A -_080ED4D6: - cmp r4, 0x2 - bne _080ED4DC - b _080ED5FC -_080ED4DC: - cmp r4, 0x3 - bne _080ED4E2 - b _080ED658 -_080ED4E2: - b _080ED68A -_080ED4E4: - ldr r0, _080ED584 @ =gUnknown_8407430 - movs r1, 0x10 - movs r2, 0x40 - bl LoadPalette - ldr r0, _080ED588 @ =gUnknown_8405DA4 - movs r1, 0x50 - movs r2, 0x20 - bl LoadPalette - movs r0, 0x2 - negs r0, r0 - ldr r2, _080ED58C @ =0x00007fff - movs r1, 0x10 - bl BlendPalettes - ldr r1, _080ED590 @ =gUnknown_840BBA0 - movs r0, 0 - movs r2, 0x2 - bl InitBgsFromTemplates - ldr r1, _080ED594 @ =gUnknown_8407470 - str r4, [sp] - movs r0, 0x1 - movs r2, 0 - movs r3, 0 - bl DecompressAndCopyTileDataToVram - ldr r1, _080ED598 @ =gUnknown_8407A50 - movs r0, 0x1 - str r0, [sp] - movs r2, 0 - movs r3, 0 - bl DecompressAndCopyTileDataToVram - movs r0, 0x1 - bl ShowBg - movs r0, 0 - bl HideBg - movs r0, 0x2 - bl HideBg - movs r0, 0x3 - bl HideBg - bl ResetBgPositions - ldrb r0, [r5, 0x4] - adds r0, 0x1 - strb r0, [r5, 0x4] - movs r1, 0x80 - lsls r1, 6 - movs r0, 0 - bl SetGpuRegBits - movs r0, 0x48 - movs r1, 0x12 - bl SetGpuRegBits - movs r0, 0x48 - movs r1, 0x1 - bl ClearGpuRegBits - movs r0, 0x4A - movs r1, 0 - bl SetGpuRegBits - movs r1, 0x82 - lsls r1, 6 - movs r0, 0x44 - bl SetGpuReg - movs r0, 0x40 - movs r1, 0x78 - bl SetGpuReg - b _080ED68A - .align 2, 0 -_080ED584: .4byte gUnknown_8407430 -_080ED588: .4byte gUnknown_8405DA4 -_080ED58C: .4byte 0x00007fff -_080ED590: .4byte gUnknown_840BBA0 -_080ED594: .4byte gUnknown_8407470 -_080ED598: .4byte gUnknown_8407A50 -_080ED59C: - bl FreeTempTileDataBuffersIfPossible - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _080ED68A - ldr r1, _080ED5EC @ =gUnknown_8407B9C - str r0, [sp] - movs r0, 0 - movs r2, 0 - movs r3, 0 - bl DecompressAndCopyTileDataToVram - ldr r1, _080ED5F0 @ =gUnknown_8408D98 - str r4, [sp] - movs r0, 0 - movs r2, 0 - movs r3, 0 - bl DecompressAndCopyTileDataToVram - ldr r1, _080ED5F4 @ =gUnknown_203AB00 - movs r0, 0x4 - strh r0, [r1] - ldr r1, _080ED5F8 @ =gUnknown_203AB02 - movs r0, 0x34 - strh r0, [r1] - movs r1, 0xC0 - lsls r1, 5 - movs r0, 0 - movs r2, 0 - bl ChangeBgX - movs r1, 0xF8 - lsls r1, 9 - movs r0, 0 - movs r2, 0 - bl ChangeBgY - b _080ED642 - .align 2, 0 -_080ED5EC: .4byte gUnknown_8407B9C -_080ED5F0: .4byte gUnknown_8408D98 -_080ED5F4: .4byte gUnknown_203AB00 -_080ED5F8: .4byte gUnknown_203AB02 -_080ED5FC: - bl FreeTempTileDataBuffersIfPossible - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _080ED68A - movs r0, 0x2 - negs r0, r0 - ldr r2, _080ED64C @ =0x00007fff - movs r1, 0 - bl BlendPalettes - movs r0, 0 - bl ShowBg - ldr r0, _080ED650 @ =sub_80ED714 - movs r1, 0 - bl CreateTask - adds r0, r5, 0 - bl sub_80EE4F8 - ldr r0, [r5, 0x18] - movs r1, 0 - movs r2, 0xB4 - movs r3, 0x34 - bl sub_80EE528 - ldr r0, _080ED654 @ =sub_80EE200 - movs r1, 0 - bl CreateTask - bl sub_80ED6D8 - strh r4, [r5, 0x12] -_080ED642: - ldrb r0, [r5, 0x4] - adds r0, 0x1 - strb r0, [r5, 0x4] - b _080ED68A - .align 2, 0 -_080ED64C: .4byte 0x00007fff -_080ED650: .4byte sub_80ED714 -_080ED654: .4byte sub_80EE200 -_080ED658: - ldrh r0, [r5, 0x12] - adds r0, 0x1 - strh r0, [r5, 0x12] - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x10 - bne _080ED66C - adds r0, r5, 0 - bl sub_80ED7D4 -_080ED66C: - adds r0, r5, 0 - bl sub_80EE5C8 - cmp r0, 0 - bne _080ED68A - ldr r0, _080ED694 @ =sub_80EE200 - bl FuncIsActiveTask - lsls r0, 24 - cmp r0, 0 - bne _080ED68A - ldr r1, _080ED698 @ =sub_80ED898 - adds r0, r5, 0 - bl sub_80ECAA8 -_080ED68A: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080ED694: .4byte sub_80EE200 -_080ED698: .4byte sub_80ED898 - thumb_func_end sub_80ED4C0 - - thumb_func_start sub_80ED69C -sub_80ED69C: @ 80ED69C - push {lr} - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080ED6C4 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r2, 0x8 - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _080ED6C8 - movs r1, 0x80 - lsls r1, 3 - movs r0, 0x1 - movs r2, 0x2 - bl ChangeBgX - b _080ED6D2 - .align 2, 0 -_080ED6C4: .4byte gTasks -_080ED6C8: - movs r0, 0x1 - movs r1, 0x20 - movs r2, 0x2 - bl ChangeBgX -_080ED6D2: - pop {r0} - bx r0 - thumb_func_end sub_80ED69C - - thumb_func_start sub_80ED6D8 -sub_80ED6D8: @ 80ED6D8 - push {lr} - ldr r0, _080ED6E8 @ =sub_80ED69C - movs r1, 0 - bl CreateTask - pop {r0} - bx r0 - .align 2, 0 -_080ED6E8: .4byte sub_80ED69C - thumb_func_end sub_80ED6D8 - - thumb_func_start sub_80ED6EC -sub_80ED6EC: @ 80ED6EC - push {lr} - ldr r0, _080ED70C @ =sub_80ED69C - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080ED710 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r0, 0x1 - strh r0, [r1, 0x8] - pop {r0} - bx r0 - .align 2, 0 -_080ED70C: .4byte sub_80ED69C -_080ED710: .4byte gTasks - thumb_func_end sub_80ED6EC - - thumb_func_start sub_80ED714 -sub_80ED714: @ 80ED714 - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _080ED75C @ =gTasks+0x8 - adds r2, r1, r0 - movs r0, 0 - ldrsh r1, [r2, r0] - cmp r1, 0 - bne _080ED758 - ldrh r0, [r2, 0x2] - adds r0, 0x1 - strh r0, [r2, 0x2] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x1D - ble _080ED758 - strh r1, [r2, 0x2] - ldrh r0, [r2, 0x4] - movs r1, 0x1 - eors r0, r1 - strh r0, [r2, 0x4] - movs r0, 0x4 - ldrsh r1, [r2, r0] - lsls r1, 15 - movs r0, 0xF8 - lsls r0, 9 - adds r1, r0 - movs r0, 0 - movs r2, 0 - bl ChangeBgY -_080ED758: - pop {r0} - bx r0 - .align 2, 0 -_080ED75C: .4byte gTasks+0x8 - thumb_func_end sub_80ED714 - - thumb_func_start sub_80ED760 -sub_80ED760: @ 80ED760 - push {lr} - ldr r0, _080ED780 @ =sub_80ED714 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080ED784 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r0, 0x1 - strh r0, [r1, 0x8] - pop {r0} - bx r0 - .align 2, 0 -_080ED780: .4byte sub_80ED714 -_080ED784: .4byte gTasks - thumb_func_end sub_80ED760 - - thumb_func_start sub_80ED788 -sub_80ED788: @ 80ED788 - push {lr} - ldr r0, _080ED7A8 @ =sub_80ED714 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080ED7AC @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r0, 0 - strh r0, [r1, 0x8] - pop {r0} - bx r0 - .align 2, 0 -_080ED7A8: .4byte sub_80ED714 -_080ED7AC: .4byte gTasks - thumb_func_end sub_80ED788 - - thumb_func_start sub_80ED7B0 -sub_80ED7B0: @ 80ED7B0 - push {lr} - ldr r0, _080ED7CC @ =sub_80ED714 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080ED7D0 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldrb r0, [r1, 0xC] - pop {r1} - bx r1 - .align 2, 0 -_080ED7CC: .4byte sub_80ED714 -_080ED7D0: .4byte gTasks - thumb_func_end sub_80ED7B0 - - thumb_func_start sub_80ED7D4 -sub_80ED7D4: @ 80ED7D4 - push {r4,lr} - adds r4, r0, 0 - ldr r0, _080ED800 @ =gUnknown_840BDFC - movs r1, 0x94 - lsls r1, 1 - movs r2, 0x70 - movs r3, 0x7 - bl CreateSprite - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _080ED80C - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080ED804 @ =gSprites - adds r0, r1 - str r0, [r4, 0x24] - ldr r1, _080ED808 @ =sub_80ED818 - str r1, [r0, 0x1C] - b _080ED810 - .align 2, 0 -_080ED800: .4byte gUnknown_840BDFC -_080ED804: .4byte gSprites -_080ED808: .4byte sub_80ED818 -_080ED80C: - movs r0, 0 - str r0, [r4, 0x24] -_080ED810: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80ED7D4 - - thumb_func_start sub_80ED818 -sub_80ED818: @ 80ED818 - push {r4,lr} - adds r2, r0, 0 - adds r4, r2, 0 - adds r4, 0x2E - movs r1, 0x2E - ldrsh r0, [r2, r1] - cmp r0, 0x1 - beq _080ED848 - cmp r0, 0x1 - bgt _080ED832 - cmp r0, 0 - beq _080ED838 - b _080ED892 -_080ED832: - cmp r0, 0x2 - beq _080ED866 - b _080ED892 -_080ED838: - ldrh r0, [r2, 0x20] - lsls r0, 5 - strh r0, [r4, 0x2] - movs r0, 0xA0 - strh r0, [r4, 0x4] - ldrh r0, [r2, 0x2E] - adds r0, 0x1 - strh r0, [r2, 0x2E] -_080ED848: - ldrh r0, [r4, 0x2] - ldrh r1, [r4, 0x4] - subs r0, r1 - strh r0, [r4, 0x2] - lsls r0, 16 - asrs r0, 21 - strh r0, [r2, 0x20] - cmp r0, 0x34 - bgt _080ED892 - bl sub_80ED6EC - ldrh r0, [r4] - adds r0, 0x1 - strh r0, [r4] - b _080ED892 -_080ED866: - ldrh r0, [r4, 0x2] - subs r0, 0x20 - strh r0, [r4, 0x2] - lsls r0, 16 - asrs r0, 21 - strh r0, [r2, 0x20] - movs r1, 0x20 - negs r1, r1 - cmp r0, r1 - bgt _080ED892 - adds r3, r2, 0 - adds r3, 0x3E - ldrb r0, [r3] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r3] - ldrh r0, [r2, 0x2E] - adds r0, 0x1 - strh r0, [r2, 0x2E] - adds r0, r2, 0 - bl DestroySprite -_080ED892: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80ED818 - thumb_func_start sub_80ED898 sub_80ED898: @ 80ED898 push {r4,r5,lr} diff --git a/src/intro.c b/src/intro.c index 25c2f59eb..b57b538f0 100644 --- a/src/intro.c +++ b/src/intro.c @@ -27,16 +27,19 @@ struct IntroSequenceData u8 field_000C[6]; u16 field_0012; struct Sprite * field_0014; - u8 filler_0018[4]; + struct Sprite * field_0018; struct Sprite * field_001C; struct Sprite * field_0020; - u8 filler_0024[0x18]; + struct Sprite * field_0024; + u8 filler_0028[0x14]; u8 field_003C[0x400]; u8 field_043C[0x400]; u8 filler_083C[0x2080]; }; // size: 0x28BC EWRAM_DATA struct GcmbStruct gUnknown_203AAD4 = {0}; +EWRAM_DATA u16 gUnknown_203AB00 = 0; +EWRAM_DATA u16 gUnknown_203AB02 = 0; void sub_80EC870(void); void sub_80EC9D4(void); @@ -60,12 +63,21 @@ void sub_80ED428(u8 taskId); void sub_80ED444(struct IntroSequenceData * ptr); void sub_80ED4A0(struct IntroSequenceData * ptr); void sub_80ED4C0(struct IntroSequenceData * ptr); +void sub_80ED6D8(void); +void sub_80ED714(u8 taskId); +void sub_80ED7D4(struct IntroSequenceData * ptr); +void sub_80ED818(struct Sprite * sprite); +void sub_80ED898(struct IntroSequenceData * ptr); void sub_80EDBE8(struct IntroSequenceData * ptr); void sub_80ED40C(u8 taskId); void sub_80EDC40(void); void sub_80EDDF0(void); void sub_80EDED8(void); struct Sprite * sub_80EDF68(void); +void sub_80EE200(u8 taskId); +void sub_80EE4F8(struct IntroSequenceData * ptr); +void sub_80EE528(struct Sprite * sprite, u16 a1, u16 a2, u16 a3); +bool32 sub_80EE5C8(struct IntroSequenceData * ptr); void sub_80EEBE4(void); extern const u32 gMultiBootProgram_PokemonColosseum_Start[]; @@ -96,14 +108,21 @@ extern const u8 gUnknown_840644C[]; extern const u16 gUnknown_8406634[]; extern const u8 gUnknown_8406654[]; extern const u8 gUnknown_84071D0[]; +extern const u16 gUnknown_8407430[]; +extern const u8 gUnknown_8407470[]; +extern const u8 gUnknown_8407A50[]; +extern const u8 gUnknown_8407B9C[]; +extern const u8 gUnknown_8408D98[]; extern const struct BgTemplate gUnknown_840BB80[2]; extern const struct BgTemplate gUnknown_840BB88[2]; extern const struct BgTemplate gUnknown_840BB90[4]; +extern const struct BgTemplate gUnknown_840BBA0[2]; extern const struct WindowTemplate gUnknown_840BBA8[]; extern const struct SpriteTemplate gUnknown_840BDA8; extern const struct SpriteTemplate gUnknown_840BDC0; +extern const struct SpriteTemplate gUnknown_840BDFC; void sub_80EC5A4(void) { @@ -736,3 +755,160 @@ void sub_80ED4A0(struct IntroSequenceData * this) if (this->field_0020 != NULL) DestroySprite(this->field_0020); } + +void sub_80ED4C0(struct IntroSequenceData * this) +{ + switch (this->field_0004) + { + case 0: + LoadPalette(gUnknown_8407430, 0x10, 0x40); + LoadPalette(gUnknown_8405DA4, 0x50, 0x20); + BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); + InitBgsFromTemplates(0, gUnknown_840BBA0, NELEMS(gUnknown_840BBA0)); + DecompressAndCopyTileDataToVram(1, gUnknown_8407470, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gUnknown_8407A50, 0, 0, 1); + ShowBg(1); + HideBg(0); + HideBg(2); + HideBg(3); + ResetBgPositions(); + this->field_0004++; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuRegBits(REG_OFFSET_WININ, 0x12); + ClearGpuRegBits(REG_OFFSET_WININ, 0x01); + SetGpuRegBits(REG_OFFSET_WINOUT, 0x00); + SetGpuReg(REG_OFFSET_WIN0V, 0x2080); + SetGpuReg(REG_OFFSET_WIN0H, 0x0078); + break; + case 1: + if (!FreeTempTileDataBuffersIfPossible()) + { + DecompressAndCopyTileDataToVram(0, gUnknown_8407B9C, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gUnknown_8408D98, 0, 0, 1); + gUnknown_203AB00 = 4; + gUnknown_203AB02 = 52; + ChangeBgX(0, 0x00001800, 0); + ChangeBgY(0, 0x0001F000, 0); + this->field_0004++; + } + break; + case 2: + if (!FreeTempTileDataBuffersIfPossible()) + { + BlendPalettes(0xFFFFFFFE, 0, RGB_WHITE); + ShowBg(0); + CreateTask(sub_80ED714, 0); + sub_80EE4F8(this); + sub_80EE528(this->field_0018, 0, 0xB4, 0x34); + CreateTask(sub_80EE200, 0); + sub_80ED6D8(); + this->field_0012 = 0; + this->field_0004++; + } + break; + case 3: + this->field_0012++; + if (this->field_0012 == 16) + sub_80ED7D4(this); + if (!sub_80EE5C8(this) && !FuncIsActiveTask(sub_80EE200)) + sub_80ECAA8(this, sub_80ED898); + break; + } +} + +void sub_80ED69C(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + ChangeBgX(1, 0x400, 2); + else + ChangeBgX(1, 0x020, 2); +} + +void sub_80ED6D8(void) +{ + CreateTask(sub_80ED69C, 0); +} + +void sub_80ED6EC(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80ED69C); + gTasks[taskId].data[0] = 1; +} + +void sub_80ED714(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + if (data[0] == 0) + { + data[1]++; + if (data[1] >= 30) + { + data[1] = 0; + data[2] ^= 1; + ChangeBgY(0, (data[2] << 15) + 0x1F000, 0); + } + } +} + +void sub_80ED760(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80ED714); + gTasks[taskId].data[0] = 1; +} + +void sub_80ED788(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80ED714); + gTasks[taskId].data[0] = 0; +} + +u8 sub_80ED7B0(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80ED714); + return gTasks[taskId].data[2]; +} + +void sub_80ED7D4(struct IntroSequenceData * this) +{ + u8 spriteId = CreateSprite(&gUnknown_840BDFC, 296, 112, 7); + if (spriteId != MAX_SPRITES) + { + this->field_0024 = &gSprites[spriteId]; + this->field_0024->callback = sub_80ED818; + } + else + this->field_0024 = NULL; +} + +void sub_80ED818(struct Sprite * sprite) +{ + s16 * data = sprite->data; + + switch (data[0]) + { + case 0: + data[1] = sprite->pos1.x << 5; + data[2] = 160; + data[0]++; + // fallthrough + case 1: + data[1] -= data[2]; + sprite->pos1.x = data[1] >> 5; + if (sprite->pos1.x <= 52) + { + sub_80ED6EC(); + data[0]++; + } + break; + case 2: + data[1] -= 32; + sprite->pos1.x = data[1] >> 5; + if (sprite->pos1.x <= -32) + { + sprite->invisible = TRUE; + sprite->data[0]++; + DestroySprite(sprite); + } + break; + } +} diff --git a/sym_ewram.txt b/sym_ewram.txt index 2c791be78..ec2d2149d 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -1112,14 +1112,7 @@ gUnknown_203AAC4: @ 203AAC4 gUnknown_203AAC6: @ 203AAC6 .space 0xE -gUnknown_203AAD4: @ 203AAD4 - .space 0x2C - -gUnknown_203AB00: @ 203AB00 - .space 0x2 - -gUnknown_203AB02: @ 203AB02 - .space 0x2 + .include "src/intro.o" gUnknown_203AB04: @ 203AB04 .space 0x2 |