mirror of
https://github.com/holub/mame
synced 2025-07-08 11:21:56 +03:00
Various bugfixes for netlist code and improvements for breakout. (nw)
This commit is contained in:
parent
149b356101
commit
14b91227f1
@ -172,6 +172,47 @@ NETLIB_UPDATE_PARAM(POT)
|
||||
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// nld_POT2
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
NETLIB_START(POT2)
|
||||
{
|
||||
register_sub(m_R1, "R1");
|
||||
|
||||
register_subalias("1", m_R1.m_P);
|
||||
register_subalias("2", m_R1.m_N);
|
||||
|
||||
register_param("R", m_R, 1.0 / netlist().gmin());
|
||||
register_param("DIAL", m_Dial, 0.5);
|
||||
register_param("DIALLOG", m_DialIsLog, 0);
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(POT2)
|
||||
{
|
||||
m_R1.do_reset();
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(POT2)
|
||||
{
|
||||
m_R1.update_dev();
|
||||
}
|
||||
|
||||
NETLIB_UPDATE_PARAM(POT2)
|
||||
{
|
||||
nl_double v = m_Dial.Value();
|
||||
if (m_DialIsLog.Value())
|
||||
v = (exp(v) - 1.0) / (exp(1.0) - 1.0);
|
||||
|
||||
// FIXME: Only attached nets should be brought up to current time
|
||||
//netlist().solver()->update_to_current_time(); // bring up current time
|
||||
|
||||
m_R1.update_dev();
|
||||
|
||||
m_R1.set_R(MAX(m_R.Value() * v, netlist().gmin()));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// nld_C
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
@ -47,6 +47,11 @@
|
||||
NET_REGISTER_DEV(POT, _name) \
|
||||
NETDEV_PARAMI(_name, R, _R)
|
||||
|
||||
/* Does not have pin 3 connected */
|
||||
#define POT2(_name, _R) \
|
||||
NET_REGISTER_DEV(POT2, _name) \
|
||||
NETDEV_PARAMI(_name, R, _R)
|
||||
|
||||
|
||||
#define CAP(_name, _C) \
|
||||
NET_REGISTER_DEV(C, _name) \
|
||||
@ -161,6 +166,14 @@ NETLIB_DEVICE_WITH_PARAMS(POT,
|
||||
netlist_param_logic_t m_DialIsLog;
|
||||
);
|
||||
|
||||
NETLIB_DEVICE_WITH_PARAMS(POT2,
|
||||
NETLIB_NAME(R_base) m_R1;
|
||||
|
||||
netlist_param_double_t m_R;
|
||||
netlist_param_double_t m_Dial;
|
||||
netlist_param_logic_t m_DialIsLog;
|
||||
);
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// nld_C
|
||||
|
@ -72,6 +72,7 @@ void nl_initialize_factory(netlist_factory_t &factory)
|
||||
{
|
||||
ENTRY(R, RES, "R")
|
||||
ENTRY(POT, POT, "R")
|
||||
ENTRY(POT2, POT2, "R")
|
||||
ENTRY(C, CAP, "C")
|
||||
ENTRY(D, DIODE, "model")
|
||||
ENTRY(VCVS, VCVS, "-") // FIXME: STD parameters ?
|
||||
|
@ -41,10 +41,11 @@ NETLIB_RESET(74192)
|
||||
// FIXME: Timing
|
||||
static const netlist_time delay[4] =
|
||||
{
|
||||
NLTIME_FROM_NS(18),
|
||||
NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
|
||||
NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
|
||||
NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
|
||||
NLTIME_FROM_NS(40),
|
||||
NLTIME_FROM_NS(40),
|
||||
NLTIME_FROM_NS(40),
|
||||
NLTIME_FROM_NS(40)
|
||||
};
|
||||
|
||||
NETLIB_UPDATE(74192)
|
||||
{
|
||||
@ -57,7 +58,7 @@ NETLIB_UPDATE(74192)
|
||||
else if (!INPLOGIC(m_LOADQ))
|
||||
{
|
||||
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
|
||||
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_D) << 0);
|
||||
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -67,11 +68,6 @@ NETLIB_UPDATE(74192)
|
||||
if (m_cnt > MAXCNT)
|
||||
m_cnt = 0;
|
||||
}
|
||||
else if (INPLOGIC(m_CD) && m_last_CU && !INPLOGIC(m_CU))
|
||||
{
|
||||
if (m_cnt == MAXCNT)
|
||||
tCarry = 0;
|
||||
}
|
||||
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
|
||||
{
|
||||
if (m_cnt > 0)
|
||||
@ -79,13 +75,14 @@ NETLIB_UPDATE(74192)
|
||||
else
|
||||
m_cnt = MAXCNT;
|
||||
}
|
||||
else if (INPLOGIC(m_CU) && m_last_CD && !INPLOGIC(m_CD))
|
||||
{
|
||||
if (m_cnt == 0)
|
||||
tBorrow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
|
||||
tCarry = 0;
|
||||
|
||||
if (!INPLOGIC(m_CD) && (m_cnt == 0))
|
||||
tBorrow = 0;
|
||||
|
||||
m_last_CD = INPLOGIC(m_CD);
|
||||
m_last_CU = INPLOGIC(m_CU);
|
||||
|
||||
|
@ -41,10 +41,11 @@ NETLIB_RESET(74193)
|
||||
// FIXME: Timing
|
||||
static const netlist_time delay[4] =
|
||||
{
|
||||
NLTIME_FROM_NS(18),
|
||||
NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
|
||||
NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
|
||||
NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
|
||||
NLTIME_FROM_NS(40),
|
||||
NLTIME_FROM_NS(40),
|
||||
NLTIME_FROM_NS(40),
|
||||
NLTIME_FROM_NS(40)
|
||||
};
|
||||
|
||||
NETLIB_UPDATE(74193)
|
||||
{
|
||||
@ -57,7 +58,7 @@ NETLIB_UPDATE(74193)
|
||||
else if (!INPLOGIC(m_LOADQ))
|
||||
{
|
||||
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
|
||||
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_D) << 0);
|
||||
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -67,11 +68,6 @@ NETLIB_UPDATE(74193)
|
||||
if (m_cnt > MAXCNT)
|
||||
m_cnt = 0;
|
||||
}
|
||||
else if (INPLOGIC(m_CD) && m_last_CU && !INPLOGIC(m_CU))
|
||||
{
|
||||
if (m_cnt == MAXCNT)
|
||||
tCarry = 0;
|
||||
}
|
||||
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
|
||||
{
|
||||
if (m_cnt > 0)
|
||||
@ -79,13 +75,14 @@ NETLIB_UPDATE(74193)
|
||||
else
|
||||
m_cnt = MAXCNT;
|
||||
}
|
||||
else if (INPLOGIC(m_CU) && m_last_CD && !INPLOGIC(m_CD))
|
||||
{
|
||||
if (m_cnt == 0)
|
||||
tBorrow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
|
||||
tCarry = 0;
|
||||
|
||||
if (!INPLOGIC(m_CD) && (m_cnt == 0))
|
||||
tBorrow = 0;
|
||||
|
||||
m_last_CD = INPLOGIC(m_CD);
|
||||
m_last_CU = INPLOGIC(m_CU);
|
||||
|
||||
|
@ -85,8 +85,8 @@ NETLIB_RESET(7474sub)
|
||||
|
||||
m_nextD = 0;
|
||||
/* FIXME: required by pong doubles - need a mechanism to set this from netlist */
|
||||
//m_Q.initial(1);
|
||||
//m_QQ.initial(1);
|
||||
m_Q.initial(1);
|
||||
m_QQ.initial(1);
|
||||
}
|
||||
|
||||
NETLIB_START(7474_dip)
|
||||
|
@ -11,7 +11,7 @@ static const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
|
||||
// FIXME: optimize device (separate address decoder!)
|
||||
NETLIB_UPDATE(82S16)
|
||||
{
|
||||
if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE1Q) || INPLOGIC(m_CE1Q))
|
||||
if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE2Q) || INPLOGIC(m_CE3Q))
|
||||
{
|
||||
// FIXME: Outputs are tristate. This needs to be properly implemented
|
||||
OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(40));
|
||||
@ -23,7 +23,9 @@ NETLIB_UPDATE(82S16)
|
||||
adr |= (INPLOGIC(m_A[i]) << i);
|
||||
|
||||
if (!INPLOGIC(m_WEQ))
|
||||
{
|
||||
m_ram[adr] = INPLOGIC(m_DIN);
|
||||
}
|
||||
OUTLOGIC(m_DOUTQ, m_ram[adr] ^ 1, NLTIME_FROM_NS(40));
|
||||
}
|
||||
}
|
||||
|
@ -164,12 +164,13 @@ public:
|
||||
ttline = pstring(truthtable[0]);
|
||||
truthtable++;
|
||||
}
|
||||
#if 0
|
||||
for (int j=0; j < m_size; j++)
|
||||
printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1),
|
||||
m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j][0]);
|
||||
for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero; k++)
|
||||
printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0);
|
||||
|
||||
#endif
|
||||
m_ttp->m_initialized = true;
|
||||
|
||||
}
|
||||
|
@ -115,13 +115,14 @@ public:
|
||||
RES(_name ## _R1, (_pdesc)->r1) \
|
||||
CAP(_name ## _C1, (_pdesc)->c1) \
|
||||
RES(_name ## _R2, (_pdesc)->r2) \
|
||||
CAP(_name ## _C2, (_pdesc)->c2) \
|
||||
NET_C(_name.1, _name ## _C1.1) \
|
||||
NET_C(_name.2, _name ## _C1.2) \
|
||||
NET_C(_name.2, _name ## _R1.2) \
|
||||
NET_C(VCC, _name ## _R1.1) \
|
||||
if (((_pdesc)->c2)>1e-15) { \
|
||||
CAP(_name ## _C2, (_pdesc)->c2) \
|
||||
NET_C(_name.15, _name ## _C2.1) \
|
||||
NET_C(_name.14, _name ## _C2.2) \
|
||||
NET_C(_name.14, _name ## _C2.2) }\
|
||||
NET_C(_name.14, _name ## _R2.2) \
|
||||
NET_C(VCC, _name ## _R2.1) \
|
||||
|
||||
@ -158,7 +159,8 @@ public:
|
||||
inline int CAPACITOR_tc(const double c, const double r)
|
||||
{
|
||||
static const double TIME_CONSTANT = -log((3.4 - 2.0) / 3.4);
|
||||
return (int) (TIME_CONSTANT * (130.0 + r) * c * 1e9);
|
||||
int ret = (int) (TIME_CONSTANT * (130.0 + r) * c * 1e9 * 0.1); // 0.1 avoids bricks with shadow
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define CHIP_CAPACITOR(_name, _pdesc) \
|
||||
|
@ -77,7 +77,7 @@
|
||||
//2 555 timers
|
||||
static Astable555Desc b2_555_desc(OHM(560.0), M_OHM(1.8), U_FARAD(0.1));
|
||||
|
||||
static Mono555Desc c9_555_desc(OHM(47.0), U_FARAD(1.0)); // R33, C21
|
||||
static Mono555Desc c9_555_desc(OHM(47000.0), U_FARAD(1.0)); // R33, C21
|
||||
|
||||
//check these values
|
||||
//static Paddle1HorizontalDesc pad1_desc(15047.0, 47.0, &c9_555_desc);
|
||||
@ -122,7 +122,7 @@ static AUDIO_DESC( breakout )
|
||||
VIDEO_DESC_END
|
||||
#endif
|
||||
|
||||
static Mono9602Desc n8_desc(K_OHM(33.0), U_FARAD(100.0), K_OHM(5.6), P_FARAD(0.01)); // No capacitor on 2nd 9602, assume very low internal capacitance
|
||||
static Mono9602Desc n8_desc(K_OHM(33.0), U_FARAD(100.0), K_OHM(5.6), P_FARAD(1)); // No capacitor on 2nd 9602, assume very low internal capacitance
|
||||
static Mono9602Desc f3_desc(K_OHM(47.0), U_FARAD(1.0), K_OHM(47.0), U_FARAD(1.0));
|
||||
|
||||
static Mono9602Desc a7_desc(K_OHM(68.0), U_FARAD(1.0), K_OHM(22.0), U_FARAD(10.0));
|
||||
@ -195,8 +195,8 @@ CIRCUIT_LAYOUT( breakout )
|
||||
CHIP("C6", 7486)
|
||||
CHIP("C7", 9316)
|
||||
CHIP("C8", 9316)
|
||||
CHIP_555_Mono(C9, &c9_555_desc)
|
||||
|
||||
//CHIP_555_Mono(C9, &c9_555_desc)
|
||||
NE555_DIP(C9)
|
||||
CHIP("D2", 7432)
|
||||
CHIP("D3", 7474)
|
||||
CHIP("D4", 9316)
|
||||
@ -921,8 +921,16 @@ CIRCUIT_LAYOUT( breakout )
|
||||
CONNECTION("PAD_EN_BUF", 2, "C9", 4)
|
||||
CONNECTION("PAD_EN_BUF", 2, "C9", 2)
|
||||
#else
|
||||
// NOTE: Stabilizing CAP C20 not modelled.
|
||||
CONNECTION(PAD_EN_n, "C9", 4)
|
||||
CONNECTION(PAD_EN_n, "C9", 2)
|
||||
NET_C(C9.8, V5)
|
||||
NET_C(C9.1, GND)
|
||||
RES(R53, RES_K(12)) // 12k
|
||||
CAP(C21, CAP_U(1))
|
||||
NET_C(GND, C21.2, R53.2)
|
||||
NET_C(C21.1, R53.1, C9.6, C9.7)
|
||||
|
||||
#endif
|
||||
|
||||
CONNECTION(BTB_HIT_n, "C5", 3)
|
||||
@ -1660,6 +1668,16 @@ CIRCUIT_LAYOUT( breakout )
|
||||
CONNECTION("LOG1", 16, "L3", 6)*/ //N
|
||||
#endif
|
||||
|
||||
// POTS
|
||||
POT2(POTP1, RES_K(6)) // 5k
|
||||
PARAM(POTP1, 0) // Log Dial ...
|
||||
RES(R33, 47)
|
||||
|
||||
NET_C(POTP1.1, V5)
|
||||
//NET_C(POTP1.3, GND)
|
||||
NET_C(POTP1.2, R33.1)
|
||||
NET_C(R33.2, C9.6)
|
||||
|
||||
CIRCUIT_LAYOUT_END
|
||||
|
||||
#endif
|
||||
|
@ -227,11 +227,16 @@ static INPUT_PORTS_START( breakout )
|
||||
PORT_START( "PADDLE1" ) /* fake input port for player 2 paddle */
|
||||
PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(2) PORT_KEYDELTA(100) PORT_CENTERDELTA(0) PORT_PLAYER(2) NETLIST_ANALOG_PORT_CHANGED("maincpu", "pot1")
|
||||
#endif
|
||||
|
||||
PORT_START( "PADDLE0" ) /* fake input port for player 1 paddle */
|
||||
PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(2) PORT_KEYDELTA(100) PORT_CENTERDELTA(0) NETLIST_ANALOG_PORT_CHANGED("maincpu", "pot0")
|
||||
|
||||
PORT_START("IN0") /* fake as well */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "coinsw1")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "coinsw2")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "startsw1")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "startsw2")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "servesw")
|
||||
|
||||
#if 0
|
||||
PORT_DIPNAME( 0x06, 0x00, "Game Won" ) PORT_DIPLOCATION("SW1A:1,SW1B:1") PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_SWITCH)
|
||||
@ -297,10 +302,12 @@ static MACHINE_CONFIG_START( breakout, breakout_state )
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "sw1a", "sw1a.POS", 0, 0x01)
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "sw1b", "sw1b.POS", 0, 0x01)
|
||||
#endif
|
||||
MCFG_NETLIST_ANALOG_INPUT("maincpu", "pot0", "POTP1.DIAL")
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "coinsw1", "COIN1_SW.POS", 0, 0x01)
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "coinsw2", "COIN2_SW.POS", 0, 0x01)
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "startsw1", "START1_SW.POS", 0, 0x01)
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "startsw2", "START2_SW.POS", 0, 0x01)
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "servesw", "SERVE_SW.POS", 0, 0x01)
|
||||
#if 0
|
||||
MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0, 0x01)
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user