From 61a3d1459397800360064ab15adc97012e61c1af Mon Sep 17 00:00:00 2001 From: yenatch Date: Sat, 12 Jan 2013 23:55:01 -0500 Subject: [PATCH] disassemble title screen init --- main.asm | 432 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 420 insertions(+), 12 deletions(-) diff --git a/main.asm b/main.asm index b90e0e6e0..84084828e 100644 --- a/main.asm +++ b/main.asm @@ -140,6 +140,9 @@ IncGradGBPalTable_01: ; 52f 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,7 +785,23 @@ FarCopyBytesDouble: ; e9b ; 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 @@ -1475,9 +1494,34 @@ CloseSRAM: ; 2fe1 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 @@ -1779,10 +1823,62 @@ StringCmp: ; 31db 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 @@ GetName: ; 33c3 call GetNthString ld de, $d073 ld bc, $000d - call $3026 + call CopyBytes .asm_3403 ld a, e ld [$d102], a @@ -2279,7 +2375,31 @@ CheckSFX: ; 3dde 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] @@ -2374,7 +2494,35 @@ CheckNickErrors: ; 669f 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] @@ -88482,7 +88630,7 @@ SFX: ; e927c 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,7 +89386,245 @@ INCBIN "baserom.gbc", $10983f, $10c000 - $10983f 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" @@ -89256,7 +89642,29 @@ TitleCrystalGFX: ; 10fcee 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] @@ -89521,7 +89929,7 @@ Function117bb6: ld hl, $d002 ld de, $b000 ld bc, $1000 - call $3026 + call CopyBytes call CloseSRAM pop af ld [$ff70], a