Added generic latch to replace soundlatch in driver_device (nw)

This commit is contained in:
Miodrag Milanovic 2016-04-18 14:08:54 +02:00
parent 8a07dafbaf
commit c47bd3a937
5 changed files with 249 additions and 0 deletions

View File

@ -2750,3 +2750,15 @@ if (MACHINES["GENPC"]~=null) then
MAME_DIR .. "src/devices/machine/genpc.h",
}
end
---------------------------------------------------
--
--@src/devices/machine/gen_latch.h,MACHINES["GEN_LATCH] = true
---------------------------------------------------
if (MACHINES["GEN_LATCH"]~=null) then
files {
MAME_DIR .. "src/devices/machine/gen_latch.cpp",
MAME_DIR .. "src/devices/machine/gen_latch.h",
}
end

View File

@ -566,6 +566,7 @@ MACHINES["STEPPERS"] = true
MACHINES["PCI9050"] = true
--MACHINES["TMS1024"] = true
MACHINES["GENPC"] = true
MACHINES["GEN_LATCH"] = true
--------------------------------------------------
-- specify available bus cores

View File

@ -574,6 +574,7 @@ MACHINES["TMS1024"] = true
MACHINES["NSC810"] = true
MACHINES["VT82C496"] = true
MACHINES["GENPC"] = true
MACHINES["GEN_LATCH"] = true
--------------------------------------------------
-- specify available bus cores

View File

@ -0,0 +1,155 @@
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************
Generic 8bit and 16 bit latch devices
***************************************************************************/
#include "emu.h"
#include "gen_latch.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type GENERIC_LATCH_8 = &device_creator<generic_latch_8_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// generic_latch_8_device - constructor
//-------------------------------------------------
generic_latch_8_device::generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, GENERIC_LATCH_8, "Generic 8-bit latch", tag, owner, clock, "generic_latch_8", __FILE__),
m_latched_value(0),
m_latch_read(0)
{
}
READ8_MEMBER( generic_latch_8_device::read )
{
m_latch_read = 1;
return m_latched_value;
}
WRITE8_MEMBER( generic_latch_8_device::write )
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(generic_latch_8_device::sync_callback), this), data);
}
WRITE_LINE_MEMBER( generic_latch_8_device::preset_w )
{
m_latched_value = 0xff;
}
WRITE_LINE_MEMBER( generic_latch_8_device::clear_w )
{
m_latched_value = 0x00;
}
//-------------------------------------------------
// soundlatch_sync_callback - time-delayed
// callback to set a latch value
//-------------------------------------------------
void generic_latch_8_device::sync_callback(void *ptr, INT32 param)
{
UINT8 value = param;
// if the latch hasn't been read and the value is changed, log a warning
if (!m_latch_read && m_latched_value != value)
logerror("Warning: latch %s written before being read. Previous: %02x, new: %02x\n", tag(), m_latched_value, value);
// store the new value and mark it not read
m_latched_value = value;
m_latch_read = 0;
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void generic_latch_8_device::device_start()
{
// register for state saving
save_item(NAME(m_latched_value));
save_item(NAME(m_latch_read));
}
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type GENERIC_LATCH_16 = &device_creator<generic_latch_16_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// generic_latch_16_device - constructor
//-------------------------------------------------
generic_latch_16_device::generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, GENERIC_LATCH_16, "Generic 16-bit latch", tag, owner, clock, "generic_latch_16", __FILE__),
m_latched_value(0),
m_latch_read(0)
{
}
READ16_MEMBER( generic_latch_16_device::read )
{
m_latch_read = 1;
return m_latched_value;
}
WRITE16_MEMBER( generic_latch_16_device::write )
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(generic_latch_16_device::sync_callback), this), data);
}
WRITE_LINE_MEMBER( generic_latch_16_device::preset_w )
{
m_latched_value = 0xffff;
}
WRITE_LINE_MEMBER( generic_latch_16_device::clear_w )
{
m_latched_value = 0x0000;
}
//-------------------------------------------------
// soundlatch_sync_callback - time-delayed
// callback to set a latch value
//-------------------------------------------------
void generic_latch_16_device::sync_callback(void *ptr, INT32 param)
{
UINT16 value = param;
// if the latch hasn't been read and the value is changed, log a warning
if (!m_latch_read && m_latched_value != value)
logerror("Warning: latch %s written before being read. Previous: %02x, new: %02x\n", tag(), m_latched_value, value);
// store the new value and mark it not read
m_latched_value = value;
m_latch_read = 0;
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void generic_latch_16_device::device_start()
{
// register for state saving
save_item(NAME(m_latched_value));
save_item(NAME(m_latch_read));
}

View File

@ -0,0 +1,80 @@
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************
Generic 8bit and 16 bit latch devices
***************************************************************************/
#pragma once
#ifndef __GEN_LATCH_H__
#define __GEN_LATCH_H__
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_GENERIC_LATCH_8_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, GENERIC_LATCH_8, 0)
#define MCFG_GENERIC_LATCH_16_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, GENERIC_LATCH_16, 0)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> generic_latch_8_device
class generic_latch_8_device : public device_t
{
public:
// construction/destruction
generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( preset_w );
DECLARE_WRITE_LINE_MEMBER( clear_w );
protected:
virtual void device_start() override;
void sync_callback(void *ptr, INT32 param);
private:
UINT16 m_latched_value;
UINT8 m_latch_read;
};
// device type definition
extern const device_type GENERIC_LATCH_8;
// ======================> generic_latch_16_device
class generic_latch_16_device : public device_t
{
public:
// construction/destruction
generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_READ16_MEMBER( read );
DECLARE_WRITE16_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( preset_w );
DECLARE_WRITE_LINE_MEMBER( clear_w );
protected:
virtual void device_start() override;
void sync_callback(void *ptr, INT32 param);
private:
UINT16 m_latched_value;
UINT8 m_latch_read;
};
// device type definition
extern const device_type GENERIC_LATCH_16;
#endif /* __GEN_LATCH_H__ */