summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/title_screen.s1270
-rw-r--r--data/data2.s8
-rw-r--r--include/sprite.h2
-rw-r--r--ld_script.txt2
-rw-r--r--src/intro.c2
-rw-r--r--src/sprite.c2
-rw-r--r--src/title_screen.c496
7 files changed, 504 insertions, 1278 deletions
diff --git a/asm/title_screen.s b/asm/title_screen.s
deleted file mode 100644
index 2d233a47a..000000000
--- a/asm/title_screen.s
+++ /dev/null
@@ -1,1270 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start item_menu_type_2
-item_menu_type_2: @ 807BE00
- push {r4,lr}
- adds r2, r0, 0
- movs r0, 0x30
- ldrsh r1, [r2, r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- ldr r1, _0807BE34 @ =gTasks
- adds r4, r0, r1
- movs r1, 0xA
- ldrsh r0, [r4, r1]
- cmp r0, 0
- beq _0807BE38
- ldrb r1, [r2, 0x1]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- strb r0, [r2, 0x1]
- movs r0, 0x42
- strh r0, [r2, 0x22]
- adds r2, 0x3E
- ldrb r1, [r2]
- subs r0, 0x47
- ands r0, r1
- strb r0, [r2]
- b _0807BE80
- .align 2, 0
-_0807BE34: .4byte gTasks
-_0807BE38:
- ldrh r1, [r4, 0x12]
- movs r3, 0x12
- ldrsh r0, [r4, r3]
- cmp r0, 0
- beq _0807BE46
- subs r0, r1, 0x1
- strh r0, [r4, 0x12]
-_0807BE46:
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- cmp r0, 0x3F
- bgt _0807BE80
- adds r3, r2, 0
- adds r3, 0x3E
- ldrb r0, [r3]
- movs r1, 0x5
- negs r1, r1
- ands r1, r0
- strb r1, [r3]
- ldrh r1, [r2, 0x22]
- movs r3, 0x22
- ldrsh r0, [r2, r3]
- cmp r0, 0x42
- beq _0807BE6A
- adds r0, r1, 0x1
- strh r0, [r2, 0x22]
-_0807BE6A:
- ldr r3, _0807BE88 @ =REG_BLDALPHA
- ldr r2, _0807BE8C @ =gUnknown_08393E64
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- lsrs r1, r0, 31
- adds r0, r1
- asrs r0, 1
- lsls r0, 1
- adds r0, r2
- ldrh r0, [r0]
- strh r0, [r3]
-_0807BE80:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807BE88: .4byte REG_BLDALPHA
-_0807BE8C: .4byte gUnknown_08393E64
- thumb_func_end item_menu_type_2
-
- thumb_func_start sub_807BE90
-sub_807BE90: @ 807BE90
- push {lr}
- adds r2, r0, 0
- movs r0, 0x30
- ldrsh r1, [r2, r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- ldr r1, _0807BEC4 @ =gTasks
- adds r1, r0, r1
- movs r3, 0xA
- ldrsh r0, [r1, r3]
- cmp r0, 0
- beq _0807BEC8
- ldrb r1, [r2, 0x1]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- strb r0, [r2, 0x1]
- movs r0, 0x42
- strh r0, [r2, 0x22]
- adds r2, 0x3E
- ldrb r1, [r2]
- subs r0, 0x47
- ands r0, r1
- strb r0, [r2]
- b _0807BEEC
- .align 2, 0
-_0807BEC4: .4byte gTasks
-_0807BEC8:
- movs r3, 0x12
- ldrsh r0, [r1, r3]
- cmp r0, 0x3F
- bgt _0807BEEC
- adds r3, r2, 0
- adds r3, 0x3E
- ldrb r0, [r3]
- movs r1, 0x5
- negs r1, r1
- ands r1, r0
- strb r1, [r3]
- ldrh r1, [r2, 0x22]
- movs r3, 0x22
- ldrsh r0, [r2, r3]
- cmp r0, 0x42
- beq _0807BEEC
- adds r0, r1, 0x1
- strh r0, [r2, 0x22]
-_0807BEEC:
- pop {r0}
- bx r0
- thumb_func_end sub_807BE90
-
- thumb_func_start sub_807BEF0
-sub_807BEF0: @ 807BEF0
- push {lr}
- adds r2, r0, 0
- movs r1, 0x2E
- ldrsh r0, [r2, r1]
- cmp r0, 0x1
- bne _0807BF18
- ldrh r0, [r2, 0x30]
- adds r0, 0x1
- strh r0, [r2, 0x30]
- movs r1, 0x10
- ands r0, r1
- cmp r0, 0
- bne _0807BF18
- adds r0, r2, 0
- adds r0, 0x3E
- ldrb r1, [r0]
- movs r2, 0x4
- orrs r1, r2
- strb r1, [r0]
- b _0807BF24
-_0807BF18:
- adds r2, 0x3E
- ldrb r1, [r2]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r2]
-_0807BF24:
- pop {r0}
- bx r0
- thumb_func_end sub_807BEF0
-
- thumb_func_start sub_807BF28
-sub_807BF28: @ 807BF28
- push {r4-r7,lr}
- lsls r0, 16
- ldr r2, _0807BF78 @ =0xffe00000
- adds r0, r2
- lsrs r0, 16
- movs r6, 0
- lsls r7, r1, 16
-_0807BF36:
- lsls r5, r0, 16
- asrs r5, 16
- ldr r0, _0807BF7C @ =gSpriteTemplate_8393F74
- adds r1, r5, 0
- asrs r2, r7, 16
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- ldr r0, _0807BF80 @ =gSprites
- adds r4, r0
- adds r0, r4, 0
- adds r1, r6, 0
- bl StartSpriteAnim
- movs r0, 0x1
- strh r0, [r4, 0x2E]
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
- adds r5, 0x20
- lsls r5, 16
- lsrs r0, r5, 16
- cmp r6, 0x2
- bls _0807BF36
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0807BF78: .4byte 0xffe00000
-_0807BF7C: .4byte gSpriteTemplate_8393F74
-_0807BF80: .4byte gSprites
- thumb_func_end sub_807BF28
-
- thumb_func_start sub_807BF84
-sub_807BF84: @ 807BF84
- push {r4-r6,lr}
- lsls r0, 16
- ldr r2, _0807BFD4 @ =0xffc00000
- adds r0, r2
- lsrs r0, 16
- movs r5, 0
- lsls r6, r1, 16
-_0807BF92:
- lsls r4, r0, 16
- asrs r4, 16
- ldr r0, _0807BFD8 @ =gSpriteTemplate_8393F74
- adds r1, r4, 0
- asrs r2, r6, 16
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r2, r0, 4
- adds r2, r0
- lsls r2, 2
- ldr r0, _0807BFDC @ =gSprites
- adds r2, r0
- adds r1, r5, 0x3
- lsls r1, 24
- lsrs r1, 24
- adds r0, r2, 0
- bl StartSpriteAnim
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- adds r4, 0x20
- lsls r4, 16
- lsrs r0, r4, 16
- cmp r5, 0x4
- bls _0807BF92
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0807BFD4: .4byte 0xffc00000
-_0807BFD8: .4byte gSpriteTemplate_8393F74
-_0807BFDC: .4byte gSprites
- thumb_func_end sub_807BF84
-
- thumb_func_start sub_807BFE0
-sub_807BFE0: @ 807BFE0
- push {r4,lr}
- adds r3, r0, 0
- ldr r2, _0807C02C @ =gTasks
- ldr r0, _0807C030 @ =gUnknown_0202F7E4
- ldrb r1, [r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r2
- movs r1, 0xA
- ldrsh r0, [r0, r1]
- cmp r0, 0
- bne _0807C070
- movs r2, 0x20
- ldrsh r1, [r3, r2]
- ldr r0, _0807C034 @ =0x0000010f
- ldrh r4, [r3, 0x20]
- cmp r1, r0
- bgt _0807C070
- movs r2, 0x2E
- ldrsh r0, [r3, r2]
- cmp r0, 0
- beq _0807C064
- cmp r1, 0x77
- bgt _0807C038
- ldrh r1, [r3, 0x30]
- movs r2, 0x30
- ldrsh r0, [r3, r2]
- cmp r0, 0x1E
- bgt _0807C050
- adds r1, 0x1
- strh r1, [r3, 0x30]
- lsls r0, r1, 16
- asrs r0, 16
- cmp r0, 0x1E
- bgt _0807C050
- adds r0, r1, 0x1
- b _0807C04E
- .align 2, 0
-_0807C02C: .4byte gTasks
-_0807C030: .4byte gUnknown_0202F7E4
-_0807C034: .4byte 0x0000010f
-_0807C038:
- ldrh r1, [r3, 0x30]
- movs r2, 0x30
- ldrsh r0, [r3, r2]
- cmp r0, 0
- beq _0807C050
- subs r0, r1, 0x1
- strh r0, [r3, 0x30]
- lsls r0, 16
- cmp r0, 0
- beq _0807C050
- subs r0, r1, 0x2
-_0807C04E:
- strh r0, [r3, 0x30]
-_0807C050:
- ldrh r1, [r3, 0x30]
- movs r0, 0x1F
- ands r0, r1
- lsls r1, r0, 10
- lsls r2, r0, 5
- adds r1, r2
- orrs r1, r0
- ldr r0, _0807C06C @ =gPlttBufferFaded
- strh r1, [r0]
- .ifdef SAPPHIRE
- strh r1, [r0, 0x34]
- .else
- strh r1, [r0, 0x2A]
- .endif
-_0807C064:
- adds r0, r4, 0x4
- strh r0, [r3, 0x20]
- b _0807C07E
- .align 2, 0
-_0807C06C: .4byte gPlttBufferFaded
-_0807C070:
- ldr r1, _0807C084 @ =gPlttBufferFaded
- movs r0, 0
- strh r0, [r1]
- .ifdef SAPPHIRE
- strh r0, [r1, 0x34]
- .else
- strh r0, [r1, 0x2A]
- .endif
- adds r0, r3, 0
- bl DestroySprite
-_0807C07E:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807C084: .4byte gPlttBufferFaded
- thumb_func_end sub_807BFE0
-
- thumb_func_start sub_807C088
-sub_807C088: @ 807C088
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r0, _0807C0C0 @ =gSpriteTemplate_8393FC0
- movs r1, 0
- movs r2, 0x44
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0807C0C4 @ =gSprites
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r2
- ldrb r2, [r1, 0x1]
- movs r0, 0xD
- negs r0, r0
- ands r0, r2
- movs r2, 0x8
- orrs r0, r2
- strb r0, [r1, 0x1]
- strh r4, [r1, 0x2E]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0807C0C0: .4byte gSpriteTemplate_8393FC0
-_0807C0C4: .4byte gSprites
- thumb_func_end sub_807C088
-
- thumb_func_start sub_807C0C8
-sub_807C0C8: @ 807C0C8
- push {lr}
- bl sub_8089668
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- ldr r0, _0807C0E8 @ =REG_BG1VOFS
- ldr r1, _0807C0EC @ =gUnknown_030041B4
- ldrh r1, [r1]
- strh r1, [r0]
- pop {r0}
- bx r0
- .align 2, 0
-_0807C0E8: .4byte REG_BG1VOFS
-_0807C0EC: .4byte gUnknown_030041B4
- thumb_func_end sub_807C0C8
-
- thumb_func_start CB2_InitTitleScreen
-CB2_InitTitleScreen: @ 807C0F0
- push {r4,r5,lr}
- sub sp, 0x14
- ldr r0, _0807C10C @ =gMain
- ldr r1, _0807C110 @ =0x0000043c
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x5
- bhi _0807C130
- lsls r0, 2
- ldr r1, _0807C114 @ =_0807C118
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0807C10C: .4byte gMain
-_0807C110: .4byte 0x0000043c
-_0807C114: .4byte _0807C118
- .align 2, 0
-_0807C118:
- .4byte _0807C130
- .4byte _0807C1E4
- .4byte _0807C2B8
- .4byte _0807C308
- .4byte _0807C33C
- .4byte _0807C418
-_0807C130:
- movs r0, 0
- bl SetVBlankCallback
- ldr r0, _0807C1C0 @ =REG_BLDCNT
- movs r1, 0
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- movs r2, 0xA0
- lsls r2, 19
- ldr r3, _0807C1C4 @ =0x00007fff
- adds r0, r3, 0
- strh r0, [r2]
- movs r0, 0x80
- lsls r0, 19
- strh r1, [r0]
- adds r0, 0xC
- strh r1, [r0]
- subs r0, 0x2
- strh r1, [r0]
- subs r0, 0x2
- strh r1, [r0]
- adds r0, 0x10
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- add r0, sp, 0xC
- strh r1, [r0]
- ldr r1, _0807C1C8 @ =0x040000d4
- str r0, [r1]
- movs r0, 0xC0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _0807C1CC @ =0x8100c000
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r2, 0
- str r2, [sp, 0x10]
- add r0, sp, 0x10
- str r0, [r1]
- movs r0, 0xE0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _0807C1D0 @ =0x85000100
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- add r0, sp, 0xC
- strh r2, [r0]
- str r0, [r1]
- ldr r0, _0807C1D4 @ =0x05000002
- str r0, [r1, 0x4]
- ldr r0, _0807C1D8 @ =0x810001ff
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- bl ResetPaletteFade
- ldr r0, _0807C1DC @ =gMain
- ldr r1, _0807C1E0 @ =0x0000043c
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
- b _0807C446
- .align 2, 0
-_0807C1C0: .4byte REG_BLDCNT
-_0807C1C4: .4byte 0x00007fff
-_0807C1C8: .4byte 0x040000d4
-_0807C1CC: .4byte 0x8100c000
-_0807C1D0: .4byte 0x85000100
-_0807C1D4: .4byte 0x05000002
-_0807C1D8: .4byte 0x810001ff
-_0807C1DC: .4byte gMain
-_0807C1E0: .4byte 0x0000043c
-_0807C1E4:
- ldr r0, _0807C270 @ =gUnknown_08E9D8CC
- movs r1, 0xC0
- lsls r1, 19
- bl LZ77UnCompVram
- ldr r0, _0807C274 @ =gUnknown_08E9F7E4
- ldr r1, _0807C278 @ =0x06004800
- bl LZ77UnCompVram
- ldr r4, _0807C27C @ =gUnknown_08E9F624
- movs r5, 0xE0
- lsls r5, 1
- adds r0, r4, 0
- movs r1, 0
- adds r2, r5, 0
- bl LoadPalette
- ldr r0, _0807C280 @ =gUnknown_08393250
- ldr r1, _0807C284 @ =0x06008000
- bl LZ77UnCompVram
- ldr r0, _0807C288 @ =gUnknown_083939EC
- ldr r1, _0807C28C @ =0x0600c000
- bl LZ77UnCompVram
- ldr r0, _0807C290 @ =gUnknown_08393BF8
- ldr r1, _0807C294 @ =0x0600c800
- bl LZ77UnCompVram
- ldr r0, _0807C298 @ =gUnknown_08393210
- movs r1, 0xE0
- movs r2, 0x40
- bl LoadPalette
- bl remove_some_task
- bl ResetTasks
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- ldr r1, _0807C29C @ =gReservedSpritePaletteCount
- movs r0, 0xE
- strb r0, [r1]
- ldr r0, _0807C2A0 @ =gUnknown_08393EFC
- bl LoadCompressedObjectPic
- ldr r0, _0807C2A4 @ =gUnknown_08393F8C
- bl LoadCompressedObjectPic
- ldr r0, _0807C2A8 @ =gUnknown_08393FD8
- bl LoadCompressedObjectPic
- movs r1, 0x80
- lsls r1, 1
- adds r0, r4, 0
- adds r2, r5, 0
- bl LoadPalette
- ldr r0, _0807C2AC @ =gUnknown_08393F9C
- bl LoadSpritePalette
- ldr r0, _0807C2B0 @ =gMain
- ldr r2, _0807C2B4 @ =0x0000043c
- adds r0, r2
- movs r1, 0x2
- strb r1, [r0]
- b _0807C446
- .align 2, 0
-_0807C270: .4byte gUnknown_08E9D8CC
-_0807C274: .4byte gUnknown_08E9F7E4
-_0807C278: .4byte 0x06004800
-_0807C27C: .4byte gUnknown_08E9F624
-_0807C280: .4byte gUnknown_08393250
-_0807C284: .4byte 0x06008000
-_0807C288: .4byte gUnknown_083939EC
-_0807C28C: .4byte 0x0600c000
-_0807C290: .4byte gUnknown_08393BF8
-_0807C294: .4byte 0x0600c800
-_0807C298: .4byte gUnknown_08393210
-_0807C29C: .4byte gReservedSpritePaletteCount
-_0807C2A0: .4byte gUnknown_08393EFC
-_0807C2A4: .4byte gUnknown_08393F8C
-_0807C2A8: .4byte gUnknown_08393FD8
-_0807C2AC: .4byte gUnknown_08393F9C
-_0807C2B0: .4byte gMain
-_0807C2B4: .4byte 0x0000043c
-_0807C2B8:
- ldr r0, _0807C2F0 @ =sub_807C46C
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0807C2F4 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- movs r3, 0
- movs r2, 0x80
- lsls r2, 1
- strh r2, [r1, 0x8]
- strh r3, [r1, 0xA]
- ldr r2, _0807C2F8 @ =0x0000fff0
- strh r2, [r1, 0xC]
- subs r2, 0x10
- strh r2, [r1, 0xE]
- ldr r1, _0807C2FC @ =gUnknown_0202F7E4
- strb r0, [r1]
- ldr r0, _0807C300 @ =gMain
- ldr r3, _0807C304 @ =0x0000043c
- adds r0, r3
- movs r1, 0x3
- strb r1, [r0]
- b _0807C446
- .align 2, 0
-_0807C2F0: .4byte sub_807C46C
-_0807C2F4: .4byte gTasks
-_0807C2F8: .4byte 0x0000fff0
-_0807C2FC: .4byte gUnknown_0202F7E4
-_0807C300: .4byte gMain
-_0807C304: .4byte 0x0000043c
-_0807C308:
- movs r0, 0x1
- negs r0, r0
- ldr r1, _0807C32C @ =0x0000ffff
- str r1, [sp]
- movs r1, 0x1
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldr r0, _0807C330 @ =sub_807C0C8
- bl SetVBlankCallback
- ldr r0, _0807C334 @ =gMain
- ldr r1, _0807C338 @ =0x0000043c
- adds r0, r1
- movs r1, 0x4
- strb r1, [r0]
- b _0807C446
- .align 2, 0
-_0807C32C: .4byte 0x0000ffff
-_0807C330: .4byte sub_807C0C8
-_0807C334: .4byte gMain
-_0807C338: .4byte 0x0000043c
-_0807C33C:
- movs r2, 0x80
- lsls r2, 1
- movs r0, 0x78
- movs r1, 0x50
- movs r3, 0
- bl sub_813CE30
- ldr r1, _0807C3D4 @ =REG_BG2X_L
- ldr r0, _0807C3D8 @ =0xffffe300
- str r0, [r1]
- adds r1, 0x4
- ldr r0, _0807C3DC @ =0xffffdf00
- str r0, [r1]
- ldr r0, _0807C3E0 @ =REG_WIN0H
- movs r4, 0
- strh r4, [r0]
- adds r0, 0x4
- strh r4, [r0]
- subs r0, 0x2
- strh r4, [r0]
- adds r0, 0x4
- strh r4, [r0]
- adds r1, 0x1C
- ldr r2, _0807C3E4 @ =0x00001f1f
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- ldr r3, _0807C3E8 @ =0x00003f1f
- adds r0, r3, 0
- strh r0, [r1]
- adds r1, 0x6
- movs r0, 0x84
- strh r0, [r1]
- ldr r0, _0807C3EC @ =REG_BLDALPHA
- strh r4, [r0]
- adds r0, 0x2
- movs r5, 0x8
- strh r5, [r0]
- subs r1, 0x48
- ldr r2, _0807C3F0 @ =0x0000180b
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- ldr r3, _0807C3F4 @ =0x0000190a
- adds r0, r3, 0
- strh r0, [r1]
- adds r1, 0x2
- ldr r2, _0807C3F8 @ =0x00004981
- adds r0, r2, 0
- strh r0, [r1]
- ldr r3, _0807C3FC @ =0x04000208
- ldrh r2, [r3]
- strh r4, [r3]
- ldr r4, _0807C400 @ =0x04000200
- ldrh r0, [r4]
- movs r1, 0x1
- orrs r0, r1
- strh r0, [r4]
- strh r2, [r3]
- ldr r1, _0807C404 @ =REG_DISPSTAT
- ldrh r0, [r1]
- orrs r0, r5
- strh r0, [r1]
- subs r1, 0x4
- ldr r3, _0807C408 @ =0x0000b441
- adds r0, r3, 0
- strh r0, [r1]
- ldr r0, _0807C40C @ =0x0000019d
- bl m4aSongNumStart
- ldr r0, _0807C410 @ =gMain
- ldr r1, _0807C414 @ =0x0000043c
- adds r0, r1
- movs r1, 0x5
- strb r1, [r0]
- b _0807C446
- .align 2, 0
-_0807C3D4: .4byte REG_BG2X_L
-_0807C3D8: .4byte 0xffffe300
-_0807C3DC: .4byte 0xffffdf00
-_0807C3E0: .4byte REG_WIN0H
-_0807C3E4: .4byte 0x00001f1f
-_0807C3E8: .4byte 0x00003f1f
-_0807C3EC: .4byte REG_BLDALPHA
-_0807C3F0: .4byte 0x0000180b
-_0807C3F4: .4byte 0x0000190a
-_0807C3F8: .4byte 0x00004981
-_0807C3FC: .4byte 0x04000208
-_0807C400: .4byte 0x04000200
-_0807C404: .4byte REG_DISPSTAT
-_0807C408: .4byte 0x0000b441
-_0807C40C: .4byte 0x0000019d
-_0807C410: .4byte gMain
-_0807C414: .4byte 0x0000043c
-_0807C418:
- bl UpdatePaletteFade
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- bne _0807C446
- movs r0, 0
- bl sub_807C088
- str r4, [sp]
- movs r0, 0x4
- str r0, [sp, 0x4]
- movs r0, 0x1
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0xA0
- movs r2, 0x4
- movs r3, 0x4
- bl sub_8089944
- ldr r0, _0807C450 @ =sub_807C454
- bl SetMainCallback2
-_0807C446:
- add sp, 0x14
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0807C450: .4byte sub_807C454
- thumb_func_end CB2_InitTitleScreen
-
- thumb_func_start sub_807C454
-sub_807C454: @ 807C454
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_807C454
-
- thumb_func_start sub_807C46C
-sub_807C46C: @ 807C46C
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- ldr r0, _0807C4D4 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0xF
- ands r0, r1
- ldr r5, _0807C4D8 @ =gTasks
- cmp r0, 0
- bne _0807C492
- lsls r0, r6, 2
- adds r1, r0, r6
- lsls r1, 3
- adds r1, r5
- movs r2, 0xA
- ldrsh r1, [r1, r2]
- adds r4, r0, 0
- cmp r1, 0
- beq _0807C4A4
-_0807C492:
- lsls r3, r6, 2
- adds r0, r3, r6
- lsls r0, 3
- adds r0, r5
- movs r2, 0
- movs r1, 0x1
- strh r1, [r0, 0xA]
- strh r2, [r0, 0x8]
- adds r4, r3, 0
-_0807C4A4:
- adds r0, r4, r6
- lsls r0, 3
- adds r7, r0, r5
- movs r3, 0x8
- ldrsh r2, [r7, r3]
- cmp r2, 0
- beq _0807C4DC
- ldrh r0, [r7, 0x8]
- cmp r0, 0xA0
- beq _0807C4BC
- cmp r0, 0x40
- bne _0807C4C2
-_0807C4BC:
- movs r0, 0x1
- bl sub_807C088
-_0807C4C2:
- ldr r0, _0807C4D8 @ =gTasks
- adds r1, r4, r6
- lsls r1, 3
- adds r1, r0
- ldrh r0, [r1, 0x8]
- subs r0, 0x1
- strh r0, [r1, 0x8]
- b _0807C558
- .align 2, 0
-_0807C4D4: .4byte gMain
-_0807C4D8: .4byte gTasks
-_0807C4DC:
- movs r1, 0x80
- lsls r1, 19
- ldr r3, _0807C560 @ =0x00001441
- adds r0, r3, 0
- strh r0, [r1]
- ldr r0, _0807C564 @ =REG_WININ
- strh r2, [r0]
- adds r0, 0x2
- strh r2, [r0]
- adds r1, 0x50
- ldr r3, _0807C568 @ =0x00003f50
- adds r0, r3, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x1F
- strh r0, [r1]
- ldr r0, _0807C56C @ =REG_BLDY
- strh r2, [r0]
- ldr r0, _0807C570 @ =gSpriteTemplate_8393ECC
- movs r1, 0x62
- movs r2, 0x1A
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _0807C574 @ =gSprites
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r5
- adds r2, r1, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r4, 0x4
- orrs r0, r4
- strb r0, [r2]
- strh r6, [r1, 0x30]
- ldr r0, _0807C578 @ =gSpriteTemplate_8393EE4
- movs r1, 0xA2
- movs r2, 0x1A
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r5
- adds r2, r1, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- orrs r0, r4
- strb r0, [r2]
- strh r6, [r1, 0x30]
- movs r0, 0x58
- strh r0, [r7, 0x12]
- movs r0, 0x90
- strh r0, [r7, 0x8]
- ldr r0, _0807C57C @ =sub_807C580
- str r0, [r7]
-_0807C558:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0807C560: .4byte 0x00001441
-_0807C564: .4byte REG_WININ
-_0807C568: .4byte 0x00003f50
-_0807C56C: .4byte REG_BLDY
-_0807C570: .4byte gSpriteTemplate_8393ECC
-_0807C574: .4byte gSprites
-_0807C578: .4byte gSpriteTemplate_8393EE4
-_0807C57C: .4byte sub_807C580
- thumb_func_end sub_807C46C
-
- thumb_func_start sub_807C580
-sub_807C580: @ 807C580
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r0, _0807C5D0 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0xF
- ands r0, r1
- ldr r2, _0807C5D4 @ =gTasks
- cmp r0, 0
- bne _0807C5A6
- lsls r0, r5, 2
- adds r1, r0, r5
- lsls r1, 3
- adds r1, r2
- movs r3, 0xA
- ldrsh r1, [r1, r3]
- adds r7, r0, 0
- cmp r1, 0
- beq _0807C5B8
-_0807C5A6:
- lsls r3, r5, 2
- adds r0, r3, r5
- lsls r0, 3
- adds r0, r2
- movs r2, 0
- movs r1, 0x1
- strh r1, [r0, 0xA]
- strh r2, [r0, 0x8]
- adds r7, r3, 0
-_0807C5B8:
- ldr r1, _0807C5D4 @ =gTasks
- adds r0, r7, r5
- lsls r0, 3
- adds r4, r0, r1
- ldrh r0, [r4, 0x8]
- movs r1, 0x8
- ldrsh r6, [r4, r1]
- cmp r6, 0
- beq _0807C5D8
- subs r0, 0x1
- strh r0, [r4, 0x8]
- b _0807C5FC
- .align 2, 0
-_0807C5D0: .4byte gMain
-_0807C5D4: .4byte gTasks
-_0807C5D8:
- movs r0, 0x1
- strh r0, [r4, 0xA]
- movs r1, 0x80
- lsls r1, 19
- ldr r2, _0807C634 @ =0x00001741
- adds r0, r2, 0
- strh r0, [r1]
- movs r0, 0x78
- movs r1, 0x6C
- bl sub_807BF28
- movs r0, 0x78
- movs r1, 0x94
- bl sub_807BF84
- strh r6, [r4, 0x10]
- ldr r0, _0807C638 @ =sub_807C644
- str r0, [r4]
-_0807C5FC:
- ldr r2, _0807C63C @ =gTasks
- adds r0, r7, r5
- lsls r0, 3
- adds r3, r0, r2
- ldrh r1, [r3, 0x8]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- bne _0807C61C
- ldrh r1, [r3, 0xE]
- movs r4, 0xE
- ldrsh r0, [r3, r4]
- cmp r0, 0
- beq _0807C61C
- adds r0, r1, 0x1
- strh r0, [r3, 0xE]
-_0807C61C:
- ldr r0, _0807C640 @ =REG_BG2Y_L
- adds r1, r7, r5
- lsls r1, 3
- adds r1, r2
- movs r2, 0xE
- ldrsh r1, [r1, r2]
- lsls r1, 8
- str r1, [r0]
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0807C634: .4byte 0x00001741
-_0807C638: .4byte sub_807C644
-_0807C63C: .4byte gTasks
-_0807C640: .4byte REG_BG2Y_L
- thumb_func_end sub_807C580
-
- thumb_func_start sub_807C644
-sub_807C644: @ 807C644
- push {r4-r6,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r6, r0, 24
- ldr r1, _0807C69C @ =REG_BLDCNT
- ldr r2, _0807C6A0 @ =0x00002142
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- ldr r2, _0807C6A4 @ =0x00001f0f
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0
- strh r0, [r1]
- ldr r4, _0807C6A8 @ =gMain
- ldrh r1, [r4, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- bne _0807C67A
- movs r0, 0x8
- ands r0, r1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, 0
- beq _0807C6B4
-_0807C67A:
- movs r0, 0x4
- bl FadeOutBGM
- movs r0, 0x1
- negs r0, r0
- ldr r1, _0807C6AC @ =0x0000ffff
- str r1, [sp]
- movs r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r0, _0807C6B0 @ =CB2_GoToMainMenu
- bl SetMainCallback2
- b _0807C74E
- .align 2, 0
-_0807C69C: .4byte REG_BLDCNT
-_0807C6A0: .4byte 0x00002142
-_0807C6A4: .4byte 0x00001f0f
-_0807C6A8: .4byte gMain
-_0807C6AC: .4byte 0x0000ffff
-_0807C6B0: .4byte CB2_GoToMainMenu
-_0807C6B4:
- ldrh r1, [r4, 0x2C]
- movs r0, 0x46
- ands r0, r1
- cmp r0, 0x46
- bne _0807C6C4
- ldr r0, _0807C6F4 @ =CB2_GoToClearSaveDataScreen
- bl SetMainCallback2
-_0807C6C4:
- ldrh r1, [r4, 0x2C]
- movs r0, 0x26
- ands r0, r1
- cmp r0, 0x26
- bne _0807C6FC
- bl sub_80691DC
- cmp r0, 0x1
- bne _0807C6FC
- movs r0, 0x4
- bl FadeOutBGM
- movs r0, 0x1
- negs r0, r0
- str r5, [sp]
- movs r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r0, _0807C6F8 @ =CB2_GoToResetRtcScreen
- bl SetMainCallback2
- b _0807C74E
- .align 2, 0
-_0807C6F4: .4byte CB2_GoToClearSaveDataScreen
-_0807C6F8: .4byte CB2_GoToResetRtcScreen
-_0807C6FC:
- ldr r0, _0807C758 @ =REG_BG2Y_L
- movs r3, 0
- str r3, [r0]
- ldr r1, _0807C75C @ =gTasks
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- adds r2, r0, r1
- ldrh r0, [r2, 0x8]
- adds r0, 0x1
- strh r0, [r2, 0x8]
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _0807C728
- ldrh r0, [r2, 0x10]
- adds r0, 0x1
- strh r0, [r2, 0x10]
- ldr r1, _0807C760 @ =gUnknown_030041B4
- strh r0, [r1]
- ldr r0, _0807C764 @ =gUnknown_030042C0
- strh r3, [r0]
-_0807C728:
- ldrb r0, [r2, 0x8]
- bl sub_807C7E4
- ldr r0, _0807C768 @ =gMPlay_BGM
- ldr r1, _0807C76C @ =0x0000ffff
- ldrh r0, [r0, 0x4]
- cmp r0, 0
- bne _0807C74E
- movs r0, 0x1
- negs r0, r0
- str r1, [sp]
- movs r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r0, _0807C770 @ =sub_807C790
- bl SetMainCallback2
-_0807C74E:
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0807C758: .4byte REG_BG2Y_L
-_0807C75C: .4byte gTasks
-_0807C760: .4byte gUnknown_030041B4
-_0807C764: .4byte gUnknown_030042C0
-_0807C768: .4byte gMPlay_BGM
-_0807C76C: .4byte 0x0000ffff
-_0807C770: .4byte sub_807C790
- thumb_func_end sub_807C644
-
- thumb_func_start CB2_GoToMainMenu
-CB2_GoToMainMenu: @ 807C774
- push {lr}
- bl UpdatePaletteFade
- lsls r0, 24
- cmp r0, 0
- bne _0807C786
- ldr r0, _0807C78C @ =CB2_InitMainMenu
- bl SetMainCallback2
-_0807C786:
- pop {r0}
- bx r0
- .align 2, 0
-_0807C78C: .4byte CB2_InitMainMenu
- thumb_func_end CB2_GoToMainMenu
-
- thumb_func_start sub_807C790
-sub_807C790: @ 807C790
- push {lr}
- bl UpdatePaletteFade
- lsls r0, 24
- cmp r0, 0
- bne _0807C7A2
- ldr r0, _0807C7A8 @ =sub_813BA88
- bl SetMainCallback2
-_0807C7A2:
- pop {r0}
- bx r0
- .align 2, 0
-_0807C7A8: .4byte sub_813BA88
- thumb_func_end sub_807C790
-
- thumb_func_start CB2_GoToClearSaveDataScreen
-CB2_GoToClearSaveDataScreen: @ 807C7AC
- push {lr}
- bl UpdatePaletteFade
- lsls r0, 24
- cmp r0, 0
- bne _0807C7BE
- ldr r0, _0807C7C4 @ =CB2_InitClearSaveDataScreen
- bl SetMainCallback2
-_0807C7BE:
- pop {r0}
- bx r0
- .align 2, 0
-_0807C7C4: .4byte CB2_InitClearSaveDataScreen
- thumb_func_end CB2_GoToClearSaveDataScreen
-
- thumb_func_start CB2_GoToResetRtcScreen
-CB2_GoToResetRtcScreen: @ 807C7C8
- push {lr}
- bl UpdatePaletteFade
- lsls r0, 24
- cmp r0, 0
- bne _0807C7DA
- ldr r0, _0807C7E0 @ =CB2_InitResetRtcScreen
- bl SetMainCallback2
-_0807C7DA:
- pop {r0}
- bx r0
- .align 2, 0
-_0807C7E0: .4byte CB2_InitResetRtcScreen
- thumb_func_end CB2_GoToResetRtcScreen
-
- thumb_func_start sub_807C7E4
-sub_807C7E4: @ 807C7E4
- push {lr}
- sub sp, 0x4
- lsls r1, r0, 24
- movs r0, 0xC0
- lsls r0, 18
- ands r0, r1
- cmp r0, 0
- bne _0807C820
- lsrs r0, r1, 26
- movs r1, 0x1F
- adds r2, r0, 0
- ands r2, r1
- movs r1, 0x20
- ands r0, r1
- cmp r0, 0
- bne _0807C80C
- .ifdef SAPPHIRE
- mov r0, sp
- strh r2, [r0]
- .else
- lsls r1, r2, 10
- mov r0, sp
- strh r1, [r0]
- .endif
- b _0807C816
-_0807C80C:
- movs r0, 0x1F
- subs r0, r2
- .ifndef SAPPHIRE
- lsls r0, 10
- .endif
- mov r1, sp
- strh r0, [r1]
-_0807C816:
- mov r0, sp
- movs r1, 0xEF
- movs r2, 0x2
- bl LoadPalette
-_0807C820:
- add sp, 0x4
- pop {r0}
- bx r0
- thumb_func_end sub_807C7E4
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/data2.s b/data/data2.s
index c60b7495e..a64838ec8 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -10355,11 +10355,11 @@ gSpriteAnimTable_8393EC8:: @ 8393EC8
.align 2
gSpriteTemplate_8393ECC:: @ 8393ECC
- spr_template 1000, 1000, gOamData_8393EA4, gSpriteAnimTable_8393EC4, NULL, gDummySpriteAffineAnimTable, item_menu_type_2
+ spr_template 1000, 1000, gOamData_8393EA4, gSpriteAnimTable_8393EC4, NULL, gDummySpriteAffineAnimTable, SpriteCallback_VersionBannerLeft
.align 2
gSpriteTemplate_8393EE4:: @ 8393EE4
- spr_template 1000, 1000, gOamData_8393EAC, gSpriteAnimTable_8393EC8, NULL, gDummySpriteAffineAnimTable, sub_807BE90
+ spr_template 1000, 1000, gOamData_8393EAC, gSpriteAnimTable_8393EC8, NULL, gDummySpriteAffineAnimTable, SpriteCallback_VersionBannerRight
.align 2
gUnknown_08393EFC:: @ 8393EFC
@@ -10425,7 +10425,7 @@ gSpriteAnimTable_8393F54:: @ 8393F54
.align 2
gSpriteTemplate_8393F74:: @ 8393F74
- spr_template 1001, 1001, gOamData_8393F0C, gSpriteAnimTable_8393F54, NULL, gDummySpriteAffineAnimTable, sub_807BEF0
+ spr_template 1001, 1001, gOamData_8393F0C, gSpriteAnimTable_8393F54, NULL, gDummySpriteAffineAnimTable, SpriteCallback_PressStartCopyrightBanner
.align 2
gUnknown_08393F8C:: @ 8393F8C
@@ -10454,7 +10454,7 @@ gSpriteAnimTable_8393FBC:: @ 8393FBC
.align 2
gSpriteTemplate_8393FC0:: @ 8393FC0
- spr_template 1002, 1001, gOamData_8393FAC, gSpriteAnimTable_8393FBC, NULL, gDummySpriteAffineAnimTable, sub_807BFE0
+ spr_template 1002, 1001, gOamData_8393FAC, gSpriteAnimTable_8393FBC, NULL, gDummySpriteAffineAnimTable, SpriteCallback_PokemonLogoShine
.align 2
gUnknown_08393FD8:: @ 8393FD8
diff --git a/include/sprite.h b/include/sprite.h
index 288b88518..2da099d59 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -193,7 +193,7 @@ extern struct Sprite gSprites[];
void ResetSpriteData(void);
void AnimateSprites(void);
void BuildOamBuffer(void);
-u8 CreateSprite(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority);
+u8 CreateSprite(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
u8 CreateSpriteAtEnd(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority);
u8 CreateInvisibleSprite(void (*callback)(struct Sprite *));
u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
diff --git a/ld_script.txt b/ld_script.txt
index fd8dbc72a..c00e02e01 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -94,7 +94,7 @@ SECTIONS {
asm/rom_8074BAC.o(.text);
src/task.o(.text);
asm/rom5.o(.text);
- asm/title_screen.o(.text);
+ src/title_screen.o(.text);
asm/weather.o(.text);
asm/rom_8080874.o(.text);
src/battle_setup.o(.text);
diff --git a/src/intro.c b/src/intro.c
index 0a91a4f93..e103109f9 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -141,7 +141,7 @@ void c2_copyright_1(void)
}
}
-void sub_813BA88(void)
+void CB2_InitCopyrightScreen(void)
{
SetUpCopyrightScreen();
}
diff --git a/src/sprite.c b/src/sprite.c
index 7a654472c..12c62145e 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -530,7 +530,7 @@ static void AddSpritesToOamBuffer(void)
}
}
-u8 CreateSprite(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority)
+u8 CreateSprite(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
{
u8 i;
diff --git a/src/title_screen.c b/src/title_screen.c
new file mode 100644
index 000000000..d5cfa032b
--- /dev/null
+++ b/src/title_screen.c
@@ -0,0 +1,496 @@
+#include "global.h"
+#include "gba/m4a_internal.h"
+#include "main.h"
+#include "palette.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+
+extern void m4aSongNumStart(u16);
+extern void LoadCompressedObjectPic(void *);
+extern void CB2_InitCopyrightScreen(void);
+extern void CB2_InitMainMenu(void);
+extern void CB2_InitClearSaveDataScreen(void);
+extern void CB2_InitResetRtcScreen(void);
+
+extern u8 gReservedSpritePaletteCount;
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern u8 gUnknown_0202F7E4;
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_030042C0;
+extern u8 gUnknown_08393210[];
+extern u8 gUnknown_08393250[];
+extern u8 gUnknown_083939EC[];
+extern u8 gUnknown_08393BF8[];
+extern u16 gUnknown_08393E64[];
+extern struct SpriteTemplate gSpriteTemplate_8393ECC;
+extern struct SpriteTemplate gSpriteTemplate_8393EE4;
+extern u8 gUnknown_08393EFC[];
+extern struct SpriteTemplate gSpriteTemplate_8393F74;
+extern u8 gUnknown_08393F8C[];
+extern u8 gUnknown_08393F9C[];
+extern struct SpriteTemplate gSpriteTemplate_8393FC0;
+extern u8 gUnknown_08393FD8[];
+extern u8 gUnknown_08E9D8CC[];
+extern u8 gUnknown_08E9F624[];
+extern u8 gUnknown_08E9F7E4[];
+
+static void MainCB2(void);
+static void Task_TitleScreenPhase1(u8);
+static void Task_TitleScreenPhase2(u8);
+static void Task_TitleScreenPhase3(u8);
+static void CB2_GoToMainMenu(void);
+static void CB2_GoToClearSaveDataScreen(void);
+static void CB2_GoToResetRtcScreen(void);
+static void CB2_GoToCopyrightScreen(void);
+static void UpdateLegendaryMarkingColor(u8);
+
+#define _RGB(r, g, b) ((((b) & 31) << 10) + (((g) & 31) << 5) + ((r) & 31))
+
+#ifdef SAPPHIRE
+//Red Kyogre markings
+#define LEGENDARY_MARKING_COLOR(c) RGB((c), 0, 0)
+#else
+//Blue Groundon markings
+#define LEGENDARY_MARKING_COLOR(c) RGB(0, 0, (c))
+#endif
+
+#ifdef SAPPHIRE
+#define PLTT_BUFFER_INDEX 26
+#else
+#define PLTT_BUFFER_INDEX 21
+#endif
+
+#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP)
+#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT)
+#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON)
+
+void SpriteCallback_VersionBannerLeft(struct Sprite *sprite)
+{
+ struct Task *task = &gTasks[sprite->data1];
+
+ if (task->data[1] != 0)
+ {
+ sprite->oam.objMode = 0;
+ sprite->pos1.y = 66;
+ sprite->invisible = FALSE;
+ }
+ else
+ {
+ if (task->data[5] != 0)
+ task->data[5]--;
+ if (task->data[5] < 64)
+ {
+ sprite->invisible = FALSE;
+ if (sprite->pos1.y != 66)
+ sprite->pos1.y++;
+ REG_BLDALPHA = gUnknown_08393E64[task->data[5] / 2];
+ }
+ }
+}
+
+void SpriteCallback_VersionBannerRight(struct Sprite *sprite)
+{
+ struct Task *task = &gTasks[sprite->data1];
+
+ if (task->data[1] != 0)
+ {
+ sprite->oam.objMode = 0;
+ sprite->pos1.y = 66;
+ sprite->invisible = FALSE;
+ }
+ else
+ {
+ if (task->data[5] < 64)
+ {
+ sprite->invisible = FALSE;
+ if (sprite->pos1.y != 66)
+ sprite->pos1.y++;
+ }
+ }
+}
+
+void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite)
+{
+ if (sprite->data0 == 1)
+ {
+ sprite->data1++;
+ //Alternate between hidden and shown every 16th frame
+ if (sprite->data1 & 16)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+ }
+ else
+ sprite->invisible = FALSE;
+}
+
+static void CreatePressStartBanner(s16 x, s16 y)
+{
+ u8 i;
+ u8 spriteId;
+
+ x -= 32;
+ for (i = 0; i < 3; i++, x += 32)
+ {
+ spriteId = CreateSprite(&gSpriteTemplate_8393F74, x, y, 0);
+ StartSpriteAnim(&gSprites[spriteId], i);
+ gSprites[spriteId].data0 = 1;
+ }
+}
+
+static void CreateCopyrightBanner(s16 x, s16 y)
+{
+ u8 i;
+ u8 spriteId;
+
+ x -= 64;
+ for (i = 0; i < 5; i++, x += 32)
+ {
+ spriteId = CreateSprite(&gSpriteTemplate_8393F74, x, y, 0);
+ StartSpriteAnim(&gSprites[spriteId], i + 3);
+ }
+}
+
+void SpriteCallback_PokemonLogoShine(struct Sprite *sprite)
+{
+ if (gTasks[gUnknown_0202F7E4].data[1] == 0 && sprite->pos1.x < 272)
+ {
+ if (sprite->data0) //Flash background
+ {
+ u16 backgroundColor;
+
+ if (sprite->pos1.x < DISPLAY_WIDTH / 2)
+ {
+ //Brighten background color
+ if (sprite->data1 < 31)
+ sprite->data1++;
+ if (sprite->data1 < 31)
+ sprite->data1++;
+ }
+ else
+ {
+ //Darken background color
+ if (sprite->data1 != 0)
+ sprite->data1--;
+ if (sprite->data1 != 0)
+ sprite->data1--;
+ }
+ backgroundColor = _RGB(sprite->data1, sprite->data1, sprite->data1);
+ gPlttBufferFaded[0] = backgroundColor;
+ gPlttBufferFaded[PLTT_BUFFER_INDEX] = backgroundColor;
+ }
+ sprite->pos1.x += 4;
+ }
+ else
+ {
+ gPlttBufferFaded[0] = RGB_BLACK;
+ gPlttBufferFaded[PLTT_BUFFER_INDEX] = RGB_BLACK;
+ DestroySprite(sprite);
+ }
+}
+
+static void StartPokemonLogoShine(bool8 flashBackground)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_8393FC0, 0, 68, 0);
+
+ gSprites[spriteId].oam.objMode = 2;
+ gSprites[spriteId].data0 = flashBackground;
+}
+
+static void VBlankCB(void)
+{
+ sub_8089668();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ REG_BG1VOFS = gUnknown_030041B4;
+}
+
+enum
+{
+ TD_COUNTER,
+ TD_SKIP,
+};
+
+void CB2_InitTitleScreen(void)
+{
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ *((u16 *)PLTT) = RGB_WHITE;
+ REG_DISPCNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ DmaFill16(3, 0, (void *)VRAM, 0x18000);
+ DmaFill32(3, 0, (void *)OAM, 0x400);
+ DmaFill16(3, 0, (void *)(PLTT + 2), 0x3FE);
+ ResetPaletteFade();
+ gMain.state = 1;
+ break;
+ case 1:
+ LZ77UnCompVram(gUnknown_08E9D8CC, (void *)VRAM);
+ LZ77UnCompVram(gUnknown_08E9F7E4, (void *)(VRAM + 0x4800));
+ LoadPalette(gUnknown_08E9F624, 0, 0x1C0);
+ LZ77UnCompVram(gUnknown_08393250, (void *)(VRAM + 0x8000));
+ LZ77UnCompVram(gUnknown_083939EC, (void *)(VRAM + 0xC000));
+ LZ77UnCompVram(gUnknown_08393BF8, (void *)(VRAM + 0xC800));
+ LoadPalette(gUnknown_08393210, 0xE0, 0x40);
+ remove_some_task();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 14;
+ LoadCompressedObjectPic(gUnknown_08393EFC);
+ LoadCompressedObjectPic(gUnknown_08393F8C);
+ LoadCompressedObjectPic(gUnknown_08393FD8);
+ LoadPalette(gUnknown_08E9F624, 0x100, 0x1C0);
+ LoadSpritePalette(gUnknown_08393F9C);
+ gMain.state = 2;
+ break;
+ case 2:
+ {
+ u8 taskId = CreateTask(Task_TitleScreenPhase1, 0);
+
+ gTasks[taskId].data[TD_COUNTER] = 0x100;
+ gTasks[taskId].data[TD_SKIP] = FALSE;
+ gTasks[taskId].data[2] = -16;
+ gTasks[taskId].data[3] = -32;
+ gUnknown_0202F7E4 = taskId;
+ gMain.state = 3;
+ break;
+ }
+ case 3:
+ BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF);
+ SetVBlankCallback(VBlankCB);
+ gMain.state = 4;
+ break;
+ case 4:
+ {
+ u16 savedIme;
+
+ sub_813CE30(0x78, 0x50, 0x100, 0);
+ REG_BG2X = -29 * 256;
+ REG_BG2Y = -33 * 256;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_WININ = 0x1F1F;
+ REG_WINOUT = 0x3F1F;
+ REG_BLDCNT = 0x84;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0x8;
+ REG_BG0CNT = 0x180B;
+ REG_BG1CNT = 0x190A;
+ REG_BG2CNT = 0x4981;
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ REG_DISPCNT = DISPCNT_MODE_1
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON
+ | DISPCNT_OBJWIN_ON;
+ m4aSongNumStart(0x19D);
+ gMain.state = 5;
+ break;
+ }
+ case 5:
+ if (!UpdatePaletteFade())
+ {
+ StartPokemonLogoShine(FALSE);
+ sub_8089944(0, 0xA0, 4, 4, 0, 4, 1);
+ SetMainCallback2(MainCB2);
+ }
+ break;
+ }
+}
+
+static void MainCB2(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+//Shine the Pokemon logo two more times, and fade in the version banner
+static void Task_TitleScreenPhase1(u8 taskId)
+{
+ //Skip to next phase when A, B, Start, or Select is pressed
+ if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[1] != 0)
+ {
+ gTasks[taskId].data[TD_SKIP] = TRUE;
+ gTasks[taskId].data[TD_COUNTER] = 0;
+ }
+
+ if (gTasks[taskId].data[TD_COUNTER] != 0)
+ {
+ u16 frameNum = gTasks[taskId].data[TD_COUNTER];
+
+ if (frameNum == 160 || frameNum == 64)
+ StartPokemonLogoShine(TRUE);
+ gTasks[taskId].data[TD_COUNTER]--;
+ }
+ else
+ {
+ u8 spriteId;
+
+ REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_BLDCNT = 0x3F50;
+ REG_BLDALPHA = 0x1F;
+ REG_BLDY = 0;
+
+ //Create left side of version banner
+ spriteId = CreateSprite(&gSpriteTemplate_8393ECC, 0x62, 0x1A, 0);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data1 = taskId;
+
+ //Create right side of version banner
+ spriteId = CreateSprite(&gSpriteTemplate_8393EE4, 0xA2, 0x1A, 0);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data1 = taskId;
+
+ gTasks[taskId].data[5] = 88;
+ gTasks[taskId].data[TD_COUNTER] = 144;
+ gTasks[taskId].func = Task_TitleScreenPhase2;
+ }
+}
+
+//Create "Press Start" and copyright banners, and slide Pokemon logo up
+static void Task_TitleScreenPhase2(u8 taskId)
+{
+ //Skip to next phase when A, B, Start, or Select is pressed
+ if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[TD_SKIP])
+ {
+ gTasks[taskId].data[TD_SKIP] = TRUE;
+ gTasks[taskId].data[TD_COUNTER] = 0;
+ }
+
+ if (gTasks[taskId].data[TD_COUNTER] != 0)
+ gTasks[taskId].data[TD_COUNTER]--;
+ else
+ {
+ gTasks[taskId].data[TD_SKIP] = TRUE;
+ REG_DISPCNT = DISPCNT_MODE_1
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON;
+ CreatePressStartBanner(DISPLAY_WIDTH / 2, 108);
+ CreateCopyrightBanner(DISPLAY_WIDTH / 2, 148);
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].func = Task_TitleScreenPhase3;
+ }
+
+ if (!(gTasks[taskId].data[TD_COUNTER] & 1) && gTasks[taskId].data[3] != 0)
+ gTasks[taskId].data[3]++;
+
+ //Slide Pokemon logo up
+ REG_BG2Y = gTasks[taskId].data[3] * 256;
+}
+
+//Show Kyogre/Groundon silhouette and process main title screen input
+static void Task_TitleScreenPhase3(u8 taskId)
+{
+ REG_BLDCNT = 0x2142;
+ REG_BLDALPHA = 0x1F0F;
+ REG_BLDY = 0;
+
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON))
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF);
+ SetMainCallback2(CB2_GoToMainMenu);
+ }
+ else
+ {
+ if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO)
+ SetMainCallback2(CB2_GoToClearSaveDataScreen);
+ if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO
+ && sub_80691DC() == 1)
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ SetMainCallback2(CB2_GoToResetRtcScreen);
+ }
+ else
+ {
+ REG_BG2Y = 0;
+ gTasks[taskId].data[TD_COUNTER]++;
+ if (gTasks[taskId].data[TD_COUNTER] & 1)
+ {
+ gTasks[taskId].data[4]++;
+ gUnknown_030041B4 = gTasks[taskId].data[4];
+ gUnknown_030042C0 = 0;
+ }
+ UpdateLegendaryMarkingColor(gTasks[taskId].data[TD_COUNTER]);
+ if ((gMPlay_BGM.status & 0xFFFF) == 0)
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF);
+ SetMainCallback2(CB2_GoToCopyrightScreen);
+ }
+ }
+ }
+}
+
+static void CB2_GoToMainMenu(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitMainMenu);
+}
+
+static void CB2_GoToCopyrightScreen(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitCopyrightScreen);
+}
+
+static void CB2_GoToClearSaveDataScreen(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitClearSaveDataScreen);
+}
+
+static void CB2_GoToResetRtcScreen(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitResetRtcScreen);
+}
+
+static void UpdateLegendaryMarkingColor(u8 frameNum)
+{
+ u16 palette;
+
+ if ((frameNum % 4) == 0) //Change color every 4th frame
+ {
+ u8 colorIntensity = (frameNum >> 2) & 31; //Take bits 2-6 of frameNum the color intensity
+ u8 fadeDarker = (frameNum >> 2) & 32;
+
+ if (!fadeDarker)
+ palette = LEGENDARY_MARKING_COLOR(colorIntensity);
+ else
+ palette = LEGENDARY_MARKING_COLOR(31 - colorIntensity);
+ LoadPalette(&palette, 0xEF, sizeof(palette));
+ }
+}
+