summaryrefslogtreecommitdiff
path: root/engine/title.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/title.asm')
-rw-r--r--engine/title.asm475
1 files changed, 475 insertions, 0 deletions
diff --git a/engine/title.asm b/engine/title.asm
new file mode 100644
index 000000000..3772b052f
--- /dev/null
+++ b/engine/title.asm
@@ -0,0 +1,475 @@
+_TitleScreen: ; 10ed67
+
+ call WhiteBGMap
+ call ClearSprites
+ call ClearTileMap
+
+; Turn BG Map update off
+ xor a
+ ld [hBGMapMode], a
+
+; Reset timing variables
+ ld hl, $cf63
+ ld [hli], a ; cf63 ; Scene?
+ ld [hli], a ; cf64
+ ld [hli], a ; cf65 ; Timer lo
+ ld [hl], a ; cf66 ; Timer hi
+
+; Turn LCD off
+ call DisableLCD
+
+
+; VRAM bank 1
+ ld a, 1
+ ld [rVBK], a
+
+
+; Decompress running Suicune gfx
+ ld hl, TitleSuicuneGFX
+ ld de, VTiles1
+ call Decompress
+
+
+; Clear screen palettes
+ ld hl, VBGMap0
+ ld bc, $0280
+ xor a
+ call ByteFill
+
+
+; Fill tile palettes:
+
+; BG Map 1:
+
+; line 0 (copyright)
+ ld hl, VBGMap1
+ ld bc, $0020 ; one row
+ ld a, 7 ; palette
+ call ByteFill
+
+
+; BG Map 0:
+
+; Apply logo gradient:
+
+; lines 3-4
+ ld hl, $9860 ; (0,3)
+ ld bc, $0040 ; 2 rows
+ ld a, 2
+ call ByteFill
+; line 5
+ ld hl, $98a0 ; (0,5)
+ ld bc, $0020 ; 1 row
+ ld a, 3
+ call ByteFill
+; line 6
+ ld hl, $98c0 ; (0,6)
+ ld bc, $0020 ; 1 row
+ ld a, 4
+ call ByteFill
+; line 7
+ ld hl, $98e0 ; (0,7)
+ ld bc, $0020 ; 1 row
+ ld a, 5
+ call ByteFill
+; lines 8-9
+ ld hl, $9900 ; (0,8)
+ ld bc, $0040 ; 2 rows
+ ld a, 6
+ call ByteFill
+
+
+; 'CRYSTAL VERSION'
+ ld hl, $9925 ; (5,9)
+ ld bc, $000b ; length of version text
+ ld a, 1
+ call ByteFill
+
+; Suicune gfx
+ ld hl, $9980 ; (0,12)
+ ld bc, $00c0 ; the rest of the screen
+ ld a, 8
+ call ByteFill
+
+
+; Back to VRAM bank 0
+ ld a, $0
+ ld [rVBK], a
+
+
+; Decompress logo
+ ld hl, TitleLogoGFX
+ ld de, VTiles1
+ call Decompress
+
+; Decompress background crystal
+ ld hl, TitleCrystalGFX
+ ld de, VTiles0
+ call Decompress
+
+
+; Clear screen tiles
+ ld hl, VBGMap0
+ ld bc, $0800
+ ld a, $7f
+ call ByteFill
+
+; Draw Pokemon logo
+ ld hl, $c4dc ; TileMap(0,3)
+ ld bc, $0714 ; 20x7
+ ld d, $80
+ ld e, $14
+ call DrawGraphic
+
+; Draw copyright text
+ ld hl, $9c03 ; BGMap1(3,0)
+ ld bc, $010d ; 13x1
+ ld d, $c
+ ld e, $10
+ call DrawGraphic
+
+; Initialize running Suicune?
+ ld d, $0
+ call Function10eed2
+
+; Initialize background crystal
+ call Function10ef06
+
+; Save WRAM bank
+ ld a, [rSVBK]
+ push af
+; WRAM bank 5
+ ld a, 5
+ ld [rSVBK], a
+
+; Update palette colors
+ ld hl, TitleScreenPalettes
+ ld de, $d000
+ ld bc, $0080
+ call CopyBytes
+
+ ld hl, TitleScreenPalettes
+ ld de, $d080
+ ld bc, $0080
+ call CopyBytes
+
+; Restore WRAM bank
+ pop af
+ ld [rSVBK], a
+
+
+; LY/SCX trickery starts here
+
+ ld a, [rSVBK]
+ push af
+ ld a, 5 ; BANK(LYOverrides)
+ ld [rSVBK], a
+
+; Make alternating lines come in from opposite sides
+
+; ( This part is actually totally pointless, you can't
+; see anything until these values are overwritten! )
+
+ ld b, 80 / 2 ; alternate for 80 lines
+ ld hl, LYOverrides
+.loop
+; $00 is the middle position
+ ld [hl], +112 ; coming from the left
+ inc hl
+ ld [hl], -112 ; coming from the right
+ inc hl
+ dec b
+ jr nz, .loop
+
+; Make sure the rest of the buffer is empty
+ ld hl, LYOverrides + 80
+ xor a
+ ld bc, LYOverridesEnd - (LYOverrides + 80)
+ call ByteFill
+
+; Let LCD Stat know we're messing around with SCX
+ ld a, rSCX - rJOYP
+ ld [hLCDStatCustom], a
+
+ pop af
+ ld [rSVBK], a
+
+
+; Reset audio
+ call ChannelsOff
+ call EnableLCD
+
+; Set sprite size to 8x16
+ ld a, [rLCDC]
+ set 2, a
+ ld [rLCDC], a
+
+ ld a, +112
+ ld [hSCX], a
+ ld a, 8
+ ld [hSCY], a
+ ld a, 7
+ ld [hWX], a
+ ld a, -112
+ ld [hWY], a
+
+ ld a, $1
+ ld [hCGBPalUpdate], a
+
+; Update BG Map 0 (bank 0)
+ ld [hBGMapMode], a
+
+ xor a
+ ld [DefaultFlypoint], a
+
+; Play starting sound effect
+ call SFXChannelsOff
+ ld de, SFX_TITLE_SCREEN_ENTRANCE
+ call StartSFX
+
+ ret
+; 10eea7
+
+Function10eea7: ; 10eea7
+ ld hl, DefaultFlypoint
+ ld a, [hl]
+ ld c, a
+ inc [hl]
+ and $7
+ ret nz
+ ld a, c
+ and $18
+ sla a
+ swap a
+ ld e, a
+ ld d, $0
+ ld hl, $6ece
+ add hl, de
+ ld d, [hl]
+ xor a
+ ld [hBGMapMode], a
+ call Function10eed2
+ ld a, $1
+ ld [hBGMapMode], a
+ ld a, $3
+ ld [hBGMapThird], a
+ ret
+; 10eece
+
+INCBIN "baserom.gbc", $10eece, $10eed2 - $10eece
+
+
+Function10eed2: ; 10eed2
+ ld hl, $c596
+ ld b, $6
+.asm_10eed7
+ ld c, $8
+.asm_10eed9
+ ld a, d
+ ld [hli], a
+ inc d
+ dec c
+ jr nz, .asm_10eed9
+ ld a, $c
+ add l
+ ld l, a
+ ld a, $0
+ adc h
+ ld h, a
+ ld a, $8
+ add d
+ ld d, a
+ dec b
+ jr nz, .asm_10eed7
+ ret
+; 10eeef
+
+Function10eeef: ; 10eeef
+.asm_10eeef
+ push de
+ push bc
+ push hl
+.asm_10eef2
+ ld a, d
+ ld [hli], a
+ inc d
+ dec c
+ jr nz, .asm_10eef2
+ pop hl
+ ld bc, $0014
+ add hl, bc
+ pop bc
+ pop de
+ ld a, e
+ add d
+ ld d, a
+ dec b
+ jr nz, .asm_10eeef
+ ret
+; 10ef06
+
+Function10ef06: ; 10ef06
+ ld hl, Sprites
+ ld d, $de
+ ld e, $0
+ ld c, $5
+.asm_10ef0f
+ push bc
+ call Function10ef1c
+ pop bc
+ ld a, $10
+ add d
+ ld d, a
+ dec c
+ jr nz, .asm_10ef0f
+ ret
+; 10ef1c
+
+Function10ef1c: ; 10ef1c
+ ld c, $6
+ ld b, $40
+.asm_10ef20
+ ld a, d
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ add $8
+ ld b, a
+ ld a, e
+ ld [hli], a
+ inc e
+ inc e
+ ld a, $80
+ ld [hli], a
+ dec c
+ jr nz, .asm_10ef20
+ ret
+; 10ef32
+
+
+AnimateTitleCrystal: ; 10ef32
+; Move the title screen crystal downward until it's fully visible
+
+; Stop at y=6
+; y is really from the bottom of the sprite, which is two tiles high
+ ld hl, Sprites
+ ld a, [hl]
+ cp 6 + 16
+ ret z
+
+; Move all 30 parts of the crystal down by 2
+ ld c, 30
+.loop
+ ld a, [hl]
+ add 2
+ ld [hli], a
+ inc hl
+ inc hl
+ inc hl
+ dec c
+ jr nz, .loop
+
+ ret
+; 10ef46
+
+TitleSuicuneGFX: ; 10ef46
+INCBIN "gfx/title/suicune.lz"
+; 10f31b
+
+INCBIN "baserom.gbc", $10f31b, $10f326 - $10f31b
+
+TitleLogoGFX: ; 10f326
+INCBIN "gfx/title/logo.lz"
+; 10fced
+
+INCBIN "baserom.gbc", $10fced, $10fcee - $10fced
+
+TitleCrystalGFX: ; 10fcee
+INCBIN "gfx/title/crystal.lz"
+; 10fed7
+
+INCBIN "baserom.gbc", $10fed7, $10fede - $10fed7
+
+TitleScreenPalettes:
+; BG
+ RGB 00, 00, 00
+ RGB 19, 00, 00
+ RGB 15, 08, 31
+ RGB 15, 08, 31
+
+ RGB 00, 00, 00
+ RGB 31, 31, 31
+ RGB 15, 16, 31
+ RGB 31, 01, 13
+
+ RGB 00, 00, 00
+ RGB 07, 07, 07
+ RGB 31, 31, 31
+ RGB 02, 03, 30
+
+ RGB 00, 00, 00
+ RGB 13, 13, 13
+ RGB 31, 31, 18
+ RGB 02, 03, 30
+
+ RGB 00, 00, 00
+ RGB 19, 19, 19
+ RGB 29, 28, 12
+ RGB 02, 03, 30
+
+ RGB 00, 00, 00
+ RGB 25, 25, 25
+ RGB 28, 25, 06
+ RGB 02, 03, 30
+
+ RGB 00, 00, 00
+ RGB 31, 31, 31
+ RGB 26, 21, 00
+ RGB 02, 03, 30
+
+ RGB 00, 00, 00
+ RGB 11, 11, 19
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+
+; OBJ
+ RGB 00, 00, 00
+ RGB 10, 00, 15
+ RGB 17, 05, 22
+ RGB 19, 09, 31
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+ RGB 00, 00, 00
+