diff options
Diffstat (limited to 'home/palettes.asm')
-rwxr-xr-x | home/palettes.asm | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/home/palettes.asm b/home/palettes.asm new file mode 100755 index 0000000..a038527 --- /dev/null +++ b/home/palettes.asm @@ -0,0 +1,466 @@ +SetAllPalettesWhite: ; 0xb66
+; Sets all BG and OBJ palettes to white.
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr nz, .gameboyColor
+ xor a
+ ld [hBGP], a
+ ld [hOBP0], a
+ ld [hOBP1], a
+ ret
+
+.gameboyColor
+ ld de, rBGPI
+ ld hl, wPaletteData
+ ld b, $0
+ ld c, $20
+.asm_b7d
+ ld a, b
+ ld [rBGPI], a
+ inc b
+ ld a, [rBGPD]
+ ld [hli], a
+ ld a, b
+ ld [rBGPI], a
+ inc b
+ ld a, [rBGPD]
+ ld [hli], a
+ dec c
+ jr nz, .asm_b7d
+ ld b, $0
+ ld c, $20
+.asm_b92
+ ld a, b
+ ld [rOBPI], a
+ inc b
+ ld a, [rOBPD]
+ ld [hli], a
+ ld a, b
+ ld [rOBPI], a
+ inc b
+ ld a, [rOBPD]
+ ld [hli], a
+ dec c
+ jr nz, .asm_b92
+ ld de, rBGPI
+ ld b, $2
+.asm_ba8
+ ld a, $80
+ ld [de], a
+ inc de
+ ld c, $20
+.asm_bae
+ ld a, $ff
+ ld [de], a
+ ld [hli], a
+ ld a, $7f
+ ld [de], a
+ ld [hli], a
+ dec c
+ jr nz, .asm_bae
+ inc de
+ dec b
+ jr nz, .asm_ba8
+ ret
+
+FadeIn: ; 0xbbe
+; Fades palettes in from white screen.
+ ld a, [hGameBoyColorFlag]
+ and a
+ jp nz, FadeIn_GameboyColor
+ ; Regular Gameboy
+ ld hl, hBGP
+ ld de, wBGP
+ ld b, $3
+.loop
+ ld a, [de]
+ and $55
+ ld c, a
+ ld a, [de]
+ and $aa
+ srl a
+ and c
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .loop
+ ld bc, $0002
+ call AdvanceFrames
+ ld hl, hBGP
+ ld de, wBGP
+ ld b, $3
+.loop2
+ ld a, [de]
+ and $aa
+ srl a
+ add [hl]
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .loop2
+ ld bc, $0002
+ call AdvanceFrames
+ ld hl, hBGP
+ ld de, wBGP
+ ld b, $3
+.loop3
+ ld a, [de]
+ and $55
+ ld c, a
+ ld a, [de]
+ and $aa
+ srl a
+ or c
+ add [hl]
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .loop3
+ ld bc, $0002
+ call AdvanceFrames
+ ret
+
+FadeIn_GameboyColor: ; 0xc19
+; Fades in to the target palette data in wPaletteData from wFadeBGPaletteData and wFadeOBJPaletteData
+; Fade is completed after 16 frames of incrementally updating the palettes.
+ ld b, 16 ; fade takes 16 frames to complete
+.loop
+ push bc
+ ld de, wPaletteData
+ ld hl, wFadeBGPaletteData
+ call FadeInStep
+ call SetFadedPalettes
+ pop bc
+ dec b
+ jr nz, .loop
+ ret
+
+FadeInStep: ; 0xc2d
+; de = base palette data
+; hl = faded palette data
+ ld a, b
+ cp $1
+ jr z, .lastStep
+ ld c, $40 ; total number of colors in BG and OBJ palettes
+.loop
+ push bc
+ ld a, [hli]
+ sub $42
+ ld c, a
+ ld a, [hld]
+ sbc $8
+ ld b, a ; subtracted 2 from each RGB value of the color
+ call GetNextFadedPalette
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+.lastStep
+ ld c, $40 ; total number of colors in BG and OBJ palettes
+.loop2
+ push bc
+ ld a, [hli]
+ sub $21
+ ld c, a
+ ld a, [hld]
+ sbc $4
+ ld b, a
+ call GetNextFadedPalette
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ pop bc
+ dec c
+ jr nz, .loop2
+ ret
+
+GetNextFadedPalette: ; 0xc60
+; de = source palette data
+; bc = target palette RGB - 2
+; Places the resulting palette RGB into bc
+ push hl
+ ld a, [de]
+ and %00011111 ; Target RGB Blue value
+ ld l, a
+ ld a, c
+ and %00011111 ; Current faded RBG Blue value - 2
+ cp l
+ jr nc, .brighter
+ ; set the current faded Blue value to the target blue value.
+ ld a, c
+ and %11100000
+ or l
+ ld c, a
+.brighter
+ ld a, [de]
+ and %11100000
+ ld l, a
+ inc de
+ ld a, [de]
+ srl a
+ rr l
+ srl a
+ rr l
+ ld a, c
+ and %11100000
+ ld h, a
+ ld a, b
+ srl a
+ rr h
+ srl a
+ rr h
+ ld a, h
+ cp l
+ jr nc, .asm_ca3
+ ld h, $0
+ sla l
+ rl h
+ sla l
+ rl h
+ ld a, c
+ and $1f
+ or l
+ ld c, a
+ ld a, b
+ and $7c
+ or h
+ ld b, a
+.asm_ca3
+ ld a, [de]
+ and $7c
+ ld l, a
+ ld a, b
+ and $7c
+ cp l
+ jr nc, .asm_cb2
+ ld a, b
+ and $3
+ or l
+ ld b, a
+.asm_cb2
+ inc de
+ pop hl
+ ret
+
+FadeOut: ; 0xcb5
+; Fades palettes out to a white screen.
+ ld a, [hGameBoyColorFlag]
+ and a
+ jp nz, FadeOut_GameboyColor
+ ; Regular Gameboy
+ ld hl, hBGP
+ ld b, $3
+.loop
+ push bc
+ push hl
+ ld b, $3
+.loop2
+ ld a, [hl]
+ and $55
+ ld c, a
+ ld a, [hl]
+ and $aa
+ srl a
+ or c
+ cpl
+ inc a
+ add [hl]
+ ld [hli], a
+ dec b
+ jr nz, .loop2
+ ld bc, $0002
+ call AdvanceFrames
+ pop hl
+ pop bc
+ dec b
+ jr nz, .loop
+ xor a
+ ld hl, hBGP
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld bc, $0002
+ call AdvanceFrames
+ ret
+
+FadeOut_GameboyColor: ; 0xcee
+; Fades out to white RGB colors from the currently-loaded palettes.
+; Fade is completed after 16 frames of incrementally updating the palettes.
+ ld hl, wFadeBGPaletteData
+ ld de, rBGPI
+ call LoadCurrentPalettesIntoFadePalettes
+ ld hl, wFadeOBJPaletteData
+ ld de, rOBPI
+ call LoadCurrentPalettesIntoFadePalettes
+ ld b, 16 ; fade takes 16 frames to complete
+.loop
+ push bc
+ ld hl, wFadeBGPaletteData
+ call FadeOutStep
+ call SetFadedPalettes
+ pop bc
+ dec b
+ jr nz, .loop
+ ret
+
+FadeOutStep: ; 0xd11
+; hl = faded palette data
+ ld b, $40
+.asm_d13
+ ld a, [hl]
+ and $1f
+ add $2
+ ld e, a
+ cp $1f
+ jr c, .asm_d1f
+ ld e, $1f
+.asm_d1f
+ ld a, [hl]
+ and $e0
+ or e
+ ld [hl], a
+ ld a, [hli]
+ and $e0
+ ld e, [hl]
+ dec hl
+ srl e
+ rr a
+ srl e
+ rr a
+ add $10
+ ld e, a
+ jr nc, .asm_d38
+ ld e, $f8
+.asm_d38
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ ld a, [hl]
+ and $1f
+ or e
+ ld [hli], a
+ ld a, [hl]
+ and $7c
+ or d
+ ld [hl], a
+ ld a, [hl]
+ and $7c
+ add $8
+ ld e, a
+ cp $7c
+ jr c, .asm_d58
+ ld e, $7c
+.asm_d58
+ ld a, [hl]
+ and $3
+ or e
+ ld [hli], a
+ dec b
+ jr nz, .asm_d13
+ ret
+
+SetFadedPalettes: ; 0d61
+; Sets the current palette data to the faded palettes.
+ ld a, [rIE]
+ res 0, a
+ ld [rIE], a
+ ld hl, wFadeBGPaletteData
+ ld de, rBGPI
+ ld a, $80
+ ld [de], a
+ inc de
+.waitForVBlank
+ ld a, [rLY]
+ cp $90
+ jr c, .waitForVBlank
+ ld b, $10
+.loadBGColorsLoop
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec b
+ jr nz, .loadBGColorsLoop
+ inc de
+ ld a, $80
+ ld [de], a
+ inc de
+ ld b, $10
+.loadOBJColorsLoop
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec b
+ jr nz, .loadOBJColorsLoop
+ ld a, [rIE]
+ set 0, a
+ ld [rIE], a
+ ret
+
+LoadCurrentPalettesIntoFadePalettes: ; 0xd9d
+; hl = destination for palette data
+; de = source of palettes (rBGPI or rOBPI)
+ ld b, $0
+ ld c, e
+ inc c
+ call WaitForLCD
+.asm_da4
+ call Func_61b
+.asm_da7
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_da7 ; wait for lcd controller to finish transferring data
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ ld a, b
+ cp $40
+ jr nz, .asm_da4
+ ret
|