void fade_function_ASM() __naked{
// will transform palout into palin, one color channel at a time
__asm
push hl
push bc
push de
xor a
ld (#_fadePaltmp+6), a ;color var, start with blue channel (0)
_faderoutine_master_loop:
xor a
ld (#_fadePaltmp+7), a ; reset diff var
ld hl, #_temp_pal32in
ld de, #_temp_pal32out
; PALETTEs are aligned, so only inc or dec L / E
ld b, #32 ; 32 colors (full pal bkg+spr) loop
_faderoutine_loop:
push hl
push de
ld c, (hl) ; 1 IN
ld hl, #_fadePaltmp ;Rin,Gin,Bin - 0,1,2
call _fadeout_explode_channels
ex de, hl
ld c, (hl) ; 2 OUT
ld hl, #_fadePaltmp+3 ;Rout,Gout,Bout - 3,4,5
call _fadeout_explode_channels
ld de, #_fadePaltmp+2 ;Bin
ld hl, #_fadePaltmp+5 ;Bout
xor a
ld a, (#_fadePaltmp +6) ;which color index R(2), G(1), B(0)
or a
jp z, _fadeout_diff_rgb ;Blue
dec l
dec e
dec a
jp z, _fadeout_diff_rgb ;Green
dec l
dec e
jp _fadeout_diff_rgb ;Red
_faderoutine_compute:
pop de
pop hl
xor a
ld a, (#_fadePaltmp+3) ;Rout
ld c, a
ld a, (#_fadePaltmp+4) ;Gout
rla
rla
add c
ld c, a
ld a, (#_fadePaltmp+5) ;Bout
rla
rla
rla
rla
add c
ld (de), a
inc l
inc e
djnz _faderoutine_loop
ld a, (#_fadePaltmp+6) ;color
cp #2
jr nz, 3$
ld a, #0xFF
3$: inc a
ld (#_fadePaltmp+6), a ;next channel B(0)=>G(1)=>R(2)
call _SMS_waitForVBlank
call _SMS_waitForVBlank
;add more _SMS_waitForVBlank calls to make fade effect "slower"
call _load_palette_32c
ld a, (#_fadePaltmp+7) ;diff==0?
or a
jp nz, _faderoutine_master_loop ;loop while diff!=0
pop de
pop bc
pop hl
ret
_load_palette_32c:
xor a
ld c, #0xBF
out (c), a
ld a, #0xC0
out (c), a
dec c ;=BE
ld b, #32
ld hl, #_temp_pal32out
otir
ret
_fadeout_diff_rgb:
ld a, (de) ;inPal channel
sub (hl) ;outPal channel
jp z, _faderoutine_compute
ld a, #1
ld (#_fadePaltmp+7), a ;Set Diff to 1
jr nc, _fadeout_diff_rgb_minus
dec (hl)
jp _faderoutine_compute
_fadeout_diff_rgb_minus:
inc (hl)
jp _faderoutine_compute
_fadeout_explode_channels:
ld a, c
and #0x3 ;R
ld (hl), a
ld a, c
and #0xC ;G
rra
rra
inc l
ld (hl), a
ld a, c
and #0x30 ;B
rra
rra
rra
rra
inc l
ld (hl), a
ret
__endasm;
}