mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
Minor speed improvements and some timing adjustments. (nw)
This commit is contained in:
parent
16618b71c7
commit
b0979ceb10
@ -29,7 +29,7 @@ NETLIB_RESET(74175_sub)
|
||||
{
|
||||
m_CLK.set_state(netlist_input_t::STATE_INP_LH);
|
||||
m_clrq = 0;
|
||||
m_data = 0;
|
||||
m_data = 0xFF;
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(74175_sub)
|
||||
@ -42,26 +42,31 @@ NETLIB_UPDATE(74175_sub)
|
||||
OUTLOGIC(m_Q[i], d, delay[d]);
|
||||
OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]);
|
||||
}
|
||||
m_CLK.inactivate();
|
||||
}
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(74175)
|
||||
{
|
||||
if (!INPLOGIC(m_CLRQ))
|
||||
UINT8 d = 0;
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
d |= (INPLOGIC(m_D[i]) << i);
|
||||
}
|
||||
m_sub.m_clrq = INPLOGIC(m_CLRQ);
|
||||
if (!m_sub.m_clrq)
|
||||
{
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]);
|
||||
OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]);
|
||||
}
|
||||
}
|
||||
m_sub.m_clrq = INPLOGIC(m_CLRQ);
|
||||
UINT8 d = 0;
|
||||
for (int i=0; i<4; i++)
|
||||
m_sub.m_data = 0;
|
||||
} else if (d != m_sub.m_data)
|
||||
{
|
||||
d |= (INPLOGIC(m_D[i]) << i);
|
||||
m_sub.m_data = d;
|
||||
m_sub.m_CLK.activate_lh();
|
||||
}
|
||||
m_sub.m_data = d;
|
||||
}
|
||||
|
||||
NETLIB_START(74175)
|
||||
|
@ -51,7 +51,7 @@ NETLIB_SUBDEVICE(74175_sub,
|
||||
netlist_ttl_output_t m_QQ[4];
|
||||
|
||||
netlist_state_t<netlist_sig_t> m_clrq;
|
||||
netlist_state_t<netlist_sig_t> m_data;
|
||||
netlist_state_t<UINT8> m_data;
|
||||
);
|
||||
|
||||
NETLIB_DEVICE(74175,
|
||||
|
@ -9,10 +9,11 @@
|
||||
|
||||
NETLIB_START(74192)
|
||||
{
|
||||
register_input("A", m_A);
|
||||
register_input("B", m_B);
|
||||
register_input("C", m_C);
|
||||
register_input("D", m_D);
|
||||
register_sub(m_ABCD, "subABCD");
|
||||
register_subalias("A", m_ABCD.m_A);
|
||||
register_subalias("B", m_ABCD.m_B);
|
||||
register_subalias("C", m_ABCD.m_C);
|
||||
register_subalias("D", m_ABCD.m_D);
|
||||
register_input("CLEAR", m_CLEAR);
|
||||
register_input("LOADQ", m_LOADQ);
|
||||
register_input("CU", m_CU);
|
||||
@ -57,8 +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_A) << 0);
|
||||
m_cnt = m_ABCD.read_ABCD();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -101,7 +101,7 @@ NETLIB_START(74192_dip)
|
||||
{
|
||||
NETLIB_NAME(74192)::start();
|
||||
|
||||
register_subalias("1", m_B);
|
||||
register_subalias("1", m_ABCD.m_B);
|
||||
register_subalias("2", m_Q[1]);
|
||||
register_subalias("3", m_Q[0]);
|
||||
register_subalias("4", m_CD);
|
||||
@ -109,13 +109,13 @@ NETLIB_START(74192_dip)
|
||||
register_subalias("6", m_Q[2]);
|
||||
register_subalias("7", m_Q[3]);
|
||||
|
||||
register_subalias("9", m_D);
|
||||
register_subalias("10", m_C);
|
||||
register_subalias("9", m_ABCD.m_D);
|
||||
register_subalias("10", m_ABCD.m_C);
|
||||
register_subalias("11", m_LOADQ);
|
||||
register_subalias("12", m_CARRYQ);
|
||||
register_subalias("13", m_BORROWQ);
|
||||
register_subalias("14", m_CLEAR);
|
||||
register_subalias("15", m_A);
|
||||
register_subalias("15", m_ABCD.m_A);
|
||||
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#define NLD_74192_H_
|
||||
|
||||
#include "../nl_base.h"
|
||||
#include "nld_9316.h"
|
||||
|
||||
#define TTL_74192(_name) \
|
||||
NET_REGISTER_DEV(74192, _name)
|
||||
@ -40,10 +41,7 @@
|
||||
NETLIB_DEVICE(74192,
|
||||
ATTR_HOT void update_outputs();
|
||||
|
||||
netlist_ttl_input_t m_A;
|
||||
netlist_ttl_input_t m_B;
|
||||
netlist_ttl_input_t m_C;
|
||||
netlist_ttl_input_t m_D;
|
||||
NETLIB_NAME(9316_subABCD) m_ABCD;
|
||||
netlist_ttl_input_t m_CLEAR;
|
||||
netlist_ttl_input_t m_LOADQ;
|
||||
netlist_ttl_input_t m_CU;
|
||||
|
@ -15,15 +15,15 @@ NETLIB_UPDATE(82S16)
|
||||
{
|
||||
// FIXME: Outputs are tristate. This needs to be properly implemented
|
||||
OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20));
|
||||
for (int i=0; i<8; i++)
|
||||
m_A[i].inactivate();
|
||||
//for (int i=0; i<8; i++)
|
||||
//m_A[i].inactivate();
|
||||
}
|
||||
else
|
||||
{
|
||||
int adr = 0;
|
||||
for (int i=0; i<8; i++)
|
||||
{
|
||||
m_A[i].activate();
|
||||
//m_A[i].activate();
|
||||
adr |= (INPLOGIC(m_A[i]) << i);
|
||||
}
|
||||
|
||||
|
@ -50,15 +50,12 @@ NETLIB_START(9310_subABCD)
|
||||
|
||||
NETLIB_RESET(9310_subABCD)
|
||||
{
|
||||
#if 0
|
||||
m_A.inactivate();
|
||||
m_B.inactivate();
|
||||
m_C.inactivate();
|
||||
m_D.inactivate();
|
||||
}
|
||||
|
||||
ATTR_HOT inline UINT8 NETLIB_NAME(9310_subABCD::read_ABCD)()
|
||||
{
|
||||
return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(9310_subABCD)
|
||||
@ -75,9 +72,9 @@ NETLIB_START(9310_sub)
|
||||
register_output("QD", m_QD);
|
||||
register_output("RC", m_RC);
|
||||
|
||||
save(NLNAME(m_cnt.ref()));
|
||||
save(NLNAME(m_loadq.ref()));
|
||||
save(NLNAME(m_ent.ref()));
|
||||
save(NLNAME(m_cnt));
|
||||
save(NLNAME(m_loadq));
|
||||
save(NLNAME(m_ent));
|
||||
}
|
||||
|
||||
NETLIB_RESET(9310_sub)
|
||||
@ -90,28 +87,37 @@ NETLIB_RESET(9310_sub)
|
||||
|
||||
NETLIB_UPDATE(9310_sub)
|
||||
{
|
||||
UINT8 cnt = m_cnt;
|
||||
if (m_loadq)
|
||||
{
|
||||
cnt++;
|
||||
if (cnt > MAXCNT)
|
||||
cnt = 0;
|
||||
update_outputs(cnt);
|
||||
OUTLOGIC(m_RC, m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
#if 0
|
||||
if (cnt == 0x0f)
|
||||
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
|
||||
else if (cnt == 0)
|
||||
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
|
||||
m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0;
|
||||
update_outputs(m_cnt);
|
||||
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
#else
|
||||
switch (m_cnt.get())
|
||||
{
|
||||
case MAXCNT - 1:
|
||||
m_cnt = MAXCNT;
|
||||
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
|
||||
OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
|
||||
break;
|
||||
case MAXCNT:
|
||||
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
|
||||
m_cnt = 0;
|
||||
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
|
||||
break;
|
||||
default:
|
||||
m_cnt++;
|
||||
update_outputs(m_cnt);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
cnt = m_ABCD.get()->read_ABCD();
|
||||
update_outputs_all(cnt);
|
||||
OUTLOGIC(m_RC, m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
m_cnt = m_ABCD.get()->read_ABCD();
|
||||
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
|
||||
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
|
||||
}
|
||||
m_cnt = cnt;
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(9310)
|
||||
@ -123,26 +129,23 @@ NETLIB_UPDATE(9310)
|
||||
if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
|
||||
{
|
||||
sub.m_CLK.activate_lh();
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 cnt = sub.m_cnt;
|
||||
sub.m_CLK.inactivate();
|
||||
if (!clrq && (cnt>0))
|
||||
if (!clrq && (sub.m_cnt>0))
|
||||
{
|
||||
cnt = 0;
|
||||
sub.update_outputs(cnt);
|
||||
//OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20));
|
||||
sub.m_cnt = cnt;
|
||||
sub.update_outputs_all(0, NLTIME_FROM_NS(36));
|
||||
sub.m_cnt = 0;
|
||||
//return;
|
||||
}
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
|
||||
}
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
}
|
||||
|
||||
inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt))
|
||||
inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
|
||||
{
|
||||
const netlist_time out_delay = NLTIME_FROM_NS(20);
|
||||
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
|
||||
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
|
||||
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
|
||||
@ -151,8 +154,8 @@ inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt))
|
||||
|
||||
inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
|
||||
{
|
||||
const netlist_time out_delay = NLTIME_FROM_NS(20);
|
||||
#if 1
|
||||
static const netlist_time out_delay = NLTIME_FROM_NS(20);
|
||||
#if 0
|
||||
// for (int i=0; i<4; i++)
|
||||
// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
|
||||
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
|
||||
|
@ -68,12 +68,16 @@ NETLIB_SUBDEVICE(9310_subABCD,
|
||||
netlist_ttl_input_t m_C;
|
||||
netlist_ttl_input_t m_D;
|
||||
|
||||
ATTR_HOT inline UINT8 read_ABCD();
|
||||
ATTR_HOT inline UINT8 read_ABCD() const
|
||||
{
|
||||
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
|
||||
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
|
||||
}
|
||||
);
|
||||
|
||||
NETLIB_SUBDEVICE(9310_sub,
|
||||
ATTR_HOT void update_outputs_all(const UINT8 cnt);
|
||||
ATTR_HOT void update_outputs(const UINT8 cnt);
|
||||
ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
|
||||
ATTR_HOT inline void update_outputs(const UINT8 cnt);
|
||||
|
||||
netlist_ttl_input_t m_CLK;
|
||||
|
||||
|
@ -50,15 +50,12 @@ NETLIB_START(9316_subABCD)
|
||||
|
||||
NETLIB_RESET(9316_subABCD)
|
||||
{
|
||||
#if 0
|
||||
m_A.inactivate();
|
||||
m_B.inactivate();
|
||||
m_C.inactivate();
|
||||
m_D.inactivate();
|
||||
}
|
||||
|
||||
ATTR_HOT inline UINT8 NETLIB_NAME(9316_subABCD::read_ABCD)()
|
||||
{
|
||||
return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(9316_subABCD)
|
||||
@ -99,15 +96,15 @@ NETLIB_UPDATE(9316_sub)
|
||||
#else
|
||||
switch (m_cnt.get())
|
||||
{
|
||||
case 0x0e:
|
||||
m_cnt = 0x0f;
|
||||
case MAXCNT - 1:
|
||||
m_cnt = MAXCNT;
|
||||
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
|
||||
OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
|
||||
break;
|
||||
case 0x0f:
|
||||
case MAXCNT:
|
||||
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
|
||||
m_cnt = 0;
|
||||
update_outputs_all(m_cnt);
|
||||
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
|
||||
break;
|
||||
default:
|
||||
m_cnt++;
|
||||
@ -118,8 +115,8 @@ NETLIB_UPDATE(9316_sub)
|
||||
else
|
||||
{
|
||||
m_cnt = m_ABCD.get()->read_ABCD();
|
||||
update_outputs_all(m_cnt);
|
||||
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
|
||||
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
|
||||
}
|
||||
}
|
||||
|
||||
@ -129,27 +126,26 @@ NETLIB_UPDATE(9316)
|
||||
sub.m_ent = INPLOGIC(m_ENT);
|
||||
const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
|
||||
|
||||
if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
|
||||
if ((!sub.m_loadq | (sub.m_ent & INPLOGIC(m_ENP))) & clrq)
|
||||
{
|
||||
sub.m_CLK.activate_lh();
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
|
||||
}
|
||||
else
|
||||
{
|
||||
sub.m_CLK.inactivate();
|
||||
if (!clrq && (sub.m_cnt>0))
|
||||
{
|
||||
sub.update_outputs(0);
|
||||
sub.update_outputs_all(0, NLTIME_FROM_NS(36));
|
||||
sub.m_cnt = 0;
|
||||
//return;
|
||||
}
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
|
||||
}
|
||||
}
|
||||
|
||||
inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt))
|
||||
inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
|
||||
{
|
||||
const netlist_time out_delay = NLTIME_FROM_NS(20);
|
||||
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
|
||||
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
|
||||
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
|
||||
|
@ -72,12 +72,16 @@ NETLIB_SUBDEVICE(9316_subABCD,
|
||||
netlist_ttl_input_t m_C;
|
||||
netlist_ttl_input_t m_D;
|
||||
|
||||
ATTR_HOT inline UINT8 read_ABCD();
|
||||
ATTR_HOT inline UINT8 read_ABCD() const
|
||||
{
|
||||
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
|
||||
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
|
||||
}
|
||||
);
|
||||
|
||||
NETLIB_SUBDEVICE(9316_sub,
|
||||
ATTR_HOT void update_outputs_all(const UINT8 cnt);
|
||||
ATTR_HOT void update_outputs(const UINT8 cnt);
|
||||
ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
|
||||
ATTR_HOT inline void update_outputs(const UINT8 cnt);
|
||||
|
||||
netlist_ttl_input_t m_CLK;
|
||||
|
||||
|
@ -161,7 +161,9 @@ CIRCUIT_LAYOUT( breakout )
|
||||
PARAM(Solver.ACCURACY, 1e-8) // less accuracy and diode will not work
|
||||
#else
|
||||
SOLVER(Solver, 48000)
|
||||
PARAM(Solver.ACCURACY, 1e-6) // less accuracy and diode will not work
|
||||
PARAM(Solver.ACCURACY, 1e-6)
|
||||
PARAM(Solver.GS_THRESHOLD, 2)
|
||||
//PARAM(Solver.SOR_FACTOR, 1)
|
||||
#endif
|
||||
//CHIP("CLOCK", CLOCK_14_318_MHZ)
|
||||
MAINCLOCK(Y1, 14318000.0)
|
||||
@ -386,7 +388,7 @@ CIRCUIT_LAYOUT( breakout )
|
||||
#define PAD_EN_n "C2", 8
|
||||
|
||||
//#define P VCC
|
||||
#define P "V5", Q
|
||||
#define P "ttlhigh", Q
|
||||
|
||||
#define COIN "L9", 6
|
||||
#define COIN1_n "F8", 5
|
||||
@ -1631,14 +1633,21 @@ CIRCUIT_LAYOUT( breakout )
|
||||
|
||||
NET_C(CR6.A, R41.1, R42.1, R43.1, R51.1, R52.1)
|
||||
#else
|
||||
//RES_SWITCH(CR6, E2.11, R41.1, GND)
|
||||
RES_SWITCH(CR6, E2.11, R41.1, GND)
|
||||
PARAM(CR6.RON, 1e20)
|
||||
PARAM(CR6.ROFF, 1)
|
||||
NET_C(R41.1, R42.1, R43.1, R51.1, R52.1)
|
||||
#endif
|
||||
#if 1
|
||||
CONNECTION("R51", 2, PLAYFIELD)
|
||||
CONNECTION("R43", 2, BSYNC)
|
||||
CONNECTION("R52", 2, SCORE)
|
||||
#else
|
||||
CONNECTION("R51", 2, "V5", Q)
|
||||
CONNECTION("R43", 2, "V5", Q)
|
||||
CONNECTION("R52", 2, "V5", Q)
|
||||
#endif
|
||||
NET_C(R41.2, B9.3)
|
||||
NET_C(R42.2, V5)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user