summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author therealmogminer@gmail.com <therealmogminer@gmail.com>2016-12-21 20:14:48 +0100
committer therealmogminer@gmail.com <therealmogminer@gmail.com>2016-12-21 20:32:49 +0100
commit66abfa8e6d0ebe032ee374a11078510bc4254929 (patch)
treeee4bd44c6e74ed8bddc807991cf4d5ba23dc219a
parentac56130251054899bf1cb54291b1c2c2b125f2b3 (diff)
-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.
-rw-r--r--scripts/src/netlist.lua6
-rw-r--r--src/devices/machine/netlist.cpp54
-rw-r--r--src/devices/machine/netlist.h57
-rw-r--r--src/lib/netlist/build/makefile3
-rw-r--r--src/lib/netlist/devices/net_lib.cpp6
-rw-r--r--src/lib/netlist/devices/net_lib.h4
-rw-r--r--src/lib/netlist/devices/nld_2102A.cpp103
-rw-r--r--src/lib/netlist/devices/nld_2102A.h48
-rw-r--r--src/lib/netlist/devices/nld_2716.cpp31
-rw-r--r--src/lib/netlist/devices/nld_2716.h32
-rw-r--r--src/lib/netlist/devices/nld_74365.cpp74
-rw-r--r--src/lib/netlist/devices/nld_74365.h44
-rw-r--r--src/lib/netlist/devices/nld_82S126.cpp22
-rw-r--r--src/lib/netlist/devices/nld_tristate.cpp76
-rw-r--r--src/lib/netlist/devices/nld_tristate.h31
-rw-r--r--src/lib/netlist/nl_base.cpp2
-rw-r--r--src/lib/netlist/nl_base.h4
-rw-r--r--src/lib/netlist/nl_setup.cpp4
-rw-r--r--src/lib/netlist/prg/nltool.cpp4
19 files changed, 551 insertions, 54 deletions
diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua
index b5fe059d074..a0ac5045565 100644
--- a/scripts/src/netlist.lua
+++ b/scripts/src/netlist.lua
@@ -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",
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index b7891d75286..2301ec49a4f 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.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());
+ }
+
+ 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_rom = memregion(m_rom_tag)->base();
+ m_data = (*m_param)();
}
// ----------------------------------------------------------------------------------------
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index 28444e2d7e7..3a223541091 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -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_ptr_t *m_param;
+ pstring m_param_name;
+ 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_rom_t *m_param;
+ netlist::param_ptr_t *m_param;
pstring m_param_name;
- const char* m_rom_tag;
- uint8_t* m_rom;
+ 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;
diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile
index 046ae395d93..70aacc15244 100644
--- a/src/lib/netlist/build/makefile
+++ b/src/lib/netlist/build/makefile
@@ -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 \
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index c647e986ac2..f235766ebcc 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -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, "-")
diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h
index 66c7f57d842..6e9ba446231 100644
--- a/src/lib/netlist/devices/net_lib.h
+++ b/src/lib/netlist/devices/net_lib.h
@@ -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"
diff --git a/src/lib/netlist/devices/nld_2102A.cpp b/src/lib/netlist/devices/nld_2102A.cpp
new file mode 100644
index 00000000000..45a7ee53c34
--- /dev/null
+++ b/src/lib/netlist/devices/nld_2102A.cpp
@@ -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
diff --git a/src/lib/netlist/devices/nld_2102A.h b/src/lib/netlist/devices/nld_2102A.h
new file mode 100644
index 00000000000..fe2feebf38e
--- /dev/null
+++ b/src/lib/netlist/devices/nld_2102A.h
@@ -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_ */
diff --git a/src/lib/netlist/devices/nld_2716.cpp b/src/lib/netlist/devices/nld_2716.cpp
index 75176119ae7..45cedba592b 100644
--- a/src/lib/netlist/devices/nld_2716.cpp
+++ b/src/lib/netlist/devices/nld_2716.cpp
@@ -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)
diff --git a/src/lib/netlist/devices/nld_2716.h b/src/lib/netlist/devices/nld_2716.h
index 144bbf04658..72a02a2166e 100644
--- a/src/lib/netlist/devices/nld_2716.h
+++ b/src/lib/netlist/devices/nld_2716.h
@@ -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_ */
diff --git a/src/lib/netlist/devices/nld_74365.cpp b/src/lib/netlist/devices/nld_74365.cpp
new file mode 100644
index 00000000000..34eafb0856e
--- /dev/null
+++ b/src/lib/netlist/devices/nld_74365.cpp
@@ -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
diff --git a/src/lib/netlist/devices/nld_74365.h b/src/lib/netlist/devices/nld_74365.h
new file mode 100644
index 00000000000..65bfd1a2a57
--- /dev/null
+++ b/src/lib/netlist/devices/nld_74365.h
@@ -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_ */
diff --git a/src/lib/netlist/devices/nld_82S126.cpp b/src/lib/netlist/devices/nld_82S126.cpp
index 29c2813c751..20fc1371c90 100644
--- a/src/lib/netlist/devices/nld_82S126.cpp
+++ b/src/lib/netlist/devices/nld_82S126.cpp
@@ -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);
}
diff --git a/src/lib/netlist/devices/nld_tristate.cpp b/src/lib/netlist/devices/nld_tristate.cpp
new file mode 100644
index 00000000000..571f5f8c334
--- /dev/null
+++ b/src/lib/netlist/devices/nld_tristate.cpp
@@ -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
diff --git a/src/lib/netlist/devices/nld_tristate.h b/src/lib/netlist/devices/nld_tristate.h
new file mode 100644
index 00000000000..e0e40491d8f
--- /dev/null
+++ b/src/lib/netlist/devices/nld_tristate.h
@@ -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_ */
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 187dea1dcb5..165ba1c6b48 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -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>;
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index e817a32ab83..6d4a001f7fd 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -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
{
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index cd025603be0..b55f662cd79 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -217,8 +217,8 @@ void setup_t::register_and_set_param(pstring name, param_t &param)
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:
diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp
index 1245f03a391..8241daaa332 100644
--- a/src/lib/netlist/prg/nltool.cpp
+++ b/src/lib/netlist/prg/nltool.cpp
@@ -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;
}
}