mirror of
https://github.com/holub/mame
synced 2025-07-06 18:39:28 +03:00
Added device deactivation for 7486 and truthtables for 7437.
Truthtables in the 7448 don't work with pong if device de/activation is enabled. (nw)
This commit is contained in:
parent
6ffebca846
commit
624ea80c5d
@ -7,6 +7,18 @@
|
||||
|
||||
#include "nld_7437.h"
|
||||
|
||||
#if (USE_TRUTHTABLE)
|
||||
nld_7437::truthtable_t nld_7437::m_ttbl;
|
||||
const char *nld_7437::m_desc[] = {
|
||||
"A , B | Q ",
|
||||
"0,X|1|22",
|
||||
"X,0|1|22",
|
||||
"1,1|0|15",
|
||||
""
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
NETLIB_START(7437_dip)
|
||||
{
|
||||
register_sub("1", m_1);
|
||||
|
@ -42,7 +42,12 @@
|
||||
NET_CONNECT(_name, A, _A) \
|
||||
NET_CONNECT(_name, B, _B)
|
||||
|
||||
#if (USE_TRUTHTABLE)
|
||||
#include "nld_truthtable.h"
|
||||
NETLIB_TRUTHTABLE(7437, 2, 1, 0);
|
||||
#else
|
||||
NETLIB_SIGNAL(7437, 2, 0, 0);
|
||||
#endif
|
||||
|
||||
#define TTL_7437_DIP(_name) \
|
||||
NET_REGISTER_DEV(7437_dip, _name)
|
||||
|
@ -7,8 +7,60 @@
|
||||
|
||||
#include "nld_7448.h"
|
||||
|
||||
#if (0 && USE_TRUTHTABLE)
|
||||
nld_7448::truthtable_t nld_7448::m_ttbl;
|
||||
const char *nld_7448::m_desc[] = {
|
||||
" LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g",
|
||||
|
||||
" 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100",
|
||||
" 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100",
|
||||
|
||||
// BI/RBO is input output. In the next case it is used as an output will go low.
|
||||
" 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI
|
||||
|
||||
" 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT
|
||||
|
||||
// This condition has precedence
|
||||
" X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI
|
||||
""
|
||||
};
|
||||
|
||||
NETLIB_START(7448_dip)
|
||||
{
|
||||
NETLIB_NAME(7448)::start();
|
||||
|
||||
register_subalias("1", m_i[4]); // B
|
||||
register_subalias("2", m_i[5]); // C
|
||||
register_subalias("3", m_i[0]); // LTQ
|
||||
register_subalias("4", m_i[1]); // BIQ
|
||||
register_subalias("5", m_i[2]); // RBIQ
|
||||
register_subalias("6", m_i[6]); // D
|
||||
register_subalias("7", m_i[3]); // A
|
||||
|
||||
register_subalias("9", m_Q[4]); // e
|
||||
register_subalias("10", m_Q[3]); // d
|
||||
register_subalias("11", m_Q[2]); // c
|
||||
register_subalias("12", m_Q[1]); // b
|
||||
register_subalias("13", m_Q[0]); // a
|
||||
register_subalias("14", m_Q[6]); // g
|
||||
register_subalias("15", m_Q[5]); // f
|
||||
}
|
||||
|
||||
#else
|
||||
NETLIB_START(7448)
|
||||
{
|
||||
register_sub("sub", sub);
|
||||
@ -21,15 +73,17 @@ NETLIB_START(7448)
|
||||
register_input("BIQ", m_BIQ);
|
||||
register_subalias("RBIQ",sub.m_RBIQ);
|
||||
|
||||
register_subalias("a", sub.m_a);
|
||||
register_subalias("b", sub.m_b);
|
||||
register_subalias("c", sub.m_c);
|
||||
register_subalias("d", sub.m_d);
|
||||
register_subalias("e", sub.m_e);
|
||||
register_subalias("f", sub.m_f);
|
||||
register_subalias("g", sub.m_g);
|
||||
register_subalias("a", sub.m_Q[0]);
|
||||
register_subalias("b", sub.m_Q[1]);
|
||||
register_subalias("c", sub.m_Q[2]);
|
||||
register_subalias("d", sub.m_Q[3]);
|
||||
register_subalias("e", sub.m_Q[4]);
|
||||
register_subalias("f", sub.m_Q[5]);
|
||||
register_subalias("g", sub.m_Q[6]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
NETLIB_RESET(7448)
|
||||
{
|
||||
sub.do_reset();
|
||||
@ -72,20 +126,22 @@ NETLIB_START(7448_sub)
|
||||
register_input("A3", m_D);
|
||||
register_input("RBIQ", m_RBIQ);
|
||||
|
||||
register_output("a", m_a);
|
||||
register_output("b", m_b);
|
||||
register_output("c", m_c);
|
||||
register_output("d", m_d);
|
||||
register_output("e", m_e);
|
||||
register_output("f", m_f);
|
||||
register_output("g", m_g);
|
||||
register_output("a", m_Q[0]);
|
||||
register_output("b", m_Q[1]);
|
||||
register_output("c", m_Q[2]);
|
||||
register_output("d", m_Q[3]);
|
||||
register_output("e", m_Q[4]);
|
||||
register_output("f", m_Q[5]);
|
||||
register_output("g", m_Q[6]);
|
||||
|
||||
save(NLNAME(m_state));
|
||||
save(NLNAME(m_active));
|
||||
}
|
||||
|
||||
NETLIB_RESET(7448_sub)
|
||||
{
|
||||
m_state = 0;
|
||||
m_active = 7;
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(7448_sub)
|
||||
@ -98,6 +154,45 @@ NETLIB_UPDATE(7448_sub)
|
||||
update_outputs(v);
|
||||
}
|
||||
|
||||
#if 0
|
||||
ATTR_HOT void NETLIB_NAME(7448_sub)::inc_active()
|
||||
{
|
||||
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
|
||||
nl_assert(netlist().use_deactivate());
|
||||
if (++m_active == 1)
|
||||
{
|
||||
m_A.activate();
|
||||
m_B.activate();
|
||||
m_C.activate();
|
||||
m_D.activate();
|
||||
m_RBIQ.activate();
|
||||
|
||||
netlist_time mt = this->m_Q[0].net().time();
|
||||
for (int i=1; i<7; i++)
|
||||
{
|
||||
if (this->m_Q[i].net().time() > mt)
|
||||
mt = this->m_Q[i].net().time();
|
||||
}
|
||||
|
||||
for (int i=0; i<7; i++)
|
||||
m_Q[i].net().set_Q_time( tab7448[m_state][i], mt + NLTIME_FROM_NS(100));
|
||||
}
|
||||
}
|
||||
|
||||
ATTR_HOT void NETLIB_NAME(7448_sub)::dec_active()
|
||||
{
|
||||
nl_assert(netlist().use_deactivate());
|
||||
if (--m_active == 0)
|
||||
{
|
||||
m_A.inactivate();
|
||||
m_B.inactivate();
|
||||
m_C.inactivate();
|
||||
m_D.inactivate();
|
||||
m_RBIQ.inactivate();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v))
|
||||
{
|
||||
nl_assert(v<16);
|
||||
@ -105,13 +200,8 @@ NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v))
|
||||
{
|
||||
// max transfer time is 100 NS */
|
||||
|
||||
OUTLOGIC(m_a, tab7448[v][0], NLTIME_FROM_NS(100));
|
||||
OUTLOGIC(m_b, tab7448[v][1], NLTIME_FROM_NS(100));
|
||||
OUTLOGIC(m_c, tab7448[v][2], NLTIME_FROM_NS(100));
|
||||
OUTLOGIC(m_d, tab7448[v][3], NLTIME_FROM_NS(100));
|
||||
OUTLOGIC(m_e, tab7448[v][4], NLTIME_FROM_NS(100));
|
||||
OUTLOGIC(m_f, tab7448[v][5], NLTIME_FROM_NS(100));
|
||||
OUTLOGIC(m_g, tab7448[v][6], NLTIME_FROM_NS(100));
|
||||
for (int i=0; i<7; i++)
|
||||
OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100));
|
||||
m_state = v;
|
||||
}
|
||||
}
|
||||
@ -136,7 +226,6 @@ const UINT8 NETLIB_NAME(7448_sub)::tab7448[16][7] =
|
||||
{ 0, 0, 0, 0, 0, 0, 0 }, /* 15 */
|
||||
};
|
||||
|
||||
|
||||
NETLIB_START(7448_dip)
|
||||
{
|
||||
NETLIB_NAME(7448)::start();
|
||||
@ -149,15 +238,17 @@ NETLIB_START(7448_dip)
|
||||
register_subalias("6", sub.m_D);
|
||||
register_subalias("7", sub.m_A);
|
||||
|
||||
register_subalias("9", sub.m_e);
|
||||
register_subalias("10", sub.m_d);
|
||||
register_subalias("11", sub.m_c);
|
||||
register_subalias("12", sub.m_b);
|
||||
register_subalias("13", sub.m_a);
|
||||
register_subalias("14", sub.m_g);
|
||||
register_subalias("15", sub.m_f);
|
||||
register_subalias("9", sub.m_Q[4]); // e
|
||||
register_subalias("10", sub.m_Q[3]); // d
|
||||
register_subalias("11", sub.m_Q[2]); // c
|
||||
register_subalias("12", sub.m_Q[1]); // b
|
||||
register_subalias("13", sub.m_Q[0]); // a
|
||||
register_subalias("14", sub.m_Q[6]); // g
|
||||
register_subalias("15", sub.m_Q[5]); // f
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
NETLIB_UPDATE(7448_dip)
|
||||
{
|
||||
NETLIB_NAME(7448)::update();
|
||||
|
@ -39,6 +39,19 @@
|
||||
#define TTL_7448_DIP(_name) \
|
||||
NET_REGISTER_DEV(7448_dip, _name)
|
||||
|
||||
/*
|
||||
* FIXME: Big FIXME
|
||||
* The truthtable will ignore BIQ for certain states.
|
||||
* This causes a severe issue in pongf when USE_DEACTIVATE is used.
|
||||
* For now, just use the old implementation.
|
||||
*
|
||||
*/
|
||||
#if (0 && USE_TRUTHTABLE)
|
||||
#include "nld_truthtable.h"
|
||||
|
||||
NETLIB_TRUTHTABLE(7448, 7, 7, 0);
|
||||
#else
|
||||
|
||||
NETLIB_SUBDEVICE(7448_sub,
|
||||
ATTR_HOT void update_outputs(UINT8 v);
|
||||
static const UINT8 tab7448[16][7];
|
||||
@ -50,14 +63,15 @@ NETLIB_SUBDEVICE(7448_sub,
|
||||
netlist_logic_input_t m_RBIQ;
|
||||
|
||||
UINT8 m_state;
|
||||
int m_active;
|
||||
|
||||
netlist_logic_output_t m_a;
|
||||
netlist_logic_output_t m_b;
|
||||
netlist_logic_output_t m_c;
|
||||
netlist_logic_output_t m_d;
|
||||
netlist_logic_output_t m_e;
|
||||
netlist_logic_output_t m_f;
|
||||
netlist_logic_output_t m_g;
|
||||
netlist_logic_output_t m_Q[7]; /* a .. g */
|
||||
|
||||
// FIXME: doesn't work
|
||||
#if 0
|
||||
ATTR_HOT void inc_active();
|
||||
ATTR_HOT void dec_active();
|
||||
#endif
|
||||
);
|
||||
|
||||
NETLIB_DEVICE(7448,
|
||||
@ -67,7 +81,7 @@ public:
|
||||
netlist_logic_input_t m_LTQ;
|
||||
netlist_logic_input_t m_BIQ;
|
||||
);
|
||||
|
||||
#endif
|
||||
NETLIB_DEVICE_DERIVED(7448_dip, 7448,
|
||||
);
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ)
|
||||
{
|
||||
// 0: High-to-low 40 ns, 1: Low-to-high 25 ns
|
||||
static const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
|
||||
const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
|
||||
OUTLOGIC(m_Q, stateQ, delay[stateQ]);
|
||||
OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]);
|
||||
}
|
||||
|
@ -12,16 +12,19 @@ NETLIB_START(7486)
|
||||
register_input("A", m_A);
|
||||
register_input("B", m_B);
|
||||
register_output("Q", m_Q);
|
||||
|
||||
save(NLNAME(m_active));
|
||||
}
|
||||
|
||||
NETLIB_RESET(7486)
|
||||
{
|
||||
m_active = 1;
|
||||
}
|
||||
|
||||
static const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
|
||||
|
||||
NETLIB_UPDATE(7486)
|
||||
{
|
||||
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
|
||||
|
||||
UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B);
|
||||
OUTLOGIC(m_Q, t, delay[t]);
|
||||
}
|
||||
@ -66,3 +69,31 @@ NETLIB_RESET(7486_dip)
|
||||
m_3.do_reset();
|
||||
m_4.do_reset();
|
||||
}
|
||||
|
||||
ATTR_HOT void NETLIB_NAME(7486)::inc_active()
|
||||
{
|
||||
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
|
||||
nl_assert(netlist().use_deactivate());
|
||||
if (++m_active == 1)
|
||||
{
|
||||
netlist_time mt = this->m_A.net().time();
|
||||
if (this->m_B.net().time() > mt)
|
||||
mt = this->m_B.net().time();
|
||||
|
||||
m_A.activate();
|
||||
m_B.activate();
|
||||
|
||||
UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B);
|
||||
m_Q.net().set_Q_time(t, mt + delay[t]);
|
||||
}
|
||||
}
|
||||
|
||||
ATTR_HOT void NETLIB_NAME(7486)::dec_active()
|
||||
{
|
||||
nl_assert(netlist().use_deactivate());
|
||||
if (--m_active == 0)
|
||||
{
|
||||
m_A.inactivate();
|
||||
m_B.inactivate();
|
||||
}
|
||||
}
|
||||
|
@ -44,6 +44,10 @@ public:
|
||||
netlist_logic_input_t m_A;
|
||||
netlist_logic_input_t m_B;
|
||||
netlist_logic_output_t m_Q;
|
||||
|
||||
ATTR_HOT void inc_active();
|
||||
ATTR_HOT void dec_active();
|
||||
int m_active;
|
||||
);
|
||||
|
||||
#define TTL_7486_DIP(_name) \
|
||||
|
@ -86,7 +86,7 @@ ATTR_COLD void truthtable_desc_t::setup(const char **truthtable)
|
||||
truthtable++;
|
||||
|
||||
for (int j=0; j < m_size; j++)
|
||||
m_outs[j] = -1;
|
||||
m_outs[j] = 0; //-1;
|
||||
|
||||
for (int j=0; j < 16; j++)
|
||||
m_timing_nt[j] = netlist_time::zero;
|
||||
@ -128,11 +128,11 @@ ATTR_COLD void truthtable_desc_t::setup(const char **truthtable)
|
||||
// determine ignore
|
||||
UINT32 ign[m_size];
|
||||
|
||||
for (int i=0; i<m_size; i++)
|
||||
for (UINT32 i=0; i<m_size; i++)
|
||||
{
|
||||
#if 1
|
||||
UINT32 m_enable = 0;
|
||||
for (int j=0; j<m_size; j++)
|
||||
for (UINT32 j=0; j<m_size; j++)
|
||||
{
|
||||
if (m_outs[j] != m_outs[i])
|
||||
{
|
||||
|
@ -59,8 +59,8 @@ private:
|
||||
|
||||
/* additional values */
|
||||
|
||||
const int m_num_bits;
|
||||
const int m_size;
|
||||
const UINT32 m_num_bits;
|
||||
const UINT32 m_size;
|
||||
|
||||
};
|
||||
|
||||
@ -154,16 +154,13 @@ public:
|
||||
{
|
||||
if (!doOUT || (m_ign & (1<<i)) != 0)
|
||||
m_i[i].activate();
|
||||
state |= (INPLOGIC(m_i[i]) << i);
|
||||
}
|
||||
|
||||
if (!doOUT)
|
||||
for (int i = 0; i < m_NI; i++)
|
||||
{
|
||||
for (int i = 0; i< m_NI; i++)
|
||||
{
|
||||
state |= (INPLOGIC(m_i[i]) << i);
|
||||
if (!doOUT)
|
||||
if (this->m_i[i].net().time() > mt)
|
||||
mt = this->m_i[i].net().time();
|
||||
}
|
||||
}
|
||||
|
||||
const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0);
|
||||
|
Loading…
Reference in New Issue
Block a user