shithub: pokecrystal

Download patch

ref: d2fabc3b157528bd4d5d76665e27b960f7a08b60
parent: 52e79bd8bbbd8b4a9e7c990aa860d425b8d224df
parent: 61a3d1459397800360064ab15adc97012e61c1af
author: Bryan Bishop <[email protected]>
date: Sat Jan 12 15:56:58 EST 2013

Merge pull request #79 from yenatch/master

title screen

--- a/main.asm
+++ b/main.asm
@@ -140,6 +140,9 @@
 INCBIN "baserom.gbc",$547,$568 - $547
 
 DisableLCD: ; 568
+; Turn the LCD off
+; Most of this is just going through the motions
+
 ; don't need to do anything if lcd is already off
 	ld a, [$ff40] ; LCDC
 	bit 7, a ; lcd enable
@@ -782,8 +785,24 @@
 ; 0xeba
 
 
-INCBIN "baserom.gbc",$eba,$ff1 - $eba
+INCBIN "baserom.gbc",$eba,$fc8 - $eba
 
+ClearTileMap: ; fc8
+; Fill the tile map with blank tiles
+	ld hl, TileMap
+	ld a, $7f ; blank tile
+	ld bc, 360 ; length of TileMap
+	call ByteFill
+	
+; We aren't done if the LCD is on
+	ld a, [$ff40] ; LCDC
+	bit 7, a
+	ret z
+	jp WaitBGMap
+; fdb
+
+INCBIN "baserom.gbc",$fdb,$ff1 - $fdb
+
 TextBoxBorder: ; ff1
 ; draw a text box
 ; upper-left corner at coordinates hl
@@ -1475,10 +1494,35 @@
 	ld [$0000], a
 	pop af
 	ret
-; 2fef
+; 2fec
 
-INCBIN "baserom.gbc",$2fec,$3026-$2fec
+INCBIN "baserom.gbc",$2fec,$300b-$2fec
 
+ClearSprites: ; 300b
+	ld hl, Sprites
+	ld b, TileMap - Sprites
+	xor a
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	ret
+; 3016
+
+HideSprites: ; 3016
+; Set all OBJ y-positions to 160 to hide them offscreen
+	ld hl, Sprites
+	ld de, $0004 ; length of an OBJ struct
+	ld b, $28 ; number of OBJ structs
+	ld a, 160 ; y-position
+.loop
+	ld [hl], a
+	add hl, de
+	dec b
+	jr nz, .loop
+	ret
+; 3026
+
 CopyBytes: ; 0x3026
 ; copy bc bytes from hl to de
 	inc b  ; we bail the moment b hits 0, so include the last run
@@ -1779,10 +1823,62 @@
 	ret
 ; 0x31e4
 
-INCBIN "baserom.gbc",$31e4,$3340 - $31e4
+INCBIN "baserom.gbc",$31e4,$31f3 - $31e4
 
+WhiteBGMap: ; 31f3
+	call ClearPalettes
+WaitBGMap: ; 31f6
+; Tell VBlank to update BG Map
+	ld a, 1 ; BG Map 0 tiles
+	ld [$ffd4], a
+; Wait for it to do its magic
+	ld c, 4
+	call DelayFrames
+	ret
+; 3200
+
+INCBIN "baserom.gbc",$3200,$3317 - $3200
+
+ClearPalettes: ; 3317
+; Make all palettes white
+
+; For CGB we make all the palette colors white
+	ld a, [$ffe6]
+	and a
+	jr nz, .cgb
+	
+; In DMG mode, we can just change palettes to 0 (white)
+	xor a
+	ld [$ff47], a ; BGP
+	ld [$ff48], a ; OBP0
+	ld [$ff49], a ; OBP1
+	ret
+	
+.cgb
+; Save WRAM bank
+	ld a, [$ff70]
+	push af
+; WRAM bank 5
+	ld a, 5
+	ld [$ff70], a
+; Fill BGPals and OBPals with $ffff (white)
+	ld hl, BGPals
+	ld bc, $0080
+	ld a, $ff
+	call ByteFill
+; Restore WRAM bank
+	pop af
+	ld [$ff70], a
+; Request palette update
+	ld a, 1
+	ld [$ffe5], a
+	ret
+; 333e
+
+ClearSGB: ; 333e
+	ld b, $ff
 GetSGBLayout: ; 3340
-; load sgb packets unless gb
+; load sgb packets unless dmg
 
 ; check cgb
 	ld a, [$ffe6]
@@ -1875,7 +1971,7 @@
 	call GetNthString
 	ld de, $d073
 	ld bc, $000d
-	call $3026
+	call CopyBytes
 .asm_3403
 	ld a, e
 	ld [$d102], a
@@ -2279,8 +2375,32 @@
 	ret
 ; 3dfe
 
-INCBIN "baserom.gbc",$3dfe,$4000 - $3dfe
+INCBIN "baserom.gbc",$3dfe,$3e10 - $3dfe
 
+ChannelsOff: ; 3e10
+; Quickly turn off music channels
+	xor a
+	ld [$c104], a
+	ld [$c136], a
+	ld [$c168], a
+	ld [$c19a], a
+	ld [$c29c], a
+	ret
+; 3e21
+
+SFXChannelsOff: ; 3e21
+; Quickly turn off sound effect channels
+	xor a
+	ld [$c1cc], a
+	ld [$c1fe], a
+	ld [$c230], a
+	ld [$c262], a
+	ld [$c29c], a
+	ret
+; 3e32
+
+INCBIN "baserom.gbc",$3e32,$4000 - $3e32
+
 SECTION "bank1",DATA,BANK[$1]
 
 INCBIN "baserom.gbc",$4000,$617c - $4000
@@ -2374,8 +2494,36 @@
 	db $ff ; end
 ; 66de
 
-INCBIN "baserom.gbc",$66de,$8000 - $66de
+INCBIN "baserom.gbc",$66de,$6eef - $66de
 
+DrawGraphic: ; 6eef
+; input:
+;   hl: draw location
+;   b: height
+;   c: width
+;   d: tile to start drawing from
+;   e: number of tiles to advance for each row
+	call $7009
+	pop bc
+	pop hl
+	ret c
+	bit 5, [hl]
+	jr nz, .asm_6f05
+	push hl
+	call $70a4
+	pop hl
+	ret c
+	push hl
+	call $70ed
+	pop hl
+	ret c
+.asm_6f05
+	and a
+	ret
+; 6f07
+
+INCBIN "baserom.gbc",$6f07,$8000 - $6f07
+
 SECTION "bank2",DATA,BANK[$2]
 
 INCBIN "baserom.gbc",$8000,$854b - $8000
@@ -88482,7 +88630,7 @@
 	dbw $3c, $4a22 ; tap
 	dbw $3c, $4a25 ; tap
 	dbw $3c, $4a28 ; burn ; that is not a burn
-	dbw $3c, $4a2b ;
+	dbw $3c, $4a2b ; title screen sound
 	dbw $3c, $4a2e ; similar to $60
 	dbw $3c, $4a31 ; get coin from slots
 	dbw $3c, $4a34 ; pay day
@@ -89238,8 +89386,246 @@
 
 SECTION "bank43",DATA,BANK[$43]
 
-INCBIN "baserom.gbc", $10c000, $10ef46 - $10c000
+INCBIN "baserom.gbc", $10c000, $10ed67 - $10c000
 
+TitleScreen: ; 10ed67
+
+	call WhiteBGMap
+	call ClearSprites
+	call ClearTileMap
+	
+; Turn BG Map update off
+	xor a
+	ld [$ffd4], 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 [$ff4f], a
+	
+	
+; Decompress running Suicune gfx
+	ld hl, TitleSuicuneGFX
+	ld de, $8800
+	call $0b50
+	
+	
+; Clear screen palettes
+	ld hl, $9800
+	ld bc, $0280
+	xor a
+	call ByteFill
+	
+
+; Fill tile palettes:
+
+; BG Map 1:
+
+; line 0 (copyright)
+	ld hl, $9c00
+	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 [$ff4f], a
+	
+	
+; Decompress logo
+	ld hl, TitleLogoGFX
+	ld de, $8800
+	call $0b50
+	
+; Decompress background crystal
+	ld hl, TitleCrystalGFX
+	ld de, $8000
+	call $0b50
+	
+	
+; Clear screen tiles
+	ld hl, $9800
+	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 ; BG Map 1 (3,0)
+	ld bc, $010d ; 13x1
+	ld d, $c
+	ld e, $10
+	call DrawGraphic
+	
+; Initialize running Suicune?
+	ld d, $0
+	call $6ed2
+	
+; Initialize background crystal
+	call $6f06
+	
+; Save WRAM bank
+	ld a, [$ff70]
+	push af
+; WRAM bank 5
+	ld a, 5
+	ld [$ff70], 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 [$ff70], a
+	
+	
+; LY/SCX trickery starts here
+	
+; Save WRAM bank
+	ld a, [$ff70]
+	push af
+; WRAM bank 5
+	ld a, 5
+	ld [$ff70], 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, 40 ; alternate for 80 lines
+	ld hl, $d100 ; LY buffer
+.loop
+; $00 is the middle position
+	ld [hl], $70 ; coming from the left
+	inc hl
+	ld [hl], $90 ; coming from the right
+	inc hl
+	dec b
+	jr nz, .loop
+	
+; Make sure the rest of the buffer is empty
+	ld hl, $d150
+	xor a
+	ld bc, $0040
+	call ByteFill
+	
+; Let LCD Stat know we're messing around with SCX
+	ld a, $43 ; ff43 ; SCX
+	ld [$ffc6], a
+	
+; Restore WRAM bank
+	pop af
+	ld [$ff70], a
+	
+	
+; Reset audio
+	call ChannelsOff
+	call $058a
+	
+; Set sprite size to 8x16
+	ld a, [$ff40] ; LCDC
+	set 2, a
+	ld [$ff40], a ; LCDC
+	
+;
+	ld a, $70
+	ld [$ffcf], a
+	ld a, $8
+	ld [$ffd0], a
+	ld a, $7
+	ld [$ffd1], a
+	ld a, $90
+	ld [$ffd2], a
+	
+	ld a, $1
+	ld [$ffe5], a
+	
+; Update BG Map 0 (bank 0)
+	ld [$ffd4], a
+	
+	xor a
+	ld [$d002], a
+	
+; Play starting sound effect
+	call SFXChannelsOff
+	ld de, $0065
+	call StartSFX
+	
+	ret
+; 10eea7
+
+INCBIN "baserom.gbc", $10eea7, $10ef46 - $10eea7
+
 TitleSuicuneGFX: ; 10ef46
 INCBIN "gfx/title/lz/suicune.lz"
 ; 10f31b
@@ -89256,9 +89642,31 @@
 INCBIN "gfx/title/lz/crystal.lz"
 ; 10fed7
 
-INCBIN "baserom.gbc", $10fed7, $110000 - $10fed7
+INCBIN "baserom.gbc", $10fed7, $10fede - $10fed7
 
+TitleScreenPalettes:
+; BG
+	dw $0000, $0013, $7D0F, $7D0F
+	dw $0000, $7FFF, $7E0F, $343F
+	dw $0000, $1CE7, $7FFF, $7862
+	dw $0000, $35AD, $4BFF, $7862
+	dw $0000, $4E73, $339D, $7862
+	dw $0000, $6739, $1B3C, $7862
+	dw $0000, $7FFF, $02BA, $7862
+	dw $0000, $4D6B, $7FFF, $0000
+; OBJ
+	dw $0000, $3C0A, $58B1, $7D33
+	dw $7FFF, $0000, $0000, $0000
+	dw $7FFF, $0000, $0000, $0000
+	dw $7FFF, $0000, $0000, $0000
+	dw $7FFF, $0000, $0000, $0000
+	dw $7FFF, $0000, $0000, $0000
+	dw $7FFF, $0000, $0000, $0000
+	dw $7FFF, $0000, $0000, $0000
 
+INCBIN "baserom.gbc", $10ff5e, $110000 - $10ff5e
+
+
 SECTION "bank44",DATA,BANK[$44]
 
 INCBIN "baserom.gbc",$110000,$4000
@@ -89521,7 +89929,7 @@
 	ld hl, $d002
 	ld de, $b000
 	ld bc, $1000
-	call $3026
+	call CopyBytes
 	call CloseSRAM
 	pop af
 	ld [$ff70], a