summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/devlegcy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/devlegcy.c')
-rw-r--r--src/emu/devlegcy.c332
1 files changed, 332 insertions, 0 deletions
diff --git a/src/emu/devlegcy.c b/src/emu/devlegcy.c
new file mode 100644
index 00000000000..1caaaeada8d
--- /dev/null
+++ b/src/emu/devlegcy.c
@@ -0,0 +1,332 @@
+/***************************************************************************
+
+ devlegcy.c
+
+ Legacy device helpers.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "devlegcy.h"
+
+
+//**************************************************************************
+// LEGACY DEVICE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_device_config_base - constructor
+//-------------------------------------------------
+
+legacy_device_config_base::legacy_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config)
+ : device_config(mconfig, type, tag, owner, clock),
+ m_get_config_func(get_config),
+ m_inline_config(NULL)
+{
+ // allocate a buffer for the inline configuration
+ UINT32 configlen = (UINT32)get_legacy_config_int(DEVINFO_INT_INLINE_CONFIG_BYTES);
+ if (configlen != 0)
+ m_inline_config = global_alloc_array_clear(UINT8, configlen);
+}
+
+
+//-------------------------------------------------
+// ~legacy_device_config_base - destructor
+//-------------------------------------------------
+
+legacy_device_config_base::~legacy_device_config_base()
+{
+ global_free(m_inline_config);
+}
+
+
+//-------------------------------------------------
+// get_legacy_config_int - return a legacy
+// configuration parameter as an integer
+//-------------------------------------------------
+
+INT64 legacy_device_config_base::get_legacy_config_int(UINT32 state) const
+{
+ deviceinfo info = { 0 };
+ (*m_get_config_func)(this, state, &info);
+ return info.i;
+}
+
+
+//-------------------------------------------------
+// get_legacy_config_ptr - return a legacy
+// configuration parameter as a pointer
+//-------------------------------------------------
+
+void *legacy_device_config_base::get_legacy_config_ptr(UINT32 state) const
+{
+ deviceinfo info = { 0 };
+ (*m_get_config_func)(this, state, &info);
+ return info.p;
+}
+
+
+//-------------------------------------------------
+// get_legacy_config_fct - return a legacy
+// configuration parameter as a function pointer
+//-------------------------------------------------
+
+genf *legacy_device_config_base::get_legacy_config_fct(UINT32 state) const
+{
+ deviceinfo info = { 0 };
+ (*m_get_config_func)(this, state, &info);
+ return info.f;
+}
+
+
+//-------------------------------------------------
+// get_legacy_config_string - return a legacy
+// configuration parameter as a string pointer
+//-------------------------------------------------
+
+const char *legacy_device_config_base::get_legacy_config_string(UINT32 state) const
+{
+ deviceinfo info;
+ info.s = get_temp_string_buffer();
+ (*m_get_config_func)(this, state, &info);
+ return info.s;
+}
+
+
+
+//**************************************************************************
+// LIVE LEGACY DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_device_base - constructor
+//-------------------------------------------------
+
+legacy_device_base::legacy_device_base(running_machine &_machine, const device_config &config)
+ : device_t(_machine, config),
+ m_config(downcast<const legacy_device_config_base &>(config)),
+ m_token(NULL)
+{
+ int tokenbytes = m_config.get_legacy_config_int(DEVINFO_INT_TOKEN_BYTES);
+ if (tokenbytes != 0)
+ m_token = auto_alloc_array_clear(machine, UINT8, tokenbytes);
+}
+
+
+//-------------------------------------------------
+// ~legacy_device_base - destructor
+//-------------------------------------------------
+
+legacy_device_base::~legacy_device_base()
+{
+ if (m_started)
+ {
+ device_stop_func stop_func = reinterpret_cast<device_stop_func>(m_config.get_legacy_config_fct(DEVINFO_FCT_STOP));
+ if (stop_func != NULL)
+ (*stop_func)(this);
+ }
+}
+
+
+//-------------------------------------------------
+// device_start - called to start up a device
+//-------------------------------------------------
+
+void legacy_device_base::device_start()
+{
+ device_start_func start_func = reinterpret_cast<device_start_func>(m_config.get_legacy_config_fct(DEVINFO_FCT_START));
+ assert(start_func != NULL);
+ (*start_func)(this);
+}
+
+
+//-------------------------------------------------
+// device_reset - called to reset a device
+//-------------------------------------------------
+
+void legacy_device_base::device_reset()
+{
+ device_reset_func reset_func = reinterpret_cast<device_reset_func>(m_config.get_legacy_config_fct(DEVINFO_FCT_RESET));
+ if (reset_func != NULL)
+ (*reset_func)(this);
+}
+
+
+
+//**************************************************************************
+// LEGACY SOUND DEVICE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_sound_device_config_base - constructor
+//-------------------------------------------------
+
+legacy_sound_device_config_base::legacy_sound_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config)
+ : legacy_device_config_base(mconfig, type, tag, owner, clock, get_config),
+ device_config_sound_interface(mconfig, *this)
+{
+}
+
+
+
+//**************************************************************************
+// LIVE LEGACY SOUND DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_sound_device_base - constructor
+//-------------------------------------------------
+
+legacy_sound_device_base::legacy_sound_device_base(running_machine &machine, const device_config &config)
+ : legacy_device_base(machine, config),
+ device_sound_interface(machine, config, *this)
+{
+}
+
+
+
+//**************************************************************************
+// LEGACY MEMORY DEVICE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_memory_device_config_base - constructor
+//-------------------------------------------------
+
+legacy_memory_device_config_base::legacy_memory_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config)
+ : legacy_device_config_base(mconfig, type, tag, owner, clock, get_config),
+ device_config_memory_interface(mconfig, *this)
+{
+ memset(&m_space_config, 0, sizeof(m_space_config));
+}
+
+
+//-------------------------------------------------
+// device_config_complete - update configuration
+// based on completed device setup
+//-------------------------------------------------
+
+void legacy_memory_device_config_base::device_config_complete()
+{
+ m_space_config.m_name = "memory";
+ m_space_config.m_endianness = static_cast<endianness_t>(get_legacy_config_int(DEVINFO_INT_ENDIANNESS));
+ m_space_config.m_databus_width = get_legacy_config_int(DEVINFO_INT_DATABUS_WIDTH);
+ m_space_config.m_addrbus_width = get_legacy_config_int(DEVINFO_INT_ADDRBUS_WIDTH);
+ m_space_config.m_addrbus_shift = get_legacy_config_int(DEVINFO_INT_ADDRBUS_SHIFT);
+ m_space_config.m_logaddr_width = m_space_config.m_addrbus_width;
+ m_space_config.m_page_shift = 0;
+ m_space_config.m_internal_map = reinterpret_cast<const addrmap_token *>(get_legacy_config_ptr(DEVINFO_PTR_INTERNAL_MEMORY_MAP));
+ m_space_config.m_default_map = reinterpret_cast<const addrmap_token *>(get_legacy_config_ptr(DEVINFO_PTR_DEFAULT_MEMORY_MAP));
+}
+
+
+
+//**************************************************************************
+// LIVE LEGACY MEMORY DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_memory_device_base - constructor
+//-------------------------------------------------
+
+legacy_memory_device_base::legacy_memory_device_base(running_machine &machine, const device_config &config)
+ : legacy_device_base(machine, config),
+ device_memory_interface(machine, config, *this)
+{
+}
+
+
+
+//**************************************************************************
+// LEGACY NVRAM DEVICE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_nvram_device_config_base - constructor
+//-------------------------------------------------
+
+legacy_nvram_device_config_base::legacy_nvram_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config)
+ : legacy_device_config_base(mconfig, type, tag, owner, clock, get_config),
+ device_config_nvram_interface(mconfig, *this)
+{
+}
+
+
+
+//**************************************************************************
+// LIVE LEGACY NVRAM DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// legacy_nvram_device_base - constructor
+//-------------------------------------------------
+
+legacy_nvram_device_base::legacy_nvram_device_base(running_machine &machine, const device_config &config)
+ : legacy_device_base(machine, config),
+ device_nvram_interface(machine, config, *this)
+{
+}
+
+
+//-------------------------------------------------
+// nvram_default - generate the default NVRAM
+//-------------------------------------------------
+
+void legacy_nvram_device_base::nvram_default()
+{
+ device_nvram_func nvram_func = reinterpret_cast<device_nvram_func>(m_config.get_legacy_config_fct(DEVINFO_FCT_NVRAM));
+ (*nvram_func)(this, NULL, FALSE);
+}
+
+
+//-------------------------------------------------
+// nvram_read - read NVRAM from the given file
+//-------------------------------------------------
+
+void legacy_nvram_device_base::nvram_read(mame_file &file)
+{
+ device_nvram_func nvram_func = reinterpret_cast<device_nvram_func>(m_config.get_legacy_config_fct(DEVINFO_FCT_NVRAM));
+ (*nvram_func)(this, &file, FALSE);
+}
+
+
+//-------------------------------------------------
+// nvram_write - write NVRAM to the given file
+//-------------------------------------------------
+
+void legacy_nvram_device_base::nvram_write(mame_file &file)
+{
+ device_nvram_func nvram_func = reinterpret_cast<device_nvram_func>(m_config.get_legacy_config_fct(DEVINFO_FCT_NVRAM));
+ (*nvram_func)(this, &file, TRUE);
+}