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