summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/region_map.s361
-rw-r--r--src/region_map.c147
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;
+ }
+}