mirror of
https://github.com/pret/pokegold-spaceworld.git
synced 2026-03-23 10:35:04 -05:00
Addresses of sections will now be added to the linkerscript via `org`, and the section name will be the path/to/file. If there is more than one section in the file, then add a @SectionName after the path/to/file to describe the section.
643 lines
11 KiB
NASM
643 lines
11 KiB
NASM
INCLUDE "constants.asm"
|
||
|
||
SECTION "engine/title.asm@Title screen", ROMX
|
||
|
||
IntroSequence::
|
||
callab GameFreakIntro ; Bank $39
|
||
jr c, TitleSequenceStart
|
||
ld a, [wTitleSequenceOpeningType]
|
||
and a
|
||
jr z, .opening_sequence
|
||
|
||
.pikachu_minigame
|
||
callab PikachuMiniGame ; Bank $38
|
||
jr TitleSequenceStart
|
||
|
||
.opening_sequence
|
||
callab OpeningCutscene ; Bank $39
|
||
|
||
TitleSequenceStart::
|
||
call TitleSequenceInit
|
||
callab SetTitleBGDecorationBorder ; Bank $02
|
||
|
||
.loop
|
||
call TitleScreenMain
|
||
jr nc, .loop
|
||
|
||
call ClearBGPalettes
|
||
call ClearSprites
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
call ClearTileMap
|
||
call UpdateTimePals
|
||
|
||
ld a, [wJumptableIndex + 1]
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, TitleScreenJumpTable
|
||
add hl, de
|
||
add hl, de
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
|
||
jp hl
|
||
|
||
TitleScreenJumpTable::
|
||
dw MainMenu
|
||
dw DebugMenu
|
||
dw SRAMClearMenu
|
||
dw IntroSequence
|
||
|
||
TitleSequenceInit::
|
||
call ClearPalettes
|
||
|
||
xor a
|
||
ldh [hMapAnims], a
|
||
ldh [hSCY], a
|
||
ldh [hSCX], a
|
||
|
||
ld de, MUSIC_NONE ; Stop the music.
|
||
call PlayMusic
|
||
|
||
call ClearTileMap
|
||
call DisableLCD
|
||
call ClearSprites
|
||
|
||
callba InitEffectObject ; Bank $23
|
||
ld hl, vChars0
|
||
ld bc, vBGMap0 - vChars0
|
||
|
||
.clear_loop
|
||
ld [hl], $00
|
||
inc hl
|
||
dec bc
|
||
ld a, b
|
||
or c
|
||
jr nz, .clear_loop
|
||
|
||
ld hl, TitleScreenGFX
|
||
ld de, vChars2 + 65 tiles
|
||
ld bc, 13 tiles
|
||
ld a, BANK(TitleScreenGFX)
|
||
call FarCopyData
|
||
|
||
ld hl, TitleScreenVersionGFX
|
||
ld de, vChars2 + 96 tiles
|
||
ld bc, 24 tiles
|
||
ld a, BANK(TitleScreenVersionGFX)
|
||
call FarCopyData
|
||
|
||
ld hl, TitleScreenHoOhGFX
|
||
ld de, vChars2
|
||
ld bc, 49 tiles
|
||
ld a, BANK(TitleScreenHoOhGFX)
|
||
call FarCopyData
|
||
|
||
ld hl, TitleScreenLogoGFX
|
||
ld de, vChars1
|
||
ld bc, 58 tiles
|
||
ld a, BANK(TitleScreenLogoGFX)
|
||
call FarCopyData
|
||
|
||
ld hl, TitleScreenGoldLogoGFX
|
||
ld de, vChars0 + 186 tiles
|
||
ld bc, 20 tiles
|
||
ld a, BANK(TitleScreenGoldLogoGFX)
|
||
call FarCopyData
|
||
|
||
call SetTitleGfx
|
||
ld hl, wTileMapBackup
|
||
ld a, $24
|
||
ld [hli], a
|
||
ld a, $00
|
||
ld [hli], a
|
||
|
||
ld hl, vBGMap0
|
||
ld bc, 128 tiles
|
||
ld a, " "
|
||
call ByteFill
|
||
|
||
ld b, $06
|
||
call GetSGBLayout
|
||
call EnableLCD
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
call WaitBGMap
|
||
xor a
|
||
ldh [hBGMapMode], a
|
||
ld hl, wJumptableIndex
|
||
ld [hli], a ; (Possibly wJumptableIndex from Crystal)
|
||
ld [hli], a ; (Possibly wIntroSceneFrameCounter from Crystal)
|
||
ld [hli], a ; (Possibly wTitleScreenTimer from Crystal)
|
||
ld [hl], a ; (Possibly wTitleScreenTimer + 1 from Crystal)
|
||
|
||
call .load_position_table
|
||
|
||
|
||
ld a, %00011010
|
||
ldh [rBGP], a
|
||
ld a, %11100100
|
||
ldh [rOBP0], a
|
||
ret
|
||
|
||
.load_position_table:
|
||
ld hl, FirePositionTable
|
||
ld c, 6 ; Load 6 flying objects on the screen.
|
||
|
||
.set_fire_note_loop
|
||
push bc
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
inc hl
|
||
push hl
|
||
ld a, $2E ; Title fire/note object effect type?
|
||
call InitSpriteAnimStruct
|
||
pop hl
|
||
pop bc
|
||
dec c
|
||
jr nz, .set_fire_note_loop
|
||
ret
|
||
|
||
FirePositionTable::
|
||
dw $4CE0
|
||
dw $58A0
|
||
dw $6490
|
||
dw $70D0
|
||
dw $7CB0
|
||
dw $8800
|
||
|
||
TitleFireGFX:: INCBIN "gfx/title/fire.2bpp" ; 5EB8-5F37
|
||
TitleNotesGFX:: INCBIN "gfx/title/notes.2bpp" ; 5F38=5FB7
|
||
|
||
TitleScreenMain::
|
||
ld a, [wJumptableIndex]
|
||
bit 7, a
|
||
jr nz, .exit
|
||
call TitleScreenSequence
|
||
callba EffectObjectJumpNoDelay ; Bank $23
|
||
call DelayFrame
|
||
and a
|
||
ret
|
||
|
||
.exit
|
||
scf
|
||
ret
|
||
|
||
TitleScreenSequence::
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, TitleScreenSequenceTable
|
||
add hl, de
|
||
add hl, de
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
jp hl
|
||
|
||
TitleScreenSequenceTable::
|
||
dw TitleSeq_Start
|
||
dw TitleSeq_LoadPokemonLogo
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_MoveTitle
|
||
dw TitleSeq_MoveTitleEnd
|
||
dw TitleSeq_InitFlashTitle
|
||
dw TitleSeq_FlashTitle
|
||
|
||
dw TitleSeq_PMJapaneseChara
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_WaitForNextSequence
|
||
dw TitleSeq_PMSubtitle
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_WaitForNextSequence
|
||
dw TitleSeq_Version
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_WaitForNextSequence
|
||
dw TitleSeq_CopyRight
|
||
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_WaitForNextSequence
|
||
dw TitleSeq_HoOh
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
dw TitleSeq_IncreaseJumpTableIndex
|
||
|
||
dw TitleSeq_WaitForNextSequence
|
||
dw TitleSeq_PressButtonInit
|
||
dw TitleSeq_TitleScreenInputAndTimeout
|
||
dw TitleSeq_FadeMusicOut
|
||
|
||
TitleSeq_IncreaseJumpTableIndex::
|
||
ld hl, wJumptableIndex
|
||
inc [hl]
|
||
ret
|
||
|
||
TitleSeq_WaitForNextSequence::
|
||
xor a
|
||
ldh [hBGMapMode], a
|
||
ld hl, wJumptableIndex + 2
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .next_seq
|
||
dec [hl]
|
||
ret
|
||
|
||
.next_seq
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ret
|
||
|
||
TitleSeq_LoadPokemonLogo::
|
||
call PrintPokemonLogo
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
ret
|
||
|
||
TitleSeq_Start::
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
push de
|
||
ld de, $002D
|
||
call PlaySFX ; Play "Swish" sound
|
||
pop de
|
||
ld a, $80
|
||
ld [wJumptableIndex + 2], a
|
||
call SetLYOverrides
|
||
ld a, $43
|
||
ldh [hLCDCPointer], a
|
||
ret
|
||
|
||
TitleSeq_MoveTitle::
|
||
xor a
|
||
ldh [hBGMapMode], a
|
||
ld hl, wJumptableIndex + 2
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .nextseq
|
||
add $04
|
||
ld [hl], a
|
||
ld e, a
|
||
.wait
|
||
ldh a, [rLY]
|
||
cp $40
|
||
jr c, .wait
|
||
ld a, e
|
||
call SetLYOverrides
|
||
ret
|
||
|
||
.nextseq
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ret
|
||
|
||
TitleSeq_MoveTitleEnd::
|
||
xor a
|
||
ldh [hLCDCPointer], a
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld de, MUSIC_TITLE
|
||
call PlayMusic ; Play "Title Theme"
|
||
ret
|
||
|
||
TitleSeq_InitFlashTitle::
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, %00011010
|
||
ld [wJumptableIndex + 2], a
|
||
ld a, 6
|
||
ld [wJumptableIndex + 3], a
|
||
ret
|
||
|
||
TitleSeq_FlashTitle::
|
||
ld hl, wJumptableIndex + 3
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .exit
|
||
dec [hl]
|
||
ld a, [wJumptableIndex + 2]
|
||
xor %00011010
|
||
ld [wJumptableIndex +2 ], a
|
||
ldh [rBGP], a
|
||
call DelayFrame
|
||
call DelayFrame
|
||
ret
|
||
|
||
.exit
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, %11100100
|
||
ldh [rBGP], a
|
||
ret
|
||
|
||
TitleSeq_PMJapaneseChara::
|
||
call PrintPMJapaneseChara
|
||
ld a, $10
|
||
ld [wJumptableIndex + 2], a
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
ret
|
||
|
||
TitleSeq_PMSubtitle::
|
||
call PrintPMSubtitle
|
||
ld a, $10
|
||
ld [wJumptableIndex + 2], a
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
ret
|
||
|
||
TitleSeq_Version::
|
||
call PrintVersion
|
||
ld a, $10
|
||
ld [wJumptableIndex + 2], a
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
ret
|
||
|
||
TitleSeq_CopyRight::
|
||
call PrintCopyRight
|
||
ld a, $10
|
||
ld [wJumptableIndex + 2], a
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
ret
|
||
|
||
TitleSeq_HoOh::
|
||
call Set_HoOh
|
||
ld a, $10
|
||
ld [wJumptableIndex + 2], a
|
||
call TitleSeq_IncreaseJumpTableIndex
|
||
ld a, $01
|
||
ldh [hBGMapMode], a
|
||
ret
|
||
|
||
TitleSeq_PressButtonInit::
|
||
ld hl, wJumptableIndex
|
||
inc [hl]
|
||
ld hl, wJumptableIndex + 2
|
||
ld de, DecodeNybble0Table - 3 ; DecodeNybble0Table - 3 = $0C00
|
||
ld [hl], e
|
||
inc hl
|
||
ld [hl], d
|
||
ret
|
||
|
||
TitleSeq_TitleScreenInputAndTimeout::
|
||
ld hl, wJumptableIndex + 2
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
ld a, e
|
||
or d
|
||
jr z, .psbtn_reset
|
||
dec de
|
||
ld [hl], d
|
||
dec hl
|
||
ld [hl], e
|
||
call GetJoypad
|
||
ld hl, hJoyState
|
||
ld a, [hl]
|
||
and D_UP | B_BUTTON | SELECT ; UP + B + SELECT brings you to the SRAM clear screen.
|
||
cp D_UP | B_BUTTON | SELECT
|
||
jr z, .psbtn_sramclear
|
||
ld a, [hl]
|
||
and SELECT ; SELECT will bring you to the debug menu.
|
||
jr nz, .psbtn_gotodebug
|
||
ld a, [hl]
|
||
and $09
|
||
ret z
|
||
|
||
.psbtn_play
|
||
ld a, $00 ; MainMenu
|
||
jr .psbtn_nextseq
|
||
|
||
.psbtn_gotodebug
|
||
if DEBUG
|
||
ld a, $01 ; DebugMenu
|
||
jr .psbtn_nextseq
|
||
else
|
||
ret
|
||
endc
|
||
|
||
.psbtn_sramclear
|
||
ld a, $02
|
||
|
||
.psbtn_nextseq
|
||
ld [wJumptableIndex + 1], a
|
||
ld hl, wJumptableIndex
|
||
set 7, [hl]
|
||
ret
|
||
|
||
.psbtn_reset
|
||
ld hl, wJumptableIndex
|
||
inc [hl]
|
||
xor a
|
||
ld [wMusicFadeID], a
|
||
ld [wMusicFadeID + 1], a
|
||
ld hl, wMusicFade
|
||
ld [hl], 8
|
||
ret
|
||
|
||
TitleSeq_FadeMusicOut::
|
||
ld a, [wMusicFade]
|
||
and a
|
||
ret nz
|
||
ld a, 3
|
||
ld [wJumptableIndex + 1], a
|
||
ld hl, wJumptableIndex
|
||
set 7, [hl]
|
||
ret
|
||
|
||
SetLYOverrides::
|
||
ld hl, wLYOverrides
|
||
ld c, $30
|
||
.setly_loop
|
||
ld [hli], a
|
||
dec c
|
||
jr nz, .setly_loop
|
||
ret
|
||
|
||
PrintPMSubtitle::
|
||
coord hl, 2, 6
|
||
ld b, 15
|
||
ld a, $69
|
||
jr LoadPrintArea
|
||
|
||
PrintVersion::
|
||
coord hl, 4, 1
|
||
ld b, $09
|
||
ld a, $60
|
||
|
||
LoadPrintArea::
|
||
ld [hli], a
|
||
inc a
|
||
dec b
|
||
jr nz, LoadPrintArea
|
||
ret
|
||
|
||
PrintPMJapaneseChara::
|
||
coord hl, 15, 2
|
||
ld a, "こ"
|
||
lb bc, 4, 4
|
||
jr PrintBoxArea
|
||
|
||
PrintPokemonLogo::
|
||
coord hl, 15, 3
|
||
ld [hl], $B8
|
||
coord hl, 15, 4
|
||
ld [hl], $B9
|
||
coord hl, 1, 2
|
||
ld a, $80
|
||
ld bc, $0E04
|
||
|
||
PrintBoxArea::
|
||
ld de, SCREEN_WIDTH
|
||
push bc
|
||
push hl
|
||
|
||
.xloop
|
||
ld [hli], a
|
||
inc a
|
||
dec b
|
||
jr nz, .xloop
|
||
pop hl
|
||
add hl, de
|
||
pop bc
|
||
dec c
|
||
jr nz, PrintBoxArea
|
||
ret
|
||
|
||
PrintCopyRight::
|
||
coord hl, 3, 17
|
||
ld a, $41
|
||
ld b, $0D
|
||
|
||
.loop
|
||
ld [hli], a
|
||
inc a
|
||
dec b
|
||
jr nz, .loop
|
||
ret
|
||
|
||
SRAMClearMenu::
|
||
call ClearTileMap
|
||
call GetMemSGBLayout
|
||
call LoadFont
|
||
call LoadFontExtra
|
||
ld hl, SRAMClear_Message
|
||
call PrintText
|
||
ld hl, SRAMClear_WinPOS
|
||
call CopyMenuHeader
|
||
call VerticalMenu
|
||
jp c, Init
|
||
ld a, [wMenuCursorY]
|
||
cp $01
|
||
jp z, Init
|
||
|
||
callab InitAllSRAMBanks ; Bank $05
|
||
jp Init
|
||
|
||
SRAMClear_Message::
|
||
db "<NULL>すべての セーブデータエりアを"
|
||
db "<LINE>クりア しますか?<DONE>"
|
||
|
||
SRAMClear_WinPOS::
|
||
db 0
|
||
db 7,14,11,19
|
||
dw SRAMClear_TextChoice ; menu data
|
||
db 1 ; default option
|
||
|
||
SRAMClear_TextChoice::
|
||
db %11000000
|
||
db 2
|
||
db "いいえ@"
|
||
db "はい@"
|
||
|
||
IntroCopyRightInfo::
|
||
call ClearTileMap
|
||
call LoadFontExtra
|
||
ld de, TitleScreenGFX
|
||
ld hl, $9600
|
||
lb bc, BANK(TitleScreenGFX), $19
|
||
call Request2bpp
|
||
|
||
coord hl, 5, 7
|
||
ld de, IntroCopyRightInfo_Text
|
||
jp PlaceString
|
||
|
||
IntroCopyRightInfo_Text::
|
||
db $60, $61, $62, $63, $6D, $6E, $6F, $70, $71, $72, $4E ; "(C)1997 Nintendo\n"
|
||
db $60, $61, $62, $63, $73, $74, $75, $76, $77, $78, $6B, $6C, $4E ; "(C)1997 Creatures Inc.\n"
|
||
db $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $50 ; "(C)1997 GAME FREAK Inc.{EOL}"
|
||
|
||
Set_HoOh::
|
||
coord hl, 7, 9
|
||
ld de, $000D
|
||
ld a, $00
|
||
ld b, $07
|
||
.loop
|
||
ld c, $07
|
||
.loop2
|
||
ld [hli], a
|
||
inc a
|
||
dec c
|
||
jr nz, .loop2
|
||
add hl, de
|
||
dec b
|
||
jr nz, .loop
|
||
ret
|
||
|
||
; Unused code, looks like it sets the font type for the logo?
|
||
SetTitleFont::
|
||
ld de, vChars1
|
||
ld hl, TitleScreenLogoGFX
|
||
ld bc, 130 tiles
|
||
ld a, $04
|
||
jp FarCopyDataDouble
|
||
|
||
; Sets the type of art that will be displayed on the title screen
|
||
; depending on wTitleSequenceOpeningType.
|
||
SetTitleGfx::
|
||
ld hl, wTitleSequenceOpeningType
|
||
ld a, [hl]
|
||
xor $01
|
||
ld [hl], a
|
||
jr nz, .flame
|
||
|
||
.note
|
||
ld hl, TitleNotesGFX
|
||
jr SetTitleGfxNext
|
||
|
||
.flame
|
||
ld hl, TitleFireGFX
|
||
SetTitleGfxNext::
|
||
ld de, vChars0
|
||
ld c, $80
|
||
.loop
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
dec c
|
||
jr nz, .loop
|
||
ret
|
||
|
||
; if DEBUG
|
||
SECTION "engine/title.asm@Title screen TEMPORARY", ROMX
|
||
; else
|
||
; SECTION "Title screen TEMPORARY", ROMX[$62A2], BANK[$01] ; TODO: merge this with the main section above
|
||
; endc
|
||
|
||
|
||
GameInit::
|
||
call ClearWindowData
|
||
ld a, $23
|
||
ld [wce5f], a
|
||
jp IntroSequence |