diff --git a/src/emu/machine.c b/src/emu/machine.c index ec3659b8b32..efe4bdfd50a 100644 --- a/src/emu/machine.c +++ b/src/emu/machine.c @@ -1048,16 +1048,6 @@ driver_device::~driver_device() } -//------------------------------------------------- -// find_devices - default implementation which -// does nothing -//------------------------------------------------- - -void driver_device::find_devices() -{ -} - - //------------------------------------------------- // driver_start - default implementation which // does nothing @@ -1186,8 +1176,9 @@ void driver_device::device_start() if (next() != NULL) throw device_missing_dependencies(); - // first find devices - find_devices(); + // find all the registered devices + for (auto_device_base *autodev = m_auto_device_list; autodev != NULL; autodev = autodev->m_next) + autodev->findit(*this); // call the game-specific init if (m_config.m_game->driver_init != NULL) @@ -1220,6 +1211,40 @@ void driver_device::device_reset() } +//------------------------------------------------- +// auto_device_base - constructor +//------------------------------------------------- + +void driver_device::register_auto_device(auto_device_base &autodev) +{ + // add to this list + autodev.m_next = m_auto_device_list; + m_auto_device_list = &autodev; +} + + +//------------------------------------------------- +// auto_device_base - constructor +//------------------------------------------------- + +driver_device::auto_device_base::auto_device_base(driver_device &base, const char *tag) + : m_next(NULL), + m_tag(tag) +{ + // register ourselves with our device class + base.register_auto_device(*this); +} + + +//------------------------------------------------- +// ~auto_device_base - destructor +//------------------------------------------------- + +driver_device::auto_device_base::~auto_device_base() +{ +} + + //************************************************************************** // SYSTEM TIME diff --git a/src/emu/machine.h b/src/emu/machine.h index 47a72d65e39..4984fefff8f 100644 --- a/src/emu/machine.h +++ b/src/emu/machine.h @@ -617,7 +617,6 @@ public: protected: // helpers called at startup - virtual void find_devices(); virtual void driver_start(); virtual void machine_start(); virtual void sound_start(); @@ -633,23 +632,70 @@ protected: virtual void device_start(); virtual void device_reset(); - // device locators - template - bool optional_device(T *&device, const char *tag) + // helper class to request auto-device discovery in the constructor of a derived class + class auto_device_base { - device = downcast(m_machine.device(tag)); - return (device != NULL); - } + public: + // construction/destruction + auto_device_base(driver_device &base, const char *tag); + virtual ~auto_device_base(); - template - void required_device(T *&device, const char *tag) + // getters + virtual void findit(driver_device &base) = 0; + + // internal state + auto_device_base *m_next; + const char *m_tag; + }; + + // optional device finder + template + class optional_device : public auto_device_base { - if (!optional_device(device, tag)) - throw emu_fatalerror("Unable to find device '%s'", tag); - } + public: + // construction/destruction + optional_device(driver_device &base, const char *tag) + : auto_device_base(base, tag), + m_device(NULL) { } + + // operators to make use transparent + operator _DeviceClass *() { return m_device; } + operator _DeviceClass *() const { return m_device; } + _DeviceClass *operator->() { return m_device; } + + // finder + virtual void findit(driver_device &base) + { + m_device = base.m_machine.device<_DeviceClass>(m_tag); + } + + // internal state + _DeviceClass *m_device; + }; + + // required devices are similar but throw an error if they are not found + template + class required_device : public optional_device<_DeviceClass> + { + public: + // construction/destruction + required_device(driver_device &base, const char *tag) + : optional_device<_DeviceClass>(base, tag) { } + + // finder + virtual void findit(driver_device &base) + { + this->m_device = base.m_machine.device<_DeviceClass>(this->m_tag); + if (this->m_device == NULL) throw emu_fatalerror("Unabled to find required device '%s'", this->m_tag); + } + }; + + // internal helpers + void register_auto_device(auto_device_base &autodev); // internal state const driver_device_config_base &m_config; + auto_device_base *m_auto_device_list; }; diff --git a/src/mame/includes/atarisy1.h b/src/mame/includes/atarisy1.h index c2933757df0..7c9af55c842 100644 --- a/src/mame/includes/atarisy1.h +++ b/src/mame/includes/atarisy1.h @@ -11,17 +11,17 @@ class atarisy1_state : public atarigen_state public: atarisy1_state(running_machine &machine, const driver_device_config_base &config) : atarigen_state(machine, config), - joystick_timer(machine.device("joystick_timer")), - yscroll_reset_timer(machine.device("yreset_timer")), - scanline_timer(machine.device("scan_timer")), - int3off_timer(machine.device("int3off_timer")) { } + joystick_timer(*this, "joystick_timer"), + yscroll_reset_timer(*this, "yreset_timer"), + scanline_timer(*this, "scan_timer"), + int3off_timer(*this, "int3off_timer") { } UINT16 * bankselect; UINT8 joystick_type; UINT8 trackball_type; - timer_device * joystick_timer; + required_device joystick_timer; UINT8 joystick_int; UINT8 joystick_int_enable; UINT8 joystick_value; @@ -30,12 +30,12 @@ public: UINT16 playfield_lookup[256]; UINT8 playfield_tile_bank; UINT16 playfield_priority_pens; - timer_device * yscroll_reset_timer; + required_device yscroll_reset_timer; /* INT3 tracking */ int next_timer_scanline; - timer_device * scanline_timer; - timer_device * int3off_timer; + required_device scanline_timer; + required_device int3off_timer; /* graphics bank tracking */ UINT8 bank_gfx[3][8]; diff --git a/src/mame/includes/balsente.h b/src/mame/includes/balsente.h index 806d0cfe3e6..38aabcecfa8 100644 --- a/src/mame/includes/balsente.h +++ b/src/mame/includes/balsente.h @@ -31,8 +31,8 @@ class balsente_state : public driver_device public: balsente_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - scanline_timer(machine.device("scan_timer")), - counter_0_timer(machine.device("8253_0_timer")) + scanline_timer(*this, "scan_timer"), + counter_0_timer(*this, "8253_0_timer") { astring temp; for (int i = 0; i < ARRAY_LENGTH(cem_device); i++) @@ -64,12 +64,12 @@ public: UINT8 writebyte; } counter[3]; - timer_device *scanline_timer; + required_device scanline_timer; /* manually clocked counter 0 states */ UINT8 counter_control; UINT8 counter_0_ff; - timer_device *counter_0_timer; + required_device counter_0_timer; UINT8 counter_0_timer_active; /* random number generator states */ diff --git a/src/mame/includes/beathead.h b/src/mame/includes/beathead.h index 140c8d6444f..7a34e150193 100644 --- a/src/mame/includes/beathead.h +++ b/src/mame/includes/beathead.h @@ -12,12 +12,8 @@ class beathead_state : public atarigen_state { public: beathead_state(running_machine &machine, const driver_device_config_base &config) - : atarigen_state(machine, config) { } - - virtual void find_devices() - { - required_device(m_maincpu, "maincpu"); - } + : atarigen_state(machine, config), + m_maincpu(*this, "maincpu") { } virtual void machine_start(); virtual void machine_reset(); @@ -25,7 +21,7 @@ public: virtual void video_start(); virtual bool video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); - asap_device * m_maincpu; + required_device m_maincpu; UINT32 * m_videoram; UINT32 * m_paletteram; diff --git a/src/mame/includes/boogwing.h b/src/mame/includes/boogwing.h index d215dc39f5e..db4766fec06 100644 --- a/src/mame/includes/boogwing.h +++ b/src/mame/includes/boogwing.h @@ -12,11 +12,11 @@ class boogwing_state : public driver_device public: boogwing_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - audiocpu(machine.device("audiocpu")), - deco16ic(machine.device("deco_custom")), - oki1(machine.device("oki1")), - oki2(machine.device("oki2")) { } + maincpu(*this, "maincpu"), + audiocpu(*this, "audiocpu"), + deco16ic(*this, "deco_custom"), + oki1(*this, "oki1"), + oki2(*this, "oki2") { } /* memory pointers */ UINT16 * pf1_rowscroll; @@ -25,11 +25,11 @@ public: UINT16 * pf4_rowscroll; /* devices */ - cpu_device *maincpu; - cpu_device *audiocpu; - deco16ic_device *deco16ic; - okim6295_device *oki1; - okim6295_device *oki2; + required_device maincpu; + required_device audiocpu; + required_device deco16ic; + required_device oki1; + required_device oki2; }; diff --git a/src/mame/includes/cninja.h b/src/mame/includes/cninja.h index 44e90def272..b85111d1521 100644 --- a/src/mame/includes/cninja.h +++ b/src/mame/includes/cninja.h @@ -12,11 +12,11 @@ class cninja_state : public driver_device public: cninja_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - audiocpu(machine.device("audiocpu")), - deco16ic(machine.device("deco_custom")), - raster_irq_timer(machine.device("raster_timer")), - oki2(machine.device("oki2")) { } + maincpu(*this, "maincpu"), + audiocpu(*this, "audiocpu"), + deco16ic(*this, "deco_custom"), + raster_irq_timer(*this, "raster_timer"), + oki2(*this, "oki2") { } /* memory pointers */ UINT16 * ram; @@ -29,11 +29,11 @@ public: int scanline, irq_mask; /* devices */ - cpu_device *maincpu; - cpu_device *audiocpu; - deco16ic_device *deco16ic; - timer_device *raster_irq_timer; - okim6295_device *oki2; + required_device maincpu; + required_device audiocpu; + required_device deco16ic; + required_device raster_irq_timer; + required_device oki2; }; /*----------- defined in video/cninja.c -----------*/ diff --git a/src/mame/includes/dassault.h b/src/mame/includes/dassault.h index 75935122e53..ca1c40b90fc 100644 --- a/src/mame/includes/dassault.h +++ b/src/mame/includes/dassault.h @@ -12,11 +12,11 @@ class dassault_state : public driver_device public: dassault_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - audiocpu(machine.device("audiocpu")), - subcpu(machine.device("sub")), - deco16ic(machine.device("deco_custom")), - oki2(machine.device("oki2")) { } + maincpu(*this, "maincpu"), + audiocpu(*this, "audiocpu"), + subcpu(*this, "sub"), + deco16ic(*this, "deco_custom"), + oki2(*this, "oki2") { } /* memory pointers */ UINT16 * pf2_rowscroll; @@ -26,11 +26,11 @@ public: UINT16 * shared_ram; /* devices */ - cpu_device *maincpu; - cpu_device *audiocpu; - cpu_device *subcpu; - deco16ic_device *deco16ic; - okim6295_device *oki2; + required_device maincpu; + required_device audiocpu; + required_device subcpu; + required_device deco16ic; + required_device oki2; }; diff --git a/src/mame/includes/drgnmst.h b/src/mame/includes/drgnmst.h index 9b025ca5f33..25dcc20136e 100644 --- a/src/mame/includes/drgnmst.h +++ b/src/mame/includes/drgnmst.h @@ -6,8 +6,8 @@ class drgnmst_state : public driver_device public: drgnmst_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - oki_1(machine.device("oki1")), - oki_2(machine.device("oki2")) { } + oki_1(*this, "oki1"), + oki_2(*this, "oki2") { } /* memory pointers */ UINT16 * vidregs; @@ -33,8 +33,8 @@ public: UINT8 oki1_bank; /* devices */ - okim6295_device *oki_1; - okim6295_device *oki_2; + required_device oki_1; + required_device oki_2; }; diff --git a/src/mame/includes/gcpinbal.h b/src/mame/includes/gcpinbal.h index 5c273adf555..c18083b597e 100644 --- a/src/mame/includes/gcpinbal.h +++ b/src/mame/includes/gcpinbal.h @@ -7,9 +7,9 @@ class gcpinbal_state : public driver_device public: gcpinbal_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - oki(machine.device("oki")), - msm(machine.device("msm")) { } + maincpu(*this, "maincpu"), + oki(*this, "oki"), + msm(*this, "msm") { } /* memory pointers */ UINT16 * tilemapram; @@ -32,9 +32,9 @@ public: UINT8 adpcm_trigger, adpcm_data; /* devices */ - cpu_device *maincpu; - okim6295_device *oki; - msm5205_device *msm; + required_device maincpu; + required_device oki; + required_device msm; }; diff --git a/src/mame/includes/harddriv.h b/src/mame/includes/harddriv.h index 89dcb7419f2..2008ec7e0ee 100644 --- a/src/mame/includes/harddriv.h +++ b/src/mame/includes/harddriv.h @@ -11,28 +11,24 @@ class harddriv_state : public atarigen_state { public: harddriv_state(running_machine &machine, const driver_device_config_base &config) - : atarigen_state(machine, config) { } + : atarigen_state(machine, config), + maincpu(*this, "maincpu"), + gsp(*this, "gsp"), + msp(*this, "msp"), + adsp(*this, "adsp"), + soundcpu(*this, "soundcpu"), + sounddsp(*this, "sounddsp"), + jsacpu(*this, "jsacpu"), + dsp32(*this, "dsp32") { } - virtual void find_devices() - { - required_device(maincpu, "maincpu"); - required_device(gsp, "gsp"); - optional_device(msp, "msp"); - required_device(adsp, "adsp"); - optional_device(soundcpu, "soundcpu"); - optional_device(sounddsp, "sounddsp"); - optional_device(jsacpu, "jsacpu"); - optional_device(dsp32, "dsp32"); - } - - cpu_device * maincpu; - tms34010_device * gsp; - cpu_device * msp; - cpu_device * adsp; - cpu_device * soundcpu; - cpu_device * sounddsp; - cpu_device * jsacpu; - cpu_device * dsp32; + required_device maincpu; + required_device gsp; + optional_device msp; + required_device adsp; + optional_device soundcpu; + optional_device sounddsp; + optional_device jsacpu; + optional_device dsp32; UINT8 hd34010_host_access; UINT8 dsk_pio_access; diff --git a/src/mame/includes/kickgoal.h b/src/mame/includes/kickgoal.h index 365b3d6a01a..298030e1714 100644 --- a/src/mame/includes/kickgoal.h +++ b/src/mame/includes/kickgoal.h @@ -12,8 +12,8 @@ class kickgoal_state : public driver_device public: kickgoal_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - adpcm(machine.device("oki")), - eeprom(machine.device("eeprom")) { } + adpcm(*this, "oki"), + eeprom(*this, "eeprom") { } /* memory pointers */ UINT16 * fgram; @@ -34,8 +34,8 @@ public: UINT16 m6295_key_delay; /* devices */ - okim6295_device *adpcm; - eeprom_device *eeprom; + required_device adpcm; + required_device eeprom; }; diff --git a/src/mame/includes/metro.h b/src/mame/includes/metro.h index 059a208ef72..7a0ae41829d 100644 --- a/src/mame/includes/metro.h +++ b/src/mame/includes/metro.h @@ -13,11 +13,11 @@ class metro_state : public driver_device public: metro_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - audiocpu(machine.device("audiocpu")), - oki(machine.device("oki")), - ymsnd(machine.device("ymsnd")), - k053936(machine.device("k053936")) { } + maincpu(*this, "maincpu"), + audiocpu(*this, "audiocpu"), + oki(*this, "oki"), + ymsnd(*this, "ymsnd"), + k053936(*this, "k053936") { } /* memory pointers */ UINT16 * vram_0; @@ -80,11 +80,11 @@ public: tilemap_t *vmetal_mid2tilemap; /* devices */ - cpu_device *maincpu; - cpu_device *audiocpu; - okim6295_device *oki; - device_t *ymsnd; - k053936_device *k053936; + required_device maincpu; + required_device audiocpu; + required_device oki; + required_device ymsnd; + required_device k053936; }; diff --git a/src/mame/includes/mitchell.h b/src/mame/includes/mitchell.h index 3128e6d0980..0bcac7ad868 100644 --- a/src/mame/includes/mitchell.h +++ b/src/mame/includes/mitchell.h @@ -11,8 +11,8 @@ class mitchell_state : public driver_device public: mitchell_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - audiocpu(machine.device("audiocpu")), - oki(machine.device("oki")) { } + audiocpu(*this, "audiocpu"), + oki(*this, "oki") { } /* memory pointers */ UINT8 * videoram; @@ -37,8 +37,8 @@ public: int keymatrix; /* devices */ - cpu_device *audiocpu; - okim6295_device *oki; + required_device audiocpu; + required_device oki; }; diff --git a/src/mame/includes/rohga.h b/src/mame/includes/rohga.h index 705b8cdbba0..ab0fa2f92e1 100644 --- a/src/mame/includes/rohga.h +++ b/src/mame/includes/rohga.h @@ -12,11 +12,11 @@ class rohga_state : public driver_device public: rohga_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - audiocpu(machine.device("audiocpu")), - deco16ic(machine.device("deco_custom")), - oki1(machine.device("oki1")), - oki2(machine.device("oki2")) { } + maincpu(*this, "maincpu"), + audiocpu(*this, "audiocpu"), + deco16ic(*this, "deco_custom"), + oki1(*this, "oki1"), + oki2(*this, "oki2") { } /* memory pointers */ UINT16 * pf1_rowscroll; @@ -26,11 +26,11 @@ public: UINT16 * spriteram; /* devices */ - cpu_device *maincpu; - cpu_device *audiocpu; - deco16ic_device *deco16ic; - okim6295_device *oki1; - okim6295_device *oki2; + required_device maincpu; + required_device audiocpu; + required_device deco16ic; + required_device oki1; + required_device oki2; }; diff --git a/src/mame/includes/segas16.h b/src/mame/includes/segas16.h index 2faa1fe9127..cfcb7305a05 100644 --- a/src/mame/includes/segas16.h +++ b/src/mame/includes/segas16.h @@ -4,7 +4,7 @@ class segas1x_state : public driver_device public: segas1x_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - interrupt_timer(machine.device("int_timer")) { } + interrupt_timer(*this, "int_timer") { } /* memory pointers */ // UINT16 * workram; // this is used in the nvram handler, hence it cannot be added here @@ -92,7 +92,7 @@ public: running_device *n7751; running_device *ppi8255_1; running_device *ppi8255_2; - timer_device *interrupt_timer; + required_device interrupt_timer; running_device *_315_5248_1; running_device *_315_5250_1; running_device *_315_5250_2; diff --git a/src/mame/includes/simpl156.h b/src/mame/includes/simpl156.h index 4dba56f5316..4735075f0b1 100644 --- a/src/mame/includes/simpl156.h +++ b/src/mame/includes/simpl156.h @@ -13,10 +13,10 @@ class simpl156_state : public driver_device public: simpl156_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - maincpu(machine.device("maincpu")), - deco16ic(machine.device("deco_custom")), - eeprom(machine.device("eeprom")), - okimusic(machine.device("okimusic")) { } + maincpu(*this, "maincpu"), + deco16ic(*this, "deco_custom"), + eeprom(*this, "eeprom"), + okimusic(*this, "okimusic") { } /* memory pointers */ UINT16 * pf1_rowscroll; @@ -25,10 +25,10 @@ public: UINT32 * systemram; /* devices */ - cpu_device *maincpu; - deco16ic_device *deco16ic; - eeprom_device *eeprom; - okim6295_device *okimusic; + required_device maincpu; + required_device deco16ic; + required_device eeprom; + required_device okimusic; }; diff --git a/src/mame/includes/taito_f2.h b/src/mame/includes/taito_f2.h index ea6c286dd44..bcd12dbe02d 100644 --- a/src/mame/includes/taito_f2.h +++ b/src/mame/includes/taito_f2.h @@ -15,7 +15,7 @@ class taitof2_state : public driver_device public: taitof2_state(running_machine &machine, const driver_device_config_base &config) : driver_device(machine, config), - oki(machine.device("oki")) { } + oki(*this, "oki") { } /* memory pointers */ UINT16 * sprite_extension; @@ -68,7 +68,7 @@ public: /* devices */ running_device *maincpu; running_device *audiocpu; - okim6295_device *oki; + required_device oki; running_device *tc0100scn; running_device *tc0100scn_1; running_device *tc0100scn_2;