summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-07-01 22:10:35 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-07-01 22:10:35 -0400
commit2c953c5baf05d12a829cb73664c9a95f660f1548 (patch)
tree82543acf54c6996fb2d58abf0eb45771c446cdcd
parent74d771ef90a3189bd2da1b35f6b42a1fa8f51e67 (diff)
Redo partial decomp of intro (force push)
-rw-r--r--asm/intro.s702
-rw-r--r--baserom.ipsbin2401339 -> 2401107 bytes
-rw-r--r--include/libgcnmultiboot.h17
-rw-r--r--include/link.h2
-rw-r--r--ld_script.txt1
-rw-r--r--src/intro.c289
6 files changed, 309 insertions, 702 deletions
diff --git a/asm/intro.s b/asm/intro.s
index 24b7bb9b6..99a67a6a5 100644
--- a/asm/intro.s
+++ b/asm/intro.s
@@ -5,708 +5,6 @@
.text
- thumb_func_start sub_80EC5A4
-sub_80EC5A4: @ 80EC5A4
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_80EC5A4
-
- thumb_func_start sub_80EC5B8
-sub_80EC5B8: @ 80EC5B8
- push {lr}
- bl UpdatePaletteFade
- lsls r0, 24
- cmp r0, 0
- bne _080EC5CA
- ldr r0, _080EC5D0 @ =sub_80EC870
- bl SetMainCallback2
-_080EC5CA:
- pop {r0}
- bx r0
- .align 2, 0
-_080EC5D0: .4byte sub_80EC870
- thumb_func_end sub_80EC5B8
-
- thumb_func_start load_copyright_graphics
-load_copyright_graphics: @ 80EC5D4
- push {r4-r6,lr}
- adds r3, r0, 0
- adds r4, r1, 0
- adds r5, r2, 0
- lsls r3, 16
- lsrs r3, 16
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- ldr r0, _080EC610 @ =gUnknown_8402280
- movs r6, 0xC0
- lsls r6, 19
- adds r3, r6
- adds r1, r3, 0
- bl LZ77UnCompVram
- ldr r0, _080EC614 @ =gUnknown_84024E4
- adds r4, r6
- adds r1, r4, 0
- bl LZ77UnCompVram
- ldr r0, _080EC618 @ =gUnknown_8402260
- adds r1, r5, 0
- movs r2, 0x20
- bl LoadPalette
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080EC610: .4byte gUnknown_8402280
-_080EC614: .4byte gUnknown_84024E4
-_080EC618: .4byte gUnknown_8402260
- thumb_func_end load_copyright_graphics
-
- thumb_func_start SerialCb_CopyrightScreen
-SerialCb_CopyrightScreen: @ 80EC61C
- push {lr}
- ldr r0, _080EC628 @ =gUnknown_203AAD4
- bl GameCubeMultiBoot_HandleSerialInterrupt
- pop {r0}
- bx r0
- .align 2, 0
-_080EC628: .4byte gUnknown_203AAD4
- thumb_func_end SerialCb_CopyrightScreen
-
- thumb_func_start sub_80EC62C
-sub_80EC62C: @ 80EC62C
- push {r4-r6,lr}
- sub sp, 0xC
- ldr r0, _080EC64C @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r5, r0, r1
- ldrb r4, [r5]
- cmp r4, 0x8C
- bne _080EC640
- b _080EC778
-_080EC640:
- cmp r4, 0x8C
- bgt _080EC650
- cmp r4, 0
- beq _080EC65E
- b _080EC732
- .align 2, 0
-_080EC64C: .4byte gMain
-_080EC650:
- cmp r4, 0x8D
- bne _080EC656
- b _080EC7A4
-_080EC656:
- cmp r4, 0x8E
- bne _080EC65C
- b _080EC808
-_080EC65C:
- b _080EC732
-_080EC65E:
- movs r0, 0
- bl SetVBlankCallback
- 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 r1, 0xA0
- lsls r1, 19
- ldr r2, _080EC74C @ =0x00007fff
- adds r0, r2, 0
- strh r0, [r1]
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x10
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x12
- movs r1, 0
- bl SetGpuReg
- add r0, sp, 0x4
- strh r4, [r0]
- ldr r1, _080EC750 @ =0x040000d4
- str r0, [r1]
- movs r0, 0xC0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080EC754 @ =0x8100c000
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- str r4, [sp, 0x8]
- add r0, sp, 0x8
- str r0, [r1]
- movs r0, 0xE0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080EC758 @ =0x85000100
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- add r0, sp, 0x4
- strh r4, [r0]
- str r0, [r1]
- ldr r0, _080EC75C @ =0x05000002
- str r0, [r1, 0x4]
- ldr r0, _080EC760 @ =0x810001ff
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- bl ResetPaletteFade
- movs r1, 0xE0
- lsls r1, 6
- movs r0, 0
- movs r2, 0
- bl load_copyright_graphics
- bl ScanlineEffect_Stop
- bl ResetTasks
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- movs r0, 0x1
- negs r0, r0
- ldr r1, _080EC764 @ =0x0000ffff
- str r1, [sp]
- movs r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- movs r1, 0xE0
- lsls r1, 3
- movs r0, 0x8
- bl SetGpuReg
- movs r0, 0x1
- bl EnableInterrupts
- ldr r0, _080EC768 @ =sub_80EC5A4
- bl SetVBlankCallback
- movs r1, 0xA0
- lsls r1, 1
- movs r0, 0
- bl SetGpuReg
- ldr r0, _080EC76C @ =SerialCb_CopyrightScreen
- bl SetSerialCallback
- ldr r0, _080EC770 @ =gUnknown_203AAD4
- bl GameCubeMultiBoot_Init
-_080EC732:
- bl UpdatePaletteFade
- ldr r0, _080EC774 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- ldrb r1, [r0]
- adds r1, 0x1
- strb r1, [r0]
- ldr r0, _080EC770 @ =gUnknown_203AAD4
- bl GameCubeMultiBoot_Main
- b _080EC812
- .align 2, 0
-_080EC74C: .4byte 0x00007fff
-_080EC750: .4byte 0x040000d4
-_080EC754: .4byte 0x8100c000
-_080EC758: .4byte 0x85000100
-_080EC75C: .4byte 0x05000002
-_080EC760: .4byte 0x810001ff
-_080EC764: .4byte 0x0000ffff
-_080EC768: .4byte sub_80EC5A4
-_080EC76C: .4byte SerialCb_CopyrightScreen
-_080EC770: .4byte gUnknown_203AAD4
-_080EC774: .4byte gMain
-_080EC778:
- ldr r4, _080EC7A0 @ =gUnknown_203AAD4
- adds r0, r4, 0
- bl GameCubeMultiBoot_Main
- ldrb r0, [r4, 0x2]
- cmp r0, 0x1
- beq _080EC812
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
- b _080EC812
- .align 2, 0
-_080EC7A0: .4byte gUnknown_203AAD4
-_080EC7A4:
- bl UpdatePaletteFade
- lsls r0, 24
- cmp r0, 0
- bne _080EC812
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
- ldr r5, _080EC7E4 @ =gUnknown_203AAD4
- ldrb r0, [r5, 0x2]
- cmp r0, 0
- beq _080EC7F4
- ldrb r0, [r5, 0x2]
- cmp r0, 0x2
- bne _080EC7FE
- ldr r6, _080EC7E8 @ =0x020000ac
- ldr r4, [r6]
- ldr r0, _080EC7EC @ =0x65366347
- cmp r4, r0
- bne _080EC7DC
- ldr r0, _080EC7F0 @ =gMultiBootProgram_PokemonColosseum_Start
- movs r1, 0x80
- lsls r1, 18
- movs r2, 0xA0
- lsls r2, 9
- bl CpuSet
- str r4, [r6]
-_080EC7DC:
- adds r0, r5, 0
- bl GameCubeMultiBoot_ExecuteProgram
- b _080EC7FE
- .align 2, 0
-_080EC7E4: .4byte gUnknown_203AAD4
-_080EC7E8: .4byte 0x020000ac
-_080EC7EC: .4byte 0x65366347
-_080EC7F0: .4byte gMultiBootProgram_PokemonColosseum_Start
-_080EC7F4:
- bl GameCubeMultiBoot_Quit
- ldr r0, _080EC804 @ =SerialCB
- bl SetSerialCallback
-_080EC7FE:
- movs r0, 0
- b _080EC814
- .align 2, 0
-_080EC804: .4byte SerialCB
-_080EC808:
- bl sub_800B388
- ldr r0, _080EC81C @ =sub_80EC5B8
- bl SetMainCallback2
-_080EC812:
- movs r0, 0x1
-_080EC814:
- add sp, 0xC
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_080EC81C: .4byte sub_80EC5B8
- thumb_func_end sub_80EC62C
-
- thumb_func_start c2_copyright_1
-c2_copyright_1: @ 80EC820
- push {lr}
- bl sub_80EC62C
- lsls r0, 24
- cmp r0, 0
- bne _080EC858
- bl ResetMenuAndMonGlobals
- bl Save_ResetSaveCounters
- movs r0, 0
- bl Save_LoadGameData
- ldr r0, _080EC85C @ =gSaveFileStatus
- ldrh r0, [r0]
- cmp r0, 0
- beq _080EC846
- cmp r0, 0x2
- bne _080EC84A
-_080EC846:
- bl Sav2_ClearSetDefault
-_080EC84A:
- ldr r0, _080EC860 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- ldrb r0, [r0, 0x15]
- lsls r0, 31
- lsrs r0, 31
- bl SetPokemonCryStereo
-_080EC858:
- pop {r0}
- bx r0
- .align 2, 0
-_080EC85C: .4byte gSaveFileStatus
-_080EC860: .4byte gSaveBlock2Ptr
- thumb_func_end c2_copyright_1
-
- thumb_func_start sub_80EC864
-sub_80EC864: @ 80EC864
- push {lr}
- bl sub_80EC62C
- pop {r0}
- bx r0
- thumb_func_end sub_80EC864
-
- thumb_func_start sub_80EC870
-sub_80EC870: @ 80EC870
- push {r4,lr}
- sub sp, 0xC
- ldr r0, _080EC88C @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- ldrb r4, [r0]
- cmp r4, 0x1
- beq _080EC944
- cmp r4, 0x1
- bgt _080EC890
- cmp r4, 0
- beq _080EC8A0
- b _080EC894
- .align 2, 0
-_080EC88C: .4byte gMain
-_080EC890:
- cmp r4, 0x2
- beq _080EC988
-_080EC894:
- ldr r0, _080EC928 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_080EC8A0:
- movs r0, 0
- bl SetVBlankCallback
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- ldr r0, _080EC92C @ =gHeap
- movs r1, 0xE0
- lsls r1, 9
- bl InitHeap
- bl ResetTasks
- bl ResetSpriteData
- bl ResetPaletteFade
- bl ResetTempTileDataBuffers
- bl sub_80ECA00
- add r1, sp, 0x4
- movs r0, 0
- strh r0, [r1]
- ldr r1, _080EC930 @ =0x040000d4
- add r0, sp, 0x4
- str r0, [r1]
- movs r0, 0xC0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080EC934 @ =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, _080EC938 @ =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, _080EC93C @ =0x81000200
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r2, 0x80
- lsls r2, 3
- movs r0, 0
- movs r1, 0
- bl FillPalette
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _080EC940 @ =gUnknown_840BB80
- movs r0, 0
- movs r2, 0x2
- bl InitBgsFromTemplates
- b _080EC9B8
- .align 2, 0
-_080EC928: .4byte gMain
-_080EC92C: .4byte gHeap
-_080EC930: .4byte 0x040000d4
-_080EC934: .4byte 0x8100c000
-_080EC938: .4byte 0x85000100
-_080EC93C: .4byte 0x81000200
-_080EC940: .4byte gUnknown_840BB80
-_080EC944:
- ldr r0, _080EC978 @ =gUnknown_8402630
- movs r1, 0
- movs r2, 0x20
- bl LoadPalette
- ldr r1, _080EC97C @ =gUnknown_8402650
- movs r0, 0
- str r0, [sp]
- movs r0, 0x3
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r1, _080EC980 @ =gUnknown_8402668
- str r4, [sp]
- movs r0, 0x3
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- ldr r0, _080EC984 @ =gUnknown_840270C
- movs r1, 0xD0
- movs r2, 0x20
- bl LoadPalette
- b _080EC9B8
- .align 2, 0
-_080EC978: .4byte gUnknown_8402630
-_080EC97C: .4byte gUnknown_8402650
-_080EC980: .4byte gUnknown_8402668
-_080EC984: .4byte gUnknown_840270C
-_080EC988:
- bl FreeTempTileDataBuffersIfPossible
- lsls r0, 24
- cmp r0, 0
- bne _080EC9C6
- bl sub_80ECA70
- movs r0, 0x1
- negs r0, r0
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- ldr r0, _080EC9B0 @ =sub_80EC9D4
- bl SetMainCallback2
- ldr r0, _080EC9B4 @ =sub_80EC9EC
- bl SetVBlankCallback
- b _080EC9C6
- .align 2, 0
-_080EC9B0: .4byte sub_80EC9D4
-_080EC9B4: .4byte sub_80EC9EC
-_080EC9B8:
- ldr r1, _080EC9D0 @ =gMain
- movs r0, 0x87
- lsls r0, 3
- adds r1, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
-_080EC9C6:
- add sp, 0xC
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080EC9D0: .4byte gMain
- thumb_func_end sub_80EC870
-
- thumb_func_start sub_80EC9D4
-sub_80EC9D4: @ 80EC9D4
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_80EC9D4
-
- thumb_func_start sub_80EC9EC
-sub_80EC9EC: @ 80EC9EC
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_80EC9EC
-
- thumb_func_start sub_80ECA00
-sub_80ECA00: @ 80ECA00
- 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
- movs r1, 0x82
- lsls r1, 5
- movs r0, 0
- bl SetGpuRegBits
- pop {r0}
- bx r0
- thumb_func_end sub_80ECA00
-
- thumb_func_start sub_80ECA70
-sub_80ECA70: @ 80ECA70
- push {r4,lr}
- ldr r0, _080ECA9C @ =0x000028bc
- bl Alloc
- adds r4, r0, 0
- ldr r1, _080ECAA0 @ =sub_80ECAF0
- bl sub_80ECAA8
- ldr r0, _080ECAA4 @ =sub_80ECAB0
- movs r1, 0x3
- bl CreateTask
- strb r0, [r4, 0x5]
- ldrb r0, [r4, 0x5]
- movs r1, 0
- adds r2, r4, 0
- bl SetWordTaskArg
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080ECA9C: .4byte 0x000028bc
-_080ECAA0: .4byte sub_80ECAF0
-_080ECAA4: .4byte sub_80ECAB0
- thumb_func_end sub_80ECA70
-
- thumb_func_start sub_80ECAA8
-sub_80ECAA8: @ 80ECAA8
- str r1, [r0]
- movs r1, 0
- strb r1, [r0, 0x4]
- bx lr
- thumb_func_end sub_80ECAA8
-
- thumb_func_start sub_80ECAB0
-sub_80ECAB0: @ 80ECAB0
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0
- bl GetWordTaskArg
- adds r4, r0, 0
- ldr r0, _080ECAE8 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0xD
- ands r0, r1
- cmp r0, 0
- beq _080ECAD8
- ldr r0, [r4]
- ldr r1, _080ECAEC @ =sub_80EDBE8
- cmp r0, r1
- beq _080ECAD8
- adds r0, r4, 0
- bl sub_80ECAA8
-_080ECAD8:
- ldr r1, [r4]
- adds r0, r4, 0
- bl _call_via_r1
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080ECAE8: .4byte gMain
-_080ECAEC: .4byte sub_80EDBE8
- thumb_func_end sub_80ECAB0
-
- thumb_func_start sub_80ECAF0
-sub_80ECAF0: @ 80ECAF0
- push {r4,r5,lr}
- sub sp, 0xC
- adds r5, r0, 0
- ldrb r0, [r5, 0x4]
- cmp r0, 0
- beq _080ECB02
- cmp r0, 0x1
- beq _080ECB78
- b _080ECB8A
-_080ECB02:
- ldr r0, _080ECB68 @ =gUnknown_840BBA8
- bl InitWindows
- ldr r0, _080ECB6C @ =gUnknown_840272C
- ldr r1, _080ECB70 @ =0x0000043c
- adds r4, r5, r1
- adds r1, r4, 0
- bl LZ77UnCompWram
- ldr r0, _080ECB74 @ =gUnknown_84028F8
- adds r1, r5, 0
- adds r1, 0x3C
- bl LZ77UnCompWram
- movs r0, 0x20
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x11
- str r0, [sp, 0x8]
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- movs r0, 0
- movs r1, 0
- bl FillWindowPixelBuffer
- movs r0, 0x90
- str r0, [sp]
- movs r0, 0x10
- str r0, [sp, 0x4]
- movs r0, 0
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0x28
- bl BlitBitmapToWindow
- movs r0, 0
- bl PutWindowTilemap
- movs r0, 0
- movs r1, 0x3
- bl CopyWindowToVram
- ldrb r0, [r5, 0x4]
- adds r0, 0x1
- strb r0, [r5, 0x4]
- b _080ECB8A
- .align 2, 0
-_080ECB68: .4byte gUnknown_840BBA8
-_080ECB6C: .4byte gUnknown_840272C
-_080ECB70: .4byte 0x0000043c
-_080ECB74: .4byte gUnknown_84028F8
-_080ECB78:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- bne _080ECB8A
- ldr r1, _080ECB94 @ =sub_80ECB98
- adds r0, r5, 0
- bl sub_80ECAA8
-_080ECB8A:
- add sp, 0xC
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080ECB94: .4byte sub_80ECB98
- thumb_func_end sub_80ECAF0
-
thumb_func_start sub_80ECB98
sub_80ECB98: @ 80ECB98
push {r4,r5,lr}
diff --git a/baserom.ips b/baserom.ips
index 95538d30e..11c3b7f62 100644
--- a/baserom.ips
+++ b/baserom.ips
Binary files differ
diff --git a/include/libgcnmultiboot.h b/include/libgcnmultiboot.h
new file mode 100644
index 000000000..7d347df05
--- /dev/null
+++ b/include/libgcnmultiboot.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_LIBGCMMULTIBOOT_H
+#define GUARD_LIBGCNMULTIBOOT_H
+
+struct GcmbStruct
+{
+ u16 gcmb_field_0;
+ vu8 gcmb_field_2;
+ u8 filler3[0x2C - 0x3];
+};
+
+void GameCubeMultiBoot_Main(struct GcmbStruct *pStruct);
+void GameCubeMultiBoot_ExecuteProgram(struct GcmbStruct *pStruct);
+void GameCubeMultiBoot_Init(struct GcmbStruct *pStruct);
+void GameCubeMultiBoot_HandleSerialInterrupt(struct GcmbStruct *pStruct);
+void GameCubeMultiBoot_Quit(void);
+
+#endif // GUARD_LIBGCNMULTIBOOT_H
diff --git a/include/link.h b/include/link.h
index 0ec32d8a0..e1a4e106b 100644
--- a/include/link.h
+++ b/include/link.h
@@ -207,5 +207,7 @@ void sub_80098D8(void);
void CloseLink(void);
bool8 sub_800A4BC(void);
bool32 sub_800B270(void);
+void sub_800B388(void);
+void sub_8054A28(void);
#endif // GUARD_LINK_H
diff --git a/ld_script.txt b/ld_script.txt
index 22672e178..f2f738c84 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -210,6 +210,7 @@ SECTIONS {
asm/battle_tower.o(.text);
asm/battle_controller_oak.o(.text);
asm/player_pc.o(.text);
+ src/intro.o(.text);
asm/intro.o(.text);
asm/battle_anim_special.o(.text);
asm/hall_of_fame.o(.text);
diff --git a/src/intro.c b/src/intro.c
new file mode 100644
index 000000000..42d2af471
--- /dev/null
+++ b/src/intro.c
@@ -0,0 +1,289 @@
+#include "global.h"
+#include "m4a.h"
+#include "malloc.h"
+#include "bg.h"
+#include "palette.h"
+#include "main.h"
+#include "gpu_regs.h"
+#include "task.h"
+#include "scanline_effect.h"
+#include "libgcnmultiboot.h"
+#include "new_menu_helpers.h"
+#include "link.h"
+#include "menu.h"
+#include "save.h"
+#include "new_game.h"
+
+struct IntroSequenceData
+{
+ void (*field_0000)(struct IntroSequenceData *);
+ u8 field_0004;
+ u8 field_0005;
+ u8 filler_0006[0x36];
+ u8 field_003C[0x400];
+ u8 field_043C[0x400];
+ u8 filler_083C[0x2080];
+}; // size: 0x28BC
+
+EWRAM_DATA struct GcmbStruct gUnknown_203AAD4 = {0};
+
+void sub_80EC870(void);
+void sub_80EC9D4(void);
+void sub_80EC9EC(void);
+void sub_80ECA00(void);
+void sub_80ECA70(void);
+void sub_80ECAB0(u8 taskId);
+void sub_80ECAA8(struct IntroSequenceData * ptr, void (*cb)(struct IntroSequenceData *));
+void sub_80ECAF0(struct IntroSequenceData * ptr);
+void sub_80ECB98(struct IntroSequenceData * ptr);
+void sub_80EDBE8(struct IntroSequenceData * ptr);
+
+extern const u32 gMultiBootProgram_PokemonColosseum_Start[];
+
+extern const u8 gUnknown_8402260[];
+extern const u8 gUnknown_8402280[];
+extern const u8 gUnknown_84024E4[];
+extern const u16 gUnknown_8402630[];
+extern const u8 gUnknown_8402650[];
+extern const u8 gUnknown_8402668[];
+extern const u16 gUnknown_840270C[];
+extern const u8 gUnknown_840272C[];
+extern const u8 gUnknown_84028F8[];
+
+extern const struct BgTemplate gUnknown_840BB80[2];
+extern const struct WindowTemplate gUnknown_840BBA8[];
+
+void sub_80EC5A4(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_80EC5B8(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(sub_80EC870);
+}
+
+void load_copyright_graphics(u16 a, u16 b, u16 c)
+{
+ LZ77UnCompVram(gUnknown_8402280, (void *)BG_VRAM + a);
+ LZ77UnCompVram(gUnknown_84024E4, (void *)BG_VRAM + b);
+ LoadPalette(gUnknown_8402260, c, 0x20);
+}
+
+void SerialCb_CopyrightScreen(void)
+{
+ GameCubeMultiBoot_HandleSerialInterrupt(&gUnknown_203AAD4);
+}
+
+bool8 sub_80EC62C(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ((vu16*)PLTT)[0] = RGB_WHITE;
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT + sizeof(vu16), PLTT_SIZE - sizeof(vu16));
+ ResetPaletteFade();
+ load_copyright_graphics(0, 0x3800, 0);
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0x700);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(sub_80EC5A4);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON);
+ SetSerialCallback(SerialCb_CopyrightScreen);
+ GameCubeMultiBoot_Init(&gUnknown_203AAD4);
+ // fallthrough
+ default:
+ UpdatePaletteFade();
+ gMain.state++;
+ GameCubeMultiBoot_Main(&gUnknown_203AAD4);
+ break;
+ case 140:
+ GameCubeMultiBoot_Main(&gUnknown_203AAD4);
+ if (gUnknown_203AAD4.gcmb_field_2 != 1)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gMain.state++;
+ }
+ break;
+ case 141:
+ if (!UpdatePaletteFade())
+ {
+ gMain.state++;
+ if (gUnknown_203AAD4.gcmb_field_2 != 0)
+ {
+ if (gUnknown_203AAD4.gcmb_field_2 == 2)
+ {
+ if (*((u32 *)0x020000AC) == 0x65366347)
+ {
+ CpuCopy16(gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, 0x28000);
+ *((u32 *)0x020000AC) = 0x65366347;
+ }
+ GameCubeMultiBoot_ExecuteProgram(&gUnknown_203AAD4);
+ }
+ }
+ else
+ {
+ GameCubeMultiBoot_Quit();
+ SetSerialCallback(SerialCB);
+ }
+ return FALSE;
+ }
+ break;
+ case 142:
+ sub_800B388();
+ SetMainCallback2(sub_80EC5B8);
+ break;
+ }
+ return TRUE;
+}
+
+void c2_copyright_1(void)
+{
+ if (!sub_80EC62C())
+ {
+ ResetMenuAndMonGlobals();
+ Save_ResetSaveCounters();
+ Save_LoadGameData(0);
+ if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID)
+ Sav2_ClearSetDefault();
+ SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
+ }
+}
+
+void sub_80EC864(void)
+{
+ sub_80EC62C();
+}
+
+void sub_80EC870(void)
+{
+ switch (gMain.state)
+ {
+ default:
+ gMain.state = 0;
+ // fallthrough
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ InitHeap(gHeap, HEAP_SIZE);
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ ResetTempTileDataBuffers();
+ sub_80ECA00();
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+ FillPalette(0, 0, 0x400);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_840BB80, NELEMS(gUnknown_840BB80));
+ break;
+ case 1:
+ LoadPalette(gUnknown_8402630, 0x00, 0x20);
+ DecompressAndCopyTileDataToVram(3, gUnknown_8402650, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(3, gUnknown_8402668, 0, 0, 1);
+ LoadPalette(gUnknown_840270C, 0xD0, 0x20);
+ break;
+ case 2:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ sub_80ECA70();
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ SetMainCallback2(sub_80EC9D4);
+ SetVBlankCallback(sub_80EC9EC);
+ }
+ return;
+ }
+ gMain.state++;
+}
+
+void sub_80EC9D4(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_80EC9EC(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_80ECA00(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);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+}
+
+void sub_80ECA70(void)
+{
+ struct IntroSequenceData * ptr = Alloc(sizeof(struct IntroSequenceData));
+ sub_80ECAA8(ptr, sub_80ECAF0);
+ ptr->field_0005 = CreateTask(sub_80ECAB0, 3);
+ SetWordTaskArg(ptr->field_0005, 0, (uintptr_t)ptr);
+}
+
+void sub_80ECAA8(struct IntroSequenceData * ptr, void (*cb)(struct IntroSequenceData *))
+{
+ ptr->field_0000 = cb;
+ ptr->field_0004 = 0;
+}
+
+void sub_80ECAB0(u8 taskId)
+{
+ struct IntroSequenceData * ptr = (void *)GetWordTaskArg(taskId, 0);
+ if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->field_0000 != sub_80EDBE8)
+ sub_80ECAA8(ptr, sub_80EDBE8);
+ ptr->field_0000(ptr);
+}
+
+void sub_80ECAF0(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ InitWindows(gUnknown_840BBA8);
+ LZ77UnCompWram(gUnknown_840272C, this->field_043C);
+ LZ77UnCompWram(gUnknown_84028F8, this->field_003C);
+ FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x11);
+ FillWindowPixelBuffer(0, 0x00);
+ BlitBitmapToWindow(0, this->field_043C, 0, 40, 144, 16);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ this->field_0004++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ sub_80ECAA8(this, sub_80ECB98);
+ break;
+ }
+}