mirror of
https://github.com/holub/mame
synced 2025-04-20 15:32:45 +03:00
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:
parent
4c579d7705
commit
e03c983836
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -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
|
||||
|
@ -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)
|
||||
|
@ -74,6 +74,8 @@
|
||||
|
||||
#include "nld_ne555.h"
|
||||
|
||||
#include "nld_switches.h"
|
||||
|
||||
#include "nld_log.h"
|
||||
|
||||
#include "nld_solver.h"
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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_ */
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
49
src/emu/netlist/devices/nld_switches.c
Normal file
49
src/emu/netlist/devices/nld_switches.c
Normal 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();
|
||||
}
|
38
src/emu/netlist/devices/nld_switches.h
Normal file
38
src/emu/netlist/devices/nld_switches.h
Normal 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_ */
|
@ -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 \
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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*/
|
||||
|
Loading…
Reference in New Issue
Block a user