summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/title_screen.s462
-rw-r--r--data/field_weather.s3
-rw-r--r--data/graphics.s5
-rw-r--r--data/graphics/title_screen/unk_83BF58C.pngbin0 -> 78 bytes
-rw-r--r--data/graphics/title_screen/unk_83BF5A8.bin1
-rw-r--r--data/graphics/title_screen/unk_83bf64c.pngbin0 -> 188 bytes
-rw-r--r--data/graphics/title_screen/unk_83bf79c.pngbin0 -> 539 bytes
-rw-r--r--data/graphics/title_screen/unk_83bfa14.pngbin0 -> 150 bytes
-rw-r--r--data/title_screen.s80
-rw-r--r--graphics/title_screen/unk_8eae4a8.pngbin0 -> 148 bytes
-rw-r--r--include/main.h1
-rw-r--r--ld_script.txt2
-rw-r--r--src/title_screen.c192
13 files changed, 269 insertions, 477 deletions
diff --git a/asm/title_screen.s b/asm/title_screen.s
index e62cc9a9f..293a289ce 100644
--- a/asm/title_screen.s
+++ b/asm/title_screen.s
@@ -5,468 +5,6 @@
.text
- thumb_func_start CB2_InitTitleScreen
-CB2_InitTitleScreen: @ 8078914
- push {r4-r6,lr}
- sub sp, 0xC
- ldr r0, _08078930 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- ldrb r6, [r0]
- cmp r6, 0x1
- beq _080789F0
- cmp r6, 0x1
- bgt _08078934
- cmp r6, 0
- beq _08078946
- b _0807893A
- .align 2, 0
-_08078930: .4byte gMain
-_08078934:
- cmp r6, 0x2
- bne _0807893A
- b _08078AC0
-_0807893A:
- ldr r0, _080789D0 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_08078946:
- movs r0, 0
- bl SetVBlankCallback
- bl StartTimer1
- ldr r0, _080789D4 @ =gHeap
- movs r1, 0xE0
- lsls r1, 9
- bl InitHeap
- bl ResetTasks
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl ResetPaletteFade
- bl sub_8078B34
- add r1, sp, 0x4
- movs r0, 0
- strh r0, [r1]
- ldr r1, _080789D8 @ =0x040000d4
- add r0, sp, 0x4
- str r0, [r1]
- movs r0, 0xC0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080789DC @ =0x8100c000
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r2, 0
- str r2, [sp, 0x8]
- add r0, sp, 0x8
- str r0, [r1]
- movs r0, 0xE0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080789E0 @ =0x85000100
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- add r0, sp, 0x4
- strh r2, [r0]
- str r0, [r1]
- movs r0, 0xA0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080789E4 @ =0x81000200
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _080789E8 @ =gUnknown_83BFB74
- movs r0, 0
- movs r2, 0x4
- bl InitBgsFromTemplates
- movs r1, 0x82
- lsls r1, 5
- movs r0, 0
- bl SetGpuRegBits
- ldr r1, _080789EC @ =gUnknown_2037F30
- movs r0, 0xFF
- strb r0, [r1]
- b _08078B18
- .align 2, 0
-_080789D0: .4byte gMain
-_080789D4: .4byte gHeap
-_080789D8: .4byte 0x040000d4
-_080789DC: .4byte 0x8100c000
-_080789E0: .4byte 0x85000100
-_080789E4: .4byte 0x81000200
-_080789E8: .4byte gUnknown_83BFB74
-_080789EC: .4byte gUnknown_2037F30
-_080789F0:
- ldr r0, _08078A94 @ =gUnknown_8EAB6C4
- movs r2, 0xD0
- lsls r2, 1
- movs r1, 0
- bl LoadPalette
- ldr r1, _08078A98 @ =gUnknown_8EAB8C4
- movs r4, 0
- str r4, [sp]
- movs r0, 0
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r1, _08078A9C @ =gUnknown_8EAD390
- str r6, [sp]
- movs r0, 0
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r0, _08078AA0 @ =gUnknown_8EAD5E8
- movs r1, 0xD0
- movs r2, 0x20
- bl LoadPalette
- ldr r1, _08078AA4 @ =gUnknown_8EAD608
- str r4, [sp]
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r1, _08078AA8 @ =gUnknown_8EADEE4
- str r6, [sp]
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r5, _08078AAC @ =gUnknown_8EAE094
- adds r0, r5, 0
- movs r1, 0xF0
- movs r2, 0x20
- bl LoadPalette
- ldr r1, _08078AB0 @ =gUnknown_8EAE0B4
- str r4, [sp]
- movs r0, 0x2
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r1, _08078AB4 @ =gUnknown_8EAE374
- str r6, [sp]
- movs r0, 0x2
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- adds r0, r5, 0
- movs r1, 0xE0
- movs r2, 0x20
- bl LoadPalette
- ldr r1, _08078AB8 @ =gUnknown_83BF58C
- str r4, [sp]
- movs r0, 0x3
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r1, _08078ABC @ =gUnknown_83BF5A8
- str r6, [sp]
- movs r0, 0x3
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- bl sub_8079708
- b _08078B18
- .align 2, 0
-_08078A94: .4byte gUnknown_8EAB6C4
-_08078A98: .4byte gUnknown_8EAB8C4
-_08078A9C: .4byte gUnknown_8EAD390
-_08078AA0: .4byte gUnknown_8EAD5E8
-_08078AA4: .4byte gUnknown_8EAD608
-_08078AA8: .4byte gUnknown_8EADEE4
-_08078AAC: .4byte gUnknown_8EAE094
-_08078AB0: .4byte gUnknown_8EAE0B4
-_08078AB4: .4byte gUnknown_8EAE374
-_08078AB8: .4byte gUnknown_83BF58C
-_08078ABC: .4byte gUnknown_83BF5A8
-_08078AC0:
- bl FreeTempTileDataBuffersIfPossible
- lsls r0, 24
- cmp r0, 0
- bne _08078B26
- ldr r0, _08078B00 @ =0x0000ffff
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- ldr r0, _08078B04 @ =sub_8078C24
- movs r1, 0x4
- bl CreateTask
- ldr r0, _08078B08 @ =sub_8078BEC
- movs r1, 0x2
- bl CreateTask
- ldr r1, _08078B0C @ =gUnknown_2037F30
- strb r0, [r1]
- ldr r0, _08078B10 @ =sub_8078BB4
- bl SetVBlankCallback
- ldr r0, _08078B14 @ =sub_8078B9C
- bl SetMainCallback2
- movs r0, 0x8B
- lsls r0, 1
- bl m4aSongNumStart
- b _08078B26
- .align 2, 0
-_08078B00: .4byte 0x0000ffff
-_08078B04: .4byte sub_8078C24
-_08078B08: .4byte sub_8078BEC
-_08078B0C: .4byte gUnknown_2037F30
-_08078B10: .4byte sub_8078BB4
-_08078B14: .4byte sub_8078B9C
-_08078B18:
- ldr r1, _08078B30 @ =gMain
- movs r0, 0x87
- lsls r0, 3
- adds r1, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
-_08078B26:
- add sp, 0xC
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08078B30: .4byte gMain
- thumb_func_end CB2_InitTitleScreen
-
- thumb_func_start sub_8078B34
-sub_8078B34: @ 8078B34
- push {lr}
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x50
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x52
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x54
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x10
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x12
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x16
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x18
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1A
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1C
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1E
- movs r1, 0
- bl SetGpuReg
- pop {r0}
- bx r0
- thumb_func_end sub_8078B34
-
- thumb_func_start sub_8078B9C
-sub_8078B9C: @ 8078B9C
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_8078B9C
-
- thumb_func_start sub_8078BB4
-sub_8078BB4: @ 8078BB4
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- bl ScanlineEffect_InitHBlankDmaTransfer
- ldr r1, _08078BE4 @ =gUnknown_2037F30
- ldrb r0, [r1]
- cmp r0, 0xFF
- beq _08078BE0
- ldr r2, _08078BE8 @ =gTasks
- adds r1, r0, 0
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r2
- ldrh r1, [r0, 0x8]
- adds r1, 0x1
- strh r1, [r0, 0x8]
-_08078BE0:
- pop {r0}
- bx r0
- .align 2, 0
-_08078BE4: .4byte gUnknown_2037F30
-_08078BE8: .4byte gTasks
- thumb_func_end sub_8078BB4
-
- thumb_func_start sub_8078BEC
-sub_8078BEC: @ 8078BEC
- push {lr}
- lsls r0, 24
- lsrs r2, r0, 24
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 3
- ldr r1, _08078C18 @ =gTasks+0x8
- adds r0, r1
- movs r3, 0
- ldrsh r1, [r0, r3]
- ldr r0, _08078C1C @ =0x00000a8b
- cmp r1, r0
- ble _08078C12
- ldr r1, _08078C20 @ =gUnknown_2037F30
- movs r0, 0xFF
- strb r0, [r1]
- adds r0, r2, 0
- bl DestroyTask
-_08078C12:
- pop {r0}
- bx r0
- .align 2, 0
-_08078C18: .4byte gTasks+0x8
-_08078C1C: .4byte 0x00000a8b
-_08078C20: .4byte gUnknown_2037F30
- thumb_func_end sub_8078BEC
-
- thumb_func_start sub_8078C24
-sub_8078C24: @ 8078C24
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _08078C6C @ =gTasks+0x8
- adds r4, r1, r0
- ldr r0, _08078C70 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0xB
- ands r0, r1
- cmp r0, 0
- beq _08078C74
- movs r1, 0
- ldrsh r0, [r4, r1]
- cmp r0, 0x3
- beq _08078C74
- cmp r0, 0x4
- beq _08078C74
- cmp r0, 0x5
- beq _08078C74
- bl sub_8079620
- bl sub_8079648
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- bl sub_8079A10
- adds r0, r4, 0
- movs r1, 0x3
- bl sub_8078C90
- b _08078C86
- .align 2, 0
-_08078C6C: .4byte gTasks+0x8
-_08078C70: .4byte gMain
-_08078C74:
- ldr r0, _08078C8C @ =gUnknown_83BFB84
- movs r2, 0
- ldrsh r1, [r4, r2]
- lsls r1, 2
- adds r1, r0
- ldr r1, [r1]
- adds r0, r4, 0
- bl _call_via_r1
-_08078C86:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08078C8C: .4byte gUnknown_83BFB84
- thumb_func_end sub_8078C24
-
- thumb_func_start sub_8078C90
-sub_8078C90: @ 8078C90
- lsls r1, 24
- lsrs r1, 24
- movs r2, 0
- strh r2, [r0, 0x2]
- strh r1, [r0]
- bx lr
- thumb_func_end sub_8078C90
-
- thumb_func_start sub_8078C9C
-sub_8078C9C: @ 8078C9C
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- sub sp, 0x10
- mov r8, r0
- movs r0, 0
- bl HideBg
- movs r0, 0x1
- bl ShowBg
- movs r0, 0x2
- bl ShowBg
- movs r0, 0x3
- bl ShowBg
- ldr r0, _08078D14 @ =0x04000054
- str r0, [sp]
- ldr r0, _08078D18 @ =0xa2600001
- str r0, [sp, 0x4]
- mov r1, sp
- movs r5, 0
- movs r0, 0x1
- strb r0, [r1, 0x8]
- mov r0, sp
- strb r5, [r0, 0x9]
- add r0, sp, 0xC
- strh r5, [r0]
- ldr r4, _08078D1C @ =gScanlineEffectRegBuffers
- ldr r6, _08078D20 @ =0x010000a0
- adds r1, r4, 0
- adds r2, r6, 0
- bl CpuSet
- mov r0, sp
- adds r0, 0xE
- strh r5, [r0]
- movs r1, 0xF0
- lsls r1, 3
- adds r4, r1
- adds r1, r4, 0
- adds r2, r6, 0
- bl CpuSet
- ldr r0, [sp]
- ldr r1, [sp, 0x4]
- ldr r2, [sp, 0x8]
- bl ScanlineEffect_SetParams
- mov r0, r8
- movs r1, 0x1
- bl sub_8078C90
- add sp, 0x10
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08078D14: .4byte 0x04000054
-_08078D18: .4byte 0xa2600001
-_08078D1C: .4byte gScanlineEffectRegBuffers
-_08078D20: .4byte 0x010000a0
- thumb_func_end sub_8078C9C
-
thumb_func_start sub_8078D24
sub_8078D24: @ 8078D24
push {r4,lr}
diff --git a/data/field_weather.s b/data/field_weather.s
index a25e44344..517480d9a 100644
--- a/data/field_weather.s
+++ b/data/field_weather.s
@@ -1,6 +1,9 @@
.section .rodata
.align 2
+gUnknown_83BFBE4:: @ 83BFBE4
+ .incbin "baserom.gba", 0x3BFBE4, 0x2FD8
+
gUnknown_83C2BBC:: @ 83C2BBC
.incbin "baserom.gba", 0x3C2BBC, 0x4
diff --git a/data/graphics.s b/data/graphics.s
index 83d14001d..f62234529 100644
--- a/data/graphics.s
+++ b/data/graphics.s
@@ -16379,11 +16379,12 @@ gUnknown_8EAE0B4:: @ 8EAE0B4
gUnknown_8EAE374:: @ 8EAE374
.incbin "baserom.gba", 0xEAE374, 0x114
+ @ title_screen
gUnknown_8EAE488:: @ 8EAE488
- .incbin "baserom.gba", 0xEAE488, 0x20 @UNKNOWN
+ .incbin "graphics/title_screen/unk_8eae488.gbapal"
gUnknown_8EAE4A8:: @ 8EAE4A8
- .incbin "baserom.gba", 0xEAE4A8, 0x80
+ .incbin "graphics/title_screen/unk_8eae4a8.4bpp.lz"
gUnknown_8EAE528:: @ 8EAE528
.incbin "baserom.gba", 0xEAE528, 0x20 @UNKNOWN
diff --git a/data/graphics/title_screen/unk_83BF58C.png b/data/graphics/title_screen/unk_83BF58C.png
new file mode 100644
index 000000000..895457c3c
--- /dev/null
+++ b/data/graphics/title_screen/unk_83BF58C.png
Binary files differ
diff --git a/data/graphics/title_screen/unk_83BF5A8.bin b/data/graphics/title_screen/unk_83BF5A8.bin
new file mode 100644
index 000000000..375fbeb7a
--- /dev/null
+++ b/data/graphics/title_screen/unk_83BF5A8.bin
@@ -0,0 +1 @@
+àààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà \ No newline at end of file
diff --git a/data/graphics/title_screen/unk_83bf64c.png b/data/graphics/title_screen/unk_83bf64c.png
new file mode 100644
index 000000000..3c9b7630d
--- /dev/null
+++ b/data/graphics/title_screen/unk_83bf64c.png
Binary files differ
diff --git a/data/graphics/title_screen/unk_83bf79c.png b/data/graphics/title_screen/unk_83bf79c.png
new file mode 100644
index 000000000..246252bed
--- /dev/null
+++ b/data/graphics/title_screen/unk_83bf79c.png
Binary files differ
diff --git a/data/graphics/title_screen/unk_83bfa14.png b/data/graphics/title_screen/unk_83bfa14.png
new file mode 100644
index 000000000..f4f030a5b
--- /dev/null
+++ b/data/graphics/title_screen/unk_83bfa14.png
Binary files differ
diff --git a/data/title_screen.s b/data/title_screen.s
index 93d0f2f83..e0186afe3 100644
--- a/data/title_screen.s
+++ b/data/title_screen.s
@@ -1,34 +1,88 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
.section .rodata
.align 2
-gUnknown_83BF58C:: @ 83BF58C
- .incbin "baserom.gba", 0x3BF58C, 0x1C
+gUnknown_83BF64C:: @ 83BF64C
+ .incbin "data/graphics/title_screen/unk_83bf64c.4bpp.lz"
-gUnknown_83BF5A8:: @ 83BF5A8
- .incbin "baserom.gba", 0x3BF5A8, 0x55C
+gUnknown_83BF77C::
+ .incbin "data/graphics/title_screen/unk_83bf77c.gbapal"
+
+gUnknown_83BF79C::
+ .incbin "data/graphics/title_screen/unk_83bf79c.4bpp.lz"
+
+gUnknown_83BFA14::
+ .incbin "data/graphics/title_screen/unk_83bfa14.4bpp.lz"
+
+gOamData_83BFAB4::
+ .4byte 0x40000000, 0x00000c00
+
+gSpriteAnims_83BFABC::
+ obj_image_anim_frame 0x0, 0x3
+ obj_image_anim_frame 0x4, 0x6
+ obj_image_anim_frame 0x8, 0x6
+ obj_image_anim_frame 0xc, 0x6
+ obj_image_anim_frame 0x10, 0x6
+ obj_image_anim_frame 0x14, 0x6
+ obj_image_anim_frame 0x18, 0x6
+ obj_image_anim_frame 0x1c, 0x6
+ obj_image_anim_frame 0x20, 0x6
+ obj_image_anim_frame 0x24, 0x6
+ obj_image_anim_end
+
+gSpriteAnims_83BFAE8::
+ obj_image_anim_frame 0x18, 0x6
+ obj_image_anim_frame 0x1c, 0x6
+ obj_image_anim_frame 0x20, 0x6
+ obj_image_anim_frame 0x24, 0x6
+ obj_image_anim_end
+
+gSpriteAnimTable_83BFAFC::
+ .4byte gSpriteAnims_83BFABC
+ .4byte gSpriteAnims_83BFAE8
gUnknown_83BFB04:: @ 83BFB04
- .incbin "baserom.gba", 0x3BFB04, 0x18
+ spr_template 0, 0, gOamData_83BFAB4, gSpriteAnimTable_83BFAFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
gUnknown_83BFB1C:: @ 83BFB1C
- .incbin "baserom.gba", 0x3BFB1C, 0x20
+ spr_template 1, 0, gOamData_83BFAB4, gSpriteAnimTable_83BFAFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+
+gOamData_83BFB34::
+ .4byte 0xc0008000, 0x00000000
gUnknown_83BFB3C:: @ 83BFB3C
- .incbin "baserom.gba", 0x3BFB3C, 0x20
+ spr_template 2, 2, gOamData_83BFB34, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+
+gOamData_83BFB54::
+ .4byte 0xc0000800, 0x00000000
gUnknown_83BFB5C:: @ 83BFB5C
- .incbin "baserom.gba", 0x3BFB5C, 0x18
+ spr_template 3, 2, gOamData_83BFB54, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
gUnknown_83BFB74:: @ 83BFB74
- .incbin "baserom.gba", 0x3BFB74, 0x10
+ .4byte 0x000009f0
+ .4byte 0x000011e5
+ .4byte 0x000021da
+ .4byte 0x000031cf
gUnknown_83BFB84:: @ 83BFB84
- .incbin "baserom.gba", 0x3BFB84, 0x18
+ .4byte sub_8078C9C
+ .4byte sub_8078D24
+ .4byte sub_8078DA4
+ .4byte sub_8078FC4
+ .4byte sub_80790CC
+ .4byte sub_80791C0
gUnknown_83BFB9C:: @ 83BFB9C
- .incbin "baserom.gba", 0x3BFB9C, 0x20
+ obj_tiles gUnknown_83BF79C, 0x500, 0
+ obj_tiles gUnknown_83BFA14, 0x500, 1
+ obj_tiles gUnknown_8EAE4A8, 0x400, 2
+ obj_tiles gUnknown_83BF64C, 0x800, 3
gUnknown_83BFBBC:: @ 83BFBBC
- .incbin "baserom.gba", 0x3BFBBC, 0x18
+ obj_pal gUnknown_83BF77C, 0
+ obj_pal gUnknown_8EAE488, 2
+ null_obj_pal
gUnknown_83BFBD4:: @ 83BFBD4
- .incbin "baserom.gba", 0x3BFBD4, 0x2FE8
+ .incbin "baserom.gba", 0x3BFBD4, 0xF
diff --git a/graphics/title_screen/unk_8eae4a8.png b/graphics/title_screen/unk_8eae4a8.png
new file mode 100644
index 000000000..d98563aef
--- /dev/null
+++ b/graphics/title_screen/unk_8eae4a8.png
Binary files differ
diff --git a/include/main.h b/include/main.h
index a250475cb..b66ff04d8 100644
--- a/include/main.h
+++ b/include/main.h
@@ -65,6 +65,7 @@ void ClearPokemonCrySongs(void);
void RestoreSerialTimer3IntrHandlers(void);
void SetVBlankCounter1Ptr(u32 *ptr);
void DisableVBlankCounter1(void);
+void StartTimer1(void);
extern const char RomHeaderGameCode[4];
extern const char RomHeaderSoftwareVersion;
diff --git a/ld_script.txt b/ld_script.txt
index d9506d33f..20e1db897 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -115,6 +115,7 @@ SECTIONS {
src/task.o(.text);
asm/reshow_battle_screen.o(.text);
asm/battle_anim_status_effects.o(.text);
+ src/title_screen.o(.text);
asm/title_screen.o(.text);
src/reset_save_heap.o(.text);
asm/field_weather.o(.text);
@@ -405,6 +406,7 @@ SECTIONS {
data/battle_anim.o(.rodata);
data/map_events.o(.rodata);
data/battle_anim_status_effects.o(.rodata);
+ src/title_screen.o(.rodata);
data/title_screen.o(.rodata);
data/field_weather.o(.rodata);
data/data_835B488.o(.rodata);
diff --git a/src/title_screen.c b/src/title_screen.c
new file mode 100644
index 000000000..9e779bb7b
--- /dev/null
+++ b/src/title_screen.c
@@ -0,0 +1,192 @@
+#include "global.h"
+#include "malloc.h"
+#include "palette.h"
+#include "gpu_regs.h"
+#include "bg.h"
+#include "task.h"
+#include "main.h"
+#include "new_menu_helpers.h"
+#include "m4a.h"
+#include "scanline_effect.h"
+#include "constants/songs.h"
+
+EWRAM_DATA u8 gUnknown_2037F30 = 0;
+
+void sub_8078B34(void);
+void sub_8078B9C(void);
+void sub_8078BB4(void);
+void sub_8078BEC(u8 taskId);
+void sub_8078C24(u8 taskId);
+void sub_8078C90(s16 * data, u8 a1);
+void sub_8078C9C(s16 * data);
+void sub_8078D24(s16 * data);
+void sub_8078DA4(s16 * data);
+void sub_8078FC4(s16 * data);
+void sub_80790CC(s16 * data);
+void sub_80791C0(s16 * data);
+void sub_8079708(void);
+void sub_8079620(void);
+void sub_8079648(void);
+void sub_8079A10(s16 a0);
+
+const u8 gUnknown_83BF58C[] = INCBIN_U8("data/graphics/title_screen/unk_83BF58C.4bpp.lz");
+const u8 gUnknown_83BF5A8[] = INCBIN_U8("data/graphics/title_screen/unk_83BF5A8.bin.lz");
+extern const struct BgTemplate gUnknown_83BFB74[4];
+extern const void (*const gUnknown_83BFB84[])(s16 * data);
+
+/*graphics.h*/
+extern const u16 gUnknown_8EAB6C4[];
+extern const u8 gUnknown_8EAB8C4[];
+extern const u8 gUnknown_8EAD390[];
+extern const u16 gUnknown_8EAD5E8[];
+extern const u8 gUnknown_8EAD608[];
+extern const u8 gUnknown_8EADEE4[];
+extern const u16 gUnknown_8EAE094[];
+extern const u8 gUnknown_8EAE0B4[];
+extern const u8 gUnknown_8EAE374[];
+
+void CB2_InitTitleScreen(void)
+{
+ switch (gMain.state)
+ {
+ default:
+ gMain.state = 0;
+ // fallthrough
+ case 0:
+ SetVBlankCallback(NULL);
+ StartTimer1();
+ InitHeap(gHeap, HEAP_SIZE);
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ sub_8078B34();
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, gUnknown_83BFB74, NELEMS(gUnknown_83BFB74));
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ gUnknown_2037F30 = 0xFF;
+ break;
+ case 1:
+ LoadPalette(gUnknown_8EAB6C4, 0, 0x1A0);
+ DecompressAndCopyTileDataToVram(0, gUnknown_8EAB8C4, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(0, gUnknown_8EAD390, 0, 0, 1);
+ LoadPalette(gUnknown_8EAD5E8, 0xD0, 0x20);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8EAD608, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8EADEE4, 0, 0, 1);
+ LoadPalette(gUnknown_8EAE094, 0xF0, 0x20);
+ DecompressAndCopyTileDataToVram(2, gUnknown_8EAE0B4, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(2, gUnknown_8EAE374, 0, 0, 1);
+ LoadPalette(gUnknown_8EAE094, 0xE0, 0x20);
+ DecompressAndCopyTileDataToVram(3, gUnknown_83BF58C, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(3, gUnknown_83BF5A8, 0, 0, 1);
+ sub_8079708();
+ break;
+ case 2:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ BlendPalettes(0x0000FFFF, 0x10, RGB_BLACK);
+ CreateTask(sub_8078C24, 4);
+ gUnknown_2037F30 = CreateTask(sub_8078BEC, 2);
+ SetVBlankCallback(sub_8078BB4);
+ SetMainCallback2(sub_8078B9C);
+ m4aSongNumStart(BGM_FRLG_TITLE);
+ }
+ return;
+ }
+ gMain.state++;
+}
+
+void sub_8078B34(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+}
+
+void sub_8078B9C(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_8078BB4(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ ScanlineEffect_InitHBlankDmaTransfer();
+
+ if (gUnknown_2037F30 != 0xFF)
+ gTasks[gUnknown_2037F30].data[0]++;
+}
+
+void sub_8078BEC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (data[0] >= 2700)
+ {
+ gUnknown_2037F30 = 0xFF;
+ DestroyTask(taskId);
+ }
+}
+
+void sub_8078C24(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (JOY_NEW(A_BUTTON | B_BUTTON | START_BUTTON)
+ && data[0] != 3 && data[0] != 4 && data[0] != 5)
+ {
+ sub_8079620();
+ sub_8079648();
+ sub_8079A10(data[5]);
+ sub_8078C90(data, 3);
+ }
+ else
+ {
+ gUnknown_83BFB84[data[0]](data);
+ }
+}
+
+void sub_8078C90(s16 * data, u8 a1)
+{
+ data[1] = 0;
+ data[0] = a1;
+}
+
+void sub_8078C9C(s16 * data)
+{
+ struct ScanlineEffectParams params;
+
+ HideBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+
+ params.dmaDest = (volatile void *)REG_ADDR_BLDY;
+ params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ params.initState = 1;
+ params.unused9 = 0;
+
+ CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140);
+ CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140);
+
+ ScanlineEffect_SetParams(params);
+
+ sub_8078C90(data, 1);
+}