diff --git a/src/devices/video/tlc34076.cpp b/src/devices/video/tlc34076.cpp index 9d25c044eeb..d484ef333c7 100644 --- a/src/devices/video/tlc34076.cpp +++ b/src/devices/video/tlc34076.cpp @@ -43,6 +43,7 @@ DEFINE_DEVICE_TYPE(TLC34076, tlc34076_device, "tlc34076", "TI TLC34076 VIP") //------------------------------------------------- tlc34076_device::tlc34076_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, TLC34076, tag, owner, clock) + , device_palette_interface(mconfig, *this) , m_dacbits(6) { } @@ -82,6 +83,9 @@ void tlc34076_device::device_reset() m_regs[PALETTE_PAGE] = 0x00; m_regs[TEST_REGISTER] = 0x00; m_regs[RESET_STATE] = 0x00; + + for (int i = 0; i < 0x100; i++) + update_pen(i); } @@ -90,41 +94,34 @@ void tlc34076_device::device_reset() //************************************************************************** //------------------------------------------------- -// get_pens - retrieve current palette +// update_pen - update color in current palette //------------------------------------------------- -const rgb_t *tlc34076_device::get_pens() +void tlc34076_device::update_pen(uint8_t i) { - offs_t i; + int r, g, b; - for (i = 0; i < 0x100; i++) + if ((i & m_regs[PIXEL_READ_MASK]) == i) { - int r, g, b; + r = m_local_paletteram[0][i]; + g = m_local_paletteram[1][i]; + b = m_local_paletteram[2][i]; - if ((i & m_regs[PIXEL_READ_MASK]) == i) + if (m_dacbits == 6) { - r = m_local_paletteram[0][i]; - g = m_local_paletteram[1][i]; - b = m_local_paletteram[2][i]; - - if (m_dacbits == 6) - { - r = pal6bit(r); - g = pal6bit(g); - b = pal6bit(b); - } + r = pal6bit(r); + g = pal6bit(g); + b = pal6bit(b); } - else - { - r = 0; - g = 0; - b = 0; - } - - m_pens[i] = rgb_t(r, g, b); + } + else + { + r = 0; + g = 0; + b = 0; } - return m_pens.get(); + set_pen_color(i, rgb_t(r, g, b)); } @@ -189,11 +186,18 @@ WRITE8_MEMBER( tlc34076_device::write ) for (int i = 0; i < 3; i++) m_local_paletteram[i][m_regs[PALETTE_WRITE_ADDR]] = m_palettedata[i]; + update_pen(m_regs[PALETTE_WRITE_ADDR]); + m_writeindex = 0; m_regs[PALETTE_WRITE_ADDR]++; } break; + case PIXEL_READ_MASK: + for (int i = 0; i < 0x100; i++) + update_pen(i); + break; + case PALETTE_READ_ADDR: m_readindex = 0; break; diff --git a/src/devices/video/tlc34076.h b/src/devices/video/tlc34076.h index ae17c54b3e0..9a7c956aa80 100644 --- a/src/devices/video/tlc34076.h +++ b/src/devices/video/tlc34076.h @@ -19,7 +19,7 @@ TYPE DEFINITIONS ***************************************************************************/ -class tlc34076_device : public device_t +class tlc34076_device : public device_t, public device_palette_interface { public: enum tlc34076_bits @@ -35,7 +35,6 @@ public: void set_bits(tlc34076_bits bits) { m_dacbits = bits; } // public interface - const rgb_t *get_pens(); DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -44,7 +43,13 @@ protected: virtual void device_start() override; virtual void device_reset() override; + // device_palette_interface overrides + virtual uint32_t palette_entries() const override { return 0x100; } + private: + // internal helpers + void update_pen(uint8_t i); + // internal state std::unique_ptr m_local_paletteram[3]; uint8_t m_regs[0x10]; diff --git a/src/mame/drivers/coolpool.cpp b/src/mame/drivers/coolpool.cpp index a423114b180..e9c41c99753 100644 --- a/src/mame/drivers/coolpool.cpp +++ b/src/mame/drivers/coolpool.cpp @@ -90,7 +90,7 @@ TMS340X0_SCANLINE_RGB32_CB_MEMBER(coolpool_state::coolpool_scanline) { uint16_t *vram = &m_vram_base[(params->rowaddr << 8) & 0x1ff00]; uint32_t *dest = &bitmap.pix32(scanline); - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); int coladdr = params->coladdr; int x; diff --git a/src/mame/drivers/skeetsht.cpp b/src/mame/drivers/skeetsht.cpp index 53f16b2ccbc..9e432d97752 100644 --- a/src/mame/drivers/skeetsht.cpp +++ b/src/mame/drivers/skeetsht.cpp @@ -90,7 +90,7 @@ void skeetsht_state::video_start() TMS340X0_SCANLINE_RGB32_CB_MEMBER(skeetsht_state::scanline_update) { - const rgb_t *const pens = m_tlc34076->get_pens(); + const pen_t *const pens = m_tlc34076->pens(); uint16_t *vram = &m_tms_vram[(params->rowaddr << 8) & 0x3ff00]; uint32_t *dest = &bitmap.pix32(scanline); int coladdr = params->coladdr; diff --git a/src/mame/drivers/tickee.cpp b/src/mame/drivers/tickee.cpp index 240585aa1dd..c9b4f632e0b 100644 --- a/src/mame/drivers/tickee.cpp +++ b/src/mame/drivers/tickee.cpp @@ -220,7 +220,7 @@ TMS340X0_SCANLINE_RGB32_CB_MEMBER(tickee_state::scanline_update) { uint16_t *src = &m_vram[(params->rowaddr << 8) & 0x3ff00]; uint32_t *dest = &bitmap.pix32(scanline); - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); int coladdr = params->coladdr << 1; int x; @@ -245,7 +245,7 @@ TMS340X0_SCANLINE_RGB32_CB_MEMBER(tickee_state::rapidfir_scanline_update) { uint16_t *src = &m_vram[(params->rowaddr << 8) & 0x3ff00]; uint32_t *dest = &bitmap.pix32(scanline); - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); int coladdr = params->coladdr << 1; int x; diff --git a/src/mame/drivers/vcombat.cpp b/src/mame/drivers/vcombat.cpp index 36ef3f0edb9..6f05b5dbb55 100644 --- a/src/mame/drivers/vcombat.cpp +++ b/src/mame/drivers/vcombat.cpp @@ -149,7 +149,7 @@ public: uint32_t vcombat_state::update_screen(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int index) { int y; - const rgb_t *const pens = m_tlc34076->get_pens(); + const pen_t *const pens = m_tlc34076->pens(); uint16_t *m68k_buf = m_m68k_framebuffer[(*m_framebuffer_ctrl & 0x20) ? 1 : 0].get(); uint16_t *i860_buf = m_i860_framebuffer[index][0].get(); diff --git a/src/mame/drivers/xtheball.cpp b/src/mame/drivers/xtheball.cpp index 9f43326e1df..d6d64b5cbaf 100644 --- a/src/mame/drivers/xtheball.cpp +++ b/src/mame/drivers/xtheball.cpp @@ -77,7 +77,7 @@ TMS340X0_SCANLINE_RGB32_CB_MEMBER(xtheball_state::scanline_update) { uint16_t *srcbg = &m_vram_bg[(params->rowaddr << 8) & 0xff00]; uint32_t *dest = &bitmap.pix32(scanline); - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); int coladdr = params->coladdr; int x; diff --git a/src/mame/video/artmagic.cpp b/src/mame/video/artmagic.cpp index 2eed4acef1d..41752d82bf9 100644 --- a/src/mame/video/artmagic.cpp +++ b/src/mame/video/artmagic.cpp @@ -339,7 +339,7 @@ TMS340X0_SCANLINE_RGB32_CB_MEMBER(artmagic_state::scanline) offs_t offset = (params->rowaddr << 12) & 0x7ff000; uint16_t *vram = address_to_vram(&offset); uint32_t *dest = &bitmap.pix32(scanline); - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); int coladdr = params->coladdr << 1; int x; diff --git a/src/mame/video/btoads.cpp b/src/mame/video/btoads.cpp index d2bdf140454..8ffb026b1c1 100644 --- a/src/mame/video/btoads.cpp +++ b/src/mame/video/btoads.cpp @@ -327,7 +327,7 @@ TMS340X0_SCANLINE_RGB32_CB_MEMBER(btoads_state::scanline_update) uint16_t *bg1_base = &m_vram_bg1[(fulladdr + (m_yscroll1 << 10)) & 0x3fc00]; uint8_t *spr_base = &m_vram_fg_display[fulladdr & 0x3fc00]; uint32_t *dst = &bitmap.pix32(scanline); - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); int coladdr = fulladdr & 0x3ff; int x; diff --git a/src/mame/video/itech8.cpp b/src/mame/video/itech8.cpp index b81035968a0..35b7e347ae1 100644 --- a/src/mame/video/itech8.cpp +++ b/src/mame/video/itech8.cpp @@ -579,7 +579,7 @@ uint32_t itech8_state::screen_update_2layer(screen_device &screen, bitmap_rgb32 { uint32_t page_offset; int x, y; - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); /* first get the current display state */ m_tms34061->get_display_state(); @@ -662,7 +662,7 @@ uint32_t itech8_state::screen_update_2page(screen_device &screen, bitmap_rgb32 & { uint32_t page_offset; int x, y; - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); /* first get the current display state */ m_tms34061->get_display_state(); @@ -693,7 +693,7 @@ uint32_t itech8_state::screen_update_2page_large(screen_device &screen, bitmap_r { uint32_t page_offset; int x, y; - const rgb_t *pens = m_tlc34076->get_pens(); + const pen_t *pens = m_tlc34076->pens(); /* first get the current display state */ m_tms34061->get_display_state();