Pong now has complete emulation of discrete logic for runQ and SRST signals. Rewrote switch2 device to be based on resistances as well. [Couriersud]

This commit is contained in:
Couriersud 2014-01-02 00:30:21 +00:00
parent 4c579d7705
commit e03c983836
11 changed files with 185 additions and 66 deletions

2
.gitattributes vendored
View File

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

View File

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

View File

@ -74,6 +74,8 @@
#include "nld_ne555.h"
#include "nld_switches.h"
#include "nld_log.h"
#include "nld_solver.h"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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