From 66abfa8e6d0ebe032ee374a11078510bc4254929 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Wed, 21 Dec 2016 20:14:48 +0100 Subject: -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. --- scripts/src/netlist.lua | 6 ++ src/devices/machine/netlist.cpp | 54 +++++++++++++--- src/devices/machine/netlist.h | 57 +++++++++++++---- src/lib/netlist/build/makefile | 3 + src/lib/netlist/devices/net_lib.cpp | 6 ++ src/lib/netlist/devices/net_lib.h | 4 ++ src/lib/netlist/devices/nld_2102A.cpp | 103 +++++++++++++++++++++++++++++++ src/lib/netlist/devices/nld_2102A.h | 48 ++++++++++++++ src/lib/netlist/devices/nld_2716.cpp | 31 +++++----- src/lib/netlist/devices/nld_2716.h | 32 +++++++--- src/lib/netlist/devices/nld_74365.cpp | 74 ++++++++++++++++++++++ src/lib/netlist/devices/nld_74365.h | 44 +++++++++++++ src/lib/netlist/devices/nld_82S126.cpp | 22 +++++-- src/lib/netlist/devices/nld_tristate.cpp | 76 +++++++++++++++++++++++ src/lib/netlist/devices/nld_tristate.h | 31 ++++++++++ src/lib/netlist/nl_base.cpp | 2 +- src/lib/netlist/nl_base.h | 4 +- src/lib/netlist/nl_setup.cpp | 4 +- src/lib/netlist/prg/nltool.cpp | 4 +- 19 files changed, 551 insertions(+), 54 deletions(-) create mode 100644 src/lib/netlist/devices/nld_2102A.cpp create mode 100644 src/lib/netlist/devices/nld_2102A.h create mode 100644 src/lib/netlist/devices/nld_74365.cpp create mode 100644 src/lib/netlist/devices/nld_74365.h create mode 100644 src/lib/netlist/devices/nld_tristate.cpp create mode 100644 src/lib/netlist/devices/nld_tristate.h 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; const device_type NETLIST_ANALOG_INPUT = &device_creator; const device_type NETLIST_INT_INPUT = &device_creator; const device_type NETLIST_ROM_REGION = &device_creator; +const device_type NETLIST_RAM_POINTER = &device_creator; const device_type NETLIST_LOGIC_INPUT = &device_creator; const device_type NETLIST_STREAM_INPUT = &device_creator; @@ -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(device); + netlist_mame_rom_t &netlist = downcast(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(this->owner())->setup().find_param(m_param_name); - m_param = dynamic_cast(p); + m_param = dynamic_cast(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(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(this->owner())->setup().find_param(m_param_name); + m_param = dynamic_cast(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 m_A; + logic_input_t m_CEQ; + logic_input_t m_RWQ; + logic_input_t m_DI; + + logic_output_t m_DO; + + state_var 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(1) << bit); + m_ram[byte] |= (static_cast(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 m_A; logic_input_t m_GQ; logic_input_t m_EPQ; - object_array_t m_Q; + object_array_t m_D; state_var 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 m_A; + object_array_t 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 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 m_CEQ; + object_array_t 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 m_CEQ; + object_array_t 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::param_template_t(device_t &device, const pstring name, c template class param_template_t; template class param_template_t; template class param_template_t; -template class param_template_t; +template class param_template_t; template class param_template_t; template class param_template_t; 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; using param_logic_t = param_template_t; - using param_rom_t = param_template_t; + using param_ptr_t = param_template_t; 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 ¶m) static_cast(param).initial(static_cast(vald)); } break; - case param_t::ROM: - static_cast(param).initial(nullptr); + case param_t::POINTER: + static_cast(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(m_param)->setTo(static_cast(m_value)); break; - case netlist::param_t::ROM: - static_cast(m_param)->setTo(nullptr); + case netlist::param_t::POINTER: + static_cast(m_param)->setTo(nullptr); break; } } -- cgit v1.2.3