From 9ecbecb503a07adf6782c7f8f7356207bb9e724f Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Thu, 12 Apr 2012 05:03:16 +0000 Subject: [PATCH] Fixed bug where required shared pointers were not actually required. Added optional/required_shared_ptr_array classes so that you can populate an array of shared pointers. You provide a base tag name, and each item in the array is populated with tag.n, where n is the array index. Updated a couple of drivers using arrays to either not use arrays (where they weren't really providing any benefit) or to use the new array classes. --- src/emu/device.c | 8 +- src/emu/device.h | 365 +++++++++++++++++++++--------------- src/mame/drivers/blitz68k.c | 45 +++-- src/mame/drivers/bnstars.c | 71 ++++--- src/mame/drivers/hornet.c | 24 ++- src/mame/drivers/rabbit.c | 53 +++--- src/mame/drivers/tmmjprd.c | 23 ++- 7 files changed, 346 insertions(+), 243 deletions(-) diff --git a/src/emu/device.c b/src/emu/device.c index 86a9d0190c3..2f4301508c6 100644 --- a/src/emu/device.c +++ b/src/emu/device.c @@ -116,12 +116,12 @@ device_t::device_t(const machine_config &mconfig, device_type type, const char * m_machine_config(mconfig), m_static_config(NULL), m_input_defaults(NULL), - m_auto_finder_list(NULL), m_machine(NULL), m_save(NULL), m_basetag(tag), m_config_complete(false), - m_started(false) + m_started(false), + m_auto_finder_list(NULL) { if (owner != NULL) m_tag.cpy((owner->owner() == NULL) ? "" : owner->tag()).cat(":").cat(tag); @@ -863,7 +863,11 @@ void *device_t::finder_base::find_memory(UINT8 width, size_t &bytes, bool requir { memory_share *share = m_base.machine().memory().shared(m_base, m_tag); if (share == NULL) + { + if (required) + throw emu_fatalerror("Shared ptr '%s' not found", m_tag); return NULL; + } if (share->width() != width) { if (required) diff --git a/src/emu/device.h b/src/emu/device.h index 7fc75dd4bce..5a50c3a5721 100644 --- a/src/emu/device.h +++ b/src/emu/device.h @@ -124,7 +124,6 @@ typedef int (*read_line_device_func)(device_t *device); typedef void (*write_line_device_func)(device_t *device, int state); - // ======================> device_t // device_t represents a device @@ -228,6 +227,18 @@ public: device_debug *debug() const { return m_debug; } protected: + // internal helper classes (defined below) + class finder_base; + template class device_finder; + template class optional_device; + template class required_device; + template class shared_ptr_finder; + template class optional_shared_ptr; + template class required_shared_ptr; + template class shared_ptr_array_finder; + template class optional_shared_ptr_array; + template class required_shared_ptr_array; + // miscellaneous helpers void set_machine(running_machine &machine); void start(); @@ -236,6 +247,7 @@ protected: void pre_save(); void post_load(); void notify_clock_changed(); + finder_base *register_auto_finder(finder_base &autodev); //------------------- begin derived class overrides @@ -288,155 +300,6 @@ protected: const void * m_static_config; // static device configuration const input_device_default *m_input_defaults; // devices input ports default overrides - // helper class to request auto-object discovery in the constructor of a derived class - class finder_base - { - friend class device_t; - - public: - // construction/destruction - finder_base(device_t &base, const char *tag); - virtual ~finder_base(); - - // getters - virtual void findit() = 0; - - protected: - // static helpers - void *find_memory(UINT8 width, size_t &bytes, bool required); - - // internal state - finder_base *m_next; - device_t &m_base; - const char *m_tag; - }; - - // device finder template - template - class device_finder : public finder_base - { - public: - // construction/destruction - device_finder(device_t &base, const char *tag) - : finder_base(base, tag), - m_target(0) { } - - // operators to make use transparent - operator _DeviceClass *() { return m_target; } - operator _DeviceClass *() const { return m_target; } - _DeviceClass *operator->() { return m_target; } - - // getter for explicit fetching - _DeviceClass *target() const { return m_target; } - - // setter for setting the object - void set_target(_DeviceClass *target) - { - m_target = target; - if (target == 0 && _Required) - throw emu_fatalerror("Unable to find required device '%s'", this->m_tag); - } - - // finder - virtual void findit() { set_target(m_base.subdevice<_DeviceClass>(m_tag)); } - - protected: - // internal state - _DeviceClass *m_target; - }; - - // optional device finder - template - class optional_device : public device_finder<_DeviceClass, false> - { - public: - optional_device(device_t &base, const char *tag) : device_finder<_DeviceClass, false>(base, tag) { } - }; - - // required devices are similar but throw an error if they are not found - template - class required_device : public device_finder<_DeviceClass, true> - { - public: - required_device(device_t &base, const char *tag) : device_finder<_DeviceClass, true>(base, tag) { } - }; - - // shared pointer finder template - template - class shared_ptr_finder : public finder_base - { - public: - // construction/destruction - shared_ptr_finder(device_t &base, const char *tag, UINT8 width = 0) - : finder_base(base, tag), - m_target(0), - m_bytes(0), - m_allocated(false), - m_width((width != 0) ? width : sizeof(_PointerType) * 8) { } - - virtual ~shared_ptr_finder() { if (m_allocated) global_free(m_target); } - - // operators to make use transparent - operator _PointerType *() const { return m_target; } - _PointerType operator[](int index) const { return m_target[index]; } - _PointerType &operator[](int index) { return m_target[index]; } - _PointerType *operator->() { return m_target; } - - // getter for explicit fetching - _PointerType *target() const { return m_target; } - UINT32 bytes() const { return m_bytes; } - - // setter for setting the object - void set_target(_PointerType *target, size_t bytes) - { - m_target = target; - m_bytes = bytes; - if (target == 0 && _Required) - throw emu_fatalerror("Unable to find required shared pointer '%s'", this->m_tag); - } - - // dynamic allocation of a shared pointer - void allocate(UINT32 entries) - { - assert(!m_allocated); - m_allocated = true; - m_target = global_alloc_array_clear(_PointerType, entries); - m_bytes = entries * sizeof(_PointerType); - m_base.save_pointer(m_target, m_tag, entries); - } - - // finder - virtual void findit() { m_target = reinterpret_cast<_PointerType *>(find_memory(m_width, m_bytes, _Required)); } - - protected: - // internal state - _PointerType *m_target; - size_t m_bytes; - bool m_allocated; - UINT8 m_width; - }; - - // optional device finder - template - class optional_shared_ptr : public shared_ptr_finder<_PointerType, false> - { - public: - optional_shared_ptr(device_t &base, const char *tag, UINT8 width = 0) : shared_ptr_finder<_PointerType, false>(base, tag, width) { } - }; - - // required devices are similar but throw an error if they are not found - template - class required_shared_ptr : public shared_ptr_finder<_PointerType, true> - { - public: - required_shared_ptr(device_t &base, const char *tag, UINT8 width = 0) : shared_ptr_finder<_PointerType, true>(base, tag, width) { } - }; - - // internal helpers - finder_base *register_auto_finder(finder_base &autodev); - - finder_base * m_auto_finder_list; - private: // private helpers device_t *add_subdevice(device_type type, const char *tag, UINT32 clock); @@ -451,9 +314,211 @@ private: astring m_basetag; // base part of the tag bool m_config_complete; // have we completed our configuration? bool m_started; // true if the start function has succeeded + finder_base * m_auto_finder_list; // list of objects to auto-find }; +// ======================> finder_base + +// helper class to request auto-object discovery in the constructor of a derived class +class device_t::finder_base +{ + friend class device_t; + +public: + // construction/destruction + finder_base(device_t &base, const char *tag); + virtual ~finder_base(); + + // getters + virtual void findit() = 0; + +protected: + // helpers + void *find_memory(UINT8 width, size_t &bytes, bool required); + + // internal state + finder_base *m_next; + device_t &m_base; + const char *m_tag; +}; + + +// ======================> device_finder + +// device finder template +template +class device_t::device_finder : public device_t::finder_base +{ +public: + // construction/destruction + device_finder(device_t &base, const char *tag) + : finder_base(base, tag), + m_target(0) { } + + // operators to make use transparent + operator _DeviceClass *() { return m_target; } + operator _DeviceClass *() const { return m_target; } + _DeviceClass *operator->() { assert(m_target != NULL); return m_target; } + + // getter for explicit fetching + _DeviceClass *target() const { return m_target; } + + // setter for setting the object + void set_target(_DeviceClass *target) + { + m_target = target; + if (target == 0 && _Required) + throw emu_fatalerror("Unable to find required device '%s'", this->m_tag); + } + + // finder + virtual void findit() { set_target(m_base.subdevice<_DeviceClass>(m_tag)); } + +protected: + // internal state + _DeviceClass *m_target; +}; + +// optional device finder +template +class device_t::optional_device : public device_t::device_finder<_DeviceClass, false> +{ +public: + optional_device(device_t &base, const char *tag) : device_finder<_DeviceClass, false>(base, tag) { } +}; + +// required devices are similar but throw an error if they are not found +template +class device_t::required_device : public device_t::device_finder<_DeviceClass, true> +{ +public: + required_device(device_t &base, const char *tag) : device_finder<_DeviceClass, true>(base, tag) { } +}; + + +// ======================> shared_ptr_finder + +// shared pointer finder template +template +class device_t::shared_ptr_finder : public device_t::finder_base +{ +public: + // construction/destruction + shared_ptr_finder(device_t &base, const char *tag, UINT8 width = 0) + : finder_base(base, tag), + m_target(0), + m_bytes(0), + m_allocated(false), + m_width((width != 0) ? width : sizeof(_PointerType) * 8) { } + + virtual ~shared_ptr_finder() { if (m_allocated) global_free(m_target); } + + // operators to make use transparent + operator _PointerType *() const { return m_target; } + _PointerType operator[](int index) const { return m_target[index]; } + _PointerType &operator[](int index) { return m_target[index]; } + _PointerType *operator->() { return m_target; } + + // getter for explicit fetching + _PointerType *target() const { return m_target; } + UINT32 bytes() const { return m_bytes; } + + // setter for setting the object + void set_target(_PointerType *target, size_t bytes) + { + m_target = target; + m_bytes = bytes; + if (target == 0 && _Required) + throw emu_fatalerror("Unable to find required shared pointer '%s'", this->m_tag); + } + + // dynamic allocation of a shared pointer + void allocate(UINT32 entries) + { + assert(!m_allocated); + m_allocated = true; + m_target = global_alloc_array_clear(_PointerType, entries); + m_bytes = entries * sizeof(_PointerType); + m_base.save_pointer(m_target, m_tag, entries); + } + + // finder + virtual void findit() { m_target = reinterpret_cast<_PointerType *>(find_memory(m_width, m_bytes, _Required)); } + +protected: + // internal state + _PointerType *m_target; + size_t m_bytes; + bool m_allocated; + UINT8 m_width; +}; + +// optional shared pointer finder +template +class device_t::optional_shared_ptr : public device_t::shared_ptr_finder<_PointerType, false> +{ +public: + optional_shared_ptr(device_t &base, const char *tag, UINT8 width = 0) : shared_ptr_finder<_PointerType, false>(base, tag, width) { } +}; + +// required shared pointer finder +template +class device_t::required_shared_ptr : public device_t::shared_ptr_finder<_PointerType, true> +{ +public: + required_shared_ptr(device_t &base, const char *tag, UINT8 width = 0) : shared_ptr_finder<_PointerType, true>(base, tag, width) { } +}; + + +// ======================> shared_ptr_array_finder + +// shared pointer array finder template +template +class device_t::shared_ptr_array_finder +{ + typedef shared_ptr_finder<_PointerType, _Required> shared_ptr_type; + +public: + // construction/destruction + shared_ptr_array_finder(device_t &base, const char *basetag, UINT8 width = 0) + { + for (int index = 0; index < _Count; index++) + m_array[index] = global_alloc(shared_ptr_type(base, m_tag[index].format("%s.%d", basetag, index), width)); + } + + virtual ~shared_ptr_array_finder() + { + for (int index = 0; index < _Count; index++) + global_free(m_array[index]); + } + + // array accessors + const shared_ptr_type &operator[](int index) const { assert(index < _Count); return *m_array[index]; } + shared_ptr_type &operator[](int index) { assert(index < _Count); return *m_array[index]; } + +protected: + // internal state + shared_ptr_type *m_array[_Count]; + astring m_tag[_Count]; +}; + +// optional shared pointer array finder +template +class device_t::optional_shared_ptr_array : public device_t::shared_ptr_array_finder<_PointerType, _Count, false> +{ +public: + optional_shared_ptr_array(device_t &base, const char *tag, UINT8 width = 0) : shared_ptr_array_finder<_PointerType, _Count, false>(base, tag, width) { } +}; + +// required shared pointer array finder +template +class device_t::required_shared_ptr_array : public device_t::shared_ptr_array_finder<_PointerType, _Count, true> +{ +public: + required_shared_ptr_array(device_t &base, const char *tag, UINT8 width = 0) : shared_ptr_array_finder<_PointerType, _Count, true>(base, tag, width) { } +}; + // ======================> device_interface diff --git a/src/mame/drivers/blitz68k.c b/src/mame/drivers/blitz68k.c index f916a267f81..3be1e9c6afc 100644 --- a/src/mame/drivers/blitz68k.c +++ b/src/mame/drivers/blitz68k.c @@ -43,7 +43,10 @@ class blitz68k_state : public driver_device public: blitz68k_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_nvram(*this, "nvram") { } + m_nvram(*this, "nvram"), + m_leds0(*this, "leds0"), + m_leds1(*this, "leds1"), + m_leds2(*this, "leds2") { } optional_shared_ptr m_nvram; UINT8 *m_blit_buffer; @@ -55,7 +58,9 @@ public: UINT16 *m_blit_dst_ram_hiword; UINT16 *m_blit_vregs; UINT16 *m_blit_transpen; - UINT16 *m_leds[3]; + required_shared_ptr m_leds0; + required_shared_ptr m_leds1; + optional_shared_ptr m_leds2; DECLARE_WRITE16_MEMBER(blit_copy_w); DECLARE_READ8_MEMBER(blit_status_r); DECLARE_WRITE8_MEMBER(blit_x_w); @@ -505,13 +510,13 @@ WRITE8_MEMBER(blitz68k_state::blit_hwyxa_draw_w) void blitz68k_state::show_leds123() { #ifdef MAME_DEBUG - popmessage("led %02x %02x %02x", m_leds[0][0]>>8, m_leds[1][0]>>8, m_leds[2][0]>>8); + popmessage("led %02x %02x %02x", m_leds0[0]>>8, m_leds1[0]>>8, m_leds2[0]>>8); #endif } void blitz68k_state::show_leds12() { #ifdef MAME_DEBUG - popmessage("led %02x %02x", m_leds[0][0]>>8, m_leds[1][0]>>8); + popmessage("led %02x %02x", m_leds0[0]>>8, m_leds1[0]>>8); #endif } @@ -793,7 +798,7 @@ ADDRESS_MAP_END WRITE16_MEMBER(blitz68k_state::cjffruit_leds1_w) { - data = COMBINE_DATA(m_leds[0]); + data = COMBINE_DATA(m_leds0); if (ACCESSING_BITS_8_15) { coin_counter_w(machine(), 0, data & 0x0100); // coin in @@ -810,7 +815,7 @@ WRITE16_MEMBER(blitz68k_state::cjffruit_leds1_w) WRITE16_MEMBER(blitz68k_state::cjffruit_leds2_w) { - data = COMBINE_DATA(m_leds[1]); + data = COMBINE_DATA(m_leds1); if (ACCESSING_BITS_8_15) { set_led_status(machine(), 7, data & 0x0100); // start @@ -827,7 +832,7 @@ WRITE16_MEMBER(blitz68k_state::cjffruit_leds2_w) WRITE16_MEMBER(blitz68k_state::cjffruit_leds3_w) { - data = COMBINE_DATA(m_leds[2]); + data = COMBINE_DATA(m_leds2); if (ACCESSING_BITS_8_15) { set_led_status(machine(), 15, data & 0x0100); // hopper coins? @@ -902,9 +907,9 @@ static ADDRESS_MAP_START( cjffruit_map, AS_PROGRAM, 16, blitz68k_state ) AM_RANGE(0x8e0000, 0x8e0001) AM_WRITE(cjffruit_mcu_w ) - AM_RANGE(0x8f8000, 0x8f8001) AM_WRITE(cjffruit_leds1_w) AM_BASE(m_leds[0]) - AM_RANGE(0x8fa000, 0x8fa001) AM_WRITE(cjffruit_leds2_w) AM_BASE(m_leds[1]) - AM_RANGE(0x8fc000, 0x8fc001) AM_WRITE(cjffruit_leds3_w) AM_BASE(m_leds[2]) + AM_RANGE(0x8f8000, 0x8f8001) AM_WRITE(cjffruit_leds1_w) AM_SHARE("leds0") + AM_RANGE(0x8fa000, 0x8fa001) AM_WRITE(cjffruit_leds2_w) AM_SHARE("leds1") + AM_RANGE(0x8fc000, 0x8fc001) AM_WRITE(cjffruit_leds3_w) AM_SHARE("leds2") AM_RANGE(0x8fe000, 0x8fe003) AM_WRITE8(blit_flags_w, 0xffff) // flipx,y,solid,trans AM_RANGE(0x8fe004, 0x8fe005) AM_WRITEONLY @@ -932,7 +937,7 @@ WRITE16_MEMBER(blitz68k_state::deucesw2_mcu_w) WRITE16_MEMBER(blitz68k_state::deucesw2_leds1_w) { - data = COMBINE_DATA(m_leds[0]); + data = COMBINE_DATA(m_leds0); if (ACCESSING_BITS_8_15) { coin_counter_w(machine(), 0, data & 0x0100); // coin in @@ -949,7 +954,7 @@ WRITE16_MEMBER(blitz68k_state::deucesw2_leds1_w) WRITE16_MEMBER(blitz68k_state::deucesw2_leds2_w) { - data = COMBINE_DATA(m_leds[1]); + data = COMBINE_DATA(m_leds1); if (ACCESSING_BITS_8_15) { set_led_status(machine(), 7, data & 0x0100); // start @@ -966,7 +971,7 @@ WRITE16_MEMBER(blitz68k_state::deucesw2_leds2_w) WRITE16_MEMBER(blitz68k_state::deucesw2_leds3_w) { - data = COMBINE_DATA(m_leds[2]); + data = COMBINE_DATA(m_leds2); if (ACCESSING_BITS_8_15) { set_led_status(machine(), 15, data & 0x0100); // hopper coins? @@ -1001,9 +1006,9 @@ static ADDRESS_MAP_START( deucesw2_map, AS_PROGRAM, 16, blitz68k_state ) AM_RANGE(0x896000, 0x896001) AM_WRITE(deucesw2_mcu_w ) - AM_RANGE(0x898000, 0x898001) AM_WRITE(deucesw2_leds1_w) AM_BASE(m_leds[0]) - AM_RANGE(0x89a000, 0x89a001) AM_WRITE(deucesw2_leds2_w) AM_BASE(m_leds[1]) - AM_RANGE(0x89c000, 0x89c001) AM_WRITE(deucesw2_leds3_w) AM_BASE(m_leds[2]) + AM_RANGE(0x898000, 0x898001) AM_WRITE(deucesw2_leds1_w) AM_SHARE("leds0") + AM_RANGE(0x89a000, 0x89a001) AM_WRITE(deucesw2_leds2_w) AM_SHARE("leds1") + AM_RANGE(0x89c000, 0x89c001) AM_WRITE(deucesw2_leds3_w) AM_SHARE("leds2") AM_RANGE(0x89e000, 0x89e003) AM_WRITE8(blit_flags_w, 0xffff) // flipx,y,solid,trans AM_RANGE(0x89e004, 0x89e005) AM_WRITEONLY @@ -1122,7 +1127,7 @@ WRITE16_MEMBER(blitz68k_state::hermit_mcu_w) WRITE16_MEMBER(blitz68k_state::hermit_leds1_w) { - data = COMBINE_DATA(m_leds[0]); + data = COMBINE_DATA(m_leds0); if (ACCESSING_BITS_8_15) { coin_counter_w(machine(), 0, data & 0x0100); // coin in @@ -1132,7 +1137,7 @@ WRITE16_MEMBER(blitz68k_state::hermit_leds1_w) WRITE16_MEMBER(blitz68k_state::hermit_leds2_w) { - data = COMBINE_DATA(m_leds[1]); + data = COMBINE_DATA(m_leds1); if (ACCESSING_BITS_8_15) { set_led_status(machine(), 7, data & 0x0100); // button @@ -1176,8 +1181,8 @@ static ADDRESS_MAP_START( hermit_map, AS_PROGRAM, 16, blitz68k_state ) AM_RANGE(0x9d0000, 0x9d0001) AM_READ_PORT("IN2") AM_RANGE(0x9d8000, 0x9d8001) AM_READ_PORT("DSW") - AM_RANGE(0x9e0000, 0x9e0001) AM_WRITE(hermit_leds1_w) AM_BASE(m_leds[0]) - AM_RANGE(0x9e8000, 0x9e8001) AM_WRITE(hermit_leds2_w) AM_BASE(m_leds[1]) + AM_RANGE(0x9e0000, 0x9e0001) AM_WRITE(hermit_leds1_w) AM_SHARE("leds0") + AM_RANGE(0x9e8000, 0x9e8001) AM_WRITE(hermit_leds2_w) AM_SHARE("leds1") AM_RANGE(0x9f0000, 0x9f0003) AM_WRITE8(blit_flags_w, 0xffff) // flipx,y,solid,trans AM_RANGE(0x9f0004, 0x9f0005) AM_WRITEONLY diff --git a/src/mame/drivers/bnstars.c b/src/mame/drivers/bnstars.c index d8a8d21b218..17379c03ca5 100644 --- a/src/mame/drivers/bnstars.c +++ b/src/mame/drivers/bnstars.c @@ -98,24 +98,37 @@ class bnstars_state : public driver_device { public: bnstars_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_ms32_tx0_ram(*this, "tx0_ram"), + m_ms32_tx1_ram(*this, "tx1_ram"), + m_ms32_bg0_ram(*this, "bg0_ram"), + m_ms32_bg1_ram(*this, "bg1_ram"), + m_ms32_roz0_ram(*this, "roz0_ram"), + m_ms32_roz1_ram(*this, "roz1_ram"), + m_ms32_pal_ram(*this, "pal_ram"), + m_ms32_roz_ctrl(*this, "roz_ctrl"), + m_ms32_spram(*this, "spram"), + m_ms32_tx0_scroll(*this, "tx0_scroll"), + m_ms32_bg0_scroll(*this, "bg0_scroll"), + m_ms32_tx1_scroll(*this, "tx1_scroll"), + m_ms32_bg1_scroll(*this, "bg1_scroll") { } tilemap_t *m_ms32_tx_tilemap[2]; tilemap_t *m_ms32_bg_tilemap[2]; tilemap_t *m_ms32_roz_tilemap[2]; - UINT32 *m_ms32_tx0_ram; - UINT32 *m_ms32_tx1_ram; - UINT32 *m_ms32_bg0_ram; - UINT32 *m_ms32_bg1_ram; - UINT32 *m_ms32_roz0_ram; - UINT32 *m_ms32_roz1_ram; - UINT32 *m_ms32_pal_ram[2]; - UINT32 *m_ms32_roz_ctrl[2]; - UINT32 *m_ms32_spram; - UINT32 *m_ms32_tx0_scroll; - UINT32 *m_ms32_bg0_scroll; - UINT32 *m_ms32_tx1_scroll; - UINT32 *m_ms32_bg1_scroll; + required_shared_ptr m_ms32_tx0_ram; + required_shared_ptr m_ms32_tx1_ram; + required_shared_ptr m_ms32_bg0_ram; + required_shared_ptr m_ms32_bg1_ram; + required_shared_ptr m_ms32_roz0_ram; + required_shared_ptr m_ms32_roz1_ram; + required_shared_ptr_array m_ms32_pal_ram; + required_shared_ptr_array m_ms32_roz_ctrl; + required_shared_ptr m_ms32_spram; + required_shared_ptr m_ms32_tx0_scroll; + required_shared_ptr m_ms32_bg0_scroll; + required_shared_ptr m_ms32_tx1_scroll; + required_shared_ptr m_ms32_bg1_scroll; UINT32 m_bnstars1_mahjong_select; int m_ms32_reverse_sprite_order; int m_flipscreen; @@ -1276,27 +1289,27 @@ static ADDRESS_MAP_START( bnstars_map, AS_PROGRAM, 32, bnstars_state ) AM_RANGE(0xfce00058, 0xfce0005b) AM_WRITENOP AM_RANGE(0xfce0005c, 0xfce0005f) AM_WRITENOP - AM_RANGE(0xfce00400, 0xfce0045f) AM_WRITEONLY AM_BASE(m_ms32_roz_ctrl[0]) - AM_RANGE(0xfce00700, 0xfce0075f) AM_WRITEONLY AM_BASE(m_ms32_roz_ctrl[1]) // guess - AM_RANGE(0xfce00a00, 0xfce00a17) AM_WRITEONLY AM_BASE(m_ms32_tx0_scroll) - AM_RANGE(0xfce00a20, 0xfce00a37) AM_WRITEONLY AM_BASE(m_ms32_bg0_scroll) - AM_RANGE(0xfce00c00, 0xfce00c17) AM_WRITEONLY AM_BASE(m_ms32_tx1_scroll) - AM_RANGE(0xfce00c20, 0xfce00c37) AM_WRITEONLY AM_BASE(m_ms32_bg1_scroll) + AM_RANGE(0xfce00400, 0xfce0045f) AM_WRITEONLY AM_SHARE("roz_ctrl.0") + AM_RANGE(0xfce00700, 0xfce0075f) AM_WRITEONLY AM_SHARE("roz_ctrl.1") // guess + AM_RANGE(0xfce00a00, 0xfce00a17) AM_WRITEONLY AM_SHARE("tx0_scroll") + AM_RANGE(0xfce00a20, 0xfce00a37) AM_WRITEONLY AM_SHARE("bg0_scroll") + AM_RANGE(0xfce00c00, 0xfce00c17) AM_WRITEONLY AM_SHARE("tx1_scroll") + AM_RANGE(0xfce00c20, 0xfce00c37) AM_WRITEONLY AM_SHARE("bg1_scroll") AM_RANGE(0xfce00e00, 0xfce00e03) AM_WRITE(bnstars1_mahjong_select_w) // ? /* wrote together */ AM_RANGE(0xfd040000, 0xfd047fff) AM_RAM // priority ram AM_RANGE(0xfd080000, 0xfd087fff) AM_RAM - AM_RANGE(0xfd200000, 0xfd237fff) AM_RAM_WRITE(ms32_pal1_ram_w) AM_BASE(m_ms32_pal_ram[1]) - AM_RANGE(0xfd400000, 0xfd437fff) AM_RAM_WRITE(ms32_pal0_ram_w) AM_BASE(m_ms32_pal_ram[0]) - AM_RANGE(0xfe000000, 0xfe01ffff) AM_RAM_WRITE(ms32_roz1_ram_w) AM_BASE(m_ms32_roz1_ram) - AM_RANGE(0xfe400000, 0xfe41ffff) AM_RAM_WRITE(ms32_roz0_ram_w) AM_BASE(m_ms32_roz0_ram) - AM_RANGE(0xfe800000, 0xfe83ffff) AM_RAM_WRITE(ms32_spramx_w) AM_BASE(m_ms32_spram) - AM_RANGE(0xfea00000, 0xfea07fff) AM_RAM_WRITE(ms32_tx1_ram_w) AM_BASE(m_ms32_tx1_ram) - AM_RANGE(0xfea08000, 0xfea0ffff) AM_RAM_WRITE(ms32_bg1_ram_w) AM_BASE(m_ms32_bg1_ram) - AM_RANGE(0xfec00000, 0xfec07fff) AM_RAM_WRITE(ms32_tx0_ram_w) AM_BASE(m_ms32_tx0_ram) - AM_RANGE(0xfec08000, 0xfec0ffff) AM_RAM_WRITE(ms32_bg0_ram_w) AM_BASE(m_ms32_bg0_ram) + AM_RANGE(0xfd200000, 0xfd237fff) AM_RAM_WRITE(ms32_pal1_ram_w) AM_SHARE("pal_ram.1") + AM_RANGE(0xfd400000, 0xfd437fff) AM_RAM_WRITE(ms32_pal0_ram_w) AM_SHARE("pal_ram.0") + AM_RANGE(0xfe000000, 0xfe01ffff) AM_RAM_WRITE(ms32_roz1_ram_w) AM_SHARE("roz1_ram") + AM_RANGE(0xfe400000, 0xfe41ffff) AM_RAM_WRITE(ms32_roz0_ram_w) AM_SHARE("roz0_ram") + AM_RANGE(0xfe800000, 0xfe83ffff) AM_RAM_WRITE(ms32_spramx_w) AM_SHARE("spram") + AM_RANGE(0xfea00000, 0xfea07fff) AM_RAM_WRITE(ms32_tx1_ram_w) AM_SHARE("tx1_ram") + AM_RANGE(0xfea08000, 0xfea0ffff) AM_RAM_WRITE(ms32_bg1_ram_w) AM_SHARE("bg1_ram") + AM_RANGE(0xfec00000, 0xfec07fff) AM_RAM_WRITE(ms32_tx0_ram_w) AM_SHARE("tx0_ram") + AM_RANGE(0xfec08000, 0xfec0ffff) AM_RAM_WRITE(ms32_bg0_ram_w) AM_SHARE("bg0_ram") AM_RANGE(0xfee00000, 0xfee1ffff) AM_RAM AM_RANGE(0xffe00000, 0xffffffff) AM_ROMBANK("bank1") diff --git a/src/mame/drivers/hornet.c b/src/mame/drivers/hornet.c index b07b51b0501..61385f6cf81 100644 --- a/src/mame/drivers/hornet.c +++ b/src/mame/drivers/hornet.c @@ -327,12 +327,16 @@ class hornet_state : public driver_device { public: hornet_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_workram(*this, "workram"), + m_sharc_dataram0(*this, "share_dataram0"), + m_sharc_dataram1(*this, "share_dataram1") { } UINT8 m_led_reg0; UINT8 m_led_reg1; - UINT32 *m_workram; - UINT32 *m_sharc_dataram[2]; + required_shared_ptr m_workram; + required_shared_ptr m_sharc_dataram0; + required_shared_ptr m_sharc_dataram1; UINT8 *m_jvs_sdata; UINT32 m_jvs_sdata_ptr; emu_timer *m_sound_irq_timer; @@ -622,7 +626,7 @@ WRITE32_MEMBER(hornet_state::gun_w) /*****************************************************************************/ static ADDRESS_MAP_START( hornet_map, AS_PROGRAM, 32, hornet_state ) - AM_RANGE(0x00000000, 0x003fffff) AM_RAM AM_BASE(m_workram) /* Work RAM */ + AM_RANGE(0x00000000, 0x003fffff) AM_RAM AM_SHARE("workram") /* Work RAM */ AM_RANGE(0x74000000, 0x740000ff) AM_READWRITE(hornet_k037122_reg_r, hornet_k037122_reg_w) AM_RANGE(0x74020000, 0x7403ffff) AM_READWRITE(hornet_k037122_sram_r, hornet_k037122_sram_w) AM_RANGE(0x74040000, 0x7407ffff) AM_READWRITE(hornet_k037122_char_r, hornet_k037122_char_w) @@ -699,27 +703,27 @@ ADDRESS_MAP_END READ32_MEMBER(hornet_state::dsp_dataram0_r) { - return m_sharc_dataram[0][offset] & 0xffff; + return m_sharc_dataram0[offset] & 0xffff; } WRITE32_MEMBER(hornet_state::dsp_dataram0_w) { - m_sharc_dataram[0][offset] = data; + m_sharc_dataram0[offset] = data; } READ32_MEMBER(hornet_state::dsp_dataram1_r) { - return m_sharc_dataram[1][offset] & 0xffff; + return m_sharc_dataram1[offset] & 0xffff; } WRITE32_MEMBER(hornet_state::dsp_dataram1_w) { - m_sharc_dataram[1][offset] = data; + m_sharc_dataram1[offset] = data; } static ADDRESS_MAP_START( sharc0_map, AS_DATA, 32, hornet_state ) AM_RANGE(0x0400000, 0x041ffff) AM_READWRITE_LEGACY(cgboard_0_shared_sharc_r, cgboard_0_shared_sharc_w) - AM_RANGE(0x0500000, 0x05fffff) AM_READWRITE(dsp_dataram0_r, dsp_dataram0_w) AM_BASE(m_sharc_dataram[0]) + AM_RANGE(0x0500000, 0x05fffff) AM_READWRITE(dsp_dataram0_r, dsp_dataram0_w) AM_SHARE("sharc_dataram0") AM_RANGE(0x1400000, 0x14fffff) AM_RAM AM_RANGE(0x2400000, 0x27fffff) AM_DEVREADWRITE_LEGACY("voodoo0", voodoo_r, voodoo_w) AM_RANGE(0x3400000, 0x34000ff) AM_READWRITE_LEGACY(cgboard_0_comm_sharc_r, cgboard_0_comm_sharc_w) @@ -729,7 +733,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( sharc1_map, AS_DATA, 32, hornet_state ) AM_RANGE(0x0400000, 0x041ffff) AM_READWRITE_LEGACY(cgboard_1_shared_sharc_r, cgboard_1_shared_sharc_w) - AM_RANGE(0x0500000, 0x05fffff) AM_READWRITE(dsp_dataram1_r, dsp_dataram1_w) AM_BASE(m_sharc_dataram[1]) + AM_RANGE(0x0500000, 0x05fffff) AM_READWRITE(dsp_dataram1_r, dsp_dataram1_w) AM_SHARE("sharc_dataram1") AM_RANGE(0x1400000, 0x14fffff) AM_RAM AM_RANGE(0x2400000, 0x27fffff) AM_DEVREADWRITE_LEGACY("voodoo1", voodoo_r, voodoo_w) AM_RANGE(0x3400000, 0x34000ff) AM_READWRITE_LEGACY(cgboard_1_comm_sharc_r, cgboard_1_comm_sharc_w) diff --git a/src/mame/drivers/rabbit.c b/src/mame/drivers/rabbit.c index b388cee8c16..752c6909b0b 100644 --- a/src/mame/drivers/rabbit.c +++ b/src/mame/drivers/rabbit.c @@ -93,23 +93,32 @@ class rabbit_state : public driver_device { public: rabbit_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_viewregs0(*this, "viewregs0"), + m_viewregs6(*this, "viewregs6"), + m_viewregs7(*this, "viewregs7"), + m_viewregs9(*this, "viewregs9"), + m_viewregs10(*this, "viewregs10"), + m_tilemap_regs(*this, "tilemap_regs"), + m_spriteregs(*this, "spriteregs"), + m_blitterregs(*this, "blitterregs"), + m_spriteram(*this, "spriteram") { } - UINT32 *m_viewregs0; - UINT32 *m_viewregs6; - UINT32 *m_viewregs7; - UINT32 *m_viewregs9; - UINT32 *m_viewregs10; - UINT32 *m_tilemap_regs[4]; - UINT32 *m_spriteregs; - UINT32 *m_blitterregs; + required_shared_ptr m_viewregs0; + required_shared_ptr m_viewregs6; + required_shared_ptr m_viewregs7; + required_shared_ptr m_viewregs9; + required_shared_ptr m_viewregs10; + required_shared_ptr_array m_tilemap_regs; + required_shared_ptr m_spriteregs; + required_shared_ptr m_blitterregs; bitmap_ind16 *m_sprite_bitmap; rectangle m_sprite_clip; int m_vblirqlevel; int m_bltirqlevel; int m_banking; UINT32 *m_tilemap_ram[4]; - UINT32 *m_spriteram; + required_shared_ptr m_spriteram; tilemap_t *m_tilemap[4]; DECLARE_WRITE32_MEMBER(rabbit_tilemap0_w); DECLARE_WRITE32_MEMBER(rabbit_tilemap1_w); @@ -747,20 +756,20 @@ static ADDRESS_MAP_START( rabbit_map, AS_PROGRAM, 32, rabbit_state ) AM_RANGE(0x400980, 0x400983) AM_READ(randomrabbits) // sound chip status? AM_RANGE(0x400984, 0x400987) AM_READ(randomrabbits) // sound chip status? /* this lot are probably gfxchip/blitter etc. related */ - AM_RANGE(0x400010, 0x400013) AM_WRITEONLY AM_BASE(m_viewregs0 ) - AM_RANGE(0x400100, 0x400117) AM_WRITEONLY AM_BASE(m_tilemap_regs[0] ) // tilemap regs1 - AM_RANGE(0x400120, 0x400137) AM_WRITEONLY AM_BASE(m_tilemap_regs[1] ) // tilemap regs2 - AM_RANGE(0x400140, 0x400157) AM_WRITEONLY AM_BASE(m_tilemap_regs[2] ) // tilemap regs3 - AM_RANGE(0x400160, 0x400177) AM_WRITEONLY AM_BASE(m_tilemap_regs[3] ) // tilemap regs4 - AM_RANGE(0x400200, 0x40021b) AM_WRITEONLY AM_BASE(m_spriteregs ) // sprregs? + AM_RANGE(0x400010, 0x400013) AM_WRITEONLY AM_SHARE("viewregs0" ) + AM_RANGE(0x400100, 0x400117) AM_WRITEONLY AM_SHARE("tilemap_regs.0" ) // tilemap regs1 + AM_RANGE(0x400120, 0x400137) AM_WRITEONLY AM_SHARE("tilemap_regs.1" ) // tilemap regs2 + AM_RANGE(0x400140, 0x400157) AM_WRITEONLY AM_SHARE("tilemap_regs.2" ) // tilemap regs3 + AM_RANGE(0x400160, 0x400177) AM_WRITEONLY AM_SHARE("tilemap_regs.3" ) // tilemap regs4 + AM_RANGE(0x400200, 0x40021b) AM_WRITEONLY AM_SHARE("spriteregs" ) // sprregs? AM_RANGE(0x400300, 0x400303) AM_WRITE(rabbit_rombank_w) // used during rom testing, rombank/area select + something else? - AM_RANGE(0x400400, 0x400413) AM_WRITEONLY AM_BASE(m_viewregs6 ) // some global controls? (brightness etc.?) - AM_RANGE(0x400500, 0x400503) AM_WRITEONLY AM_BASE(m_viewregs7 ) - AM_RANGE(0x400700, 0x40070f) AM_WRITE(rabbit_blitter_w) AM_BASE(m_blitterregs ) - AM_RANGE(0x400800, 0x40080f) AM_WRITEONLY AM_BASE(m_viewregs9 ) // never changes? + AM_RANGE(0x400400, 0x400413) AM_WRITEONLY AM_SHARE("viewregs6" ) // some global controls? (brightness etc.?) + AM_RANGE(0x400500, 0x400503) AM_WRITEONLY AM_SHARE("viewregs7" ) + AM_RANGE(0x400700, 0x40070f) AM_WRITE(rabbit_blitter_w) AM_SHARE("blitterregs" ) + AM_RANGE(0x400800, 0x40080f) AM_WRITEONLY AM_SHARE("viewregs9" ) // never changes? AM_RANGE(0x400900, 0x40098f) AM_WRITE(rabbit_audio_w) /* hmm */ - AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE(m_viewregs10 ) + AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_SHARE("viewregs10" ) AM_RANGE(0x440000, 0x47ffff) AM_ROMBANK("bank1") // data (gfx / sound) rom readback for ROM testing /* tilemaps */ @@ -768,7 +777,7 @@ static ADDRESS_MAP_START( rabbit_map, AS_PROGRAM, 32, rabbit_state ) AM_RANGE(0x484000, 0x487fff) AM_READWRITE(rabbit_tilemap1_r,rabbit_tilemap1_w) AM_RANGE(0x488000, 0x48bfff) AM_READWRITE(rabbit_tilemap2_r,rabbit_tilemap2_w) AM_RANGE(0x48c000, 0x48ffff) AM_READWRITE(rabbit_tilemap3_r,rabbit_tilemap3_w) - AM_RANGE(0x494000, 0x497fff) AM_RAM AM_BASE(m_spriteram) // sprites? + AM_RANGE(0x494000, 0x497fff) AM_RAM AM_SHARE("spriteram") // sprites? AM_RANGE(0x4a0000, 0x4affff) AM_RAM_WRITE(rabbit_paletteram_dword_w) AM_SHARE("paletteram") AM_RANGE(0xff0000, 0xffffff) AM_RAM ADDRESS_MAP_END diff --git a/src/mame/drivers/tmmjprd.c b/src/mame/drivers/tmmjprd.c index cb047523b96..d089d29a0ff 100644 --- a/src/mame/drivers/tmmjprd.c +++ b/src/mame/drivers/tmmjprd.c @@ -39,12 +39,15 @@ class tmmjprd_state : public driver_device { public: tmmjprd_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_tilemap_regs(*this, "tilemap_regs"), + m_spriteregs(*this, "spriteregs"), + m_spriteram(*this, "spriteram") { } - UINT32 *m_tilemap_regs[4]; - UINT32 *m_spriteregs; + required_shared_ptr_array m_tilemap_regs; + required_shared_ptr m_spriteregs; UINT32 *m_tilemap_ram[4]; - UINT32 *m_spriteram; + required_shared_ptr m_spriteram; UINT8 m_mux_data; UINT8 m_system_in; double m_old_brt1; @@ -672,11 +675,11 @@ static ADDRESS_MAP_START( tmmjprd_map, AS_PROGRAM, 32, tmmjprd_state ) AM_RANGE(0x200984, 0x200987) AM_READ(randomtmmjprds) // sound chip status? /* check these are used .. */ // AM_RANGE(0x200010, 0x200013) AM_WRITEONLY AM_BASE_LEGACY(&tmmjprd_viewregs0 ) - AM_RANGE(0x200100, 0x200117) AM_WRITEONLY AM_BASE(m_tilemap_regs[0] ) // tilemap regs1 - AM_RANGE(0x200120, 0x200137) AM_WRITEONLY AM_BASE(m_tilemap_regs[1] ) // tilemap regs2 - AM_RANGE(0x200140, 0x200157) AM_WRITEONLY AM_BASE(m_tilemap_regs[2] ) // tilemap regs3 - AM_RANGE(0x200160, 0x200177) AM_WRITEONLY AM_BASE(m_tilemap_regs[3] ) // tilemap regs4 - AM_RANGE(0x200200, 0x20021b) AM_WRITEONLY AM_BASE(m_spriteregs ) // sprregs? + AM_RANGE(0x200100, 0x200117) AM_WRITEONLY AM_SHARE("tilemap_regs.0" ) // tilemap regs1 + AM_RANGE(0x200120, 0x200137) AM_WRITEONLY AM_SHARE("tilemap_regs.1" ) // tilemap regs2 + AM_RANGE(0x200140, 0x200157) AM_WRITEONLY AM_SHARE("tilemap_regs.2" ) // tilemap regs3 + AM_RANGE(0x200160, 0x200177) AM_WRITEONLY AM_SHARE("tilemap_regs.3" ) // tilemap regs4 + AM_RANGE(0x200200, 0x20021b) AM_WRITEONLY AM_SHARE("spriteregs" ) // sprregs? // AM_RANGE(0x200300, 0x200303) AM_WRITE_LEGACY(tmmjprd_rombank_w) // used during rom testing, rombank/area select + something else? AM_RANGE(0x20040c, 0x20040f) AM_WRITE(tmmjprd_brt_1_w) AM_RANGE(0x200410, 0x200413) AM_WRITE(tmmjprd_brt_2_w) @@ -692,7 +695,7 @@ static ADDRESS_MAP_START( tmmjprd_map, AS_PROGRAM, 32, tmmjprd_state ) AM_RANGE(0x288000, 0x28bfff) AM_READWRITE(tmmjprd_tilemap2_r,tmmjprd_tilemap2_w) AM_RANGE(0x28c000, 0x28ffff) AM_READWRITE(tmmjprd_tilemap3_r,tmmjprd_tilemap3_w) /* ?? is palette ram shared with sprites in this case or just a different map */ - AM_RANGE(0x290000, 0x29bfff) AM_RAM AM_BASE(m_spriteram) + AM_RANGE(0x290000, 0x29bfff) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x29c000, 0x29ffff) AM_RAM_WRITE(tmmjprd_paletteram_dword_w) AM_SHARE("paletteram") AM_RANGE(0x400000, 0x400003) AM_READ(tmmjprd_mux_r) AM_DEVWRITE_LEGACY("eeprom", tmmjprd_eeprom_write)