diff --git a/src/devices/video/ef9369.cpp b/src/devices/video/ef9369.cpp index 87a18b37cc3..d373fea132f 100644 --- a/src/devices/video/ef9369.cpp +++ b/src/devices/video/ef9369.cpp @@ -27,8 +27,6 @@ const device_type EF9369 = &device_creator; ef9369_device::ef9369_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, EF9369, "EF9369 Single Chip Color Palette", tag, owner, clock, "ef9369", __FILE__), - m_palette_tag(nullptr), - m_palette(nullptr), m_address(0) { std::fill(m_ca, m_ca + NUMCOLORS, 0); @@ -37,22 +35,15 @@ ef9369_device::ef9369_device(const machine_config &mconfig, const char *tag, dev std::fill(m_m, m_m + NUMCOLORS, 0); } -//------------------------------------------------- -// set_palette_tag - set the palette we should handle -//------------------------------------------------- - -void ef9369_device::set_palette_tag(device_t &device, device_t *owner, const char *tag) -{ - ef9369_device &dev = dynamic_cast(device); - dev.m_palette_tag = tag; -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void ef9369_device::device_start() { + // bind delegate + m_color_update_cb.bind_relative_to(*owner()); + // register for save states save_pointer(NAME(m_ca), NUMCOLORS); save_pointer(NAME(m_cb), NUMCOLORS); @@ -67,8 +58,6 @@ void ef9369_device::device_start() void ef9369_device::device_reset() { - m_palette = m_owner->subdevice(m_palette_tag); - m_address = 0; } @@ -91,7 +80,7 @@ WRITE8_MEMBER( ef9369_device::data_w ) if (m_address & 1) { - m_m[entry] = (data >> 4) & 0xf; + m_m[entry] = (data >> 4) & 0x1; m_cc[entry] = (data >> 0) & 0xf; } else @@ -101,7 +90,8 @@ WRITE8_MEMBER( ef9369_device::data_w ) } // update color - m_palette->set_pen_color(entry, pal4bit(m_ca[entry]), pal4bit(m_cb[entry]), pal4bit(m_cc[entry])); + if (!m_color_update_cb.isnull()) + m_color_update_cb(entry, m_m[entry], m_ca[entry], m_cb[entry], m_cc[entry]); // auto-increment m_address++; diff --git a/src/devices/video/ef9369.h b/src/devices/video/ef9369.h index 32e2ca0af19..d31c447dba4 100644 --- a/src/devices/video/ef9369.h +++ b/src/devices/video/ef9369.h @@ -36,15 +36,20 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_EF9369_ADD(_tag, _palette_tag) \ +#define MCFG_EF9369_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, EF9369, 0) \ - ef9369_device::set_palette_tag(*device, owner, _palette_tag); + +#define MCFG_EF9369_COLOR_UPDATE_CB(_class, _method) \ + ef9369_device::set_color_update_callback(*device, ef9369_color_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** +typedef device_delegate ef9369_color_update_delegate; +#define EF9369_COLOR_UPDATE(name) void name(int entry, bool m, uint8_t ca, uint8_t cb, uint8_t cc) + // ======================> ef9369_device class ef9369_device : public device_t @@ -53,8 +58,8 @@ public: // construction/destruction ef9369_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - // inline configuration - static void set_palette_tag(device_t &device, device_t *owner, const char *tag); + // configuration + static void set_color_update_callback(device_t &device, ef9369_color_update_delegate callback) { downcast(device).m_color_update_cb = callback; } DECLARE_READ8_MEMBER(data_r); DECLARE_WRITE8_MEMBER(data_w); @@ -68,9 +73,7 @@ protected: virtual void device_reset() override; private: - // configuration - const char *m_palette_tag; - palette_device *m_palette; + ef9369_color_update_delegate m_color_update_cb; // state uint8_t m_ca[NUMCOLORS], m_cb[NUMCOLORS], m_cc[NUMCOLORS]; // actually 4-bit diff --git a/src/mame/drivers/guab.cpp b/src/mame/drivers/guab.cpp index a750c179f90..11a2b936a44 100644 --- a/src/mame/drivers/guab.cpp +++ b/src/mame/drivers/guab.cpp @@ -67,6 +67,8 @@ public: m_floppy(*this, "fdc:0"), m_palette(*this, "palette") { } + + EF9369_COLOR_UPDATE(ef9369_color_update); DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt); DECLARE_WRITE16_MEMBER(guab_tms34061_w); DECLARE_READ16_MEMBER(guab_tms34061_r); @@ -108,6 +110,11 @@ WRITE_LINE_MEMBER(guab_state::ptm_irq) * *************************************/ +EF9369_COLOR_UPDATE( guab_state::ef9369_color_update ) +{ + m_palette->set_pen_color(entry, pal4bit(ca), pal4bit(cb), pal4bit(cc)); +} + /***************** * TMS34061 CRTC *****************/ @@ -436,7 +443,8 @@ static MACHINE_CONFIG_START( guab, guab_state ) MCFG_PALETTE_ADD("palette", ef9369_device::NUMCOLORS) - MCFG_EF9369_ADD("ef9369", "palette") + MCFG_EF9369_ADD("ef9369") + MCFG_EF9369_COLOR_UPDATE_CB(guab_state, ef9369_color_update) MCFG_DEVICE_ADD("tms34061", TMS34061, 0) MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */ diff --git a/src/mame/drivers/mpu4vid.cpp b/src/mame/drivers/mpu4vid.cpp index 1d69eb0ef83..a8a5db4f9e8 100644 --- a/src/mame/drivers/mpu4vid.cpp +++ b/src/mame/drivers/mpu4vid.cpp @@ -189,23 +189,15 @@ TODO: #include "machine/roc10937.h" #include "machine/meters.h" #include "video/scn2674.h" - +#include "video/ef9369.h" #include "cpu/m68000/m68000.h" #include "machine/6850acia.h" #include "sound/saa1099.h" -#include "machine/nvram.h" #include "crmaze2p.lh" #include "crmaze4p.lh" #include "includes/mpu4.h" -#include "cpu/m68000/m68000.h" -struct ef9369_t -{ - uint32_t addr; - uint16_t clut[16]; /* 13-bits - a marking bit and a 444 color */ -}; - struct bt471_t { uint8_t address; @@ -245,7 +237,6 @@ public: optional_ioport m_tracky_port; required_device m_gfxdecode; - struct ef9369_t m_pal; struct bt471_t m_bt471; //Video @@ -291,8 +282,7 @@ public: DECLARE_WRITE_LINE_MEMBER(update_mpu68_interrupts); DECLARE_READ16_MEMBER( mpu4_vid_vidram_r ); DECLARE_WRITE16_MEMBER( mpu4_vid_vidram_w ); - DECLARE_WRITE8_MEMBER( ef9369_w ); - DECLARE_READ8_MEMBER( ef9369_r ); + EF9369_COLOR_UPDATE(ef9369_color_update); DECLARE_WRITE8_MEMBER( bt471_w ); DECLARE_READ8_MEMBER( bt471_r ); DECLARE_WRITE8_MEMBER( vidcharacteriser_w ); @@ -444,76 +434,9 @@ VIDEO_START_MEMBER(mpu4vid_state,mpu4_vid) m_gfxdecode->set_gfx(m_gfx_index+0, std::make_unique(*m_palette, mpu4_vid_char_8x8_layout, reinterpret_cast(m_vid_vidram.target()), NATIVE_ENDIAN_VALUE_LE_BE(8,0), m_palette->entries() / 16, 0)); } - - - -/**************************** - * EF9369 color palette IC - * (16 colors from 4096) - ****************************/ - -/* Non-multiplexed mode */ - -WRITE8_MEMBER(mpu4vid_state::ef9369_w ) +EF9369_COLOR_UPDATE( mpu4vid_state::ef9369_color_update ) { - struct ef9369_t &pal = m_pal; - - /* Address register */ - if (offset & 1) - { - pal.addr = data & 0x1f; - } - /* Data register */ - else - { - uint32_t entry = pal.addr >> 1; - - if ((pal.addr & 1) == 0) - { - pal.clut[entry] &= ~0x00ff; - pal.clut[entry] |= data; - } - else - { - uint16_t col; - - pal.clut[entry] &= ~0x1f00; - pal.clut[entry] |= (data & 0x1f) << 8; - - /* Remove the marking bit */ - col = pal.clut[entry] & 0xfff; - - /* Update the MAME palette */ - m_palette->set_pen_color(entry, pal4bit(col >> 8), pal4bit(col >> 4), pal4bit(col >> 0)); - } - - /* Address register auto-increment */ - if (++pal.addr == 32) - pal.addr = 0; - } -} - - -READ8_MEMBER(mpu4vid_state::ef9369_r ) -{ - struct ef9369_t &pal = m_pal; - if ((offset & 1) == 0) - { - uint16_t col = pal.clut[pal.addr >> 1]; - -/* if ((pal.addr & 1) == 0) - return col & 0xff; - else - return col >> 8; - */ - - return col; - } - else - { - /* Address register is write only */ - return 0xff; - } + m_palette->set_pen_color(entry, pal4bit(cc), pal4bit(cb), pal4bit(ca)); } /****************************************** @@ -1246,12 +1169,10 @@ static ADDRESS_MAP_START( mpu4_68k_map, AS_PROGRAM, 16, mpu4vid_state ) // AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */ AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff) AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff) - AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff) + AM_RANGE(0xa00000, 0xa00001) AM_DEVREADWRITE8("ef9369", ef9369_device, data_r, data_w, 0x00ff) + AM_RANGE(0xa00002, 0xa00003) AM_DEVWRITE8("ef9369", ef9369_device, address_w, 0x00ff) /* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */ - - AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE8("scn2674_vid", scn2674_device, read, write,0x00ff) - AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0x00ff) AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0x00ff) @@ -1266,10 +1187,9 @@ static ADDRESS_MAP_START( mpu4oki_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("vid_mainram") AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff) AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff) - AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff) - + AM_RANGE(0xa00000, 0xa00001) AM_DEVREADWRITE8("ef9369", ef9369_device, data_r, data_w, 0x00ff) + AM_RANGE(0xa00002, 0xa00003) AM_DEVWRITE8("ef9369", ef9369_device, address_w, 0x00ff) AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE8("scn2674_vid", scn2674_device, read, write,0x00ff) - AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0x00ff) AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0x00ff) @@ -1281,17 +1201,16 @@ static ADDRESS_MAP_START( mpu4oki_68k_map, AS_PROGRAM, 16, mpu4vid_state ) // AM_RANGE(0xfff000, 0xffffff) AM_NOP /* Possible bug, reads and writes here */ ADDRESS_MAP_END - static ADDRESS_MAP_START( bwbvid_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0x000000, 0x7fffff) AM_ROM AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("vid_mainram") AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */ AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff) AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff) - AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff) + AM_RANGE(0xa00000, 0xa00001) AM_DEVREADWRITE8("ef9369", ef9369_device, data_r, data_w, 0x00ff) + AM_RANGE(0xa00002, 0xa00003) AM_DEVWRITE8("ef9369", ef9369_device, address_w, 0x00ff) // AM_RANGE(0xa00000, 0xa0000f) AM_READWRITE(bt471_r,bt471_w) //Some games use this /* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */ - AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE8("scn2674_vid", scn2674_device, read, write,0x00ff) AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0x00ff) @@ -1306,10 +1225,10 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */ AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff) AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff) - AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff) + AM_RANGE(0xa00000, 0xa00001) AM_DEVREADWRITE8("ef9369", ef9369_device, data_r, data_w, 0x00ff) + AM_RANGE(0xa00002, 0xa00003) AM_DEVWRITE8("ef9369", ef9369_device, address_w, 0x00ff) //AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(bt471_r,bt471_w,0x00ff) Some games use this /* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */ - AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE8("scn2674_vid", scn2674_device, read, write,0x00ff) AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0x00ff) @@ -1321,8 +1240,6 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0xe04000, 0xe0400f) AM_READWRITE8(bwb_characteriser_r, bwb_characteriser_w, 0x00ff)//AM_READWRITE(adpcm_r, adpcm_w) CHR ? ADDRESS_MAP_END - - /* TODO: Fix up MPU4 map*/ static ADDRESS_MAP_START( mpu4_6809_map, AS_PROGRAM, 8, mpu4_state ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("nvram") @@ -1343,7 +1260,6 @@ ADDRESS_MAP_END - static MACHINE_CONFIG_START( mpu4_vid, mpu4vid_state ) MCFG_CPU_ADD("maincpu", M6809, MPU4_MASTER_CLOCK/4 ) MCFG_CPU_PROGRAM_MAP(mpu4_6809_map) @@ -1378,7 +1294,10 @@ static MACHINE_CONFIG_START( mpu4_vid, mpu4vid_state ) MCFG_MACHINE_RESET_OVERRIDE(mpu4vid_state,mpu4_vid) MCFG_VIDEO_START_OVERRIDE (mpu4vid_state,mpu4_vid) - MCFG_PALETTE_ADD("palette", 16) + MCFG_PALETTE_ADD("palette", ef9369_device::NUMCOLORS) + + MCFG_EF9369_ADD("ef9369") + MCFG_EF9369_COLOR_UPDATE_CB(mpu4vid_state, ef9369_color_update) MCFG_DEVICE_ADD("6840ptm_68k", PTM6840, 0) MCFG_PTM6840_INTERNAL_CLOCK(VIDEO_MASTER_CLOCK / 10) /* 68k E clock */