mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
-netlist: Added shared RAM pointer, for use by netlist RAM devices which need updating by non-netlist driver code. [Ryan Holtz]
-netlist: Added new devices: [Ryan Holtz] * Intel 2102A 1Kbit (1024 x 1) Static RAM * 74365 Hex Bus Driver with 3-State Outputs * Generic 2- and 3-terminal Tristate device * Note: Tristate device and 74365 do not actually tristate, they are simply a way of combining multiple outputs + chip enables.
This commit is contained in:
parent
ac56130251
commit
66abfa8e6d
@ -91,6 +91,8 @@ project "netlist"
|
||||
MAME_DIR .. "src/lib/netlist/solver/nld_ms_w.h",
|
||||
MAME_DIR .. "src/lib/netlist/solver/nld_ms_direct_lu.h",
|
||||
MAME_DIR .. "src/lib/netlist/solver/vector_base.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_2102A.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_2102A.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_2716.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_2716.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_4020.cpp",
|
||||
@ -131,6 +133,8 @@ project "netlist"
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74193.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74279.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74279.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74365.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74365.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74ls629.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_74ls629.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_82S16.cpp",
|
||||
@ -153,6 +157,8 @@ project "netlist"
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_mm5837.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_r2r_dac.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_r2r_dac.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_tristate.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_tristate.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_legacy.cpp",
|
||||
MAME_DIR .. "src/lib/netlist/devices/nld_legacy.h",
|
||||
MAME_DIR .. "src/lib/netlist/devices/net_lib.cpp",
|
||||
|
@ -29,6 +29,7 @@ const device_type NETLIST_SOUND = &device_creator<netlist_mame_sound_device_t>;
|
||||
const device_type NETLIST_ANALOG_INPUT = &device_creator<netlist_mame_analog_input_t>;
|
||||
const device_type NETLIST_INT_INPUT = &device_creator<netlist_mame_int_input_t>;
|
||||
const device_type NETLIST_ROM_REGION = &device_creator<netlist_mame_rom_t>;
|
||||
const device_type NETLIST_RAM_POINTER = &device_creator<netlist_ram_pointer_t>;
|
||||
const device_type NETLIST_LOGIC_INPUT = &device_creator<netlist_mame_logic_input_t>;
|
||||
const device_type NETLIST_STREAM_INPUT = &device_creator<netlist_mame_stream_input_t>;
|
||||
|
||||
@ -181,37 +182,74 @@ void netlist_mame_logic_input_t::device_start()
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// netlist_mame_rom_region_t
|
||||
// netlist_mame_rom_t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
netlist_mame_rom_t::netlist_mame_rom_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, NETLIST_ROM_REGION, "Netlist ROM Region", tag, owner, clock, "netlist_rom_region", __FILE__)
|
||||
, netlist_mame_sub_interface(*owner)
|
||||
, m_param(nullptr)
|
||||
, m_param_name("")
|
||||
, m_rom_tag(nullptr)
|
||||
, m_rom(nullptr)
|
||||
, m_data_tag(nullptr)
|
||||
, m_data(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
void netlist_mame_rom_t::static_set_params(device_t &device, const char *param_name, const char* region_tag)
|
||||
void netlist_mame_rom_t::static_set_params(device_t &device, const char *param_name, const char* data_tag)
|
||||
{
|
||||
netlist_mame_rom_t &netlist = downcast<netlist_mame_rom_t &>(device);
|
||||
netlist_mame_rom_t &netlist = downcast<netlist_mame_rom_t&>(device);
|
||||
LOG_DEV_CALLS(("static_set_params %s\n", device.tag()));
|
||||
netlist.m_param_name = param_name;
|
||||
netlist.m_rom_tag = region_tag;
|
||||
netlist.m_data_tag = data_tag;
|
||||
}
|
||||
|
||||
void netlist_mame_rom_t::device_start()
|
||||
{
|
||||
LOG_DEV_CALLS(("start %s\n", tag()));
|
||||
netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(m_param_name);
|
||||
m_param = dynamic_cast<netlist::param_rom_t *>(p);
|
||||
m_param = dynamic_cast<netlist::param_ptr_t *>(p);
|
||||
if (m_param == nullptr)
|
||||
{
|
||||
fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
|
||||
}
|
||||
|
||||
m_rom = memregion(m_rom_tag)->base();
|
||||
if (memregion(m_data_tag) != nullptr)
|
||||
m_data = memregion(m_data_tag)->base();
|
||||
|
||||
m_param->setTo(m_data);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// netlist_ram_pointer_t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
netlist_ram_pointer_t::netlist_ram_pointer_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, NETLIST_RAM_POINTER, "Netlist RAM Pointer", tag, owner, clock, "netlist_ram_pointer", __FILE__)
|
||||
, netlist_mame_sub_interface(*owner)
|
||||
, m_param(nullptr)
|
||||
, m_param_name("")
|
||||
, m_data(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
void netlist_ram_pointer_t::static_set_params(device_t &device, const char *param_name)
|
||||
{
|
||||
netlist_ram_pointer_t &netlist = downcast<netlist_ram_pointer_t&>(device);
|
||||
LOG_DEV_CALLS(("static_set_params %s\n", device.tag()));
|
||||
netlist.m_param_name = param_name;
|
||||
}
|
||||
|
||||
void netlist_ram_pointer_t::device_start()
|
||||
{
|
||||
LOG_DEV_CALLS(("start %s\n", tag()));
|
||||
netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(m_param_name);
|
||||
m_param = dynamic_cast<netlist::param_ptr_t *>(p);
|
||||
if (m_param == nullptr)
|
||||
{
|
||||
fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
|
||||
}
|
||||
|
||||
m_data = (*m_param)();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
@ -43,9 +43,13 @@
|
||||
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \
|
||||
netlist_mame_int_input_t::static_set_params(*device, _name, _mask, _shift);
|
||||
|
||||
#define MCFG_NETLIST_ROM(_basetag, _tag, _name, _region) \
|
||||
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ROM_REGION, 0, _region) \
|
||||
netlist_mame_rom_t::static_set_params(*device, _name);
|
||||
#define MCFG_NETLIST_ROM_REGION(_basetag, _tag, _name, _region) \
|
||||
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ROM_REGION, 0) \
|
||||
netlist_mame_rom_t::static_set_params(*device, _name ".m_ROM", ":" _region);
|
||||
|
||||
#define MCFG_NETLIST_RAM_POINTER(_basetag, _tag, _name) \
|
||||
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_RAM_POINTER, 0) \
|
||||
netlist_ram_pointer_t::static_set_params(*device, _name ".m_RAM");
|
||||
|
||||
#define MCFG_NETLIST_STREAM_INPUT(_basetag, _chan, _name) \
|
||||
MCFG_DEVICE_ADD(_basetag ":cin" # _chan, NETLIST_STREAM_INPUT, 0) \
|
||||
@ -413,7 +417,6 @@ private:
|
||||
netlist_analog_output_delegate m_delegate;
|
||||
};
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// netlist_mame_int_input_t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
@ -510,8 +513,8 @@ private:
|
||||
// netlist_mame_rom_t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
class netlist_mame_rom_t : public device_t,
|
||||
public netlist_mame_sub_interface
|
||||
class netlist_mame_rom_t : public device_t,
|
||||
public netlist_mame_sub_interface
|
||||
{
|
||||
public:
|
||||
|
||||
@ -526,14 +529,45 @@ protected:
|
||||
virtual void device_start() override;
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override
|
||||
{
|
||||
m_param->setTo(m_rom);
|
||||
m_param->setTo(m_data);
|
||||
}
|
||||
|
||||
private:
|
||||
netlist::param_rom_t *m_param;
|
||||
netlist::param_ptr_t *m_param;
|
||||
pstring m_param_name;
|
||||
const char* m_rom_tag;
|
||||
uint8_t* m_rom;
|
||||
const char* m_data_tag;
|
||||
uint8_t* m_data;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// netlist_ram_pointer_t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
class netlist_ram_pointer_t: public device_t,
|
||||
public netlist_mame_sub_interface
|
||||
{
|
||||
public:
|
||||
|
||||
// construction/destruction
|
||||
netlist_ram_pointer_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
virtual ~netlist_ram_pointer_t() { }
|
||||
|
||||
uint8_t* ptr() const { return m_data; }
|
||||
|
||||
static void static_set_params(device_t &device, const char *param_name);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override
|
||||
{
|
||||
m_data = (*m_param)();
|
||||
}
|
||||
|
||||
private:
|
||||
netlist::param_ptr_t *m_param;
|
||||
pstring m_param_name;
|
||||
uint8_t* m_data;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
@ -796,10 +830,9 @@ extern const device_type NETLIST_ANALOG_INPUT;
|
||||
extern const device_type NETLIST_LOGIC_INPUT;
|
||||
extern const device_type NETLIST_INT_INPUT;
|
||||
extern const device_type NETLIST_ROM_REGION;
|
||||
extern const device_type NETLIST_RAM_POINTER;
|
||||
|
||||
extern const device_type NETLIST_ANALOG_OUTPUT;
|
||||
//extern const device_type NETLIST_LOGIC_OUTPUT;
|
||||
extern const device_type NETLIST_INT_OUTPUT;
|
||||
extern const device_type NETLIST_STREAM_INPUT;
|
||||
extern const device_type NETLIST_STREAM_OUTPUT;
|
||||
|
||||
|
@ -66,6 +66,7 @@ NLOBJS := \
|
||||
$(NLOBJ)/analog/nld_switches.o \
|
||||
$(NLOBJ)/analog/nld_twoterm.o \
|
||||
$(NLOBJ)/analog/nld_opamps.o \
|
||||
$(NLOBJ)/devices/nld_2102A.o \
|
||||
$(NLOBJ)/devices/nld_2716.o \
|
||||
$(NLOBJ)/devices/nld_4020.o \
|
||||
$(NLOBJ)/devices/nld_4066.o \
|
||||
@ -86,6 +87,7 @@ NLOBJS := \
|
||||
$(NLOBJ)/devices/nld_74192.o \
|
||||
$(NLOBJ)/devices/nld_74193.o \
|
||||
$(NLOBJ)/devices/nld_74279.o \
|
||||
$(NLOBJ)/devices/nld_74365.o \
|
||||
$(NLOBJ)/devices/nld_74ls629.o \
|
||||
$(NLOBJ)/devices/nld_82S16.o \
|
||||
$(NLOBJ)/devices/nld_82S126.o \
|
||||
@ -97,6 +99,7 @@ NLOBJS := \
|
||||
$(NLOBJ)/devices/nld_mm5837.o \
|
||||
$(NLOBJ)/devices/nld_ne555.o \
|
||||
$(NLOBJ)/devices/nld_r2r_dac.o \
|
||||
$(NLOBJ)/devices/nld_tristate.o \
|
||||
$(NLOBJ)/devices/nld_legacy.o \
|
||||
$(NLOBJ)/devices/net_lib.o \
|
||||
$(NLOBJ)/devices/nld_log.o \
|
||||
|
@ -107,6 +107,7 @@ static void initialize_factory(factory_list_t &factory)
|
||||
ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R")
|
||||
ENTRYX(nicDelay, NETDEV_DELAY, "-")
|
||||
ENTRYX(2716, EPROM_2716, "-")
|
||||
ENTRYX(2102A, RAM_2102A, "-")
|
||||
ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,B,C,D")
|
||||
ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ")
|
||||
ENTRYX(7473, TTL_7473, "+CLK1,J1,K1,CLRQ1,CLK2,J2,K2,CLRQ2")
|
||||
@ -125,6 +126,7 @@ static void initialize_factory(factory_list_t &factory)
|
||||
ENTRYX(74175, TTL_74175, "-")
|
||||
ENTRYX(74192, TTL_74192, "-")
|
||||
ENTRYX(74193, TTL_74193, "-")
|
||||
ENTRYX(74365, TTL_74365, "-")
|
||||
ENTRYX(DM9334, TTL_DM9334, "-")
|
||||
//ENTRY(74279, TTL_74279, "-") // only dip available
|
||||
ENTRYX(SN74LS629, SN74LS629, "CAP")
|
||||
@ -141,6 +143,9 @@ static void initialize_factory(factory_list_t &factory)
|
||||
//ENTRY(4066, CD_4066, "+A,B")
|
||||
ENTRYX(NE555, NE555, "-")
|
||||
ENTRYX(r2r_dac, R2R_DAC, "+VIN,R,N")
|
||||
ENTRYX(tristate, TTL_TRISTATE, "-")
|
||||
ENTRYX(tristate3, TTL_TRISTATE3, "-")
|
||||
ENTRYX(2102A_dip, RAM_2102A_DIP, "-")
|
||||
ENTRYX(2716_dip, EPROM_2716_DIP, "-")
|
||||
ENTRYX(4538_dip, CD4538_DIP, "-")
|
||||
ENTRYX(7448_dip, TTL_7448_DIP, "-")
|
||||
@ -161,6 +166,7 @@ static void initialize_factory(factory_list_t &factory)
|
||||
ENTRYX(74192_dip, TTL_74192_DIP, "-")
|
||||
ENTRYX(74193_dip, TTL_74193_DIP, "-")
|
||||
ENTRYX(74279_dip, TTL_74279_DIP, "-")
|
||||
ENTRYX(74365_dip, TTL_74365_DIP, "-")
|
||||
ENTRYX(82S16_dip, TTL_82S16_DIP, "-")
|
||||
ENTRYX(82S126_dip, TTL_82S126_DIP, "-")
|
||||
ENTRYX(9602_dip, TTL_9602_DIP, "-")
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "nl_base.h"
|
||||
#include "nld_system.h"
|
||||
|
||||
#include "nld_2102A.h"
|
||||
#include "nld_2716.h"
|
||||
#include "nld_4020.h"
|
||||
#include "nld_4066.h"
|
||||
@ -34,6 +35,7 @@
|
||||
#include "nld_74192.h"
|
||||
#include "nld_74193.h"
|
||||
#include "nld_74279.h"
|
||||
#include "nld_74365.h"
|
||||
#include "nld_74ls629.h"
|
||||
#include "nld_82S16.h"
|
||||
#include "nld_82S126.h"
|
||||
@ -49,6 +51,8 @@
|
||||
|
||||
#include "nld_r2r_dac.h"
|
||||
|
||||
#include "nld_tristate.h"
|
||||
|
||||
#include "nld_log.h"
|
||||
|
||||
#include "macro/nlm_cd4xxx.h"
|
||||
|
103
src/lib/netlist/devices/nld_2102A.cpp
Normal file
103
src/lib/netlist/devices/nld_2102A.cpp
Normal file
@ -0,0 +1,103 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Ryan Holtz
|
||||
/*
|
||||
* nld_2102A.cpp
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nld_2102A.h"
|
||||
|
||||
#define ADDR2BYTE(a) ((a) >> 3)
|
||||
#define ADDR2BIT(a) ((a) & 0x7)
|
||||
|
||||
namespace netlist
|
||||
{
|
||||
namespace devices
|
||||
{
|
||||
NETLIB_OBJECT(2102A)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR(2102A)
|
||||
, m_A(*this, {{"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9" }})
|
||||
, m_CEQ(*this, "CEQ")
|
||||
, m_RWQ(*this, "RWQ")
|
||||
, m_DI(*this, "DI")
|
||||
, m_DO(*this, "DO")
|
||||
, m_ram(*this, "m_ram", 0)
|
||||
, m_RAM(*this, "m_RAM", &m_ram[0])
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_RESETI();
|
||||
NETLIB_UPDATEI();
|
||||
|
||||
protected:
|
||||
object_array_t<logic_input_t, 10> m_A;
|
||||
logic_input_t m_CEQ;
|
||||
logic_input_t m_RWQ;
|
||||
logic_input_t m_DI;
|
||||
|
||||
logic_output_t m_DO;
|
||||
|
||||
state_var<uint_fast8_t[128]> m_ram; // 1024x1 bits
|
||||
param_ptr_t m_RAM;
|
||||
};
|
||||
|
||||
NETLIB_OBJECT_DERIVED(2102A_dip, 2102A)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR_DERIVED(2102A_dip, 2102A)
|
||||
{
|
||||
register_subalias("8", m_A[0]);
|
||||
register_subalias("4", m_A[1]);
|
||||
register_subalias("5", m_A[2]);
|
||||
register_subalias("6", m_A[3]);
|
||||
register_subalias("7", m_A[4]);
|
||||
register_subalias("2", m_A[5]);
|
||||
register_subalias("1", m_A[6]);
|
||||
register_subalias("16", m_A[7]);
|
||||
register_subalias("15", m_A[8]);
|
||||
register_subalias("14", m_A[9]);
|
||||
|
||||
register_subalias("13", m_CEQ);
|
||||
register_subalias("3", m_RWQ);
|
||||
|
||||
register_subalias("11", m_DI);
|
||||
register_subalias("12", m_DO);
|
||||
}
|
||||
};
|
||||
|
||||
NETLIB_UPDATE(2102A)
|
||||
{
|
||||
netlist_time max_delay = NLTIME_FROM_NS(350);
|
||||
|
||||
if (!m_CEQ())
|
||||
{
|
||||
unsigned a = 0;
|
||||
for (std::size_t i=0; i<10; i++)
|
||||
{
|
||||
a |= m_A[i]() << i;
|
||||
}
|
||||
const unsigned byte = ADDR2BYTE(a);
|
||||
const unsigned bit = ADDR2BIT(a);
|
||||
|
||||
if (!m_RWQ())
|
||||
{
|
||||
m_ram[byte] &= ~(static_cast<uint_fast8_t>(1) << bit);
|
||||
m_ram[byte] |= (static_cast<uint_fast8_t>(m_DI()) << bit);
|
||||
}
|
||||
|
||||
m_DO.push((m_ram[byte] >> bit) & 1, max_delay);
|
||||
}
|
||||
}
|
||||
|
||||
NETLIB_RESET(2102A)
|
||||
{
|
||||
m_RAM.setTo(&m_ram[0]);
|
||||
for (std::size_t i=0; i<128; i++)
|
||||
m_ram[i] = 0;
|
||||
}
|
||||
|
||||
NETLIB_DEVICE_IMPL(2102A)
|
||||
NETLIB_DEVICE_IMPL(2102A_dip)
|
||||
|
||||
} //namespace devices
|
||||
} // namespace netlist
|
48
src/lib/netlist/devices/nld_2102A.h
Normal file
48
src/lib/netlist/devices/nld_2102A.h
Normal file
@ -0,0 +1,48 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Ryan Holtz
|
||||
/*
|
||||
* nld_2102A.h
|
||||
*
|
||||
* 2102: 1024 x 1-bit Static RAM
|
||||
*
|
||||
* +--------------+
|
||||
* A6 |1 ++ 16| A7
|
||||
* A5 |2 15| A8
|
||||
* RWQ |3 14| A9
|
||||
* A1 |4 82S16 13| CEQ
|
||||
* A2 |5 12| DO
|
||||
* A3 |6 11| DI
|
||||
* A4 |7 10| VCC
|
||||
* A0 |8 9| GND
|
||||
* +--------------+
|
||||
*
|
||||
*
|
||||
* Naming conventions follow Intel datasheet
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NLD_2102A_H_
|
||||
#define NLD_2102A_H_
|
||||
|
||||
#include "nl_setup.h"
|
||||
|
||||
#define RAM_2102A(name, cCEQ, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cRWQ, cDI) \
|
||||
NET_REGISTER_DEV(RAM_2102A, name) \
|
||||
NET_CONNECT(name, CEQ, cCEQ) \
|
||||
NET_CONNECT(name, A0, cA0) \
|
||||
NET_CONNECT(name, A1, cA1) \
|
||||
NET_CONNECT(name, A2, cA2) \
|
||||
NET_CONNECT(name, A3, cA3) \
|
||||
NET_CONNECT(name, A4, cA4) \
|
||||
NET_CONNECT(name, A5, cA5) \
|
||||
NET_CONNECT(name, A6, cA6) \
|
||||
NET_CONNECT(name, A7, cA7) \
|
||||
NET_CONNECT(name, A8, cA8) \
|
||||
NET_CONNECT(name, A9, cA9) \
|
||||
NET_CONNECT(name, RWQ, cRWQ) \
|
||||
NET_CONNECT(name, DI, cDI)
|
||||
|
||||
#define RAM_2102A_DIP(name) \
|
||||
NET_REGISTER_DEV(RAM_2102A_DIP, name)
|
||||
|
||||
#endif /* NLD_2102A_H_ */
|
@ -17,7 +17,7 @@ namespace netlist
|
||||
, m_A(*this, {{ "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10" }})
|
||||
, m_GQ(*this, "GQ")
|
||||
, m_EPQ(*this, "EPQ")
|
||||
, m_Q(*this, {{ "Q0", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7" }})
|
||||
, m_D(*this, {{ "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7" }})
|
||||
, m_last_EPQ(*this, "m_last_EPQ", 1)
|
||||
, m_ROM(*this, "m_ROM", nullptr)
|
||||
{
|
||||
@ -29,11 +29,11 @@ namespace netlist
|
||||
object_array_t<logic_input_t, 11> m_A;
|
||||
logic_input_t m_GQ;
|
||||
logic_input_t m_EPQ;
|
||||
object_array_t<logic_output_t, 8> m_Q;
|
||||
object_array_t<logic_output_t, 8> m_D;
|
||||
|
||||
state_var<unsigned> m_last_EPQ;
|
||||
|
||||
param_rom_t m_ROM; // 16 Kbits, used as 2 Kbit x 8
|
||||
param_ptr_t m_ROM; // 16 Kbits, used as 2 Kbit x 8
|
||||
};
|
||||
|
||||
NETLIB_OBJECT_DERIVED(2716_dip, 2716)
|
||||
@ -55,21 +55,21 @@ namespace netlist
|
||||
register_subalias("20", m_GQ);
|
||||
register_subalias("18", m_EPQ);
|
||||
|
||||
register_subalias("9", m_Q[0]);
|
||||
register_subalias("10", m_Q[1]);
|
||||
register_subalias("11", m_Q[2]);
|
||||
register_subalias("13", m_Q[3]);
|
||||
register_subalias("14", m_Q[4]);
|
||||
register_subalias("15", m_Q[5]);
|
||||
register_subalias("16", m_Q[6]);
|
||||
register_subalias("17", m_Q[7]);
|
||||
register_subalias("9", m_D[0]);
|
||||
register_subalias("10", m_D[1]);
|
||||
register_subalias("11", m_D[2]);
|
||||
register_subalias("13", m_D[3]);
|
||||
register_subalias("14", m_D[4]);
|
||||
register_subalias("15", m_D[5]);
|
||||
register_subalias("16", m_D[6]);
|
||||
register_subalias("17", m_D[7]);
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: timing!
|
||||
NETLIB_UPDATE(2716)
|
||||
{
|
||||
unsigned q = 0xff;
|
||||
unsigned d = 0xff;
|
||||
|
||||
netlist_time delay = NLTIME_FROM_NS(450);
|
||||
if (!m_GQ() && !m_EPQ())
|
||||
@ -78,7 +78,10 @@ namespace netlist
|
||||
for (std::size_t i=0; i<11; i++)
|
||||
a |= (m_A[i]() << i);
|
||||
|
||||
q = m_ROM()[a];
|
||||
if (m_ROM() != nullptr)
|
||||
{
|
||||
d = ((std::uint_fast8_t*)(m_ROM()))[a];
|
||||
}
|
||||
|
||||
if (m_last_EPQ)
|
||||
delay = NLTIME_FROM_NS(120);
|
||||
@ -88,7 +91,7 @@ namespace netlist
|
||||
|
||||
// FIXME: Outputs are tristate. This needs to be properly implemented
|
||||
for (std::size_t i=0; i<8; i++)
|
||||
m_Q[i].push((q >> i) & 1, delay);
|
||||
m_D[i].push((d >> i) & 1, delay);
|
||||
}
|
||||
|
||||
NETLIB_DEVICE_IMPL(2716)
|
||||
|
@ -13,11 +13,11 @@
|
||||
* A3 |5 20| GQ
|
||||
* A2 |6 19| A10
|
||||
* A1 |7 18| EPQ
|
||||
* A0 |8 17| Q7
|
||||
* Q0 |9 16| Q6
|
||||
* Q1 |10 15| Q5
|
||||
* Q2 |11 14| Q4
|
||||
* VSS |12 13| Q3
|
||||
* A0 |8 17| D7
|
||||
* D0 |9 16| D6
|
||||
* D1 |10 15| D5
|
||||
* D2 |11 14| D4
|
||||
* VSS |12 13| D3
|
||||
* +----------------+
|
||||
*
|
||||
*
|
||||
@ -30,9 +30,23 @@
|
||||
|
||||
#include "nl_setup.h"
|
||||
|
||||
#define TTL_2716(name) \
|
||||
NET_REGISTER_DEV(TTL_2716, name)
|
||||
#define TTL_2716_DIP(name) \
|
||||
NET_REGISTER_DEV(TTL_2716_DIP, name)
|
||||
#define EPROM_2716(name, cGQ, cEPQ, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cA10) \
|
||||
NET_REGISTER_DEV(EPROM_2716, name) \
|
||||
NET_CONNECT(name, GQ, cGQ) \
|
||||
NET_CONNECT(name, EPQ, cEPQ) \
|
||||
NET_CONNECT(name, A0, cA0) \
|
||||
NET_CONNECT(name, A1, cA1) \
|
||||
NET_CONNECT(name, A2, cA2) \
|
||||
NET_CONNECT(name, A3, cA3) \
|
||||
NET_CONNECT(name, A4, cA4) \
|
||||
NET_CONNECT(name, A5, cA5) \
|
||||
NET_CONNECT(name, A6, cA6) \
|
||||
NET_CONNECT(name, A7, cA7) \
|
||||
NET_CONNECT(name, A8, cA8) \
|
||||
NET_CONNECT(name, A9, cA9) \
|
||||
NET_CONNECT(name, A10, cA10)
|
||||
|
||||
#define EPROM_2716_DIP(name) \
|
||||
NET_REGISTER_DEV(EPROM_2716_DIP, name)
|
||||
|
||||
#endif /* NLD_2716_H_ */
|
||||
|
74
src/lib/netlist/devices/nld_74365.cpp
Normal file
74
src/lib/netlist/devices/nld_74365.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Ryan Holtz
|
||||
/*
|
||||
* nld_74365.cpp
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nld_74365.h"
|
||||
|
||||
namespace netlist
|
||||
{
|
||||
namespace devices
|
||||
{
|
||||
NETLIB_OBJECT(74365)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR(74365)
|
||||
, m_G1Q(*this, "G1Q")
|
||||
, m_G2Q(*this, "G2Q")
|
||||
, m_A(*this, {{ "A1", "A2", "A3", "A4", "A5", "A6" }})
|
||||
, m_Y(*this, {{ "Y1", "Y2", "Y3", "Y4", "Y5", "Y6" }})
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_UPDATEI();
|
||||
|
||||
protected:
|
||||
logic_input_t m_G1Q;
|
||||
logic_input_t m_G2Q;
|
||||
object_array_t<logic_input_t, 6> m_A;
|
||||
object_array_t<logic_output_t, 6> m_Y;
|
||||
};
|
||||
|
||||
NETLIB_OBJECT_DERIVED(74365_dip, 74365)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR_DERIVED(74365_dip, 74365)
|
||||
{
|
||||
register_subalias("1", m_G1Q);
|
||||
register_subalias("2", m_A[0]);
|
||||
register_subalias("3", m_Y[0]);
|
||||
register_subalias("4", m_A[1]);
|
||||
register_subalias("5", m_Y[1]);
|
||||
register_subalias("6", m_A[2]);
|
||||
register_subalias("7", m_Y[2]);
|
||||
|
||||
register_subalias("9", m_A[3]);
|
||||
register_subalias("10", m_Y[3]);
|
||||
register_subalias("11", m_A[4]);
|
||||
register_subalias("12", m_Y[4]);
|
||||
register_subalias("13", m_A[5]);
|
||||
register_subalias("14", m_Y[5]);
|
||||
register_subalias("15", m_G2Q);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
NETLIB_UPDATE(74365)
|
||||
{
|
||||
if (!m_G1Q() && !m_G2Q())
|
||||
{
|
||||
for (std::size_t i=0; i<6; i++)
|
||||
m_Y[i].push(m_A[i](), NLTIME_FROM_NS(20)); // FIXME: Correct timing
|
||||
}
|
||||
else
|
||||
{
|
||||
for (std::size_t i=0; i<6; i++)
|
||||
m_Y[i].push(0, NLTIME_FROM_NS(20)); // FIXME: Correct timing
|
||||
}
|
||||
}
|
||||
|
||||
NETLIB_DEVICE_IMPL(74365)
|
||||
NETLIB_DEVICE_IMPL(74365_dip)
|
||||
|
||||
} //namespace devices
|
||||
} // namespace netlist
|
44
src/lib/netlist/devices/nld_74365.h
Normal file
44
src/lib/netlist/devices/nld_74365.h
Normal file
@ -0,0 +1,44 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Ryan Holtz
|
||||
/*
|
||||
* nld_74365.h
|
||||
*
|
||||
* SN74365: Hex Bus Driver with 3-State Outputs
|
||||
*
|
||||
* +--------------+
|
||||
* G1Q |1 ++ 16| VCC
|
||||
* A1 |2 15| G2Q
|
||||
* Y1 |3 14| A6
|
||||
* A2 |4 74365 13| Y6
|
||||
* Y2 |5 12| A5
|
||||
* A3 |6 11| Y5
|
||||
* Y3 |7 10| A4
|
||||
* GND |8 9| Y4
|
||||
* +--------------+
|
||||
*
|
||||
* Naming conventions follow Texas Instruments datasheet
|
||||
*
|
||||
* Note: Currently the netlist system does not support proper tristate output, so this
|
||||
* is not a "real" bus driver, it simply outputs 0 if the chip is not enabled.
|
||||
*/
|
||||
|
||||
#ifndef NLD_74365_H_
|
||||
#define NLD_74365_H_
|
||||
|
||||
#include "nl_setup.h"
|
||||
|
||||
#define TTL_74365(name, cG1Q, cG2Q, cA1, cA2, cA3, cA4, cA5, cA6) \
|
||||
NET_REGISTER_DEV(TTL_74365, name) \
|
||||
NET_CONNECT(name, G1Q, cG1Q) \
|
||||
NET_CONNECT(name, G2Q, cG2Q) \
|
||||
NET_CONNECT(name, A1, cA1) \
|
||||
NET_CONNECT(name, A2, cA2) \
|
||||
NET_CONNECT(name, A3, cA3) \
|
||||
NET_CONNECT(name, A4, cA4) \
|
||||
NET_CONNECT(name, A5, cA5) \
|
||||
NET_CONNECT(name, A6, cA6)
|
||||
|
||||
#define TTL_74365_DIP(name) \
|
||||
NET_REGISTER_DEV(TTL_74365_DIP, name)
|
||||
|
||||
#endif /* NLD_74365_H_ */
|
@ -30,7 +30,7 @@ namespace netlist
|
||||
logic_input_t m_CE2Q;
|
||||
object_array_t<logic_output_t, 4> m_O;
|
||||
|
||||
param_rom_t m_ROM; // 1024 bits, 32x32, used as 256x4
|
||||
param_ptr_t m_ROM; // 1024 bits, 32x32, used as 256x4
|
||||
};
|
||||
|
||||
NETLIB_OBJECT_DERIVED(82S126_dip, 82S126)
|
||||
@ -68,12 +68,26 @@ namespace netlist
|
||||
for (std::size_t i=0; i<8; i++)
|
||||
a |= (m_A[i]() << i);
|
||||
|
||||
o = m_ROM()[a];
|
||||
if (m_ROM() != nullptr)
|
||||
o = ((std::uint_fast8_t*)(m_ROM()))[a];
|
||||
|
||||
delay = NLTIME_FROM_NS(50);
|
||||
}
|
||||
|
||||
// FIXME: Outputs are tristate. This needs to be properly implemented
|
||||
#if 0
|
||||
printf("CE1Q%d CE2Q%d %d%d%d%d%d%d%d%d %x\n",
|
||||
m_CE1Q() ? 1 : 0,
|
||||
m_CE2Q() ? 1 : 0,
|
||||
m_A[0]() ? 1 : 0,
|
||||
m_A[1]() ? 1 : 0,
|
||||
m_A[2]() ? 1 : 0,
|
||||
m_A[3]() ? 1 : 0,
|
||||
m_A[4]() ? 1 : 0,
|
||||
m_A[5]() ? 1 : 0,
|
||||
m_A[6]() ? 1 : 0,
|
||||
m_A[7]() ? 1 : 0,
|
||||
o);
|
||||
#endif
|
||||
// FIXME: Outputs are tristate. This needs to be properly implemented
|
||||
for (std::size_t i=0; i<4; i++)
|
||||
m_O[i].push((o >> i) & 1, delay);
|
||||
}
|
||||
|
76
src/lib/netlist/devices/nld_tristate.cpp
Normal file
76
src/lib/netlist/devices/nld_tristate.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Ryan Holtz
|
||||
/*
|
||||
* nld_tristate.cpp
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nld_tristate.h"
|
||||
|
||||
namespace netlist
|
||||
{
|
||||
namespace devices
|
||||
{
|
||||
NETLIB_OBJECT(tristate)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR(tristate)
|
||||
, m_CEQ(*this, {{ "CEQ1", "CEQ2" }})
|
||||
, m_D(*this, {{ "D1", "D2" }})
|
||||
, m_Q(*this, "Q")
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_UPDATEI();
|
||||
|
||||
protected:
|
||||
object_array_t<logic_input_t, 2> m_CEQ;
|
||||
object_array_t<logic_input_t, 2> m_D;
|
||||
logic_output_t m_Q;
|
||||
};
|
||||
|
||||
NETLIB_OBJECT(tristate3)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR(tristate3)
|
||||
, m_CEQ(*this, {{ "CEQ1", "CEQ2", "CEQ3" }} )
|
||||
, m_D(*this, {{ "D1", "D2", "D3" }} )
|
||||
, m_Q(*this, "Q")
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_UPDATEI();
|
||||
|
||||
protected:
|
||||
object_array_t<logic_input_t, 3> m_CEQ;
|
||||
object_array_t<logic_input_t, 3> m_D;
|
||||
logic_output_t m_Q;
|
||||
};
|
||||
|
||||
NETLIB_UPDATE(tristate)
|
||||
{
|
||||
unsigned q = 0;
|
||||
if (!m_CEQ[0]())
|
||||
q |= m_D[0]();
|
||||
if (!m_CEQ[1]())
|
||||
q |= m_D[1]();
|
||||
|
||||
m_Q.push(q, NLTIME_FROM_NS(1));
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(tristate3)
|
||||
{
|
||||
unsigned q = 0;
|
||||
if (!m_CEQ[0]())
|
||||
q |= m_D[0]();
|
||||
if (!m_CEQ[1]())
|
||||
q |= m_D[1]();
|
||||
if (!m_CEQ[2]())
|
||||
q |= m_D[2]();
|
||||
|
||||
m_Q.push(q, NLTIME_FROM_NS(1));
|
||||
}
|
||||
|
||||
NETLIB_DEVICE_IMPL(tristate)
|
||||
NETLIB_DEVICE_IMPL(tristate3)
|
||||
|
||||
} //namespace devices
|
||||
} // namespace netlist
|
31
src/lib/netlist/devices/nld_tristate.h
Normal file
31
src/lib/netlist/devices/nld_tristate.h
Normal file
@ -0,0 +1,31 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Ryan Holtz
|
||||
/*
|
||||
* nld_tristate.h
|
||||
*
|
||||
* tristate: Hack to merge two tri-stated outputs together
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NLD_TRISTATE_H_
|
||||
#define NLD_TRISTATE_H_
|
||||
|
||||
#include "nl_setup.h"
|
||||
|
||||
#define TTL_TRISTATE(name, cCEQ1, cD1, cCEQ2, cD2) \
|
||||
NET_REGISTER_DEV(TTL_TRISTATE, name) \
|
||||
NET_CONNECT(name, CEQ1, cCEQ1) \
|
||||
NET_CONNECT(name, D1, cD1) \
|
||||
NET_CONNECT(name, CEQ2, cCEQ2) \
|
||||
NET_CONNECT(name, D2, cD2)
|
||||
|
||||
#define TTL_TRISTATE3(name, cCEQ1, cD1, cCEQ2, cD2, cCEQ3, cD3) \
|
||||
NET_REGISTER_DEV(TTL_TRISTATE3, name) \
|
||||
NET_CONNECT(name, CEQ1, cCEQ1) \
|
||||
NET_CONNECT(name, D1, cD1) \
|
||||
NET_CONNECT(name, CEQ2, cCEQ2) \
|
||||
NET_CONNECT(name, D2, cD2) \
|
||||
NET_CONNECT(name, CEQ3, cCEQ3) \
|
||||
NET_CONNECT(name, D3, cD3)
|
||||
|
||||
#endif /* NLD_TRISTATE_H_ */
|
@ -482,7 +482,7 @@ param_template_t<C, T>::param_template_t(device_t &device, const pstring name, c
|
||||
template class param_template_t<double, param_t::DOUBLE>;
|
||||
template class param_template_t<int, param_t::INTEGER>;
|
||||
template class param_template_t<bool, param_t::LOGIC>;
|
||||
template class param_template_t<std::uint_fast8_t*, param_t::ROM>;
|
||||
template class param_template_t<std::uint_fast8_t*, param_t::POINTER>;
|
||||
template class param_template_t<pstring, param_t::STRING>;
|
||||
template class param_template_t<pstring, param_t::MODEL>;
|
||||
|
||||
|
@ -833,7 +833,7 @@ namespace netlist
|
||||
DOUBLE,
|
||||
INTEGER,
|
||||
LOGIC,
|
||||
ROM // Special-case which is always initialized at netlist startup time
|
||||
POINTER // Special-case which is always initialized at MAME startup time
|
||||
};
|
||||
|
||||
param_t(const param_type_t atype, device_t &device, const pstring &name);
|
||||
@ -869,7 +869,7 @@ namespace netlist
|
||||
using param_str_t = param_template_t<pstring, param_t::STRING>;
|
||||
|
||||
using param_logic_t = param_template_t<bool, param_t::LOGIC>;
|
||||
using param_rom_t = param_template_t<std::uint_fast8_t*, param_t::ROM>;
|
||||
using param_ptr_t = param_template_t<std::uint_fast8_t*, param_t::POINTER>;
|
||||
|
||||
class param_model_t : public param_str_t
|
||||
{
|
||||
|
@ -217,8 +217,8 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m)
|
||||
static_cast<param_int_t &>(param).initial(static_cast<int>(vald));
|
||||
}
|
||||
break;
|
||||
case param_t::ROM:
|
||||
static_cast<param_rom_t &>(param).initial(nullptr);
|
||||
case param_t::POINTER:
|
||||
static_cast<param_ptr_t &>(param).initial(nullptr);
|
||||
break;
|
||||
case param_t::STRING:
|
||||
case param_t::MODEL:
|
||||
|
@ -201,8 +201,8 @@ struct input_t
|
||||
case netlist::param_t::LOGIC:
|
||||
static_cast<netlist::param_logic_t*>(m_param)->setTo(static_cast<bool>(m_value));
|
||||
break;
|
||||
case netlist::param_t::ROM:
|
||||
static_cast<netlist::param_logic_t*>(m_param)->setTo(nullptr);
|
||||
case netlist::param_t::POINTER:
|
||||
static_cast<netlist::param_ptr_t*>(m_param)->setTo(nullptr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user