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
|
2024-09-15 17:43:33 +02:00
|
|
|
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
|
2024-09-15 17:43:33 +02:00
|
|
|
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
|
2024-09-15 17:43:33 +02:00
|
|
|
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
|
2024-09-15 17:43:33 +02:00
|
|
|
.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
|
2024-09-15 17:43:33 +02:00
|
|
|
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
|
2024-09-15 17:43:33 +02:00
|
|
|
|
|
|
|
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
|