trunk/src/emu/netlist/nl_base.h
| r26060 | r26061 | |
| 164 | 164 | |
| 165 | 165 | ATTR_COLD net_input_t(const int atype) |
| 166 | 166 | : net_terminal_t(atype) |
| 167 | | , m_low_thresh_V(0) |
| 168 | | , m_high_thresh_V(0) |
| 167 | , m_low_thresh_V(0) |
| 168 | , m_high_thresh_V(0) |
| 169 | #if USE_LINKED_LIST |
| 170 | , m_next(NULL) |
| 171 | #endif |
| 169 | 172 | , m_state(INP_STATE_ACTIVE) |
| 170 | 173 | , m_output(NULL) |
| 171 | 174 | {} |
| r26060 | r26061 | |
| 185 | 188 | double m_low_thresh_V; |
| 186 | 189 | double m_high_thresh_V; |
| 187 | 190 | |
| 191 | #if USE_LINKED_LIST |
| 192 | net_input_t *m_next; |
| 193 | #endif |
| 194 | |
| 188 | 195 | private: |
| 189 | 196 | net_input_state m_state; |
| 190 | 197 | net_output_t * RESTRICT m_output; |
| r26060 | r26061 | |
| 248 | 255 | { |
| 249 | 256 | public: |
| 250 | 257 | |
| 251 | | typedef struct { |
| 258 | // FIXME: union does not work |
| 259 | typedef struct |
| 260 | { |
| 261 | netlist_sig_t Q; |
| 252 | 262 | double Analog; |
| 253 | | netlist_sig_t Q; |
| 254 | 263 | } hybrid_t; |
| 255 | 264 | |
| 256 | 265 | net_output_t(int atype); |
| r26060 | r26061 | |
| 300 | 309 | hybrid_t m_cur; |
| 301 | 310 | hybrid_t m_new; |
| 302 | 311 | |
| 312 | #if USE_LINKED_LIST |
| 313 | net_input_t *m_head; |
| 314 | #endif |
| 303 | 315 | UINT32 m_num_cons; |
| 304 | 316 | |
| 305 | 317 | private: |
| r26060 | r26061 | |
| 311 | 323 | |
| 312 | 324 | UINT32 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ |
| 313 | 325 | |
| 326 | #if !USE_LINKED_LIST |
| 314 | 327 | net_input_t * RESTRICT m_cons[OUTPUT_MAX_CONNECTIONS]; |
| 328 | #endif |
| 315 | 329 | }; |
| 316 | 330 | |
| 317 | 331 | |
| r26060 | r26061 | |
| 333 | 347 | { |
| 334 | 348 | if (EXPECTED(newQ != m_new.Q)) |
| 335 | 349 | { |
| 336 | | m_new.Q = newQ; |
| 350 | m_new.Q = newQ; |
| 337 | 351 | if (m_num_cons) |
| 338 | 352 | push_to_queue(delay); |
| 339 | 353 | } |
| r26060 | r26061 | |
| 352 | 366 | |
| 353 | 367 | ttl_output_t() |
| 354 | 368 | : logic_output_t() |
| 355 | | { set_levels(0.3, 3.4); } |
| 369 | { |
| 370 | set_levels(0.3, 3.4); |
| 371 | } |
| 356 | 372 | |
| 357 | 373 | }; |
| 358 | 374 | |
| r26060 | r26061 | |
| 361 | 377 | public: |
| 362 | 378 | |
| 363 | 379 | analog_output_t() |
| 364 | | : net_output_t(OUTPUT | SIGNAL_ANALOG) { } |
| 380 | : net_output_t(OUTPUT | SIGNAL_ANALOG) |
| 381 | { |
| 382 | m_cur.Analog = 0.0; |
| 383 | m_new.Analog = 0.0; |
| 384 | } |
| 365 | 385 | |
| 366 | | ATTR_COLD void initial(const double val) { m_cur.Analog = val; m_new.Analog = val; } |
| 386 | ATTR_COLD void initial(const double val) |
| 387 | { |
| 388 | m_cur.Analog = val; |
| 389 | m_new.Analog = val; |
| 390 | } |
| 367 | 391 | |
| 368 | 392 | ATTR_HOT inline void set_Q(const double newQ, const netlist_time &delay) |
| 369 | 393 | { |
trunk/src/emu/netlist/devices/nld_7425.h
| r0 | r26061 | |
| 1 | // license:GPL-2.0+ |
| 2 | // copyright-holders:Couriersud |
| 3 | /* |
| 4 | * nld_7425.h |
| 5 | * |
| 6 | * DM7425: Dual 4-Input NOR Gates |
| 7 | * |
| 8 | * +--------------+ |
| 9 | * A1 |1 ++ 14| VCC |
| 10 | * B1 |2 13| D2 |
| 11 | * X1 |3 12| C2 |
| 12 | * C1 |4 7425 11| X2 |
| 13 | * D1 |5 10| B2 |
| 14 | * Y! |6 9| A2 |
| 15 | * GND |7 8| Y2 |
| 16 | * +--------------+ |
| 17 | * _______ |
| 18 | * Y = A+B+C+D |
| 19 | * +---+---+---+---+---++---+ |
| 20 | * | A | B | C | D | X || Y | |
| 21 | * +===+===+===+===+===++===+ |
| 22 | * | X | X | X | X | 0 || Z | |
| 23 | * | 0 | 0 | 0 | 0 | 1 || 1 | |
| 24 | * | X | X | X | 1 | 1 || 0 | |
| 25 | * | X | X | 1 | X | 1 || 0 | |
| 26 | * | X | 1 | X | X | 1 || 0 | |
| 27 | * | 1 | X | X | X | 1 || 0 | |
| 28 | * +---+---+---+---+---++---+ |
| 29 | * |
| 30 | * TODO: The "X" input and high impedance output are currently not simulated. |
| 31 | * |
| 32 | * Naming conventions follow National Semiconductor datasheet |
| 33 | * |
| 34 | */ |
| 35 | |
| 36 | |
| 37 | #include "nld_signal.h" |
| 38 | |
| 39 | #ifndef NLD_7425_H_ |
| 40 | #define NLD_7425_H_ |
| 41 | |
| 42 | #define TTL_7425_NOR(_name, _I1, _I2, _I3, _I4) \ |
| 43 | NET_REGISTER_DEV(7425, _name) \ |
| 44 | NET_CONNECT(_name, A, _I1) \ |
| 45 | NET_CONNECT(_name, B, _I2) \ |
| 46 | NET_CONNECT(_name, C, _I3) \ |
| 47 | NET_CONNECT(_name, D, _I4) |
| 48 | |
| 49 | |
| 50 | NETLIB_SIGNAL(7425, 4, 1, 0); |
| 51 | |
| 52 | #endif /* NLD_7425_H_ */ |
trunk/src/emu/netlist/devices/nld_7427.h
| r0 | r26061 | |
| 1 | // license:GPL-2.0+ |
| 2 | // copyright-holders:Couriersud |
| 3 | /* |
| 4 | * nld_7427.h |
| 5 | * |
| 6 | * DM7427: Triple 3-Input NOR Gates |
| 7 | * |
| 8 | * +--------------+ |
| 9 | * A1 |1 ++ 14| VCC |
| 10 | * B1 |2 13| C1 |
| 11 | * A2 |3 12| Y1 |
| 12 | * B2 |4 7427 11| C3 |
| 13 | * C2 |5 10| B3 |
| 14 | * Y2 |6 9| A3 |
| 15 | * GND |7 8| Y3 |
| 16 | * +--------------+ |
| 17 | * _____ |
| 18 | * Y = A+B+C |
| 19 | * +---+---+---++---+ |
| 20 | * | A | B | C || Y | |
| 21 | * +===+===+===++===+ |
| 22 | * | X | X | 1 || 0 | |
| 23 | * | X | 1 | X || 0 | |
| 24 | * | 1 | X | X || 0 | |
| 25 | * | 0 | 0 | 0 || 1 | |
| 26 | * +---+---+---++---+ |
| 27 | * |
| 28 | * Naming conventions follow National Semiconductor datasheet |
| 29 | * |
| 30 | */ |
| 31 | |
| 32 | |
| 33 | #include "nld_signal.h" |
| 34 | |
| 35 | #ifndef NLD_7427_H_ |
| 36 | #define NLD_7427_H_ |
| 37 | |
| 38 | #define TTL_7427_NOR(_name, _I1, _I2, _I3) \ |
| 39 | NET_REGISTER_DEV(7427, _name) \ |
| 40 | NET_CONNECT(_name, A, _I1) \ |
| 41 | NET_CONNECT(_name, B, _I2) \ |
| 42 | NET_CONNECT(_name, C, _I3) |
| 43 | |
| 44 | NETLIB_SIGNAL(7427, 3, 1, 0); |
| 45 | |
| 46 | #endif /* NLD_7427_H_ */ |
trunk/src/emu/netlist/devices/net_lib.c
| r26060 | r26061 | |
| 986 | 986 | ENTRY(7402, TTL_7402_NOR) |
| 987 | 987 | ENTRY(nic7404, TTL_7404_INVERT) |
| 988 | 988 | ENTRY(7410, TTL_7410_NAND) |
| 989 | | ENTRY(nic7420, TTL_7420_NAND) |
| 990 | | ENTRY(nic7425, TTL_7425_NOR) |
| 991 | | ENTRY(nic7427, TTL_7427_NOR) |
| 989 | ENTRY(7420, TTL_7420_NAND) |
| 990 | ENTRY(7425, TTL_7425_NOR) |
| 991 | ENTRY(7427, TTL_7427_NOR) |
| 992 | 992 | ENTRY(nic7430, TTL_7430_NAND) |
| 993 | 993 | ENTRY(nic7450, TTL_7450_ANDORINVERT) |
| 994 | 994 | ENTRY(nic7486, TTL_7486_XOR) |
trunk/src/emu/netlist/devices/nld_7420.h
| r26060 | r26061 | |
| 37 | 37 | #define NLD_7420_H_ |
| 38 | 38 | |
| 39 | 39 | #define TTL_7420_NAND(_name, _I1, _I2, _I3, _I4) \ |
| 40 | | NET_REGISTER_DEV(nic7420, _name) \ |
| 40 | NET_REGISTER_DEV(7420, _name) \ |
| 41 | 41 | NET_CONNECT(_name, A, _I1) \ |
| 42 | 42 | NET_CONNECT(_name, B, _I2) \ |
| 43 | 43 | NET_CONNECT(_name, C, _I3) \ |
| 44 | 44 | NET_CONNECT(_name, D, _I4) |
| 45 | 45 | |
| 46 | 46 | |
| 47 | | NETLIB_SIGNAL(nic7420, 4, 0, 0); |
| 47 | NETLIB_SIGNAL(7420, 4, 0, 0); |
| 48 | 48 | |
| 49 | 49 | #endif /* NLD_7420_H_ */ |
trunk/src/emu/netlist/devices/net_lib.h
| r26060 | r26061 | |
| 58 | 58 | #include "nld_7402.h" |
| 59 | 59 | #include "nld_7410.h" |
| 60 | 60 | #include "nld_7420.h" |
| 61 | #include "nld_7425.h" |
| 62 | #include "nld_7427.h" |
| 61 | 63 | |
| 62 | 64 | // this is a bad hack |
| 63 | 65 | #define USE_OLD7493 (0) |
| r26060 | r26061 | |
| 105 | 107 | NET_REGISTER_DEV(nic7404, _name) \ |
| 106 | 108 | NET_CONNECT(_name, I1, _I1) |
| 107 | 109 | |
| 108 | | #define TTL_7425_NOR(_name, _I1, _I2, _I3, _I4) \ |
| 109 | | NET_REGISTER_DEV(nic7425, _name) \ |
| 110 | | NET_CONNECT(_name, A, _I1) \ |
| 111 | | NET_CONNECT(_name, B, _I2) \ |
| 112 | | NET_CONNECT(_name, C, _I3) \ |
| 113 | | NET_CONNECT(_name, D, _I4) |
| 114 | 110 | |
| 115 | | #define TTL_7427_NOR(_name, _I1, _I2, _I3) \ |
| 116 | | NET_REGISTER_DEV(nic7427, _name) \ |
| 117 | | NET_CONNECT(_name, A, _I1) \ |
| 118 | | NET_CONNECT(_name, B, _I2) \ |
| 119 | | NET_CONNECT(_name, C, _I3) |
| 120 | 111 | |
| 121 | 112 | #define TTL_7430_NAND(_name, _I1, _I2, _I3, _I4, _I5, _I6, _I7, _I8) \ |
| 122 | 113 | NET_REGISTER_DEV(nic7430, _name) \ |
| r26060 | r26061 | |
| 312 | 303 | net_param_t m_VL; |
| 313 | 304 | ); |
| 314 | 305 | |
| 315 | | NETLIB_SIGNAL(nic7425, 4, 1, 0); |
| 316 | | NETLIB_SIGNAL(nic7427, 3, 1, 0); |
| 317 | 306 | NETLIB_SIGNAL(nic7430, 8, 0, 0); |
| 318 | 307 | |
| 319 | 308 | NETLIB_DEVICE(nic7404, |
trunk/src/emu/netlist/nl_base.c
| r26060 | r26061 | |
| 289 | 289 | //, m_new_Q(0) |
| 290 | 290 | //, m_Q_analog(0.0) |
| 291 | 291 | //, m_new_Q_analog(0.0) |
| 292 | | , m_num_cons(0) |
| 292 | #if USE_LINKED_LIST |
| 293 | , m_head(NULL) |
| 294 | #endif |
| 295 | , m_num_cons(0) |
| 293 | 296 | , m_time(netlist_time::zero) |
| 294 | 297 | , m_active(0) |
| 295 | 298 | , m_in_queue(2) |
| r26060 | r26061 | |
| 322 | 325 | |
| 323 | 326 | const UINT32 mask = masks[ (m_last.Q << 1) | m_cur.Q ]; |
| 324 | 327 | |
| 328 | #if USE_LINKED_LIST |
| 329 | net_input_t *p = m_head; |
| 330 | switch (m_num_cons) |
| 331 | { |
| 332 | case 2: |
| 333 | update_dev(p, mask); |
| 334 | p = p->m_next; |
| 335 | case 1: |
| 336 | update_dev(p, mask); |
| 337 | break; |
| 338 | default: |
| 339 | do |
| 340 | { |
| 341 | update_dev(p, mask); |
| 342 | p = p->m_next; |
| 343 | } while (p != NULL); |
| 344 | break; |
| 345 | } |
| 346 | |
| 347 | #else |
| 325 | 348 | switch (m_num_cons) |
| 326 | 349 | { |
| 327 | 350 | case 2: |
| r26060 | r26061 | |
| 336 | 359 | } |
| 337 | 360 | break; |
| 338 | 361 | } |
| 339 | | |
| 362 | #endif |
| 340 | 363 | m_last = m_cur; |
| 341 | 364 | } |
| 342 | 365 | |
| 343 | 366 | ATTR_COLD void net_output_t::register_con(net_input_t &input) |
| 344 | 367 | { |
| 345 | | int i; |
| 368 | #if USE_LINKED_LIST |
| 369 | if (m_head == NULL) |
| 370 | m_head = &input; |
| 371 | else |
| 372 | { |
| 373 | input.m_next = m_head; |
| 374 | m_head = &input; |
| 375 | } |
| 376 | #else |
| 346 | 377 | if (m_num_cons >= OUTPUT_MAX_CONNECTIONS) |
| 347 | 378 | fatalerror("Connections exceeded for %s\n", netdev()->name().cstr()); |
| 348 | 379 | |
| 380 | #if 0 |
| 381 | int i; |
| 349 | 382 | /* keep similar devices together */ |
| 350 | 383 | for (i = 0; i < m_num_cons; i++) |
| 351 | 384 | if (m_cons[i]->netdev() == input.netdev()) |
| r26060 | r26061 | |
| 355 | 388 | m_cons[j] = m_cons[j - 1]; |
| 356 | 389 | |
| 357 | 390 | m_cons[i] = &input; |
| 358 | | m_num_cons++; |
| 359 | | if (input.state() != net_input_t::INP_STATE_PASSIVE) |
| 360 | | m_active++; |
| 391 | #else |
| 392 | m_cons[m_num_cons] = &input; |
| 393 | #endif |
| 394 | #endif |
| 395 | m_num_cons++; |
| 396 | if (input.state() != net_input_t::INP_STATE_PASSIVE) |
| 397 | m_active++; |
| 361 | 398 | } |
| 362 | 399 | |
| 363 | 400 | // ---------------------------------------------------------------------------------------- |