Update mpu4vid to use ef9369 device

This commit is contained in:
Dirk Best 2016-11-30 21:49:17 +01:00
parent db0f9a2e80
commit 8fc52f35f6
4 changed files with 41 additions and 121 deletions

View File

@ -27,8 +27,6 @@ const device_type EF9369 = &device_creator<ef9369_device>;
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<ef9369_device &>(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<palette_device>(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++;

View File

@ -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<void (int entry, bool m, uint8_t ca, uint8_t cb, uint8_t cc)> 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<ef9369_device &>(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

View File

@ -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 */

View File

@ -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<gfxdecode_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<gfx_element>(*m_palette, mpu4_vid_char_8x8_layout, reinterpret_cast<uint8_t *>(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 */