From e03c983836ec7c2a594f7d1a30d9b41dbd40fd46 Mon Sep 17 00:00:00 2001 From: Couriersud Date: Thu, 2 Jan 2014 00:30:21 +0000 Subject: [PATCH] Pong now has complete emulation of discrete logic for runQ and SRST signals. Rewrote switch2 device to be based on resistances as well. [Couriersud] --- .gitattributes | 2 + src/emu/netlist/devices/net_lib.c | 2 +- src/emu/netlist/devices/net_lib.h | 2 + src/emu/netlist/devices/nld_legacy.c | 34 +-------- src/emu/netlist/devices/nld_legacy.h | 19 +---- src/emu/netlist/devices/nld_solver.c | 4 +- src/emu/netlist/devices/nld_switches.c | 49 +++++++++++++ src/emu/netlist/devices/nld_switches.h | 38 ++++++++++ src/emu/netlist/netlist.mak | 1 + src/emu/netlist/nl_base.c | 2 +- src/mame/drivers/pong.c | 98 ++++++++++++++++++++++---- 11 files changed, 185 insertions(+), 66 deletions(-) create mode 100644 src/emu/netlist/devices/nld_switches.c create mode 100644 src/emu/netlist/devices/nld_switches.h diff --git a/.gitattributes b/.gitattributes index b578f8e3f17..72f750d9c6a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2170,6 +2170,8 @@ src/emu/netlist/devices/nld_ne555.h svneol=native#text/plain src/emu/netlist/devices/nld_signal.h svneol=native#text/plain src/emu/netlist/devices/nld_solver.c svneol=native#text/plain src/emu/netlist/devices/nld_solver.h svneol=native#text/plain +src/emu/netlist/devices/nld_switches.c svneol=native#text/plain +src/emu/netlist/devices/nld_switches.h svneol=native#text/plain src/emu/netlist/devices/nld_system.c svneol=native#text/plain src/emu/netlist/devices/nld_system.h svneol=native#text/plain src/emu/netlist/devices/nld_twoterm.c svneol=native#text/plain diff --git a/src/emu/netlist/devices/net_lib.c b/src/emu/netlist/devices/net_lib.c index b6b826e08a1..83eab69bb69 100644 --- a/src/emu/netlist/devices/net_lib.c +++ b/src/emu/netlist/devices/net_lib.c @@ -255,7 +255,7 @@ void netlist_factory::initialize() ENTRY(clock, NETDEV_CLOCK) ENTRY(mainclock, NETDEV_MAINCLOCK) ENTRY(solver, NETDEV_SOLVER) - ENTRY(nicMultiSwitch, NETDEV_SWITCH2) + ENTRY(switch2, NETDEV_SWITCH2) ENTRY(nicRSFF, NETDEV_RSFF) ENTRY(7400, TTL_7400_NAND) ENTRY(7402, TTL_7402_NOR) diff --git a/src/emu/netlist/devices/net_lib.h b/src/emu/netlist/devices/net_lib.h index 166a3c1e0dc..9e4698c724d 100644 --- a/src/emu/netlist/devices/net_lib.h +++ b/src/emu/netlist/devices/net_lib.h @@ -74,6 +74,8 @@ #include "nld_ne555.h" +#include "nld_switches.h" + #include "nld_log.h" #include "nld_solver.h" diff --git a/src/emu/netlist/devices/nld_legacy.c b/src/emu/netlist/devices/nld_legacy.c index 6f06af44df3..9c976d00484 100644 --- a/src/emu/netlist/devices/nld_legacy.c +++ b/src/emu/netlist/devices/nld_legacy.c @@ -4,39 +4,7 @@ */ #include "nld_legacy.h" - -NETLIB_START(nicMultiSwitch) -{ - static const char *sIN[8] = { "i1", "i2", "i3", "i4", "i5", "i6", "i7", "i8" }; - int i; - - m_position = 0; - m_low.initial(0); - - for (i=0; i<8; i++) - { - register_input(sIN[i], m_I[i]); - m_low.net().register_con(m_I[i]); - //m_I[i].set_net(m_low.m_net); - } - register_param("POS", m_POS, 0); - register_output("Q", m_Q); - - save(NAME(m_position)); - -} - -NETLIB_UPDATE(nicMultiSwitch) -{ - assert(m_position<8); - OUTANALOG(m_Q, INPANALOG(m_I[m_position]), NLTIME_FROM_NS(1)); -} - -NETLIB_UPDATE_PARAM(nicMultiSwitch) -{ - m_position = m_POS.Value(); - //update(); -} +#include "netlist/nl_setup.h" NETLIB_START(nicRSFF) { diff --git a/src/emu/netlist/devices/nld_legacy.h b/src/emu/netlist/devices/nld_legacy.h index 4986cc3dc2c..90608231bbd 100644 --- a/src/emu/netlist/devices/nld_legacy.h +++ b/src/emu/netlist/devices/nld_legacy.h @@ -14,6 +14,7 @@ #define NLD_LEGACY_H_ #include "../nl_base.h" +#include "nld_twoterm.h" // ---------------------------------------------------------------------------------------- // Macros @@ -24,11 +25,6 @@ NET_CONNECT(_name, S, _S) \ NET_CONNECT(_name, R, _R) -#define NETDEV_SWITCH2(_name, _i1, _i2) \ - NET_REGISTER_DEV(nicMultiSwitch, _name) \ - NET_CONNECT(_name, i1, _i1) \ - NET_CONNECT(_name, i2, _i2) - // ---------------------------------------------------------------------------------------- // Devices ... // ---------------------------------------------------------------------------------------- @@ -41,18 +37,5 @@ NETLIB_DEVICE(nicRSFF, netlist_ttl_output_t m_QQ; ); -NETLIB_DEVICE_WITH_PARAMS(nicMultiSwitch, - netlist_analog_input_t m_I[8]; - - netlist_analog_output_t m_Q; - netlist_analog_output_t m_low; - - netlist_param_int_t m_POS; - - int m_position; -); - - - #endif /* NLD_LEGACY_H_ */ diff --git a/src/emu/netlist/devices/nld_solver.c b/src/emu/netlist/devices/nld_solver.c index af3be269986..99f6a1d33c4 100644 --- a/src/emu/netlist/devices/nld_solver.c +++ b/src/emu/netlist/devices/nld_solver.c @@ -69,7 +69,9 @@ ATTR_HOT inline void netlist_matrix_solver_t::step(const netlist_time delta) ATTR_HOT inline void netlist_matrix_solver_t::update_inputs() { for (dev_list_t::entry_t *p = m_inps.first(); p != NULL; p = m_inps.next(p)) - p->object()->update_dev(); + { + p->object()->update_dev(); + } } diff --git a/src/emu/netlist/devices/nld_switches.c b/src/emu/netlist/devices/nld_switches.c new file mode 100644 index 00000000000..b4b35c0c4a3 --- /dev/null +++ b/src/emu/netlist/devices/nld_switches.c @@ -0,0 +1,49 @@ +/* + * nld_legacy.c + * + */ + +#include "nld_switches.h" +#include "netlist/nl_setup.h" + +#define R_OFF (1.0 / NETLIST_GMIN) +#define R_ON 0.01 + +NETLIB_START(switch2) +{ + + register_sub(m_R[0], "R1"); + register_sub(m_R[1], "R2"); + + register_param("POS", m_POS, 0); + + m_R[0].set_R(R_ON); + m_R[1].set_R(R_OFF); + + setup().connect(m_R[0].m_N, m_R[1].m_N); + + register_subalias("i1", m_R[0].m_P); + register_subalias("i2", m_R[1].m_P); + + register_subalias("Q", m_R[0].m_N); +} + +NETLIB_UPDATE(switch2) +{ +} + +NETLIB_UPDATE_PARAM(switch2) +{ + if (m_POS.Value() == 0) + { + m_R[0].set_R(R_ON); + m_R[1].set_R(R_OFF); + } + else + { + m_R[0].set_R(R_OFF); + m_R[1].set_R(R_ON); + } + m_R[0].update_dev(); + m_R[1].update_dev(); +} diff --git a/src/emu/netlist/devices/nld_switches.h b/src/emu/netlist/devices/nld_switches.h new file mode 100644 index 00000000000..4152643e1d8 --- /dev/null +++ b/src/emu/netlist/devices/nld_switches.h @@ -0,0 +1,38 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_switches.h + * + */ + +#pragma once + +#ifndef NLD_SWITCHES_H_ +#define NLD_SWITCHES_H_ + +#include "../nl_base.h" +#include "nld_twoterm.h" + +// ---------------------------------------------------------------------------------------- +// Macros +// ---------------------------------------------------------------------------------------- + +#define NETDEV_SWITCH2(_name, _i1, _i2) \ + NET_REGISTER_DEV(switch2, _name) \ + NET_CONNECT(_name, i1, _i1) \ + NET_CONNECT(_name, i2, _i2) + +// ---------------------------------------------------------------------------------------- +// Devices ... +// ---------------------------------------------------------------------------------------- + +NETLIB_DEVICE_WITH_PARAMS(switch2, + NETLIB_NAME(R_base) m_R[2]; + + netlist_param_int_t m_POS; +); + + + + +#endif /* NLD_SWITCHES_H_ */ diff --git a/src/emu/netlist/netlist.mak b/src/emu/netlist/netlist.mak index 640bd6bbf20..2afdd4ea6e4 100644 --- a/src/emu/netlist/netlist.mak +++ b/src/emu/netlist/netlist.mak @@ -33,6 +33,7 @@ NETLISTOBJS+= \ $(NETLISTOBJ)/devices/nld_74153.o \ $(NETLISTOBJ)/devices/nld_9316.o \ $(NETLISTOBJ)/devices/nld_ne555.o \ + $(NETLISTOBJ)/devices/nld_switches.o \ $(NETLISTOBJ)/devices/nld_legacy.o \ $(NETLISTOBJ)/devices/net_lib.o \ $(NETLISTOBJ)/devices/nld_log.o \ diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index bafba511198..7704fc6fdec 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -341,7 +341,7 @@ ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, const ne setup().register_alias(alias, term.name()); - if (term.isType(netlist_terminal_t::INPUT)) + if (term.isType(netlist_terminal_t::INPUT) || term.isType(netlist_terminal_t::TERMINAL)) m_terminals.add(name); } diff --git a/src/mame/drivers/pong.c b/src/mame/drivers/pong.c index 0210fa54a15..4977ad871ea 100644 --- a/src/mame/drivers/pong.c +++ b/src/mame/drivers/pong.c @@ -111,8 +111,85 @@ static NETLIST_START(pong_schematics) NETDEV_PARAM(xclk.FREQ, 7159000.0*2) #endif - NETDEV_LOGIC_INPUT(SRST) - NETDEV_ANALOG_INPUT(P2) + /* 3V Logic - Just a resistor - the value is not given in schematics */ + + NETDEV_R(R3V, 50) // Works ... + NET_C(R3V.1, V5) + NET_ALIAS(V3, R3V.2) + + /* Coin, antenna and startup circuit */ + + NETDEV_ANALOG_CONST(STOPG, 0) + NET_ALIAS(SRSTQ, RYf.2) + NET_ALIAS(SRST, RYc.2) + + /* SRSTQ has a diode to +3V to protect against overvoltage - omitted */ + + NETDEV_LOGIC_INPUT(antenna) + + NET_ALIAS(runQ, Q1.C) + + TTL_7404_INVERT(e4d, STOPG) + + NETDEV_R(RYf, 50) // output impedance + NETDEV_R(RYc, 50) // output impedance + + TTL_7404_INVERT(c9f, RYc.2) + TTL_7404_INVERT(c9c, RYf.2) + NET_C(c9f.Q, RYf.1) + NET_C(c9c.Q, RYc.1) + + NETDEV_SWITCH2(coinsw, RYc.2, RYf.2) + + NET_C(coinsw.Q, GND) + + /* Antenna circuit */ + /* Has a diode to clamp negative voltages - omitted here */ + + NETDEV_QNPN(Q3, BC237B) + NET_C(antenna, Q3.B) + NET_C(GND, Q3.E) + NETDEV_R(RX5, 100) + NETDEV_C(CX1, CAP_U(0.1)) + + NET_C(RX5.1, CX1.1) + NET_C(RX5.1, Q3.C) + NET_C(RX5.2, GND) + NET_C(CX1.2, GND) + NETDEV_QNPN(Q1, BC237B) + NET_C(Q1.B, RX5.1) + NET_C(Q1.E, GND) + + NETDEV_D(D3, 1N914) + NET_C(D3.A, Q1.C) + NET_C(D3.K, SRSTQ) + + NETDEV_D(D2, 1N914) + NETDEV_R(RX4, 220) + NET_C(D2.K, e4d.Q) + NET_C(D2.A, RX4.1) + NET_C(RX4.2, Q3.C) + + NETDEV_R(RX1, 100) + NETDEV_R(RX2, 100) + NETDEV_R(RX3, 330) + NETDEV_C(CX2, CAP_U(0.1)) + + NET_C(RX3.2, D3.A) + NET_C(RX3.1, RX1.2) + NET_C(RX1.1, V3) + + NET_C(RX1.1, CX2.1) + NET_C(RX1.2, CX2.2) + + NETDEV_QPNP(Q2, BC556B) + NET_C(Q2.E, V3) + NET_C(Q2.B, RX1.2) + NET_C(Q2.C, RX2.2) + + NET_C(RX2.1, D2.A) + + /* hit logic */ TTL_7404_INVERT(hitQ, hit) TTL_7400_NAND(hit, hit1Q, hit2Q) @@ -130,11 +207,6 @@ static NETLIST_START(pong_schematics) TTL_7400_NAND(ic_e1a, ic_d1e.Q, attractQ) NET_ALIAS(Missed, ic_e1a.Q) - // runQ is basically the output of a RS flipflop - // This is realized with discrete components in the real thing - NETDEV_RSFF(runQ_ff, SRST, StopG) - NET_ALIAS(runQ, runQ_ff.QQ) - TTL_7400_NAND(rstspeed, SRSTQ, MissQ) TTL_7400_NAND(StopG, StopG1Q, StopG2Q) NET_ALIAS(L, ic_h3b.Q) @@ -143,8 +215,6 @@ static NETLIST_START(pong_schematics) TTL_7400_NAND(hit1Q, pad1, ic_g1b.Q) TTL_7400_NAND(hit2Q, pad2, ic_g1b.Q) - TTL_7404_INVERT(SRSTQ, SRST) - TTL_7400_NAND(ic_g3c, 128H, ic_h3a.QQ) TTL_7427_NOR(ic_g2c, ic_g3c.Q, 256H, vpad1Q) NET_ALIAS(pad1, ic_g2c.Q) @@ -668,11 +738,14 @@ static INPUT_PORTS_START( pong ) PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(2) PORT_KEYDELTA(100) PORT_CENTERDELTA(0) PORT_PLAYER(2) NETLIST_ANALOG_PORT_CHANGED("maincpu", "pot1") PORT_START("IN0") /* fake as well */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "srst") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "coinsw") + PORT_DIPNAME( 0x06, 0x00, "Game Won" ) PORT_DIPLOCATION("SW1A:1,SW1B:1") PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_SWITCH) PORT_DIPSETTING( 0x00, "11" ) PORT_DIPSETTING( 0x06, "15" ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Antenna") NETLIST_LOGIC_PORT_CHANGED("maincpu", "antenna") + PORT_START("VR1") PORT_ADJUSTER( 50, "VR1 - 50k, Paddle 1 adjustment" ) NETLIST_ANALOG_PORT_CHANGED("maincpu", "vr0") PORT_START("VR2") @@ -692,7 +765,8 @@ static MACHINE_CONFIG_START( pong, pong_state ) MCFG_NETLIST_ANALOG_INPUT("maincpu", "pot1", "ic_a9_POT.DIAL") MCFG_NETLIST_LOGIC_INPUT("maincpu", "sw1a", "sw1a.POS", 0, 0x01) MCFG_NETLIST_LOGIC_INPUT("maincpu", "sw1b", "sw1b.POS", 0, 0x01) - MCFG_NETLIST_LOGIC_INPUT("maincpu", "srst", "SRST.OUT", 0, 0x01) + MCFG_NETLIST_LOGIC_INPUT("maincpu", "coinsw", "coinsw.POS", 0, 0x01) + MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.OUT", 0, 0x01) /* video hardware */ @@ -723,7 +797,7 @@ MACHINE_CONFIG_END ROM_START( pong ) /* dummy to satisfy game entry*/ ROM_REGION( 0x10000, "maincpu", 0 ) /* enough for netlist */ - ROM_LOAD( "pong.netlist", 0x000000, 0x003f24, CRC(cc99883b) SHA1(87ea6ec8772db7bf4047695d4c3513fa1a52b6b8) ) + ROM_LOAD( "pong.netlist", 0x000000, 0x0043d9, CRC(64edd5a0) SHA1(9e661f2fba44f46015fdccffa7766dd4e61cdc7d) ) ROM_END ROM_START( pongf ) /* dummy to satisfy game entry*/