-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:
therealmogminer@gmail.com 2016-12-21 20:14:48 +01:00
parent ac56130251
commit 66abfa8e6d
19 changed files with 551 additions and 54 deletions

View File

@ -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",

View File

@ -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)();
}
// ----------------------------------------------------------------------------------------

View File

@ -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;

View File

@ -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 \

View File

@ -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, "-")

View File

@ -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"

View 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

View 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_ */

View File

@ -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)

View File

@ -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_ */

View 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

View 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_ */

View File

@ -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);
}

View 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

View 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_ */

View File

@ -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>;

View File

@ -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
{

View File

@ -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:

View File

@ -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;
}
}