trunk/src/emu/netlist/nl_base.h
| r26749 | r26750 | |
| 368 | 368 | netlist_core_terminal_t *m_update_list_next; |
| 369 | 369 | |
| 370 | 370 | protected: |
| 371 | | ATTR_COLD virtual void save_register() { save(NAME(m_state)); netlist_owned_object_t::save_register(); } |
| 371 | ATTR_COLD virtual void save_register() |
| 372 | { |
| 373 | save(NAME(m_state)); |
| 374 | netlist_owned_object_t::save_register(); |
| 375 | } |
| 372 | 376 | |
| 373 | 377 | private: |
| 374 | 378 | netlist_net_t * RESTRICT m_net; |
| r26749 | r26750 | |
| 497 | 501 | ATTR_COLD netlist_analog_input_t() |
| 498 | 502 | : netlist_input_t(INPUT, ANALOG) { } |
| 499 | 503 | |
| 500 | | ATTR_HOT inline const bool is_highz() const; |
| 501 | 504 | ATTR_HOT inline const double Q_Analog() const; |
| 502 | 505 | }; |
| 503 | 506 | |
| r26749 | r26750 | |
| 1019 | 1022 | protected: |
| 1020 | 1023 | ATTR_COLD virtual void save_register() |
| 1021 | 1024 | { |
| 1022 | | //netlist_queue_t m_queue; |
| 1023 | | //netlist().save_manager(m_queue.callback(), "m_queue"); |
| 1024 | 1025 | save(NAME(m_queue.callback())); |
| 1025 | 1026 | save(NAME(m_time_ps)); |
| 1026 | 1027 | save(NAME(m_rem)); |
| r26749 | r26750 | |
| 1254 | 1255 | return net().Q_Analog(); |
| 1255 | 1256 | } |
| 1256 | 1257 | |
| 1257 | | //FIXME: Legacy ... must be removed |
| 1258 | | ATTR_HOT inline const bool netlist_analog_input_t::is_highz() const |
| 1259 | | { |
| 1260 | | return (net().Q_Analog() == NETLIST_HIGHIMP_V); |
| 1261 | | } |
| 1262 | | |
| 1263 | 1258 | // ---------------------------------------------------------------------------------------- |
| 1264 | 1259 | // net_dev class factory |
| 1265 | 1260 | // ---------------------------------------------------------------------------------------- |
trunk/src/emu/netlist/devices/nld_legacy.c
| r26749 | r26750 | |
| 38 | 38 | //update(); |
| 39 | 39 | } |
| 40 | 40 | |
| 41 | | NETLIB_START(nicMixer8) |
| 42 | | { |
| 43 | | static const char *sI[8] = { "I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8" }; |
| 44 | | static const char *sR[8] = { "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8" }; |
| 45 | | int i; |
| 46 | | |
| 47 | | m_low.initial(0); |
| 48 | | |
| 49 | | for (i=0; i<8; i++) |
| 50 | | { |
| 51 | | register_input(sI[i], m_I[i]); |
| 52 | | m_low.net().register_con(m_I[i]); |
| 53 | | //m_I[i].set_output(m_low); |
| 54 | | register_param(sR[i], m_R[i], 1e12); |
| 55 | | } |
| 56 | | register_output("Q", m_Q); |
| 57 | | } |
| 58 | | |
| 59 | | NETLIB_UPDATE(nicMixer8) |
| 60 | | { |
| 61 | | int i; |
| 62 | | double r = 0; |
| 63 | | |
| 64 | | for (i=0; i<8; i++) |
| 65 | | { |
| 66 | | r += m_w[i] * INPANALOG(m_I[i]); |
| 67 | | } |
| 68 | | OUTANALOG(m_Q, r, NLTIME_IMMEDIATE); |
| 69 | | } |
| 70 | | |
| 71 | | NETLIB_UPDATE_PARAM(nicMixer8) |
| 72 | | { |
| 73 | | double t = 0; |
| 74 | | int i; |
| 75 | | |
| 76 | | for (i=0; i<8; i++) |
| 77 | | t += 1.0 / m_R[i].Value(); |
| 78 | | t = 1.0 / t; |
| 79 | | |
| 80 | | for (i=0; i<8; i++) |
| 81 | | m_w[i] = t / m_R[i].Value(); |
| 82 | | } |
| 83 | | |
| 84 | | |
| 85 | | |
| 86 | 41 | NETLIB_START(nicRSFF) |
| 87 | 42 | { |
| 88 | 43 | register_input("S", m_S); |
| r26749 | r26750 | |
| 106 | 61 | OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10)); |
| 107 | 62 | } |
| 108 | 63 | } |
| 109 | | |
| 110 | | |
| 111 | | NETLIB_START(nicNE555N_MSTABLE) |
| 112 | | { |
| 113 | | register_input("TRIG", m_trigger); |
| 114 | | register_input("CV", m_CV); |
| 115 | | |
| 116 | | register_output("Q", m_Q); |
| 117 | | register_param("R", m_R, 0.0); |
| 118 | | register_param("C", m_C, 0.0); |
| 119 | | register_param("VS", m_VS, 5.0); |
| 120 | | register_param("VL", m_VL, 0.0 *5.0); |
| 121 | | |
| 122 | | m_THRESHOLD_OUT.init_object(*this, name() + "THRESHOLD"); |
| 123 | | register_link_internal(m_THRESHOLD, m_THRESHOLD_OUT, netlist_input_t::STATE_INP_ACTIVE); |
| 124 | | |
| 125 | | m_Q.initial(5.0 * 0.4); |
| 126 | | m_last = false; |
| 127 | | |
| 128 | | save(NAME(m_last)); |
| 129 | | |
| 130 | | } |
| 131 | | |
| 132 | | inline double NETLIB_NAME(nicNE555N_MSTABLE)::nicNE555N_cv() |
| 133 | | { |
| 134 | | return (m_CV.is_highz() ? 0.67 * m_VS.Value() : INPANALOG(m_CV)); |
| 135 | | } |
| 136 | | |
| 137 | | inline double NETLIB_NAME(nicNE555N_MSTABLE)::nicNE555N_clamp(const double v, const double a, const double b) |
| 138 | | { |
| 139 | | double ret = v; |
| 140 | | if (ret > m_VS.Value() - a) |
| 141 | | ret = m_VS.Value() - a; |
| 142 | | if (ret < b) |
| 143 | | ret = b; |
| 144 | | return ret; |
| 145 | | } |
| 146 | | |
| 147 | | NETLIB_UPDATE_PARAM(nicNE555N_MSTABLE) |
| 148 | | { |
| 149 | | } |
| 150 | | |
| 151 | | NETLIB_UPDATE(nicNE555N_MSTABLE) |
| 152 | | { |
| 153 | | update_param(); // FIXME : m_CV should be on a sub device ... |
| 154 | | |
| 155 | | double vt = nicNE555N_clamp(nicNE555N_cv(), 0.7, 1.4); |
| 156 | | bool bthresh = (INPANALOG(m_THRESHOLD) > vt); |
| 157 | | bool btrig = (INPANALOG(m_trigger) > nicNE555N_clamp(nicNE555N_cv() * 0.5, 0.7, 1.4)); |
| 158 | | bool out = m_last; |
| 159 | | |
| 160 | | if (!btrig) |
| 161 | | { |
| 162 | | out = true; |
| 163 | | } |
| 164 | | else if (bthresh) |
| 165 | | { |
| 166 | | out = false; |
| 167 | | } |
| 168 | | |
| 169 | | if (!m_last && out) |
| 170 | | { |
| 171 | | double vl = m_VL.Value(); |
| 172 | | double time; |
| 173 | | |
| 174 | | // FIXME : m_CV should be on a sub device ... |
| 175 | | |
| 176 | | // TI datasheet states minimum pulse of 10 us |
| 177 | | if (vt<vl) |
| 178 | | time = 10; |
| 179 | | else |
| 180 | | { |
| 181 | | time = - log((m_VS.Value()-vt)/(m_VS.Value()-vl)) * m_R.Value() * m_C.Value() * 1.0e6; // in us |
| 182 | | if (time < 10.0) |
| 183 | | time = 10.0; |
| 184 | | } |
| 185 | | |
| 186 | | OUTANALOG(m_Q, m_VS.Value() * 0.7, NLTIME_FROM_NS(100)); |
| 187 | | OUTANALOG(m_THRESHOLD_OUT, m_VS.Value(), NLTIME_FROM_US(time )); |
| 188 | | } |
| 189 | | else if (m_last && !out) |
| 190 | | { |
| 191 | | OUTANALOG(m_Q, 0.25, NLTIME_FROM_NS(100)); |
| 192 | | OUTANALOG(m_THRESHOLD_OUT, 0.0, NLTIME_FROM_NS(1)); |
| 193 | | } |
| 194 | | m_last = out; |
| 195 | | } |
trunk/src/emu/netlist/devices/nld_legacy.h
| r26749 | r26750 | |
| 24 | 24 | NET_CONNECT(_name, S, _S) \ |
| 25 | 25 | NET_CONNECT(_name, R, _R) |
| 26 | 26 | |
| 27 | | |
| 28 | | #define NE555N_MSTABLE(_name, _TRIG, _CV) \ |
| 29 | | NET_REGISTER_DEV(nicNE555N_MSTABLE, _name) \ |
| 30 | | NET_CONNECT(_name, TRIG, _TRIG) \ |
| 31 | | NET_CONNECT(_name, CV, _CV) |
| 32 | | |
| 33 | | #define NETDEV_MIXER3(_name, _I1, _I2, _I3) \ |
| 34 | | NET_REGISTER_DEV(nicMixer8, _name) \ |
| 35 | | NET_CONNECT(_name, I1, _I1) \ |
| 36 | | NET_CONNECT(_name, I2, _I2) \ |
| 37 | | NET_CONNECT(_name, I3, _I3) |
| 38 | | |
| 39 | 27 | #define NETDEV_SWITCH2(_name, _i1, _i2) \ |
| 40 | 28 | NET_REGISTER_DEV(nicMultiSwitch, _name) \ |
| 41 | 29 | NET_CONNECT(_name, i1, _i1) \ |
| r26749 | r26750 | |
| 53 | 41 | netlist_ttl_output_t m_QQ; |
| 54 | 42 | ); |
| 55 | 43 | |
| 56 | | NETLIB_DEVICE_WITH_PARAMS(nicMixer8, |
| 57 | | netlist_analog_input_t m_I[8]; |
| 58 | | |
| 59 | | netlist_analog_output_t m_Q; |
| 60 | | netlist_analog_output_t m_low; |
| 61 | | |
| 62 | | netlist_param_double_t m_R[8]; |
| 63 | | |
| 64 | | double m_w[8]; |
| 65 | | ); |
| 66 | | |
| 67 | | NETLIB_DEVICE_WITH_PARAMS(nicNE555N_MSTABLE, |
| 68 | | |
| 69 | | //ATTR_HOT void timer_cb(INT32 timer_id); |
| 70 | | |
| 71 | | netlist_analog_input_t m_trigger; |
| 72 | | netlist_analog_input_t m_CV; |
| 73 | | netlist_analog_input_t m_THRESHOLD; /* internal */ |
| 74 | | |
| 75 | | bool m_last; |
| 76 | | |
| 77 | | netlist_analog_output_t m_Q; |
| 78 | | netlist_analog_output_t m_THRESHOLD_OUT; /* internal */ |
| 79 | | |
| 80 | | //netlist_base_timer_t *m_timer; |
| 81 | | netlist_param_double_t m_R; |
| 82 | | netlist_param_double_t m_C; |
| 83 | | netlist_param_double_t m_VS; |
| 84 | | netlist_param_double_t m_VL; |
| 85 | | |
| 86 | | double nicNE555N_cv(); |
| 87 | | double nicNE555N_clamp(const double v, const double a, const double b); |
| 88 | | |
| 89 | | ); |
| 90 | | |
| 91 | 44 | NETLIB_DEVICE_WITH_PARAMS(nicMultiSwitch, |
| 92 | 45 | netlist_analog_input_t m_I[8]; |
| 93 | 46 | |
trunk/src/emu/netlist/devices/nld_74153.c
| r0 | r26750 | |
| 1 | /* |
| 2 | * nld_74153.c |
| 3 | * |
| 4 | */ |
| 5 | |
| 6 | #include "nld_74153.h" |
| 7 | |
| 8 | NETLIB_START(nic74153) |
| 9 | { |
| 10 | register_input("C0", m_C[0]); |
| 11 | register_input("C1", m_C[1]); |
| 12 | register_input("C2", m_C[2]); |
| 13 | register_input("C3", m_C[3]); |
| 14 | register_input("A", m_A); |
| 15 | register_input("B", m_B); |
| 16 | register_input("G", m_G); |
| 17 | |
| 18 | register_output("AY", m_Y); //FIXME: Change netlists |
| 19 | } |
| 20 | |
| 21 | /* FIXME: timing is not 100% accurate, Strobe and Select inputs have a |
| 22 | * slightly longer timing. |
| 23 | * Convert this to sub-devices at some time. |
| 24 | */ |
| 25 | |
| 26 | NETLIB_UPDATE(nic74153) |
| 27 | { |
| 28 | const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; |
| 29 | if (!INPLOGIC(m_G)) |
| 30 | { |
| 31 | UINT8 chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); |
| 32 | UINT8 t = INPLOGIC(m_C[chan]); |
| 33 | OUTLOGIC(m_Y, t, delay[t] ); |
| 34 | } |
| 35 | else |
| 36 | { |
| 37 | OUTLOGIC(m_Y, 0, delay[0]); |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | |
trunk/src/emu/netlist/devices/nld_74153.h
| r0 | r26750 | |
| 1 | // license:GPL-2.0+ |
| 2 | // copyright-holders:Couriersud |
| 3 | /* |
| 4 | * nld_74153.h |
| 5 | * |
| 6 | * DM74153: Dual 4-Line to 1-Line Data Selectors Multiplexers |
| 7 | * |
| 8 | * +--------------+ |
| 9 | * G1 |1 ++ 16| VCC |
| 10 | * B |2 15| G2 |
| 11 | * 1C3 |3 14| A |
| 12 | * 1C2 |4 74153 13| 2C3 |
| 13 | * 1C1 |5 12| 2C2 |
| 14 | * 1C0 |6 11| 2C1 |
| 15 | * Y1 |7 10| 2C0 |
| 16 | * GND |8 9| Y2 |
| 17 | * +--------------+ |
| 18 | * |
| 19 | * |
| 20 | * Function table |
| 21 | * |
| 22 | * +-----+-----++----+----+----+----++----+----+ |
| 23 | * | B | A || C0 | C1 | C2 | C3 || G | Y | |
| 24 | * +=====+=====++====+====+====+====++====+====+ |
| 25 | * | X | X || X | X | X | X || H | L | |
| 26 | * | L | L || L | X | X | X || L | L | |
| 27 | * | L | L || H | X | X | X || L | H | |
| 28 | * | L | H || X | L | X | X || L | L | |
| 29 | * | L | H || X | H | X | X || L | H | |
| 30 | * | H | L || X | X | L | X || L | L | |
| 31 | * | H | L || X | X | H | X || L | H | |
| 32 | * | H | H || X | X | X | L || L | L | |
| 33 | * | H | H || X | X | X | H || L | H | |
| 34 | * +-----+-----++----+----+----+----++----+----+ |
| 35 | * |
| 36 | * A, B : Select Inputs |
| 37 | * C* : Data inputs |
| 38 | * G : Strobe |
| 39 | * Y : Output |
| 40 | * |
| 41 | * Naming conventions follow National Semiconductor datasheet |
| 42 | * |
| 43 | */ |
| 44 | |
| 45 | #ifndef NLD_74153_H_ |
| 46 | #define NLD_74153_H_ |
| 47 | |
| 48 | #include "../nl_base.h" |
| 49 | |
| 50 | #define TTL_74153(_name, _C0, _C1, _C2, _C3, _A, _B, _G) \ |
| 51 | NET_REGISTER_DEV(nic74153, _name) \ |
| 52 | NET_CONNECT(_name, C0, _C0) \ |
| 53 | NET_CONNECT(_name, C1, _C1) \ |
| 54 | NET_CONNECT(_name, C2, _C2) \ |
| 55 | NET_CONNECT(_name, C3, _C3) \ |
| 56 | NET_CONNECT(_name, A, _A) \ |
| 57 | NET_CONNECT(_name, B, _B) \ |
| 58 | NET_CONNECT(_name, G, _G) |
| 59 | |
| 60 | NETLIB_DEVICE(nic74153, |
| 61 | netlist_ttl_input_t m_C[4]; |
| 62 | netlist_ttl_input_t m_A; |
| 63 | netlist_ttl_input_t m_B; |
| 64 | netlist_ttl_input_t m_G; |
| 65 | |
| 66 | netlist_ttl_output_t m_Y; |
| 67 | ); |
| 68 | |
| 69 | #endif /* NLD_74153_H_ */ |
trunk/src/emu/netlist/devices/net_lib.c
| r26749 | r26750 | |
| 218 | 218 | |
| 219 | 219 | |
| 220 | 220 | |
| 221 | | |
| 222 | | NETLIB_START(nic74107Asub) |
| 223 | | { |
| 224 | | register_input("CLK", m_clk, netlist_input_t::STATE_INP_HL); |
| 225 | | register_output("Q", m_Q); |
| 226 | | register_output("QQ", m_QQ); |
| 227 | | |
| 228 | | m_Q.initial(0); |
| 229 | | m_QQ.initial(1); |
| 230 | | |
| 231 | | save(NAME(m_Q1)); |
| 232 | | save(NAME(m_Q2)); |
| 233 | | save(NAME(m_F)); |
| 234 | | } |
| 235 | | |
| 236 | | NETLIB_START(nic74107A) |
| 237 | | { |
| 238 | | register_sub(sub, "sub"); |
| 239 | | |
| 240 | | register_subalias("CLK", sub.m_clk); |
| 241 | | register_input("J", m_J); |
| 242 | | register_input("K", m_K); |
| 243 | | register_input("CLRQ", m_clrQ); |
| 244 | | register_subalias("Q", sub.m_Q); |
| 245 | | register_subalias("QQ", sub.m_QQ); |
| 246 | | |
| 247 | | sub.m_Q.initial(0); |
| 248 | | sub.m_QQ.initial(1); |
| 249 | | } |
| 250 | | |
| 251 | | ATTR_HOT inline void NETLIB_NAME(nic74107Asub)::newstate(const netlist_sig_t state) |
| 252 | | { |
| 253 | | const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; |
| 254 | | #if 1 |
| 255 | | OUTLOGIC(m_Q, state, delay[state ^ 1]); |
| 256 | | OUTLOGIC(m_QQ, state ^ 1, delay[state]); |
| 257 | | #else |
| 258 | | if (state != Q.new_Q()) |
| 259 | | { |
| 260 | | Q.setToNoCheck(state, delay[1-state]); |
| 261 | | QQ.setToNoCheck(1-state, delay[state]); |
| 262 | | } |
| 263 | | #endif |
| 264 | | } |
| 265 | | |
| 266 | | NETLIB_UPDATE(nic74107Asub) |
| 267 | | { |
| 268 | | { |
| 269 | | const netlist_sig_t t = m_Q.net().new_Q(); |
| 270 | | newstate((!t & m_Q1) | (t & m_Q2) | m_F); |
| 271 | | if (!m_Q1) |
| 272 | | m_clk.inactivate(); |
| 273 | | } |
| 274 | | } |
| 275 | | |
| 276 | | NETLIB_UPDATE(nic74107A) |
| 277 | | { |
| 278 | | if (INPLOGIC(m_J) & INPLOGIC(m_K)) |
| 279 | | { |
| 280 | | sub.m_Q1 = 1; |
| 281 | | sub.m_Q2 = 0; |
| 282 | | sub.m_F = 0; |
| 283 | | } |
| 284 | | else if (!INPLOGIC(m_J) & INPLOGIC(m_K)) |
| 285 | | { |
| 286 | | sub.m_Q1 = 0; |
| 287 | | sub.m_Q2 = 0; |
| 288 | | sub.m_F = 0; |
| 289 | | } |
| 290 | | else if (INPLOGIC(m_J) & !INPLOGIC(m_K)) |
| 291 | | { |
| 292 | | sub.m_Q1 = 0; |
| 293 | | sub.m_Q2 = 0; |
| 294 | | sub.m_F = 1; |
| 295 | | } |
| 296 | | else |
| 297 | | { |
| 298 | | sub.m_Q1 = 0; |
| 299 | | sub.m_Q2 = 1; |
| 300 | | sub.m_F = 0; |
| 301 | | sub.m_clk.inactivate(); |
| 302 | | } |
| 303 | | if (!INPLOGIC(m_clrQ)) |
| 304 | | { |
| 305 | | sub.m_clk.inactivate(); |
| 306 | | sub.newstate(0); |
| 307 | | } |
| 308 | | else if (!sub.m_Q2) |
| 309 | | sub.m_clk.activate_hl(); |
| 310 | | //if (!sub.m_Q2 & INPLOGIC(m_clrQ)) |
| 311 | | // sub.m_clk.activate_hl(); |
| 312 | | } |
| 313 | | |
| 314 | | NETLIB_START(nic74153) |
| 315 | | { |
| 316 | | register_input("A1", m_I[0]); |
| 317 | | register_input("A2", m_I[1]); |
| 318 | | register_input("A3", m_I[2]); |
| 319 | | register_input("A4", m_I[3]); |
| 320 | | register_input("A", m_A); |
| 321 | | register_input("B", m_B); |
| 322 | | register_input("GA", m_GA); |
| 323 | | |
| 324 | | register_output("AY", m_AY); |
| 325 | | } |
| 326 | | |
| 327 | | NETLIB_UPDATE(nic74153) |
| 328 | | { |
| 329 | | const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; |
| 330 | | if (!INPLOGIC(m_GA)) |
| 331 | | { |
| 332 | | UINT8 chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); |
| 333 | | UINT8 t = INPLOGIC(m_I[chan]); |
| 334 | | OUTLOGIC(m_AY, t, delay[t] ); /* data to y only, FIXME */ |
| 335 | | } |
| 336 | | else |
| 337 | | { |
| 338 | | OUTLOGIC(m_AY, 0, delay[0]); |
| 339 | | } |
| 340 | | } |
| 341 | | |
| 342 | | |
| 343 | 221 | #define xstr(s) # s |
| 344 | 222 | #define ENTRY1(_nic, _name) register_device<_nic>( # _name, xstr(_nic) ); |
| 345 | 223 | #define ENTRY(_nic, _name) ENTRY1(NETLIB_NAME(_nic), _name) |
| r26749 | r26750 | |
| 379 | 257 | ENTRY(solver, NETDEV_SOLVER) |
| 380 | 258 | ENTRY(nicMultiSwitch, NETDEV_SWITCH2) |
| 381 | 259 | ENTRY(nicRSFF, NETDEV_RSFF) |
| 382 | | ENTRY(nicMixer8, NETDEV_MIXER) |
| 383 | 260 | ENTRY(7400, TTL_7400_NAND) |
| 384 | 261 | ENTRY(7402, TTL_7402_NOR) |
| 385 | 262 | ENTRY(nic7404, TTL_7404_INVERT) |
| r26749 | r26750 | |
| 400 | 277 | ENTRY(nic74153, TTL_74153) |
| 401 | 278 | ENTRY(9316, TTL_9316) |
| 402 | 279 | ENTRY(NE555, NETDEV_NE555) |
| 403 | | ENTRY(nicNE555N_MSTABLE, NE555N_MSTABLE) |
| 404 | 280 | } |
| 405 | 281 | |
| 406 | 282 | netlist_device_t *netlist_factory::new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const |
trunk/src/emu/netlist/devices/nld_74107.c
| r0 | r26750 | |
| 1 | /* |
| 2 | * nld_74107.c |
| 3 | * |
| 4 | */ |
| 5 | |
| 6 | #include "nld_74107.h" |
| 7 | |
| 8 | NETLIB_START(nic74107Asub) |
| 9 | { |
| 10 | register_input("CLK", m_clk, netlist_input_t::STATE_INP_HL); |
| 11 | register_output("Q", m_Q); |
| 12 | register_output("QQ", m_QQ); |
| 13 | |
| 14 | m_Q.initial(0); |
| 15 | m_QQ.initial(1); |
| 16 | |
| 17 | m_Q1 = 0; |
| 18 | m_Q2 = 0; |
| 19 | m_F = 0; |
| 20 | |
| 21 | save(NAME(m_Q1)); |
| 22 | save(NAME(m_Q2)); |
| 23 | save(NAME(m_F)); |
| 24 | } |
| 25 | |
| 26 | NETLIB_START(nic74107A) |
| 27 | { |
| 28 | register_sub(sub, "sub"); |
| 29 | |
| 30 | register_subalias("CLK", sub.m_clk); |
| 31 | register_input("J", m_J); |
| 32 | register_input("K", m_K); |
| 33 | register_input("CLRQ", m_clrQ); |
| 34 | register_subalias("Q", sub.m_Q); |
| 35 | register_subalias("QQ", sub.m_QQ); |
| 36 | |
| 37 | } |
| 38 | |
| 39 | ATTR_HOT inline void NETLIB_NAME(nic74107Asub)::newstate(const netlist_sig_t state) |
| 40 | { |
| 41 | const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; |
| 42 | |
| 43 | OUTLOGIC(m_Q, state, delay[state ^ 1]); |
| 44 | OUTLOGIC(m_QQ, state ^ 1, delay[state]); |
| 45 | } |
| 46 | |
| 47 | NETLIB_UPDATE(nic74107Asub) |
| 48 | { |
| 49 | const netlist_sig_t t = m_Q.net().Q(); |
| 50 | newstate((!t & m_Q1) | (t & m_Q2) | m_F); |
| 51 | if (!m_Q1) |
| 52 | m_clk.inactivate(); |
| 53 | } |
| 54 | |
| 55 | NETLIB_UPDATE(nic74107A) |
| 56 | { |
| 57 | const UINT8 JK = (INPLOGIC(m_J) << 1) | INPLOGIC(m_K); |
| 58 | |
| 59 | switch (JK) |
| 60 | { |
| 61 | case 0: |
| 62 | sub.m_Q1 = 0; |
| 63 | sub.m_Q2 = 1; |
| 64 | sub.m_F = 0; |
| 65 | sub.m_clk.inactivate(); |
| 66 | break; |
| 67 | case 1: // (!INPLOGIC(m_J) & INPLOGIC(m_K)) |
| 68 | sub.m_Q1 = 0; |
| 69 | sub.m_Q2 = 0; |
| 70 | sub.m_F = 0; |
| 71 | break; |
| 72 | case 2: // (INPLOGIC(m_J) & !INPLOGIC(m_K)) |
| 73 | sub.m_Q1 = 0; |
| 74 | sub.m_Q2 = 0; |
| 75 | sub.m_F = 1; |
| 76 | break; |
| 77 | case 3: // (INPLOGIC(m_J) & INPLOGIC(m_K)) |
| 78 | sub.m_Q1 = 1; |
| 79 | sub.m_Q2 = 0; |
| 80 | sub.m_F = 0; |
| 81 | break; |
| 82 | default: |
| 83 | break; |
| 84 | } |
| 85 | |
| 86 | if (!INPLOGIC(m_clrQ)) |
| 87 | { |
| 88 | sub.m_clk.inactivate(); |
| 89 | sub.newstate(0); |
| 90 | } |
| 91 | else if (!sub.m_Q2) |
| 92 | sub.m_clk.activate_hl(); |
| 93 | } |
trunk/src/emu/netlist/devices/net_lib.h
| r26749 | r26750 | |
| 68 | 68 | #include "nld_7486.h" |
| 69 | 69 | #include "nld_7490.h" |
| 70 | 70 | #include "nld_7493.h" |
| 71 | #include "nld_74107.h" |
| 72 | #include "nld_74153.h" |
| 71 | 73 | #include "nld_9316.h" |
| 72 | 74 | |
| 73 | 75 | #include "nld_ne555.h" |
| r26749 | r26750 | |
| 99 | 101 | NET_CONNECT(_name, BIQ, _BIQ) \ |
| 100 | 102 | NET_CONNECT(_name, RBIQ, _RBIQ) |
| 101 | 103 | |
| 102 | | #define TTL_74107A(_name, _CLK, _J, _K, _CLRQ) \ |
| 103 | | NET_REGISTER_DEV(nic74107A, _name) \ |
| 104 | | NET_CONNECT(_name, CLK, _CLK) \ |
| 105 | | NET_CONNECT(_name, J, _J) \ |
| 106 | | NET_CONNECT(_name, K, _K) \ |
| 107 | | NET_CONNECT(_name, CLRQ, _CLRQ) |
| 108 | 104 | |
| 109 | | #define TTL_74107(_name, _CLK, _J, _K, _CLRQ) \ |
| 110 | | TTL_74107A(_name, _CLK, _J, _K, _CLRQ) |
| 111 | 105 | |
| 112 | | #define TTL_74153(_name, _A1, _A2, _A3, _A4, _A, _B, _GA) \ |
| 113 | | NET_REGISTER_DEV(nic74153, _name) \ |
| 114 | | NET_CONNECT(_name, A1, _A1) \ |
| 115 | | NET_CONNECT(_name, A2, _A2) \ |
| 116 | | NET_CONNECT(_name, A3, _A3) \ |
| 117 | | NET_CONNECT(_name, A4, _A4) \ |
| 118 | | NET_CONNECT(_name, A, _A) \ |
| 119 | | NET_CONNECT(_name, B, _B) \ |
| 120 | | NET_CONNECT(_name, GA, _GA) |
| 121 | | |
| 122 | 106 | // ---------------------------------------------------------------------------------------- |
| 123 | 107 | // Standard devices ... |
| 124 | 108 | // ---------------------------------------------------------------------------------------- |
| r26749 | r26750 | |
| 131 | 115 | netlist_ttl_output_t m_Q; |
| 132 | 116 | ); |
| 133 | 117 | |
| 134 | | /* 74107 does latch data during high ! |
| 135 | | * For modelling purposes, we assume 74107 and 74107A are the same |
| 136 | | */ |
| 137 | 118 | |
| 138 | | NETLIB_SUBDEVICE(nic74107Asub, |
| 139 | | netlist_ttl_input_t m_clk; |
| 140 | | |
| 141 | | netlist_ttl_output_t m_Q; |
| 142 | | netlist_ttl_output_t m_QQ; |
| 143 | | |
| 144 | | netlist_sig_t m_Q1; |
| 145 | | netlist_sig_t m_Q2; |
| 146 | | netlist_sig_t m_F; |
| 147 | | |
| 148 | | ATTR_HOT void newstate(const netlist_sig_t state); |
| 149 | | |
| 150 | | ); |
| 151 | | |
| 152 | | NETLIB_DEVICE(nic74107A, |
| 153 | | NETLIB_NAME(nic74107Asub) sub; |
| 154 | | |
| 155 | | netlist_ttl_input_t m_J; |
| 156 | | netlist_ttl_input_t m_K; |
| 157 | | netlist_ttl_input_t m_clrQ; |
| 158 | | |
| 159 | | ); |
| 160 | | |
| 161 | | class NETLIB_NAME(nic74107) : public NETLIB_NAME(nic74107A) |
| 162 | | { |
| 163 | | public: |
| 164 | | NETLIB_NAME(nic74107) () |
| 165 | | : NETLIB_NAME(nic74107A) () {} |
| 166 | | |
| 167 | | }; |
| 168 | | |
| 169 | | |
| 170 | | /* ripple-carry counter on low-high clock transition */ |
| 171 | | |
| 172 | | |
| 173 | | |
| 174 | | /* one half of a nic74153 */ |
| 175 | | |
| 176 | | NETLIB_DEVICE(nic74153, |
| 177 | | netlist_ttl_input_t m_I[4]; |
| 178 | | netlist_ttl_input_t m_A; |
| 179 | | netlist_ttl_input_t m_B; |
| 180 | | netlist_ttl_input_t m_GA; |
| 181 | | |
| 182 | | netlist_ttl_output_t m_AY; |
| 183 | | ); |
| 184 | | |
| 185 | 119 | NETLIB_SUBDEVICE(nic7448_sub, |
| 186 | 120 | ATTR_HOT void update_outputs(UINT8 v); |
| 187 | 121 | static const UINT8 tab7448[16][7]; |
trunk/src/emu/netlist/devices/nld_74107.h
| r0 | r26750 | |
| 1 | // license:GPL-2.0+ |
| 2 | // copyright-holders:Couriersud |
| 3 | /* |
| 4 | * nld_74107.h |
| 5 | * |
| 6 | * DM74107: DUAL J-K FLIP-FLOPS WITH CLEAR |
| 7 | * |
| 8 | * +--------------+ |
| 9 | * 1J |1 ++ 14| VCC |
| 10 | * 1QQ |2 13| 1CLRQ |
| 11 | * 1Q |3 12| 1CLK |
| 12 | * 1K |4 74107 11| 2K |
| 13 | * 2Q |5 10| 2CLRQ |
| 14 | * 2QQ |6 9| 2CLK |
| 15 | * GND |7 8| 2J |
| 16 | * +--------------+ |
| 17 | * |
| 18 | * |
| 19 | * Function table 107 |
| 20 | * |
| 21 | * +-----+-----+-----+---++---+-----+ |
| 22 | * | CLRQ| CLK | J | K || Q | QQ | |
| 23 | * +=====+=====+=====+===++===+=====+ |
| 24 | * | 0 | X | X | X || 0 | 1 | |
| 25 | * | 1 | * | 0 | 0 || Q0| Q0Q | |
| 26 | * | 1 | * | 1 | 0 || 1 | 0 | |
| 27 | * | 1 | * | 0 | 1 || 0 | 1 | |
| 28 | * | 1 | * | 1 | 1 || TOGGLE | |
| 29 | * +-----+-----+-----+---++---+-----+ |
| 30 | * _ |
| 31 | * * = _| |_ |
| 32 | * |
| 33 | * This is positive triggered, J and K |
| 34 | * are latched during clock high and |
| 35 | * transferred when CLK falls. |
| 36 | * |
| 37 | * Function table 107A |
| 38 | * |
| 39 | * +-----+-----+-----+---++---+-----+ |
| 40 | * | CLRQ| CLK | J | K || Q | QQ | |
| 41 | * +=====+=====+=====+===++===+=====+ |
| 42 | * | 0 | X | X | X || 0 | 1 | |
| 43 | * | 1 | F | 0 | 0 || Q0| Q0Q | |
| 44 | * | 1 | F | 1 | 0 || 1 | 0 | |
| 45 | * | 1 | F | 0 | 1 || 0 | 1 | |
| 46 | * | 1 | F | 1 | 1 || TOGGLE | |
| 47 | * | 1 | 1 | X | X || Q0| Q0Q | |
| 48 | * +-----+-----+-----+---++---+-----+ |
| 49 | * |
| 50 | * THe 107A is negative triggered. |
| 51 | * |
| 52 | * Naming conventions follow Texas instruments datasheet |
| 53 | * |
| 54 | * FIXME: Currently, only the 107A is implemented. |
| 55 | * The 107 uses the same model. |
| 56 | * |
| 57 | */ |
| 58 | |
| 59 | #ifndef NLD_74107_H_ |
| 60 | #define NLD_74107_H_ |
| 61 | |
| 62 | #include "../nl_base.h" |
| 63 | |
| 64 | #define TTL_74107A(_name, _CLK, _J, _K, _CLRQ) \ |
| 65 | NET_REGISTER_DEV(nic74107A, _name) \ |
| 66 | NET_CONNECT(_name, CLK, _CLK) \ |
| 67 | NET_CONNECT(_name, J, _J) \ |
| 68 | NET_CONNECT(_name, K, _K) \ |
| 69 | NET_CONNECT(_name, CLRQ, _CLRQ) |
| 70 | |
| 71 | #define TTL_74107(_name, _CLK, _J, _K, _CLRQ) \ |
| 72 | TTL_74107A(_name, _CLK, _J, _K, _CLRQ) |
| 73 | |
| 74 | NETLIB_SUBDEVICE(nic74107Asub, |
| 75 | netlist_ttl_input_t m_clk; |
| 76 | |
| 77 | netlist_ttl_output_t m_Q; |
| 78 | netlist_ttl_output_t m_QQ; |
| 79 | |
| 80 | netlist_sig_t m_Q1; |
| 81 | netlist_sig_t m_Q2; |
| 82 | netlist_sig_t m_F; |
| 83 | |
| 84 | ATTR_HOT void newstate(const netlist_sig_t state); |
| 85 | |
| 86 | ); |
| 87 | |
| 88 | NETLIB_DEVICE(nic74107A, |
| 89 | NETLIB_NAME(nic74107Asub) sub; |
| 90 | |
| 91 | netlist_ttl_input_t m_J; |
| 92 | netlist_ttl_input_t m_K; |
| 93 | netlist_ttl_input_t m_clrQ; |
| 94 | |
| 95 | ); |
| 96 | |
| 97 | class NETLIB_NAME(nic74107) : public NETLIB_NAME(nic74107A) |
| 98 | { |
| 99 | public: |
| 100 | NETLIB_NAME(nic74107) () |
| 101 | : NETLIB_NAME(nic74107A) () {} |
| 102 | |
| 103 | }; |
| 104 | |
| 105 | |
| 106 | #endif /* NLD_74107_H_ */ |
trunk/src/emu/netlist/nl_base.c
| r26749 | r26750 | |
| 45 | 45 | |
| 46 | 46 | void netlist_queue_t::on_post_load() |
| 47 | 47 | { |
| 48 | | printf("on_post_load\n"); |
| 49 | 48 | this->clear(); |
| 50 | | printf("qsize %d\n", m_qsize); |
| 51 | 49 | NL_VERBOSE_OUT(("current time %f qsize %d\n", m_netlist->time().as_double(), qsize)); |
| 52 | 50 | for (int i = 0; i < m_qsize; i++ ) |
| 53 | 51 | { |
| 54 | 52 | netlist_net_t *n = m_netlist.find_net(&(m_name[i][0])); |
| 55 | 53 | NL_VERBOSE_OUT(("Got %s ==> %p\n", qtemp[i].m_name, n)); |
| 56 | | printf("Got %s ==> %p\n", m_name[i], n); |
| 57 | 54 | NL_VERBOSE_OUT(("schedule time %f (%f)\n", n->time().as_double(), qtemp[i].m_time.as_double())); |
| 58 | | printf("schedule time %f (%f)\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double()); |
| 59 | 55 | this->push(netlist_queue_t::entry_t(netlist_time::from_raw(m_times[i]), *n)); |
| 60 | 56 | } |
| 61 | 57 | } |