diff options
Diffstat (limited to 'src/emu/machine')
143 files changed, 2481 insertions, 5534 deletions
diff --git a/src/emu/machine/6522via.c b/src/emu/machine/6522via.c index fd40ae03caf..c753fb1e551 100644 --- a/src/emu/machine/6522via.c +++ b/src/emu/machine/6522via.c @@ -105,44 +105,6 @@ -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(via6522, "6522 VIA") - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void via6522_device_config::device_config_complete() -{ - // inherit a copy of the static data - const via6522_interface *intf = reinterpret_cast<const via6522_interface *>(static_config()); - if (intf != NULL) - *static_cast<via6522_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_in_a_func, 0, sizeof(m_in_a_func)); - memset(&m_in_b_func, 0, sizeof(m_in_b_func)); - memset(&m_in_ca1_func, 0, sizeof(m_in_ca1_func)); - memset(&m_in_cb1_func, 0, sizeof(m_in_cb1_func)); - memset(&m_in_ca2_func, 0, sizeof(m_in_ca2_func)); - memset(&m_in_cb2_func, 0, sizeof(m_in_cb2_func)); - memset(&m_out_a_func, 0, sizeof(m_out_a_func)); - memset(&m_out_b_func, 0, sizeof(m_out_b_func)); - memset(&m_out_ca2_func, 0, sizeof(m_out_ca2_func)); - memset(&m_out_cb2_func, 0, sizeof(m_out_cb2_func)); - memset(&m_irq_func, 0, sizeof(m_irq_func)); - } -} - - - /*************************************************************************** INLINE FUNCTIONS ***************************************************************************/ @@ -180,38 +142,70 @@ UINT16 via6522_device::get_counter1_value() // LIVE DEVICE //************************************************************************** -const device_type VIA6522 = via6522_device_config::static_alloc_device_config; +// device type definition +const device_type VIA6522 = &device_creator<via6522_device>; //------------------------------------------------- // via6522_device - constructor //------------------------------------------------- -via6522_device::via6522_device(running_machine &_machine, const via6522_device_config &config) - : device_t(_machine, config), - m_config(config) +via6522_device::via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, VIA6522, "6522 VIA", tag, owner, clock) +{ + +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void via6522_device::device_config_complete() { + // inherit a copy of the static data + const via6522_interface *intf = reinterpret_cast<const via6522_interface *>(static_config()); + if (intf != NULL) + *static_cast<via6522_interface *>(this) = *intf; + // or initialize to defaults if none provided + else + { + memset(&m_in_a_cb, 0, sizeof(m_in_a_cb)); + memset(&m_in_b_cb, 0, sizeof(m_in_b_cb)); + memset(&m_in_ca1_cb, 0, sizeof(m_in_ca1_cb)); + memset(&m_in_cb1_cb, 0, sizeof(m_in_cb1_cb)); + memset(&m_in_ca2_cb, 0, sizeof(m_in_ca2_cb)); + memset(&m_in_cb2_cb, 0, sizeof(m_in_cb2_cb)); + memset(&m_out_a_cb, 0, sizeof(m_out_a_cb)); + memset(&m_out_b_cb, 0, sizeof(m_out_b_cb)); + memset(&m_out_ca2_cb, 0, sizeof(m_out_ca2_cb)); + memset(&m_out_cb2_cb, 0, sizeof(m_out_cb2_cb)); + memset(&m_irq_cb, 0, sizeof(m_irq_cb)); + } } + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void via6522_device::device_start() { - devcb_resolve_read8(&m_in_a_func, &m_config.m_in_a_func, this); - devcb_resolve_read8(&m_in_b_func, &m_config.m_in_b_func, this); - devcb_resolve_read_line(&m_in_ca1_func, &m_config.m_in_ca1_func, this); - devcb_resolve_read_line(&m_in_cb1_func, &m_config.m_in_cb1_func, this); - devcb_resolve_read_line(&m_in_ca2_func, &m_config.m_in_ca2_func, this); - devcb_resolve_read_line(&m_in_cb2_func, &m_config.m_in_cb2_func, this); - devcb_resolve_write8(&m_out_a_func, &m_config.m_out_a_func, this); - devcb_resolve_write8(&m_out_b_func, &m_config.m_out_b_func, this); - devcb_resolve_write_line(&m_out_ca1_func, &m_config.m_out_ca1_func, this); - devcb_resolve_write_line(&m_out_cb1_func, &m_config.m_out_cb1_func, this); - devcb_resolve_write_line(&m_out_ca2_func, &m_config.m_out_ca2_func, this); - devcb_resolve_write_line(&m_out_cb2_func, &m_config.m_out_cb2_func, this); - devcb_resolve_write_line(&m_irq_func, &m_config.m_irq_func, this); + devcb_resolve_read8(&m_in_a_func, &m_in_a_cb, this); + devcb_resolve_read8(&m_in_b_func, &m_in_b_cb, this); + devcb_resolve_read_line(&m_in_ca1_func, &m_in_ca1_cb, this); + devcb_resolve_read_line(&m_in_cb1_func, &m_in_cb1_cb, this); + devcb_resolve_read_line(&m_in_ca2_func, &m_in_ca2_cb, this); + devcb_resolve_read_line(&m_in_cb2_func, &m_in_cb2_cb, this); + devcb_resolve_write8(&m_out_a_func, &m_out_a_cb, this); + devcb_resolve_write8(&m_out_b_func, &m_out_b_cb, this); + devcb_resolve_write_line(&m_out_ca1_func, &m_out_ca1_cb, this); + devcb_resolve_write_line(&m_out_cb1_func, &m_out_cb1_cb, this); + devcb_resolve_write_line(&m_out_ca2_func, &m_out_ca2_cb, this); + devcb_resolve_write_line(&m_out_cb2_func, &m_out_cb2_cb, this); + devcb_resolve_write_line(&m_irq_func, &m_irq_cb, this); m_t1ll = 0xf3; /* via at 0x9110 in vic20 show these values */ m_t1lh = 0xb5; /* ports are not written by kernel! */ diff --git a/src/emu/machine/6522via.h b/src/emu/machine/6522via.h index deb02af94f1..ba3373a133e 100644 --- a/src/emu/machine/6522via.h +++ b/src/emu/machine/6522via.h @@ -61,54 +61,33 @@ struct via6522_interface { - devcb_read8 m_in_a_func; - devcb_read8 m_in_b_func; - devcb_read_line m_in_ca1_func; - devcb_read_line m_in_cb1_func; - devcb_read_line m_in_ca2_func; - devcb_read_line m_in_cb2_func; - devcb_write8 m_out_a_func; - devcb_write8 m_out_b_func; - devcb_write_line m_out_ca1_func; - devcb_write_line m_out_cb1_func; - devcb_write_line m_out_ca2_func; - devcb_write_line m_out_cb2_func; - devcb_write_line m_irq_func; -}; - - -// ======================> via6522_device_config - -class via6522_device_config : public device_config, - public via6522_interface -{ - friend class via6522_device; - - // construction/destruction - via6522_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_a_cb; + devcb_read8 m_in_b_cb; + devcb_read_line m_in_ca1_cb; + devcb_read_line m_in_cb1_cb; + devcb_read_line m_in_ca2_cb; + devcb_read_line m_in_cb2_cb; + devcb_write8 m_out_a_cb; + devcb_write8 m_out_b_cb; + devcb_write_line m_out_ca1_cb; + devcb_write_line m_out_cb1_cb; + devcb_write_line m_out_ca2_cb; + devcb_write_line m_out_cb2_cb; + devcb_write_line m_irq_cb; }; // ======================> via6522_device -class via6522_device : public device_t +class via6522_device : public device_t, + public via6522_interface { - friend class via6522_device_config; friend class dart_channel; +public: // construction/destruction - via6522_device(running_machine &_machine, const via6522_device_config &_config); + via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -131,6 +110,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -200,8 +180,6 @@ private: emu_timer *m_shift_timer; UINT8 m_shift_counter; - - const via6522_device_config &m_config; }; diff --git a/src/emu/machine/6526cia.c b/src/emu/machine/6526cia.c index e8c6796e03f..3b0066d5f53 100644 --- a/src/emu/machine/6526cia.c +++ b/src/emu/machine/6526cia.c @@ -45,86 +45,34 @@ // DEVICE CONFIGURATION //************************************************************************** -//------------------------------------------------- -// mos6526_device_config - constructor -//------------------------------------------------- - -mos6526_device_config::mos6526_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "MOS6526", tag, owner, clock) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *mos6526_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(mos6526_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *mos6526_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, mos6526_device(machine, *this)); -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void mos6526_device_config::device_config_complete() -{ - // inherit a copy of the static data - const mos6526_interface *intf = reinterpret_cast<const mos6526_interface *>(static_config()); - if (intf != NULL) - *static_cast<mos6526_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - m_tod_clock = 0; - memset(&m_out_irq_func, 0, sizeof(m_out_irq_func)); - memset(&m_out_pc_func, 0, sizeof(m_out_pc_func)); - memset(&m_out_cnt_func, 0, sizeof(m_out_cnt_func)); - memset(&m_out_sp_func, 0, sizeof(m_out_sp_func)); - memset(&m_in_pa_func, 0, sizeof(m_in_pa_func)); - memset(&m_out_pa_func, 0, sizeof(m_out_pa_func)); - memset(&m_in_pb_func, 0, sizeof(m_in_pb_func)); - memset(&m_out_pb_func, 0, sizeof(m_out_pb_func)); - } -} - - //************************************************************************** // LIVE DEVICE //************************************************************************** -const device_type MOS6526R1 = mos6526_device_config::static_alloc_device_config; -const device_type MOS6526R2 = mos6526_device_config::static_alloc_device_config; -const device_type MOS8520 = mos6526_device_config::static_alloc_device_config; +// device type definition +const device_type MOS6526R1 = &device_creator<mos6526r1_device>; +const device_type MOS6526R2 = &device_creator<mos6526r2_device>; +const device_type MOS8520 = &device_creator<mos8520_device>; //------------------------------------------------- // mos6526_device - constructor //------------------------------------------------- -mos6526_device::mos6526_device(running_machine &_machine, const mos6526_device_config &config) - : device_t(_machine, config), - m_config(config) +mos6526_device::mos6526_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, tag, owner, clock) { - } +mos6526r1_device::mos6526r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : mos6526_device(mconfig, MOS6526R1, "MOS6526r1", tag, owner, clock) { } + +mos6526r2_device::mos6526r2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : mos6526_device(mconfig, MOS6526R2, "MOS6526r2", tag, owner, clock) { } + +mos8520_device::mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : mos6526_device(mconfig, MOS8520, "MOS8520", tag, owner, clock) { } + //------------------------------------------------- // device_reset - device-specific reset @@ -173,23 +121,52 @@ void mos6526_device::device_reset() //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void mos6526_device::device_config_complete() +{ + // inherit a copy of the static data + const mos6526_interface *intf = reinterpret_cast<const mos6526_interface *>(static_config()); + if (intf != NULL) + *static_cast<mos6526_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + m_tod_clock = 0; + memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); + memset(&m_out_pc_cb, 0, sizeof(m_out_pc_cb)); + memset(&m_out_cnt_cb, 0, sizeof(m_out_cnt_cb)); + memset(&m_out_sp_cb, 0, sizeof(m_out_sp_cb)); + memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb)); + memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb)); + memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb)); + memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void mos6526_device::device_start() { /* clear out CIA structure, and copy the interface */ - devcb_resolve_write_line(&m_out_irq_func, &m_config.m_out_irq_func, this); - devcb_resolve_write_line(&m_out_pc_func, &m_config.m_out_pc_func, this); - devcb_resolve_write_line(&m_out_cnt_func, &m_config.m_out_cnt_func, this); - devcb_resolve_write_line(&m_out_sp_func, &m_config.m_out_sp_func, this); + devcb_resolve_write_line(&m_out_irq_func, &m_out_irq_cb, this); + devcb_resolve_write_line(&m_out_pc_func, &m_out_pc_cb, this); + devcb_resolve_write_line(&m_out_cnt_func, &m_out_cnt_cb, this); + devcb_resolve_write_line(&m_out_sp_func, &m_out_sp_cb, this); m_flag = 1; /* setup ports */ - devcb_resolve_read8(&m_port[0].m_read, &m_config.m_in_pa_func, this); - devcb_resolve_write8(&m_port[0].m_write, &m_config.m_out_pa_func, this); - devcb_resolve_read8(&m_port[1].m_read, &m_config.m_in_pb_func, this); - devcb_resolve_write8(&m_port[1].m_write, &m_config.m_out_pb_func, this); + devcb_resolve_read8(&m_port[0].m_read, &m_in_pa_cb, this); + devcb_resolve_write8(&m_port[0].m_write, &m_out_pa_cb, this); + devcb_resolve_read8(&m_port[1].m_read, &m_in_pb_cb, this); + devcb_resolve_write8(&m_port[1].m_write, &m_out_pb_cb, this); for (int p = 0; p < (sizeof(m_port) / sizeof(m_port[0])); p++) { @@ -206,9 +183,9 @@ void mos6526_device::device_start() } /* setup TOD timer, if appropriate */ - if (m_config.m_tod_clock != 0) + if (m_tod_clock != 0) { - machine().scheduler().timer_pulse(attotime::from_hz(m_config.m_tod_clock), FUNC(clock_tod_callback), 0, (void *)this); + machine().scheduler().timer_pulse(attotime::from_hz(m_tod_clock), FUNC(clock_tod_callback), 0, (void *)this); } /* state save support */ diff --git a/src/emu/machine/6526cia.h b/src/emu/machine/6526cia.h index 970d9ab91c1..ab17474524c 100644 --- a/src/emu/machine/6526cia.h +++ b/src/emu/machine/6526cia.h @@ -39,7 +39,7 @@ - //************************************************************************** +//************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** @@ -72,51 +72,30 @@ struct mos6526_interface { int m_tod_clock; - devcb_write_line m_out_irq_func; - devcb_write_line m_out_pc_func; - devcb_write_line m_out_cnt_func; - devcb_write_line m_out_sp_func; - - devcb_read8 m_in_pa_func; - devcb_write8 m_out_pa_func; - - devcb_read8 m_in_pb_func; - devcb_write8 m_out_pb_func; -}; - - - -// ======================> mos6526_device_config + devcb_write_line m_out_irq_cb; + devcb_write_line m_out_pc_cb; + devcb_write_line m_out_cnt_cb; + devcb_write_line m_out_sp_cb; -class mos6526_device_config : public device_config, - public mos6526_interface -{ - friend class mos6526_device; - - // construction/destruction - mos6526_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); + devcb_read8 m_in_pa_cb; + devcb_write8 m_out_pa_cb; -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_pb_cb; + devcb_write8 m_out_pb_cb; }; // ======================> mos6526_device -class mos6526_device : public device_t +class mos6526_device : public device_t, + public mos6526_interface { - friend class mos6526_device_config; friend class dart_channel; +protected: // construction/destruction - mos6526_device(running_machine &_machine, const mos6526_device_config &_config); + mos6526_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); public: UINT8 reg_r(UINT8 offset); @@ -148,6 +127,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -221,8 +201,24 @@ private: UINT8 m_cnt; UINT8 m_shift; UINT8 m_serial; +}; + +class mos6526r1_device : public mos6526_device +{ +public: + mos6526r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; - const mos6526_device_config &m_config; +class mos6526r2_device : public mos6526_device +{ +public: + mos6526r2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class mos8520_device : public mos6526_device +{ +public: + mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); }; diff --git a/src/emu/machine/6532riot.c b/src/emu/machine/6532riot.c index 521516e2a7c..a5e239599cd 100644 --- a/src/emu/machine/6532riot.c +++ b/src/emu/machine/6532riot.c @@ -16,17 +16,12 @@ The timer seems to follow these rules: //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type RIOT6532 = riot6532_device_config::static_alloc_device_config; - - - -//************************************************************************** // CONSTANTS //************************************************************************** +// device type definition +const device_type RIOT6532 = &device_creator<riot6532_device>; + enum { TIMER_IDLE, @@ -39,68 +34,6 @@ enum -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// riot6532_device_config - constructor -//------------------------------------------------- - -riot6532_device_config::riot6532_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "6532 (RIOT)", tag, owner, clock) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *riot6532_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(riot6532_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *riot6532_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, riot6532_device(machine, *this)); -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void riot6532_device_config::device_config_complete() -{ - // inherit a copy of the static data - const riot6532_interface *intf = reinterpret_cast<const riot6532_interface *>(static_config()); - if (intf != NULL) - { - *static_cast<riot6532_interface *>(this) = *intf; - } - - // or initialize to defaults if none provided - else - { - memset(&m_in_a_func, 0, sizeof(m_in_a_func)); - memset(&m_in_b_func, 0, sizeof(m_in_b_func)); - memset(&m_out_a_func, 0, sizeof(m_out_a_func)); - memset(&m_out_b_func, 0, sizeof(m_out_b_func)); - memset(&m_irq_func, 0, sizeof(m_irq_func)); - } -} - - /*************************************************************************** INTERNAL FUNCTIONS @@ -506,12 +439,39 @@ UINT8 riot6532_device::portb_out_get() // riot6532_device - constructor //------------------------------------------------- -riot6532_device::riot6532_device(running_machine &_machine, const riot6532_device_config &config) - : device_t(_machine, config), - m_config(config) +riot6532_device::riot6532_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, RIOT6532, "6532 (RIOT)", tag, owner, clock) { } + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void riot6532_device::device_config_complete() +{ + // inherit a copy of the static data + const riot6532_interface *intf = reinterpret_cast<const riot6532_interface *>(static_config()); + if (intf != NULL) + { + *static_cast<riot6532_interface *>(this) = *intf; + } + + // or initialize to defaults if none provided + else + { + memset(&m_in_a_cb, 0, sizeof(m_in_a_cb)); + memset(&m_in_b_cb, 0, sizeof(m_in_b_cb)); + memset(&m_out_a_cb, 0, sizeof(m_out_a_cb)); + memset(&m_out_b_cb, 0, sizeof(m_out_b_cb)); + memset(&m_irq_cb, 0, sizeof(m_irq_cb)); + } +} + + /*------------------------------------------------- device_start - device-specific startup -------------------------------------------------*/ @@ -522,16 +482,16 @@ void riot6532_device::device_start() assert(this != NULL); /* set static values */ - m_index = machine().m_devicelist.indexof(RIOT6532, tag()); + m_index = machine().devicelist().indexof(RIOT6532, tag()); /* configure the ports */ - devcb_resolve_read8(&m_port[0].m_in_func, &m_config.m_in_a_func, this); - devcb_resolve_write8(&m_port[0].m_out_func, &m_config.m_out_a_func, this); - devcb_resolve_read8(&m_port[1].m_in_func, &m_config.m_in_b_func, this); - devcb_resolve_write8(&m_port[1].m_out_func, &m_config.m_out_b_func, this); + devcb_resolve_read8(&m_port[0].m_in_func, &m_in_a_cb, this); + devcb_resolve_write8(&m_port[0].m_out_func, &m_out_a_cb, this); + devcb_resolve_read8(&m_port[1].m_in_func, &m_in_b_cb, this); + devcb_resolve_write8(&m_port[1].m_out_func, &m_out_b_cb, this); /* resolve irq func */ - devcb_resolve_write_line(&m_irq_func, &m_config.m_irq_func, this); + devcb_resolve_write_line(&m_irq_func, &m_irq_cb, this); /* allocate timers */ m_timer = machine().scheduler().timer_alloc(FUNC(timer_end_callback), (void *)this); diff --git a/src/emu/machine/6532riot.h b/src/emu/machine/6532riot.h index adbdb9c1670..50ed7a39d44 100644 --- a/src/emu/machine/6532riot.h +++ b/src/emu/machine/6532riot.h @@ -32,47 +32,24 @@ struct riot6532_interface { - devcb_read8 m_in_a_func; - devcb_read8 m_in_b_func; - devcb_write8 m_out_a_func; - devcb_write8 m_out_b_func; - devcb_write_line m_irq_func; -}; - - - -// ======================> riot6532_device_config - -class riot6532_device_config : public device_config, - public riot6532_interface -{ - friend class riot6532_device; - - // construction/destruction - riot6532_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_a_cb; + devcb_read8 m_in_b_cb; + devcb_write8 m_out_a_cb; + devcb_write8 m_out_b_cb; + devcb_write_line m_irq_cb; }; // ======================> riot6532_device -class riot6532_device : public device_t +class riot6532_device : public device_t, + public riot6532_interface { - friend class riot6532_device_config; - +public: // construction/destruction - riot6532_device(running_machine &_machine, const riot6532_device_config &_config); + riot6532_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: UINT8 reg_r(UINT8 offset); void reg_w(UINT8 offset, UINT8 data); @@ -99,6 +76,7 @@ protected: }; // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -127,8 +105,6 @@ private: UINT8 m_timershift; UINT8 m_timerstate; emu_timer * m_timer; - - const riot6532_device_config &m_config; }; diff --git a/src/emu/machine/6821pia.c b/src/emu/machine/6821pia.c index 94181f76459..b03b28ddddc 100644 --- a/src/emu/machine/6821pia.c +++ b/src/emu/machine/6821pia.c @@ -36,37 +36,21 @@ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// pia6821_device_config - constructor -//------------------------------------------------- - -pia6821_device_config::pia6821_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "6822 PIA", tag, owner, clock) -{ -} +// device type definition +const device_type PIA6821 = &device_creator<pia6821_device>; //------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object +// pia6821_device - constructor //------------------------------------------------- -device_config *pia6821_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) +pia6821_device::pia6821_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PIA6821, "6822 PIA", tag, owner, clock) { - return global_alloc(pia6821_device_config(mconfig, tag, owner, clock)); -} - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *pia6821_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, pia6821_device(machine, *this)); } @@ -76,7 +60,7 @@ device_t *pia6821_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void pia6821_device_config::device_config_complete() +void pia6821_device::device_config_complete() { // inherit a copy of the static data const pia6821_interface *intf = reinterpret_cast<const pia6821_interface *>(static_config()); @@ -88,40 +72,22 @@ void pia6821_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_in_a_func, 0, sizeof(m_in_a_func)); - memset(&m_in_b_func, 0, sizeof(m_in_b_func)); - memset(&m_in_ca1_func, 0, sizeof(m_in_ca1_func)); - memset(&m_in_cb1_func, 0, sizeof(m_in_cb1_func)); - memset(&m_in_ca2_func, 0, sizeof(m_in_ca2_func)); - memset(&m_in_cb2_func, 0, sizeof(m_in_cb2_func)); - memset(&m_out_a_func, 0, sizeof(m_out_a_func)); - memset(&m_out_b_func, 0, sizeof(m_out_b_func)); - memset(&m_out_ca2_func, 0, sizeof(m_out_ca2_func)); - memset(&m_out_cb2_func, 0, sizeof(m_out_cb2_func)); - memset(&m_irq_a_func, 0, sizeof(m_irq_a_func)); - memset(&m_irq_b_func, 0, sizeof(m_irq_b_func)); + memset(&m_in_a_cb, 0, sizeof(m_in_a_cb)); + memset(&m_in_b_cb, 0, sizeof(m_in_b_cb)); + memset(&m_in_ca1_cb, 0, sizeof(m_in_ca1_cb)); + memset(&m_in_cb1_cb, 0, sizeof(m_in_cb1_cb)); + memset(&m_in_ca2_cb, 0, sizeof(m_in_ca2_cb)); + memset(&m_in_cb2_cb, 0, sizeof(m_in_cb2_cb)); + memset(&m_out_a_cb, 0, sizeof(m_out_a_cb)); + memset(&m_out_b_cb, 0, sizeof(m_out_b_cb)); + memset(&m_out_ca2_cb, 0, sizeof(m_out_ca2_cb)); + memset(&m_out_cb2_cb, 0, sizeof(m_out_cb2_cb)); + memset(&m_irq_a_cb, 0, sizeof(m_irq_a_cb)); + memset(&m_irq_b_cb, 0, sizeof(m_irq_b_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type PIA6821 = pia6821_device_config::static_alloc_device_config; - -//------------------------------------------------- -// pia6821_device - constructor -//------------------------------------------------- - -pia6821_device::pia6821_device(running_machine &_machine, const pia6821_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -129,18 +95,18 @@ pia6821_device::pia6821_device(running_machine &_machine, const pia6821_device_c void pia6821_device::device_start() { /* resolve callbacks */ - devcb_resolve_read8(&m_in_a_func, &m_config.m_in_a_func, this); - devcb_resolve_read8(&m_in_b_func, &m_config.m_in_b_func, this); - devcb_resolve_read_line(&m_in_ca1_func, &m_config.m_in_ca1_func, this); - devcb_resolve_read_line(&m_in_cb1_func, &m_config.m_in_cb1_func, this); - devcb_resolve_read_line(&m_in_ca2_func, &m_config.m_in_ca2_func, this); - devcb_resolve_read_line(&m_in_cb2_func, &m_config.m_in_cb2_func, this); - devcb_resolve_write8(&m_out_a_func, &m_config.m_out_a_func, this); - devcb_resolve_write8(&m_out_b_func, &m_config.m_out_b_func, this); - devcb_resolve_write_line(&m_out_ca2_func, &m_config.m_out_ca2_func, this); - devcb_resolve_write_line(&m_out_cb2_func, &m_config.m_out_cb2_func, this); - devcb_resolve_write_line(&m_irq_a_func, &m_config.m_irq_a_func, this); - devcb_resolve_write_line(&m_irq_b_func, &m_config.m_irq_b_func, this); + devcb_resolve_read8(&m_in_a_func, &m_in_a_cb, this); + devcb_resolve_read8(&m_in_b_func, &m_in_b_cb, this); + devcb_resolve_read_line(&m_in_ca1_func, &m_in_ca1_cb, this); + devcb_resolve_read_line(&m_in_cb1_func, &m_in_cb1_cb, this); + devcb_resolve_read_line(&m_in_ca2_func, &m_in_ca2_cb, this); + devcb_resolve_read_line(&m_in_cb2_func, &m_in_cb2_cb, this); + devcb_resolve_write8(&m_out_a_func, &m_out_a_cb, this); + devcb_resolve_write8(&m_out_b_func, &m_out_b_cb, this); + devcb_resolve_write_line(&m_out_ca2_func, &m_out_ca2_cb, this); + devcb_resolve_write_line(&m_out_cb2_func, &m_out_cb2_cb, this); + devcb_resolve_write_line(&m_irq_a_func, &m_irq_a_cb, this); + devcb_resolve_write_line(&m_irq_b_func, &m_irq_b_cb, this); save_item(NAME(m_in_a)); save_item(NAME(m_in_ca1)); diff --git a/src/emu/machine/6821pia.h b/src/emu/machine/6821pia.h index 394ba5aec1c..3b86bac895e 100644 --- a/src/emu/machine/6821pia.h +++ b/src/emu/machine/6821pia.h @@ -57,54 +57,30 @@ struct pia6821_interface { - devcb_read8 m_in_a_func; - devcb_read8 m_in_b_func; - devcb_read_line m_in_ca1_func; - devcb_read_line m_in_cb1_func; - devcb_read_line m_in_ca2_func; - devcb_read_line m_in_cb2_func; - devcb_write8 m_out_a_func; - devcb_write8 m_out_b_func; - devcb_write_line m_out_ca2_func; - devcb_write_line m_out_cb2_func; - devcb_write_line m_irq_a_func; - devcb_write_line m_irq_b_func; -}; - - - -// ======================> pia6821_device_config - -class pia6821_device_config : public device_config, - public pia6821_interface -{ - friend class pia6821_device; - - // construction/destruction - pia6821_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_a_cb; + devcb_read8 m_in_b_cb; + devcb_read_line m_in_ca1_cb; + devcb_read_line m_in_cb1_cb; + devcb_read_line m_in_ca2_cb; + devcb_read_line m_in_cb2_cb; + devcb_write8 m_out_a_cb; + devcb_write8 m_out_b_cb; + devcb_write_line m_out_ca2_cb; + devcb_write_line m_out_cb2_cb; + devcb_write_line m_irq_a_cb; + devcb_write_line m_irq_b_cb; }; // ======================> pia6821_device -class pia6821_device : public device_t +class pia6821_device : public device_t, + public pia6821_interface { - friend class pia6821_device_config; - - // construction/destruction - pia6821_device(running_machine &_machine, const pia6821_device_config &_config); - public: + // construction/destruction + pia6821_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); UINT8 reg_r(UINT8 offset); void reg_w(UINT8 offset, UINT8 data); @@ -145,6 +121,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -238,8 +215,6 @@ private: UINT8 m_logged_ca2_not_connected; UINT8 m_logged_cb1_not_connected; UINT8 m_logged_cb2_not_connected; - - const pia6821_device_config &m_config; }; diff --git a/src/emu/machine/6840ptm.c b/src/emu/machine/6840ptm.c index 26b0f52a501..41547ca1e13 100644 --- a/src/emu/machine/6840ptm.c +++ b/src/emu/machine/6840ptm.c @@ -61,9 +61,18 @@ const char *const ptm6840_device::opmode[] = IMPLEMENTATION ***************************************************************************/ -GENERIC_DEVICE_CONFIG_SETUP(ptm6840, "6840 PTM") +// device type definition +const device_type PTM6840 = &device_creator<ptm6840_device>; + +//------------------------------------------------- +// ptm6840_device - constructor +//------------------------------------------------- + +ptm6840_device::ptm6840_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PTM6840, "6840 PTM", tag, owner, clock) +{ +} -const device_type PTM6840 = ptm6840_device_config::static_alloc_device_config; //------------------------------------------------- // device_config_complete - perform any @@ -71,7 +80,7 @@ const device_type PTM6840 = ptm6840_device_config::static_alloc_device_config; // complete //------------------------------------------------- -void ptm6840_device_config::device_config_complete() +void ptm6840_device::device_config_complete() { // inherit a copy of the static data const ptm6840_interface *intf = reinterpret_cast<const ptm6840_interface *>(static_config()); @@ -87,43 +96,32 @@ void ptm6840_device_config::device_config_complete() m_external_clock[0] = 0.0; m_external_clock[1] = 0.0; m_external_clock[2] = 0.0; - memset(&m_irq_func, 0, sizeof(m_irq_func)); - memset(&m_out_func[0], 0, sizeof(m_out_func[0])); - memset(&m_out_func[1], 0, sizeof(m_out_func[1])); - memset(&m_out_func[2], 0, sizeof(m_out_func[2])); + memset(&m_irq_cb, 0, sizeof(m_irq_cb)); + memset(&m_out_cb[0], 0, sizeof(m_out_cb[0])); + memset(&m_out_cb[1], 0, sizeof(m_out_cb[1])); + memset(&m_out_cb[2], 0, sizeof(m_out_cb[2])); } } //------------------------------------------------- -// ptm6840_device - constructor -//------------------------------------------------- - -ptm6840_device::ptm6840_device(running_machine &_machine, const ptm6840_device_config &config) - : device_t(_machine, config), - m_config(config) -{ -} - - -//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void ptm6840_device::device_start() { - m_internal_clock = m_config.m_internal_clock; + m_internal_clock = m_internal_clock; /* resolve callbacks */ for (int i = 0; i < 3; i++) { - devcb_resolve_write8(&m_out_func[i], &m_config.m_out_func[i], this); + devcb_resolve_write8(&m_out_func[i], &m_out_cb[i], this); } for (int i = 0; i < 3; i++) { - if ( m_config.m_external_clock[i] ) + if ( m_external_clock[i] ) { - m_external_clock[i] = m_config.m_external_clock[i]; + m_external_clock[i] = m_external_clock[i]; } else { @@ -141,7 +139,7 @@ void ptm6840_device::device_start() m_timer[i]->enable(false); } - devcb_resolve_write_line(&m_irq_func, &m_config.m_irq_func, this); + devcb_resolve_write_line(&m_irq_func, &m_irq_cb, this); /* register for state saving */ save_item(NAME(m_lsb_buffer)); diff --git a/src/emu/machine/6840ptm.h b/src/emu/machine/6840ptm.h index d6c337fca4f..b27adcf1ee0 100644 --- a/src/emu/machine/6840ptm.h +++ b/src/emu/machine/6840ptm.h @@ -35,44 +35,20 @@ struct ptm6840_interface double m_internal_clock; double m_external_clock[3]; - devcb_write8 m_out_func[3]; // function to call when output[idx] changes - devcb_write_line m_irq_func; // function called if IRQ line changes -}; - - - -// ======================> ptm6840_device_config - -class ptm6840_device_config : public device_config, - public ptm6840_interface -{ - friend class ptm6840_device; - - // construction/destruction - ptm6840_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write8 m_out_cb[3]; // function to call when output[idx] changes + devcb_write_line m_irq_cb; // function called if IRQ line changes }; // ======================> ptm6840_device -class ptm6840_device : public device_t +class ptm6840_device : public device_t, + public ptm6840_interface { - friend class ptm6840_device_config; - - // construction/destruction - ptm6840_device(running_machine &_machine, const ptm6840_device_config &_config); - public: + // construction/destruction + ptm6840_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); int ptm6840_get_status(int clock); // get whether timer is enabled int ptm6840_get_irq(); // get IRQ state @@ -97,6 +73,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -129,9 +106,6 @@ private: PTM_6840_LSB3 = 7, }; - double m_internal_clock; - double m_external_clock[3]; - devcb_resolved_write8 m_out_func[3]; // function to call when output[idx] changes devcb_resolved_write_line m_irq_func; // function called if IRQ line changes @@ -156,8 +130,6 @@ private: UINT16 m_latch[3]; UINT16 m_counter[3]; - const ptm6840_device_config &m_config; - static const char *const opmode[]; }; diff --git a/src/emu/machine/6850acia.c b/src/emu/machine/6850acia.c index 17192e99e3a..7b51907a3a6 100644 --- a/src/emu/machine/6850acia.c +++ b/src/emu/machine/6850acia.c @@ -52,9 +52,19 @@ const int acia6850_device::ACIA6850_WORD[8][3] = LIVE DEVICE ***************************************************************************/ -const device_type ACIA6850 = acia6850_device_config::static_alloc_device_config; +// device type definition +const device_type ACIA6850 = &device_creator<acia6850_device>; + +//------------------------------------------------- +// acia6850_device - constructor +//------------------------------------------------- + +acia6850_device::acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, ACIA6850, "6850 ACIA", tag, owner, clock) +{ + +} -GENERIC_DEVICE_CONFIG_SETUP(acia6850, "6850 ACIA") //------------------------------------------------- // device_config_complete - perform any @@ -62,7 +72,7 @@ GENERIC_DEVICE_CONFIG_SETUP(acia6850, "6850 ACIA") // complete //------------------------------------------------- -void acia6850_device_config::device_config_complete() +void acia6850_device::device_config_complete() { // inherit a copy of the static data const acia6850_interface *intf = reinterpret_cast<const acia6850_interface *>(static_config()); @@ -76,44 +86,30 @@ void acia6850_device_config::device_config_complete() { m_tx_clock = 0; m_rx_clock = 0; - memset(&m_in_rx_func, 0, sizeof(m_in_rx_func)); - memset(&m_out_tx_func, 0, sizeof(m_out_tx_func)); - memset(&m_in_cts_func, 0, sizeof(m_in_cts_func)); - memset(&m_out_rts_func, 0, sizeof(m_out_rts_func)); - memset(&m_in_dcd_func, 0, sizeof(m_in_dcd_func)); - memset(&m_out_irq_func, 0, sizeof(m_out_irq_func)); + memset(&m_in_rx_cb, 0, sizeof(m_in_rx_cb)); + memset(&m_out_tx_cb, 0, sizeof(m_out_tx_cb)); + memset(&m_in_cts_cb, 0, sizeof(m_in_cts_cb)); + memset(&m_out_rts_cb, 0, sizeof(m_out_rts_cb)); + memset(&m_in_dcd_cb, 0, sizeof(m_in_dcd_cb)); + memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); } } //------------------------------------------------- -// acia6850_device - constructor -//------------------------------------------------- - -acia6850_device::acia6850_device(running_machine &_machine, const acia6850_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - - -//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void acia6850_device::device_start() { /* resolve callbacks */ - devcb_resolve_read_line(&m_in_rx_func, &m_config.m_in_rx_func, this); - devcb_resolve_write_line(&m_out_tx_func, &m_config.m_out_tx_func, this); - devcb_resolve_read_line(&m_in_cts_func, &m_config.m_in_cts_func, this); - devcb_resolve_write_line(&m_out_rts_func, &m_config.m_out_rts_func, this); - devcb_resolve_read_line(&m_in_dcd_func, &m_config.m_in_dcd_func, this); - devcb_resolve_write_line(&m_out_irq_func, &m_config.m_out_irq_func, this); - - m_rx_clock = m_config.m_rx_clock; - m_tx_clock = m_config.m_tx_clock; + devcb_resolve_read_line(&m_in_rx_func, &m_in_rx_cb, this); + devcb_resolve_write_line(&m_out_tx_func, &m_out_tx_cb, this); + devcb_resolve_read_line(&m_in_cts_func, &m_in_cts_cb, this); + devcb_resolve_write_line(&m_out_rts_func, &m_out_rts_cb, this); + devcb_resolve_read_line(&m_in_dcd_func, &m_in_dcd_cb, this); + devcb_resolve_write_line(&m_out_irq_func, &m_out_irq_cb, this); + m_tx_counter = 0; m_rx_counter = 0; m_rx_timer = machine().scheduler().timer_alloc(FUNC(receive_event_callback), (void *)this); diff --git a/src/emu/machine/6850acia.h b/src/emu/machine/6850acia.h index 76422482420..4e5b64702d8 100644 --- a/src/emu/machine/6850acia.h +++ b/src/emu/machine/6850acia.h @@ -54,50 +54,26 @@ struct acia6850_interface int m_tx_clock; int m_rx_clock; - devcb_read_line m_in_rx_func; - devcb_write_line m_out_tx_func; + devcb_read_line m_in_rx_cb; + devcb_write_line m_out_tx_cb; - devcb_read_line m_in_cts_func; - devcb_write_line m_out_rts_func; - devcb_read_line m_in_dcd_func; + devcb_read_line m_in_cts_cb; + devcb_write_line m_out_rts_cb; + devcb_read_line m_in_dcd_cb; - devcb_write_line m_out_irq_func; -}; - - - -// ======================> acia6850_device_config - -class acia6850_device_config : public device_config, - public acia6850_interface -{ - friend class acia6850_device; - - // construction/destruction - acia6850_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_irq_cb; }; // ======================> acia6850_device -class acia6850_device : public device_t +class acia6850_device : public device_t, + public acia6850_interface { - friend class acia6850_device_config; - - // construction/destruction - acia6850_device(running_machine &_machine, const acia6850_device_config &_config); - public: + // construction/destruction + acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); void acia6850_tx_clock_in(); void acia6850_rx_clock_in(); @@ -120,6 +96,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -172,9 +149,6 @@ private: UINT8 m_rx_counter; UINT8 m_tx_counter; - int m_rx_clock; - int m_tx_clock; - int m_divide; /* Counters */ @@ -203,8 +177,6 @@ private: emu_timer *m_rx_timer; emu_timer *m_tx_timer; - const acia6850_device_config &m_config; - static const int ACIA6850_DIVIDE[3]; static const int ACIA6850_WORD[8][3]; }; diff --git a/src/emu/machine/68681.c b/src/emu/machine/68681.c index a053f1e432c..eaf8265458d 100644 --- a/src/emu/machine/68681.c +++ b/src/emu/machine/68681.c @@ -707,7 +707,7 @@ static DEVICE_START(duart68681) /* validate arguments */ assert(device != NULL); - duart68681->duart_config = (const duart68681_config *)device->baseconfig().static_config(); + duart68681->duart_config = (const duart68681_config *)device->static_config(); duart68681->device = device; duart68681->channel[0].tx_timer = device->machine().scheduler().timer_alloc(FUNC(tx_timer_callback), (void*)device); diff --git a/src/emu/machine/74123.c b/src/emu/machine/74123.c index 5dd9bb6a657..eac124eeae4 100644 --- a/src/emu/machine/74123.c +++ b/src/emu/machine/74123.c @@ -14,45 +14,22 @@ #define LOG (0) -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type TTL74123 = ttl74123_device_config::static_alloc_device_config; - //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// ttl74123_device_config - constructor -//------------------------------------------------- - -ttl74123_device_config::ttl74123_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "TTL74123", tag, owner, clock) -{ -} - +// device type definition +const device_type TTL74123 = &device_creator<ttl74123_device>; //------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object +// ttl74123_device - constructor //------------------------------------------------- -device_config *ttl74123_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) +ttl74123_device::ttl74123_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, TTL74123, "TTL74123", tag, owner, clock) { - return global_alloc(ttl74123_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- -device_t *ttl74123_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, ttl74123_device(machine, *this)); } @@ -62,7 +39,7 @@ device_t *ttl74123_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void ttl74123_device_config::device_config_complete() +void ttl74123_device::device_config_complete() { // inherit a copy of the static data const ttl74123_interface *intf = reinterpret_cast<const ttl74123_interface *>(static_config()); @@ -83,23 +60,6 @@ void ttl74123_device_config::device_config_complete() } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// ttl74123_device - constructor -//------------------------------------------------- - -ttl74123_device::ttl74123_device(running_machine &_machine, const ttl74123_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -108,11 +68,6 @@ void ttl74123_device::device_start() { m_timer = machine().scheduler().timer_alloc(FUNC(clear_callback), (void *)this); - /* start with the defaults */ - m_a = m_config.m_a; - m_b = m_config.m_b; - m_clear = m_config.m_clear; - /* register for state saving */ save_item(NAME(m_a)); save_item(NAME(m_b)); @@ -139,26 +94,26 @@ attotime ttl74123_device::compute_duration() { double duration; - switch (m_config.m_connection_type) + switch (m_connection_type) { case TTL74123_NOT_GROUNDED_NO_DIODE: - duration = 0.28 * m_config.m_res * m_config.m_cap * (1.0 + (700.0 / m_config.m_res)); + duration = 0.28 * m_res * m_cap * (1.0 + (700.0 / m_res)); break; case TTL74123_NOT_GROUNDED_DIODE: - duration = 0.25 * m_config.m_res * m_config.m_cap * (1.0 + (700.0 / m_config.m_res)); + duration = 0.25 * m_res * m_cap * (1.0 + (700.0 / m_res)); break; case TTL74123_GROUNDED: default: - if (m_config.m_cap < CAP_U(0.1)) + if (m_cap < CAP_U(0.1)) { /* this is really a curve - a very flat one in the 0.1uF-.01uF range */ - duration = 0.32 * m_config.m_res * m_config.m_cap; + duration = 0.32 * m_res * m_cap; } else { - duration = 0.33 * m_config.m_res * m_config.m_cap; + duration = 0.33 * m_res * m_cap; } break; } @@ -190,7 +145,7 @@ TIMER_CALLBACK( ttl74123_device::output_callback ) void ttl74123_device::output(INT32 param) { - m_config.m_output_changed_cb(this, 0, param); + m_output_changed_cb(this, 0, param); } @@ -222,7 +177,7 @@ void ttl74123_device::clear() { int output = timer_running(); - m_config.m_output_changed_cb(this, 0, output); + m_output_changed_cb(this, 0, output); } @@ -237,7 +192,7 @@ void ttl74123_device::start_pulse() if(timer_running()) { /* retriggering, but not if we are called to quickly */ - attotime delay_time = attotime(0, ATTOSECONDS_PER_SECOND * m_config.m_cap * 220); + attotime delay_time = attotime(0, ATTOSECONDS_PER_SECOND * m_cap * 220); if(m_timer->elapsed() >= delay_time) { diff --git a/src/emu/machine/74123.h b/src/emu/machine/74123.h index 005231a646d..1338c4e825d 100644 --- a/src/emu/machine/74123.h +++ b/src/emu/machine/74123.h @@ -87,38 +87,14 @@ struct ttl74123_interface -// ======================> ttl74123_device_config - -class ttl74123_device_config : public device_config, - public ttl74123_interface -{ - friend class ttl74123_device; - - // construction/destruction - ttl74123_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> ttl74123_device -class ttl74123_device : public device_t +class ttl74123_device : public device_t, + public ttl74123_interface { - friend class ttl74123_device_config; - - // construction/destruction - ttl74123_device(running_machine &_machine, const ttl74123_device_config &_config); - public: + // construction/destruction + ttl74123_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); void a_w(UINT8 data); void b_w(UINT8 data); @@ -127,6 +103,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -144,12 +121,7 @@ private: attotime compute_duration(); void clear(); - UINT8 m_a; /* pin 1/9 */ - UINT8 m_b; /* pin 2/10 */ - UINT8 m_clear; /* pin 3/11 */ emu_timer *m_timer; - - const ttl74123_device_config &m_config; }; diff --git a/src/emu/machine/74148.c b/src/emu/machine/74148.c index 9a3a8df9556..accc2af5915 100644 --- a/src/emu/machine/74148.c +++ b/src/emu/machine/74148.c @@ -180,7 +180,7 @@ int ttl74148_enable_output_r(device_t *device) static DEVICE_START( ttl74148 ) { - ttl74148_config *config = (ttl74148_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + ttl74148_config *config = (ttl74148_config *)downcast<const legacy_device_base *>(device)->inline_config(); ttl74148_state *state = get_safe_token(device); state->output_cb = config->output_cb; diff --git a/src/emu/machine/74153.c b/src/emu/machine/74153.c index 3d286195eed..cbb44d251ff 100644 --- a/src/emu/machine/74153.c +++ b/src/emu/machine/74153.c @@ -136,7 +136,7 @@ int ttl74153_output_r(device_t *device, int section) static DEVICE_START( ttl74153 ) { - ttl74153_config *config = (ttl74153_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + ttl74153_config *config = (ttl74153_config *)downcast<const legacy_device_base *>(device)->inline_config(); ttl74153_state *state = get_safe_token(device); state->output_cb = config->output_cb; diff --git a/src/emu/machine/7474.c b/src/emu/machine/7474.c index 3b92dab2463..2bcacf7bce5 100644 --- a/src/emu/machine/7474.c +++ b/src/emu/machine/7474.c @@ -41,59 +41,34 @@ #include "7474.h" -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type MACHINE_TTL7474 = ttl7474_device_config::static_alloc_device_config; - - //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// ttl7474_device_config - constructor -//------------------------------------------------- - -ttl7474_device_config::ttl7474_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "7474", tag, owner, clock) -{ -} - +// device type definition +const device_type MACHINE_TTL7474 = &device_creator<ttl7474_device>; //------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *ttl7474_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(ttl7474_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object +// ttl7474_device - constructor //------------------------------------------------- -device_t *ttl7474_device_config::alloc_device(running_machine &machine) const +ttl7474_device::ttl7474_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MACHINE_TTL7474, "7474", tag, owner, clock) { - return auto_alloc(machine, ttl7474_device(machine, *this)); + init(); } - //------------------------------------------------- // static_set_target_tag - configuration helper // to set the target tag //------------------------------------------------- -void ttl7474_device_config::static_set_target_tag(device_config *device, const char *tag) +void ttl7474_device::static_set_target_tag(device_t &device, const char *tag) { - ttl7474_device_config *ttl7474 = downcast<ttl7474_device_config *>(device); - ttl7474->m_output_cb.tag = tag; - ttl7474->m_comp_output_cb.tag = tag; + ttl7474_device &ttl7474 = downcast<ttl7474_device &>(device); + ttl7474.m_output_cb.tag = tag; + ttl7474.m_comp_output_cb.tag = tag; } @@ -102,16 +77,16 @@ void ttl7474_device_config::static_set_target_tag(device_config *device, const c // to set the output callback //------------------------------------------------- -void ttl7474_device_config::static_set_output_cb(device_config *device, write_line_device_func callback) +void ttl7474_device::static_set_output_cb(device_t &device, write_line_device_func callback) { - ttl7474_device_config *ttl7474 = downcast<ttl7474_device_config *>(device); + ttl7474_device &ttl7474 = downcast<ttl7474_device &>(device); if (callback != NULL) { - ttl7474->m_output_cb.type = DEVCB_TYPE_DEVICE; - ttl7474->m_output_cb.writeline = callback; + ttl7474.m_output_cb.type = DEVCB_TYPE_DEVICE; + ttl7474.m_output_cb.writeline = callback; } else - ttl7474->m_output_cb.type = DEVCB_TYPE_NULL; + ttl7474.m_output_cb.type = DEVCB_TYPE_NULL; } @@ -120,35 +95,19 @@ void ttl7474_device_config::static_set_output_cb(device_config *device, write_li // helper to set the comp. output callback //------------------------------------------------- -void ttl7474_device_config::static_set_comp_output_cb(device_config *device, write_line_device_func callback) +void ttl7474_device::static_set_comp_output_cb(device_t &device, write_line_device_func callback) { - ttl7474_device_config *ttl7474 = downcast<ttl7474_device_config *>(device); + ttl7474_device &ttl7474 = downcast<ttl7474_device &>(device); if (callback != NULL) { - ttl7474->m_comp_output_cb.type = DEVCB_TYPE_DEVICE; - ttl7474->m_comp_output_cb.writeline = callback; + ttl7474.m_comp_output_cb.type = DEVCB_TYPE_DEVICE; + ttl7474.m_comp_output_cb.writeline = callback; } else - ttl7474->m_comp_output_cb.type = DEVCB_TYPE_NULL; + ttl7474.m_comp_output_cb.type = DEVCB_TYPE_NULL; } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// ttl7474_device - constructor -//------------------------------------------------- - -ttl7474_device::ttl7474_device(running_machine &_machine, const ttl7474_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - init(); -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -165,8 +124,8 @@ void ttl7474_device::device_start() save_item(NAME(m_last_output)); save_item(NAME(m_last_output_comp)); - devcb_resolve_write_line(&m_output_cb, &m_config.m_output_cb, this); - devcb_resolve_write_line(&m_comp_output_cb, &m_config.m_comp_output_cb, this); + devcb_resolve_write_line(&m_output_func, &m_output_cb, this); + devcb_resolve_write_line(&m_comp_output_func, &m_comp_output_cb, this); } //------------------------------------------------- @@ -213,13 +172,13 @@ void ttl7474_device::update() if (m_output != m_last_output) { m_last_output = m_output; - devcb_call_write_line(&m_output_cb, m_output); + devcb_call_write_line(&m_output_func, m_output); } /* call callback if any of the outputs changed */ if (m_output_comp != m_last_output_comp) { m_last_output_comp = m_output_comp; - devcb_call_write_line(&m_comp_output_cb, m_output_comp); + devcb_call_write_line(&m_comp_output_func, m_output_comp); } } diff --git a/src/emu/machine/7474.h b/src/emu/machine/7474.h index 0f04969b9ce..2fd595ef326 100644 --- a/src/emu/machine/7474.h +++ b/src/emu/machine/7474.h @@ -63,13 +63,13 @@ MCFG_7474_COMP_OUTPUT_CB(_comp_output_cb) #define MCFG_7474_TARGET_TAG(_target_tag) \ - ttl7474_device_config::static_set_target_tag(device, _target_tag); \ + ttl7474_device::static_set_target_tag(*device, _target_tag); \ #define MCFG_7474_OUTPUT_CB(_cb) \ - ttl7474_device_config::static_set_output_cb(device, _cb); \ + ttl7474_device::static_set_output_cb(*device, _cb); \ #define MCFG_7474_COMP_OUTPUT_CB(_cb) \ - ttl7474_device_config::static_set_comp_output_cb(device, _cb); \ + ttl7474_device::static_set_comp_output_cb(*device, _cb); \ @@ -77,43 +77,20 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> ttl7474_device_config - -class ttl7474_device_config : public device_config -{ - friend class ttl7474_device; - - // construction/destruction - ttl7474_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - - // inline configuration helpers - static void static_set_target_tag(device_config *device, const char *tag); - static void static_set_output_cb(device_config *device, write_line_device_func callback); - static void static_set_comp_output_cb(device_config *device, write_line_device_func callback); - -protected: - // internal state goes here - devcb_write_line m_output_cb; - devcb_write_line m_comp_output_cb; -}; - - - // ======================> ttl7474_device class ttl7474_device : public device_t { - friend class ttl7474_device_config; - +public: // construction/destruction - ttl7474_device(running_machine &_machine, const ttl7474_device_config &config); + ttl7474_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: + // inline configuration helpers + static void static_set_target_tag(device_t &device, const char *tag); + static void static_set_output_cb(device_t &device, write_line_device_func callback); + static void static_set_comp_output_cb(device_t &device, write_line_device_func callback); + + // public interfaces void clear_w(UINT8 state); void preset_w(UINT8 state); void clock_w(UINT8 state); @@ -128,13 +105,14 @@ protected: virtual void device_post_load() { } virtual void device_clock_changed() { } - // internal state - const ttl7474_device_config &m_config; + // configuration state + devcb_write_line m_output_cb; + devcb_write_line m_comp_output_cb; private: /* callbacks */ - devcb_resolved_write_line m_output_cb; - devcb_resolved_write_line m_comp_output_cb; + devcb_resolved_write_line m_output_func; + devcb_resolved_write_line m_comp_output_func; /* inputs */ UINT8 m_clear; /* pin 1/13 */ diff --git a/src/emu/machine/8237dma.c b/src/emu/machine/8237dma.c index 0648e2925ff..3537fd832ec 100644 --- a/src/emu/machine/8237dma.c +++ b/src/emu/machine/8237dma.c @@ -45,10 +45,20 @@ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(i8237, "Intel 8237") +// device type definition +const device_type I8237 = &device_creator<i8237_device>; + +//------------------------------------------------- +// i8237_device - constructor +//------------------------------------------------- + +i8237_device::i8237_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8237, "Intel 8237", tag, owner, clock) +{ +} //------------------------------------------------- // device_config_complete - perform any @@ -56,7 +66,7 @@ GENERIC_DEVICE_CONFIG_SETUP(i8237, "Intel 8237") // complete //------------------------------------------------- -void i8237_device_config::device_config_complete() +void i8237_device::device_config_complete() { // inherit a copy of the static data const i8237_interface *intf = reinterpret_cast<const i8237_interface *>(static_config()); @@ -68,43 +78,26 @@ void i8237_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_out_hrq_func, 0, sizeof(m_out_hrq_func)); - memset(&m_out_eop_func, 0, sizeof(m_out_eop_func)); - memset(&m_in_memr_func, 0, sizeof(m_in_memr_func)); - memset(&m_out_memw_func, 0, sizeof(m_out_memw_func)); - memset(&m_in_ior_func[0], 0, sizeof(m_in_ior_func[0])); - memset(&m_in_ior_func[1], 0, sizeof(m_in_ior_func[1])); - memset(&m_in_ior_func[2], 0, sizeof(m_in_ior_func[2])); - memset(&m_in_ior_func[3], 0, sizeof(m_in_ior_func[3])); - memset(&m_out_iow_func[0], 0, sizeof(m_out_iow_func[0])); - memset(&m_out_iow_func[1], 0, sizeof(m_out_iow_func[1])); - memset(&m_out_iow_func[2], 0, sizeof(m_out_iow_func[2])); - memset(&m_out_iow_func[3], 0, sizeof(m_out_iow_func[3])); - memset(&m_out_dack_func[0], 0, sizeof(m_out_dack_func[0])); - memset(&m_out_dack_func[1], 0, sizeof(m_out_dack_func[1])); - memset(&m_out_dack_func[2], 0, sizeof(m_out_dack_func[2])); - memset(&m_out_dack_func[3], 0, sizeof(m_out_dack_func[3])); + memset(&m_out_hrq_cb, 0, sizeof(m_out_hrq_cb)); + memset(&m_out_eop_cb, 0, sizeof(m_out_eop_cb)); + memset(&m_in_memr_cb, 0, sizeof(m_in_memr_cb)); + memset(&m_out_memw_cb, 0, sizeof(m_out_memw_cb)); + memset(&m_in_ior_cb[0], 0, sizeof(m_in_ior_cb[0])); + memset(&m_in_ior_cb[1], 0, sizeof(m_in_ior_cb[1])); + memset(&m_in_ior_cb[2], 0, sizeof(m_in_ior_cb[2])); + memset(&m_in_ior_cb[3], 0, sizeof(m_in_ior_cb[3])); + memset(&m_out_iow_cb[0], 0, sizeof(m_out_iow_cb[0])); + memset(&m_out_iow_cb[1], 0, sizeof(m_out_iow_cb[1])); + memset(&m_out_iow_cb[2], 0, sizeof(m_out_iow_cb[2])); + memset(&m_out_iow_cb[3], 0, sizeof(m_out_iow_cb[3])); + memset(&m_out_dack_cb[0], 0, sizeof(m_out_dack_cb[0])); + memset(&m_out_dack_cb[1], 0, sizeof(m_out_dack_cb[1])); + memset(&m_out_dack_cb[2], 0, sizeof(m_out_dack_cb[2])); + memset(&m_out_dack_cb[3], 0, sizeof(m_out_dack_cb[3])); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type I8237 = i8237_device_config::static_alloc_device_config; - -//------------------------------------------------- -// i8237_device - constructor -//------------------------------------------------- - -i8237_device::i8237_device(running_machine &_machine, const i8237_device_config &config) - : device_t(_machine, config), - m_config(config) -{ -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -112,16 +105,16 @@ i8237_device::i8237_device(running_machine &_machine, const i8237_device_config void i8237_device::device_start() { /* resolve callbacks */ - devcb_resolve_write_line(&m_out_hrq_func, &m_config.m_out_hrq_func, this); - devcb_resolve_write_line(&m_out_eop_func, &m_config.m_out_eop_func, this); - devcb_resolve_read8(&m_in_memr_func, &m_config.m_in_memr_func, this); - devcb_resolve_write8(&m_out_memw_func, &m_config.m_out_memw_func, this); + devcb_resolve_write_line(&m_out_hrq_func, &m_out_hrq_cb, this); + devcb_resolve_write_line(&m_out_eop_func, &m_out_eop_cb, this); + devcb_resolve_read8(&m_in_memr_func, &m_in_memr_cb, this); + devcb_resolve_write8(&m_out_memw_func, &m_out_memw_cb, this); for (int i = 0; i < 4; i++) { - devcb_resolve_read8(&m_chan[i].m_in_ior_func, &m_config.m_in_ior_func[i], this); - devcb_resolve_write8(&m_chan[i].m_out_iow_func, &m_config.m_out_iow_func[i], this); - devcb_resolve_write_line(&m_chan[i].m_out_dack_func, &m_config.m_out_dack_func[i], this); + devcb_resolve_read8(&m_chan[i].m_in_ior_func, &m_in_ior_cb[i], this); + devcb_resolve_write8(&m_chan[i].m_out_iow_func, &m_out_iow_cb[i], this); + devcb_resolve_write_line(&m_chan[i].m_out_dack_func, &m_out_dack_cb[i], this); } m_timer = machine().scheduler().timer_alloc(FUNC(i8237_timerproc_callback), (void *)this); diff --git a/src/emu/machine/8237dma.h b/src/emu/machine/8237dma.h index dd8f9829cd9..864aba746ad 100644 --- a/src/emu/machine/8237dma.h +++ b/src/emu/machine/8237dma.h @@ -60,53 +60,29 @@ struct i8237_interface { - devcb_write_line m_out_hrq_func; - devcb_write_line m_out_eop_func; + devcb_write_line m_out_hrq_cb; + devcb_write_line m_out_eop_cb; /* accessors to main memory */ - devcb_read8 m_in_memr_func; - devcb_write8 m_out_memw_func; + devcb_read8 m_in_memr_cb; + devcb_write8 m_out_memw_cb; /* channel accessors */ - devcb_read8 m_in_ior_func[4]; - devcb_write8 m_out_iow_func[4]; - devcb_write_line m_out_dack_func[4]; -}; - - - -// ======================> i8237_device_config - -class i8237_device_config : public device_config, - public i8237_interface -{ - friend class i8237_device; - - // construction/destruction - i8237_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_ior_cb[4]; + devcb_write8 m_out_iow_cb[4]; + devcb_write_line m_out_dack_cb[4]; }; // ======================> i8237_device -class i8237_device : public device_t +class i8237_device : public device_t, + public i8237_interface { - friend class i8237_device_config; - - // construction/destruction - i8237_device(running_machine &_machine, const i8237_device_config &_config); - public: + // construction/destruction + i8237_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); /* register access */ UINT8 i8237_r(UINT32 offset); @@ -122,6 +98,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -199,8 +176,6 @@ private: dma8237_state m_state; /* State the device is currently in */ int m_service_channel; /* Channel we will be servicing */ int m_last_service_channel; /* Previous channel we serviced; used to determine channel priority. */ - - const i8237_device_config &m_config; }; diff --git a/src/emu/machine/8255ppi.c b/src/emu/machine/8255ppi.c index 5ed908be7bb..9b98b24a5b2 100644 --- a/src/emu/machine/8255ppi.c +++ b/src/emu/machine/8255ppi.c @@ -94,11 +94,24 @@ #include "8255ppi.h" #include "devhelpr.h" + //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(ppi8255, "Intel PPI8255") +// device type definition +const device_type PPI8255 = &device_creator<ppi8255_device>; + +//------------------------------------------------- +// ppi8255_device - constructor +//------------------------------------------------- + +ppi8255_device::ppi8255_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PPI8255, "Intel PPI8255", tag, owner, clock) +{ + +} + //------------------------------------------------- // device_config_complete - perform any @@ -106,7 +119,7 @@ GENERIC_DEVICE_CONFIG_SETUP(ppi8255, "Intel PPI8255") // complete //------------------------------------------------- -void ppi8255_device_config::device_config_complete() +void ppi8255_device::device_config_complete() { // inherit a copy of the static data const ppi8255_interface *intf = reinterpret_cast<const ppi8255_interface *>(static_config()); @@ -128,37 +141,19 @@ void ppi8255_device_config::device_config_complete() } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type PPI8255 = ppi8255_device_config::static_alloc_device_config; - -//------------------------------------------------- -// ppi8255_device - constructor -//------------------------------------------------- - -ppi8255_device::ppi8255_device(running_machine &_machine, const ppi8255_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void ppi8255_device::device_start() { - devcb_resolve_read8(&m_port_read[0], &m_config.m_port_a_read, this); - devcb_resolve_read8(&m_port_read[1], &m_config.m_port_b_read, this); - devcb_resolve_read8(&m_port_read[2], &m_config.m_port_c_read, this); + devcb_resolve_read8(&m_port_read[0], &m_port_a_read, this); + devcb_resolve_read8(&m_port_read[1], &m_port_b_read, this); + devcb_resolve_read8(&m_port_read[2], &m_port_c_read, this); - devcb_resolve_write8(&m_port_write[0], &m_config.m_port_a_write, this); - devcb_resolve_write8(&m_port_write[1], &m_config.m_port_b_write, this); - devcb_resolve_write8(&m_port_write[2], &m_config.m_port_c_write, this); + devcb_resolve_write8(&m_port_write[0], &m_port_a_write, this); + devcb_resolve_write8(&m_port_write[1], &m_port_b_write, this); + devcb_resolve_write8(&m_port_write[2], &m_port_c_write, this); /* register for state saving */ save_item(NAME(m_group_a_mode)); diff --git a/src/emu/machine/8255ppi.h b/src/emu/machine/8255ppi.h index ecd7ebe6339..229dc8265cf 100644 --- a/src/emu/machine/8255ppi.h +++ b/src/emu/machine/8255ppi.h @@ -46,37 +46,14 @@ struct ppi8255_interface }; -// ======================> ppi8255_device_config - -class ppi8255_device_config : public device_config, - public ppi8255_interface -{ - friend class ppi8255_device; - - // construction/destruction - ppi8255_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - // ======================> ppi8255_device -class ppi8255_device : public device_t +class ppi8255_device : public device_t, + public ppi8255_interface { - friend class ppi8255_device_config; - - // construction/destruction - ppi8255_device(running_machine &_machine, const ppi8255_device_config &_config); - public: + // construction/destruction + ppi8255_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); UINT8 ppi8255_r(UINT32 offset); void ppi8255_w(UINT32 offset, UINT8 data); @@ -97,6 +74,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -141,8 +119,6 @@ private: UINT8 m_latch[3]; /* data written to ports */ UINT8 m_output[3]; /* actual output data */ UINT8 m_control; /* mode control word */ - - const ppi8255_device_config &m_config; }; diff --git a/src/emu/machine/8257dma.c b/src/emu/machine/8257dma.c index 55a20384e44..ba9ff0bfd5a 100644 --- a/src/emu/machine/8257dma.c +++ b/src/emu/machine/8257dma.c @@ -48,10 +48,30 @@ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(i8257, "DMA8257") +// device type definition +const device_type I8257 = &device_creator<i8257_device>; + +//------------------------------------------------- +// i8257_device - constructor +//------------------------------------------------- + +i8257_device::i8257_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8257, "DMA8257", tag, owner, clock), + m_mode(0), + m_rr(0), + m_msb(0), + m_drq(0), + m_status(0x0f) +{ + memset(m_registers, 0, sizeof(m_registers)); + memset(m_address, 0, sizeof(m_address)); + memset(m_count, 0, sizeof(m_count)); + memset(m_rwmode, 0, sizeof(m_rwmode)); +} + //------------------------------------------------- // device_config_complete - perform any @@ -59,7 +79,7 @@ GENERIC_DEVICE_CONFIG_SETUP(i8257, "DMA8257") // complete //------------------------------------------------- -void i8257_device_config::device_config_complete() +void i8257_device::device_config_complete() { // inherit a copy of the static data const i8257_interface *intf = reinterpret_cast<const i8257_interface *>(static_config()); @@ -71,49 +91,23 @@ void i8257_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_out_hrq_func, 0, sizeof(m_out_hrq_func)); - memset(&m_out_tc_func, 0, sizeof(m_out_tc_func)); - memset(&m_out_mark_func, 0, sizeof(m_out_mark_func)); - memset(&m_in_memr_func, 0, sizeof(m_in_memr_func)); - memset(&m_out_memw_func, 0, sizeof(m_out_memw_func)); - memset(&m_in_ior_func[0], 0, sizeof(m_in_ior_func[0])); - memset(&m_in_ior_func[1], 0, sizeof(m_in_ior_func[1])); - memset(&m_in_ior_func[2], 0, sizeof(m_in_ior_func[2])); - memset(&m_in_ior_func[3], 0, sizeof(m_in_ior_func[3])); - memset(&m_out_iow_func[0], 0, sizeof(m_out_iow_func[0])); - memset(&m_out_iow_func[1], 0, sizeof(m_out_iow_func[1])); - memset(&m_out_iow_func[2], 0, sizeof(m_out_iow_func[2])); - memset(&m_out_iow_func[3], 0, sizeof(m_out_iow_func[3])); + memset(&m_out_hrq_cb, 0, sizeof(m_out_hrq_cb)); + memset(&m_out_tc_cb, 0, sizeof(m_out_tc_cb)); + memset(&m_out_mark_cb, 0, sizeof(m_out_mark_cb)); + memset(&m_in_memr_cb, 0, sizeof(m_in_memr_cb)); + memset(&m_out_memw_cb, 0, sizeof(m_out_memw_cb)); + memset(&m_in_ior_cb[0], 0, sizeof(m_in_ior_cb[0])); + memset(&m_in_ior_cb[1], 0, sizeof(m_in_ior_cb[1])); + memset(&m_in_ior_cb[2], 0, sizeof(m_in_ior_cb[2])); + memset(&m_in_ior_cb[3], 0, sizeof(m_in_ior_cb[3])); + memset(&m_out_iow_cb[0], 0, sizeof(m_out_iow_cb[0])); + memset(&m_out_iow_cb[1], 0, sizeof(m_out_iow_cb[1])); + memset(&m_out_iow_cb[2], 0, sizeof(m_out_iow_cb[2])); + memset(&m_out_iow_cb[3], 0, sizeof(m_out_iow_cb[3])); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type I8257 = i8257_device_config::static_alloc_device_config; - -//------------------------------------------------- -// i8257_device - constructor -//------------------------------------------------- - -i8257_device::i8257_device(running_machine &_machine, const i8257_device_config &config) - : device_t(_machine, config), - m_mode(0), - m_rr(0), - m_msb(0), - m_drq(0), - m_status(0x0f), - m_config(config) -{ - memset(m_registers, 0, sizeof(m_registers)); - memset(m_address, 0, sizeof(m_address)); - memset(m_count, 0, sizeof(m_count)); - memset(m_rwmode, 0, sizeof(m_rwmode)); -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -124,16 +118,16 @@ void i8257_device::device_start() assert(this != NULL); /* resolve callbacks */ - devcb_resolve_write_line(&m_out_hrq_func, &m_config.m_out_hrq_func, this); - devcb_resolve_write_line(&m_out_tc_func, &m_config.m_out_tc_func, this); - devcb_resolve_write_line(&m_out_mark_func, &m_config.m_out_mark_func, this); - devcb_resolve_read8(&m_in_memr_func, &m_config.m_in_memr_func, this); - devcb_resolve_write8(&m_out_memw_func, &m_config.m_out_memw_func, this); + devcb_resolve_write_line(&m_out_hrq_func, &m_out_hrq_cb, this); + devcb_resolve_write_line(&m_out_tc_func, &m_out_tc_cb, this); + devcb_resolve_write_line(&m_out_mark_func, &m_out_mark_cb, this); + devcb_resolve_read8(&m_in_memr_func, &m_in_memr_cb, this); + devcb_resolve_write8(&m_out_memw_func, &m_out_memw_cb, this); for (int i = 0; i < I8257_NUM_CHANNELS; i++) { - devcb_resolve_read8(&m_in_ior_func[i], &m_config.m_in_ior_func[i], this); - devcb_resolve_write8(&m_out_iow_func[i], &m_config.m_out_iow_func[i], this); + devcb_resolve_read8(&m_in_ior_func[i], &m_in_ior_cb[i], this); + devcb_resolve_write8(&m_out_iow_func[i], &m_out_iow_cb[i], this); } /* set initial values */ diff --git a/src/emu/machine/8257dma.h b/src/emu/machine/8257dma.h index e4cf1593f75..0c96150dfa7 100644 --- a/src/emu/machine/8257dma.h +++ b/src/emu/machine/8257dma.h @@ -62,53 +62,29 @@ struct i8257_interface { - devcb_write_line m_out_hrq_func; - devcb_write_line m_out_tc_func; - devcb_write_line m_out_mark_func; + devcb_write_line m_out_hrq_cb; + devcb_write_line m_out_tc_cb; + devcb_write_line m_out_mark_cb; /* accessors to main memory */ - devcb_read8 m_in_memr_func; // TODO m_in_memr_func[I8257_NUM_CHANNELS]; - devcb_write8 m_out_memw_func; // TODO m_out_memw_func[I8257_NUM_CHANNELS]; + devcb_read8 m_in_memr_cb; // TODO m_in_memr_cb[I8257_NUM_CHANNELS]; + devcb_write8 m_out_memw_cb; // TODO m_out_memw_cb[I8257_NUM_CHANNELS]; /* channel accesors */ - devcb_read8 m_in_ior_func[I8257_NUM_CHANNELS]; - devcb_write8 m_out_iow_func[I8257_NUM_CHANNELS]; -}; - - - -// ======================> i8257_device_config - -class i8257_device_config : public device_config, - public i8257_interface -{ - friend class i8257_device; - - // construction/destruction - i8257_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_ior_cb[I8257_NUM_CHANNELS]; + devcb_write8 m_out_iow_cb[I8257_NUM_CHANNELS]; }; // ======================> i8257_device -class i8257_device : public device_t +class i8257_device : public device_t, + public i8257_interface { - friend class i8257_device_config; - - // construction/destruction - i8257_device(running_machine &_machine, const i8257_device_config &_config); - public: + // construction/destruction + i8257_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); /* register access */ UINT8 i8257_r(UINT32 offset); @@ -119,6 +95,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -157,8 +134,6 @@ private: /* bits 0- 3 : Terminal count for channels 0-3 */ UINT8 m_status; - - const i8257_device_config &m_config; }; diff --git a/src/emu/machine/adc0808.c b/src/emu/machine/adc0808.c index 35465093925..2dd30a21092 100644 --- a/src/emu/machine/adc0808.c +++ b/src/emu/machine/adc0808.c @@ -13,25 +13,26 @@ -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - - //************************************************************************** -// DEVICE DEFINITIONS +// LIVE DEVICE //************************************************************************** -const device_type ADC0808 = adc0808_device_config::static_alloc_device_config; +// device type definition +const device_type ADC0808 = &device_creator<adc0808_device>; +//------------------------------------------------- +// adc0808_device - constructor +//------------------------------------------------- - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(adc0808, "ADC0808") +adc0808_device::adc0808_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, ADC0808, "ADC0808", tag, owner, clock), + m_address(0), + m_start(0), + m_next_eoc(0), + m_cycle(0) +{ +} //------------------------------------------------- @@ -40,7 +41,7 @@ GENERIC_DEVICE_CONFIG_SETUP(adc0808, "ADC0808") // complete //------------------------------------------------- -void adc0808_device_config::device_config_complete() +void adc0808_device::device_config_complete() { // inherit a copy of the static data const adc0808_interface *intf = reinterpret_cast<const adc0808_interface *>(static_config()); @@ -50,31 +51,11 @@ void adc0808_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_out_eoc_func, 0, sizeof(m_out_eoc_func)); + memset(&m_out_eoc_cb, 0, sizeof(m_out_eoc_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// adc0808_device - constructor -//------------------------------------------------- - -adc0808_device::adc0808_device(running_machine &_machine, const adc0808_device_config &config) - : device_t(_machine, config), - m_address(0), - m_start(0), - m_next_eoc(0), - m_cycle(0), - m_config(config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -82,7 +63,7 @@ adc0808_device::adc0808_device(running_machine &_machine, const adc0808_device_c void adc0808_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_eoc_func, &m_config.m_out_eoc_func, this); + devcb_resolve_write_line(&m_out_eoc_func, &m_out_eoc_cb, this); // allocate timers m_cycle_timer = timer_alloc(); @@ -114,10 +95,10 @@ void adc0808_device::device_timer(emu_timer &timer, device_timer_id id, int para if (m_bit == 8) { /* sample input */ - double vref_pos = m_config.m_in_vref_pos_func(this); - double vref_neg = m_config.m_in_vref_neg_func(this); + double vref_pos = m_in_vref_pos_func(this); + double vref_neg = m_in_vref_neg_func(this); - double input = m_config.m_in_in_func[m_address](this); + double input = m_in_in_func[m_address](this); m_sar = (255 * (input - vref_neg)) / (vref_pos - vref_neg); diff --git a/src/emu/machine/adc0808.h b/src/emu/machine/adc0808.h index 071572d52b7..68c132bdf9f 100644 --- a/src/emu/machine/adc0808.h +++ b/src/emu/machine/adc0808.h @@ -61,7 +61,7 @@ typedef double (*adc0808_analog_read) (device_t *device); struct adc0808_interface { - devcb_write_line m_out_eoc_func; + devcb_write_line m_out_eoc_cb; adc0808_analog_read m_in_vref_pos_func; adc0808_analog_read m_in_vref_neg_func; @@ -70,37 +70,15 @@ struct adc0808_interface }; -// ======================> adc0808_device_config - -class adc0808_device_config : public device_config, - public adc0808_interface -{ - friend class adc0808_device; - - // construction/destruction - adc0808_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - // ======================> adc0808_device -class adc0808_device : public device_t +class adc0808_device : public device_t, + public adc0808_interface { - friend class adc0808_device_config; - +public: // construction/destruction - adc0808_device(running_machine &_machine, const adc0808_device_config &_config); + adc0808_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( ale_w ); @@ -108,6 +86,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -126,8 +105,6 @@ private: // timers emu_timer *m_cycle_timer; - - const adc0808_device_config &m_config; }; diff --git a/src/emu/machine/adc083x.c b/src/emu/machine/adc083x.c index 6e14a262e32..aab3d868600 100644 --- a/src/emu/machine/adc083x.c +++ b/src/emu/machine/adc083x.c @@ -82,7 +82,7 @@ INLINE const adc083x_interface *get_interface( device_t *device ) { assert( device != NULL ); assert( ( device->type() == ADC0831 ) || ( device->type() == ADC0832 ) || ( device->type() == ADC0834 ) || ( device->type() == ADC0838 ) ); - return (const adc083x_interface *) device->baseconfig().static_config(); + return (const adc083x_interface *) device->static_config(); } diff --git a/src/emu/machine/adc1038.c b/src/emu/machine/adc1038.c index f0f9036a99c..acf2ee32274 100644 --- a/src/emu/machine/adc1038.c +++ b/src/emu/machine/adc1038.c @@ -45,7 +45,7 @@ INLINE const adc1038_interface *adc1038_get_interface( device_t *device ) { assert(device != NULL); assert((device->type() == ADC1038)); - return (const adc1038_interface *) device->baseconfig().static_config(); + return (const adc1038_interface *) device->static_config(); } /***************************************************************************** diff --git a/src/emu/machine/adc1213x.c b/src/emu/machine/adc1213x.c index 14a3fc1a48f..38a589c122d 100644 --- a/src/emu/machine/adc1213x.c +++ b/src/emu/machine/adc1213x.c @@ -65,7 +65,7 @@ INLINE const adc12138_interface *get_interface(device_t *device) { assert(device != NULL); assert((device->type() == ADC12130) || (device->type() == ADC12132) || (device->type() == ADC12138)); - return (const adc12138_interface *) device->baseconfig().static_config(); + return (const adc12138_interface *) device->static_config(); } diff --git a/src/emu/machine/at28c16.c b/src/emu/machine/at28c16.c index f7090fa3671..1101b3ee8e4 100644 --- a/src/emu/machine/at28c16.c +++ b/src/emu/machine/at28c16.c @@ -20,8 +20,6 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type AT28C16 = at28c16_device_config::static_alloc_device_config; - static ADDRESS_MAP_START( at28c16_map8, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x081f) AM_RAM ADDRESS_MAP_END @@ -29,41 +27,24 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// at28c16_device_config - constructor -//------------------------------------------------- - -at28c16_device_config::at28c16_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ) - : device_config(mconfig, static_alloc_device_config, "AT28C16", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this) -{ -} - - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *at28c16_device_config::static_alloc_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ) -{ - return global_alloc( at28c16_device_config( mconfig, tag, owner, clock ) ); -} - - +// device type definition +const device_type AT28C16 = &device_creator<at28c16_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// at28c16_device - constructor //------------------------------------------------- -device_t *at28c16_device_config::alloc_device( running_machine &machine ) const +at28c16_device::at28c16_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ) + : device_t(mconfig, AT28C16, "AT28C16", tag, owner, clock), + device_memory_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), + m_a9_12v( 0 ), + m_oe_12v( 0 ), + m_last_write( -1 ) { - return auto_alloc( machine, at28c16_device( machine, *this ) ); } @@ -73,7 +54,7 @@ device_t *at28c16_device_config::alloc_device( running_machine &machine ) const // complete //------------------------------------------------- -void at28c16_device_config::device_config_complete() +void at28c16_device::device_config_complete() { m_space_config = address_space_config( "at28c16", ENDIANNESS_BIG, 8, 12, 0, *ADDRESS_MAP_NAME( at28c16_map8 ) ); } @@ -84,7 +65,7 @@ void at28c16_device_config::device_config_complete() // on this device //------------------------------------------------- -bool at28c16_device_config::device_validity_check( emu_options &options, const game_driver &driver ) const +bool at28c16_device::device_validity_check( emu_options &options, const game_driver &driver ) const { return false; } @@ -95,34 +76,12 @@ bool at28c16_device_config::device_validity_check( emu_options &options, const g // any address spaces owned by this device //------------------------------------------------- -const address_space_config *at28c16_device_config::memory_space_config( address_spacenum spacenum ) const +const address_space_config *at28c16_device::memory_space_config( address_spacenum spacenum ) const { return ( spacenum == 0 ) ? &m_space_config : NULL; } - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// at28c16_device - constructor -//------------------------------------------------- - -at28c16_device::at28c16_device( running_machine &_machine, const at28c16_device_config &config ) : - device_t( _machine, config ), - device_memory_interface( _machine, config, *this ), - device_nvram_interface( _machine, config, *this ), - m_config( config ), - m_a9_12v( 0 ), - m_oe_12v( 0 ), - m_last_write( -1 ) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- diff --git a/src/emu/machine/at28c16.h b/src/emu/machine/at28c16.h index 040a821b592..a891d51881b 100644 --- a/src/emu/machine/at28c16.h +++ b/src/emu/machine/at28c16.h @@ -31,56 +31,18 @@ struct at28c16_interface }; -// ======================> at28c16_device_config - -class at28c16_device_config : - public device_config, - public device_config_memory_interface, - public device_config_nvram_interface, - public at28c16_interface -{ - friend class at28c16_device; - - // construction/destruction - at28c16_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ); - -public: - // allocators - static device_config *static_alloc_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ); - virtual device_t *alloc_device( running_machine &machine ) const; - - // inline configuration indexes - enum - { - INLINE_INTERFACE - }; - -protected: - // device_config overrides - virtual void device_config_complete(); - virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const; - - // device-specific configuration - address_space_config m_space_config; -}; - - // ======================> at28c16_device class at28c16_device : public device_t, public device_memory_interface, - public device_nvram_interface + public device_nvram_interface, + public at28c16_interface { - friend class at28c16_device_config; - +public: // construction/destruction - at28c16_device( running_machine &_machine, const at28c16_device_config &config ); + at28c16_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ); -public: // I/O operations void write( offs_t offset, UINT8 data ); UINT8 read( offs_t offset ); @@ -89,9 +51,14 @@ public: protected: // device-level overrides + virtual void device_config_complete(); + virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; virtual void device_start(); virtual void device_reset(); + // device_memory_interface overrides + virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const; + // device_nvram_interface overrides virtual void nvram_default(); virtual void nvram_read( emu_file &file ); @@ -101,7 +68,7 @@ protected: static TIMER_CALLBACK( write_finished ); // internal state - const at28c16_device_config &m_config; + address_space_config m_space_config; emu_timer *m_write_timer; int m_a9_12v; int m_oe_12v; diff --git a/src/emu/machine/cdp1852.c b/src/emu/machine/cdp1852.c index cffeb25d374..a57253c8e24 100644 --- a/src/emu/machine/cdp1852.c +++ b/src/emu/machine/cdp1852.c @@ -11,6 +11,9 @@ #include "machine/devhelpr.h" +// device type definition +const device_type CDP1852 = &device_creator<cdp1852_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -25,46 +28,6 @@ enum //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type CDP1852 = cdp1852_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(cdp1852, "CDP1852") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void cdp1852_device_config::device_config_complete() -{ - // inherit a copy of the static data - const cdp1852_interface *intf = reinterpret_cast<const cdp1852_interface *>(static_config()); - if (intf != NULL) - *static_cast<cdp1852_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_in_mode_func, 0, sizeof(m_in_mode_func)); - memset(&m_out_sr_func, 0, sizeof(m_out_sr_func)); - memset(&m_in_data_func, 0, sizeof(m_in_data_func)); - memset(&m_out_data_func, 0, sizeof(m_out_data_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -102,24 +65,47 @@ void cdp1852_device::set_sr_line(int state) // cdp1852_device - constructor //------------------------------------------------- -cdp1852_device::cdp1852_device(running_machine &_machine, const cdp1852_device_config &config) - : device_t(_machine, config), - m_config(config) +cdp1852_device::cdp1852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, CDP1852, "CDP1852", tag, owner, clock) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void cdp1852_device::device_config_complete() +{ + // inherit a copy of the static data + const cdp1852_interface *intf = reinterpret_cast<const cdp1852_interface *>(static_config()); + if (intf != NULL) + *static_cast<cdp1852_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_in_mode_cb, 0, sizeof(m_in_mode_cb)); + memset(&m_out_sr_cb, 0, sizeof(m_out_sr_cb)); + memset(&m_in_data_cb, 0, sizeof(m_in_data_cb)); + memset(&m_out_data_cb, 0, sizeof(m_out_data_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void cdp1852_device::device_start() { // resolve callbacks - devcb_resolve_read_line(&m_in_mode_func, &m_config.m_in_mode_func, this); - devcb_resolve_write_line(&m_out_sr_func, &m_config.m_out_sr_func, this); - devcb_resolve_read8(&m_in_data_func, &m_config.m_in_data_func, this); - devcb_resolve_write8(&m_out_data_func, &m_config.m_out_data_func, this); + devcb_resolve_read_line(&m_in_mode_func, &m_in_mode_cb, this); + devcb_resolve_write_line(&m_out_sr_func, &m_out_sr_cb, this); + devcb_resolve_read8(&m_in_data_func, &m_in_data_cb, this); + devcb_resolve_write8(&m_out_data_func, &m_out_data_cb, this); // allocate timers if (clock() > 0) diff --git a/src/emu/machine/cdp1852.h b/src/emu/machine/cdp1852.h index f72ffc5ab06..6ddf7eaf8aa 100644 --- a/src/emu/machine/cdp1852.h +++ b/src/emu/machine/cdp1852.h @@ -67,51 +67,30 @@ struct cdp1852_interface { - devcb_read_line m_in_mode_func; + devcb_read_line m_in_mode_cb; - devcb_read8 m_in_data_func; - devcb_write8 m_out_data_func; + devcb_read8 m_in_data_cb; + devcb_write8 m_out_data_cb; - devcb_write_line m_out_sr_func; -}; - - -// ======================> cdp1852_device_config - -class cdp1852_device_config : public device_config, - public cdp1852_interface -{ - friend class cdp1852_device; - - // construction/destruction - cdp1852_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_sr_cb; }; // ======================> cdp1852_device -class cdp1852_device : public device_t +class cdp1852_device : public device_t, + public cdp1852_interface { - friend class cdp1852_device_config; - +public: // construction/destruction - cdp1852_device(running_machine &_machine, const cdp1852_device_config &_config); + cdp1852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -134,8 +113,6 @@ private: // timers emu_timer *m_scan_timer; - - const cdp1852_device_config &m_config; }; diff --git a/src/emu/machine/cdp1871.c b/src/emu/machine/cdp1871.c index 1acacdf25da..e7e55b537e4 100644 --- a/src/emu/machine/cdp1871.c +++ b/src/emu/machine/cdp1871.c @@ -13,6 +13,9 @@ #include "machine/devhelpr.h" +// device type definition +const device_type CDP1871 = &device_creator<cdp1871_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -84,18 +87,23 @@ static const UINT8 CDP1871_KEY_CODES[4][11][8] = //************************************************************************** -// DEVICE DEFINITIONS +// LIVE DEVICE //************************************************************************** -const device_type CDP1871 = cdp1871_device_config::static_alloc_device_config; - - +//------------------------------------------------- +// cdp1871_device - constructor +//------------------------------------------------- -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** +cdp1871_device::cdp1871_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, CDP1871, "RCA CDP1871", tag, owner, clock), + m_inhibit(false), + m_sense(0), + m_drive(0), + m_next_da(CLEAR_LINE), + m_next_rpt(CLEAR_LINE) +{ -GENERIC_DEVICE_CONFIG_SETUP(cdp1871, "RCA CDP1871") +} //------------------------------------------------- @@ -104,7 +112,7 @@ GENERIC_DEVICE_CONFIG_SETUP(cdp1871, "RCA CDP1871") // complete //------------------------------------------------- -void cdp1871_device_config::device_config_complete() +void cdp1871_device::device_config_complete() { // inherit a copy of the static data const cdp1871_interface *intf = reinterpret_cast<const cdp1871_interface *>(static_config()); @@ -114,38 +122,16 @@ void cdp1871_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&out_da_func, 0, sizeof(out_da_func)); - memset(&out_rpt_func, 0, sizeof(out_rpt_func)); - // m_in_d_func[] - memset(&in_shift_func, 0, sizeof(in_shift_func)); - memset(&in_control_func, 0, sizeof(in_control_func)); - memset(&in_alpha_func, 0, sizeof(in_alpha_func)); + memset(&out_da_cb, 0, sizeof(out_da_cb)); + memset(&out_rpt_cb, 0, sizeof(out_rpt_cb)); + // m_in_d_cb[] + memset(&in_shift_cb, 0, sizeof(in_shift_cb)); + memset(&in_control_cb, 0, sizeof(in_control_cb)); + memset(&in_alpha_cb, 0, sizeof(in_alpha_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// cdp1871_device - constructor -//------------------------------------------------- - -cdp1871_device::cdp1871_device(running_machine &_machine, const cdp1871_device_config &config) - : device_t(_machine, config), - m_inhibit(false), - m_sense(0), - m_drive(0), - m_next_da(CLEAR_LINE), - m_next_rpt(CLEAR_LINE), - m_config(config) -{ - -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -153,22 +139,22 @@ cdp1871_device::cdp1871_device(running_machine &_machine, const cdp1871_device_c void cdp1871_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_da_func, &m_config.out_da_func, this); - devcb_resolve_write_line(&m_out_rpt_func, &m_config.out_rpt_func, this); - devcb_resolve_read8(&m_in_d_func[0], &m_config.in_d1_func, this); - devcb_resolve_read8(&m_in_d_func[1], &m_config.in_d2_func, this); - devcb_resolve_read8(&m_in_d_func[2], &m_config.in_d3_func, this); - devcb_resolve_read8(&m_in_d_func[3], &m_config.in_d4_func, this); - devcb_resolve_read8(&m_in_d_func[4], &m_config.in_d5_func, this); - devcb_resolve_read8(&m_in_d_func[5], &m_config.in_d6_func, this); - devcb_resolve_read8(&m_in_d_func[6], &m_config.in_d7_func, this); - devcb_resolve_read8(&m_in_d_func[7], &m_config.in_d8_func, this); - devcb_resolve_read8(&m_in_d_func[8], &m_config.in_d9_func, this); - devcb_resolve_read8(&m_in_d_func[9], &m_config.in_d10_func, this); - devcb_resolve_read8(&m_in_d_func[10], &m_config.in_d11_func, this); - devcb_resolve_read_line(&m_in_shift_func, &m_config.in_shift_func, this); - devcb_resolve_read_line(&m_in_control_func, &m_config.in_control_func, this); - devcb_resolve_read_line(&m_in_alpha_func, &m_config.in_alpha_func, this); + devcb_resolve_write_line(&m_out_da_func, &out_da_cb, this); + devcb_resolve_write_line(&m_out_rpt_func, &out_rpt_cb, this); + devcb_resolve_read8(&m_in_d_func[0], &in_d1_cb, this); + devcb_resolve_read8(&m_in_d_func[1], &in_d2_cb, this); + devcb_resolve_read8(&m_in_d_func[2], &in_d3_cb, this); + devcb_resolve_read8(&m_in_d_func[3], &in_d4_cb, this); + devcb_resolve_read8(&m_in_d_func[4], &in_d5_cb, this); + devcb_resolve_read8(&m_in_d_func[5], &in_d6_cb, this); + devcb_resolve_read8(&m_in_d_func[6], &in_d7_cb, this); + devcb_resolve_read8(&m_in_d_func[7], &in_d8_cb, this); + devcb_resolve_read8(&m_in_d_func[8], &in_d9_cb, this); + devcb_resolve_read8(&m_in_d_func[9], &in_d10_cb, this); + devcb_resolve_read8(&m_in_d_func[10], &in_d11_cb, this); + devcb_resolve_read_line(&m_in_shift_func, &in_shift_cb, this); + devcb_resolve_read_line(&m_in_control_func, &in_control_cb, this); + devcb_resolve_read_line(&m_in_alpha_func, &in_alpha_cb, this); // set initial values change_output_lines(); diff --git a/src/emu/machine/cdp1871.h b/src/emu/machine/cdp1871.h index 6d3a7fffc6d..cc803c83821 100644 --- a/src/emu/machine/cdp1871.h +++ b/src/emu/machine/cdp1871.h @@ -67,61 +67,39 @@ struct cdp1871_interface { - devcb_read8 in_d1_func; - devcb_read8 in_d2_func; - devcb_read8 in_d3_func; - devcb_read8 in_d4_func; - devcb_read8 in_d5_func; - devcb_read8 in_d6_func; - devcb_read8 in_d7_func; - devcb_read8 in_d8_func; - devcb_read8 in_d9_func; - devcb_read8 in_d10_func; - devcb_read8 in_d11_func; - - devcb_read_line in_shift_func; - devcb_read_line in_control_func; - devcb_read_line in_alpha_func; + devcb_read8 in_d1_cb; + devcb_read8 in_d2_cb; + devcb_read8 in_d3_cb; + devcb_read8 in_d4_cb; + devcb_read8 in_d5_cb; + devcb_read8 in_d6_cb; + devcb_read8 in_d7_cb; + devcb_read8 in_d8_cb; + devcb_read8 in_d9_cb; + devcb_read8 in_d10_cb; + devcb_read8 in_d11_cb; + + devcb_read_line in_shift_cb; + devcb_read_line in_control_cb; + devcb_read_line in_alpha_cb; // this gets called for every change of the DA pin (pin 33) - devcb_write_line out_da_func; + devcb_write_line out_da_cb; // this gets called for every change of the RPT pin (pin 35) - devcb_write_line out_rpt_func; -}; - - -// ======================> cdp1871_device_config - -class cdp1871_device_config : public device_config, - public cdp1871_interface -{ - friend class cdp1871_device; - - // construction/destruction - cdp1871_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line out_rpt_cb; }; // ======================> cdp1871_device -class cdp1871_device : public device_t +class cdp1871_device : public device_t, + public cdp1871_interface { - friend class cdp1871_device_config; - +public: // construction/destruction - cdp1871_device(running_machine &_machine, const cdp1871_device_config &_config); + cdp1871_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( data_r ); DECLARE_READ_LINE_MEMBER( da_r ); @@ -129,6 +107,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -158,8 +137,6 @@ private: // timers emu_timer *m_scan_timer; // keyboard scan timer - - const cdp1871_device_config &m_config; }; diff --git a/src/emu/machine/com8116.c b/src/emu/machine/com8116.c index 228dde9cf19..b4ab56e8ee7 100644 --- a/src/emu/machine/com8116.c +++ b/src/emu/machine/com8116.c @@ -22,19 +22,20 @@ //************************************************************************** -// GLOBAL VARIABLES +// LIVE DEVICE //************************************************************************** -// devices -const device_type COM8116 = com8116_device_config::static_alloc_device_config; - - +// device type definition +const device_type COM8116 = &device_creator<com8116_device>; -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** +//------------------------------------------------- +// com8116_device - constructor +//------------------------------------------------- -GENERIC_DEVICE_CONFIG_SETUP(com8116, "COM8116") +com8116_device::com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, COM8116, "COM8116", tag, owner, clock) +{ +} //------------------------------------------------- @@ -43,7 +44,7 @@ GENERIC_DEVICE_CONFIG_SETUP(com8116, "COM8116") // complete //------------------------------------------------- -void com8116_device_config::device_config_complete() +void com8116_device::device_config_complete() { // inherit a copy of the static data const com8116_interface *intf = reinterpret_cast<const com8116_interface *>(static_config()); @@ -53,29 +54,13 @@ void com8116_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_out_fx4_func, 0, sizeof(m_out_fx4_func)); - memset(&m_out_fr_func, 0, sizeof(m_out_fr_func)); - memset(&m_out_ft_func, 0, sizeof(m_out_ft_func)); + memset(&m_out_fx4_cb, 0, sizeof(m_out_fx4_cb)); + memset(&m_out_fr_cb, 0, sizeof(m_out_fr_cb)); + memset(&m_out_ft_cb, 0, sizeof(m_out_ft_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// com8116_device - constructor -//------------------------------------------------- - -com8116_device::com8116_device(running_machine &_machine, const com8116_device_config &config) - : device_t(_machine, config), - m_config(config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -83,9 +68,9 @@ com8116_device::com8116_device(running_machine &_machine, const com8116_device_c void com8116_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_fx4_func, &m_config.m_out_fx4_func, this); - devcb_resolve_write_line(&m_out_fr_func, &m_config.m_out_fr_func, this); - devcb_resolve_write_line(&m_out_ft_func, &m_config.m_out_ft_func, this); + devcb_resolve_write_line(&m_out_fx4_func, &m_out_fx4_cb, this); + devcb_resolve_write_line(&m_out_fr_func, &m_out_fr_cb, this); + devcb_resolve_write_line(&m_out_ft_func, &m_out_ft_cb, this); // allocate timers m_fx4_timer = timer_alloc(TIMER_FX4); @@ -132,7 +117,7 @@ WRITE8_MEMBER( com8116_device::str_w ) m_fr = data & 0x0f; - m_fr_timer->adjust(attotime::zero, 0, attotime::from_hz(clock() / m_config.m_fr_divisors[m_fr] / 2)); + m_fr_timer->adjust(attotime::zero, 0, attotime::from_hz(clock() / m_fr_divisors[m_fr] / 2)); } @@ -146,5 +131,5 @@ WRITE8_MEMBER( com8116_device::stt_w ) m_ft = data & 0x0f; - m_ft_timer->adjust(attotime::zero, 0, attotime::from_hz(clock() / m_config.m_ft_divisors[m_ft] / 2)); + m_ft_timer->adjust(attotime::zero, 0, attotime::from_hz(clock() / m_ft_divisors[m_ft] / 2)); } diff --git a/src/emu/machine/com8116.h b/src/emu/machine/com8116.h index 754bd98e931..41137a5e95a 100644 --- a/src/emu/machine/com8116.h +++ b/src/emu/machine/com8116.h @@ -51,9 +51,9 @@ struct com8116_interface { - devcb_write_line m_out_fx4_func; - devcb_write_line m_out_fr_func; - devcb_write_line m_out_ft_func; + devcb_write_line m_out_fx4_cb; + devcb_write_line m_out_fr_cb; + devcb_write_line m_out_ft_cb; // receiver divisor ROM (19-bit) UINT32 m_fr_divisors[16]; @@ -63,43 +63,21 @@ struct com8116_interface }; -// ======================> com8116_device_config - -class com8116_device_config : public device_config, - public com8116_interface -{ - friend class com8116_device; - - // construction/destruction - com8116_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> com8116_device -class com8116_device : public device_t +class com8116_device : public device_t, + public com8116_interface { - friend class com8116_device_config; - +public: // construction/destruction - com8116_device(running_machine &_machine, const com8116_device_config &_config); + com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_WRITE8_MEMBER( str_w ); DECLARE_WRITE8_MEMBER( stt_w ); protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int m_param, void *ptr); @@ -119,8 +97,6 @@ private: emu_timer *m_fx4_timer; emu_timer *m_fr_timer; emu_timer *m_ft_timer; - - const com8116_device_config &m_config; }; diff --git a/src/emu/machine/devhelpr.h b/src/emu/machine/devhelpr.h index 97ee11a08d4..2593ba39b9a 100644 --- a/src/emu/machine/devhelpr.h +++ b/src/emu/machine/devhelpr.h @@ -38,35 +38,4 @@ { return downcast<devname##_device *>(device)->funcname(state); } \ void devname##_device::funcname(UINT8 state) -#define GENERIC_DEVICE_CONFIG_SETUP(devname, devtag) \ - devname##_device_config::devname##_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) \ - : device_config(mconfig, static_alloc_device_config, devtag, tag, owner, clock) \ - { } \ - \ - device_config *devname##_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) \ - { return global_alloc(devname##_device_config(mconfig, tag, owner, clock)); } \ - \ - device_t *devname##_device_config::alloc_device(running_machine &machine) const \ - { return auto_alloc(machine, devname##_device(machine, *this)); } - -#define GENERIC_DEVICE_DERIVED_CONFIG(basename, devname) \ - class devname##_device_config : public basename##_device_config \ - { \ - friend class devname##_device; \ - devname##_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); \ - public: \ - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); \ - virtual device_t *alloc_device(running_machine &machine) const; \ - }; \ - \ - class devname##_device : public basename##_device \ - { \ - friend class basename##_device; \ - friend class devname##_device_config; \ - devname##_device(running_machine &_machine, const devname##_device_config &config); \ - protected: \ - virtual void device_start(); \ - virtual void device_reset(); \ - }; - #endif // __DEVHELPR_H__ diff --git a/src/emu/machine/ds1302.c b/src/emu/machine/ds1302.c index 55f4728cdf0..1f6bd0c4d91 100644 --- a/src/emu/machine/ds1302.c +++ b/src/emu/machine/ds1302.c @@ -40,53 +40,18 @@ INLINE UINT8 convert_to_bcd(int val) ***************************************************************************/ //************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// ds1302_device_config - constructor -//------------------------------------------------- - -ds1302_device_config::ds1302_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Dallas DS1302 RTC", tag, owner, clock) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *ds1302_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(ds1302_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *ds1302_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, ds1302_device(machine, *this)); -} - - -//************************************************************************** // LIVE DEVICE //************************************************************************** -const device_type DS1302 = ds1302_device_config::static_alloc_device_config; +// device type definition +const device_type DS1302 = &device_creator<ds1302_device>; //------------------------------------------------- // ds1302_device - constructor //------------------------------------------------- -ds1302_device::ds1302_device(running_machine &_machine, const ds1302_device_config &config) - : device_t(_machine, config), - m_config(config) +ds1302_device::ds1302_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, DS1302, "Dallas DS1302 RTC", tag, owner, clock) { } diff --git a/src/emu/machine/ds1302.h b/src/emu/machine/ds1302.h index 7b97d58be65..30f53c1aa52 100644 --- a/src/emu/machine/ds1302.h +++ b/src/emu/machine/ds1302.h @@ -28,33 +28,13 @@ ***************************************************************************/ -// ======================> ds1302_device_config - -class ds1302_device_config : public device_config -{ - friend class ds1302_device; - - // construction/destruction - ds1302_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; -}; - - - // ======================> ds1302_device class ds1302_device : public device_t { - friend class ds1302_device_config; - - // construction/destruction - ds1302_device(running_machine &_machine, const ds1302_device_config &_config); - public: + // construction/destruction + ds1302_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); void ds1302_dat_w(UINT32 offset, UINT8 data); void ds1302_clk_w(UINT32 offset, UINT8 data); @@ -75,8 +55,6 @@ private: UINT8 m_last_clk; UINT8 m_last_cmd; UINT8 m_sram[0x20]; - - const ds1302_device_config &m_config; }; diff --git a/src/emu/machine/ds2401.c b/src/emu/machine/ds2401.c index c3bee02b0e0..f0e9e5ce33c 100644 --- a/src/emu/machine/ds2401.c +++ b/src/emu/machine/ds2401.c @@ -20,30 +20,15 @@ inline void ATTR_PRINTF(3,4) ds2401_device::verboselog(int n_level, const char * va_start(v, s_fmt); vsprintf(buf, s_fmt, v); va_end(v); - logerror("ds2401 %s %s: %s", config.tag(), machine().describe_context(), buf); + logerror("ds2401 %s %s: %s", tag(), machine().describe_context(), buf); } } -const device_type DS2401 = ds2401_device_config::static_alloc_device_config; +// device type definition +const device_type DS2401 = &device_creator<ds2401_device>; -ds2401_device_config::ds2401_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "DS2401", tag, owner, clock) -{ -} - -device_config *ds2401_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(ds2401_device_config(mconfig, tag, owner, clock)); -} - -device_t *ds2401_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, ds2401_device(machine, *this)); -} - -ds2401_device::ds2401_device(running_machine &_machine, const ds2401_device_config &_config) - : device_t(_machine, _config), - config(_config) +ds2401_device::ds2401_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, DS2401, "DS2401", tag, owner, clock) { } @@ -80,7 +65,7 @@ void ds2401_device::device_reset() // Ensure the size is correct though if(m_region->bytes() != SIZE_DATA) logerror("ds2401 %s: Wrong region length for id data, expected 0x%x, got 0x%x\n", - config.tag(), + tag(), SIZE_DATA, m_region->bytes()); else { @@ -92,7 +77,7 @@ void ds2401_device::device_reset() // That chip is useless without an id, so bitch if there // isn't one - logerror("ds2401 %s: Warning, no id provided, answer will be all zeroes.\n", config.tag()); + logerror("ds2401 %s: Warning, no id provided, answer will be all zeroes.\n", tag()); memset(data, 0, SIZE_DATA); } diff --git a/src/emu/machine/ds2401.h b/src/emu/machine/ds2401.h index e1b79962d03..353735899f7 100644 --- a/src/emu/machine/ds2401.h +++ b/src/emu/machine/ds2401.h @@ -14,27 +14,12 @@ #include "emu.h" -class ds2401_device_config : public device_config -{ - friend class ds2401_device; - - // construction/destruction - ds2401_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; -}; - class ds2401_device : public device_t { - friend class ds2401_device_config; - +public: // construction/destruction - ds2401_device(running_machine &_machine, const ds2401_device_config &config); + ds2401_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: void write(bool line); bool read(); UINT8 direct_read(int index); @@ -66,8 +51,6 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // internal state - const ds2401_device_config &config; - int state, bit, shift; UINT8 byte; bool rx, tx; diff --git a/src/emu/machine/ds2404.c b/src/emu/machine/ds2404.c index 4c4c43fedc2..8ce9c29c900 100644 --- a/src/emu/machine/ds2404.c +++ b/src/emu/machine/ds2404.c @@ -11,43 +11,22 @@ #include <time.h> #include "devhelpr.h" -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// ds2404_device_config - constructor -//------------------------------------------------- - -ds2404_device_config::ds2404_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "DS2404", tag, owner, clock), - device_config_nvram_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *ds2404_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(ds2404_device_config(mconfig, tag, owner, clock)); -} - +// device type definition +const device_type DS2404 = &device_creator<ds2404_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// ds2404_device - constructor //------------------------------------------------- -device_t *ds2404_device_config::alloc_device(running_machine &machine) const +ds2404_device::ds2404_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, DS2404, "DS2404", tag, owner, clock), + device_nvram_interface(mconfig, *this) { - return auto_alloc(machine, ds2404_device(machine, *this)); } @@ -56,10 +35,10 @@ device_t *ds2404_device_config::alloc_device(running_machine &machine) const // to set the reference year //------------------------------------------------- -void ds2404_device_config::static_set_ref_year(device_config *device, UINT32 year) +void ds2404_device::static_set_ref_year(device_t &device, UINT32 year) { - ds2404_device_config *ds2404 = downcast<ds2404_device_config *>(device); - ds2404->m_ref_year = year; + ds2404_device &ds2404 = downcast<ds2404_device &>(device); + ds2404.m_ref_year = year; } @@ -68,10 +47,10 @@ void ds2404_device_config::static_set_ref_year(device_config *device, UINT32 yea // to set the reference month //------------------------------------------------- -void ds2404_device_config::static_set_ref_month(device_config *device, UINT8 month) +void ds2404_device::static_set_ref_month(device_t &device, UINT8 month) { - ds2404_device_config *ds2404 = downcast<ds2404_device_config *>(device); - ds2404->m_ref_month = month; + ds2404_device &ds2404 = downcast<ds2404_device &>(device); + ds2404.m_ref_month = month; } @@ -80,30 +59,13 @@ void ds2404_device_config::static_set_ref_month(device_config *device, UINT8 mon // to set the reference day //------------------------------------------------- -void ds2404_device_config::static_set_ref_day(device_config *device, UINT8 day) +void ds2404_device::static_set_ref_day(device_t &device, UINT8 day) { - ds2404_device_config *ds2404 = downcast<ds2404_device_config *>(device); - ds2404->m_ref_day = day; + ds2404_device &ds2404 = downcast<ds2404_device &>(device); + ds2404.m_ref_day = day; } -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type DS2404 = ds2404_device_config::static_alloc_device_config; - -//------------------------------------------------- -// ds2404_device - constructor -//------------------------------------------------- - -ds2404_device::ds2404_device(running_machine &_machine, const ds2404_device_config &config) - : device_t(_machine, config), - device_nvram_interface(_machine, config, *this), - m_config(config) -{ -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -113,9 +75,9 @@ void ds2404_device::device_start() struct tm ref_tm; memset(&ref_tm, 0, sizeof(ref_tm)); - ref_tm.tm_year = m_config.m_ref_year - 1900; - ref_tm.tm_mon = m_config.m_ref_month - 1; - ref_tm.tm_mday = m_config.m_ref_day; + ref_tm.tm_year = m_ref_year - 1900; + ref_tm.tm_mon = m_ref_month - 1; + ref_tm.tm_mday = m_ref_day; time_t ref_time = mktime(&ref_tm); diff --git a/src/emu/machine/ds2404.h b/src/emu/machine/ds2404.h index 60f508e6dcd..8f28e2164c4 100644 --- a/src/emu/machine/ds2404.h +++ b/src/emu/machine/ds2404.h @@ -24,62 +24,33 @@ MCFG_DS2404_REF_DAY(_ref_day) #define MCFG_DS2404_REF_YEAR(_ref_year) \ - ds2404_device_config::static_set_ref_year(device, _ref_year); + ds2404_device::static_set_ref_year(*device, _ref_year); #define MCFG_DS2404_REF_MONTH(_ref_month) \ - ds2404_device_config::static_set_ref_month(device, _ref_month); + ds2404_device::static_set_ref_month(*device, _ref_month); #define MCFG_DS2404_REF_DAY(_ref_day) \ - ds2404_device_config::static_set_ref_day(device, _ref_day); + ds2404_device::static_set_ref_day(*device, _ref_day); -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -// ======================> ds2404_device_config - -class ds2404_device_config : public device_config, - public device_config_nvram_interface -{ - friend class ds2404_device; - - // construction/destruction - ds2404_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - - // inline configuration helpers - static void static_set_ref_year(device_config *device, UINT32 m_ref_year); - static void static_set_ref_month(device_config *device, UINT8 m_ref_month); - static void static_set_ref_day(device_config *device, UINT8 m_ref_day); - -protected: - // internal state goes here - UINT32 m_ref_year; - UINT8 m_ref_month; - UINT8 m_ref_day; -}; - - // ======================> ds2404_device class ds2404_device : public device_t, public device_nvram_interface { - friend class ds2404_device_config; - +public: // construction/destruction - ds2404_device(running_machine &_machine, const ds2404_device_config &_config); + ds2404_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: + // inline configuration helpers + static void static_set_ref_year(device_t &device, UINT32 m_ref_year); + static void static_set_ref_month(device_t &device, UINT8 m_ref_month); + static void static_set_ref_day(device_t &device, UINT8 m_ref_day); /* 1-wire interface reset */ void ds2404_1w_reset_w(UINT32 offset, UINT8 data); @@ -129,6 +100,11 @@ private: DS2404_STATE_COPY_SCRATCHPAD /* Copy Scratchpad command active */ }; + // configuration state + UINT32 m_ref_year; + UINT8 m_ref_month; + UINT8 m_ref_day; + UINT16 m_address; UINT16 m_offset; UINT16 m_end_offset; @@ -139,8 +115,6 @@ private: UINT8 m_rtc[5]; /* 40-bit RTC counter */ DS2404_STATE m_state[8]; int m_state_ptr; - - const ds2404_device_config &m_config; }; diff --git a/src/emu/machine/e0516.c b/src/emu/machine/e0516.c index a686d9cd959..dcfeab3b0ad 100644 --- a/src/emu/machine/e0516.c +++ b/src/emu/machine/e0516.c @@ -41,51 +41,6 @@ enum }; - -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type E0516 = e0516_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// e0516_device_config - constructor -//------------------------------------------------- - -e0516_device_config::e0516_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "E05-16", tag, owner, clock), - device_config_rtc_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *e0516_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(e0516_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *e0516_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, e0516_device(machine, *this)); -} - - //************************************************************************** // INLINE HELPERS //************************************************************************** @@ -141,14 +96,16 @@ inline void e0516_device::advance_seconds() // LIVE DEVICE //************************************************************************** +// device type definition +const device_type E0516 = &device_creator<e0516_device>; + //------------------------------------------------- // e0516_device - constructor //------------------------------------------------- -e0516_device::e0516_device(running_machine &_machine, const e0516_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), - m_config(config) +e0516_device::e0516_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, E0516, "E05-16", tag, owner, clock), + device_rtc_interface(mconfig, *this) { } diff --git a/src/emu/machine/e0516.h b/src/emu/machine/e0516.h index 9ebce2e92ce..ea2c04da29b 100644 --- a/src/emu/machine/e0516.h +++ b/src/emu/machine/e0516.h @@ -41,36 +41,15 @@ //************************************************************************** -// ======================> e0516_device_config - -class e0516_device_config : public device_config, - public device_config_rtc_interface -{ - friend class e0516_device; - - // construction/destruction - e0516_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: -}; - - // ======================> e0516_device class e0516_device : public device_t, public device_rtc_interface { - friend class e0516_device_config; - +public: // construction/destruction - e0516_device(running_machine &_machine, const e0516_device_config &_config); + e0516_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_WRITE_LINE_MEMBER( cs_w ); DECLARE_WRITE_LINE_MEMBER( clk_w ); DECLARE_WRITE_LINE_MEMBER( dio_w ); @@ -102,8 +81,6 @@ private: // timers emu_timer *m_timer; - - const e0516_device_config &m_config; }; diff --git a/src/emu/machine/eeprom.c b/src/emu/machine/eeprom.c index 14cfbefa011..ee4b836db5c 100644 --- a/src/emu/machine/eeprom.c +++ b/src/emu/machine/eeprom.c @@ -24,7 +24,8 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type EEPROM = eeprom_device_config::static_alloc_device_config; +// device type definition +const device_type EEPROM = &device_creator<eeprom_device>; const eeprom_interface eeprom_interface_93C46 = { @@ -69,42 +70,31 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** //------------------------------------------------- -// eeprom_device_config - constructor +// eeprom_device - constructor //------------------------------------------------- -eeprom_device_config::eeprom_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "EEPROM", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this), +eeprom_device::eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, EEPROM, "EEPROM", tag, owner, clock), + device_memory_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), m_default_data_size(0), - m_default_value(0) + m_default_value(0), + m_serial_count(0), + m_read_address(0), + m_clock_count(0), + m_latch(0), + m_reset_line(CLEAR_LINE), + m_clock_line(CLEAR_LINE), + m_sending(0), + m_locked(false), + m_reset_delay(0) { m_default_data.u8 = NULL; -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *eeprom_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(eeprom_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *eeprom_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, eeprom_device(machine, *this)); + memset(downcast<eeprom_interface *>(this), 0, sizeof(eeprom_interface)); } @@ -113,16 +103,16 @@ device_t *eeprom_device_config::alloc_device(running_machine &machine) const // to set the interface //------------------------------------------------- -void eeprom_device_config::static_set_interface(device_config *device, const eeprom_interface &interface) +void eeprom_device::static_set_interface(device_t &device, const eeprom_interface &interface) { - eeprom_device_config *eeprom = downcast<eeprom_device_config *>(device); - *static_cast<eeprom_interface *>(eeprom) = interface; + eeprom_device &eeprom = downcast<eeprom_device &>(device); + static_cast<eeprom_interface &>(eeprom) = interface; // describe our address space - if (eeprom->m_data_bits == 8) - eeprom->m_space_config = address_space_config("eeprom", ENDIANNESS_BIG, 8, eeprom->m_address_bits, 0, *ADDRESS_MAP_NAME(eeprom_map8)); + if (eeprom.m_data_bits == 8) + eeprom.m_space_config = address_space_config("eeprom", ENDIANNESS_BIG, 8, eeprom.m_address_bits, 0, *ADDRESS_MAP_NAME(eeprom_map8)); else - eeprom->m_space_config = address_space_config("eeprom", ENDIANNESS_BIG, 16, eeprom->m_address_bits * 2, 0, *ADDRESS_MAP_NAME(eeprom_map16)); + eeprom.m_space_config = address_space_config("eeprom", ENDIANNESS_BIG, 16, eeprom.m_address_bits * 2, 0, *ADDRESS_MAP_NAME(eeprom_map16)); } @@ -131,20 +121,20 @@ void eeprom_device_config::static_set_interface(device_config *device, const eep // to set the default data //------------------------------------------------- -void eeprom_device_config::static_set_default_data(device_config *device, const UINT8 *data, UINT32 size) +void eeprom_device::static_set_default_data(device_t &device, const UINT8 *data, UINT32 size) { - eeprom_device_config *eeprom = downcast<eeprom_device_config *>(device); - assert(eeprom->m_data_bits == 8); - eeprom->m_default_data.u8 = const_cast<UINT8 *>(data); - eeprom->m_default_data_size = size; + eeprom_device &eeprom = downcast<eeprom_device &>(device); + assert(eeprom.m_data_bits == 8); + eeprom.m_default_data.u8 = const_cast<UINT8 *>(data); + eeprom.m_default_data_size = size; } -void eeprom_device_config::static_set_default_data(device_config *device, const UINT16 *data, UINT32 size) +void eeprom_device::static_set_default_data(device_t &device, const UINT16 *data, UINT32 size) { - eeprom_device_config *eeprom = downcast<eeprom_device_config *>(device); - assert(eeprom->m_data_bits == 16); - eeprom->m_default_data.u16 = const_cast<UINT16 *>(data); - eeprom->m_default_data_size = size / 2; + eeprom_device &eeprom = downcast<eeprom_device &>(device); + assert(eeprom.m_data_bits == 16); + eeprom.m_default_data.u16 = const_cast<UINT16 *>(data); + eeprom.m_default_data_size = size / 2; } @@ -153,9 +143,9 @@ void eeprom_device_config::static_set_default_data(device_config *device, const // to set the default value //------------------------------------------------- -void eeprom_device_config::static_set_default_value(device_config *device, UINT16 value) +void eeprom_device::static_set_default_value(device_t &device, UINT16 value) { - downcast<eeprom_device_config *>(device)->m_default_value = 0x10000 | value; + downcast<eeprom_device &>(device).m_default_value = 0x10000 | value; } @@ -164,7 +154,7 @@ void eeprom_device_config::static_set_default_value(device_config *device, UINT1 // on this device //------------------------------------------------- -bool eeprom_device_config::device_validity_check(emu_options &options, const game_driver &driver) const +bool eeprom_device::device_validity_check(emu_options &options, const game_driver &driver) const { bool error = false; @@ -179,50 +169,13 @@ bool eeprom_device_config::device_validity_check(emu_options &options, const gam //------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- - -const address_space_config *eeprom_device_config::memory_space_config(address_spacenum spacenum) const -{ - return (spacenum == 0) ? &m_space_config : NULL; -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// eeprom_device - constructor -//------------------------------------------------- - -eeprom_device::eeprom_device(running_machine &_machine, const eeprom_device_config &config) - : device_t(_machine, config), - device_memory_interface(_machine, config, *this), - device_nvram_interface(_machine, config, *this), - m_config(config), - m_serial_count(0), - m_data_bits(0), - m_read_address(0), - m_clock_count(0), - m_latch(0), - m_reset_line(CLEAR_LINE), - m_clock_line(CLEAR_LINE), - m_sending(0), - m_locked(m_config.m_cmd_unlock != NULL), - m_reset_delay(0) -{ -} - - -//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void eeprom_device::device_start() { + m_locked = (m_cmd_unlock != NULL); + save_pointer(NAME(m_serial_buffer), SERIAL_BUFFER_LENGTH); save_item(NAME(m_clock_line)); save_item(NAME(m_reset_line)); @@ -246,45 +199,56 @@ void eeprom_device::device_reset() //------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *eeprom_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == 0) ? &m_space_config : NULL; +} + + +//------------------------------------------------- // nvram_default - called to initialize NVRAM to // its default state //------------------------------------------------- void eeprom_device::nvram_default() { - UINT32 eeprom_length = 1 << m_config.m_address_bits; - UINT32 eeprom_bytes = eeprom_length * m_config.m_data_bits / 8; + UINT32 eeprom_length = 1 << m_address_bits; + UINT32 eeprom_bytes = eeprom_length * m_data_bits / 8; /* initialize to the default value */ UINT16 default_value = 0xffff; - if (m_config.m_default_value != 0) - default_value = m_config.m_default_value; + if (m_default_value != 0) + default_value = m_default_value; for (offs_t offs = 0; offs < eeprom_length; offs++) - if (m_config.m_data_bits == 8) + if (m_data_bits == 8) m_addrspace[0]->write_byte(offs, default_value); else m_addrspace[0]->write_word(offs * 2, default_value); /* handle hard-coded data from the driver */ - if (m_config.m_default_data.u8 != NULL) - for (offs_t offs = 0; offs < m_config.m_default_data_size; offs++) - if (m_config.m_data_bits == 8) - m_addrspace[0]->write_byte(offs, m_config.m_default_data.u8[offs]); + if (m_default_data.u8 != NULL) + for (offs_t offs = 0; offs < m_default_data_size; offs++) + if (m_data_bits == 8) + m_addrspace[0]->write_byte(offs, m_default_data.u8[offs]); else - m_addrspace[0]->write_word(offs * 2, m_config.m_default_data.u16[offs]); + m_addrspace[0]->write_word(offs * 2, m_default_data.u16[offs]); /* populate from a memory region if present */ if (m_region != NULL) { if (m_region->bytes() != eeprom_bytes) fatalerror("eeprom region '%s' wrong size (expected size = 0x%X)", tag(), eeprom_bytes); - if (m_config.m_data_bits == 8 && m_region->width() != 1) + if (m_data_bits == 8 && m_region->width() != 1) fatalerror("eeprom region '%s' needs to be an 8-bit region", tag()); - if (m_config.m_data_bits == 16 && (m_region->width() != 2 || m_region->endianness() != ENDIANNESS_BIG)) + if (m_data_bits == 16 && (m_region->width() != 2 || m_region->endianness() != ENDIANNESS_BIG)) fatalerror("eeprom region '%s' needs to be a 16-bit big-endian region", tag()); for (offs_t offs = 0; offs < eeprom_length; offs++) - if (m_config.m_data_bits == 8) + if (m_data_bits == 8) m_addrspace[0]->write_byte(offs, m_region->u8(offs)); else m_addrspace[0]->write_word(offs * 2, m_region->u16(offs)); @@ -299,8 +263,8 @@ void eeprom_device::nvram_default() void eeprom_device::nvram_read(emu_file &file) { - UINT32 eeprom_length = 1 << m_config.m_address_bits; - UINT32 eeprom_bytes = eeprom_length * m_config.m_data_bits / 8; + UINT32 eeprom_length = 1 << m_address_bits; + UINT32 eeprom_bytes = eeprom_length * m_data_bits / 8; UINT8 *buffer = auto_alloc_array(machine(), UINT8, eeprom_bytes); file.read(buffer, eeprom_bytes); @@ -317,8 +281,8 @@ void eeprom_device::nvram_read(emu_file &file) void eeprom_device::nvram_write(emu_file &file) { - UINT32 eeprom_length = 1 << m_config.m_address_bits; - UINT32 eeprom_bytes = eeprom_length * m_config.m_data_bits / 8; + UINT32 eeprom_length = 1 << m_address_bits; + UINT32 eeprom_bytes = eeprom_length * m_data_bits / 8; UINT8 *buffer = auto_alloc_array(machine(), UINT8, eeprom_bytes); for (offs_t offs = 0; offs < eeprom_bytes; offs++) @@ -355,7 +319,7 @@ int eeprom_device::read_bit() int res; if (m_sending) - res = (m_data_bits >> m_config.m_data_bits) & 1; + res = (m_data_bits >> m_data_bits) & 1; else { if (m_reset_delay > 0) @@ -392,7 +356,7 @@ void eeprom_device::set_cs_line(int state) m_serial_count = 0; m_sending = 0; - m_reset_delay = m_config.m_reset_delay; /* delay a little before returning setting data to 1 (needed by wbeachvl) */ + m_reset_delay = m_reset_delay; /* delay a little before returning setting data to 1 (needed by wbeachvl) */ } } @@ -412,10 +376,10 @@ void eeprom_device::set_clock_line(int state) { if (m_sending) { - if (m_clock_count == m_config.m_data_bits && m_config.m_enable_multi_read) + if (m_clock_count == m_data_bits && m_enable_multi_read) { - m_read_address = (m_read_address + 1) & ((1 << m_config.m_address_bits) - 1); - if (m_config.m_data_bits == 16) + m_read_address = (m_read_address + 1) & ((1 << m_address_bits) - 1); + if (m_data_bits == 16) m_data_bits = m_addrspace[0]->read_word(m_read_address * 2); else m_data_bits = m_addrspace[0]->read_byte(m_read_address); @@ -452,18 +416,18 @@ void eeprom_device::write(int bit) m_serial_buffer[m_serial_count++] = (bit ? '1' : '0'); m_serial_buffer[m_serial_count] = 0; /* nul terminate so we can treat it as a string */ - if ( (m_serial_count > m_config.m_address_bits) && - command_match((char*)(m_serial_buffer),m_config.m_cmd_read,strlen((char*)(m_serial_buffer))-m_config.m_address_bits) ) + if ( (m_serial_count > m_address_bits) && + command_match((char*)(m_serial_buffer),m_cmd_read,strlen((char*)(m_serial_buffer))-m_address_bits) ) { int i,address; address = 0; - for (i = m_serial_count-m_config.m_address_bits;i < m_serial_count;i++) + for (i = m_serial_count-m_address_bits;i < m_serial_count;i++) { address <<= 1; if (m_serial_buffer[i] == '1') address |= 1; } - if (m_config.m_data_bits == 16) + if (m_data_bits == 16) m_data_bits = m_addrspace[0]->read_word(address * 2); else m_data_bits = m_addrspace[0]->read_byte(address); @@ -473,13 +437,13 @@ void eeprom_device::write(int bit) m_serial_count = 0; logerror("EEPROM read %04x from address %02x\n",m_data_bits,address); } - else if ( (m_serial_count > m_config.m_address_bits) && - command_match((char*)(m_serial_buffer),m_config.m_cmd_erase,strlen((char*)(m_serial_buffer))-m_config.m_address_bits) ) + else if ( (m_serial_count > m_address_bits) && + command_match((char*)(m_serial_buffer),m_cmd_erase,strlen((char*)(m_serial_buffer))-m_address_bits) ) { int i,address; address = 0; - for (i = m_serial_count-m_config.m_address_bits;i < m_serial_count;i++) + for (i = m_serial_count-m_address_bits;i < m_serial_count;i++) { address <<= 1; if (m_serial_buffer[i] == '1') address |= 1; @@ -487,7 +451,7 @@ logerror("EEPROM read %04x from address %02x\n",m_data_bits,address); logerror("EEPROM erase address %02x\n",address); if (m_locked == 0) { - if (m_config.m_data_bits == 16) + if (m_data_bits == 16) m_addrspace[0]->write_word(address * 2, 0x0000); else m_addrspace[0]->write_byte(address, 0x00); @@ -496,19 +460,19 @@ logerror("EEPROM erase address %02x\n",address); logerror("Error: EEPROM is m_locked\n"); m_serial_count = 0; } - else if ( (m_serial_count > (m_config.m_address_bits + m_config.m_data_bits)) && - command_match((char*)(m_serial_buffer),m_config.m_cmd_write,strlen((char*)(m_serial_buffer))-(m_config.m_address_bits + m_config.m_data_bits)) ) + else if ( (m_serial_count > (m_address_bits + m_data_bits)) && + command_match((char*)(m_serial_buffer),m_cmd_write,strlen((char*)(m_serial_buffer))-(m_address_bits + m_data_bits)) ) { int i,address,data; address = 0; - for (i = m_serial_count-m_config.m_data_bits-m_config.m_address_bits;i < (m_serial_count-m_config.m_data_bits);i++) + for (i = m_serial_count-m_data_bits-m_address_bits;i < (m_serial_count-m_data_bits);i++) { address <<= 1; if (m_serial_buffer[i] == '1') address |= 1; } data = 0; - for (i = m_serial_count-m_config.m_data_bits;i < m_serial_count;i++) + for (i = m_serial_count-m_data_bits;i < m_serial_count;i++) { data <<= 1; if (m_serial_buffer[i] == '1') data |= 1; @@ -516,7 +480,7 @@ logerror("Error: EEPROM is m_locked\n"); logerror("EEPROM write %04x to address %02x\n",data,address); if (m_locked == 0) { - if (m_config.m_data_bits == 16) + if (m_data_bits == 16) m_addrspace[0]->write_word(address * 2, data); else m_addrspace[0]->write_byte(address, data); @@ -525,13 +489,13 @@ logerror("EEPROM write %04x to address %02x\n",data,address); logerror("Error: EEPROM is m_locked\n"); m_serial_count = 0; } - else if ( command_match((char*)(m_serial_buffer),m_config.m_cmd_lock,strlen((char*)(m_serial_buffer))) ) + else if ( command_match((char*)(m_serial_buffer),m_cmd_lock,strlen((char*)(m_serial_buffer))) ) { logerror("EEPROM lock\n"); m_locked = 1; m_serial_count = 0; } - else if ( command_match((char*)(m_serial_buffer),m_config.m_cmd_unlock,strlen((char*)(m_serial_buffer))) ) + else if ( command_match((char*)(m_serial_buffer),m_cmd_unlock,strlen((char*)(m_serial_buffer))) ) { logerror("EEPROM unlock\n"); m_locked = 0; diff --git a/src/emu/machine/eeprom.h b/src/emu/machine/eeprom.h index 3a59d3c3c46..b64aa5c28d9 100644 --- a/src/emu/machine/eeprom.h +++ b/src/emu/machine/eeprom.h @@ -19,7 +19,7 @@ #define MCFG_EEPROM_ADD(_tag, _interface) \ MCFG_DEVICE_ADD(_tag, EEPROM, 0) \ - eeprom_device_config::static_set_interface(device, _interface); \ + eeprom_device::static_set_interface(*device, _interface); \ #define MCFG_EEPROM_93C46_ADD(_tag) \ MCFG_EEPROM_ADD(_tag, eeprom_interface_93C46) @@ -28,10 +28,10 @@ MCFG_EEPROM_ADD(_tag, eeprom_interface_93C66B) #define MCFG_EEPROM_DATA(_data, _size) \ - eeprom_device_config::static_set_default_data(device, _data, _size); \ + eeprom_device::static_set_default_data(*device, _data, _size); \ #define MCFG_EEPROM_DEFAULT_VALUE(_value) \ - eeprom_device_config::static_set_default_value(device, _value); \ + eeprom_device::static_set_default_value(*device, _value); \ @@ -58,58 +58,23 @@ struct eeprom_interface -// ======================> eeprom_device_config - -class eeprom_device_config : public device_config, - public device_config_memory_interface, - public device_config_nvram_interface, - public eeprom_interface -{ - friend class eeprom_device; - - // construction/destruction - eeprom_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - - // inline configuration helpers - static void static_set_interface(device_config *deviec, const eeprom_interface &interface); - static void static_set_default_data(device_config *device, const UINT8 *data, UINT32 size); - static void static_set_default_data(device_config *device, const UINT16 *data, UINT32 size); - static void static_set_default_value(device_config *device, UINT16 value); - -protected: - // device_config overrides - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; - - // device-specific configuration - address_space_config m_space_config; - - // internal state - generic_ptr m_default_data; - int m_default_data_size; - UINT32 m_default_value; -}; - - // ======================> eeprom_device class eeprom_device : public device_t, public device_memory_interface, - public device_nvram_interface + public device_nvram_interface, + public eeprom_interface { - friend class eeprom_device_config; - +public: // construction/destruction - eeprom_device(running_machine &_machine, const eeprom_device_config &config); + eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // inline configuration helpers + static void static_set_interface(device_t &device, const eeprom_interface &interface); + static void static_set_default_data(device_t &device, const UINT8 *data, UINT32 size); + static void static_set_default_data(device_t &device, const UINT16 *data, UINT32 size); + static void static_set_default_value(device_t &device, UINT16 value); -public: // I/O operations void write_bit(int state); int read_bit(); @@ -118,9 +83,13 @@ public: protected: // device-level overrides + virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; virtual void device_start(); virtual void device_reset(); + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + // device_nvram_interface overrides virtual void nvram_default(); virtual void nvram_read(emu_file &file); @@ -132,20 +101,23 @@ protected: static const int SERIAL_BUFFER_LENGTH = 40; - // internal state - const eeprom_device_config &m_config; - - int m_serial_count; - UINT8 m_serial_buffer[SERIAL_BUFFER_LENGTH]; - int m_data_bits; - int m_read_address; - int m_clock_count; - int m_latch; - int m_reset_line; - int m_clock_line; - int m_sending; - int m_locked; - int m_reset_delay; + // configuration state + address_space_config m_space_config; + generic_ptr m_default_data; + int m_default_data_size; + UINT32 m_default_value; + + // runtime state + int m_serial_count; + UINT8 m_serial_buffer[SERIAL_BUFFER_LENGTH]; + int m_read_address; + int m_clock_count; + int m_latch; + int m_reset_line; + int m_clock_line; + int m_sending; + int m_locked; + int m_reset_delay; }; @@ -154,7 +126,6 @@ extern const device_type EEPROM; - //************************************************************************** // GLOBAL VARIABLES //************************************************************************** diff --git a/src/emu/machine/er2055.c b/src/emu/machine/er2055.c index ddf735fe3a0..a4e336e83ab 100644 --- a/src/emu/machine/er2055.c +++ b/src/emu/machine/er2055.c @@ -45,7 +45,8 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type ER2055 = er2055_device_config::static_alloc_device_config; +// device type definition +const device_type ER2055 = &device_creator<er2055_device>; static ADDRESS_MAP_START( er2055_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x003f) AM_RAM @@ -54,56 +55,6 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// er2055_device_config - constructor -//------------------------------------------------- - -er2055_device_config::er2055_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "ER2055", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this), - m_space_config("EAROM", ENDIANNESS_BIG, 8, 6, 0, *ADDRESS_MAP_NAME(er2055_map)) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *er2055_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(er2055_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *er2055_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, er2055_device(machine, *this)); -} - - -//------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- - -const address_space_config *er2055_device_config::memory_space_config(address_spacenum spacenum) const -{ - return (spacenum == 0) ? &m_space_config : NULL; -} - - - -//************************************************************************** // LIVE DEVICE //************************************************************************** @@ -111,11 +62,11 @@ const address_space_config *er2055_device_config::memory_space_config(address_sp // er2055_device - constructor //------------------------------------------------- -er2055_device::er2055_device(running_machine &_machine, const er2055_device_config &config) - : device_t(_machine, config), - device_memory_interface(_machine, config, *this), - device_nvram_interface(_machine, config, *this), - m_config(config), +er2055_device::er2055_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, ER2055, "ER2055", tag, owner, clock), + device_memory_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), + m_space_config("EAROM", ENDIANNESS_BIG, 8, 6, 0, *ADDRESS_MAP_NAME(er2055_map)), m_control_state(0), m_address(0), m_data(0) @@ -138,6 +89,17 @@ void er2055_device::device_start() //------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *er2055_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == 0) ? &m_space_config : NULL; +} + + +//------------------------------------------------- // nvram_default - called to initialize NVRAM to // its default state //------------------------------------------------- diff --git a/src/emu/machine/er2055.h b/src/emu/machine/er2055.h index 833b43918e4..f47b503d57c 100644 --- a/src/emu/machine/er2055.h +++ b/src/emu/machine/er2055.h @@ -58,43 +58,16 @@ //************************************************************************** -// ======================> er2055_device_config - -class er2055_device_config : public device_config, - public device_config_memory_interface, - public device_config_nvram_interface -{ - friend class er2055_device; - - // construction/destruction - er2055_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; - - // device-specific configuration - address_space_config m_space_config; -}; - - // ======================> er2055_device class er2055_device : public device_t, public device_memory_interface, public device_nvram_interface { - friend class er2055_device_config; - +public: // construction/destruction - er2055_device(running_machine &_machine, const er2055_device_config &config); + er2055_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: // I/O operations UINT8 data() const { return m_data; } void set_address(UINT8 address) { m_address = address & 0x3f; } @@ -107,6 +80,9 @@ protected: // device-level overrides virtual void device_start(); + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + // device_nvram_interface overrides virtual void nvram_default(); virtual void nvram_read(emu_file &file); @@ -120,9 +96,10 @@ protected: static const UINT8 CS1 = 0x08; static const UINT8 CS2 = 0x10; - // internal state - const er2055_device_config &m_config; + // configuration state + address_space_config m_space_config; + // internal state UINT8 m_control_state; UINT8 m_address; UINT8 m_data; diff --git a/src/emu/machine/f3853.c b/src/emu/machine/f3853.c index 19ff8f563ea..993028d4595 100644 --- a/src/emu/machine/f3853.c +++ b/src/emu/machine/f3853.c @@ -38,37 +38,20 @@ ***************************************************************************/ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// f3853_device_config - constructor -//------------------------------------------------- - -f3853_device_config::f3853_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "F3853", tag, owner, clock) -{ -} - +// device type definition +const device_type F3853 = &device_creator<f3853_device>; //------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object +// f3853_device - constructor //------------------------------------------------- -device_config *f3853_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) +f3853_device::f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, F3853, "F3853", tag, owner, clock) { - return global_alloc(f3853_device_config(mconfig, tag, owner, clock)); -} - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *f3853_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, f3853_device(machine, *this)); } @@ -78,7 +61,7 @@ device_t *f3853_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void f3853_device_config::device_config_complete() +void f3853_device::device_config_complete() { // inherit a copy of the static data const f3853_interface *intf = reinterpret_cast<const f3853_interface *>(static_config()); @@ -95,24 +78,6 @@ void f3853_device_config::device_config_complete() } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type F3853 = f3853_device_config::static_alloc_device_config; - -//------------------------------------------------- -// f3853_device - constructor -//------------------------------------------------- - -f3853_device::f3853_device(running_machine &_machine, const f3853_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -166,22 +131,22 @@ void f3853_device::device_reset() void f3853_device::f3853_set_interrupt_request_line() { - if(!m_config.m_interrupt_request) + if(!m_interrupt_request) { return; } if(m_external_enable && !m_priority_line) { - m_config.m_interrupt_request(this, INTERRUPT_VECTOR(TRUE), TRUE); + m_interrupt_request(this, INTERRUPT_VECTOR(TRUE), TRUE); } else if( m_timer_enable && !m_priority_line && m_request_flipflop) { - m_config.m_interrupt_request(this, INTERRUPT_VECTOR(FALSE), TRUE); + m_interrupt_request(this, INTERRUPT_VECTOR(FALSE), TRUE); } else { - m_config.m_interrupt_request(this, 0, FALSE); + m_interrupt_request(this, 0, FALSE); } } diff --git a/src/emu/machine/f3853.h b/src/emu/machine/f3853.h index cc0cb3b427e..9ee50c68c13 100644 --- a/src/emu/machine/f3853.h +++ b/src/emu/machine/f3853.h @@ -64,37 +64,14 @@ struct f3853_interface }; -// ======================> f3853_device_config - -class f3853_device_config : public device_config, - public f3853_interface -{ - friend class f3853_device; - - // construction/destruction - f3853_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - // ======================> f3853_device -class f3853_device : public device_t +class f3853_device : public device_t, + public f3853_interface { - friend class f3853_device_config; - - // construction/destruction - f3853_device(running_machine &_machine, const f3853_device_config &_config); - public: + // construction/destruction + f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); UINT8 f3853_r(UINT32 offset); void f3853_w(UINT32 offset, UINT8 data); @@ -104,6 +81,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -130,8 +108,6 @@ private: emu_timer *m_timer; UINT8 m_value_to_cycle[0x100]; - - const f3853_device_config &m_config; }; diff --git a/src/emu/machine/generic.c b/src/emu/machine/generic.c index ddf9cc9a098..2dddd85a17a 100644 --- a/src/emu/machine/generic.c +++ b/src/emu/machine/generic.c @@ -96,7 +96,7 @@ void generic_machine_init(running_machine &machine) memset(state->interrupt_device, 0, sizeof(state->interrupt_device)); device_execute_interface *exec = NULL; int index = 0; - for (bool gotone = machine.m_devicelist.first(exec); gotone && index < ARRAY_LENGTH(state->interrupt_device); gotone = exec->next(exec)) + for (bool gotone = machine.devicelist().first(exec); gotone && index < ARRAY_LENGTH(state->interrupt_device); gotone = exec->next(exec)) state->interrupt_device[index++] = &exec->device(); /* register coin save state */ @@ -319,7 +319,7 @@ void nvram_load(running_machine &machine) { // only need to do something if we have an NVRAM device or an nvram_handler device_nvram_interface *nvram = NULL; - if (!machine.m_devicelist.first(nvram) && machine.config().m_nvram_handler == NULL) + if (!machine.devicelist().first(nvram) && machine.config().m_nvram_handler == NULL) return; // open the file; if it exists, call everyone to read from it @@ -357,7 +357,7 @@ void nvram_save(running_machine &machine) { // only need to do something if we have an NVRAM device or an nvram_handler device_nvram_interface *nvram = NULL; - if (!machine.m_devicelist.first(nvram) && machine.config().m_nvram_handler == NULL) + if (!machine.devicelist().first(nvram) && machine.config().m_nvram_handler == NULL) return; // open the file; if it exists, call everyone to read from it diff --git a/src/emu/machine/i2cmem.c b/src/emu/machine/i2cmem.c index d6577137cbe..0aaacf24026 100644 --- a/src/emu/machine/i2cmem.c +++ b/src/emu/machine/i2cmem.c @@ -55,7 +55,8 @@ INLINE void ATTR_PRINTF( 3, 4 ) verboselog( device_t *device, int n_level, const // GLOBAL VARIABLES //************************************************************************** -const device_type I2CMEM = i2cmem_device_config::static_alloc_device_config; +// device type definition +const device_type I2CMEM = &device_creator<i2cmem_device>; static ADDRESS_MAP_START( i2cmem_map8, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0fff) AM_RAM @@ -64,17 +65,25 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** //------------------------------------------------- -// i2cmem_device_config - constructor +// i2cmem_device - constructor //------------------------------------------------- -i2cmem_device_config::i2cmem_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ) - : device_config(mconfig, static_alloc_device_config, "I2CMEM", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this) +i2cmem_device::i2cmem_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ) + : device_t(mconfig, I2CMEM, "I2CMEM", tag, owner, clock), + device_memory_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), + m_scl( 0 ), + m_sdaw( 0 ), + m_e0( 0 ), + m_e1( 0 ), + m_e2( 0 ), + m_wc( 0 ), + m_sdar( 1 ), + m_state( STATE_IDLE ) { m_address_bits = 0; @@ -87,38 +96,15 @@ i2cmem_device_config::i2cmem_device_config( const machine_config &mconfig, const } - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *i2cmem_device_config::static_alloc_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ) -{ - return global_alloc( i2cmem_device_config( mconfig, tag, owner, clock ) ); -} - - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *i2cmem_device_config::alloc_device( running_machine &machine ) const -{ - return auto_alloc( machine, i2cmem_device( machine, *this ) ); -} - - //------------------------------------------------- // static_set_interface - set the device // configuration //------------------------------------------------- -void i2cmem_device_config::static_set_interface(device_config *device, const i2cmem_interface &interface) +void i2cmem_device::static_set_interface(device_t &device, const i2cmem_interface &interface) { - i2cmem_device_config *i2cmem = downcast<i2cmem_device_config *>(device); - *static_cast<i2cmem_interface *>(i2cmem) = interface; + i2cmem_device &i2cmem = downcast<i2cmem_device &>(device); + static_cast<i2cmem_interface &>(i2cmem) = interface; } @@ -128,7 +114,7 @@ void i2cmem_device_config::static_set_interface(device_config *device, const i2c // complete //------------------------------------------------- -void i2cmem_device_config::device_config_complete() +void i2cmem_device::device_config_complete() { m_space_config = address_space_config( "i2cmem", ENDIANNESS_BIG, 8, m_address_bits, 0, *ADDRESS_MAP_NAME( i2cmem_map8 ) ); } @@ -139,7 +125,7 @@ void i2cmem_device_config::device_config_complete() // on this device //------------------------------------------------- -bool i2cmem_device_config::device_validity_check( emu_options &options, const game_driver &driver ) const +bool i2cmem_device::device_validity_check( emu_options &options, const game_driver &driver ) const { bool error = false; return error; @@ -147,52 +133,16 @@ bool i2cmem_device_config::device_validity_check( emu_options &options, const ga //------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- - -const address_space_config *i2cmem_device_config::memory_space_config( address_spacenum spacenum ) const -{ - return ( spacenum == 0 ) ? &m_space_config : NULL; -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// i2cmem_device - constructor +// device_start - device-specific startup //------------------------------------------------- -i2cmem_device::i2cmem_device( running_machine &_machine, const i2cmem_device_config &config ) : - device_t( _machine, config ), - device_memory_interface( _machine, config, *this ), - device_nvram_interface( _machine, config, *this ), - m_config( config ), - m_scl( 0 ), - m_sdaw( 0 ), - m_e0( 0 ), - m_e1( 0 ), - m_e2( 0 ), - m_wc( 0 ), - m_sdar( 1 ), - m_state( STATE_IDLE ) +void i2cmem_device::device_start() { - if( m_config.m_page_size > 0 ) + if( m_page_size > 0 ) { - m_page = auto_alloc_array( machine(), UINT8, m_config.m_page_size ); + m_page = auto_alloc_array( machine(), UINT8, m_page_size ); } -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void i2cmem_device::device_start() -{ save_item( NAME(m_scl) ); save_item( NAME(m_sdaw) ); save_item( NAME(m_e0) ); @@ -205,7 +155,7 @@ void i2cmem_device::device_start() save_item( NAME(m_shift) ); save_item( NAME(m_devsel) ); save_item( NAME(m_byteaddr) ); - save_pointer( NAME(m_page), m_config.m_page_size ); + save_pointer( NAME(m_page), m_page_size ); } @@ -219,13 +169,24 @@ void i2cmem_device::device_reset() //------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *i2cmem_device::memory_space_config( address_spacenum spacenum ) const +{ + return ( spacenum == 0 ) ? &m_space_config : NULL; +} + + +//------------------------------------------------- // nvram_default - called to initialize NVRAM to // its default state //------------------------------------------------- void i2cmem_device::nvram_default() { - int i2cmem_bytes = m_config.m_data_size; + int i2cmem_bytes = m_data_size; UINT16 default_value = 0xff; for( offs_t offs = 0; offs < i2cmem_bytes; offs++ ) @@ -261,7 +222,7 @@ void i2cmem_device::nvram_default() void i2cmem_device::nvram_read( emu_file &file ) { - int i2cmem_bytes = m_config.m_data_size; + int i2cmem_bytes = m_data_size; UINT8 *buffer = auto_alloc_array( machine(), UINT8, i2cmem_bytes ); file.read( buffer, i2cmem_bytes ); @@ -281,7 +242,7 @@ void i2cmem_device::nvram_read( emu_file &file ) void i2cmem_device::nvram_write( emu_file &file ) { - int i2cmem_bytes = m_config.m_data_size; + int i2cmem_bytes = m_data_size; UINT8 *buffer = auto_alloc_array( machine(), UINT8, i2cmem_bytes ); for( offs_t offs = 0; offs < i2cmem_bytes; offs++ ) @@ -446,19 +407,19 @@ void i2cmem_device::set_scl_line( int state ) verboselog( this, 0, "write not enabled\n" ); m_state = STATE_IDLE; } - else if( m_config.m_page_size > 0 ) + else if( m_page_size > 0 ) { m_page[ m_page_offset ] = m_shift; verboselog( this, 1, "page[ %04x ] <- %02x\n", m_page_offset, m_page[ m_page_offset ] ); m_page_offset++; - if( m_page_offset == m_config.m_page_size ) + if( m_page_offset == m_page_size ) { - int offset = data_offset() & ~( m_config.m_page_size - 1 ); + int offset = data_offset() & ~( m_page_size - 1 ); - verboselog( this, 1, "data[ %04x to %04x ] = page\n", offset, offset + m_config.m_page_size - 1 ); + verboselog( this, 1, "data[ %04x to %04x ] = page\n", offset, offset + m_page_size - 1 ); - for( int i = 0; i < m_config.m_page_size; i++ ) + for( int i = 0; i < m_page_size; i++ ) { m_addrspace[ 0 ]->write_byte( offset + i, m_page[ i ] ); } @@ -583,12 +544,12 @@ int i2cmem_device::read_sda_line() int i2cmem_device::address_mask() { - return (m_config.m_data_size - 1); + return (m_data_size - 1); } int i2cmem_device::select_device() { - int device = ( m_config.m_slave_address & 0xf0 ) | ( m_e2 << 3 ) | ( m_e1 << 2 ) | ( m_e0 << 1 ); + int device = ( m_slave_address & 0xf0 ) | ( m_e2 << 3 ) | ( m_e1 << 2 ) | ( m_e0 << 1 ); int mask = DEVSEL_ADDRESS & ~( address_mask() >> 7 ); if( ( m_devsel & mask ) == ( device & mask ) ) diff --git a/src/emu/machine/i2cmem.h b/src/emu/machine/i2cmem.h index db353a0ec86..f0c6aa14deb 100644 --- a/src/emu/machine/i2cmem.h +++ b/src/emu/machine/i2cmem.h @@ -26,7 +26,7 @@ #define MCFG_I2CMEM_ADD( _tag, _interface ) \ MCFG_DEVICE_ADD( _tag, I2CMEM, 0 ) \ - i2cmem_device_config::static_set_interface(device, _interface); + i2cmem_device::static_set_interface(*device, _interface); //************************************************************************** @@ -43,54 +43,21 @@ struct i2cmem_interface }; -// ======================> i2cmem_device_config - -class i2cmem_device_config : - public device_config, - public device_config_memory_interface, - public device_config_nvram_interface, - public i2cmem_interface -{ - friend class i2cmem_device; - - // construction/destruction - i2cmem_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ); - -public: - // allocators - static device_config *static_alloc_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ); - virtual device_t *alloc_device( running_machine &machine ) const; - - // inline configuration - static void static_set_interface(device_config *device, const i2cmem_interface &interface); - -protected: - // device_config overrides - virtual void device_config_complete(); - virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const; - - // device-specific configuration - address_space_config m_space_config; - int m_address_bits; -}; - - // ======================> i2cmem_device class i2cmem_device : public device_t, public device_memory_interface, - public device_nvram_interface + public device_nvram_interface, + public i2cmem_interface { - friend class i2cmem_device_config; - +public: // construction/destruction - i2cmem_device( running_machine &_machine, const i2cmem_device_config &config ); + i2cmem_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ); + + // inline configuration + static void static_set_interface(device_t &device, const i2cmem_interface &interface); -public: // I/O operations void set_e0_line( int state ); void set_e1_line( int state ); @@ -102,9 +69,14 @@ public: protected: // device-level overrides + virtual void device_config_complete(); + virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; virtual void device_start(); virtual void device_reset(); + // device_memory_interface overrides + virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const; + // device_nvram_interface overrides virtual void nvram_default(); virtual void nvram_read( emu_file &file ); @@ -115,9 +87,11 @@ protected: int select_device(); int data_offset(); - // internal state - const i2cmem_device_config &m_config; + // device-specific configuration + address_space_config m_space_config; + int m_address_bits; + // internal state int m_scl; int m_sdaw; int m_e0; diff --git a/src/emu/machine/i8155.c b/src/emu/machine/i8155.c index 3726e766029..f103a70561d 100644 --- a/src/emu/machine/i8155.c +++ b/src/emu/machine/i8155.c @@ -19,6 +19,9 @@ #include "i8155.h" +// device type definition +const device_type I8155 = &device_creator<i8155_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -94,10 +97,6 @@ enum // GLOBAL VARIABLES //************************************************************************** -// devices -const device_type I8155 = i8155_device_config::static_alloc_device_config; - - // default address map static ADDRESS_MAP_START( i8155, AS_0, 8 ) AM_RANGE(0x00, 0xff) AM_RAM @@ -106,82 +105,6 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// i8155_device_config - constructor -//------------------------------------------------- - -i8155_device_config::i8155_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Intel 8155", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - m_space_config("ram", ENDIANNESS_LITTLE, 8, 8, 0, NULL, *ADDRESS_MAP_NAME(i8155)) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *i8155_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(i8155_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *i8155_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, i8155_device(machine, *this)); -} - - -//------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- - -const address_space_config *i8155_device_config::memory_space_config(address_spacenum spacenum) const -{ - return (spacenum == AS_0) ? &m_space_config : NULL; -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void i8155_device_config::device_config_complete() -{ - // inherit a copy of the static data - const i8155_interface *intf = reinterpret_cast<const i8155_interface *>(static_config()); - if (intf != NULL) - *static_cast<i8155_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&in_pa_func, 0, sizeof(in_pa_func)); - memset(&out_pa_func, 0, sizeof(out_pa_func)); - memset(&in_pb_func, 0, sizeof(in_pb_func)); - memset(&out_pb_func, 0, sizeof(out_pb_func)); - memset(&in_pc_func, 0, sizeof(in_pc_func)); - memset(&out_pc_func, 0, sizeof(out_pc_func)); - memset(&out_to_func, 0, sizeof(out_to_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -291,12 +214,39 @@ inline void i8155_device::write_port(int port, UINT8 data) // i8155_device - constructor //------------------------------------------------- -i8155_device::i8155_device(running_machine &_machine, const i8155_device_config &config) - : device_t(_machine, config), - device_memory_interface(_machine, config, *this), - m_config(config) +i8155_device::i8155_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8155, "Intel 8155", tag, owner, clock), + device_memory_interface(mconfig, *this), + m_space_config("ram", ENDIANNESS_LITTLE, 8, 8, 0, NULL, *ADDRESS_MAP_NAME(i8155)) +{ + +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void i8155_device::device_config_complete() { + // inherit a copy of the static data + const i8155_interface *intf = reinterpret_cast<const i8155_interface *>(static_config()); + if (intf != NULL) + *static_cast<i8155_interface *>(this) = *intf; + // or initialize to defaults if none provided + else + { + memset(&in_pa_cb, 0, sizeof(in_pa_cb)); + memset(&out_pa_cb, 0, sizeof(out_pa_cb)); + memset(&in_pb_cb, 0, sizeof(in_pb_cb)); + memset(&out_pb_cb, 0, sizeof(out_pb_cb)); + memset(&in_pc_cb, 0, sizeof(in_pc_cb)); + memset(&out_pc_cb, 0, sizeof(out_pc_cb)); + memset(&out_to_cb, 0, sizeof(out_to_cb)); + } } @@ -307,13 +257,13 @@ i8155_device::i8155_device(running_machine &_machine, const i8155_device_config void i8155_device::device_start() { // resolve callbacks - devcb_resolve_read8(&m_in_port_func[0], &m_config.in_pa_func, this); - devcb_resolve_read8(&m_in_port_func[1], &m_config.in_pb_func, this); - devcb_resolve_read8(&m_in_port_func[2], &m_config.in_pc_func, this); - devcb_resolve_write8(&m_out_port_func[0], &m_config.out_pa_func, this); - devcb_resolve_write8(&m_out_port_func[1], &m_config.out_pb_func, this); - devcb_resolve_write8(&m_out_port_func[2], &m_config.out_pc_func, this); - devcb_resolve_write_line(&m_out_to_func, &m_config.out_to_func, this); + devcb_resolve_read8(&m_in_port_func[0], &in_pa_cb, this); + devcb_resolve_read8(&m_in_port_func[1], &in_pb_cb, this); + devcb_resolve_read8(&m_in_port_func[2], &in_pc_cb, this); + devcb_resolve_write8(&m_out_port_func[0], &out_pa_cb, this); + devcb_resolve_write8(&m_out_port_func[1], &out_pb_cb, this); + devcb_resolve_write8(&m_out_port_func[2], &out_pc_cb, this); + devcb_resolve_write_line(&m_out_to_func, &out_to_cb, this); // allocate timers m_timer = timer_alloc(); @@ -417,6 +367,17 @@ void i8155_device::device_timer(emu_timer &timer, device_timer_id id, int param, //------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *i8155_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == AS_0) ? &m_space_config : NULL; +} + + +//------------------------------------------------- // io_r - register read //------------------------------------------------- diff --git a/src/emu/machine/i8155.h b/src/emu/machine/i8155.h index 282791da933..56929d9caf0 100644 --- a/src/emu/machine/i8155.h +++ b/src/emu/machine/i8155.h @@ -67,46 +67,17 @@ struct i8155_interface { - devcb_read8 in_pa_func; - devcb_write8 out_pa_func; + devcb_read8 in_pa_cb; + devcb_write8 out_pa_cb; - devcb_read8 in_pb_func; - devcb_write8 out_pb_func; + devcb_read8 in_pb_cb; + devcb_write8 out_pb_cb; - devcb_read8 in_pc_func; - devcb_write8 out_pc_func; + devcb_read8 in_pc_cb; + devcb_write8 out_pc_cb; // this gets called for each change of the TIMER OUT pin (pin 6) - devcb_write_line out_to_func; -}; - - - -// ======================> i8155_device_config - -class i8155_device_config : public device_config, - public device_config_memory_interface, - public i8155_interface -{ - friend class i8155_device; - - // construction/destruction - i8155_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; - - // address space configurations - const address_space_config m_space_config; + devcb_write_line out_to_cb; }; @@ -114,14 +85,13 @@ protected: // ======================> i8155_device class i8155_device : public device_t, - public device_memory_interface + public device_memory_interface, + public i8155_interface { - friend class i8155_device_config; - +public: // construction/destruction - i8155_device(running_machine &_machine, const i8155_device_config &_config); + i8155_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( io_r ); DECLARE_WRITE8_MEMBER( io_w ); @@ -134,10 +104,13 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + inline UINT8 get_timer_mode(); inline void timer_output(); inline void pulse_timer_output(); @@ -169,7 +142,7 @@ private: // timers emu_timer *m_timer; // counter timer - const i8155_device_config &m_config; + const address_space_config m_space_config; }; diff --git a/src/emu/machine/i8212.c b/src/emu/machine/i8212.c index af98db9947e..dbe6fe1e1a0 100644 --- a/src/emu/machine/i8212.c +++ b/src/emu/machine/i8212.c @@ -22,19 +22,23 @@ //************************************************************************** -// GLOBAL VARIABLES +// LIVE DEVICE //************************************************************************** -// devices -const device_type I8212 = i8212_device_config::static_alloc_device_config; - +// device type definition +const device_type I8212 = &device_creator<i8212_device>; +//------------------------------------------------- +// i8212_device - constructor +//------------------------------------------------- -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** +i8212_device::i8212_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8212, "Intel 8212", tag, owner, clock), + m_md(I8212_MODE_INPUT), + m_stb(0) +{ -GENERIC_DEVICE_CONFIG_SETUP(i8212, "Intel 8212") +} //------------------------------------------------- @@ -43,7 +47,7 @@ GENERIC_DEVICE_CONFIG_SETUP(i8212, "Intel 8212") // complete //------------------------------------------------- -void i8212_device_config::device_config_complete() +void i8212_device::device_config_complete() { // inherit a copy of the static data const i8212_interface *intf = reinterpret_cast<const i8212_interface *>(static_config()); @@ -53,32 +57,13 @@ void i8212_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&out_int_func, 0, sizeof(out_int_func)); - memset(&in_di_func, 0, sizeof(in_di_func)); - memset(&out_do_func, 0, sizeof(out_do_func)); + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + memset(&m_in_di_cb, 0, sizeof(m_in_di_cb)); + memset(&m_out_do_cb, 0, sizeof(m_out_do_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// i8212_device - constructor -//------------------------------------------------- - -i8212_device::i8212_device(running_machine &_machine, const i8212_device_config &config) - : device_t(_machine, config), - m_md(I8212_MODE_INPUT), - m_stb(0), - m_config(config) -{ - -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -86,9 +71,9 @@ i8212_device::i8212_device(running_machine &_machine, const i8212_device_config void i8212_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_int_func, &m_config.out_int_func, this); - devcb_resolve_read8(&m_in_di_func, &m_config.in_di_func, this); - devcb_resolve_write8(&m_out_do_func, &m_config.out_do_func, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); + devcb_resolve_read8(&m_in_di_func, &m_in_di_cb, this); + devcb_resolve_write8(&m_out_do_func, &m_out_do_cb, this); // register for state saving save_item(NAME(m_md)); diff --git a/src/emu/machine/i8212.h b/src/emu/machine/i8212.h index 6390a4d6f7d..3ed32cbbfe9 100644 --- a/src/emu/machine/i8212.h +++ b/src/emu/machine/i8212.h @@ -64,46 +64,22 @@ enum struct i8212_interface { - devcb_write_line out_int_func; + devcb_write_line m_out_int_cb; - devcb_read8 in_di_func; - devcb_write8 out_do_func; -}; - - - -// ======================> i8212_device_config - -class i8212_device_config : public device_config, - public i8212_interface -{ - friend class i8212_device; - - // construction/destruction - i8212_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_di_cb; + devcb_write8 m_out_do_cb; }; // ======================> i8212_device -class i8212_device : public device_t +class i8212_device : public device_t, public i8212_interface { - friend class i8212_device_config; - +public: // construction/destruction - i8212_device(running_machine &_machine, const i8212_device_config &_config); + i8212_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( data_w ); @@ -112,6 +88,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -123,8 +100,6 @@ private: int m_md; // mode int m_stb; // strobe UINT8 m_data; // data latch - - const i8212_device_config &m_config; }; diff --git a/src/emu/machine/i8214.c b/src/emu/machine/i8214.c index 0d77ad1da1f..521cccd7007 100644 --- a/src/emu/machine/i8214.c +++ b/src/emu/machine/i8214.c @@ -13,50 +13,15 @@ -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** +// device type definition +const device_type I8214 = &device_creator<i8214_device>; -#define LOG 0 - - -//************************************************************************** -// GLOBAL VARIABLES //************************************************************************** - -// devices -const device_type I8214 = i8214_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION +// MACROS / CONSTANTS //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(i8214, "I8214") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void i8214_device_config::device_config_complete() -{ - // inherit a copy of the static data - const i8214_interface *intf = reinterpret_cast<const i8214_interface *>(static_config()); - if (intf != NULL) - *static_cast<i8214_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); - memset(&m_out_enlg_func, 0, sizeof(m_out_enlg_func)); - } -} +#define LOG 0 @@ -125,10 +90,31 @@ inline void i8214_device::check_interrupt() // i8214_device - constructor //------------------------------------------------- -i8214_device::i8214_device(running_machine &_machine, const i8214_device_config &config) - : device_t(_machine, config), - m_config(config) +i8214_device::i8214_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8214, "I8214", tag, owner, clock) +{ +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void i8214_device::device_config_complete() { + // inherit a copy of the static data + const i8214_interface *intf = reinterpret_cast<const i8214_interface *>(static_config()); + if (intf != NULL) + *static_cast<i8214_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + memset(&m_out_enlg_cb, 0, sizeof(m_out_enlg_cb)); + } } @@ -139,8 +125,8 @@ i8214_device::i8214_device(running_machine &_machine, const i8214_device_config void i8214_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); - devcb_resolve_write_line(&m_out_enlg_func, &m_config.m_out_enlg_func, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); + devcb_resolve_write_line(&m_out_enlg_func, &m_out_enlg_cb, this); // register for state saving save_item(NAME(m_inte)); diff --git a/src/emu/machine/i8214.h b/src/emu/machine/i8214.h index 06e4a59ed94..29c528c7997 100644 --- a/src/emu/machine/i8214.h +++ b/src/emu/machine/i8214.h @@ -53,43 +53,19 @@ struct i8214_interface { - devcb_write_line m_out_int_func; - devcb_write_line m_out_enlg_func; + devcb_write_line m_out_int_cb; + devcb_write_line m_out_enlg_cb; }; -// ======================> i8214_device_config - -class i8214_device_config : public device_config, - public i8214_interface -{ - friend class i8214_device; - - // construction/destruction - i8214_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> i8214_device -class i8214_device : public device_t +class i8214_device : public device_t, public i8214_interface { - friend class i8214_device_config; - +public: // construction/destruction - i8214_device(running_machine &_machine, const i8214_device_config &_config); + i8214_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_WRITE_LINE_MEMBER( sgs_w ); DECLARE_WRITE_LINE_MEMBER( etlg_w ); DECLARE_WRITE_LINE_MEMBER( inte_w ); @@ -100,6 +76,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); private: @@ -116,8 +93,6 @@ private: UINT8 m_r; // interrupt request latch int m_sgs; // status group select int m_etlg; // enable this level group - - const i8214_device_config &m_config; }; diff --git a/src/emu/machine/i8243.c b/src/emu/machine/i8243.c index 70bb448afb3..9a15afc1dcf 100644 --- a/src/emu/machine/i8243.c +++ b/src/emu/machine/i8243.c @@ -13,27 +13,39 @@ #include "devhelpr.h" //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(i8243, "I8243") +// device type definition +const device_type I8243 = &device_creator<i8243_device>; + +//------------------------------------------------- +// i8243_device - constructor +//------------------------------------------------- + +i8243_device::i8243_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8243, "I8243", tag, owner, clock) +{ + +} + //------------------------------------------------- // static_set_read_handler - configuration helper // to set the read handler //------------------------------------------------- -void i8243_device_config::static_set_read_handler(device_config *device, read8_device_func callback) +void i8243_device::static_set_read_handler(device_t &device, read8_device_func callback) { - i8243_device_config *i8243 = downcast<i8243_device_config *>(device); + i8243_device &i8243 = downcast<i8243_device &>(device); if(callback != NULL) { - i8243->m_readhandler.type = DEVCB_TYPE_SELF; - i8243->m_readhandler.readdevice = callback; + i8243.m_readhandler_cb.type = DEVCB_TYPE_SELF; + i8243.m_readhandler_cb.readdevice = callback; } else { - i8243->m_readhandler.type = DEVCB_TYPE_NULL; + i8243.m_readhandler_cb.type = DEVCB_TYPE_NULL; } } @@ -43,51 +55,29 @@ void i8243_device_config::static_set_read_handler(device_config *device, read8_d // to set the write handler //------------------------------------------------- -void i8243_device_config::static_set_write_handler(device_config *device, write8_device_func callback) +void i8243_device::static_set_write_handler(device_t &device, write8_device_func callback) { - i8243_device_config *i8243 = downcast<i8243_device_config *>(device); + i8243_device &i8243 = downcast<i8243_device &>(device); if(callback != NULL) { - i8243->m_writehandler.type = DEVCB_TYPE_SELF; - i8243->m_writehandler.writedevice = callback; + i8243.m_writehandler_cb.type = DEVCB_TYPE_SELF; + i8243.m_writehandler_cb.writedevice = callback; } else { - i8243->m_writehandler.type = DEVCB_TYPE_NULL; + i8243.m_writehandler_cb.type = DEVCB_TYPE_NULL; } } - -/*************************************************************************** - LIVE DEVICE -***************************************************************************/ - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type I8243 = i8243_device_config::static_alloc_device_config; - -//------------------------------------------------- -// i8243_device - constructor -//------------------------------------------------- - -i8243_device::i8243_device(running_machine &_machine, const i8243_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void i8243_device::device_start() { - devcb_resolve_read8(&m_readhandler, &m_config.m_readhandler, this); - devcb_resolve_write8(&m_writehandler, &m_config.m_writehandler, this); + devcb_resolve_read8(&m_readhandler, &m_readhandler_cb, this); + devcb_resolve_write8(&m_writehandler, &m_writehandler_cb, this); } diff --git a/src/emu/machine/i8243.h b/src/emu/machine/i8243.h index 00b170ebe0c..325a1bdf5ba 100644 --- a/src/emu/machine/i8243.h +++ b/src/emu/machine/i8243.h @@ -28,50 +28,28 @@ MCFG_I8243_WRITEHANDLER(_write) \ #define MCFG_I8243_READHANDLER(_read) \ - i8243_device_config::static_set_read_handler(device, _read); \ + i8243_device::static_set_read_handler(*device, _read); \ #define MCFG_I8243_WRITEHANDLER(_write) \ - i8243_device_config::static_set_write_handler(device, _write); \ + i8243_device::static_set_write_handler(*device, _write); \ /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -// ======================> i8243_device_config - -class i8243_device_config : public device_config -{ - friend class i8243_device; - - // construction/destruction - i8243_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - - // inline configuration helpers - static void static_set_read_handler(device_config *device, read8_device_func callback); - static void static_set_write_handler(device_config *device, write8_device_func callback); - -protected: - devcb_read8 m_readhandler; - devcb_write8 m_writehandler; -}; - - // ======================> i8243_device class i8243_device : public device_t { - friend class i8243_device_config; - +public: // construction/destruction - i8243_device(running_machine &_machine, const i8243_device_config &_config); + i8243_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // inline configuration helpers + static void static_set_read_handler(device_t &device, read8_device_func callback); + static void static_set_write_handler(device_t &device, write8_device_func callback); -public: UINT8 i8243_p2_r(UINT32 offset); void i8243_p2_w(UINT32 offset, UINT8 data); @@ -93,10 +71,11 @@ private: UINT8 m_opcode; /* latched opcode */ UINT8 m_prog; /* previous PROG state */ + devcb_read8 m_readhandler_cb; + devcb_write8 m_writehandler_cb; + devcb_resolved_read8 m_readhandler; devcb_resolved_write8 m_writehandler; - - const i8243_device_config &m_config; }; diff --git a/src/emu/machine/i8255.c b/src/emu/machine/i8255.c index 176567d21fa..954c688afbe 100644 --- a/src/emu/machine/i8255.c +++ b/src/emu/machine/i8255.c @@ -64,42 +64,8 @@ enum // DEVICE DEFINITIONS //************************************************************************** -const device_type I8255 = i8255_device_config::static_alloc_device_config; -const device_type I8255A = i8255_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(i8255, "I8255") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void i8255_device_config::device_config_complete() -{ - // inherit a copy of the static data - const i8255_interface *intf = reinterpret_cast<const i8255_interface *>(static_config()); - if (intf != NULL) - *static_cast<i8255_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_in_pa_func, 0, sizeof(m_in_pa_func)); - memset(&m_out_pa_func, 0, sizeof(m_out_pa_func)); - memset(&m_in_pb_func, 0, sizeof(m_in_pb_func)); - memset(&m_out_pb_func, 0, sizeof(m_out_pb_func)); - memset(&m_in_pc_func, 0, sizeof(m_in_pc_func)); - memset(&m_out_pc_func, 0, sizeof(m_out_pc_func)); - } -} +const device_type I8255 = &device_creator<i8255_device>; +const device_type I8255A = &device_creator<i8255_device>; @@ -311,10 +277,35 @@ inline int i8255_device::port_c_upper_mode() // i8255_device - constructor //------------------------------------------------- -i8255_device::i8255_device(running_machine &_machine, const i8255_device_config &config) - : device_t(_machine, config), - m_config(config) +i8255_device::i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8255, "I8255", tag, owner, clock) +{ +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void i8255_device::device_config_complete() { + // inherit a copy of the static data + const i8255_interface *intf = reinterpret_cast<const i8255_interface *>(static_config()); + if (intf != NULL) + *static_cast<i8255_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb)); + memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb)); + memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb)); + memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb)); + memset(&m_in_pc_cb, 0, sizeof(m_in_pc_cb)); + memset(&m_out_pc_cb, 0, sizeof(m_out_pc_cb)); + } } @@ -325,12 +316,12 @@ i8255_device::i8255_device(running_machine &_machine, const i8255_device_config void i8255_device::device_start() { // resolve callbacks - devcb_resolve_read8(&m_in_port_func[PORT_A], &m_config.m_in_pa_func, this); - devcb_resolve_write8(&m_out_port_func[PORT_A], &m_config.m_out_pa_func, this); - devcb_resolve_read8(&m_in_port_func[PORT_B], &m_config.m_in_pb_func, this); - devcb_resolve_write8(&m_out_port_func[PORT_B], &m_config.m_out_pb_func, this); - devcb_resolve_read8(&m_in_port_func[PORT_C], &m_config.m_in_pc_func, this); - devcb_resolve_write8(&m_out_port_func[PORT_C], &m_config.m_out_pc_func, this); + devcb_resolve_read8(&m_in_port_func[PORT_A], &m_in_pa_cb, this); + devcb_resolve_write8(&m_out_port_func[PORT_A], &m_out_pa_cb, this); + devcb_resolve_read8(&m_in_port_func[PORT_B], &m_in_pb_cb, this); + devcb_resolve_write8(&m_out_port_func[PORT_B], &m_out_pb_cb, this); + devcb_resolve_read8(&m_in_port_func[PORT_C], &m_in_pc_cb, this); + devcb_resolve_write8(&m_out_port_func[PORT_C], &m_out_pc_cb, this); // register for state saving save_item(NAME(m_control)); diff --git a/src/emu/machine/i8255.h b/src/emu/machine/i8255.h index 2d0d242dbdf..ae8db18cef3 100644 --- a/src/emu/machine/i8255.h +++ b/src/emu/machine/i8255.h @@ -69,46 +69,24 @@ struct i8255_interface { - devcb_read8 m_in_pa_func; - devcb_write8 m_out_pa_func; - devcb_read8 m_in_pb_func; - devcb_write8 m_out_pb_func; - devcb_read8 m_in_pc_func; - devcb_write8 m_out_pc_func; -}; - - -// ======================> i8255_device_config - -class i8255_device_config : public device_config, - public i8255_interface -{ - friend class i8255_device; - - // construction/destruction - i8255_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_pa_cb; + devcb_write8 m_out_pa_cb; + devcb_read8 m_in_pb_cb; + devcb_write8 m_out_pb_cb; + devcb_read8 m_in_pc_cb; + devcb_write8 m_out_pc_cb; }; // ======================> i8255_device -class i8255_device : public device_t +class i8255_device : public device_t, + public i8255_interface { - friend class i8255_device_config; - +public: // construction/destruction - i8255_device(running_machine &_machine, const i8255_device_config &_config); + i8255_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -124,6 +102,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -165,8 +144,6 @@ private: int m_inte1; // interrupt enable int m_inte2; // interrupt enable int m_intr[2]; // interrupt - - const i8255_device_config &m_config; }; diff --git a/src/emu/machine/i8355.c b/src/emu/machine/i8355.c index 10671198227..52ef3393343 100644 --- a/src/emu/machine/i8355.c +++ b/src/emu/machine/i8355.c @@ -39,9 +39,8 @@ enum // GLOBAL VARIABLES //************************************************************************** -// devices -const device_type I8355 = i8355_device_config::static_alloc_device_config; - +// device type definition +const device_type I8355 = &device_creator<i8355_device>; // default address map static ADDRESS_MAP_START( i8355, AS_0, 8 ) @@ -51,79 +50,6 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// i8355_device_config - constructor -//------------------------------------------------- - -i8355_device_config::i8355_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Intel 8355", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - m_space_config("ram", ENDIANNESS_LITTLE, 8, 11, 0, NULL, *ADDRESS_MAP_NAME(i8355)) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *i8355_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(i8355_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *i8355_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, i8355_device(machine, *this)); -} - - -//------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- - -const address_space_config *i8355_device_config::memory_space_config(address_spacenum spacenum) const -{ - return (spacenum == AS_0) ? &m_space_config : NULL; -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void i8355_device_config::device_config_complete() -{ - // inherit a copy of the static data - const i8355_interface *intf = reinterpret_cast<const i8355_interface *>(static_config()); - if (intf != NULL) - *static_cast<i8355_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&in_pa_func, 0, sizeof(in_pa_func)); - memset(&out_pa_func, 0, sizeof(out_pa_func)); - memset(&in_pb_func, 0, sizeof(in_pb_func)); - memset(&out_pb_func, 0, sizeof(out_pb_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -165,26 +91,50 @@ inline void i8355_device::write_port(int port, UINT8 data) // i8355_device - constructor //------------------------------------------------- -i8355_device::i8355_device(running_machine &_machine, const i8355_device_config &config) - : device_t(_machine, config), - device_memory_interface(_machine, config, *this), - m_config(config) +i8355_device::i8355_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, I8355, "Intel 8355", tag, owner, clock), + device_memory_interface(mconfig, *this), + m_space_config("ram", ENDIANNESS_LITTLE, 8, 11, 0, NULL, *ADDRESS_MAP_NAME(i8355)) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void i8355_device::device_config_complete() +{ + // inherit a copy of the static data + const i8355_interface *intf = reinterpret_cast<const i8355_interface *>(static_config()); + if (intf != NULL) + *static_cast<i8355_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb)); + memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb)); + memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb)); + memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void i8355_device::device_start() { // resolve callbacks - devcb_resolve_read8(&m_in_port_func[0], &m_config.in_pa_func, this); - devcb_resolve_read8(&m_in_port_func[1], &m_config.in_pb_func, this); - devcb_resolve_write8(&m_out_port_func[0], &m_config.out_pa_func, this); - devcb_resolve_write8(&m_out_port_func[1], &m_config.out_pb_func, this); + devcb_resolve_read8(&m_in_port_func[0], &m_in_pa_cb, this); + devcb_resolve_read8(&m_in_port_func[1], &m_in_pb_cb, this); + devcb_resolve_write8(&m_out_port_func[0], &m_out_pa_cb, this); + devcb_resolve_write8(&m_out_port_func[1], &m_out_pb_cb, this); // register for state saving save_item(NAME(m_output)); @@ -205,6 +155,18 @@ void i8355_device::device_reset() //------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *i8355_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == AS_0) ? &m_space_config : NULL; +} + + + +//------------------------------------------------- // io_r - register read //------------------------------------------------- diff --git a/src/emu/machine/i8355.h b/src/emu/machine/i8355.h index a332d4fa264..142b4a36ef1 100644 --- a/src/emu/machine/i8355.h +++ b/src/emu/machine/i8355.h @@ -67,40 +67,11 @@ struct i8355_interface { - devcb_read8 in_pa_func; - devcb_write8 out_pa_func; + devcb_read8 m_in_pa_cb; + devcb_write8 m_out_pa_cb; - devcb_read8 in_pb_func; - devcb_write8 out_pb_func; -}; - - - -// ======================> i8355_device_config - -class i8355_device_config : public device_config, - public device_config_memory_interface, - public i8355_interface -{ - friend class i8355_device; - - // construction/destruction - i8355_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; - - // address space configurations - const address_space_config m_space_config; + devcb_read8 m_in_pb_cb; + devcb_write8 m_out_pb_cb; }; @@ -108,14 +79,13 @@ protected: // ======================> i8355_device class i8355_device : public device_t, - public device_memory_interface + public device_memory_interface, + public i8355_interface { - friend class i8355_device_config; - +public: // construction/destruction - i8355_device(running_machine &_machine, const i8355_device_config &_config); + i8355_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( io_r ); DECLARE_WRITE8_MEMBER( io_w ); @@ -124,9 +94,13 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + inline UINT8 read_port(int port); inline void write_port(int port, UINT8 data); @@ -138,7 +112,7 @@ private: UINT8 m_output[2]; // output latches UINT8 m_ddr[2]; // DDR latches - const i8355_device_config &m_config; + const address_space_config m_space_config; }; diff --git a/src/emu/machine/idectrl.c b/src/emu/machine/idectrl.c index 433badd8821..7a9a991435c 100644 --- a/src/emu/machine/idectrl.c +++ b/src/emu/machine/idectrl.c @@ -204,7 +204,7 @@ INLINE ide_state *get_safe_token(device_t *device) INLINE void signal_interrupt(ide_state *ide) { - const ide_config *config = (const ide_config *)downcast<const legacy_device_config_base &>(ide->device->baseconfig()).inline_config(); + const ide_config *config = (const ide_config *)downcast<const legacy_device_base *>(ide->device)->inline_config(); LOG(("IDE interrupt assert\n")); @@ -218,7 +218,7 @@ INLINE void signal_interrupt(ide_state *ide) INLINE void clear_interrupt(ide_state *ide) { - const ide_config *config = (const ide_config *)downcast<const legacy_device_config_base &>(ide->device->baseconfig()).inline_config(); + const ide_config *config = (const ide_config *)downcast<const legacy_device_base *>(ide->device)->inline_config(); LOG(("IDE interrupt clear\n")); @@ -1807,14 +1807,14 @@ static DEVICE_START( ide_controller ) /* validate some basic stuff */ assert(device != NULL); - assert(device->baseconfig().static_config() == NULL); - assert(downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config() != NULL); + assert(device->static_config() == NULL); + assert(downcast<const legacy_device_base *>(device)->inline_config() != NULL); /* store a pointer back to the device */ ide->device = device; /* set MAME harddisk handle */ - config = (const ide_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + config = (const ide_config *)downcast<const legacy_device_base *>(device)->inline_config(); ide->handle = get_disk_handle(device->machine(), (config->master != NULL) ? config->master : device->tag()); ide->disk = hard_disk_open(ide->handle); assert_always(config->slave == NULL, "IDE controller does not yet support slave drives\n"); diff --git a/src/emu/machine/ins8154.c b/src/emu/machine/ins8154.c index ff319ad785a..29baae92eaf 100644 --- a/src/emu/machine/ins8154.c +++ b/src/emu/machine/ins8154.c @@ -30,15 +30,24 @@ enum }; -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(ins8154, "INS8154") +// device type definition +const device_type INS8154 = &device_creator<ins8154_device>; + +//------------------------------------------------- +// ins8154_device - constructor +//------------------------------------------------- + +ins8154_device::ins8154_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, INS8154, "INS8154", tag, owner, clock) +{ + +} + //------------------------------------------------- // device_config_complete - perform any @@ -46,7 +55,7 @@ GENERIC_DEVICE_CONFIG_SETUP(ins8154, "INS8154") // complete //------------------------------------------------- -void ins8154_device_config::device_config_complete() +void ins8154_device::device_config_complete() { // inherit a copy of the static data const ins8154_interface *intf = reinterpret_cast<const ins8154_interface *>(static_config()); @@ -58,33 +67,15 @@ void ins8154_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_in_a_func, 0, sizeof(m_in_a_func)); - memset(&m_in_b_func, 0, sizeof(m_in_b_func)); - memset(&m_out_a_func, 0, sizeof(m_out_a_func)); - memset(&m_out_b_func, 0, sizeof(m_out_b_func)); - memset(&m_out_irq_func, 0, sizeof(m_out_irq_func)); + memset(&m_in_a_cb, 0, sizeof(m_in_a_cb)); + memset(&m_in_b_cb, 0, sizeof(m_in_b_cb)); + memset(&m_out_a_cb, 0, sizeof(m_out_a_cb)); + memset(&m_out_b_cb, 0, sizeof(m_out_b_cb)); + memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type INS8154 = ins8154_device_config::static_alloc_device_config; - -//------------------------------------------------- -// ins8154_device - constructor -//------------------------------------------------- - -ins8154_device::ins8154_device(running_machine &_machine, const ins8154_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -92,11 +83,11 @@ ins8154_device::ins8154_device(running_machine &_machine, const ins8154_device_c void ins8154_device::device_start() { /* resolve callbacks */ - devcb_resolve_read8(&m_in_a_func, &m_config.m_in_a_func, this); - devcb_resolve_write8(&m_out_a_func, &m_config.m_out_a_func, this); - devcb_resolve_read8(&m_in_b_func, &m_config.m_in_b_func, this); - devcb_resolve_write8(&m_out_b_func, &m_config.m_out_b_func, this); - devcb_resolve_write_line(&m_out_irq_func, &m_config.m_out_irq_func, this); + devcb_resolve_read8(&m_in_a_func, &m_in_a_cb, this); + devcb_resolve_write8(&m_out_a_func, &m_out_a_cb, this); + devcb_resolve_read8(&m_in_b_func, &m_in_b_cb, this); + devcb_resolve_write8(&m_out_b_func, &m_out_b_cb, this); + devcb_resolve_write_line(&m_out_irq_func, &m_out_irq_cb, this); /* register for state saving */ save_item(NAME(m_in_a)); diff --git a/src/emu/machine/ins8154.h b/src/emu/machine/ins8154.h index 13acfc521b2..1857a428223 100644 --- a/src/emu/machine/ins8154.h +++ b/src/emu/machine/ins8154.h @@ -55,47 +55,23 @@ struct ins8154_interface { - devcb_read8 m_in_a_func; - devcb_write8 m_out_a_func; - devcb_read8 m_in_b_func; - devcb_write8 m_out_b_func; - devcb_write_line m_out_irq_func; -}; - - - -// ======================> ins8154_device_config - -class ins8154_device_config : public device_config, - public ins8154_interface -{ - friend class ins8154_device; - - // construction/destruction - ins8154_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_a_cb; + devcb_write8 m_out_a_cb; + devcb_read8 m_in_b_cb; + devcb_write8 m_out_b_cb; + devcb_write_line m_out_irq_cb; }; // ======================> ins8154_device -class ins8154_device : public device_t +class ins8154_device : public device_t, + public ins8154_interface { - friend class ins8154_device_config; - - // construction/destruction - ins8154_device(running_machine &_machine, const ins8154_device_config &_config); - public: + // construction/destruction + ins8154_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); UINT8 ins8154_r(UINT32 offset); void ins8154_w(UINT32 offset, UINT8 data); @@ -105,6 +81,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_post_load() { } @@ -127,8 +104,6 @@ private: UINT8 m_mdr; /* Mode Definition Register */ UINT8 m_odra; /* Output Definition Register Port A */ UINT8 m_odrb; /* Output Definition Register Port B */ - - const ins8154_device_config &m_config; }; diff --git a/src/emu/machine/ins8250.c b/src/emu/machine/ins8250.c index e44641922b3..e3efc887f03 100644 --- a/src/emu/machine/ins8250.c +++ b/src/emu/machine/ins8250.c @@ -547,7 +547,7 @@ static void common_start( device_t *device, int device_type ) { ins8250_t *ins8250 = get_safe_token(device); - ins8250->interface = (const ins8250_interface*)device->baseconfig().static_config(); + ins8250->interface = (const ins8250_interface*)device->static_config(); ins8250->device_type = device_type; } diff --git a/src/emu/machine/intelfsh.c b/src/emu/machine/intelfsh.c index c8948d46c07..60c988c1b21 100644 --- a/src/emu/machine/intelfsh.c +++ b/src/emu/machine/intelfsh.c @@ -41,45 +41,22 @@ enum //************************************************************************** -// DEVICE DEFINITIONS +// GLOBAL VARIABLES //************************************************************************** -// 8-bit variants -DEFINE_TRIVIAL_DERIVED_DEVICE(intel_28f016s5_device_config, intelfsh8_device_config, intel_28f016s5_device, intelfsh8_device, "Sharp LH28F400 Flash", intelfsh_device_config::FLASH_SHARP_LH28F400) -DEFINE_TRIVIAL_DERIVED_DEVICE(fujitsu_29f016a_device_config, intelfsh8_device_config, fujitsu_29f016a_device, intelfsh8_device, "Fujitsu 29F016A Flash", intelfsh_device_config::FLASH_FUJITSU_29F016A) -DEFINE_TRIVIAL_DERIVED_DEVICE(fujitsu_29dl16x_device_config, intelfsh8_device_config, fujitsu_29dl16x_device, intelfsh8_device, "Fujitsu 29DL16X Flash", intelfsh_device_config::FLASH_FUJITSU_29DL16X) -DEFINE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f016s_device_config, intelfsh8_device_config, sharp_lh28f016s_device, intelfsh8_device, "Sharp LH28F016S Flash", intelfsh_device_config::FLASH_SHARP_LH28F016S) -DEFINE_TRIVIAL_DERIVED_DEVICE(intel_e28f008sa_device_config, intelfsh8_device_config, intel_e28f008sa_device, intelfsh8_device, "Intel E28F008SA Flash", intelfsh_device_config::FLASH_INTEL_E28F008SA) -DEFINE_TRIVIAL_DERIVED_DEVICE(macronix_29l001mc_device_config, intelfsh8_device_config, macronix_29l001mc_device, intelfsh8_device, "Macronix 29L001MC Flash", intelfsh_device_config::FLASH_MACRONIX_29L001MC) -DEFINE_TRIVIAL_DERIVED_DEVICE(panasonic_mn63f805mnp_device_config, intelfsh8_device_config, panasonic_mn63f805mnp_device, intelfsh8_device, "Panasonic MN63F805MNP Flash", intelfsh_device_config::FLASH_PANASONIC_MN63F805MNP) -DEFINE_TRIVIAL_DERIVED_DEVICE(sanyo_le26fv10n1ts_device_config, intelfsh8_device_config, sanyo_le26fv10n1ts_device, intelfsh8_device, "Sanyo LE26FV10N1TS Flash", intelfsh_device_config::FLASH_SANYO_LE26FV10N1TS) - -const device_type INTEL_28F016S5 = intel_28f016s5_device_config::static_alloc_device_config; -const device_type SHARP_LH28F016S = sharp_lh28f016s_device_config::static_alloc_device_config; -const device_type FUJITSU_29F016A = fujitsu_29f016a_device_config::static_alloc_device_config; -const device_type FUJITSU_29DL16X = fujitsu_29dl16x_device_config::static_alloc_device_config; -const device_type INTEL_E28F008SA = intel_e28f008sa_device_config::static_alloc_device_config; -const device_type MACRONIX_29L001MC = macronix_29l001mc_device_config::static_alloc_device_config; -const device_type PANASONIC_MN63F805MNP = panasonic_mn63f805mnp_device_config::static_alloc_device_config; -const device_type SANYO_LE26FV10N1TS = sanyo_le26fv10n1ts_device_config::static_alloc_device_config; - - -// 16-bit variants -DEFINE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f400_device_config, intelfsh16_device_config, sharp_lh28f400_device, intelfsh16_device, "Sharp LH28F400 Flash", intelfsh_device_config::FLASH_SHARP_LH28F400) -DEFINE_TRIVIAL_DERIVED_DEVICE(intel_te28f160_device_config, intelfsh16_device_config, intel_te28f160_device, intelfsh16_device, "Intel TE28F160 Flash", intelfsh_device_config::FLASH_INTEL_TE28F160) -DEFINE_TRIVIAL_DERIVED_DEVICE(intel_e28f400_device_config, intelfsh16_device_config, intel_e28f400_device, intelfsh16_device, "Intel E28F400 Flash", intelfsh_device_config::FLASH_INTEL_E28F400) -DEFINE_TRIVIAL_DERIVED_DEVICE(sharp_unk128mbit_device_config, intelfsh16_device_config, sharp_unk128mbit_device, intelfsh16_device, "Sharp Unknown 128Mb Flash", intelfsh_device_config::FLASH_SHARP_UNK128MBIT) - -const device_type SHARP_LH28F400 = sharp_lh28f400_device_config::static_alloc_device_config; -const device_type INTEL_TE28F160 = intel_te28f160_device_config::static_alloc_device_config; -const device_type INTEL_E28F400 = intel_e28f400_device_config::static_alloc_device_config; -const device_type SHARP_UNK128MBIT = sharp_unk128mbit_device_config::static_alloc_device_config; - - +// device type definition +const device_type INTEL_28F016S5 = &device_creator<intel_28f016s5_device>; +const device_type SHARP_LH28F016S = &device_creator<sharp_lh28f016s_device>; +const device_type FUJITSU_29F016A = &device_creator<fujitsu_29f016a_device>; +const device_type INTEL_E28F400 = &device_creator<intel_e28f400_device>; +const device_type MACRONIX_29L001MC = &device_creator<macronix_29l001mc_device>; +const device_type PANASONIC_MN63F805MNP = &device_creator<panasonic_mn63f805mnp_device>; +const device_type SANYO_LE26FV10N1TS = &device_creator<sanyo_le26fv10n1ts_device>; -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** +const device_type SHARP_LH28F400 = &device_creator<sharp_lh28f400_device>; +const device_type INTEL_E28F008SA = &device_creator<intel_e28f008sa_device>; +const device_type INTEL_TE28F160 = &device_creator<intel_te28f160_device>; +const device_type SHARP_UNK128MBIT = &device_creator<sharp_unk128mbit_device>; static ADDRESS_MAP_START( memory_map8_512Kb, AS_PROGRAM, 8 ) AM_RANGE(0x00000, 0x00ffff) AM_RAM @@ -113,23 +90,29 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** //------------------------------------------------- -// intelfsh_device_config - constructor +// intelfsh_device - constructor //------------------------------------------------- -intelfsh_device_config::intelfsh_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant) - : device_config(mconfig, type, name, tag, owner, clock), - device_config_memory_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this), +intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant) + : device_t(mconfig, type, name, tag, owner, clock), + device_memory_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), m_type(variant), m_size(0), m_bits(8), m_device_id(0), m_maker_id(0), - m_sector_is_4k(false) + m_sector_is_4k(false), + m_status(0x80), + m_erase_sector(0), + m_flash_mode(FM_NORMAL), + m_flash_master_lock(false), + m_timer(NULL), + m_bank(0) { address_map_constructor map = NULL; @@ -219,56 +202,45 @@ intelfsh_device_config::intelfsh_device_config(const machine_config &mconfig, de m_space_config = address_space_config("flash", ENDIANNESS_BIG, m_bits, addrbits, (m_bits == 8) ? 0 : -1, map); } -intelfsh8_device_config::intelfsh8_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant) - : intelfsh_device_config(mconfig, type, name, tag, owner, clock, variant) -{ -} +intelfsh8_device::intelfsh8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant) + : intelfsh_device(mconfig, type, name, tag, owner, clock, variant) { } -intelfsh16_device_config::intelfsh16_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant) - : intelfsh_device_config(mconfig, type, name, tag, owner, clock, variant) -{ -} +intelfsh16_device::intelfsh16_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant) + : intelfsh_device(mconfig, type, name, tag, owner, clock, variant) { } -//------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- +intel_28f016s5_device::intel_28f016s5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, INTEL_28F016S5, "Intel 28F016S5 Flash", tag, owner, clock, FLASH_INTEL_28F016S5) { } -const address_space_config *intelfsh_device_config::memory_space_config(address_spacenum spacenum) const -{ - return (spacenum == 0) ? &m_space_config : NULL; -} +fujitsu_29f016a_device::fujitsu_29f016a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, FUJITSU_29F016A, "Fujitsu 29F016A Flash", tag, owner, clock, FLASH_FUJITSU_29F016A) { } +sharp_lh28f016s_device::sharp_lh28f016s_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, SHARP_LH28F016S, "Sharp LH28F016S Flash", tag, owner, clock, FLASH_SHARP_LH28F016S) { } +intel_e28f008sa_device::intel_e28f008sa_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, INTEL_E28F008SA, "Intel E28F008SA Flash", tag, owner, clock, FLASH_INTEL_E28F008SA) { } -//************************************************************************** -// LIVE DEVICE -//************************************************************************** +macronix_29l001mc_device::macronix_29l001mc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, MACRONIX_29L001MC, "Macronix 29L001MC Flash", tag, owner, clock, FLASH_MACRONIX_29L001MC) { } -//------------------------------------------------- -// intelfsh_device - constructor -//------------------------------------------------- +panasonic_mn63f805mnp_device::panasonic_mn63f805mnp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, PANASONIC_MN63F805MNP, "Panasonic MN63F805MNP Flash", tag, owner, clock, FLASH_PANASONIC_MN63F805MNP) { } -intelfsh_device::intelfsh_device(running_machine &_machine, const intelfsh_device_config &config) - : device_t(_machine, config), - device_memory_interface(_machine, config, *this), - device_nvram_interface(_machine, config, *this), - m_config(config), - m_status(0x80), - m_erase_sector(0), - m_flash_mode(FM_NORMAL), - m_flash_master_lock(false), - m_timer(NULL), - m_bank(0) -{ -} +sanyo_le26fv10n1ts_device::sanyo_le26fv10n1ts_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh8_device(mconfig, SANYO_LE26FV10N1TS, "Sanyo LE26FV10N1TS Flash", tag, owner, clock, FLASH_SANYO_LE26FV10N1TS) { } + +sharp_lh28f400_device::sharp_lh28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh16_device(mconfig, SHARP_LH28F400, "Sharp LH28F400 Flash", tag, owner, clock, FLASH_SHARP_LH28F400) { } -intelfsh8_device::intelfsh8_device(running_machine &_machine, const intelfsh_device_config &config) - : intelfsh_device(_machine, config) { } +intel_te28f160_device::intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh16_device(mconfig, INTEL_TE28F160, "Intel TE28F160 Flash", tag, owner, clock, FLASH_INTEL_TE28F160) { } -intelfsh16_device::intelfsh16_device(running_machine &_machine, const intelfsh_device_config &config) - : intelfsh_device(_machine, config) { } +intel_e28f400_device::intel_e28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh16_device(mconfig, INTEL_E28F400, "Intel E28F400 Flash", tag, owner, clock, FLASH_INTEL_E28F400) { } + +sharp_unk128mbit_device::sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh16_device(mconfig, SHARP_UNK128MBIT, "Sharp Unknown 128Mbit Flash", tag, owner, clock, FLASH_SHARP_UNK128MBIT) { } //------------------------------------------------- @@ -305,6 +277,17 @@ void intelfsh_device::device_timer(emu_timer &timer, device_timer_id id, int par //------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *intelfsh_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == 0) ? &m_space_config : NULL; +} + + +//------------------------------------------------- // nvram_default - called to initialize NVRAM to // its default state //------------------------------------------------- @@ -315,10 +298,10 @@ void intelfsh_device::nvram_default() if (m_region != NULL) { UINT32 bytes = m_region->bytes(); - if (bytes > m_config.m_size) - bytes = m_config.m_size; + if (bytes > m_size) + bytes = m_size; - if (m_config.m_bits == 8) + if (m_bits == 8) { for (offs_t offs = 0; offs < bytes; offs++) m_addrspace[0]->write_byte(offs, m_region->u8(offs)); @@ -332,7 +315,7 @@ void intelfsh_device::nvram_default() } // otherwise, default to 0xff - for (offs_t offs = 0; offs < m_config.m_size; offs++) + for (offs_t offs = 0; offs < m_size; offs++) m_addrspace[0]->write_byte(offs, 0xff); } @@ -344,9 +327,9 @@ void intelfsh_device::nvram_default() void intelfsh_device::nvram_read(emu_file &file) { - UINT8 *buffer = global_alloc_array(UINT8, m_config.m_size); - file.read(buffer, m_config.m_size); - for (int byte = 0; byte < m_config.m_size; byte++) + UINT8 *buffer = global_alloc_array(UINT8, m_size); + file.read(buffer, m_size); + for (int byte = 0; byte < m_size; byte++) m_addrspace[0]->write_byte(byte, buffer[byte]); global_free(buffer); } @@ -359,10 +342,10 @@ void intelfsh_device::nvram_read(emu_file &file) void intelfsh_device::nvram_write(emu_file &file) { - UINT8 *buffer = global_alloc_array(UINT8, m_config.m_size); - for (int byte = 0; byte < m_config.m_size; byte++) + UINT8 *buffer = global_alloc_array(UINT8, m_size); + for (int byte = 0; byte < m_size; byte++) buffer[byte] = m_addrspace[0]->read_byte(byte); - file.write(buffer, m_config.m_size); + file.write(buffer, m_size); global_free(buffer); } @@ -380,7 +363,7 @@ UINT32 intelfsh_device::read_full(UINT32 address) { default: case FM_NORMAL: - switch( m_config.m_bits ) + switch( m_bits ) { case 8: { @@ -398,13 +381,13 @@ UINT32 intelfsh_device::read_full(UINT32 address) data = m_status; break; case FM_READAMDID3: - if (m_config.m_maker_id == 0x04 && m_config.m_device_id == 0x35) + if (m_maker_id == 0x04 && m_device_id == 0x35) { //used in Fujitsu 29DL16X 8bits mode switch (address) { - case 0: data = m_config.m_maker_id; break; - case 2: data = m_config.m_device_id; break; + case 0: data = m_maker_id; break; + case 2: data = m_device_id; break; case 4: data = 0; break; } } @@ -412,8 +395,8 @@ UINT32 intelfsh_device::read_full(UINT32 address) { switch (address) { - case 0: data = m_config.m_maker_id; break; - case 1: data = m_config.m_device_id; break; + case 0: data = m_maker_id; break; + case 1: data = m_device_id; break; case 2: data = 0; break; } } @@ -422,10 +405,10 @@ UINT32 intelfsh_device::read_full(UINT32 address) switch (address) { case 0: // maker ID - data = m_config.m_maker_id; + data = m_maker_id; break; case 1: // chip ID - data = m_config.m_device_id; + data = m_device_id; break; case 2: // block lock config data = 0; // we don't support this yet @@ -446,7 +429,7 @@ UINT32 intelfsh_device::read_full(UINT32 address) // reads outside of the erasing sector return normal data if ((address < m_erase_sector) || (address >= m_erase_sector+(64*1024))) { - switch( m_config.m_bits ) + switch( m_bits ) { case 8: { @@ -600,7 +583,7 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) { m_flash_mode = FM_NORMAL; } - else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xb0 && m_config.m_maker_id == 0x62 && m_config.m_device_id == 0x13 ) + else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xb0 && m_maker_id == 0x62 && m_device_id == 0x13 ) { m_flash_mode = FM_BANKSELECT; } @@ -647,13 +630,13 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) (( address & 0xfff ) == 0xaaa && ( data & 0xff ) == 0x10 ) ) { // chip erase - for (offs_t offs = 0; offs < m_config.m_size; offs++) + for (offs_t offs = 0; offs < m_size; offs++) m_addrspace[0]->write_byte(offs, 0xff); m_status = 1 << 3; m_flash_mode = FM_ERASEAMD4; - if (m_config.m_sector_is_4k) + if (m_sector_is_4k) { m_timer->adjust( attotime::from_seconds( 1 ) ); } @@ -666,19 +649,19 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) { // sector erase // clear the 4k/64k block containing the current address to all 0xffs - UINT32 base = address * ((m_config.m_bits == 16) ? 2 : 1); - if (m_config.m_sector_is_4k) + UINT32 base = address * ((m_bits == 16) ? 2 : 1); + if (m_sector_is_4k) { for (offs_t offs = 0; offs < 4 * 1024; offs++) m_addrspace[0]->write_byte((base & ~0xfff) + offs, 0xff); - m_erase_sector = address & ((m_config.m_bits == 16) ? ~0x7ff : ~0xfff); + m_erase_sector = address & ((m_bits == 16) ? ~0x7ff : ~0xfff); m_timer->adjust( attotime::from_msec( 125 ) ); } else { for (offs_t offs = 0; offs < 64 * 1024; offs++) m_addrspace[0]->write_byte((base & ~0xffff) + offs, 0xff); - m_erase_sector = address & ((m_config.m_bits == 16) ? ~0x7fff : ~0xffff); + m_erase_sector = address & ((m_bits == 16) ? ~0x7fff : ~0xffff); m_timer->adjust( attotime::from_seconds( 1 ) ); } @@ -691,7 +674,7 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) } break; case FM_BYTEPROGRAM: - switch( m_config.m_bits ) + switch( m_bits ) { case 8: { @@ -699,13 +682,13 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) } break; default: - logerror( "FM_BYTEPROGRAM not supported when m_bits == %d\n", m_config.m_bits ); + logerror( "FM_BYTEPROGRAM not supported when m_bits == %d\n", m_bits ); break; } m_flash_mode = FM_NORMAL; break; case FM_WRITEPART1: - switch( m_config.m_bits ) + switch( m_bits ) { case 8: { @@ -718,7 +701,7 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) } break; default: - logerror( "FM_WRITEPART1 not supported when m_bits == %d\n", m_config.m_bits ); + logerror( "FM_WRITEPART1 not supported when m_bits == %d\n", m_bits ); break; } m_status = 0x80; @@ -728,7 +711,7 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data) if( ( data & 0xff ) == 0xd0 ) { // clear the 64k block containing the current address to all 0xffs - UINT32 base = address * ((m_config.m_bits == 16) ? 2 : 1); + UINT32 base = address * ((m_bits == 16) ? 2 : 1); for (offs_t offs = 0; offs < 64 * 1024; offs++) m_addrspace[0]->write_byte((base & ~0xffff) + offs, 0xff); diff --git a/src/emu/machine/intelfsh.h b/src/emu/machine/intelfsh.h index d6faa63ffa4..9d68b9147f4 100644 --- a/src/emu/machine/intelfsh.h +++ b/src/emu/machine/intelfsh.h @@ -55,16 +55,13 @@ class intelfsh_device; -// ======================> intelfsh_device_config +// ======================> intelfsh_device -class intelfsh_device_config : public device_config, - public device_config_memory_interface, - public device_config_nvram_interface +class intelfsh_device : public device_t, + public device_memory_interface, + public device_nvram_interface { - friend class intelfsh_device; - -protected: - // constants +public: enum { // 8-bit variants @@ -84,41 +81,19 @@ protected: FLASH_SHARP_UNK128MBIT }; - // construction/destruction - intelfsh_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant); - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; - - // internal state - address_space_config m_space_config; - UINT32 m_type; - INT32 m_size; - UINT8 m_bits; - UINT8 m_device_id; - UINT8 m_maker_id; - bool m_sector_is_4k; -}; - - -// ======================> intelfsh_device - -class intelfsh_device : public device_t, - public device_memory_interface, - public device_nvram_interface -{ - friend class intelfsh_device_config; - protected: // construction/destruction - intelfsh_device(running_machine &_machine, const intelfsh_device_config &config); + intelfsh_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant); protected: // device-level overrides virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); - // device_config_nvram_interface overrides + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + + // device_nvram_interface overrides virtual void nvram_default(); virtual void nvram_read(emu_file &file); virtual void nvram_write(emu_file &file); @@ -127,27 +102,22 @@ protected: UINT32 read_full(UINT32 offset); void write_full(UINT32 offset, UINT32 data); - // internal state - const intelfsh_device_config & m_config; - - UINT8 m_status; - INT32 m_erase_sector; - INT32 m_flash_mode; - bool m_flash_master_lock; - emu_timer * m_timer; - INT32 m_bank; -}; - - -// ======================> intelfsh8_device_config - -class intelfsh8_device_config : public intelfsh_device_config -{ - friend class intelfsh8_device; + // configuration state + address_space_config m_space_config; + UINT32 m_type; + INT32 m_size; + UINT8 m_bits; + UINT8 m_device_id; + UINT8 m_maker_id; + bool m_sector_is_4k; -protected: - // construction/destruction - intelfsh8_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant); + // internal state + UINT8 m_status; + INT32 m_erase_sector; + INT32 m_flash_mode; + bool m_flash_master_lock; + emu_timer * m_timer; + INT32 m_bank; }; @@ -155,19 +125,9 @@ protected: class intelfsh8_device : public intelfsh_device { - friend class intelfsh8_device_config; - friend class intel_28f016s5_device_config; - friend class fujitsu_29f016a_device_config; - friend class fujitsu_29dl16x_device_config; - friend class sharp_lh28f016s_device_config; - friend class intel_e28f008sa_device_config; - friend class macronix_29l001mc_device_config; - friend class panasonic_mn63f805mnp_device_config; - friend class sanyo_le26fv10n1ts_device_config; - protected: // construction/destruction - intelfsh8_device(running_machine &_machine, const intelfsh_device_config &config); + intelfsh8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant); public: // public interface @@ -179,31 +139,13 @@ public: }; -// ======================> intelfsh16_device_config - -class intelfsh16_device_config : public intelfsh_device_config -{ - friend class intelfsh16_device; - -protected: - // construction/destruction - intelfsh16_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant); -}; - - // ======================> intelfsh16_device class intelfsh16_device : public intelfsh_device { - friend class intelfsh16_device_config; - friend class sharp_lh28f400_device_config; - friend class intel_te28f160_device_config; - friend class intel_e28f400_device_config; - friend class sharp_unk128mbit_device_config; - protected: // construction/destruction - intelfsh16_device(running_machine &_machine, const intelfsh_device_config &config); + intelfsh16_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant); public: // public interface @@ -218,21 +160,73 @@ public: // ======================> trivial variants // 8-bit variants -DECLARE_TRIVIAL_DERIVED_DEVICE(intel_28f016s5_device_config, intelfsh8_device_config, intel_28f016s5_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(fujitsu_29f016a_device_config, intelfsh8_device_config, fujitsu_29f016a_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(fujitsu_29dl16x_device_config, intelfsh8_device_config, fujitsu_29dl16x_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f016s_device_config, intelfsh8_device_config, sharp_lh28f016s_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(intel_e28f008sa_device_config, intelfsh8_device_config, intel_e28f008sa_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(macronix_29l001mc_device_config, intelfsh8_device_config, macronix_29l001mc_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(panasonic_mn63f805mnp_device_config, intelfsh8_device_config, panasonic_mn63f805mnp_device, intelfsh8_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(sanyo_le26fv10n1ts_device_config, intelfsh8_device_config, sanyo_le26fv10n1ts_device, intelfsh8_device) +class intel_28f016s5_device : public intelfsh8_device +{ +public: + intel_28f016s5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class fujitsu_29f016a_device : public intelfsh8_device +{ +public: + fujitsu_29f016a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class sharp_lh28f016s_device : public intelfsh8_device +{ +public: + sharp_lh28f016s_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class intel_e28f008sa_device : public intelfsh8_device +{ +public: + intel_e28f008sa_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class macronix_29l001mc_device : public intelfsh8_device +{ +public: + macronix_29l001mc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class panasonic_mn63f805mnp_device : public intelfsh8_device +{ +public: + panasonic_mn63f805mnp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class sanyo_le26fv10n1ts_device : public intelfsh8_device +{ +public: + sanyo_le26fv10n1ts_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; // 16-bit variants -DECLARE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f400_device_config, intelfsh16_device_config, sharp_lh28f400_device, intelfsh16_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(intel_te28f160_device_config, intelfsh16_device_config, intel_te28f160_device, intelfsh16_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(intel_e28f400_device_config, intelfsh16_device_config, intel_e28f400_device, intelfsh16_device) -DECLARE_TRIVIAL_DERIVED_DEVICE(sharp_unk128mbit_device_config, intelfsh16_device_config, sharp_unk128mbit_device, intelfsh16_device) +class sharp_lh28f400_device : public intelfsh16_device +{ +public: + sharp_lh28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class intel_te28f160_device : public intelfsh16_device +{ +public: + intel_te28f160_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class intel_e28f400_device : public intelfsh16_device +{ +public: + intel_e28f400_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class sharp_unk128mbit_device : public intelfsh16_device +{ +public: + sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; diff --git a/src/emu/machine/k033906.c b/src/emu/machine/k033906.c index 99e20ed6aee..2e8aa7dac70 100644 --- a/src/emu/machine/k033906.c +++ b/src/emu/machine/k033906.c @@ -11,10 +11,21 @@ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(k033906, "Konami 033906") +// device type definition +const device_type K033906 = &device_creator<k033906_device>; + +//------------------------------------------------- +// k033906_device - constructor +//------------------------------------------------- + +k033906_device::k033906_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, K033906, "Konami 033906", tag, owner, clock) +{ + +} //------------------------------------------------- // device_config_complete - perform any @@ -22,7 +33,7 @@ GENERIC_DEVICE_CONFIG_SETUP(k033906, "Konami 033906") // complete //------------------------------------------------- -void k033906_device_config::device_config_complete() +void k033906_device::device_config_complete() { // inherit a copy of the static data const k033906_interface *intf = reinterpret_cast<const k033906_interface *>(static_config()); @@ -39,31 +50,13 @@ void k033906_device_config::device_config_complete() } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type K033906 = k033906_device_config::static_alloc_device_config; - -//------------------------------------------------- -// k033906_device - constructor -//------------------------------------------------- - -k033906_device::k033906_device(running_machine &_machine, const k033906_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void k033906_device::device_start() { - m_voodoo = machine().device(m_config.m_voodoo_tag); + m_voodoo = machine().device(m_voodoo_tag); m_reg = auto_alloc_array(machine(), UINT32, 256); m_ram = auto_alloc_array(machine(), UINT32, 32768); diff --git a/src/emu/machine/k033906.h b/src/emu/machine/k033906.h index 43b6e127b0e..7a46d253539 100644 --- a/src/emu/machine/k033906.h +++ b/src/emu/machine/k033906.h @@ -36,38 +36,14 @@ struct k033906_interface -// ======================> k033906_device_config - -class k033906_device_config : public device_config, - public k033906_interface -{ - friend class k033906_device; - - // construction/destruction - k033906_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> k033906_device -class k033906_device : public device_t +class k033906_device : public device_t, + public k033906_interface { - friend class k033906_device_config; - - // construction/destruction - k033906_device(running_machine &_machine, const k033906_device_config &_config); - public: + // construction/destruction + k033906_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); UINT32 k033906_r(UINT32 offset); void k033906_w(UINT32 offset, UINT32 data, UINT32 mem_mask); @@ -75,6 +51,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset() { } virtual void device_post_load() { } @@ -92,8 +69,6 @@ private: int m_reg_set; // 1 = access reg / 0 = access ram device_t *m_voodoo; - - const k033906_device_config &m_config; }; diff --git a/src/emu/machine/k056230.c b/src/emu/machine/k056230.c index 979db7186fa..4a5ead590b0 100644 --- a/src/emu/machine/k056230.c +++ b/src/emu/machine/k056230.c @@ -10,10 +10,22 @@ //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(k056230, "Konami 056230") +// device type definition +const device_type K056230 = &device_creator<k056230_device>; + +//------------------------------------------------- +// k056230_device - constructor +//------------------------------------------------- + +k056230_device::k056230_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, K056230, "Konami 056230", tag, owner, clock) +{ + +} + //------------------------------------------------- // device_config_complete - perform any @@ -21,7 +33,7 @@ GENERIC_DEVICE_CONFIG_SETUP(k056230, "Konami 056230") // complete //------------------------------------------------- -void k056230_device_config::device_config_complete() +void k056230_device::device_config_complete() { // inherit a copy of the static data const k056230_interface *intf = reinterpret_cast<const k056230_interface *>(static_config()); @@ -33,47 +45,27 @@ void k056230_device_config::device_config_complete() // or initialize to defaults if none provided else { - m_cpu = NULL; - m_is_thunderh = 0; + m_cpu_tag = NULL; + m_is_thunderh = false; } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -const device_type K0506230 = k056230_device_config::static_alloc_device_config; - -//------------------------------------------------- -// k056230_device - constructor -//------------------------------------------------- - -k056230_device::k056230_device(running_machine &_machine, const k056230_device_config &config) - : device_t(_machine, config), - m_config(config) -{ - -} - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void k056230_device::device_start() { - if(m_config.m_cpu) + if(m_cpu_tag) { - m_cpu = machine().device(m_config.m_cpu); + m_cpu = machine().device(m_cpu_tag); } else { m_cpu = NULL; } - m_is_thunderh = m_config.m_is_thunderh; - m_ram = auto_alloc_array(machine(), UINT32, 0x2000); save_pointer(NAME(m_ram), 0x2000); diff --git a/src/emu/machine/k056230.h b/src/emu/machine/k056230.h index 81ee41ebc96..5d6d67ec103 100644 --- a/src/emu/machine/k056230.h +++ b/src/emu/machine/k056230.h @@ -18,7 +18,7 @@ ***************************************************************************/ #define MCFG_K056230_ADD(_tag, _config) \ - MCFG_DEVICE_ADD(_tag, K0506230, 0) \ + MCFG_DEVICE_ADD(_tag, K056230, 0) \ MCFG_DEVICE_CONFIG(_config) @@ -31,44 +31,20 @@ struct k056230_interface { - const char *m_cpu; - int m_is_thunderh; -}; - - - -// ======================> k056230_device_config - -class k056230_device_config : public device_config, - public k056230_interface -{ - friend class k056230_device; - - // construction/destruction - k056230_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + const char *m_cpu_tag; + bool m_is_thunderh; }; // ======================> k056230_device -class k056230_device : public device_t +class k056230_device : public device_t, + public k056230_interface { - friend class k056230_device_config; - - // construction/destruction - k056230_device(running_machine &_machine, const k056230_device_config &_config); - public: + // construction/destruction + k056230_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); UINT32 lanc_ram_r(UINT32 offset); void lanc_ram_w(UINT32 offset, UINT32 data, UINT32 mem_mask); @@ -80,6 +56,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset() { } virtual void device_post_load() { } @@ -90,16 +67,12 @@ private: void network_irq_clear(); UINT32 *m_ram; - int m_is_thunderh; - device_t *m_cpu; - - const k056230_device_config &m_config; }; // device type definition -extern const device_type K0506230; +extern const device_type K056230; diff --git a/src/emu/machine/latch8.c b/src/emu/machine/latch8.c index 5ec709f1597..1187a491900 100644 --- a/src/emu/machine/latch8.c +++ b/src/emu/machine/latch8.c @@ -187,7 +187,7 @@ static DEVICE_START( latch8 ) int i; /* validate arguments */ - latch8->intf = (latch8_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + latch8->intf = (latch8_config *)downcast<const legacy_device_base *>(device)->inline_config(); latch8->value = 0x0; diff --git a/src/emu/machine/ldcore.c b/src/emu/machine/ldcore.c index 353fb68d130..759d7a94a11 100644 --- a/src/emu/machine/ldcore.c +++ b/src/emu/machine/ldcore.c @@ -1124,9 +1124,9 @@ static void configuration_save(running_machine &machine, int config_type, xml_da return; /* iterate over disc devices */ - for (device = machine.m_devicelist.first(LASERDISC); device != NULL; device = device->typenext()) + for (device = machine.devicelist().first(LASERDISC); device != NULL; device = device->typenext()) { - laserdisc_config *origconfig = (laserdisc_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + laserdisc_config *origconfig = (laserdisc_config *)downcast<const legacy_device_base *>(device)->inline_config(); laserdisc_state *ld = get_safe_token(device); ldcore_data *ldcore = ld->core; xml_data_node *overnode; @@ -1214,7 +1214,7 @@ void laserdisc_overlay_enable(device_t *device, int enable) SCREEN_UPDATE( laserdisc ) { - device_t *laserdisc = screen->machine().m_devicelist.first(LASERDISC); + device_t *laserdisc = screen->machine().devicelist().first(LASERDISC); if (laserdisc != NULL) { const rectangle &visarea = screen->visible_area(); @@ -1322,7 +1322,7 @@ void laserdisc_set_config(device_t *device, const laserdisc_config *config) static void init_disc(device_t *device) { - const laserdisc_config *config = (const laserdisc_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + const laserdisc_config *config = (const laserdisc_config *)downcast<const legacy_device_base *>(device)->inline_config(); laserdisc_state *ld = get_safe_token(device); ldcore_data *ldcore = ld->core; chd_error err; @@ -1473,7 +1473,7 @@ static void init_audio(device_t *device) static DEVICE_START( laserdisc ) { - const laserdisc_config *config = (const laserdisc_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + const laserdisc_config *config = (const laserdisc_config *)downcast<const legacy_device_base *>(device)->inline_config(); laserdisc_state *ld = get_safe_token(device); ldcore_data *ldcore; int statesize; @@ -1616,12 +1616,12 @@ void laserdisc_set_type(device_t *device, int type) device get info callback -------------------------------------------------*/ -static const ldplayer_interface *get_interface(const device_config *devconfig) +static const ldplayer_interface *get_interface(const device_t *device) { - if (devconfig == NULL) + if (device == NULL) return NULL; - const laserdisc_config *config = (const laserdisc_config *)downcast<const legacy_device_config_base *>(devconfig)->inline_config(); + const laserdisc_config *config = (const laserdisc_config *)downcast<const legacy_device_base *>(device)->inline_config(); if (config == NULL) return NULL; diff --git a/src/emu/machine/mb3773.c b/src/emu/machine/mb3773.c index e6e1eac96d7..925def0a33f 100644 --- a/src/emu/machine/mb3773.c +++ b/src/emu/machine/mb3773.c @@ -15,58 +15,29 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type MB3773 = mb3773_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// mb3773_device_config - constructor -//------------------------------------------------- - -mb3773_device_config::mb3773_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ) - : device_config(mconfig, static_alloc_device_config, "MB3773", tag, owner, clock) -{ -} - - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *mb3773_device_config::static_alloc_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ) -{ - return global_alloc( mb3773_device_config( mconfig, tag, owner, clock ) ); -} - - +// device type definition +const device_type MB3773 = &device_creator<mb3773_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// mb3773_device - constructor //------------------------------------------------- -device_t *mb3773_device_config::alloc_device( running_machine &machine ) const +mb3773_device::mb3773_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ) + : device_t(mconfig, MB3773, "MB3773", tag, owner, clock) { - return auto_alloc( machine, mb3773_device( machine, *this ) ); } - //------------------------------------------------- // device_config_complete - perform any // operations now that the configuration is // complete //------------------------------------------------- -void mb3773_device_config::device_config_complete() +void mb3773_device::device_config_complete() { } @@ -76,29 +47,12 @@ void mb3773_device_config::device_config_complete() // on this device //------------------------------------------------- -bool mb3773_device_config::device_validity_check( emu_options &options, const game_driver &driver ) const +bool mb3773_device::device_validity_check( emu_options &options, const game_driver &driver ) const { return false; } - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// mb3773_device - constructor -//------------------------------------------------- - -mb3773_device::mb3773_device( running_machine &_machine, const mb3773_device_config &config ) : - device_t( _machine, config ), - m_config( config ) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- diff --git a/src/emu/machine/mb3773.h b/src/emu/machine/mb3773.h index 80dbb855645..24874b3f534 100644 --- a/src/emu/machine/mb3773.h +++ b/src/emu/machine/mb3773.h @@ -20,44 +20,22 @@ MCFG_DEVICE_ADD(_tag, MB3773, 0) -// ======================> mb3773_device_config - -class mb3773_device_config : - public device_config -{ - friend class mb3773_device; - - // construction/destruction - mb3773_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ); - -public: - // allocators - static device_config *static_alloc_device_config( const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock ); - virtual device_t *alloc_device( running_machine &machine ) const; - -protected: - // device_config overrides - virtual void device_config_complete(); - virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; -}; - - // ======================> mb3773_device class mb3773_device : public device_t { - friend class mb3773_device_config; - +public: // construction/destruction - mb3773_device( running_machine &_machine, const mb3773_device_config &config ); + mb3773_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock ); -public: // I/O operations void set_ck( int state ); protected: // device-level overrides + virtual void device_config_complete(); + virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; virtual void device_start(); virtual void device_reset(); @@ -66,7 +44,6 @@ protected: void reset_timer(); // internal state - const mb3773_device_config &m_config; emu_timer *m_watchdog_timer; int m_ck; }; diff --git a/src/emu/machine/mb87078.c b/src/emu/machine/mb87078.c index c487e751ae8..26cd8680ac0 100644 --- a/src/emu/machine/mb87078.c +++ b/src/emu/machine/mb87078.c @@ -123,7 +123,7 @@ INLINE const mb87078_interface *get_interface( device_t *device ) { assert(device != NULL); assert((device->type() == MB87078)); - return (const mb87078_interface *) device->baseconfig().static_config(); + return (const mb87078_interface *) device->static_config(); } /***************************************************************************** diff --git a/src/emu/machine/mc146818.c b/src/emu/machine/mc146818.c index 3120cca44f0..9b8fa827cc9 100644 --- a/src/emu/machine/mc146818.c +++ b/src/emu/machine/mc146818.c @@ -101,48 +101,26 @@ //************************************************************************** -// DEVICE DEFINITIONS +// LIVE DEVICE //************************************************************************** -const device_type MC146818 = mc146818_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** +// device type definition +const device_type MC146818 = &device_creator<mc146818_device>; //------------------------------------------------- -// mc146818_device_config - constructor -//------------------------------------------------- - -mc146818_device_config::mc146818_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "NVRAM", tag, owner, clock), - device_config_rtc_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this), - m_type(MC146818_STANDARD) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *mc146818_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(mc146818_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object +// mc146818_device - constructor //------------------------------------------------- -device_t *mc146818_device_config::alloc_device(running_machine &machine) const +mc146818_device::mc146818_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MC146818, "NVRAM", tag, owner, clock), + device_rtc_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), + m_type(MC146818_STANDARD), + m_index(0), + m_eindex(0), + m_updated(false), + m_last_refresh(attotime::zero) { - return auto_alloc(machine, mc146818_device(machine, *this)); } @@ -151,31 +129,9 @@ device_t *mc146818_device_config::alloc_device(running_machine &machine) const // to set the interface //------------------------------------------------- -void mc146818_device_config::static_set_type(device_config *device, mc146818_type type) -{ - downcast<mc146818_device_config *>(device)->m_type = type; -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// mc146818_device - constructor -//------------------------------------------------- - -mc146818_device::mc146818_device(running_machine &_machine, const mc146818_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), - device_nvram_interface(_machine, config, *this), - m_config(config), - m_index(0), - m_eindex(0), - m_updated(false), - m_last_refresh(attotime::zero) +void mc146818_device::static_set_type(device_t &device, mc146818_type type) { + downcast<mc146818_device &>(device).m_type = type; } @@ -187,7 +143,7 @@ void mc146818_device::device_start() { m_last_refresh = machine().time(); emu_timer *timer = timer_alloc(); - if (m_config.m_type == mc146818_device_config::MC146818_UTC) { + if (m_type == MC146818_UTC) { // hack: for apollo we increase the update frequency to stay in sync with real time timer->adjust(attotime::from_hz(2), 0, attotime::from_hz(2)); } else { @@ -205,7 +161,7 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par { int year/*, month*/; - if (m_config.m_type == mc146818_device_config::MC146818_UTC) { + if (m_type == MC146818_UTC) { // hack: set correct real time even for overloaded emulation // (at least for apollo) static osd_ticks_t t0 = 0; @@ -247,7 +203,7 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par DAY=bcd_adjust(DAY+1); //month=bcd_2_dec(MONTH); year=bcd_2_dec(YEAR); - if (m_config.m_type!=mc146818_device_config::MC146818_IGNORE_CENTURY) year+=bcd_2_dec(CENTURY)*100; + if (m_type!=MC146818_IGNORE_CENTURY) year+=bcd_2_dec(CENTURY)*100; else year+=2000; // save for julian_days_in_month calculation DAY=bcd_adjust(DAY+1); if (DAY>gregorian_days_in_month(MONTH, year)) @@ -258,7 +214,7 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par { MONTH=1; YEAR=year=bcd_adjust(YEAR+1); - if (m_config.m_type!=mc146818_device_config::MC146818_IGNORE_CENTURY) + if (m_type!=MC146818_IGNORE_CENTURY) { if (year>=0x100) { @@ -286,14 +242,14 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par m_data[4]=0; WEEK_DAY=(WEEK_DAY+1)%7; year=YEAR; - if (m_config.m_type!=mc146818_device_config::MC146818_IGNORE_CENTURY) year+=CENTURY*100; + if (m_type!=MC146818_IGNORE_CENTURY) year+=CENTURY*100; else year+=2000; // save for julian_days_in_month calculation if (++DAY>gregorian_days_in_month(MONTH, year)) { DAY=1; if (++MONTH>12) { MONTH=1; YEAR++; - if (m_config.m_type!=mc146818_device_config::MC146818_IGNORE_CENTURY) { + if (m_type!=MC146818_IGNORE_CENTURY) { if (YEAR>=100) { CENTURY++;YEAR=0; } } else { YEAR%=100; @@ -407,7 +363,7 @@ void mc146818_device::set_base_datetime() machine().base_datetime(systime); - current_time = m_config.m_type == mc146818_device_config::MC146818_UTC ? systime.utc_time: systime.local_time; + current_time = m_type == MC146818_UTC ? systime.utc_time: systime.local_time; // temporary hack to go back 20 year (e.g. from 2010 -> 1990) // current_time.year -= 20; @@ -421,7 +377,7 @@ void mc146818_device::set_base_datetime() else m_data[4] = dec_2_local(current_time.hour - 12) | 0x80; - if (m_config.m_type != mc146818_device_config::MC146818_IGNORE_CENTURY) + if (m_type != MC146818_IGNORE_CENTURY) CENTURY = dec_2_local(current_time.year /100); m_data[0] = dec_2_local(current_time.second); diff --git a/src/emu/machine/mc146818.h b/src/emu/machine/mc146818.h index da35b90ecc4..d7d09ebf7ad 100644 --- a/src/emu/machine/mc146818.h +++ b/src/emu/machine/mc146818.h @@ -21,7 +21,7 @@ #define MCFG_MC146818_ADD(_tag, _type) \ MCFG_DEVICE_ADD(_tag, MC146818, 0) \ - mc146818_device_config::static_set_type(device, mc146818_device_config::_type); \ + mc146818_device::static_set_type(*device, mc146818_device::_type); \ @@ -29,20 +29,12 @@ // TYPE DEFINITIONS //************************************************************************** -class mc146818_device; - - -// ======================> mc146818_device_config +// ======================> mc146818_device -class mc146818_device_config : public device_config, - public device_config_rtc_interface, - public device_config_nvram_interface +class mc146818_device : public device_t, + public device_rtc_interface, + public device_nvram_interface { - friend class mc146818_device; - - // construction/destruction - mc146818_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - public: // values enum mc146818_type @@ -53,31 +45,12 @@ public: MC146818_UTC }; - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; + // construction/destruction + mc146818_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // inline configuration helpers - static void static_set_type(device_config *device, mc146818_type type); + static void static_set_type(device_t &device, mc146818_type type); -protected: - // internal state - mc146818_type m_type; -}; - - -// ======================> mc146818_device - -class mc146818_device : public device_t, - public device_rtc_interface, - public device_nvram_interface -{ - friend class mc146818_device_config; - - // construction/destruction - mc146818_device(running_machine &_machine, const mc146818_device_config &config); - -public: // read/write access DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -103,7 +76,7 @@ protected: // internal state static const int MC146818_DATA_SIZE = 0x80; - const mc146818_device_config & m_config; + mc146818_type m_type; UINT8 m_index; UINT8 m_data[MC146818_DATA_SIZE]; diff --git a/src/emu/machine/mc6852.c b/src/emu/machine/mc6852.c index db2c7ce697b..735865630f9 100644 --- a/src/emu/machine/mc6852.c +++ b/src/emu/machine/mc6852.c @@ -27,6 +27,9 @@ #include "machine/devhelpr.h" +// device type definition +const device_type MC6852 = &device_creator<mc6852_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -81,19 +84,31 @@ //************************************************************************** -// GLOBAL VARIABLES +// INLINE HELPERS //************************************************************************** -// devices -const device_type MC6852 = mc6852_device_config::static_alloc_device_config; +inline void mc6852_device::receive() +{ +} + +inline void mc6852_device::transmit() +{ +} //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -GENERIC_DEVICE_CONFIG_SETUP(mc6852, "MC6852") +//------------------------------------------------- +// mc6852_device - constructor +//------------------------------------------------- + +mc6852_device::mc6852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MC6852, "MC6852", tag, owner, clock) +{ +} //------------------------------------------------- @@ -102,7 +117,7 @@ GENERIC_DEVICE_CONFIG_SETUP(mc6852, "MC6852") // complete //------------------------------------------------- -void mc6852_device_config::device_config_complete() +void mc6852_device::device_config_complete() { // inherit a copy of the static data const mc6852_interface *intf = reinterpret_cast<const mc6852_interface *>(static_config()); @@ -112,47 +127,17 @@ void mc6852_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_in_rx_data_func, 0, sizeof(m_in_rx_data_func)); - memset(&m_out_tx_data_func, 0, sizeof(m_out_tx_data_func)); - memset(&m_out_irq_func, 0, sizeof(m_out_irq_func)); - memset(&m_in_cts_func, 0, sizeof(m_in_cts_func)); - memset(&m_in_dcd_func, 0, sizeof(m_in_dcd_func)); - memset(&m_out_sm_dtr_func, 0, sizeof(m_out_sm_dtr_func)); - memset(&m_out_tuf_func, 0, sizeof(m_out_tuf_func)); + memset(&m_in_rx_data_cb, 0, sizeof(m_in_rx_data_cb)); + memset(&m_out_tx_data_cb, 0, sizeof(m_out_tx_data_cb)); + memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb)); + memset(&m_in_cts_cb, 0, sizeof(m_in_cts_cb)); + memset(&m_in_dcd_cb, 0, sizeof(m_in_dcd_cb)); + memset(&m_out_sm_dtr_cb, 0, sizeof(m_out_sm_dtr_cb)); + memset(&m_out_tuf_cb, 0, sizeof(m_out_tuf_cb)); } } - -//************************************************************************** -// INLINE HELPERS -//************************************************************************** - -inline void mc6852_device::receive() -{ -} - -inline void mc6852_device::transmit() -{ -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// mc6852_device - constructor -//------------------------------------------------- - -mc6852_device::mc6852_device(running_machine &_machine, const mc6852_device_config &config) - : device_t(_machine, config), - m_config(config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -160,24 +145,24 @@ mc6852_device::mc6852_device(running_machine &_machine, const mc6852_device_conf void mc6852_device::device_start() { // resolve callbacks - devcb_resolve_read_line(&m_in_rx_data_func, &m_config.m_in_rx_data_func, this); - devcb_resolve_write_line(&m_out_tx_data_func, &m_config.m_out_tx_data_func, this); - devcb_resolve_write_line(&m_out_irq_func, &m_config.m_out_irq_func, this); - devcb_resolve_read_line(&m_in_cts_func, &m_config.m_in_cts_func, this); - devcb_resolve_read_line(&m_in_dcd_func, &m_config.m_in_dcd_func, this); - devcb_resolve_write_line(&m_out_sm_dtr_func, &m_config.m_out_sm_dtr_func, this); - devcb_resolve_write_line(&m_out_tuf_func, &m_config.m_out_tuf_func, this); - - if (m_config.m_rx_clock > 0) + devcb_resolve_read_line(&m_in_rx_data_func, &m_in_rx_data_cb, this); + devcb_resolve_write_line(&m_out_tx_data_func, &m_out_tx_data_cb, this); + devcb_resolve_write_line(&m_out_irq_func, &m_out_irq_cb, this); + devcb_resolve_read_line(&m_in_cts_func, &m_in_cts_cb, this); + devcb_resolve_read_line(&m_in_dcd_func, &m_in_dcd_cb, this); + devcb_resolve_write_line(&m_out_sm_dtr_func, &m_out_sm_dtr_cb, this); + devcb_resolve_write_line(&m_out_tuf_func, &m_out_tuf_cb, this); + + if (m_rx_clock > 0) { m_rx_timer = timer_alloc(TIMER_RX); - m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_rx_clock)); + m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rx_clock)); } - if (m_config.m_tx_clock > 0) + if (m_tx_clock > 0) { m_tx_timer = timer_alloc(TIMER_TX); - m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_tx_clock)); + m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_tx_clock)); } // register for state saving diff --git a/src/emu/machine/mc6852.h b/src/emu/machine/mc6852.h index 7385402c75d..c0c6090d624 100644 --- a/src/emu/machine/mc6852.h +++ b/src/emu/machine/mc6852.h @@ -55,51 +55,27 @@ struct mc6852_interface UINT32 m_rx_clock; UINT32 m_tx_clock; - devcb_read_line m_in_rx_data_func; - devcb_write_line m_out_tx_data_func; + devcb_read_line m_in_rx_data_cb; + devcb_write_line m_out_tx_data_cb; - devcb_write_line m_out_irq_func; + devcb_write_line m_out_irq_cb; - devcb_read_line m_in_cts_func; - devcb_read_line m_in_dcd_func; - devcb_write_line m_out_sm_dtr_func; - devcb_write_line m_out_tuf_func; + devcb_read_line m_in_cts_cb; + devcb_read_line m_in_dcd_cb; + devcb_write_line m_out_sm_dtr_cb; + devcb_write_line m_out_tuf_cb; }; - -// ======================> mc6852_device_config - -class mc6852_device_config : public device_config, - public mc6852_interface -{ - friend class mc6852_device; - - // construction/destruction - mc6852_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> mc6852_device -class mc6852_device : public device_t +class mc6852_device : public device_t, + public mc6852_interface { - friend class mc6852_device_config; - +public: // construction/destruction - mc6852_device(running_machine &_machine, const mc6852_device_config &_config); + mc6852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -113,6 +89,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int m_param, void *ptr); @@ -151,8 +128,6 @@ private: // timers emu_timer *m_rx_timer; emu_timer *m_tx_timer; - - const mc6852_device_config &m_config; }; diff --git a/src/emu/machine/mc68901.c b/src/emu/machine/mc68901.c index cc3bc818c1b..65553a18185 100644 --- a/src/emu/machine/mc68901.c +++ b/src/emu/machine/mc68901.c @@ -46,6 +46,9 @@ #include "machine/devhelpr.h" +// device type definition +const device_type MC68901 = &device_creator<mc68901_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -261,44 +264,6 @@ static const int PRESCALER[] = { 0, 4, 10, 16, 50, 64, 100, 200 }; //************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// devices -const device_type MC68901 = mc68901_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(mc68901, "Motorola MC68901") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void mc68901_device_config::device_config_complete() -{ - // inherit a copy of the static data - const mc68901_interface *intf = reinterpret_cast<const mc68901_interface *>(static_config()); - if (intf != NULL) - *static_cast<mc68901_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { -// memset(&in_pa_func, 0, sizeof(in_pa_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -771,34 +736,51 @@ inline void mc68901_device::gpio_input(int bit, int state) // mc68901_device - constructor //------------------------------------------------- -mc68901_device::mc68901_device(running_machine &_machine, const mc68901_device_config &config) - : device_t(_machine, config), +mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MC68901, "Motorola MC68901", tag, owner, clock), m_gpip(0), - m_tsr(TSR_BUFFER_EMPTY), - m_config(config) + m_tsr(TSR_BUFFER_EMPTY) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void mc68901_device::device_config_complete() +{ + // inherit a copy of the static data + const mc68901_interface *intf = reinterpret_cast<const mc68901_interface *>(static_config()); + if (intf != NULL) + *static_cast<mc68901_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { +// memset(&in_pa_cb, 0, sizeof(in_pa_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void mc68901_device::device_start() { /* resolve callbacks */ - devcb_resolve_read8(&m_in_gpio_func, &m_config.in_gpio_func, this); - devcb_resolve_write8(&m_out_gpio_func, &m_config.out_gpio_func, this); - devcb_resolve_read_line(&m_in_si_func, &m_config.in_si_func, this); - devcb_resolve_write_line(&m_out_so_func, &m_config.out_so_func, this); - devcb_resolve_write_line(&m_out_tao_func, &m_config.out_tao_func, this); - devcb_resolve_write_line(&m_out_tbo_func, &m_config.out_tbo_func, this); - devcb_resolve_write_line(&m_out_tco_func, &m_config.out_tco_func, this); - devcb_resolve_write_line(&m_out_tdo_func, &m_config.out_tdo_func, this); - devcb_resolve_write_line(&m_out_irq_func, &m_config.out_irq_func, this); - - /* set initial values */ - m_timer_clock = m_config.timer_clock; + devcb_resolve_read8(&m_in_gpio_func, &m_in_gpio_cb, this); + devcb_resolve_write8(&m_out_gpio_func, &m_out_gpio_cb, this); + devcb_resolve_read_line(&m_in_si_func, &m_in_si_cb, this); + devcb_resolve_write_line(&m_out_so_func, &m_out_so_cb, this); + devcb_resolve_write_line(&m_out_tao_func, &m_out_tao_cb, this); + devcb_resolve_write_line(&m_out_tbo_func, &m_out_tbo_cb, this); + devcb_resolve_write_line(&m_out_tco_func, &m_out_tco_cb, this); + devcb_resolve_write_line(&m_out_tdo_func, &m_out_tdo_cb, this); + devcb_resolve_write_line(&m_out_irq_func, &m_out_irq_cb, this); /* create the timers */ m_timer[TIMER_A] = timer_alloc(TIMER_A); @@ -806,16 +788,16 @@ void mc68901_device::device_start() m_timer[TIMER_C] = timer_alloc(TIMER_C); m_timer[TIMER_D] = timer_alloc(TIMER_D); - if (m_config.rx_clock > 0) + if (m_rx_clock > 0) { m_rx_timer = timer_alloc(TIMER_RX); - m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.rx_clock)); + m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rx_clock)); } - if (m_config.tx_clock > 0) + if (m_tx_clock > 0) { m_tx_timer = timer_alloc(TIMER_TX); - m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.tx_clock)); + m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_tx_clock)); } /* register for state saving */ diff --git a/src/emu/machine/mc68901.h b/src/emu/machine/mc68901.h index 7990d31f9d3..5bfaf4cb2e7 100644 --- a/src/emu/machine/mc68901.h +++ b/src/emu/machine/mc68901.h @@ -71,60 +71,37 @@ struct mc68901_interface { - int timer_clock; /* timer clock */ - int rx_clock; /* serial receive clock */ - int tx_clock; /* serial transmit clock */ + int m_timer_clock; /* timer clock */ + int m_rx_clock; /* serial receive clock */ + int m_tx_clock; /* serial transmit clock */ - devcb_write_line out_irq_func; + devcb_write_line m_out_irq_cb; - devcb_read8 in_gpio_func; - devcb_write8 out_gpio_func; + devcb_read8 m_in_gpio_cb; + devcb_write8 m_out_gpio_cb; - devcb_write_line out_tao_func; - devcb_write_line out_tbo_func; - devcb_write_line out_tco_func; - devcb_write_line out_tdo_func; + devcb_write_line m_out_tao_cb; + devcb_write_line m_out_tbo_cb; + devcb_write_line m_out_tco_cb; + devcb_write_line m_out_tdo_cb; - devcb_read_line in_si_func; - devcb_write_line out_so_func; - devcb_write_line out_rr_func; - devcb_write_line out_tr_func; -}; - - - -// ======================> mc68901_device_config - -class mc68901_device_config : public device_config, - public mc68901_interface -{ - friend class mc68901_device; - - // construction/destruction - mc68901_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read_line m_in_si_cb; + devcb_write_line m_out_so_cb; + devcb_write_line m_out_rr_cb; + devcb_write_line m_out_tr_cb; }; // ======================> mc68901_device -class mc68901_device : public device_t +class mc68901_device : public device_t, + public mc68901_interface { - friend class mc68901_device_config; - +public: // construction/destruction - mc68901_device(running_machine &_machine, const mc68901_device_config &_config); + mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -147,6 +124,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -188,7 +166,6 @@ private: devcb_resolved_write_line m_out_irq_func; int m_device_type; /* device type */ - int m_timer_clock; /* timer clock */ /* registers */ UINT8 m_gpip; /* general purpose I/O register */ @@ -244,8 +221,6 @@ private: emu_timer *m_timer[4]; /* counter timers */ emu_timer *m_rx_timer; /* receive timer */ emu_timer *m_tx_timer; /* transmit timer */ - - const mc68901_device_config &m_config; }; diff --git a/src/emu/machine/mm74c922.c b/src/emu/machine/mm74c922.c index a2c6424dd78..1aab9cc43ce 100644 --- a/src/emu/machine/mm74c922.c +++ b/src/emu/machine/mm74c922.c @@ -24,54 +24,8 @@ // DEVICE DEFINITIONS //************************************************************************** -const device_type MM74C922 = mm74c922_device_config::static_alloc_device_config; -const device_type MM74C923 = mm74c922_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(mm74c922, "MM74C922") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void mm74c922_device_config::device_config_complete() -{ - // inherit a copy of the static data - const mm74c922_interface *intf = reinterpret_cast<const mm74c922_interface *>(static_config()); - if (intf != NULL) - *static_cast<mm74c922_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_da_func, 0, sizeof(m_out_da_func)); - memset(&m_in_x1_func, 0, sizeof(m_in_x1_func)); - memset(&m_in_x2_func, 0, sizeof(m_in_x2_func)); - memset(&m_in_x3_func, 0, sizeof(m_in_x3_func)); - memset(&m_in_x4_func, 0, sizeof(m_in_x4_func)); - memset(&m_in_x5_func, 0, sizeof(m_in_x5_func)); - } -} - - -//------------------------------------------------- -// static_set_config - configuration helper -//------------------------------------------------- - -void mm74c922_device_config::static_set_config(device_config *device, int max_y) -{ - mm74c922_device_config *mm74c922 = downcast<mm74c922_device_config *>(device); - - mm74c922->m_max_y = max_y; -} +const device_type MM74C922 = &device_creator<mm74c922_device>; +const device_type MM74C923 = &device_creator<mm74c922_device>; @@ -134,7 +88,7 @@ inline void mm74c922_device::detect_keypress() { UINT8 data = devcb_call_read8(&m_in_x_func[m_x], 0); - for (int y = 0; y < m_config.m_max_y; y++) + for (int y = 0; y < m_max_y; y++) { if (!BIT(data, y)) { @@ -161,13 +115,50 @@ inline void mm74c922_device::detect_keypress() // mm74c922_device - constructor //------------------------------------------------- -mm74c922_device::mm74c922_device(running_machine &_machine, const mm74c922_device_config &config) - : device_t(_machine, config), +mm74c922_device::mm74c922_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MM74C922, "MM74C922", tag, owner, clock), m_x(0), m_y(0), - m_next_da(0), - m_config(config) + m_next_da(0) +{ +} + + +//------------------------------------------------- +// static_set_config - configuration helper +//------------------------------------------------- + +void mm74c922_device::static_set_config(device_t &device, int max_y) { + mm74c922_device &mm74c922 = downcast<mm74c922_device &>(device); + + mm74c922.m_max_y = max_y; +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void mm74c922_device::device_config_complete() +{ + // inherit a copy of the static data + const mm74c922_interface *intf = reinterpret_cast<const mm74c922_interface *>(static_config()); + if (intf != NULL) + *static_cast<mm74c922_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_da_cb, 0, sizeof(m_out_da_cb)); + memset(&m_in_x1_cb, 0, sizeof(m_in_x1_cb)); + memset(&m_in_x2_cb, 0, sizeof(m_in_x2_cb)); + memset(&m_in_x3_cb, 0, sizeof(m_in_x3_cb)); + memset(&m_in_x4_cb, 0, sizeof(m_in_x4_cb)); + memset(&m_in_x5_cb, 0, sizeof(m_in_x5_cb)); + } } @@ -178,12 +169,12 @@ mm74c922_device::mm74c922_device(running_machine &_machine, const mm74c922_devic void mm74c922_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_da_func, &m_config.m_out_da_func, this); - devcb_resolve_read8(&m_in_x_func[0], &m_config.m_in_x1_func, this); - devcb_resolve_read8(&m_in_x_func[1], &m_config.m_in_x2_func, this); - devcb_resolve_read8(&m_in_x_func[2], &m_config.m_in_x3_func, this); - devcb_resolve_read8(&m_in_x_func[3], &m_config.m_in_x4_func, this); - devcb_resolve_read8(&m_in_x_func[4], &m_config.m_in_x5_func, this); + devcb_resolve_write_line(&m_out_da_func, &m_out_da_cb, this); + devcb_resolve_read8(&m_in_x_func[0], &m_in_x1_cb, this); + devcb_resolve_read8(&m_in_x_func[1], &m_in_x2_cb, this); + devcb_resolve_read8(&m_in_x_func[2], &m_in_x3_cb, this); + devcb_resolve_read8(&m_in_x_func[3], &m_in_x4_cb, this); + devcb_resolve_read8(&m_in_x_func[4], &m_in_x5_cb, this); // set initial values change_output_lines(); diff --git a/src/emu/machine/mm74c922.h b/src/emu/machine/mm74c922.h index 94746d846a3..a51b85b1152 100644 --- a/src/emu/machine/mm74c922.h +++ b/src/emu/machine/mm74c922.h @@ -47,13 +47,13 @@ #define MCFG_MM74C922_ADD(_tag, _config) \ MCFG_DEVICE_ADD(_tag, MM74C922, 0) \ MCFG_DEVICE_CONFIG(_config) \ - mm74c922_device_config::static_set_config(device, 4); + mm74c922_device::static_set_config(*device, 4); #define MCFG_MM74C923_ADD(_tag, _config) \ MCFG_DEVICE_ADD(_tag, MM74C923, 0) \ MCFG_DEVICE_CONFIG(_config) \ - mm74c922_device_config::static_set_config(device, 5); + mm74c922_device::static_set_config(*device, 5); #define MM74C922_INTERFACE(name) \ @@ -76,57 +76,33 @@ struct mm74c922_interface double m_cap_osc; double m_cap_debounce; - devcb_write_line m_out_da_func; + devcb_write_line m_out_da_cb; - devcb_read8 m_in_x1_func; - devcb_read8 m_in_x2_func; - devcb_read8 m_in_x3_func; - devcb_read8 m_in_x4_func; - devcb_read8 m_in_x5_func; + devcb_read8 m_in_x1_cb; + devcb_read8 m_in_x2_cb; + devcb_read8 m_in_x3_cb; + devcb_read8 m_in_x4_cb; + devcb_read8 m_in_x5_cb; }; -// ======================> mm74c922_device_config +// ======================> mm74c922_device -class mm74c922_device_config : public device_config, - public mm74c922_interface +class mm74c922_device : public device_t, + public mm74c922_interface { - friend class mm74c922_device; - - // construction/destruction - mm74c922_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; + // construction/destruction + mm74c922_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // inline configuration helpers - static void static_set_config(device_config *device, int max_y); - -protected: - // device_config overrides - virtual void device_config_complete(); - -private: - int m_max_y; -}; + static void static_set_config(device_t &device, int max_y); - -// ======================> mm74c922_device - -class mm74c922_device : public device_t -{ - friend class mm74c922_device_config; - - // construction/destruction - mm74c922_device(running_machine &_machine, const mm74c922_device_config &_config); - -public: UINT8 data_out_r(); protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -135,6 +111,8 @@ private: inline void clock_scan_counters(); inline void detect_keypress(); + int m_max_y; + devcb_resolved_write_line m_out_da_func; devcb_resolved_read8 m_in_x_func[5]; @@ -149,8 +127,6 @@ private: // timers emu_timer *m_scan_timer; // keyboard scan timer - - const mm74c922_device_config &m_config; }; diff --git a/src/emu/machine/mos6529.c b/src/emu/machine/mos6529.c index 452012584fb..874495bcf6f 100644 --- a/src/emu/machine/mos6529.c +++ b/src/emu/machine/mos6529.c @@ -21,20 +21,20 @@ //************************************************************************** -// GLOBAL VARIABLES +// LIVE DEVICE //************************************************************************** -// devices -const device_type MOS6529 = mos6529_device_config::static_alloc_device_config; - - +// device type definition +const device_type MOS6529 = &device_creator<mos6529_device>; +//------------------------------------------------- +// mos6529_device - constructor +//------------------------------------------------- -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(mos6529, "MOS6529") +mos6529_device::mos6529_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MOS6529, "MOS6529", tag, owner, clock) +{ +} //------------------------------------------------- @@ -43,7 +43,7 @@ GENERIC_DEVICE_CONFIG_SETUP(mos6529, "MOS6529") // complete //------------------------------------------------- -void mos6529_device_config::device_config_complete() +void mos6529_device::device_config_complete() { // inherit a copy of the static data const mos6529_interface *intf = reinterpret_cast<const mos6529_interface *>(static_config()); @@ -53,28 +53,12 @@ void mos6529_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_in_p_func, 0, sizeof(m_in_p_func)); - memset(&m_out_p_func, 0, sizeof(m_out_p_func)); + memset(&m_in_p_cb, 0, sizeof(m_in_p_cb)); + memset(&m_out_p_cb, 0, sizeof(m_out_p_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// mos6529_device - constructor -//------------------------------------------------- - -mos6529_device::mos6529_device(running_machine &_machine, const mos6529_device_config &config) - : device_t(_machine, config), - m_config(config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -82,8 +66,8 @@ mos6529_device::mos6529_device(running_machine &_machine, const mos6529_device_c void mos6529_device::device_start() { // resolve callbacks - devcb_resolve_read8(&m_in_p_func, &m_config.m_in_p_func, this); - devcb_resolve_write8(&m_out_p_func, &m_config.m_out_p_func, this); + devcb_resolve_read8(&m_in_p_func, &m_in_p_cb, this); + devcb_resolve_write8(&m_out_p_func, &m_out_p_cb, this); } diff --git a/src/emu/machine/mos6529.h b/src/emu/machine/mos6529.h index b4545a1eb7f..f9ad7a5ad26 100644 --- a/src/emu/machine/mos6529.h +++ b/src/emu/machine/mos6529.h @@ -50,54 +50,31 @@ struct mos6529_interface { - devcb_read8 m_in_p_func; - devcb_write8 m_out_p_func; -}; - - -// ======================> mos6529_device_config - -class mos6529_device_config : public device_config, - public mos6529_interface -{ - friend class mos6529_device; - - // construction/destruction - mos6529_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_p_cb; + devcb_write8 m_out_p_cb; }; // ======================> mos6529_device -class mos6529_device : public device_t +class mos6529_device : public device_t, + public mos6529_interface { - friend class mos6529_device_config; - +public: // construction/destruction - mos6529_device(running_machine &_machine, const mos6529_device_config &_config); + mos6529_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); private: devcb_resolved_read8 m_in_p_func; devcb_resolved_write8 m_out_p_func; - - const mos6529_device_config &m_config; }; diff --git a/src/emu/machine/msm5832.c b/src/emu/machine/msm5832.c index 9a0af084775..7f8eb374a39 100644 --- a/src/emu/machine/msm5832.c +++ b/src/emu/machine/msm5832.c @@ -22,6 +22,9 @@ #include "msm5832.h" +// device type definition +const device_type MSM5832 = &device_creator<msm5832_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -56,51 +59,6 @@ static const int DAYS_PER_MONTH[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, //************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// devices -const device_type MSM5832 = msm5832_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// msm5832_device_config - constructor -//------------------------------------------------- - -msm5832_device_config::msm5832_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "MSM5832", tag, owner, clock), - device_config_rtc_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *msm5832_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(msm5832_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *msm5832_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, msm5832_device(machine, *this)); -} - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -214,15 +172,14 @@ inline void msm5832_device::advance_minutes() // msm5832_device - constructor //------------------------------------------------- -msm5832_device::msm5832_device(running_machine &_machine, const msm5832_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), +msm5832_device::msm5832_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MSM5832, "MSM5832", tag, owner, clock), + device_rtc_interface(mconfig, *this), m_hold(0), m_address(0), m_read(0), m_write(0), - m_cs(0), - m_config(config) + m_cs(0) { for (int i = 0; i < 13; i++) m_reg[i] = 0; diff --git a/src/emu/machine/msm5832.h b/src/emu/machine/msm5832.h index 9a220af11cc..a93c2589ffc 100644 --- a/src/emu/machine/msm5832.h +++ b/src/emu/machine/msm5832.h @@ -41,35 +41,15 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> msm5832_device_config - -class msm5832_device_config : public device_config, - public device_config_rtc_interface -{ - friend class msm5832_device; - - // construction/destruction - msm5832_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; -}; - - - // ======================> msm5832_device class msm5832_device : public device_t, public device_rtc_interface { - friend class msm5832_device_config; - +public: // construction/destruction - msm5832_device(running_machine &_machine, const msm5832_device_config &_config); + msm5832_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( data_w ); @@ -111,8 +91,6 @@ private: // timers emu_timer *m_clock_timer; - - const msm5832_device_config &m_config; }; diff --git a/src/emu/machine/msm58321.c b/src/emu/machine/msm58321.c index 28f324c1002..22866d345d5 100644 --- a/src/emu/machine/msm58321.c +++ b/src/emu/machine/msm58321.c @@ -23,6 +23,9 @@ #include "msm58321.h" +// device type definition +const device_type MSM58321 = &device_creator<msm58321_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -59,72 +62,6 @@ static const int DAYS_PER_MONTH[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, //************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// devices -const device_type MSM58321 = msm58321_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// msm58321_device_config - constructor -//------------------------------------------------- - -msm58321_device_config::msm58321_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "MSM58321", tag, owner, clock), - device_config_rtc_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *msm58321_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(msm58321_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *msm58321_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, msm58321_device(machine, *this)); -} - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void msm58321_device_config::device_config_complete() -{ - // inherit a copy of the static data - const msm58321_interface *intf = reinterpret_cast<const msm58321_interface *>(static_config()); - if (intf != NULL) - *static_cast<msm58321_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_busy_func, 0, sizeof(m_out_busy_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -238,10 +175,9 @@ inline void msm58321_device::advance_minutes() // msm58321_device - constructor //------------------------------------------------- -msm58321_device::msm58321_device(running_machine &_machine, const msm58321_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), - m_config(config) +msm58321_device::msm58321_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MSM58321, "MSM58321", tag, owner, clock), + device_rtc_interface(mconfig, *this) { for (int i = 0; i < 13; i++) m_reg[i] = 0; @@ -249,13 +185,34 @@ msm58321_device::msm58321_device(running_machine &_machine, const msm58321_devic //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void msm58321_device::device_config_complete() +{ + // inherit a copy of the static data + const msm58321_interface *intf = reinterpret_cast<const msm58321_interface *>(static_config()); + if (intf != NULL) + *static_cast<msm58321_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_busy_cb, 0, sizeof(m_out_busy_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void msm58321_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_busy_func, &m_config.m_out_busy_func, this); + devcb_resolve_write_line(&m_out_busy_func, &m_out_busy_cb, this); // allocate timers m_clock_timer = timer_alloc(TIMER_CLOCK); diff --git a/src/emu/machine/msm58321.h b/src/emu/machine/msm58321.h index dce7eedc7e5..a2e55f00ea7 100644 --- a/src/emu/machine/msm58321.h +++ b/src/emu/machine/msm58321.h @@ -48,30 +48,7 @@ struct msm58321_interface { - devcb_write_line m_out_busy_func; -}; - - - -// ======================> msm58321_device_config - -class msm58321_device_config : public device_config, - public msm58321_interface, - public device_config_rtc_interface -{ - friend class msm58321_device; - - // construction/destruction - msm58321_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_busy_cb; }; @@ -79,14 +56,13 @@ protected: // ======================> msm58321_device class msm58321_device : public device_t, - public device_rtc_interface + public device_rtc_interface, + public msm58321_interface { - friend class msm58321_device_config; - +public: // construction/destruction - msm58321_device(running_machine &_machine, const msm58321_device_config &_config); + msm58321_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -101,6 +77,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -133,8 +110,6 @@ private: // timers emu_timer *m_clock_timer; emu_timer *m_busy_timer; - - const msm58321_device_config &m_config; }; diff --git a/src/emu/machine/nmc9306.c b/src/emu/machine/nmc9306.c index 7fef8bd7eaa..627f282bd93 100644 --- a/src/emu/machine/nmc9306.c +++ b/src/emu/machine/nmc9306.c @@ -54,54 +54,12 @@ enum //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type NMC9306 = nmc9306_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// nmc9306_device_config - constructor -//------------------------------------------------- - -nmc9306_device_config::nmc9306_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "NMC9306", tag, owner, clock), - device_config_nvram_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *nmc9306_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(nmc9306_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *nmc9306_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, nmc9306_device(machine, *this)); -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** +// device type definition +const device_type NMC9306 = &device_creator<nmc9306_device>; + //------------------------------------------------- // nmc9306_device - constructor //------------------------------------------------- @@ -147,12 +105,11 @@ inline void nmc9306_device::erase(offs_t offset) // nmc9306_device - constructor //------------------------------------------------- -nmc9306_device::nmc9306_device(running_machine &_machine, const nmc9306_device_config &config) - : device_t(_machine, config), - device_nvram_interface(_machine, config, *this), +nmc9306_device::nmc9306_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, NMC9306, "NMC9306", tag, owner, clock), + device_nvram_interface(mconfig, *this), m_state(STATE_IDLE), - m_ewen(false), - m_config(config) + m_ewen(false) { } diff --git a/src/emu/machine/nmc9306.h b/src/emu/machine/nmc9306.h index 366738b9a5e..6658775d56e 100644 --- a/src/emu/machine/nmc9306.h +++ b/src/emu/machine/nmc9306.h @@ -44,36 +44,15 @@ //************************************************************************** -// ======================> nmc9306_device_config - -class nmc9306_device_config : public device_config, - public device_config_nvram_interface -{ - friend class nmc9306_device; - - // construction/destruction - nmc9306_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: -}; - - // ======================> nmc9306_device class nmc9306_device : public device_t, public device_nvram_interface { - friend class nmc9306_device_config; - +public: // construction/destruction - nmc9306_device(running_machine &_machine, const nmc9306_device_config &_config); + nmc9306_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_WRITE_LINE_MEMBER( cs_w ); DECLARE_WRITE_LINE_MEMBER( sk_w ); DECLARE_WRITE_LINE_MEMBER( di_w ); @@ -105,8 +84,6 @@ private: int m_sk; int m_do; int m_di; - - const nmc9306_device_config &m_config; }; @@ -114,5 +91,4 @@ private: extern const device_type NMC9306; - #endif diff --git a/src/emu/machine/nvram.c b/src/emu/machine/nvram.c index 7671f316fb7..76f088e4ea4 100644 --- a/src/emu/machine/nvram.c +++ b/src/emu/machine/nvram.c @@ -43,47 +43,23 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type NVRAM = nvram_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// nvram_device_config - constructor -//------------------------------------------------- - -nvram_device_config::nvram_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "NVRAM", tag, owner, clock), - device_config_nvram_interface(mconfig, *this), - m_default_value(DEFAULT_ALL_1) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *nvram_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(nvram_device_config(mconfig, tag, owner, clock)); -} - +// device type definition +const device_type NVRAM = &device_creator<nvram_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// nvram_device - constructor //------------------------------------------------- -device_t *nvram_device_config::alloc_device(running_machine &machine) const +nvram_device::nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, NVRAM, "NVRAM", tag, owner, clock), + device_nvram_interface(mconfig, *this), + m_default_value(DEFAULT_ALL_1), + m_base(NULL), + m_length(0) { - return auto_alloc(machine, nvram_device(machine, *this)); } @@ -92,10 +68,10 @@ device_t *nvram_device_config::alloc_device(running_machine &machine) const // to set the interface //------------------------------------------------- -void nvram_device_config::static_set_default_value(device_config *device, default_value value) +void nvram_device::static_set_default_value(device_t &device, default_value value) { - nvram_device_config *nvram = downcast<nvram_device_config *>(device); - nvram->m_default_value = value; + nvram_device &nvram = downcast<nvram_device &>(device); + nvram.m_default_value = value; } @@ -104,30 +80,11 @@ void nvram_device_config::static_set_default_value(device_config *device, defaul // helper to set a custom callback //------------------------------------------------- -void nvram_device_config::static_set_custom_handler(device_config *device, nvram_init_delegate handler) -{ - nvram_device_config *nvram = downcast<nvram_device_config *>(device); - nvram->m_default_value = DEFAULT_CUSTOM; - nvram->m_custom_handler = handler; -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// nvram_device - constructor -//------------------------------------------------- - -nvram_device::nvram_device(running_machine &_machine, const nvram_device_config &config) - : device_t(_machine, config), - device_nvram_interface(_machine, config, *this), - m_config(config), - m_base(NULL), - m_length(0) +void nvram_device::static_set_custom_handler(device_t &device, nvram_init_delegate handler) { + nvram_device &nvram = downcast<nvram_device &>(device); + nvram.m_default_value = DEFAULT_CUSTOM; + nvram.m_custom_handler = handler; } @@ -138,8 +95,8 @@ nvram_device::nvram_device(running_machine &_machine, const nvram_device_config void nvram_device::device_start() { // bind our handler - if (!m_config.m_custom_handler.isnull()) - m_custom_handler = nvram_init_delegate(m_config.m_custom_handler, m_owner); + if (!m_custom_handler.isnull()) + m_custom_handler = nvram_init_delegate(m_custom_handler, m_owner); } @@ -161,21 +118,21 @@ void nvram_device::nvram_default() } // default values for other cases - switch (m_config.m_default_value) + switch (m_default_value) { // all-0's - case nvram_device_config::DEFAULT_ALL_0: + case DEFAULT_ALL_0: memset(m_base, 0, m_length); break; // all 1's default: - case nvram_device_config::DEFAULT_ALL_1: + case DEFAULT_ALL_1: memset(m_base, 0xff, m_length); break; // random values - case nvram_device_config::DEFAULT_RANDOM: + case DEFAULT_RANDOM: { UINT8 *nvram = reinterpret_cast<UINT8 *>(m_base); for (int index = 0; index < m_length; index++) @@ -184,12 +141,12 @@ void nvram_device::nvram_default() } // custom handler - case nvram_device_config::DEFAULT_CUSTOM: + case DEFAULT_CUSTOM: m_custom_handler(*this, m_base, m_length); break; // none - do nothing - case nvram_device_config::DEFAULT_NONE: + case DEFAULT_NONE: break; } } diff --git a/src/emu/machine/nvram.h b/src/emu/machine/nvram.h index 736a6bbac19..06906161ecc 100644 --- a/src/emu/machine/nvram.h +++ b/src/emu/machine/nvram.h @@ -50,40 +50,40 @@ #define MCFG_NVRAM_ADD_0FILL(_tag) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_ALL_0); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_ALL_0); \ #define MCFG_NVRAM_ADD_1FILL(_tag) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_ALL_1); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_ALL_1); \ #define MCFG_NVRAM_ADD_RANDOM_FILL(_tag) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_RANDOM); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_RANDOM); \ #define MCFG_NVRAM_ADD_NO_FILL(_tag) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_NONE); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_NONE); \ #define MCFG_NVRAM_ADD_CUSTOM(_tag, _class, _method) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device_config::static_set_custom_handler(device, nvram_init_delegate(&_class::_method, #_class "::" #_method, (_class *)0)); \ + nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, (_class *)0)); \ #define MCFG_NVRAM_REPLACE_0FILL(_tag) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_ALL_0); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_ALL_0); \ #define MCFG_NVRAM_REPLACE_1FILL(_tag) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_ALL_1); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_ALL_1); \ #define MCFG_NVRAM_REPLACE_RANDOM_FILL(_tag) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ - nvram_device_config::static_set_default_value(device, nvram_device_config::DEFAULT_RANDOM); \ + nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_RANDOM); \ #define MCFG_NVRAM_REPLACE_CUSTOM(_tag, _class, _method) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ - nvram_device_config::static_set_custom_handler(device, nvram_init_delegate(&_class::_method, #_class "::" #_method, (_class *)0)); \ + nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, (_class *)0)); \ @@ -98,16 +98,11 @@ class nvram_device; typedef delegate<void (nvram_device &, void *, size_t)> nvram_init_delegate; -// ======================> nvram_device_config +// ======================> nvram_device -class nvram_device_config : public device_config, - public device_config_nvram_interface +class nvram_device : public device_t, + public device_nvram_interface { - friend class nvram_device; - - // construction/destruction - nvram_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - public: // values enum default_value @@ -119,32 +114,13 @@ public: DEFAULT_NONE }; - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; + // construction/destruction + nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // inline configuration helpers - static void static_set_default_value(device_config *device, default_value value); - static void static_set_custom_handler(device_config *device, nvram_init_delegate callback); - -protected: - // internal state - default_value m_default_value; - nvram_init_delegate m_custom_handler; -}; - + static void static_set_default_value(device_t &device, default_value value); + static void static_set_custom_handler(device_t &device, nvram_init_delegate callback); -// ======================> nvram_device - -class nvram_device : public device_t, - public device_nvram_interface -{ - friend class nvram_device_config; - - // construction/destruction - nvram_device(running_machine &_machine, const nvram_device_config &config); - -public: // controls void set_base(void *base, size_t length) { m_base = base; m_length = length; } @@ -160,11 +136,13 @@ protected: // internal helpers void determine_final_base(); - // internal state - const nvram_device_config & m_config; + // configuration state + default_value m_default_value; + nvram_init_delegate m_custom_handler; + + // runtime state void * m_base; size_t m_length; - nvram_init_delegate m_custom_handler; }; diff --git a/src/emu/machine/pci.c b/src/emu/machine/pci.c index 650c87fb789..8d1e09cc67e 100644 --- a/src/emu/machine/pci.c +++ b/src/emu/machine/pci.c @@ -234,7 +234,7 @@ int pci_add_sibling( running_machine &machine, char *pcitag, char *sibling ) return 0; if (pcibus1->siblings_count == 8) return 0; - config2 = (pci_bus_config *)downcast<const legacy_device_config_base &>(device2->baseconfig()).inline_config(); + config2 = (pci_bus_config *)downcast<const legacy_device_base *>(device2)->inline_config(); pcibus1->siblings[pcibus1->siblings_count] = get_safe_token(device2); pcibus1->siblings_busnum[pcibus1->siblings_count] = config2->busnum; pcibus1->siblings_count++; @@ -269,11 +269,11 @@ static DEVICE_START( pci_bus ) /* validate some basic stuff */ assert(device != NULL); - assert(device->baseconfig().static_config() == NULL); - assert(downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config() != NULL); + assert(device->static_config() == NULL); + assert(downcast<const legacy_device_base *>(device)->inline_config() != NULL); /* store a pointer back to the device */ - pcibus->config = (const pci_bus_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + pcibus->config = (const pci_bus_config *)downcast<const legacy_device_base *>(device)->inline_config(); pcibus->busdevice = device; pcibus->devicenum = -1; diff --git a/src/emu/machine/pci.h b/src/emu/machine/pci.h index c61fcb709ba..5a2dcb64e6e 100644 --- a/src/emu/machine/pci.h +++ b/src/emu/machine/pci.h @@ -71,5 +71,3 @@ int pci_add_sibling( running_machine &machine, char *pcitag, char *sibling ); DECLARE_LEGACY_DEVICE(PCI_BUS, pci_bus); #endif /* PCI_H */ - - diff --git a/src/emu/machine/pic8259.c b/src/emu/machine/pic8259.c index a7972c7e00c..8e9af6ed2dc 100644 --- a/src/emu/machine/pic8259.c +++ b/src/emu/machine/pic8259.c @@ -413,7 +413,7 @@ WRITE8_DEVICE_HANDLER( pic8259_w ) static DEVICE_START( pic8259 ) { pic8259_t *pic8259 = get_safe_token(device); - const struct pic8259_interface *intf = (const struct pic8259_interface *)device->baseconfig().static_config(); + const struct pic8259_interface *intf = (const struct pic8259_interface *)device->static_config(); assert(intf != NULL); diff --git a/src/emu/machine/pit8253.c b/src/emu/machine/pit8253.c index 1781aae3a44..bd760971d17 100644 --- a/src/emu/machine/pit8253.c +++ b/src/emu/machine/pit8253.c @@ -1071,7 +1071,7 @@ static void common_start( device_t *device, int device_type ) { pit8253_t *pit8253 = get_safe_token(device); int timerno; - pit8253->config = (const struct pit8253_config *)device->baseconfig().static_config(); + pit8253->config = (const struct pit8253_config *)device->static_config(); pit8253->device_type = device_type; /* register for state saving */ diff --git a/src/emu/machine/ram.c b/src/emu/machine/ram.c index dee4fa83c4e..7e7aa69196c 100644 --- a/src/emu/machine/ram.c +++ b/src/emu/machine/ram.c @@ -95,7 +95,7 @@ UINT32 ram_parse_string(const char *s) static DEVICE_START( ram ) { ram_state *ram = get_safe_token(device); - ram_config *config = (ram_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + ram_config *config = (ram_config *)downcast<const legacy_device_base *>(device)->inline_config(); /* the device named 'ram' can get ram options from command line */ if (strcmp(device->tag(), RAM_TAG) == 0) @@ -123,7 +123,7 @@ static DEVICE_START( ram ) static DEVICE_VALIDITY_CHECK( ram ) { - ram_config *config = (ram_config *)downcast<const legacy_device_config_base *>(device)->inline_config(); + ram_config *config = (ram_config *)downcast<const legacy_device_base *>(device)->inline_config(); const char *ramsize_string = NULL; int is_valid = FALSE; UINT32 specified_ram = 0; diff --git a/src/emu/machine/rp5c01.c b/src/emu/machine/rp5c01.c index ff1f047dc5e..6ac11223606 100644 --- a/src/emu/machine/rp5c01.c +++ b/src/emu/machine/rp5c01.c @@ -20,6 +20,9 @@ #include "rp5c01.h" +// device type definition +const device_type RP5C01 = &device_creator<rp5c01_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -97,74 +100,6 @@ enum //************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// devices -const device_type RP5C01 = rp5c01_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// rp5c01_device_config - constructor -//------------------------------------------------- - -rp5c01_device_config::rp5c01_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "RP5C01", tag, owner, clock), - device_config_rtc_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *rp5c01_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(rp5c01_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *rp5c01_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, rp5c01_device(machine, *this)); -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void rp5c01_device_config::device_config_complete() -{ - // inherit a copy of the static data - const rp5c01_interface *intf = reinterpret_cast<const rp5c01_interface *>(static_config()); - if (intf != NULL) - *static_cast<rp5c01_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_alarm_func, 0, sizeof(m_out_alarm_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -342,27 +277,47 @@ inline void rp5c01_device::check_alarm() // rp5c01_device - constructor //------------------------------------------------- -rp5c01_device::rp5c01_device(running_machine &_machine, const rp5c01_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), - device_nvram_interface(_machine, config, *this), +rp5c01_device::rp5c01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, RP5C01, "RP5C01", tag, owner, clock), + device_rtc_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), m_alarm(1), m_alarm_on(1), m_1hz(1), - m_16hz(1), - m_config(config) + m_16hz(1) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void rp5c01_device::device_config_complete() +{ + // inherit a copy of the static data + const rp5c01_interface *intf = reinterpret_cast<const rp5c01_interface *>(static_config()); + if (intf != NULL) + *static_cast<rp5c01_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_alarm_cb, 0, sizeof(m_out_alarm_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void rp5c01_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_alarm_func, &m_config.m_out_alarm_func, this); + devcb_resolve_write_line(&m_out_alarm_func, &m_out_alarm_cb, this); // allocate timers m_clock_timer = timer_alloc(TIMER_CLOCK); diff --git a/src/emu/machine/rp5c01.h b/src/emu/machine/rp5c01.h index c5ef20c8050..c91a35c45b4 100644 --- a/src/emu/machine/rp5c01.h +++ b/src/emu/machine/rp5c01.h @@ -50,31 +50,7 @@ struct rp5c01_interface { - devcb_write_line m_out_alarm_func; -}; - - - -// ======================> rp5c01_device_config - -class rp5c01_device_config : public device_config, - public rp5c01_interface, - public device_config_rtc_interface, - public device_config_nvram_interface -{ - friend class rp5c01_device; - - // construction/destruction - rp5c01_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_alarm_cb; }; @@ -83,20 +59,20 @@ protected: class rp5c01_device : public device_t, public device_rtc_interface, - public device_nvram_interface + public device_nvram_interface, + public rp5c01_interface { - friend class rp5c01_device_config; - +public: // construction/destruction - rp5c01_device(running_machine &_machine, const rp5c01_device_config &_config); + rp5c01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); DECLARE_WRITE_LINE_MEMBER( adj_w ); protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -136,8 +112,6 @@ private: // timers emu_timer *m_clock_timer; emu_timer *m_16hz_timer; - - const rp5c01_device_config &m_config; }; diff --git a/src/emu/machine/rp5c15.c b/src/emu/machine/rp5c15.c index 3da17c9c6be..714a7149da0 100644 --- a/src/emu/machine/rp5c15.c +++ b/src/emu/machine/rp5c15.c @@ -110,66 +110,7 @@ enum //************************************************************************** // devices -const device_type RP5C15 = rp5c15_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// rp5c15_device_config - constructor -//------------------------------------------------- - -rp5c15_device_config::rp5c15_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "RP5C15", tag, owner, clock), - device_config_rtc_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *rp5c15_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(rp5c15_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *rp5c15_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, rp5c15_device(machine, *this)); -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void rp5c15_device_config::device_config_complete() -{ - // inherit a copy of the static data - const rp5c15_interface *intf = reinterpret_cast<const rp5c15_interface *>(static_config()); - if (intf != NULL) - *static_cast<rp5c15_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_alarm_func, 0, sizeof(m_out_alarm_func)); - memset(&m_out_clkout_func, 0, sizeof(m_out_clkout_func)); - } -} +const device_type RP5C15 = &device_creator<rp5c15_device>; @@ -351,28 +292,49 @@ inline void rp5c15_device::check_alarm() // rp5c15_device - constructor //------------------------------------------------- -rp5c15_device::rp5c15_device(running_machine &_machine, const rp5c15_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), +rp5c15_device::rp5c15_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, RP5C15, "RP5C15", tag, owner, clock), + device_rtc_interface(mconfig, *this), m_alarm(1), m_alarm_on(1), m_1hz(1), m_16hz(1), - m_clkout(1), - m_config(config) + m_clkout(1) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void rp5c15_device::device_config_complete() +{ + // inherit a copy of the static data + const rp5c15_interface *intf = reinterpret_cast<const rp5c15_interface *>(static_config()); + if (intf != NULL) + *static_cast<rp5c15_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_alarm_cb, 0, sizeof(m_out_alarm_cb)); + memset(&m_out_clkout_cb, 0, sizeof(m_out_clkout_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void rp5c15_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_alarm_func, &m_config.m_out_alarm_func, this); - devcb_resolve_write_line(&m_out_clkout_func, &m_config.m_out_clkout_func, this); + devcb_resolve_write_line(&m_out_alarm_func, &m_out_alarm_cb, this); + devcb_resolve_write_line(&m_out_clkout_func, &m_out_clkout_cb, this); // allocate timers m_clock_timer = timer_alloc(TIMER_CLOCK); diff --git a/src/emu/machine/rp5c15.h b/src/emu/machine/rp5c15.h index 0deebc55401..9a2191d6316 100644 --- a/src/emu/machine/rp5c15.h +++ b/src/emu/machine/rp5c15.h @@ -50,31 +50,8 @@ struct rp5c15_interface { - devcb_write_line m_out_alarm_func; - devcb_write_line m_out_clkout_func; -}; - - - -// ======================> rp5c15_device_config - -class rp5c15_device_config : public device_config, - public rp5c15_interface, - public device_config_rtc_interface -{ - friend class rp5c15_device; - - // construction/destruction - rp5c15_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_alarm_cb; + devcb_write_line m_out_clkout_cb; }; @@ -82,20 +59,20 @@ protected: // ======================> rp5c15_device class rp5c15_device : public device_t, - public device_rtc_interface + public device_rtc_interface, + public rp5c15_interface { - friend class rp5c15_device_config; - +public: // construction/destruction - rp5c15_device(running_machine &_machine, const rp5c15_device_config &_config); + rp5c15_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); DECLARE_WRITE_LINE_MEMBER( adj_w ); protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -134,8 +111,6 @@ private: emu_timer *m_clock_timer; emu_timer *m_16hz_timer; emu_timer *m_clkout_timer; - - const rp5c15_device_config &m_config; }; diff --git a/src/emu/machine/rp5h01.c b/src/emu/machine/rp5h01.c index 51b024e8664..115b040d812 100644 --- a/src/emu/machine/rp5h01.c +++ b/src/emu/machine/rp5h01.c @@ -173,7 +173,7 @@ static DEVICE_START( rp5h01 ) { rp5h01_state *rp5h01 = get_safe_token(device); - assert(device->baseconfig().static_config() == NULL); + assert(device->static_config() == NULL); rp5h01->data = *device->region(); diff --git a/src/emu/machine/rtc65271.c b/src/emu/machine/rtc65271.c index 502826c90e9..5208579ea65 100644 --- a/src/emu/machine/rtc65271.c +++ b/src/emu/machine/rtc65271.c @@ -685,7 +685,7 @@ static TIMER_CALLBACK( rtc_end_update_callback ) static DEVICE_START( rtc65271 ) { - rtc65271_config *config = (rtc65271_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + rtc65271_config *config = (rtc65271_config *)downcast<const legacy_device_base *>(device)->inline_config(); rtc65271_state *state = get_safe_token(device); state->update_timer = device->machine().scheduler().timer_alloc(FUNC(rtc_begin_update_callback), (void *)device); diff --git a/src/emu/machine/s3c24xx.c b/src/emu/machine/s3c24xx.c index fcd4ac80a95..77218904352 100644 --- a/src/emu/machine/s3c24xx.c +++ b/src/emu/machine/s3c24xx.c @@ -3167,7 +3167,7 @@ static DEVICE_RESET( s3c24xx ) static DEVICE_START( s3c24xx ) { s3c24xx_t *s3c24xx = get_token( device); - s3c24xx->iface = (const s3c24xx_interface *)device->baseconfig().static_config(); + s3c24xx->iface = (const s3c24xx_interface *)device->static_config(); for (int i = 0; i < 5; i++) s3c24xx->pwm.timer[i] = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_pwm_timer_exp), (void*)device); for (int i = 0; i < 4; i++) s3c24xx->dma[i].timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_dma_timer_exp), (void*)device); s3c24xx->iic.timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_iic_timer_exp), (void*)device); diff --git a/src/emu/machine/secflash.c b/src/emu/machine/secflash.c index ee2b1c56bad..ffa07f15634 100644 --- a/src/emu/machine/secflash.c +++ b/src/emu/machine/secflash.c @@ -1,17 +1,12 @@ #include "emu.h" #include "machine/secflash.h" -device_secure_serial_flash_config::device_secure_serial_flash_config(const machine_config &mconfig, +device_secure_serial_flash::device_secure_serial_flash(const machine_config &mconfig, device_type type, const char *name, const char *tag, - const device_config *owner, UINT32 clock, UINT32 param) - : device_config(mconfig, type, name, tag, owner, clock, param), - device_config_nvram_interface(mconfig, *this) -{ -} - -device_secure_serial_flash::device_secure_serial_flash(running_machine &_machine, const device_secure_serial_flash_config &config) : device_t(_machine, config), - device_nvram_interface(_machine, config, *this) + device_t *owner, UINT32 clock) : + device_t(mconfig, type, name, tag, owner, clock), + device_nvram_interface(mconfig, *this) { } diff --git a/src/emu/machine/secflash.h b/src/emu/machine/secflash.h index c2291435349..907238a2bd1 100644 --- a/src/emu/machine/secflash.h +++ b/src/emu/machine/secflash.h @@ -5,13 +5,6 @@ #include "emu.h" -class device_secure_serial_flash_config : public device_config, - public device_config_nvram_interface -{ -public: - device_secure_serial_flash_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 param = 0); -}; - class device_secure_serial_flash : public device_t, public device_nvram_interface { @@ -34,7 +27,7 @@ protected: virtual void sda_0() = 0; virtual void sda_1() = 0; - device_secure_serial_flash(running_machine &_machine, const device_secure_serial_flash_config &config); + device_secure_serial_flash(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); virtual void device_start(); virtual void device_reset(); }; diff --git a/src/emu/machine/smc91c9x.c b/src/emu/machine/smc91c9x.c index 94c9afd9c27..194654ce0fa 100644 --- a/src/emu/machine/smc91c9x.c +++ b/src/emu/machine/smc91c9x.c @@ -509,13 +509,13 @@ WRITE16_DEVICE_HANDLER( smc91c9x_w ) static DEVICE_START( smc91c9x ) { - const smc91c9x_config *config = (const smc91c9x_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config(); + const smc91c9x_config *config = (const smc91c9x_config *)downcast<const legacy_device_base *>(device)->inline_config(); smc91c9x_state *smc = get_safe_token(device); /* validate some basic stuff */ assert(device != NULL); - assert(device->baseconfig().static_config() == NULL); - assert(downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config() != NULL); + assert(device->static_config() == NULL); + assert(downcast<const legacy_device_base *>(device)->inline_config() != NULL); /* store a pointer back to the device */ smc->device = device; diff --git a/src/emu/machine/timekpr.c b/src/emu/machine/timekpr.c index 998c9bcc2c6..eb7c9737d62 100644 --- a/src/emu/machine/timekpr.c +++ b/src/emu/machine/timekpr.c @@ -15,6 +15,14 @@ #include "machine/timekpr.h" +// device type definition +const device_type M48T02 = &device_creator<m48t02_device>; +const device_type M48T35 = &device_creator<m48t35_device>; +const device_type M48T37 = &device_creator<m48t37_device>; +const device_type M48T58 = &device_creator<m48t58_device>; +const device_type MK48T08 = &device_creator<mk48t08_device>; + + /*************************************************************************** MACROS ***************************************************************************/ @@ -46,66 +54,6 @@ #define FLAGS_AF ( 0x40 ) /* M48T37: not emulated */ #define FLAGS_WDF ( 0x80 ) /* M48T37: not emulated */ -#define TIMEKPR_DEV_DERIVED_CTOR(devtype) \ - devtype##_device::devtype##_device(running_machine &_machine, const devtype##_device_config &config) \ - : timekeeper_device(_machine, config) \ - { } - -#define TIMEKPR_DEVCFG_DERIVED_CTOR(devtype, name, shortname) \ - devtype##_device_config::devtype##_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) \ - : timekeeper_device_config(mconfig, name, tag, owner, clock) \ - { } - -#define TIMEKPR_DEVCFG_DERIVED_STATIC_ALLOC(devtype) \ - device_config *devtype##_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) \ - { return global_alloc(devtype##_device_config(mconfig, tag, owner, clock)); } - -#define TIMEKPR_DEVCFG_DERIVED_DEV_ALLOC(devtype) \ - device_t *devtype##_device_config::alloc_device(running_machine &machine) const \ - { return auto_alloc(machine, devtype##_device(machine, *this)); } - -#define TIMEKPR_DERIVE(devtype, name, shortname) \ - TIMEKPR_DEV_DERIVED_CTOR(devtype) \ - TIMEKPR_DEVCFG_DERIVED_CTOR(devtype, name, shortname) \ - TIMEKPR_DEVCFG_DERIVED_STATIC_ALLOC(devtype) \ - TIMEKPR_DEVCFG_DERIVED_DEV_ALLOC(devtype) - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// timekeeper_device_config - constructor -//------------------------------------------------- - -timekeeper_device_config::timekeeper_device_config(const machine_config &mconfig, const char *type, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, type, tag, owner, clock), - device_config_nvram_interface(mconfig, *this) -{ - -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *timekeeper_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(timekeeper_device_config(mconfig, "TIMEKEEPER", tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *timekeeper_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, timekeeper_device(machine, *this)); -} /*************************************************************************** INLINE FUNCTIONS @@ -165,76 +113,19 @@ static int counter_from_ram( UINT8 *data, int offset ) // LIVE DEVICE //************************************************************************** -const device_type M48T02 = m48t02_device_config::static_alloc_device_config; -const device_type M48T35 = m48t35_device_config::static_alloc_device_config; -const device_type M48T37 = m48t37_device_config::static_alloc_device_config; -const device_type M48T58 = m48t58_device_config::static_alloc_device_config; -const device_type MK48T08 = mk48t08_device_config::static_alloc_device_config; - -TIMEKPR_DERIVE(m48t02, "M48T02", "m48t02") -TIMEKPR_DERIVE(m48t35, "M48T35", "m48t35") -TIMEKPR_DERIVE(m48t37, "M48T37", "m48t37") -TIMEKPR_DERIVE(m48t58, "M48T58", "m48t58") -TIMEKPR_DERIVE(mk48t08, "MK48T08", "mk48t08") - //------------------------------------------------- -// timekeeper_device - constructor +// timekeeper_device_config - constructor //------------------------------------------------- -timekeeper_device::timekeeper_device(running_machine &_machine, const timekeeper_device_config &config) - : device_t(_machine, config), - device_nvram_interface(_machine, config, *this), - m_config(config) +timekeeper_device::timekeeper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, tag, owner, clock), + device_nvram_interface(mconfig, *this) { } -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void timekeeper_device::device_start() -{ - system_time systime; - - /* validate some basic stuff */ - assert(this != NULL); - - machine().base_datetime(systime); - - m_control = 0; - m_seconds = make_bcd( systime.local_time.second ); - m_minutes = make_bcd( systime.local_time.minute ); - m_hours = make_bcd( systime.local_time.hour ); - m_day = make_bcd( systime.local_time.weekday + 1 ); - m_date = make_bcd( systime.local_time.mday ); - m_month = make_bcd( systime.local_time.month + 1 ); - m_year = make_bcd( systime.local_time.year % 100 ); - m_century = make_bcd( systime.local_time.year / 100 ); - m_data = auto_alloc_array( machine(), UINT8, m_size ); - - m_default_data = *region(); - if (m_default_data) - { - assert( region()->bytes() == m_size ); - } - - save_item( NAME(m_control) ); - save_item( NAME(m_seconds) ); - save_item( NAME(m_minutes) ); - save_item( NAME(m_hours) ); - save_item( NAME(m_day) ); - save_item( NAME(m_date) ); - save_item( NAME(m_month) ); - save_item( NAME(m_year) ); - save_item( NAME(m_century) ); - save_pointer( NAME(m_data), m_size ); - - emu_timer *timer = timer_alloc(); - timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1)); -} - -void m48t02_device::device_start() +m48t02_device::m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : timekeeper_device(mconfig, M48T02, "M48T02", tag, owner, clock) { m_offset_control = 0x7f8; m_offset_seconds = 0x7f9; @@ -247,11 +138,10 @@ void m48t02_device::device_start() m_offset_century = -1; m_offset_flags = -1; m_size = 0x800; - - timekeeper_device::device_start(); } -void m48t35_device::device_start() +m48t35_device::m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : timekeeper_device(mconfig, M48T35, "M48T35", tag, owner, clock) { m_offset_control = 0x7ff8; m_offset_seconds = 0x7ff9; @@ -264,11 +154,10 @@ void m48t35_device::device_start() m_offset_century = -1; m_offset_flags = -1; m_size = 0x8000; - - timekeeper_device::device_start(); } -void m48t37_device::device_start() +m48t37_device::m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : timekeeper_device(mconfig, M48T37, "M48T37", tag, owner, clock) { m_offset_control = 0x7ff8; m_offset_seconds = 0x7ff9; @@ -281,11 +170,10 @@ void m48t37_device::device_start() m_offset_century = 0x7ff1; m_offset_flags = 0x7ff0; m_size = 0x8000; - - timekeeper_device::device_start(); } -void m48t58_device::device_start() +m48t58_device::m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : timekeeper_device(mconfig, M48T58, "M48T58", tag, owner, clock) { m_offset_control = 0x1ff8; m_offset_seconds = 0x1ff9; @@ -298,11 +186,10 @@ void m48t58_device::device_start() m_offset_century = -1; m_offset_flags = -1; m_size = 0x2000; - - timekeeper_device::device_start(); } -void mk48t08_device::device_start() +mk48t08_device::mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : timekeeper_device(mconfig, MK48T08, "MK48T08", tag, owner, clock) { m_offset_control = 0x1ff8; m_offset_seconds = 0x1ff9; @@ -315,8 +202,52 @@ void mk48t08_device::device_start() m_offset_century = 0x1ff1; m_offset_flags = 0x1ff0; m_size = 0x2000; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void timekeeper_device::device_start() +{ + system_time systime; + + /* validate some basic stuff */ + assert(this != NULL); - timekeeper_device::device_start(); + machine().base_datetime(systime); + + m_control = 0; + m_seconds = make_bcd( systime.local_time.second ); + m_minutes = make_bcd( systime.local_time.minute ); + m_hours = make_bcd( systime.local_time.hour ); + m_day = make_bcd( systime.local_time.weekday + 1 ); + m_date = make_bcd( systime.local_time.mday ); + m_month = make_bcd( systime.local_time.month + 1 ); + m_year = make_bcd( systime.local_time.year % 100 ); + m_century = make_bcd( systime.local_time.year / 100 ); + m_data = auto_alloc_array( machine(), UINT8, m_size ); + + m_default_data = *region(); + if (m_default_data) + { + assert( region()->bytes() == m_size ); + } + + save_item( NAME(m_control) ); + save_item( NAME(m_seconds) ); + save_item( NAME(m_minutes) ); + save_item( NAME(m_hours) ); + save_item( NAME(m_day) ); + save_item( NAME(m_date) ); + save_item( NAME(m_month) ); + save_item( NAME(m_year) ); + save_item( NAME(m_century) ); + save_pointer( NAME(m_data), m_size ); + + emu_timer *timer = timer_alloc(); + timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1)); } //------------------------------------------------- @@ -324,11 +255,6 @@ void mk48t08_device::device_start() //------------------------------------------------- void timekeeper_device::device_reset() { } -void m48t02_device::device_reset() { } -void m48t35_device::device_reset() { } -void m48t37_device::device_reset() { } -void m48t58_device::device_reset() { } -void mk48t08_device::device_reset() { } void timekeeper_device::counters_to_ram() { diff --git a/src/emu/machine/timekpr.h b/src/emu/machine/timekpr.h index 67e48aae1b5..4dd5cb64aa8 100644 --- a/src/emu/machine/timekpr.h +++ b/src/emu/machine/timekpr.h @@ -54,44 +54,15 @@ struct timekeeper_config const UINT8 *m_data; }; -// ======================> timekeeper_device_config - -class timekeeper_device_config : public device_config, - public device_config_nvram_interface, - public timekeeper_config -{ - friend class timekeeper_device; - friend class m48t02_device_config; - friend class m48t35_device_config; - friend class m48t37_device_config; - friend class m48t58_device_config; - friend class mk48t08_device_config; - -protected: - // construction/destruction - timekeeper_device_config(const machine_config &mconfig, const char *type, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; -}; - // ======================> timekeeper_device class timekeeper_device : public device_t, public device_nvram_interface { - friend class timekeeper_device_config; - friend class m48t02_device; - friend class m48t35_device; - friend class m48t37_device; - friend class m48t58_device; - friend class mk48t08_device; - +protected: // construction/destruction - timekeeper_device(running_machine &_machine, const timekeeper_device_config &config); + timekeeper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); public: void write(UINT16 offset, UINT8 data); @@ -108,13 +79,11 @@ protected: virtual void nvram_read(emu_file &file); virtual void nvram_write(emu_file &file); - // internal state - const timekeeper_device_config &m_config; - private: void counters_to_ram(); void counters_from_ram(); + // internal state UINT8 m_control; UINT8 m_seconds; UINT8 m_minutes; @@ -128,6 +97,7 @@ private: UINT8 *m_data; UINT8 *m_default_data; +protected: int m_size; int m_offset_control; int m_offset_seconds; @@ -141,11 +111,35 @@ private: int m_offset_flags; }; -GENERIC_DEVICE_DERIVED_CONFIG(timekeeper, m48t02) -GENERIC_DEVICE_DERIVED_CONFIG(timekeeper, m48t35) -GENERIC_DEVICE_DERIVED_CONFIG(timekeeper, m48t37) -GENERIC_DEVICE_DERIVED_CONFIG(timekeeper, m48t58) -GENERIC_DEVICE_DERIVED_CONFIG(timekeeper, mk48t08) +class m48t02_device : public timekeeper_device +{ +public: + m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class m48t35_device : public timekeeper_device +{ +public: + m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class m48t37_device : public timekeeper_device +{ +public: + m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class m48t58_device : public timekeeper_device +{ +public: + m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class mk48t08_device : public timekeeper_device +{ +public: + mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; // device type definition extern const device_type M48T02; diff --git a/src/emu/machine/tms6100.c b/src/emu/machine/tms6100.c index 48f9b0aef30..8bbb2e08202 100644 --- a/src/emu/machine/tms6100.c +++ b/src/emu/machine/tms6100.c @@ -141,7 +141,7 @@ static DEVICE_START( tms6100 ) assert_always(tms != NULL, "Error creating TMS6100 chip"); - //tms->intf = device->baseconfig().static_config ? (const tms5110_interface *)device->baseconfig().static_config : &dummy; + //tms->intf = device->static_config ? (const tms5110_interface *)device->static_config : &dummy; tms->rom = *device->region(); tms->device = device; diff --git a/src/emu/machine/upd1990a.c b/src/emu/machine/upd1990a.c index bc3d4f11d9d..1ed6019e3fe 100644 --- a/src/emu/machine/upd1990a.c +++ b/src/emu/machine/upd1990a.c @@ -19,6 +19,9 @@ #include "upd1990a.h" +// device type definition +const device_type UPD1990A = &device_creator<upd1990a_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -43,73 +46,6 @@ enum //************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// devices -const device_type UPD1990A = upd1990a_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -//------------------------------------------------- -// upd1990a_device_config - constructor -//------------------------------------------------- - -upd1990a_device_config::upd1990a_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "uPD1990A", tag, owner, clock), - device_config_rtc_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *upd1990a_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(upd1990a_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object -//------------------------------------------------- - -device_t *upd1990a_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, upd1990a_device(machine, *this)); -} - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void upd1990a_device_config::device_config_complete() -{ - // inherit a copy of the static data - const upd1990a_interface *intf = reinterpret_cast<const upd1990a_interface *>(static_config()); - if (intf != NULL) - *static_cast<upd1990a_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { -// memset(&in_pa_func, 0, sizeof(in_pa_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -202,23 +138,43 @@ inline void upd1990a_device::advance_seconds() // upd1990a_device - constructor //------------------------------------------------- -upd1990a_device::upd1990a_device(running_machine &_machine, const upd1990a_device_config &config) - : device_t(_machine, config), - device_rtc_interface(_machine, config, *this), - m_config(config) +upd1990a_device::upd1990a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, UPD1990A, "uPD1990A", tag, owner, clock), + device_rtc_interface(mconfig, *this) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void upd1990a_device::device_config_complete() +{ + // inherit a copy of the static data + const upd1990a_interface *intf = reinterpret_cast<const upd1990a_interface *>(static_config()); + if (intf != NULL) + *static_cast<upd1990a_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { +// memset(&in_pa_cb, 0, sizeof(in_pa_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void upd1990a_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_data_func, &m_config.m_out_data_func, this); - devcb_resolve_write_line(&m_out_tp_func, &m_config.m_out_tp_func, this); + devcb_resolve_write_line(&m_out_data_func, &m_out_data_cb, this); + devcb_resolve_write_line(&m_out_tp_func, &m_out_tp_cb, this); // allocate timers m_timer_clock = timer_alloc(TIMER_CLOCK); diff --git a/src/emu/machine/upd1990a.h b/src/emu/machine/upd1990a.h index be89551e670..2a6654424bc 100644 --- a/src/emu/machine/upd1990a.h +++ b/src/emu/machine/upd1990a.h @@ -54,31 +54,8 @@ struct upd1990a_interface { - devcb_write_line m_out_data_func; - devcb_write_line m_out_tp_func; -}; - - - -// ======================> upd1990a_device_config - -class upd1990a_device_config : public device_config, - public upd1990a_interface, - public device_config_rtc_interface -{ - friend class upd1990a_device; - - // construction/destruction - upd1990a_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_data_cb; + devcb_write_line m_out_tp_cb; }; @@ -86,14 +63,13 @@ protected: // ======================> upd1990a_device class upd1990a_device : public device_t, - public device_rtc_interface + public device_rtc_interface, + public upd1990a_interface { - friend class upd1990a_device_config; - +public: // construction/destruction - upd1990a_device(running_machine &_machine, const upd1990a_device_config &_config); + upd1990a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_WRITE_LINE_MEMBER( oe_w ); DECLARE_WRITE_LINE_MEMBER( cs_w ); DECLARE_WRITE_LINE_MEMBER( stb_w ); @@ -107,6 +83,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -143,8 +120,6 @@ private: emu_timer *m_timer_clock; emu_timer *m_timer_tp; emu_timer *m_timer_data_out; - - const upd1990a_device_config &m_config; }; diff --git a/src/emu/machine/upd7201.c b/src/emu/machine/upd7201.c index dc74e5bdb08..9063765b403 100644 --- a/src/emu/machine/upd7201.c +++ b/src/emu/machine/upd7201.c @@ -21,6 +21,9 @@ #include "machine/devhelpr.h" +// device type definition +const device_type UPD7201 = &device_creator<upd7201_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -38,44 +41,6 @@ enum //************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// devices -const device_type UPD7201 = upd7201_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(upd7201, "UPD7201") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void upd7201_device_config::device_config_complete() -{ - // inherit a copy of the static data - const upd7201_interface *intf = reinterpret_cast<const upd7201_interface *>(static_config()); - if (intf != NULL) - *static_cast<upd7201_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -106,21 +71,41 @@ inline void upd7201_device::transmit(int channel) // upd7201_device - constructor //------------------------------------------------- -upd7201_device::upd7201_device(running_machine &_machine, const upd7201_device_config &config) - : device_t(_machine, config), - m_config(config) +upd7201_device::upd7201_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, UPD7201, "UPD7201", tag, owner, clock) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void upd7201_device::device_config_complete() +{ + // inherit a copy of the static data + const upd7201_interface *intf = reinterpret_cast<const upd7201_interface *>(static_config()); + if (intf != NULL) + *static_cast<upd7201_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void upd7201_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); } diff --git a/src/emu/machine/upd7201.h b/src/emu/machine/upd7201.h index 69ebfb45ae1..90d65d53f7d 100644 --- a/src/emu/machine/upd7201.h +++ b/src/emu/machine/upd7201.h @@ -60,63 +60,40 @@ struct upd7201_interface { - devcb_write_line m_out_int_func; + devcb_write_line m_out_int_cb; struct { int m_rx_clock; int m_tx_clock; - devcb_write_line m_out_drqrx_func; - devcb_write_line m_out_drqtx_func; + devcb_write_line m_out_drqrx_cb; + devcb_write_line m_out_drqtx_cb; - devcb_read_line m_in_rxd_func; - devcb_write_line m_out_txd_func; + devcb_read_line m_in_rxd_cb; + devcb_write_line m_out_txd_cb; - devcb_read_line m_in_cts_func; - devcb_read_line m_in_dcd_func; - devcb_write_line m_out_rts_func; - devcb_write_line m_out_dtr_func; + devcb_read_line m_in_cts_cb; + devcb_read_line m_in_dcd_cb; + devcb_write_line m_out_rts_cb; + devcb_write_line m_out_dtr_cb; - devcb_write_line m_out_wait_func; - devcb_write_line m_out_sync_func; + devcb_write_line m_out_wait_cb; + devcb_write_line m_out_sync_cb; } m_channel[2]; }; -// ======================> upd7201_device_config - -class upd7201_device_config : public device_config, - public upd7201_interface -{ - friend class upd7201_device; - - // construction/destruction - upd7201_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> upd7201_device -class upd7201_device : public device_t +class upd7201_device : public device_t, + public upd7201_interface { - friend class upd7201_device_config; - +public: // construction/destruction - upd7201_device(running_machine &_machine, const upd7201_device_config &_config); + upd7201_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( cd_ba_r ); DECLARE_WRITE8_MEMBER( cd_ba_w ); DECLARE_READ8_MEMBER( ba_cd_r ); @@ -142,6 +119,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int m_param, void *ptr); @@ -162,8 +140,6 @@ private: emu_timer *m_tx_a_timer; emu_timer *m_rx_b_timer; emu_timer *m_tx_b_timer; - - const upd7201_device_config &m_config; }; diff --git a/src/emu/machine/x2212.c b/src/emu/machine/x2212.c index e246ca53e05..a20a8321a54 100644 --- a/src/emu/machine/x2212.c +++ b/src/emu/machine/x2212.c @@ -14,8 +14,6 @@ // GLOBAL VARIABLES //************************************************************************** -const device_type X2212 = x2212_device_config::static_alloc_device_config; - static ADDRESS_MAP_START( x2212_sram_map, AS_0, 8 ) AM_RANGE(0x0000, 0x00ff) AM_RAM ADDRESS_MAP_END @@ -27,42 +25,51 @@ ADDRESS_MAP_END //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** +// device type definition +const device_type X2212 = &device_creator<x2212_device>; + //------------------------------------------------- -// x2212_device_config - constructor +// x2212_device - constructor //------------------------------------------------- -x2212_device_config::x2212_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "X2212", tag, owner, clock), - device_config_memory_interface(mconfig, *this), - device_config_nvram_interface(mconfig, *this), +x2212_device::x2212_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, X2212, "X2212", tag, owner, clock), + device_memory_interface(mconfig, *this), + device_nvram_interface(mconfig, *this), + m_auto_save(false), m_sram_space_config("SRAM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_sram_map)), m_e2prom_space_config("E2PROM", ENDIANNESS_BIG, 8, 8, 0, *ADDRESS_MAP_NAME(x2212_e2prom_map)), - m_auto_save(false) + m_store(false), + m_array_recall(false) { } //------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object +// static_set_auto_save - configuration helper +// to set the auto-save flag //------------------------------------------------- -device_config *x2212_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) +void x2212_device::static_set_auto_save(device_t &device) { - return global_alloc(x2212_device_config(mconfig, tag, owner, clock)); + downcast<x2212_device &>(device).m_auto_save = true; } //------------------------------------------------- -// alloc_device - allocate a new device object +// device_start - device-specific startup //------------------------------------------------- -device_t *x2212_device_config::alloc_device(running_machine &machine) const +void x2212_device::device_start() { - return auto_alloc(machine, x2212_device(machine, *this)); + save_item(NAME(m_store)); + save_item(NAME(m_array_recall)); + + m_sram = m_addrspace[0]; + m_e2prom = m_addrspace[1]; } @@ -71,58 +78,13 @@ device_t *x2212_device_config::alloc_device(running_machine &machine) const // any address spaces owned by this device //------------------------------------------------- -const address_space_config *x2212_device_config::memory_space_config(address_spacenum spacenum) const +const address_space_config *x2212_device::memory_space_config(address_spacenum spacenum) const { return (spacenum == 0) ? &m_sram_space_config : (spacenum == 1) ? &m_e2prom_space_config : NULL; } //------------------------------------------------- -// static_set_auto_save - configuration helper -// to set the auto-save flag -//------------------------------------------------- - -void x2212_device_config::static_set_auto_save(device_config *device) -{ - downcast<x2212_device_config *>(device)->m_auto_save = true; -} - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// x2212_device - constructor -//------------------------------------------------- - -x2212_device::x2212_device(running_machine &_machine, const x2212_device_config &config) - : device_t(_machine, config), - device_memory_interface(_machine, config, *this), - device_nvram_interface(_machine, config, *this), - m_config(config), - m_store(false), - m_array_recall(false) -{ -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void x2212_device::device_start() -{ - save_item(NAME(m_store)); - save_item(NAME(m_array_recall)); - - m_sram = m_addrspace[0]; - m_e2prom = m_addrspace[1]; -} - - -//------------------------------------------------- // nvram_default - called to initialize NVRAM to // its default state //------------------------------------------------- @@ -175,7 +137,7 @@ void x2212_device::nvram_read(emu_file &file) void x2212_device::nvram_write(emu_file &file) { // auto-save causes an implicit store prior to exiting (writing) - if (m_config.m_auto_save) + if (m_auto_save) store(); UINT8 buffer[SIZE_DATA]; diff --git a/src/emu/machine/x2212.h b/src/emu/machine/x2212.h index fc85f32e9be..bebc5590baf 100644 --- a/src/emu/machine/x2212.h +++ b/src/emu/machine/x2212.h @@ -24,7 +24,7 @@ // to fire on power-down, effectively creating an "auto-save" functionality #define MCFG_X2212_ADD_AUTOSAVE(_tag) \ MCFG_DEVICE_ADD(_tag, X2212, 0) \ - x2212_device_config::static_set_auto_save(device); \ + x2212_device::static_set_auto_save(*device); \ @@ -33,50 +33,19 @@ //************************************************************************** -// ======================> x2212_device_config - -class x2212_device_config : public device_config, - public device_config_memory_interface, - public device_config_nvram_interface -{ - friend class x2212_device; - - // construction/destruction - x2212_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - - // inline configuration helpers - static void static_set_auto_save(device_config *device); - -protected: - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; - - // device-specific configuration - address_space_config m_sram_space_config; - address_space_config m_e2prom_space_config; - - // internal state - bool m_auto_save; -}; - - // ======================> x2212_device class x2212_device : public device_t, public device_memory_interface, public device_nvram_interface { - friend class x2212_device_config; - +public: // construction/destruction - x2212_device(running_machine &_machine, const x2212_device_config &config); + x2212_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // inline configuration helpers + static void static_set_auto_save(device_t &device); -public: // I/O operations DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -92,6 +61,9 @@ protected: // device-level overrides virtual void device_start(); + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + // device_nvram_interface overrides virtual void nvram_default(); virtual void nvram_read(emu_file &file); @@ -99,9 +71,14 @@ protected: static const int SIZE_DATA = 0x100; - // internal state - const x2212_device_config &m_config; + // configuration state + bool m_auto_save; + + // device-specific configuration + address_space_config m_sram_space_config; + address_space_config m_e2prom_space_config; + // internal state address_space * m_sram; address_space * m_e2prom; diff --git a/src/emu/machine/x76f041.c b/src/emu/machine/x76f041.c index c42b5571b34..a3ee45df84d 100644 --- a/src/emu/machine/x76f041.c +++ b/src/emu/machine/x76f041.c @@ -25,30 +25,15 @@ inline void ATTR_PRINTF(3,4) x76f041_device::verboselog(int n_level, const char va_start(v, s_fmt); vsprintf(buf, s_fmt, v); va_end(v); - logerror("x76f041 %s %s: %s", config.tag(), machine().describe_context(), buf); + logerror("x76f041 %s %s: %s", tag(), machine().describe_context(), buf); } } -const device_type X76F041 = x76f041_device_config::static_alloc_device_config; +// device type definition +const device_type X76F041 = &device_creator<x76f041_device>; -x76f041_device_config::x76f041_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_secure_serial_flash_config(mconfig, static_alloc_device_config, "X76F041", tag, owner, clock) -{ -} - -device_config *x76f041_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(x76f041_device_config(mconfig, tag, owner, clock)); -} - -device_t *x76f041_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, x76f041_device(machine, *this)); -} - -x76f041_device::x76f041_device(running_machine &_machine, const x76f041_device_config &_config) - : device_secure_serial_flash(_machine, _config), - config(_config) +x76f041_device::x76f041_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_secure_serial_flash(mconfig, X76F041, "X76F041", tag, owner, clock) { } diff --git a/src/emu/machine/x76f041.h b/src/emu/machine/x76f041.h index 88c492a359a..70df0bf8fe3 100644 --- a/src/emu/machine/x76f041.h +++ b/src/emu/machine/x76f041.h @@ -13,25 +13,11 @@ #include "machine/secflash.h" -class x76f041_device_config : public device_secure_serial_flash_config -{ - friend class x76f041_device; - - // construction/destruction - x76f041_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; -}; - class x76f041_device : public device_secure_serial_flash { - friend class x76f041_device_config; - +public: // construction/destruction - x76f041_device(running_machine &_machine, const x76f041_device_config &config); + x76f041_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); protected: // device-level overrides @@ -54,8 +40,6 @@ protected: virtual void sda_1(); // internal state - const x76f041_device_config &config; - enum { SIZE_WRITE_BUFFER = 8, SIZE_RESPONSE_TO_RESET = 4, diff --git a/src/emu/machine/x76f100.c b/src/emu/machine/x76f100.c index 89db4b05e4b..c6f4d3a01a5 100644 --- a/src/emu/machine/x76f100.c +++ b/src/emu/machine/x76f100.c @@ -23,30 +23,15 @@ inline void ATTR_PRINTF(3,4) x76f100_device::verboselog(int n_level, const char va_start(v, s_fmt); vsprintf(buf, s_fmt, v); va_end(v); - logerror("x76f100 %s %s: %s", config.tag(), machine().describe_context(), buf); + logerror("x76f100 %s %s: %s", tag(), machine().describe_context(), buf); } } -const device_type X76F100 = x76f100_device_config::static_alloc_device_config; +// device type definition +const device_type X76F100 = &device_creator<x76f100_device>; -x76f100_device_config::x76f100_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_secure_serial_flash_config(mconfig, static_alloc_device_config, "X76F100", tag, owner, clock) -{ -} - -device_config *x76f100_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(x76f100_device_config(mconfig, tag, owner, clock)); -} - -device_t *x76f100_device_config::alloc_device(running_machine &machine) const -{ - return auto_alloc(machine, x76f100_device(machine, *this)); -} - -x76f100_device::x76f100_device(running_machine &_machine, const x76f100_device_config &_config) - : device_secure_serial_flash(_machine, _config), - config(_config) +x76f100_device::x76f100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_secure_serial_flash(mconfig, X76F100, "X76F100", tag, owner, clock) { } @@ -84,7 +69,7 @@ void x76f100_device::nvram_default() // Ensure the size is correct though if(m_region->bytes() != SIZE_RESPONSE_TO_RESET+SIZE_WRITE_PASSWORD+SIZE_READ_PASSWORD+SIZE_DATA) logerror("x76f100 %s: Wrong region length for initialization data, expected 0x%x, got 0x%x\n", - config.tag(), + tag(), SIZE_RESPONSE_TO_RESET+SIZE_WRITE_PASSWORD+SIZE_READ_PASSWORD+SIZE_DATA, m_region->bytes()); else { @@ -100,7 +85,7 @@ void x76f100_device::nvram_default() // That chip isn't really usable without the passwords, so bitch // if there's no region - logerror("x76f100 %s: Warning, no default data provided, chip is unusable.\n", config.tag()); + logerror("x76f100 %s: Warning, no default data provided, chip is unusable.\n", tag()); memset(response_to_reset, 0, SIZE_RESPONSE_TO_RESET); memset(write_password, 0, SIZE_WRITE_PASSWORD); memset(read_password, 0, SIZE_READ_PASSWORD); diff --git a/src/emu/machine/x76f100.h b/src/emu/machine/x76f100.h index 92cbaaf8ecb..0eab9d26347 100644 --- a/src/emu/machine/x76f100.h +++ b/src/emu/machine/x76f100.h @@ -13,25 +13,11 @@ #include "machine/secflash.h" -class x76f100_device_config : public device_secure_serial_flash_config -{ - friend class x76f100_device; - - // construction/destruction - x76f100_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; -}; - class x76f100_device : public device_secure_serial_flash { - friend class x76f100_device_config; - +public: // construction/destruction - x76f100_device(running_machine &_machine, const x76f100_device_config &config); + x76f100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); protected: // device-level overrides @@ -54,8 +40,6 @@ protected: virtual void sda_1(); // internal state - const x76f100_device_config &config; - enum { SIZE_WRITE_BUFFER = 8, SIZE_RESPONSE_TO_RESET = 4, diff --git a/src/emu/machine/z80ctc.c b/src/emu/machine/z80ctc.c index fe195f62913..a992193b9a0 100644 --- a/src/emu/machine/z80ctc.c +++ b/src/emu/machine/z80ctc.c @@ -27,14 +27,6 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z80CTC = z80ctc_device_config::static_alloc_device_config; - - - -//************************************************************************** // CONSTANTS //************************************************************************** @@ -77,38 +69,20 @@ const int WAITING_FOR_TRIG = 0x100; //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// z80ctc_device_config - constructor -//------------------------------------------------- - -z80ctc_device_config::z80ctc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Zilog Z80 CTC", tag, owner, clock), - device_config_z80daisy_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *z80ctc_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(z80ctc_device_config(mconfig, tag, owner, clock)); -} - +// device type definition +const device_type Z80CTC = &device_creator<z80ctc_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// z80ctc_device - constructor //------------------------------------------------- -device_t *z80ctc_device_config::alloc_device(running_machine &machine) const +z80ctc_device::z80ctc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z80CTC, "Zilog Z80 CTC", tag, owner, clock), + device_z80daisy_interface(mconfig, *this) { - return auto_alloc(machine, z80ctc_device(machine, *this)); } @@ -118,7 +92,7 @@ device_t *z80ctc_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void z80ctc_device_config::device_config_complete() +void z80ctc_device::device_config_complete() { // inherit a copy of the static data const z80ctc_interface *intf = reinterpret_cast<const z80ctc_interface *>(static_config()); @@ -129,31 +103,14 @@ void z80ctc_device_config::device_config_complete() else { m_notimer = 0; - memset(&m_intr, 0, sizeof(m_intr)); - memset(&m_zc0, 0, sizeof(m_zc0)); - memset(&m_zc1, 0, sizeof(m_zc1)); - memset(&m_zc2, 0, sizeof(m_zc2)); + memset(&m_intr_cb, 0, sizeof(m_intr_cb)); + memset(&m_zc0_cb, 0, sizeof(m_zc0_cb)); + memset(&m_zc1_cb, 0, sizeof(m_zc1_cb)); + memset(&m_zc2_cb, 0, sizeof(m_zc2_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// z80ctc_device - constructor -//------------------------------------------------- - -z80ctc_device::z80ctc_device(running_machine &_machine, const z80ctc_device_config &_config) - : device_t(_machine, _config), - device_z80daisy_interface(_machine, _config, *this), - m_config(_config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -164,13 +121,13 @@ void z80ctc_device::device_start() m_period256 = attotime::from_hz(m_clock) * 256; // resolve callbacks - devcb_resolve_write_line(&m_intr, &m_config.m_intr, this); + devcb_resolve_write_line(&m_intr, &m_intr_cb, this); // start each channel - m_channel[0].start(this, 0, (m_config.m_notimer & NOTIMER_0) != 0, &m_config.m_zc0); - m_channel[1].start(this, 1, (m_config.m_notimer & NOTIMER_1) != 0, &m_config.m_zc1); - m_channel[2].start(this, 2, (m_config.m_notimer & NOTIMER_2) != 0, &m_config.m_zc2); - m_channel[3].start(this, 3, (m_config.m_notimer & NOTIMER_3) != 0, NULL); + m_channel[0].start(this, 0, (m_notimer & NOTIMER_0) != 0, &m_zc0_cb); + m_channel[1].start(this, 1, (m_notimer & NOTIMER_1) != 0, &m_zc1_cb); + m_channel[2].start(this, 2, (m_notimer & NOTIMER_2) != 0, &m_zc2_cb); + m_channel[3].start(this, 3, (m_notimer & NOTIMER_3) != 0, NULL); // register for save states save_item(NAME(m_vector)); diff --git a/src/emu/machine/z80ctc.h b/src/emu/machine/z80ctc.h index 543295f4346..1700275c368 100644 --- a/src/emu/machine/z80ctc.h +++ b/src/emu/machine/z80ctc.h @@ -65,33 +65,10 @@ const int NOTIMER_3 = (1<<3); struct z80ctc_interface { UINT8 m_notimer; // timer disabler mask - devcb_write_line m_intr; // callback when change interrupt status - devcb_write_line m_zc0; // ZC/TO0 callback - devcb_write_line m_zc1; // ZC/TO1 callback - devcb_write_line m_zc2; // ZC/TO2 callback -}; - - - -// ======================> z80ctc_device_config - -class z80ctc_device_config : public device_config, - public device_config_z80daisy_interface, - public z80ctc_interface -{ - friend class z80ctc_device; - - // construction/destruction - z80ctc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_intr_cb; // callback when change interrupt status + devcb_write_line m_zc0_cb; // ZC/TO0 callback + devcb_write_line m_zc1_cb; // ZC/TO1 callback + devcb_write_line m_zc2_cb; // ZC/TO2 callback }; @@ -99,14 +76,13 @@ protected: // ======================> z80ctc_device class z80ctc_device : public device_t, - public device_z80daisy_interface + public device_z80daisy_interface, + public z80ctc_interface { - friend class z80ctc_device_config; - +public: // construction/destruction - z80ctc_device(running_machine &_machine, const z80ctc_device_config &_config); + z80ctc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: // state getters attotime period(int ch) const { return m_channel[ch].period(); } @@ -117,6 +93,7 @@ public: private: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -161,7 +138,6 @@ private: }; // internal state - const z80ctc_device_config &m_config; devcb_resolved_write_line m_intr; // interrupt callback UINT8 m_vector; // interrupt vector diff --git a/src/emu/machine/z80dart.c b/src/emu/machine/z80dart.c index 8bb3c212cf8..ea3b80e9cb0 100644 --- a/src/emu/machine/z80dart.c +++ b/src/emu/machine/z80dart.c @@ -44,19 +44,6 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z80DART = z80dart_device_config::static_alloc_device_config; -const device_type Z80SIO0 = z80dart_device_config::static_alloc_device_config; // FIXME -const device_type Z80SIO1 = z80dart_device_config::static_alloc_device_config; // FIXME -const device_type Z80SIO2 = z80dart_device_config::static_alloc_device_config; // FIXME -const device_type Z80SIO3 = z80dart_device_config::static_alloc_device_config; // FIXME -const device_type Z80SIO4 = z80dart_device_config::static_alloc_device_config; // FIXME - - - -//************************************************************************** // CONSTANTS //************************************************************************** @@ -190,38 +177,27 @@ const int WR5_DTR = 0x80; //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// z80dart_device_config - constructor -//------------------------------------------------- - -z80dart_device_config::z80dart_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Zilog Z80 DART", tag, owner, clock), - device_config_z80daisy_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *z80dart_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(z80dart_device_config(mconfig, tag, owner, clock)); -} - +// device type definition +const device_type Z80DART = &device_creator<z80dart_device>; +const device_type Z80SIO0 = &device_creator<z80dart_device>; +const device_type Z80SIO1 = &device_creator<z80dart_device>; +const device_type Z80SIO2 = &device_creator<z80dart_device>; +const device_type Z80SIO3 = &device_creator<z80dart_device>; +const device_type Z80SIO4 = &device_creator<z80dart_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// z80dart_device - constructor //------------------------------------------------- -device_t *z80dart_device_config::alloc_device(running_machine &machine) const +z80dart_device::z80dart_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z80DART, "Zilog Z80 DART", tag, owner, clock), + device_z80daisy_interface(mconfig, *this) { - return auto_alloc(machine, z80dart_device(machine, *this)); + for (int i = 0; i < 8; i++) + m_int_state[i] = 0; } @@ -231,7 +207,7 @@ device_t *z80dart_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void z80dart_device_config::device_config_complete() +void z80dart_device::device_config_complete() { // inherit a copy of the static data const z80dart_interface *intf = reinterpret_cast<const z80dart_interface *>(static_config()); @@ -242,42 +218,23 @@ void z80dart_device_config::device_config_complete() else { m_rx_clock_a = m_tx_clock_a = m_rx_clock_b = m_tx_clock_b = 0; - memset(&m_in_rxda_func, 0, sizeof(m_in_rxda_func)); - memset(&m_out_txda_func, 0, sizeof(m_out_txda_func)); - memset(&m_out_dtra_func, 0, sizeof(m_out_dtra_func)); - memset(&m_out_rtsa_func, 0, sizeof(m_out_rtsa_func)); - memset(&m_out_wrdya_func, 0, sizeof(m_out_wrdya_func)); - memset(&m_out_synca_func, 0, sizeof(m_out_synca_func)); - memset(&m_in_rxdb_func, 0, sizeof(m_in_rxdb_func)); - memset(&m_out_txdb_func, 0, sizeof(m_out_txdb_func)); - memset(&m_out_dtrb_func, 0, sizeof(m_out_dtrb_func)); - memset(&m_out_rtsb_func, 0, sizeof(m_out_rtsb_func)); - memset(&m_out_wrdyb_func, 0, sizeof(m_out_wrdyb_func)); - memset(&m_out_syncb_func, 0, sizeof(m_out_syncb_func)); - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); + memset(&m_in_rxda_cb, 0, sizeof(m_in_rxda_cb)); + memset(&m_out_txda_cb, 0, sizeof(m_out_txda_cb)); + memset(&m_out_dtra_cb, 0, sizeof(m_out_dtra_cb)); + memset(&m_out_rtsa_cb, 0, sizeof(m_out_rtsa_cb)); + memset(&m_out_wrdya_cb, 0, sizeof(m_out_wrdya_cb)); + memset(&m_out_synca_cb, 0, sizeof(m_out_synca_cb)); + memset(&m_in_rxdb_cb, 0, sizeof(m_in_rxdb_cb)); + memset(&m_out_txdb_cb, 0, sizeof(m_out_txdb_cb)); + memset(&m_out_dtrb_cb, 0, sizeof(m_out_dtrb_cb)); + memset(&m_out_rtsb_cb, 0, sizeof(m_out_rtsb_cb)); + memset(&m_out_wrdyb_cb, 0, sizeof(m_out_wrdyb_cb)); + memset(&m_out_syncb_cb, 0, sizeof(m_out_syncb_cb)); + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// z80dart_device - constructor -//------------------------------------------------- - -z80dart_device::z80dart_device(running_machine &_machine, const z80dart_device_config &config) - : device_t(_machine, config), - device_z80daisy_interface(_machine, config, *this), - m_config(config) -{ - for (int i = 0; i < 8; i++) - m_int_state[i] = 0; -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -285,37 +242,37 @@ z80dart_device::z80dart_device(running_machine &_machine, const z80dart_device_c void z80dart_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); - m_channel[CHANNEL_A].start(this, CHANNEL_A, m_config.m_in_rxda_func, m_config.m_out_txda_func, m_config.m_out_dtra_func, m_config.m_out_rtsa_func, m_config.m_out_wrdya_func, m_config.m_out_synca_func); - m_channel[CHANNEL_B].start(this, CHANNEL_B, m_config.m_in_rxdb_func, m_config.m_out_txdb_func, m_config.m_out_dtrb_func, m_config.m_out_rtsb_func, m_config.m_out_wrdyb_func, m_config.m_out_syncb_func); + m_channel[CHANNEL_A].start(this, CHANNEL_A, m_in_rxda_cb, m_out_txda_cb, m_out_dtra_cb, m_out_rtsa_cb, m_out_wrdya_cb, m_out_synca_cb); + m_channel[CHANNEL_B].start(this, CHANNEL_B, m_in_rxdb_cb, m_out_txdb_cb, m_out_dtrb_cb, m_out_rtsb_cb, m_out_wrdyb_cb, m_out_syncb_cb); - if (m_config.m_rx_clock_a != 0) + if (m_rx_clock_a != 0) { // allocate channel A receive timer m_rxca_timer = machine().scheduler().timer_alloc(FUNC(dart_channel::static_rxc_tick), (void *)&m_channel[CHANNEL_A]); - m_rxca_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_rx_clock_a)); + m_rxca_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rx_clock_a)); } - if (m_config.m_tx_clock_a != 0) + if (m_tx_clock_a != 0) { // allocate channel A transmit timer m_txca_timer = machine().scheduler().timer_alloc(FUNC(dart_channel::static_txc_tick), (void *)&m_channel[CHANNEL_A]); - m_txca_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_tx_clock_a)); + m_txca_timer->adjust(attotime::zero, 0, attotime::from_hz(m_tx_clock_a)); } - if (m_config.m_rx_clock_b != 0) + if (m_rx_clock_b != 0) { // allocate channel B receive timer m_rxcb_timer = machine().scheduler().timer_alloc(FUNC(dart_channel::static_rxc_tick), (void *)&m_channel[CHANNEL_B]); - m_rxcb_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_rx_clock_b)); + m_rxcb_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rx_clock_b)); } - if (m_config.m_tx_clock_b != 0) + if (m_tx_clock_b != 0) { // allocate channel B transmit timer m_txcb_timer = machine().scheduler().timer_alloc(FUNC(dart_channel::static_txc_tick), (void *)&m_channel[CHANNEL_B]); - m_txcb_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_tx_clock_b)); + m_txcb_timer->adjust(attotime::zero, 0, attotime::from_hz(m_tx_clock_b)); } save_item(NAME(m_int_state)); diff --git a/src/emu/machine/z80dart.h b/src/emu/machine/z80dart.h index 00b3557e2e6..805c9427f0d 100644 --- a/src/emu/machine/z80dart.h +++ b/src/emu/machine/z80dart.h @@ -153,44 +153,21 @@ struct z80dart_interface int m_rx_clock_b; // channel B receive clock int m_tx_clock_b; // channel B transmit clock - devcb_read_line m_in_rxda_func; - devcb_write_line m_out_txda_func; - devcb_write_line m_out_dtra_func; - devcb_write_line m_out_rtsa_func; - devcb_write_line m_out_wrdya_func; - devcb_write_line m_out_synca_func; - - devcb_read_line m_in_rxdb_func; - devcb_write_line m_out_txdb_func; - devcb_write_line m_out_dtrb_func; - devcb_write_line m_out_rtsb_func; - devcb_write_line m_out_wrdyb_func; - devcb_write_line m_out_syncb_func; - - devcb_write_line m_out_int_func; -}; - - - -// ======================> z80dart_device_config - -class z80dart_device_config : public device_config, - public device_config_z80daisy_interface, - public z80dart_interface -{ - friend class z80dart_device; - - // construction/destruction - z80dart_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read_line m_in_rxda_cb; + devcb_write_line m_out_txda_cb; + devcb_write_line m_out_dtra_cb; + devcb_write_line m_out_rtsa_cb; + devcb_write_line m_out_wrdya_cb; + devcb_write_line m_out_synca_cb; + + devcb_read_line m_in_rxdb_cb; + devcb_write_line m_out_txdb_cb; + devcb_write_line m_out_dtrb_cb; + devcb_write_line m_out_rtsb_cb; + devcb_write_line m_out_wrdyb_cb; + devcb_write_line m_out_syncb_cb; + + devcb_write_line m_out_int_cb; }; @@ -198,15 +175,15 @@ protected: // ======================> z80dart_device class z80dart_device : public device_t, - public device_z80daisy_interface + public device_z80daisy_interface, + public z80dart_interface { - friend class z80dart_device_config; friend class dart_channel; +public: // construction/destruction - z80dart_device(running_machine &_machine, const z80dart_device_config &_config); + z80dart_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: // control register access UINT8 control_read(int which) { return m_channel[which].control_read(); } void control_write(int which, UINT8 data) { return m_channel[which].control_write(data); } @@ -228,6 +205,7 @@ public: private: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -333,7 +311,6 @@ private: }; // internal state - const z80dart_device_config & m_config; devcb_resolved_write_line m_out_int_func; dart_channel m_channel[2]; // channels int m_int_state[8]; // interrupt state diff --git a/src/emu/machine/z80dma.c b/src/emu/machine/z80dma.c index bfdcea40ead..2a2c8f3a291 100644 --- a/src/emu/machine/z80dma.c +++ b/src/emu/machine/z80dma.c @@ -28,14 +28,6 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z80DMA = z80dma_device_config::static_alloc_device_config; - - - -//************************************************************************** // CONSTANTS //************************************************************************** @@ -141,38 +133,20 @@ const int TM_SEARCH_TRANSFER = 0x03; //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// z80dma_device_config - constructor -//------------------------------------------------- - -z80dma_device_config::z80dma_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Z8410", tag, owner, clock), - device_config_z80daisy_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *z80dma_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(z80dma_device_config(mconfig, tag, owner, clock)); -} - +// device type definition +const device_type Z80DMA = &device_creator<z80dma_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// z80dma_device - constructor //------------------------------------------------- -device_t *z80dma_device_config::alloc_device(running_machine &machine) const +z80dma_device::z80dma_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z80DMA, "Z8410", tag, owner, clock), + device_z80daisy_interface(mconfig, *this) { - return auto_alloc(machine, z80dma_device(machine, *this)); } @@ -182,7 +156,7 @@ device_t *z80dma_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void z80dma_device_config::device_config_complete() +void z80dma_device::device_config_complete() { // inherit a copy of the static data const z80dma_interface *intf = reinterpret_cast<const z80dma_interface *>(static_config()); @@ -192,34 +166,17 @@ void z80dma_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_out_busreq_func, 0, sizeof(m_out_busreq_func)); - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); - memset(&m_out_bao_func, 0, sizeof(m_out_bao_func)); - memset(&m_in_mreq_func, 0, sizeof(m_in_mreq_func)); - memset(&m_out_mreq_func, 0, sizeof(m_out_mreq_func)); - memset(&m_in_iorq_func, 0, sizeof(m_in_iorq_func)); - memset(&m_out_iorq_func, 0, sizeof(m_out_iorq_func)); + memset(&m_out_busreq_cb, 0, sizeof(m_out_busreq_cb)); + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + memset(&m_out_bao_cb, 0, sizeof(m_out_bao_cb)); + memset(&m_in_mreq_cb, 0, sizeof(m_in_mreq_cb)); + memset(&m_out_mreq_cb, 0, sizeof(m_out_mreq_cb)); + memset(&m_in_iorq_cb, 0, sizeof(m_in_iorq_cb)); + memset(&m_out_iorq_cb, 0, sizeof(m_out_iorq_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// z80dma_device - constructor -//------------------------------------------------- - -z80dma_device::z80dma_device(running_machine &_machine, const z80dma_device_config &_config) - : device_t(_machine, _config), - device_z80daisy_interface(_machine, _config, *this), - m_config(_config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -227,13 +184,13 @@ z80dma_device::z80dma_device(running_machine &_machine, const z80dma_device_conf void z80dma_device::device_start() { // resolve callbacks - devcb_resolve_write_line(&m_out_busreq_func, &m_config.m_out_busreq_func, this); - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); - devcb_resolve_write_line(&m_out_bao_func, &m_config.m_out_bao_func, this); - devcb_resolve_read8(&m_in_mreq_func, &m_config.m_in_mreq_func, this); - devcb_resolve_write8(&m_out_mreq_func, &m_config.m_out_mreq_func, this); - devcb_resolve_read8(&m_in_iorq_func, &m_config.m_in_iorq_func, this); - devcb_resolve_write8(&m_out_iorq_func, &m_config.m_out_iorq_func, this); + devcb_resolve_write_line(&m_out_busreq_func, &m_out_busreq_cb, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); + devcb_resolve_write_line(&m_out_bao_func, &m_out_bao_cb, this); + devcb_resolve_read8(&m_in_mreq_func, &m_in_mreq_cb, this); + devcb_resolve_write8(&m_out_mreq_func, &m_out_mreq_cb, this); + devcb_resolve_read8(&m_in_iorq_func, &m_in_iorq_cb, this); + devcb_resolve_write8(&m_out_iorq_func, &m_out_iorq_cb, this); // allocate timer m_timer = machine().scheduler().timer_alloc(FUNC(static_timerproc), (void *)this); diff --git a/src/emu/machine/z80dma.h b/src/emu/machine/z80dma.h index 47643814d42..252c25a137b 100644 --- a/src/emu/machine/z80dma.h +++ b/src/emu/machine/z80dma.h @@ -58,40 +58,17 @@ struct z80dma_interface { - devcb_write_line m_out_busreq_func; - devcb_write_line m_out_int_func; - devcb_write_line m_out_bao_func; + devcb_write_line m_out_busreq_cb; + devcb_write_line m_out_int_cb; + devcb_write_line m_out_bao_cb; // memory accessors - devcb_read8 m_in_mreq_func; - devcb_write8 m_out_mreq_func; + devcb_read8 m_in_mreq_cb; + devcb_write8 m_out_mreq_cb; // I/O accessors - devcb_read8 m_in_iorq_func; - devcb_write8 m_out_iorq_func; -}; - - - -// ======================> z80dma_device_config - -class z80dma_device_config : public device_config, - public device_config_z80daisy_interface, - public z80dma_interface -{ - friend class z80dma_device; - - // construction/destruction - z80dma_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_iorq_cb; + devcb_write8 m_out_iorq_cb; }; @@ -99,14 +76,13 @@ protected: // ======================> z80dma_device class z80dma_device : public device_t, - public device_z80daisy_interface + public device_z80daisy_interface, + public z80dma_interface { - friend class z80dma_device_config; - +public: // construction/destruction - z80dma_device(running_machine &_machine, const z80dma_device_config &_config); + z80dma_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: UINT8 read(); void write(UINT8 data); @@ -116,6 +92,7 @@ public: private: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -140,8 +117,6 @@ private: void rdy_write_callback(int state); // internal state - const z80dma_device_config &m_config; - devcb_resolved_write_line m_out_busreq_func; devcb_resolved_write_line m_out_int_func; devcb_resolved_write_line m_out_bao_func; diff --git a/src/emu/machine/z80pio.c b/src/emu/machine/z80pio.c index 1e6c123d308..35046726c07 100644 --- a/src/emu/machine/z80pio.c +++ b/src/emu/machine/z80pio.c @@ -13,14 +13,6 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z80PIO = z80pio_device_config::static_alloc_device_config; - - - -//************************************************************************** // CONSTANTS //************************************************************************** @@ -53,38 +45,20 @@ const int ICW_MASK_FOLLOWS = 0x10; //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** -//------------------------------------------------- -// z80pio_device_config - constructor -//------------------------------------------------- - -z80pio_device_config::z80pio_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Z8420", tag, owner, clock), - device_config_z80daisy_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *z80pio_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(z80pio_device_config(mconfig, tag, owner, clock)); -} - +// device type definition +const device_type Z80PIO = &device_creator<z80pio_device>; //------------------------------------------------- -// alloc_device - allocate a new device object +// z80pio_device - constructor //------------------------------------------------- -device_t *z80pio_device_config::alloc_device(running_machine &machine) const +z80pio_device::z80pio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z80PIO, "Z8420", tag, owner, clock), + device_z80daisy_interface(mconfig, *this) { - return auto_alloc(machine, z80pio_device(machine, *this)); } @@ -94,7 +68,7 @@ device_t *z80pio_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void z80pio_device_config::device_config_complete() +void z80pio_device::device_config_complete() { // inherit a copy of the static data const z80pio_interface *intf = reinterpret_cast<const z80pio_interface *>(static_config()); @@ -104,45 +78,28 @@ void z80pio_device_config::device_config_complete() // or initialize to defaults if none provided else { - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); - memset(&m_in_pa_func, 0, sizeof(m_in_pa_func)); - memset(&m_out_pa_func, 0, sizeof(m_out_pa_func)); - memset(&m_out_ardy_func, 0, sizeof(m_out_ardy_func)); - memset(&m_in_pb_func, 0, sizeof(m_in_pb_func)); - memset(&m_out_pb_func, 0, sizeof(m_out_pb_func)); - memset(&m_out_brdy_func, 0, sizeof(m_out_brdy_func)); + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb)); + memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb)); + memset(&m_out_ardy_cb, 0, sizeof(m_out_ardy_cb)); + memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb)); + memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb)); + memset(&m_out_brdy_cb, 0, sizeof(m_out_brdy_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// z80pio_device - constructor -//------------------------------------------------- - -z80pio_device::z80pio_device(running_machine &_machine, const z80pio_device_config &config) - : device_t(_machine, config), - device_z80daisy_interface(_machine, config, *this), - m_config(config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void z80pio_device::device_start() { - m_port[PORT_A].start(this, PORT_A, m_config.m_in_pa_func, m_config.m_out_pa_func, m_config.m_out_ardy_func); - m_port[PORT_B].start(this, PORT_B, m_config.m_in_pb_func, m_config.m_out_pb_func, m_config.m_out_brdy_func); + m_port[PORT_A].start(this, PORT_A, m_in_pa_cb, m_out_pa_cb, m_out_ardy_cb); + m_port[PORT_B].start(this, PORT_B, m_in_pb_cb, m_out_pb_cb, m_out_brdy_cb); // resolve callbacks - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); } diff --git a/src/emu/machine/z80pio.h b/src/emu/machine/z80pio.h index 26762e153b1..4a2df0bb03e 100644 --- a/src/emu/machine/z80pio.h +++ b/src/emu/machine/z80pio.h @@ -58,38 +58,15 @@ struct z80pio_interface { - devcb_write_line m_out_int_func; + devcb_write_line m_out_int_cb; - devcb_read8 m_in_pa_func; - devcb_write8 m_out_pa_func; - devcb_write_line m_out_ardy_func; + devcb_read8 m_in_pa_cb; + devcb_write8 m_out_pa_cb; + devcb_write_line m_out_ardy_cb; - devcb_read8 m_in_pb_func; - devcb_write8 m_out_pb_func; - devcb_write_line m_out_brdy_func; -}; - - - -// ======================> z80pio_device_config - -class z80pio_device_config : public device_config, - public device_config_z80daisy_interface, - public z80pio_interface -{ - friend class z80pio_device; - - // construction/destruction - z80pio_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_pb_cb; + devcb_write8 m_out_pb_cb; + devcb_write_line m_out_brdy_cb; }; @@ -97,13 +74,9 @@ protected: // ======================> z80pio_device class z80pio_device : public device_t, - public device_z80daisy_interface + public device_z80daisy_interface, + public z80pio_interface { - friend class z80pio_device_config; - - // construction/destruction - z80pio_device(running_machine &_machine, const z80pio_device_config &config); - public: enum { @@ -112,6 +85,9 @@ public: PORT_COUNT }; + // construction/destruction + z80pio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + // I/O line access int rdy(int which) { return m_port[which].rdy(); } void strobe(int which, bool state) { m_port[which].strobe(state); } @@ -130,6 +106,7 @@ public: private: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -197,7 +174,6 @@ private: }; // internal state - const z80pio_device_config &m_config; pio_port m_port[2]; devcb_resolved_write_line m_out_int_func; }; diff --git a/src/emu/machine/z80sio.c b/src/emu/machine/z80sio.c index ecc93d16913..8ddcd54806a 100644 --- a/src/emu/machine/z80sio.c +++ b/src/emu/machine/z80sio.c @@ -13,6 +13,9 @@ #include "cpu/z80/z80daisy.h" +// device type definition +const device_type Z80SIO = &device_creator<z80sio_device>; + //************************************************************************** // DEBUGGING @@ -25,14 +28,6 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z80SIO = z80sio_device_config::static_alloc_device_config; - - - -//************************************************************************** // CONSTANTS //************************************************************************** @@ -248,8 +243,8 @@ const UINT8 z80sio_device::k_int_priority[] = inline void z80sio_device::update_interrupt_state() { // if we have a callback, update it with the current state - if (m_config.m_irq_cb != NULL) - (*m_config.m_irq_cb)(this, (z80daisy_irq_state() & Z80_DAISY_INT) ? ASSERT_LINE : CLEAR_LINE); + if (m_irq_cb != NULL) + (*m_irq_cb)(this, (z80daisy_irq_state() & Z80_DAISY_INT) ? ASSERT_LINE : CLEAR_LINE); } @@ -295,38 +290,19 @@ inline attotime z80sio_device::sio_channel::compute_time_per_character() //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** //------------------------------------------------- -// z80sio_device_config - constructor -//------------------------------------------------- - -z80sio_device_config::z80sio_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Zilog Z80 SIO", tag, owner, clock), - device_config_z80daisy_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *z80sio_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(z80sio_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object +// z80sio_device - constructor //------------------------------------------------- -device_t *z80sio_device_config::alloc_device(running_machine &machine) const +z80sio_device::z80sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z80SIO, "Zilog Z80 SIO", tag, owner, clock), + device_z80daisy_interface(mconfig, *this) { - return auto_alloc(machine, z80sio_device(machine, *this)); + for (int i = 0; i < 8; i++) + m_int_state[i] = 0; } @@ -336,7 +312,7 @@ device_t *z80sio_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void z80sio_device_config::device_config_complete() +void z80sio_device::device_config_complete() { // inherit a copy of the static data const z80sio_interface *intf = reinterpret_cast<const z80sio_interface *>(static_config()); @@ -356,25 +332,6 @@ void z80sio_device_config::device_config_complete() } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// z80sio_device - constructor -//------------------------------------------------- - -z80sio_device::z80sio_device(running_machine &_machine, const z80sio_device_config &config) - : device_t(_machine, config), - device_z80daisy_interface(_machine, config, *this), - m_config(config) -{ - for (int i = 0; i < 8; i++) - m_int_state[i] = 0; -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -609,12 +566,12 @@ void z80sio_device::sio_channel::control_write(UINT8 data) // SIO write register 5 case 5: - if (((old ^ data) & SIO_WR5_DTR) && m_device->m_config.m_dtr_changed_cb) - (*m_device->m_config.m_dtr_changed_cb)(m_device, m_index, (data & SIO_WR5_DTR) != 0); - if (((old ^ data) & SIO_WR5_SEND_BREAK) && m_device->m_config.m_break_changed_cb) - (*m_device->m_config.m_break_changed_cb)(m_device, m_index, (data & SIO_WR5_SEND_BREAK) != 0); - if (((old ^ data) & SIO_WR5_RTS) && m_device->m_config.m_rts_changed_cb) - (*m_device->m_config.m_rts_changed_cb)(m_device, m_index, (data & SIO_WR5_RTS) != 0); + if (((old ^ data) & SIO_WR5_DTR) && m_device->m_dtr_changed_cb) + (*m_device->m_dtr_changed_cb)(m_device, m_index, (data & SIO_WR5_DTR) != 0); + if (((old ^ data) & SIO_WR5_SEND_BREAK) && m_device->m_break_changed_cb) + (*m_device->m_break_changed_cb)(m_device, m_index, (data & SIO_WR5_SEND_BREAK) != 0); + if (((old ^ data) & SIO_WR5_RTS) && m_device->m_rts_changed_cb) + (*m_device->m_rts_changed_cb)(m_device, m_index, (data & SIO_WR5_RTS) != 0); break; } } @@ -784,8 +741,8 @@ void z80sio_device::sio_channel::serial_callback() VPRINTF(("serial_callback(%c): Transmitting %02x\n", 'A' + m_index, m_outbuf)); // actually transmit the character - if (m_device->m_config.m_transmit_cb != NULL) - (*m_device->m_config.m_transmit_cb)(m_device, m_index, m_outbuf); + if (m_device->m_transmit_cb != NULL) + (*m_device->m_transmit_cb)(m_device, m_index, m_outbuf); // update the status register m_status[0] |= SIO_RR0_TX_BUFFER_EMPTY; @@ -799,8 +756,8 @@ void z80sio_device::sio_channel::serial_callback() } // ask the polling callback if there is data to receive - if (m_device->m_config.m_receive_poll_cb != NULL) - data = (*m_device->m_config.m_receive_poll_cb)(m_device, m_index); + if (m_device->m_receive_poll_cb != NULL) + data = (*m_device->m_receive_poll_cb)(m_device, m_index); // if we have buffered data, pull it if (m_receive_inptr != m_receive_outptr) diff --git a/src/emu/machine/z80sio.h b/src/emu/machine/z80sio.h index b50cf583c57..c1141251036 100644 --- a/src/emu/machine/z80sio.h +++ b/src/emu/machine/z80sio.h @@ -42,40 +42,16 @@ struct z80sio_interface -// ======================> z80sio_device_config - -class z80sio_device_config : public device_config, - public device_config_z80daisy_interface, - public z80sio_interface -{ - friend class z80sio_device; - - // construction/destruction - z80sio_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); -}; - - - // ======================> z80sio_device class z80sio_device : public device_t, - public device_z80daisy_interface + public device_z80daisy_interface, + public z80sio_interface { - friend class z80sio_device_config; - +public: // construction/destruction - z80sio_device(running_machine &_machine, const z80sio_device_config &config); + z80sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: // control register I/O UINT8 control_read(int ch) { return m_channel[ch].control_read(); } void control_write(int ch, UINT8 data) { m_channel[ch].control_write(data); } @@ -93,6 +69,7 @@ public: private: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -152,7 +129,6 @@ private: }; // internal state - const z80sio_device_config &m_config; sio_channel m_channel[2]; // 2 channels UINT8 m_int_state[8]; // interrupt states diff --git a/src/emu/machine/z80sti.c b/src/emu/machine/z80sti.c index 2dfc89e7c9a..79ddaf09329 100644 --- a/src/emu/machine/z80sti.c +++ b/src/emu/machine/z80sti.c @@ -24,6 +24,9 @@ +// device type definition +const device_type Z80STI = &device_creator<z80sti_device>; + //************************************************************************** // DEBUGGING //************************************************************************** @@ -35,14 +38,6 @@ //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z80STI = z80sti_device_config::static_alloc_device_config; - - - -//************************************************************************** // CONSTANTS //************************************************************************** @@ -144,38 +139,17 @@ static const int PRESCALER[] = { 0, 4, 10, 16, 50, 64, 100, 200 }; //************************************************************************** -// DEVICE CONFIGURATION +// LIVE DEVICE //************************************************************************** //------------------------------------------------- -// z80sti_device_config - constructor -//------------------------------------------------- - -z80sti_device_config::z80sti_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) - : device_config(mconfig, static_alloc_device_config, "Mostek MK3801", tag, owner, clock), - device_config_z80daisy_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// static_alloc_device_config - allocate a new -// configuration object -//------------------------------------------------- - -device_config *z80sti_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) -{ - return global_alloc(z80sti_device_config(mconfig, tag, owner, clock)); -} - - -//------------------------------------------------- -// alloc_device - allocate a new device object +// z80sti_device - constructor //------------------------------------------------- -device_t *z80sti_device_config::alloc_device(running_machine &machine) const +z80sti_device::z80sti_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z80STI, "Mostek MK3801", tag, owner, clock), + device_z80daisy_interface(mconfig, *this) { - return auto_alloc(machine, z80sti_device(machine, *this)); } @@ -185,7 +159,7 @@ device_t *z80sti_device_config::alloc_device(running_machine &machine) const // complete //------------------------------------------------- -void z80sti_device_config::device_config_complete() +void z80sti_device::device_config_complete() { // inherit a copy of the static data const z80sti_interface *intf = reinterpret_cast<const z80sti_interface *>(static_config()); @@ -196,36 +170,19 @@ void z80sti_device_config::device_config_complete() else { m_rx_clock = m_tx_clock = 0; - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); - memset(&m_in_gpio_func, 0, sizeof(m_in_gpio_func)); - memset(&m_out_gpio_func, 0, sizeof(m_out_gpio_func)); - memset(&m_in_si_func, 0, sizeof(m_in_si_func)); - memset(&m_out_so_func, 0, sizeof(m_out_so_func)); - memset(&m_out_tao_func, 0, sizeof(m_out_tao_func)); - memset(&m_out_tbo_func, 0, sizeof(m_out_tbo_func)); - memset(&m_out_tco_func, 0, sizeof(m_out_tco_func)); - memset(&m_out_tdo_func, 0, sizeof(m_out_tdo_func)); + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + memset(&m_in_gpio_cb, 0, sizeof(m_in_gpio_cb)); + memset(&m_out_gpio_cb, 0, sizeof(m_out_gpio_cb)); + memset(&m_in_si_cb, 0, sizeof(m_in_si_cb)); + memset(&m_out_so_cb, 0, sizeof(m_out_so_cb)); + memset(&m_out_tao_cb, 0, sizeof(m_out_tao_cb)); + memset(&m_out_tbo_cb, 0, sizeof(m_out_tbo_cb)); + memset(&m_out_tco_cb, 0, sizeof(m_out_tco_cb)); + memset(&m_out_tdo_cb, 0, sizeof(m_out_tdo_cb)); } } - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// z80sti_device - constructor -//------------------------------------------------- - -z80sti_device::z80sti_device(running_machine &_machine, const z80sti_device_config &config) - : device_t(_machine, config), - device_z80daisy_interface(_machine, config, *this), - m_config(config) -{ -} - - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -233,15 +190,15 @@ z80sti_device::z80sti_device(running_machine &_machine, const z80sti_device_conf void z80sti_device::device_start() { // resolve callbacks - devcb_resolve_read8(&m_in_gpio_func, &m_config.m_in_gpio_func, this); - devcb_resolve_write8(&m_out_gpio_func, &m_config.m_out_gpio_func, this); - devcb_resolve_read_line(&m_in_si_func, &m_config.m_in_si_func, this); - devcb_resolve_write_line(&m_out_so_func, &m_config.m_out_so_func, this); - devcb_resolve_write_line(&m_out_timer_func[TIMER_A], &m_config.m_out_tao_func, this); - devcb_resolve_write_line(&m_out_timer_func[TIMER_B], &m_config.m_out_tbo_func, this); - devcb_resolve_write_line(&m_out_timer_func[TIMER_C], &m_config.m_out_tco_func, this); - devcb_resolve_write_line(&m_out_timer_func[TIMER_D], &m_config.m_out_tdo_func, this); - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); + devcb_resolve_read8(&m_in_gpio_func, &m_in_gpio_cb, this); + devcb_resolve_write8(&m_out_gpio_func, &m_out_gpio_cb, this); + devcb_resolve_read_line(&m_in_si_func, &m_in_si_cb, this); + devcb_resolve_write_line(&m_out_so_func, &m_out_so_cb, this); + devcb_resolve_write_line(&m_out_timer_func[TIMER_A], &m_out_tao_cb, this); + devcb_resolve_write_line(&m_out_timer_func[TIMER_B], &m_out_tbo_cb, this); + devcb_resolve_write_line(&m_out_timer_func[TIMER_C], &m_out_tco_cb, this); + devcb_resolve_write_line(&m_out_timer_func[TIMER_D], &m_out_tdo_cb, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); // create the counter timers m_timer[TIMER_A] = machine().scheduler().timer_alloc(FUNC(static_timer_count), (void *)this); @@ -250,17 +207,17 @@ void z80sti_device::device_start() m_timer[TIMER_D] = machine().scheduler().timer_alloc(FUNC(static_timer_count), (void *)this); // create serial receive clock timer - if (m_config.m_rx_clock > 0) + if (m_rx_clock > 0) { m_rx_timer = machine().scheduler().timer_alloc(FUNC(static_rx_tick), (void *)this); - m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_rx_clock)); + m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rx_clock)); } // create serial transmit clock timer - if (m_config.m_tx_clock > 0) + if (m_tx_clock > 0) { m_tx_timer = machine().scheduler().timer_alloc(FUNC(static_tx_tick), (void *)this); - m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_config.m_tx_clock)); + m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_tx_clock)); } // register for state saving diff --git a/src/emu/machine/z80sti.h b/src/emu/machine/z80sti.h index 0a413a31cfc..e316949c038 100644 --- a/src/emu/machine/z80sti.h +++ b/src/emu/machine/z80sti.h @@ -61,54 +61,31 @@ struct z80sti_interface int m_tx_clock; // serial transmit clock // this gets called on each change of the _INT pin (pin 17) - devcb_write_line m_out_int_func; + devcb_write_line m_out_int_cb; // this is called on each read of the GPIO pins - devcb_read8 m_in_gpio_func; + devcb_read8 m_in_gpio_cb; // this is called on each write of the GPIO pins - devcb_write8 m_out_gpio_func; + devcb_write8 m_out_gpio_cb; // this gets called for each read of the SI pin (pin 38) - devcb_read_line m_in_si_func; + devcb_read_line m_in_si_cb; // this gets called for each change of the SO pin (pin 37) - devcb_write_line m_out_so_func; + devcb_write_line m_out_so_cb; // this gets called for each change of the TAO pin (pin 1) - devcb_write_line m_out_tao_func; + devcb_write_line m_out_tao_cb; // this gets called for each change of the TBO pin (pin 2) - devcb_write_line m_out_tbo_func; + devcb_write_line m_out_tbo_cb; // this gets called for each change of the TCO pin (pin 3) - devcb_write_line m_out_tco_func; + devcb_write_line m_out_tco_cb; // this gets called for each change of the TDO pin (pin 4) - devcb_write_line m_out_tdo_func; -}; - - - -// ======================> z80sti_device_config - -class z80sti_device_config : public device_config, - public device_config_z80daisy_interface, - public z80sti_interface -{ - friend class z80sti_device; - - // construction/destruction - z80sti_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_write_line m_out_tdo_cb; }; @@ -116,14 +93,13 @@ protected: // ======================> z80sti_device class z80sti_device : public device_t, - public device_z80daisy_interface + public device_z80daisy_interface, + public z80sti_interface { - friend class z80sti_device_config; - +public: // construction/destruction - z80sti_device(running_machine &_machine, const z80sti_device_config &config); + z80sti_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: // I/O accessors UINT8 read(offs_t offset); void write(offs_t offset, UINT8 data); @@ -135,6 +111,7 @@ public: private: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -154,9 +131,6 @@ private: static TIMER_CALLBACK( static_timer_count ) { reinterpret_cast<z80sti_device *>(ptr)->timer_count(param); } - // internal state - const z80sti_device_config &m_config; - // device callbacks devcb_resolved_read8 m_in_gpio_func; devcb_resolved_write8 m_out_gpio_func; diff --git a/src/emu/machine/z8536.c b/src/emu/machine/z8536.c index 322d764ada2..aa779c6f9ec 100644 --- a/src/emu/machine/z8536.c +++ b/src/emu/machine/z8536.c @@ -12,6 +12,9 @@ #include "machine/devhelpr.h" +// device type definition +const device_type Z8536 = &device_creator<z8536_device>; + //************************************************************************** // MACROS / CONSTANTS @@ -234,49 +237,6 @@ enum //************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type Z8536 = z8536_device_config::static_alloc_device_config; - - - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -GENERIC_DEVICE_CONFIG_SETUP(z8536, "Zilog Z8536") - - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void z8536_device_config::device_config_complete() -{ - // inherit a copy of the static data - const z8536_interface *intf = reinterpret_cast<const z8536_interface *>(static_config()); - if (intf != NULL) - *static_cast<z8536_interface *>(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_int_func, 0, sizeof(m_out_int_func)); - memset(&m_in_pa_func, 0, sizeof(m_in_pa_func)); - memset(&m_out_pa_func, 0, sizeof(m_out_pa_func)); - memset(&m_in_pb_func, 0, sizeof(m_in_pb_func)); - memset(&m_out_pb_func, 0, sizeof(m_out_pb_func)); - memset(&m_in_pc_func, 0, sizeof(m_in_pc_func)); - memset(&m_out_pc_func, 0, sizeof(m_out_pc_func)); - } -} - - - -//************************************************************************** // INLINE HELPERS //************************************************************************** @@ -415,14 +375,40 @@ inline void z8536_device::gate(device_timer_id id) // z8536_device - constructor //------------------------------------------------- -z8536_device::z8536_device(running_machine &_machine, const z8536_device_config &config) - : device_t(_machine, config), - m_config(config) +z8536_device::z8536_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, Z8536, "Zilog Z8536", tag, owner, clock) { } //------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void z8536_device::device_config_complete() +{ + // inherit a copy of the static data + const z8536_interface *intf = reinterpret_cast<const z8536_interface *>(static_config()); + if (intf != NULL) + *static_cast<z8536_interface *>(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); + memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb)); + memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb)); + memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb)); + memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb)); + memset(&m_in_pc_cb, 0, sizeof(m_in_pc_cb)); + memset(&m_out_pc_cb, 0, sizeof(m_out_pc_cb)); + } +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -434,13 +420,13 @@ void z8536_device::device_start() m_timer[TIMER_3] = timer_alloc(TIMER_3); // resolve callbacks - devcb_resolve_write_line(&m_out_int_func, &m_config.m_out_int_func, this); - devcb_resolve_read8(&m_in_pa_func, &m_config.m_in_pa_func, this); - devcb_resolve_write8(&m_out_pa_func, &m_config.m_out_pa_func, this); - devcb_resolve_read8(&m_in_pb_func, &m_config.m_in_pb_func, this); - devcb_resolve_write8(&m_out_pb_func, &m_config.m_out_pb_func, this); - devcb_resolve_read8(&m_in_pc_func, &m_config.m_in_pc_func, this); - devcb_resolve_write8(&m_out_pc_func, &m_config.m_out_pc_func, this); + devcb_resolve_write_line(&m_out_int_func, &m_out_int_cb, this); + devcb_resolve_read8(&m_in_pa_func, &m_in_pa_cb, this); + devcb_resolve_write8(&m_out_pa_func, &m_out_pa_cb, this); + devcb_resolve_read8(&m_in_pb_func, &m_in_pb_cb, this); + devcb_resolve_write8(&m_out_pb_func, &m_out_pb_cb, this); + devcb_resolve_read8(&m_in_pc_func, &m_in_pc_cb, this); + devcb_resolve_write8(&m_out_pc_func, &m_out_pc_cb, this); } diff --git a/src/emu/machine/z8536.h b/src/emu/machine/z8536.h index 9a71eafa92f..10862269ade 100644 --- a/src/emu/machine/z8536.h +++ b/src/emu/machine/z8536.h @@ -67,50 +67,28 @@ struct z8536_interface { - devcb_write_line m_out_int_func; + devcb_write_line m_out_int_cb; - devcb_read8 m_in_pa_func; - devcb_write8 m_out_pa_func; + devcb_read8 m_in_pa_cb; + devcb_write8 m_out_pa_cb; - devcb_read8 m_in_pb_func; - devcb_write8 m_out_pb_func; + devcb_read8 m_in_pb_cb; + devcb_write8 m_out_pb_cb; - devcb_read8 m_in_pc_func; - devcb_write8 m_out_pc_func; -}; - - -// ======================> z8536_device_config - -class z8536_device_config : public device_config, - public z8536_interface -{ - friend class z8536_device; - - // construction/destruction - z8536_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - -public: - // allocators - static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); - virtual device_t *alloc_device(running_machine &machine) const; - -protected: - // device_config overrides - virtual void device_config_complete(); + devcb_read8 m_in_pc_cb; + devcb_write8 m_out_pc_cb; }; // ======================> z8536_device -class z8536_device : public device_t +class z8536_device : public device_t, + public z8536_interface { - friend class z8536_device_config; - +public: // construction/destruction - z8536_device(running_machine &_machine, const z8536_device_config &_config); + z8536_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); -public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -131,6 +109,7 @@ public: protected: // device-level overrides + virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -169,8 +148,6 @@ private: // timers emu_timer *m_timer[3]; - - const z8536_device_config &m_config; }; |