Deco ACE: Fix color update (#3122)
* Split Data East ACE Chip Emulation * Add deco_ace.cpp * Update deco_ace.cpp * Update deco_ace.h * Update boogwing.h * Update boogwing.cpp alpha blend/palette effect improvements * Update boogwing.cpp * Update deco_ace.cpp * Update deco32.h * Update deco32.cpp split DECO ACE Emulation * Update deco32.cpp * Update deco32.cpp * Update deco_ace.cpp * Copyright holder / some update. Demote Boogie Wings with MACHINE_IMPERFECT_GRAPHICS * Typo * Typo(2) * Revert copyright holder, nw * deco_ace.cpp : doc update * deco_ace.cpp : revert copyright holder, update docs, convert multiplicative fade algorithm to fixed point, implement additive fading effect. deco32.cpp : update docs boogwing.cpp : update alpha blending notes * deco_ace : Revert "convert multiplicative fade algorithm to fixed point" * deco_ace : fix color
This commit is contained in:
parent
1eed9f5783
commit
eab9780b78
@ -194,8 +194,6 @@ uint32_t boogwing_state::screen_update_boogwing(screen_device &screen, bitmap_rg
|
||||
m_deco_tilegen1->pf_update(m_pf1_rowscroll, m_pf2_rowscroll);
|
||||
m_deco_tilegen2->pf_update(m_pf3_rowscroll, m_pf4_rowscroll);
|
||||
|
||||
m_deco_ace->palette_update();
|
||||
|
||||
/* Draw playfields */
|
||||
bitmap.fill(m_palette->pen(0x400), cliprect); /* pen not confirmed */
|
||||
screen.priority().fill(0);
|
||||
|
@ -376,8 +376,6 @@ uint32_t nslasher_state::screen_update_nslasher(screen_device &screen, bitmap_rg
|
||||
if (m_deco_ace->get_aceram(0x17)!=0x0 && m_pri)
|
||||
alphaTilemap=1;
|
||||
|
||||
m_deco_ace->palette_update();
|
||||
|
||||
screen.priority().fill(0, cliprect);
|
||||
|
||||
bitmap.fill(m_palette->pen(0x200), cliprect);
|
||||
|
@ -63,7 +63,6 @@ DEFINE_DEVICE_TYPE(DECO_ACE, deco_ace_device, "deco_ace", "Data East 99 'ACE' Ch
|
||||
deco_ace_device::deco_ace_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, DECO_ACE, tag, owner, clock),
|
||||
device_video_interface(mconfig, *this),
|
||||
m_dirty_palette(0),
|
||||
m_palette_effect_min(0x100),
|
||||
m_palette_effect_max(0xfff),
|
||||
m_palette(*this, finder_base::DUMMY_TAG),
|
||||
@ -92,8 +91,7 @@ void deco_ace_device::device_start()
|
||||
m_paletteram = make_unique_clear<uint32_t[]>(4096);
|
||||
m_paletteram_buffered = make_unique_clear<uint32_t[]>(4096);
|
||||
m_ace_ram = make_unique_clear<uint16_t[]>(0x28);
|
||||
|
||||
save_item(NAME(m_dirty_palette));
|
||||
|
||||
save_pointer(NAME(m_paletteram.get()), 4096);
|
||||
save_pointer(NAME(m_paletteram_buffered.get()), 4096);
|
||||
save_pointer(NAME(m_ace_ram.get()), 0x28);
|
||||
@ -107,8 +105,16 @@ void deco_ace_device::device_reset()
|
||||
{
|
||||
m_palette_effect_min = 0x100; /* Screenshots seem to suggest ACE fades do not affect playfield 1 palette (0-255) */
|
||||
m_palette_effect_max = 0xfff;
|
||||
memset(m_ace_ram.get(),0,0x28);
|
||||
m_dirty_palette = 1;
|
||||
memset(m_ace_ram.get(),0,0x28);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_post_load - device-specific post-load
|
||||
//-------------------------------------------------
|
||||
|
||||
void deco_ace_device::device_post_load()
|
||||
{
|
||||
palette_update();
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@ -154,60 +160,47 @@ READ16_MEMBER( deco_ace_device::ace_r )
|
||||
WRITE16_MEMBER( deco_ace_device::ace_w )
|
||||
{
|
||||
COMBINE_DATA(&m_ace_ram[offset]);
|
||||
if ((offset >= 0x20) && (offset <= 0x26))
|
||||
m_dirty_palette = 1;
|
||||
if ((offset >= 0x20) && (offset <= 0x26))
|
||||
palette_update();
|
||||
}
|
||||
|
||||
void deco_ace_device::palette_update()
|
||||
{
|
||||
if (m_dirty_palette != 0)
|
||||
{
|
||||
int r,g,b,i;
|
||||
uint8_t fadeptr=m_ace_ram[0x20] & 0xff;
|
||||
uint8_t fadeptg=m_ace_ram[0x21] & 0xff;
|
||||
uint8_t fadeptb=m_ace_ram[0x22] & 0xff;
|
||||
uint8_t fadepsr=m_ace_ram[0x23] & 0xff;
|
||||
uint8_t fadepsg=m_ace_ram[0x24] & 0xff;
|
||||
uint8_t fadepsb=m_ace_ram[0x25] & 0xff;
|
||||
uint16_t mode=m_ace_ram[0x26] & 0xffff;
|
||||
|
||||
for (i=0; i<2048; i++)
|
||||
{
|
||||
int r,g,b,i;
|
||||
uint8_t fadeptr=m_ace_ram[0x20] & 0xff;
|
||||
uint8_t fadeptg=m_ace_ram[0x21] & 0xff;
|
||||
uint8_t fadeptb=m_ace_ram[0x22] & 0xff;
|
||||
uint8_t fadepsr=m_ace_ram[0x23] & 0xff;
|
||||
uint8_t fadepsg=m_ace_ram[0x24] & 0xff;
|
||||
uint8_t fadepsb=m_ace_ram[0x25] & 0xff;
|
||||
uint16_t mode=m_ace_ram[0x26] & 0xffff;
|
||||
/* Lerp palette entry to 'fadept' according to 'fadeps' */
|
||||
b = (m_paletteram_buffered[i] >>16) & 0xff;
|
||||
g = (m_paletteram_buffered[i] >> 8) & 0xff;
|
||||
r = (m_paletteram_buffered[i] >> 0) & 0xff;
|
||||
|
||||
m_dirty_palette=0;
|
||||
|
||||
for (i=0; i<2048; i++)
|
||||
if ((i>=m_palette_effect_min) && (i<=m_palette_effect_max))
|
||||
{
|
||||
/* Lerp palette entry to 'fadept' according to 'fadeps' */
|
||||
b = (m_paletteram_buffered[i] >>16) & 0xff;
|
||||
g = (m_paletteram_buffered[i] >> 8) & 0xff;
|
||||
r = (m_paletteram_buffered[i] >> 0) & 0xff;
|
||||
|
||||
if ((i>=m_palette_effect_min) && (i<=m_palette_effect_max))
|
||||
switch (mode)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
default:
|
||||
case 0x1100: // multiplicative fade
|
||||
/* Yeah, this should really be fixed point, I know */
|
||||
b = (uint8_t)((float)b + (((float)fadeptb - (float)b) * (float)fadepsb/255.0f));
|
||||
g = (uint8_t)((float)g + (((float)fadeptg - (float)g) * (float)fadepsg/255.0f));
|
||||
r = (uint8_t)((float)r + (((float)fadeptr - (float)r) * (float)fadepsr/255.0f));
|
||||
break;
|
||||
case 0x1000: // additive fade, correct?
|
||||
b = b + fadepsb;
|
||||
g = g + fadepsg;
|
||||
r = r + fadepsr;
|
||||
break;
|
||||
}
|
||||
|
||||
if (b < 0) b = 0;
|
||||
if (b > 0xff) b = 0xff;
|
||||
if (g < 0) g = 0;
|
||||
if (g > 0xff) g = 0xff;
|
||||
if (r < 0) r = 0;
|
||||
if (r > 0xff) r = 0xff;
|
||||
default:
|
||||
case 0x1100: // multiplicative fade
|
||||
/* Yeah, this should really be fixed point, I know */
|
||||
b = (uint8_t)((float)b + (((float)fadeptb - (float)b) * (float)fadepsb/255.0f));
|
||||
g = (uint8_t)((float)g + (((float)fadeptg - (float)g) * (float)fadepsg/255.0f));
|
||||
r = (uint8_t)((float)r + (((float)fadeptr - (float)r) * (float)fadepsr/255.0f));
|
||||
break;
|
||||
case 0x1000: // additive fade, correct?
|
||||
b = std::min(b + fadepsb, 0xff);
|
||||
g = std::min(g + fadepsg, 0xff);
|
||||
r = std::min(r + fadepsr, 0xff);
|
||||
break;
|
||||
}
|
||||
|
||||
m_palette->set_pen_color(i,rgb_t(r,g,b));
|
||||
}
|
||||
m_palette->set_pen_color(i,rgb_t(r,g,b));
|
||||
}
|
||||
}
|
||||
|
||||
@ -221,8 +214,8 @@ void deco_ace_device::set_palette_effect_max(uint32_t val)
|
||||
{
|
||||
if (m_palette_effect_max != val)
|
||||
{
|
||||
m_palette_effect_max = val;
|
||||
m_dirty_palette = 1;
|
||||
m_palette_effect_max = val;
|
||||
palette_update();
|
||||
}
|
||||
}
|
||||
|
||||
@ -264,8 +257,8 @@ uint16_t deco_ace_device::get_aceram(uint8_t val)
|
||||
|
||||
WRITE16_MEMBER( deco_ace_device::palette_dma_w )
|
||||
{
|
||||
memcpy(m_paletteram_buffered.get(), m_paletteram.get(), 4096);
|
||||
m_dirty_palette = 1;
|
||||
memcpy(m_paletteram_buffered.get(), m_paletteram.get(), 4096);
|
||||
palette_update();
|
||||
}
|
||||
|
||||
/*****************************************************************************************/
|
||||
|
@ -45,10 +45,10 @@ protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
virtual void device_post_load() override;
|
||||
|
||||
private:
|
||||
// internal state
|
||||
uint8_t m_dirty_palette;
|
||||
uint32_t m_palette_effect_min;
|
||||
uint32_t m_palette_effect_max;
|
||||
required_device<palette_device> m_palette;
|
||||
|
Loading…
Reference in New Issue
Block a user