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; }