Hamazing/source/framework/framework_palettelerp.asm

266 lines
7.1 KiB
NASM
Raw Normal View History

2023-05-22 16:17:35 +02:00
;--------------------------------------------------------------------
; Initializes linear interpolation for simple palette fading.
;
; In : a0 = source palette buffer (12 bit)
; a1 = lerp structures
; d0 = number of colors
;
fw_InitPaletteLerp:
PUTMSG 20,<"Init Lerp %p with %p">,a1,a0
subq.w #1,d0
bcc.s .cont
rts
.cont move.w #$800,d2
.loop
moveq.l #0,d1
move.w d1,cl_Steps(a1)
move.w (a0),cl_Color(a1)
move.w d1,cl_Red+le_Add(a1)
move.w d1,cl_Green+le_Add(a1)
move.w d1,cl_Blue+le_Add(a1)
move.b (a0)+,d1
ror.w #4,d1
add.w d2,d1
move.w d1,cl_Red+le_Current(a1)
moveq.l #-16,d1
and.b (a0),d1
addq.b #8,d1
move.b d1,cl_Green+le_Current(a1)
clr.b cl_Green+1+le_Current(a1)
moveq.l #15,d1
and.b (a0)+,d1
ror.w #4,d1
add.w d2,d1
move.w d1,cl_Blue+le_Current(a1)
lea cl_SIZEOF(a1),a1
dbra d0,.loop
rts
;--------------------------------------------------------------------
; Initializes linear interpolation for simple palette fading to given color
;
; In : a1 = lerp structures
; d0 = number of colors
; d1 = color value
;
fw_InitPaletteLerpSameColor:
PUTMSG 20,<"Init Lerp %p with %x">,a1,d1
subq.w #1,d0
bcc.s .cont
rts
.cont move.w d1,cl_Color(a1)
moveq.l #0,d1
move.w d1,cl_Steps(a1)
move.w d1,cl_Red+le_Add(a1)
move.w d1,cl_Green+le_Add(a1)
move.w d1,cl_Blue+le_Add(a1)
move.b cl_Color(a1),d1
ror.w #4,d1
add.w #$800,d1
move.w d1,cl_Red+le_Current(a1)
moveq.l #-16,d1
and.b cl_Color+1(a1),d1
addq.b #8,d1
move.b d1,cl_Green+le_Current(a1)
clr.b cl_Green+1+le_Current(a1)
moveq.l #15,d1
and.b cl_Color+1(a1),d1
ror.w #4,d1
add.w #$800,d1
move.w d1,cl_Blue+le_Current(a1)
dbra d0,.iloop
rts
.iloop movem.l (a1),d1-d4
.loop lea cl_SIZEOF(a1),a1
movem.l d1-d4,(a1)
dbra d0,.loop
rts
;--------------------------------------------------------------------
; Initialize fading to the given palette from current state
;
; In : a0 = target palette (12 bit)
; a1 = lerp structures
; d0 = number of colors
; d1 = number of steps (power of two)
;
fw_FadePaletteTo:
subq.w #1,d0
bcc.s .cont
rts
.cont
move.w d1,d4
moveq.l #-2,d2
.stepsizeloop
addq.w #1,d2
lsr.w #1,d1
bne.s .stepsizeloop
.loop
move.w d4,cl_Steps(a1)
moveq.l #0,d1
move.b (a0)+,d1
ror.w #4,d1
move.w cl_Red+le_Current(a1),d3
lsr.w #1,d1
add.w #$400,d1
2023-05-22 16:17:35 +02:00
lsr.w #1,d3
sub.w d3,d1
asr.w d2,d1
move.w d1,cl_Red+le_Add(a1)
moveq.l #-16,d1
and.b (a0),d1
lsl.w #8,d1
clr.b d1
move.w cl_Green+le_Current(a1),d3
lsr.w #1,d1
add.w #$400,d1
2023-05-22 16:17:35 +02:00
lsr.w #1,d3
sub.w d3,d1
asr.w d2,d1
move.w d1,cl_Green+le_Add(a1)
moveq.l #15,d1
and.b (a0)+,d1
ror.w #4,d1
move.w cl_Blue+le_Current(a1),d3
lsr.w #1,d1
add.w #$400,d1
2023-05-22 16:17:35 +02:00
lsr.w #1,d3
sub.w d3,d1
asr.w d2,d1
move.w d1,cl_Blue+le_Add(a1)
lea cl_SIZEOF(a1),a1
dbra d0,.loop
rts
;--------------------------------------------------------------------
; Do one step in fading for the pre-initialized
;
; Will do nothing if end-point has been already reached.
;
; In : a1 = lerp structures
; d0 = number of colors
;
fw_DoFadePaletteStep:
subq.w #1,d0
bcc.s .cont
.done rts
.cont lea cl_Steps(a1),a0
tst.w (a0)
bmi.s .done
moveq.l #0,d4
.loop
addq.w #2,a1
.loop2
2023-05-22 16:17:35 +02:00
move.w (a1),d1 ; cl_Steps
beq.s .skip
moveq.l #1,d4
subq.w #1,d1
move.w d1,(a1)+ ; cl_Steps
move.w (a1)+,d1 ; cl_Red+le_Add
add.w (a1),d1 ; cl_Red+le_Current
move.w d1,(a1)+ ; cl_Red+le_Current
move.w (a1)+,d2 ; cl_Green+le_Add
add.w d2,(a1)+ ; cl_Green+le_Current
move.w (a1)+,d3 ; cl_Blue+le_Add
add.w (a1),d3 ; cl_Blue+le_Current
move.w d3,(a1)+ ; cl_Blue+le_Current
lsr.w #4,d1
moveq.l #15,d2
rol.w #4,d3
and.w d2,d3
moveq.l #-16,d2
and.b cl_Green+le_Current-(cl_Blue+le_Current+2)(a1),d2
or.b d3,d2
move.b d2,d1
move.w d1,-cl_SIZEOF(a1) ; cl_Color
dbra d0,.loop
rts
.skip
lea cl_SIZEOF(a1),a1
dbra d0,.loop2
subq.w #2,a1
2023-05-22 16:17:35 +02:00
tst.w d4
bne.s .noend
st (a0)
.noend
rts
IFEQ FW_PALETTE_LERP_SUPPORT-2
; a1 = lerp structures
; d0 = number of colors
fw_DoFadePaletteStepBlueNoise:
move.l fw_BlueNoiseTablePtr(a6),a0
move.w #1024*2,d2
move.w d0,d1
add.w d1,d1
add.w d0,d1
add.w d1,d1
sub.w d1,d2
move.w fw_BlueNoisePos(a6),d1
cmp.w d2,d1
blt.s .nowrap
sub.w d2,d1
.nowrap
adda.w d1,a0
add.w d0,d1
add.w d0,d1
move.w d1,fw_BlueNoisePos(a6)
subq.w #1,d0
bcc.s .loop
rts
.loop
addq.w #2,a1
move.w (a1),d1 ; cl_Steps
beq.s .skip
subq.w #1,d1
move.w d1,(a1)+ ; cl_Steps
move.w (a1)+,d1 ; cl_Red+le_Add
add.w (a1),d1 ; cl_Red+le_Current
move.w d1,(a1)+ ; cl_Red+le_Current
move.w (a1)+,d2 ; cl_Green+le_Add
add.w (a1),d2 ; cl_Green+le_Current
move.w d2,(a1)+ ; cl_Green+le_Current
move.w (a1)+,d3 ; cl_Blue+le_Add
add.w (a1),d3 ; cl_Blue+le_Current
move.w d3,(a1)+ ; cl_Blue+le_Current
bra.s .addnoise
.skip
addq.w #2,a1
movem.l (a1)+,d1/d2/d3 ; cl_Red/cl_Green/cl_Blue+le_Current
.addnoise
add.w (a0)+,d1
bcc.s .nofr
moveq.l #-1,d1
.nofr
add.w (a0)+,d2
bcc.s .nofg
moveq.l #-1,d2
.nofg
add.w (a0)+,d3
bcc.s .nofb
moveq.l #-1,d3
.nofb
lsr.w #4,d1
moveq.l #15,d2
rol.w #4,d3
and.w d2,d3
moveq.l #-16,d2
and.b cl_Green+le_Current-(cl_Blue+le_Current+2)(a1),d2
or.b d3,d2
move.b d2,d1
move.w d1,-cl_SIZEOF(a1) ; cl_Color
dbra d0,.loop
rts
ENDC