diff options
author | cam900 <dbtlrchl@naver.com> | 2018-01-25 23:30:27 +0900 |
---|---|---|
committer | ajrhacker <ajrhacker@users.noreply.github.com> | 2018-01-25 09:30:27 -0500 |
commit | eab9780b78c9ef3efb763ac3cb756e9b64fa406a (patch) | |
tree | c17c85aa93497e64442d32214de626f6bf5d66b4 /src/mame/video/deco_ace.cpp | |
parent | 1eed9f5783df3c43d970fc9817434c6f7b9c959c (diff) |
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
Diffstat (limited to 'src/mame/video/deco_ace.cpp')
-rw-r--r-- | src/mame/video/deco_ace.cpp | 103 |
1 files changed, 48 insertions, 55 deletions
diff --git a/src/mame/video/deco_ace.cpp b/src/mame/video/deco_ace.cpp index c61e9047a51..65260b7a864 100644 --- a/src/mame/video/deco_ace.cpp +++ b/src/mame/video/deco_ace.cpp @@ -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;
-
- m_dirty_palette=0;
-
- for (i=0; i<2048; i++)
- {
- /* 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;
+ /* 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))
+ 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(); }
/*****************************************************************************************/
|