diff options
-rw-r--r-- | asm/region_map.s | 361 | ||||
-rw-r--r-- | src/region_map.c | 147 |
2 files changed, 142 insertions, 366 deletions
diff --git a/asm/region_map.s b/asm/region_map.s index c45d74270..9dea034bc 100644 --- a/asm/region_map.s +++ b/asm/region_map.s @@ -5,367 +5,6 @@ .text - thumb_func_start sub_80C07D0 -sub_80C07D0: @ 80C07D0 - ldr r1, _080C07DC @ =gUnknown_20399D4 - ldr r1, [r1] - ldr r2, _080C07E0 @ =0x000047b8 - adds r1, r2 - str r0, [r1] - bx lr - .align 2, 0 -_080C07DC: .4byte gUnknown_20399D4 -_080C07E0: .4byte 0x000047b8 - thumb_func_end sub_80C07D0 - - thumb_func_start sub_80C07E4 -sub_80C07E4: @ 80C07E4 - ldr r0, _080C07F0 @ =gUnknown_20399D4 - ldr r0, [r0] - ldr r1, _080C07F4 @ =0x000047b8 - adds r0, r1 - ldr r0, [r0] - bx lr - .align 2, 0 -_080C07F0: .4byte gUnknown_20399D4 -_080C07F4: .4byte 0x000047b8 - thumb_func_end sub_80C07E4 - - thumb_func_start sub_80C07F8 -sub_80C07F8: @ 80C07F8 - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080C0814 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldr r0, _080C0818 @ =gUnknown_20399D4 - ldr r0, [r0] - ldr r2, _080C081C @ =0x000047b8 - adds r0, r2 - ldr r0, [r0] - str r0, [r1] - bx lr - .align 2, 0 -_080C0814: .4byte gTasks -_080C0818: .4byte gUnknown_20399D4 -_080C081C: .4byte 0x000047b8 - thumb_func_end sub_80C07F8 - - thumb_func_start sub_80C0820 -sub_80C0820: @ 80C0820 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r0, 0x2 - bl sub_80C0E04 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080C0838 - bl sub_80C25BC -_080C0838: - bl sub_80C4A04 - bl sub_80C3188 - bl sub_80C4348 - bl sub_80C4D30 - adds r0, r4, 0 - bl DestroyTask - bl FreeAllWindowBuffers - ldr r0, _080C086C @ =gUnknown_20399D4 - ldr r0, [r0] - ldr r1, _080C0870 @ =0x000047bc - adds r0, r1 - ldr r0, [r0] - cmp r0, 0 - bne _080C0878 - ldr r0, _080C0874 @ =gMain - ldr r0, [r0, 0x8] - bl SetMainCallback2 - b _080C087C - .align 2, 0 -_080C086C: .4byte gUnknown_20399D4 -_080C0870: .4byte 0x000047bc -_080C0874: .4byte gMain -_080C0878: - bl SetMainCallback2 -_080C087C: - ldr r4, _080C0894 @ =gUnknown_20399D4 - ldr r0, [r4] - cmp r0, 0 - beq _080C088C - bl Free - movs r0, 0 - str r0, [r4] -_080C088C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C0894: .4byte gUnknown_20399D4 - thumb_func_end sub_80C0820 - - thumb_func_start sub_80C0898 -sub_80C0898: @ 80C0898 - push {r4,lr} - ldr r4, _080C08B0 @ =gUnknown_20399D4 - ldr r0, [r4] - cmp r0, 0 - beq _080C08AA - bl Free - movs r0, 0 - str r0, [r4] -_080C08AA: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C08B0: .4byte gUnknown_20399D4 - thumb_func_end sub_80C0898 - - thumb_func_start sub_80C08B4 -sub_80C08B4: @ 80C08B4 - push {lr} - bl RunTasks - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r0} - bx r0 - thumb_func_end sub_80C08B4 - - thumb_func_start sub_80C08CC -sub_80C08CC: @ 80C08CC - push {lr} - bl LoadOam - bl ProcessSpriteCopyRequests - bl TransferPlttBuffer - pop {r0} - bx r0 - thumb_func_end sub_80C08CC - - thumb_func_start sub_80C08E0 -sub_80C08E0: @ 80C08E0 - push {lr} - movs r0, 0 - bl SetVBlankCallback - movs r0, 0 - bl SetHBlankCallback - pop {r0} - bx r0 - thumb_func_end sub_80C08E0 - - thumb_func_start sub_80C08F4 -sub_80C08F4: @ 80C08F4 - push {lr} - ldr r0, _080C0900 @ =sub_80C08CC - bl SetVBlankCallback - pop {r0} - bx r0 - .align 2, 0 -_080C0900: .4byte sub_80C08CC - thumb_func_end sub_80C08F4 - - thumb_func_start sub_80C0904 -sub_80C0904: @ 80C0904 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x8 - movs r3, 0xC0 - lsls r3, 19 - movs r4, 0xC0 - lsls r4, 9 - add r0, sp, 0x4 - mov r8, r0 - mov r2, sp - movs r6, 0 - ldr r1, _080C0A18 @ =0x040000d4 - movs r5, 0x80 - lsls r5, 5 - ldr r7, _080C0A1C @ =0x81000800 - movs r0, 0x81 - lsls r0, 24 - mov r12, r0 -_080C092A: - strh r6, [r2] - mov r0, sp - str r0, [r1] - str r3, [r1, 0x4] - str r7, [r1, 0x8] - ldr r0, [r1, 0x8] - adds r3, r5 - subs r4, r5 - cmp r4, r5 - bhi _080C092A - strh r6, [r2] - mov r2, sp - str r2, [r1] - str r3, [r1, 0x4] - lsrs r0, r4, 1 - mov r2, r12 - orrs r0, r2 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - movs r0, 0xE0 - lsls r0, 19 - movs r3, 0x80 - lsls r3, 3 - movs r4, 0 - str r4, [sp, 0x4] - ldr r2, _080C0A18 @ =0x040000d4 - mov r1, r8 - str r1, [r2] - str r0, [r2, 0x4] - lsrs r0, r3, 2 - movs r1, 0x85 - lsls r1, 24 - orrs r0, r1 - str r0, [r2, 0x8] - ldr r0, [r2, 0x8] - movs r1, 0xA0 - lsls r1, 19 - mov r0, sp - strh r4, [r0] - str r0, [r2] - str r1, [r2, 0x4] - lsrs r3, 1 - movs r0, 0x81 - lsls r0, 24 - orrs r3, r0 - str r3, [r2, 0x8] - ldr r0, [r2, 0x8] - movs r0, 0 - movs r1, 0 - bl SetGpuReg - movs r0, 0 - bl ResetBgsAndClearDma3BusyFlags - ldr r1, _080C0A20 @ =gUnknown_83F1A50 - movs r0, 0 - movs r2, 0x4 - bl InitBgsFromTemplates - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl ChangeBgX - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl ChangeBgY - movs r0, 0x1 - movs r1, 0 - movs r2, 0 - bl ChangeBgX - movs r0, 0x1 - movs r1, 0 - movs r2, 0 - bl ChangeBgY - movs r0, 0x2 - movs r1, 0 - movs r2, 0 - bl ChangeBgX - movs r0, 0x2 - movs r1, 0 - movs r2, 0 - bl ChangeBgY - movs r0, 0x3 - movs r1, 0 - movs r2, 0 - bl ChangeBgX - movs r0, 0x3 - movs r1, 0 - movs r2, 0 - bl ChangeBgY - ldr r0, _080C0A24 @ =gUnknown_83F1A60 - bl InitWindows - bl DeactivateAllTextPrinters - ldr r1, _080C0A28 @ =0x00006040 - movs r0, 0 - bl SetGpuReg - bl sub_80C0A2C - bl sub_80C0AB8 - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080C0A18: .4byte 0x040000d4 -_080C0A1C: .4byte 0x81000800 -_080C0A20: .4byte gUnknown_83F1A50 -_080C0A24: .4byte gUnknown_83F1A60 -_080C0A28: .4byte 0x00006040 - thumb_func_end sub_80C0904 - - thumb_func_start sub_80C0A2C -sub_80C0A2C: @ 80C0A2C - push {r4,lr} - ldr r4, _080C0A5C @ =gUnknown_20399D4 - ldr r1, [r4] - ldr r0, _080C0A60 @ =0x00001796 - adds r1, r0 - movs r0, 0 - bl SetBgTilemapBuffer - ldr r1, [r4] - ldr r0, _080C0A64 @ =0x00002796 - adds r1, r0 - movs r0, 0x1 - bl SetBgTilemapBuffer - ldr r1, [r4] - ldr r0, _080C0A68 @ =0x00003796 - adds r1, r0 - movs r0, 0x2 - bl SetBgTilemapBuffer - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080C0A5C: .4byte gUnknown_20399D4 -_080C0A60: .4byte 0x00001796 -_080C0A64: .4byte 0x00002796 -_080C0A68: .4byte 0x00003796 - thumb_func_end sub_80C0A2C - - thumb_func_start sub_80C0A6C -sub_80C0A6C: @ 80C0A6C - push {lr} - bl ResetSpriteData - bl ResetPaletteFade - bl FreeAllSpritePalettes - bl ResetTasks - bl ScanlineEffect_Stop - pop {r0} - bx r0 - thumb_func_end sub_80C0A6C - - thumb_func_start sub_80C0A88 -sub_80C0A88: @ 80C0A88 - push {lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - beq _080C0A98 - cmp r0, 0x1 - beq _080C0AA6 - b _080C0AB2 -_080C0A98: - movs r0, 0 - bl ShowBg - movs r0, 0x3 - bl ShowBg - b _080C0AB2 -_080C0AA6: - movs r0, 0 - bl HideBg - movs r0, 0x3 - bl HideBg -_080C0AB2: - pop {r0} - bx r0 - thumb_func_end sub_80C0A88 - thumb_func_start sub_80C0AB8 sub_80C0AB8: @ 80C0AB8 push {r4,lr} diff --git a/src/region_map.c b/src/region_map.c index 4199b2f17..d4451330f 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -1,5 +1,7 @@ #include "global.h" #include "palette.h" +#include "gpu_regs.h" +#include "scanline_effect.h" #include "task.h" #include "malloc.h" #include "overworld.h" @@ -17,7 +19,10 @@ struct UnkStruct_20399D4 { u8 filler_0000[0x0026]; u16 field_0026[5][600]; - u8 filler_1796[0x3000]; + // Inefficiency: these should be u8 or have half the elements each + u16 field_1796[BG_SCREEN_SIZE]; + u16 field_2796[BG_SCREEN_SIZE]; + u16 field_3796[BG_SCREEN_SIZE]; u8 field_4796; u8 field_4797[4]; u8 field_479B; @@ -54,8 +59,10 @@ void sub_80C08B4(void); void sub_80C08E0(void); void sub_80C08F4(void); void sub_80C0904(void); +void sub_80C0A2C(void); void sub_80C0A6C(void); void sub_80C0A88(u8 a0); +void sub_80C0AB8(void); void sub_80C0B18(void); void sub_80C0B9C(void); void sub_80C0BB0(void); @@ -65,25 +72,30 @@ u8 sub_80C0E20(void); void sub_80C0E70(u8 a0, u8 taskId, TaskFunc taskFunc); void sub_80C195C(u8 a0, u8 taskId, TaskFunc taskFunc); void sub_80C2208(u8 taskId, TaskFunc taskFunc); +void sub_80C25BC(void); void sub_80C2C1C(u8 taskId); void sub_80C3008(u16 a0, u16 a1); void sub_80C3154(u8 a0); void sub_80C3178(void); -u8 sub_80C3400(void); -u16 sub_80C3508(void); -u16 sub_80C3514(void); -u16 sub_80C3580(void); +void sub_80C3188(void); u8 sub_80C3AC8(u8 a0); +u8 sub_80C3400(void); u8 sub_80C4164(u8 a0, u8 a1, s16 a2, s16 a3); void sub_80C41D8(u16 a0, u16 a1); void sub_80C4324(u8 a0); void sub_80C4398(u8 a0, u8 taskId, TaskFunc taskFunc); +void sub_80C4348(void); void sub_80C48BC(u8 a0, u8 a1, u8 a2); void sub_80C4960(u8 a0, u8 a1, u8 a2); +void sub_80C4A04(void); +void sub_80C4D30(void); void sub_80C4E18(const u8 *str); void sub_80C4E74(const u8 *str); void sub_80C4ED0(bool8 a0); void sub_80C4F08(u8 taskId); +u16 sub_80C3508(void); +u16 sub_80C3514(void); +u16 sub_80C3580(void); #include "data/text/map_section_names.h" @@ -96,6 +108,8 @@ extern const u32 gUnknown_83F0C0C[]; extern const u32 gUnknown_83F0CF0[]; extern const u32 gUnknown_83F1978[]; extern const u32 gUnknown_83F19A0[]; +extern const struct BgTemplate gUnknown_83F1A50[4]; +extern const struct WindowTemplate gUnknown_83F1A60[]; extern const u8 sSeviiMapsecs[3][30]; extern const u8 gUnknown_83F1B00[3][4]; @@ -462,3 +476,126 @@ void sub_80C04E4(u8 taskId) break; } } + +void sub_80C07D0(TaskFunc taskFunc) +{ + gUnknown_20399D4->field_47B8 = taskFunc; +} + +TaskFunc sub_80C07E4(void) +{ + return gUnknown_20399D4->field_47B8; +} + +void sub_80C07F8(u8 taskId) +{ + gTasks[taskId].func = gUnknown_20399D4->field_47B8; +} + +void sub_80C0820(u8 taskId) +{ + if (sub_80C0E04(2) == TRUE) + sub_80C25BC(); + sub_80C4A04(); + sub_80C3188(); + sub_80C4348(); + sub_80C4D30(); + DestroyTask(taskId); + FreeAllWindowBuffers(); + if (gUnknown_20399D4->field_47BC == NULL) + SetMainCallback2(gMain.savedCallback); + else + SetMainCallback2(gUnknown_20399D4->field_47BC); + if (gUnknown_20399D4 != NULL) + { + FREE_AND_SET_NULL(gUnknown_20399D4); + } +} + +void sub_80C0898(void) +{ + if (gUnknown_20399D4 != NULL) + { + FREE_AND_SET_NULL(gUnknown_20399D4); + } +} + +void sub_80C08B4(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80C08CC(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80C08E0(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void sub_80C08F4(void) +{ + SetVBlankCallback(sub_80C08CC); +} + +void sub_80C0904(void) +{ + DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); + DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, gUnknown_83F1A50, NELEMS(gUnknown_83F1A50)); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + InitWindows(gUnknown_83F1A60); + DeactivateAllTextPrinters(); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); + sub_80C0A2C(); + sub_80C0AB8(); +} + +void sub_80C0A2C(void) +{ + SetBgTilemapBuffer(0, gUnknown_20399D4->field_1796); + SetBgTilemapBuffer(1, gUnknown_20399D4->field_2796); + SetBgTilemapBuffer(2, gUnknown_20399D4->field_3796); +} + +void sub_80C0A6C(void) +{ + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + ResetTasks(); + ScanlineEffect_Stop(); +} + +void sub_80C0A88(u8 mode) +{ + switch (mode) + { + case 0: + ShowBg(0); + ShowBg(3); + break; + case 1: + HideBg(0); + HideBg(3); + break; + } +} |