Various bugfixes for netlist code and improvements for breakout. (nw)

This commit is contained in:
couriersud 2015-04-28 08:39:00 +02:00
parent 149b356101
commit 14b91227f1
11 changed files with 120 additions and 41 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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