mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00
Added 74192, 9316, 9310 and 74193 devices to netlist. Added breakout
(wip) netlist as well, but still have to implement three more devices until work can really start. [Couriersud]
This commit is contained in:
parent
b894ca83ad
commit
7fa10acca6
@ -1,3 +1,6 @@
|
||||
|
||||
#define NETLIST_DEVELOPMENT 1
|
||||
|
||||
#include "netlist/nl_dice_compat.h"
|
||||
#include "netlist/devices/net_lib.h"
|
||||
#include "netlist/analog/nld_twoterm.h"
|
||||
@ -75,9 +78,9 @@ CIRCUIT_LAYOUT( breakout )
|
||||
|
||||
//CHIP("Y1", CLOCK_14_318_MHZ) //Y1
|
||||
|
||||
CHIP("C32", CAPACITOR, &c32_desc)
|
||||
CHIP("C36", CAPACITOR, &c36_desc)
|
||||
CHIP("C37", CAPACITOR, &c37_desc)
|
||||
CHIP_CAPACITOR(C32, &c32_desc)
|
||||
CHIP_CAPACITOR(C36, &c36_desc)
|
||||
CHIP_CAPACITOR(C37, &c37_desc)
|
||||
CHIP("PAD_EN_BUF", BUFFER, &pad_en_buf_desc)
|
||||
|
||||
CHIP("A3", 7474)
|
||||
@ -87,7 +90,7 @@ CIRCUIT_LAYOUT( breakout )
|
||||
CHIP_9602_Mono(A7, &a7_desc)
|
||||
CHIP_9602_Mono(A8, &a8_desc)
|
||||
|
||||
CHIP("B2", 555_Astable, &b2_555_desc)
|
||||
CHIP_555_Astable(B2, &b2_555_desc)
|
||||
CHIP("B3", 7402)
|
||||
CHIP("B4", 9316)
|
||||
CHIP("B5", 74193)
|
||||
@ -203,7 +206,7 @@ CIRCUIT_LAYOUT( breakout )
|
||||
CHIP("PAD1", PADDLE1_HORIZONTAL_INPUT, &pad1_desc)
|
||||
PADDLE_CONNECTION("PAD1", "C9")
|
||||
|
||||
CHIP("LATCH", LATCH)
|
||||
CHIP_LATCH(LATCH)
|
||||
CHIP("COIN1", COIN_INPUT)
|
||||
|
||||
//CHIP("COIN2", COIN_INPUT)
|
||||
@ -1454,6 +1457,5 @@ CIRCUIT_LAYOUT( breakout )
|
||||
CONNECTION("LOG1", 16, "L3", 6)*/ //N
|
||||
#endif
|
||||
|
||||
CIRCUIT_LAYOUT_END
|
||||
};
|
||||
CIRCUIT_LAYOUT_END
|
||||
|
||||
|
@ -81,8 +81,14 @@ files {
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74123.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74153.c",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74153.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74192.c",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74192.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74193.c",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74193.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74ls629.c",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_74ls629.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_9310.c",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_9310.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_9312.c",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_9312.h",
|
||||
MAME_DIR .. "src/emu/netlist/devices/nld_9316.c",
|
||||
|
@ -980,6 +980,7 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/pong.c",
|
||||
MAME_DIR .. "src/mame/drivers/nl_pong.c",
|
||||
MAME_DIR .. "src/mame/drivers/nl_pongd.c",
|
||||
MAME_DIR .. "src/mame/drivers/nl_breakout.c",
|
||||
MAME_DIR .. "src/mame/drivers/poolshrk.c",
|
||||
MAME_DIR .. "src/mame/audio/poolshrk.c",
|
||||
MAME_DIR .. "src/mame/video/poolshrk.c",
|
||||
|
@ -91,6 +91,7 @@ void nl_initialize_factory(netlist_factory_t &factory)
|
||||
ENTRY(gnd, GND, "-")
|
||||
ENTRY(switch2, SWITCH2, "-")
|
||||
ENTRY(nicRSFF, NETDEV_RSFF, "+S,R")
|
||||
ENTRY(nicDelay, NETDEV_DELAY, "-")
|
||||
ENTRY(4020, CD_4020, "+IP,RESET,VDD,VSS")
|
||||
//ENTRY(4066, CD_4066, "+A,B")
|
||||
ENTRY(7400, TTL_7400_NAND, "+A,B")
|
||||
@ -116,7 +117,10 @@ void nl_initialize_factory(netlist_factory_t &factory)
|
||||
ENTRY(74107A, TTL_74107A, "+CLK,J,K,CLRQ")
|
||||
ENTRY(74123, TTL_74123, "-")
|
||||
ENTRY(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G")
|
||||
ENTRY(74192, TTL_74192, "-")
|
||||
ENTRY(74193, TTL_74193, "-")
|
||||
ENTRY(SN74LS629, SN74LS629, "CAP")
|
||||
ENTRY(9310, TTL_9310, "-")
|
||||
ENTRY(9312, TTL_9312, "-")
|
||||
ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
|
||||
ENTRY(NE555, NE555, "-")
|
||||
@ -145,7 +149,10 @@ void nl_initialize_factory(netlist_factory_t &factory)
|
||||
ENTRY(74107_dip, TTL_74107_DIP, "-")
|
||||
ENTRY(74123_dip, TTL_74123_DIP, "-")
|
||||
ENTRY(74153_dip, TTL_74153_DIP, "-")
|
||||
ENTRY(74192_dip, TTL_74192_DIP, "-")
|
||||
ENTRY(74193_dip, TTL_74193_DIP, "-")
|
||||
ENTRY(9602_dip, TTL_9602_DIP, "-")
|
||||
ENTRY(9310_dip, TTL_9310_DIP, "-")
|
||||
ENTRY(9312_dip, TTL_9312_DIP, "-")
|
||||
ENTRY(9316_dip, TTL_9316_DIP, "-")
|
||||
ENTRY(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")
|
||||
|
@ -78,7 +78,10 @@
|
||||
#include "nld_74107.h"
|
||||
#include "nld_74123.h"
|
||||
#include "nld_74153.h"
|
||||
#include "nld_74192.h"
|
||||
#include "nld_74193.h"
|
||||
#include "nld_74ls629.h"
|
||||
#include "nld_9310.h"
|
||||
#include "nld_9312.h"
|
||||
#include "nld_9316.h"
|
||||
|
||||
|
133
src/emu/netlist/devices/nld_74192.c
Normal file
133
src/emu/netlist/devices/nld_74192.c
Normal file
@ -0,0 +1,133 @@
|
||||
/*
|
||||
* nld_74192.c
|
||||
*
|
||||
*/
|
||||
|
||||
#define MAXCNT 9
|
||||
|
||||
#include "nld_74192.h"
|
||||
|
||||
NETLIB_START(74192)
|
||||
{
|
||||
register_input("A", m_A);
|
||||
register_input("B", m_B);
|
||||
register_input("C", m_C);
|
||||
register_input("D", m_D);
|
||||
register_input("CLEAR", m_CLEAR);
|
||||
register_input("LOADQ", m_LOADQ);
|
||||
register_input("CU", m_CU);
|
||||
register_input("CD", m_CD);
|
||||
|
||||
register_output("QA", m_Q[0]);
|
||||
register_output("QB", m_Q[1]);
|
||||
register_output("QC", m_Q[2]);
|
||||
register_output("QD", m_Q[3]);
|
||||
register_output("BORROWQ", m_BORROWQ);
|
||||
register_output("CARRYQ", m_CARRYQ);
|
||||
|
||||
save(NLNAME(m_cnt));
|
||||
save(NLNAME(m_last_CU));
|
||||
save(NLNAME(m_last_CD));
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(74192)
|
||||
{
|
||||
m_cnt = 0;
|
||||
m_last_CU = 0;
|
||||
m_last_CD = 0;
|
||||
}
|
||||
|
||||
// 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)};
|
||||
|
||||
NETLIB_UPDATE(74192)
|
||||
{
|
||||
int tCarry = 1;
|
||||
int tBorrow = 1;
|
||||
if (INPLOGIC(m_CLEAR))
|
||||
{
|
||||
m_cnt = 0;
|
||||
}
|
||||
else if (!INPLOGIC(m_LOADQ))
|
||||
{
|
||||
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
|
||||
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_D) << 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
|
||||
{
|
||||
m_cnt++;
|
||||
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)
|
||||
m_cnt--;
|
||||
else
|
||||
m_cnt = MAXCNT;
|
||||
}
|
||||
else if (INPLOGIC(m_CU) && m_last_CD && !INPLOGIC(m_CD))
|
||||
{
|
||||
if (m_cnt == 0)
|
||||
tBorrow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
m_last_CD = INPLOGIC(m_CD);
|
||||
m_last_CU = INPLOGIC(m_CU);
|
||||
|
||||
for (int i=0; i<4; i++)
|
||||
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
|
||||
|
||||
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
|
||||
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
|
||||
}
|
||||
|
||||
NETLIB_FUNC_VOID(74192, update_outputs, (void))
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_START(74192_dip)
|
||||
{
|
||||
NETLIB_NAME(74192)::start();
|
||||
|
||||
register_subalias("1", m_B);
|
||||
register_subalias("2", m_Q[1]);
|
||||
register_subalias("3", m_Q[0]);
|
||||
register_subalias("4", m_CD);
|
||||
register_subalias("5", m_CU);
|
||||
register_subalias("6", m_Q[2]);
|
||||
register_subalias("7", m_Q[3]);
|
||||
|
||||
register_subalias("9", m_D);
|
||||
register_subalias("10", 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);
|
||||
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(74192_dip)
|
||||
{
|
||||
NETLIB_NAME(74192)::update();
|
||||
}
|
||||
|
||||
NETLIB_RESET(74192_dip)
|
||||
{
|
||||
NETLIB_NAME(74192)::reset();
|
||||
}
|
64
src/emu/netlist/devices/nld_74192.h
Normal file
64
src/emu/netlist/devices/nld_74192.h
Normal file
@ -0,0 +1,64 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Couriersud
|
||||
/*
|
||||
* nld_74192.h
|
||||
*
|
||||
* DM74192: Synchronous 4-Bit Binary Counter with Dual Clock
|
||||
* Decade counter
|
||||
*
|
||||
* FIXME: This should be merged with the 74193 which counts to 16
|
||||
*
|
||||
* +--------------+
|
||||
* B |1 ++ 16| VCC
|
||||
* QB |2 15| A
|
||||
* QA |3 14| CLEAR
|
||||
* CD |4 74192 13| BORROWQ
|
||||
* CU |5 12| CARRYQ
|
||||
* QC |6 11| LOADQ
|
||||
* QD |7 10| C
|
||||
* GND |8 9| D
|
||||
* +--------------+
|
||||
*
|
||||
* CD: Count up
|
||||
* CU: Count down
|
||||
*
|
||||
* Naming conventions follow National Semiconductor datasheet
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NLD_74192_H_
|
||||
#define NLD_74192_H_
|
||||
|
||||
#include "../nl_base.h"
|
||||
|
||||
#define TTL_74192(_name) \
|
||||
NET_REGISTER_DEV(74192, _name)
|
||||
|
||||
#define TTL_74192_DIP(_name) \
|
||||
NET_REGISTER_DEV(74192_dip, _name)
|
||||
|
||||
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;
|
||||
netlist_ttl_input_t m_CLEAR;
|
||||
netlist_ttl_input_t m_LOADQ;
|
||||
netlist_ttl_input_t m_CU;
|
||||
netlist_ttl_input_t m_CD;
|
||||
|
||||
netlist_state_t<INT8> m_cnt;
|
||||
netlist_state_t<UINT8> m_last_CU;
|
||||
netlist_state_t<UINT8> m_last_CD;
|
||||
|
||||
netlist_ttl_output_t m_Q[4];
|
||||
netlist_ttl_output_t m_BORROWQ;
|
||||
netlist_ttl_output_t m_CARRYQ;
|
||||
);
|
||||
|
||||
NETLIB_DEVICE_DERIVED(74192_dip, 74192,
|
||||
);
|
||||
|
||||
#endif /* NLD_74192_H_ */
|
133
src/emu/netlist/devices/nld_74193.c
Normal file
133
src/emu/netlist/devices/nld_74193.c
Normal file
@ -0,0 +1,133 @@
|
||||
/*
|
||||
* nld_74193.c
|
||||
*
|
||||
*/
|
||||
|
||||
#define MAXCNT 15
|
||||
|
||||
#include "nld_74193.h"
|
||||
|
||||
NETLIB_START(74193)
|
||||
{
|
||||
register_input("A", m_A);
|
||||
register_input("B", m_B);
|
||||
register_input("C", m_C);
|
||||
register_input("D", m_D);
|
||||
register_input("CLEAR", m_CLEAR);
|
||||
register_input("LOADQ", m_LOADQ);
|
||||
register_input("CU", m_CU);
|
||||
register_input("CD", m_CD);
|
||||
|
||||
register_output("QA", m_Q[0]);
|
||||
register_output("QB", m_Q[1]);
|
||||
register_output("QC", m_Q[2]);
|
||||
register_output("QD", m_Q[3]);
|
||||
register_output("BORROWQ", m_BORROWQ);
|
||||
register_output("CARRYQ", m_CARRYQ);
|
||||
|
||||
save(NLNAME(m_cnt));
|
||||
save(NLNAME(m_last_CU));
|
||||
save(NLNAME(m_last_CD));
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(74193)
|
||||
{
|
||||
m_cnt = 0;
|
||||
m_last_CU = 0;
|
||||
m_last_CD = 0;
|
||||
}
|
||||
|
||||
// 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)};
|
||||
|
||||
NETLIB_UPDATE(74193)
|
||||
{
|
||||
int tCarry = 1;
|
||||
int tBorrow = 1;
|
||||
if (INPLOGIC(m_CLEAR))
|
||||
{
|
||||
m_cnt = 0;
|
||||
}
|
||||
else if (!INPLOGIC(m_LOADQ))
|
||||
{
|
||||
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
|
||||
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_D) << 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
|
||||
{
|
||||
m_cnt++;
|
||||
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)
|
||||
m_cnt--;
|
||||
else
|
||||
m_cnt = MAXCNT;
|
||||
}
|
||||
else if (INPLOGIC(m_CU) && m_last_CD && !INPLOGIC(m_CD))
|
||||
{
|
||||
if (m_cnt == 0)
|
||||
tBorrow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
m_last_CD = INPLOGIC(m_CD);
|
||||
m_last_CU = INPLOGIC(m_CU);
|
||||
|
||||
for (int i=0; i<4; i++)
|
||||
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
|
||||
|
||||
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
|
||||
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
|
||||
}
|
||||
|
||||
NETLIB_FUNC_VOID(74193, update_outputs, (void))
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_START(74193_dip)
|
||||
{
|
||||
NETLIB_NAME(74193)::start();
|
||||
|
||||
register_subalias("1", m_B);
|
||||
register_subalias("2", m_Q[1]);
|
||||
register_subalias("3", m_Q[0]);
|
||||
register_subalias("4", m_CD);
|
||||
register_subalias("5", m_CU);
|
||||
register_subalias("6", m_Q[2]);
|
||||
register_subalias("7", m_Q[3]);
|
||||
|
||||
register_subalias("9", m_D);
|
||||
register_subalias("10", 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);
|
||||
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(74193_dip)
|
||||
{
|
||||
NETLIB_NAME(74193)::update();
|
||||
}
|
||||
|
||||
NETLIB_RESET(74193_dip)
|
||||
{
|
||||
NETLIB_NAME(74193)::reset();
|
||||
}
|
61
src/emu/netlist/devices/nld_74193.h
Normal file
61
src/emu/netlist/devices/nld_74193.h
Normal file
@ -0,0 +1,61 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Couriersud
|
||||
/*
|
||||
* nld_74193.h
|
||||
*
|
||||
* DM74193: Synchronous 4-Bit Binary Counter with Dual Clock
|
||||
*
|
||||
* +--------------+
|
||||
* B |1 ++ 16| VCC
|
||||
* QB |2 15| A
|
||||
* QA |3 14| CLEAR
|
||||
* CD |4 74193 13| BORROWQ
|
||||
* CU |5 12| CARRYQ
|
||||
* QC |6 11| LOADQ
|
||||
* QD |7 10| C
|
||||
* GND |8 9| D
|
||||
* +--------------+
|
||||
*
|
||||
* CD: Count up
|
||||
* CU: Count down
|
||||
*
|
||||
* Naming conventions follow National Semiconductor datasheet
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NLD_74193_H_
|
||||
#define NLD_74193_H_
|
||||
|
||||
#include "../nl_base.h"
|
||||
|
||||
#define TTL_74193(_name) \
|
||||
NET_REGISTER_DEV(74193, _name)
|
||||
|
||||
#define TTL_74193_DIP(_name) \
|
||||
NET_REGISTER_DEV(74193_dip, _name)
|
||||
|
||||
NETLIB_DEVICE(74193,
|
||||
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;
|
||||
netlist_ttl_input_t m_CLEAR;
|
||||
netlist_ttl_input_t m_LOADQ;
|
||||
netlist_ttl_input_t m_CU;
|
||||
netlist_ttl_input_t m_CD;
|
||||
|
||||
netlist_state_t<INT8> m_cnt;
|
||||
netlist_state_t<UINT8> m_last_CU;
|
||||
netlist_state_t<UINT8> m_last_CD;
|
||||
|
||||
netlist_ttl_output_t m_Q[4];
|
||||
netlist_ttl_output_t m_BORROWQ;
|
||||
netlist_ttl_output_t m_CARRYQ;
|
||||
);
|
||||
|
||||
NETLIB_DEVICE_DERIVED(74193_dip, 74193,
|
||||
);
|
||||
|
||||
#endif /* NLD_74193_H_ */
|
228
src/emu/netlist/devices/nld_9310.c
Normal file
228
src/emu/netlist/devices/nld_9310.c
Normal file
@ -0,0 +1,228 @@
|
||||
/*
|
||||
* nld_9310.c
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nld_9310.h"
|
||||
|
||||
#define MAXCNT 9
|
||||
|
||||
NETLIB_START(9310)
|
||||
{
|
||||
register_sub(subABCD, "subABCD");
|
||||
sub.m_ABCD = &subABCD;
|
||||
register_sub(sub, "sub");
|
||||
|
||||
register_subalias("CLK", sub.m_CLK);
|
||||
|
||||
register_input("ENP", m_ENP);
|
||||
register_input("ENT", m_ENT);
|
||||
register_input("CLRQ", m_CLRQ);
|
||||
register_input("LOADQ", m_LOADQ);
|
||||
|
||||
register_subalias("A", subABCD.m_A);
|
||||
register_subalias("B", subABCD.m_B);
|
||||
register_subalias("C", subABCD.m_C);
|
||||
register_subalias("D", subABCD.m_D);
|
||||
|
||||
register_subalias("QA", sub.m_QA);
|
||||
register_subalias("QB", sub.m_QB);
|
||||
register_subalias("QC", sub.m_QC);
|
||||
register_subalias("QD", sub.m_QD);
|
||||
register_subalias("RC", sub.m_RC);
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(9310)
|
||||
{
|
||||
sub.do_reset();
|
||||
subABCD.do_reset();
|
||||
}
|
||||
|
||||
NETLIB_START(9310_subABCD)
|
||||
{
|
||||
register_input("A", m_A);
|
||||
register_input("B", m_B);
|
||||
register_input("C", m_C);
|
||||
register_input("D", m_D);
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(9310_subABCD)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(9310_subABCD)
|
||||
{
|
||||
}
|
||||
|
||||
NETLIB_START(9310_sub)
|
||||
{
|
||||
register_input("CLK", m_CLK);
|
||||
|
||||
register_output("QA", m_QA);
|
||||
register_output("QB", m_QB);
|
||||
register_output("QC", m_QC);
|
||||
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()));
|
||||
}
|
||||
|
||||
NETLIB_RESET(9310_sub)
|
||||
{
|
||||
m_CLK.set_state(netlist_input_t::STATE_INP_LH);
|
||||
m_cnt = 0;
|
||||
m_loadq = 1;
|
||||
m_ent = 1;
|
||||
}
|
||||
|
||||
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));
|
||||
#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 = cnt;
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(9310)
|
||||
{
|
||||
sub.m_loadq = INPLOGIC(m_LOADQ);
|
||||
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)
|
||||
{
|
||||
sub.m_CLK.activate_lh();
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 cnt = sub.m_cnt;
|
||||
sub.m_CLK.inactivate();
|
||||
if (!clrq && (cnt>0))
|
||||
{
|
||||
cnt = 0;
|
||||
sub.update_outputs(cnt);
|
||||
//OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20));
|
||||
sub.m_cnt = cnt;
|
||||
//return;
|
||||
}
|
||||
}
|
||||
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))
|
||||
{
|
||||
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);
|
||||
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
|
||||
}
|
||||
|
||||
inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
|
||||
{
|
||||
const netlist_time out_delay = NLTIME_FROM_NS(20);
|
||||
#if 1
|
||||
// for (int i=0; i<4; i++)
|
||||
// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
|
||||
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
|
||||
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
|
||||
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
|
||||
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
|
||||
#else
|
||||
if ((cnt & 1) == 1)
|
||||
OUTLOGIC(m_QA, 1, out_delay);
|
||||
else
|
||||
{
|
||||
OUTLOGIC(m_QA, 0, out_delay);
|
||||
switch (cnt)
|
||||
{
|
||||
case 0x00:
|
||||
OUTLOGIC(m_QB, 0, out_delay);
|
||||
OUTLOGIC(m_QC, 0, out_delay);
|
||||
OUTLOGIC(m_QD, 0, out_delay);
|
||||
break;
|
||||
case 0x02:
|
||||
case 0x06:
|
||||
case 0x0A:
|
||||
case 0x0E:
|
||||
OUTLOGIC(m_QB, 1, out_delay);
|
||||
break;
|
||||
case 0x04:
|
||||
case 0x0C:
|
||||
OUTLOGIC(m_QB, 0, out_delay);
|
||||
OUTLOGIC(m_QC, 1, out_delay);
|
||||
break;
|
||||
case 0x08:
|
||||
OUTLOGIC(m_QB, 0, out_delay);
|
||||
OUTLOGIC(m_QC, 0, out_delay);
|
||||
OUTLOGIC(m_QD, 1, out_delay);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
NETLIB_START(9310_dip)
|
||||
{
|
||||
NETLIB_NAME(9310)::start();
|
||||
|
||||
register_subalias("1", m_CLRQ);
|
||||
register_subalias("2", sub.m_CLK);
|
||||
register_subalias("3", subABCD.m_A);
|
||||
register_subalias("4", subABCD.m_B);
|
||||
register_subalias("5", subABCD.m_C);
|
||||
register_subalias("6", subABCD.m_D);
|
||||
register_subalias("7", m_ENP);
|
||||
// register_subalias("8", ); --> GND
|
||||
|
||||
register_subalias("9", m_LOADQ);
|
||||
register_subalias("10", m_ENT);
|
||||
register_subalias("11", sub.m_QD);
|
||||
register_subalias("12", sub.m_QC);
|
||||
register_subalias("13", sub.m_QB);
|
||||
register_subalias("14", sub.m_QA);
|
||||
register_subalias("15", sub.m_RC);
|
||||
// register_subalias("16", ); --> VCC
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(9310_dip)
|
||||
{
|
||||
NETLIB_NAME(9310)::update();
|
||||
}
|
||||
|
||||
NETLIB_RESET(9310_dip)
|
||||
{
|
||||
NETLIB_NAME(9310)::reset();
|
||||
}
|
104
src/emu/netlist/devices/nld_9310.h
Normal file
104
src/emu/netlist/devices/nld_9310.h
Normal file
@ -0,0 +1,104 @@
|
||||
// license:GPL-2.0+
|
||||
// copyright-holders:Couriersud
|
||||
/*
|
||||
* nld_9310.h
|
||||
*
|
||||
* DM9310: Synchronous 4-Bit Counters
|
||||
*
|
||||
* FIXME: This should be merged with the 9316. The only difference is MAXCNT!
|
||||
*
|
||||
* +--------------+
|
||||
* CLEAR |1 ++ 16| VCC
|
||||
* CLOCK |2 15| RC (Ripple Carry)
|
||||
* A |3 14| QA
|
||||
* B |4 9310 13| QB
|
||||
* C |5 12| QC
|
||||
* D |6 11| QD
|
||||
* Enable P |7 10| Enable T
|
||||
* GND |8 9| LOAD
|
||||
* +--------------+
|
||||
*
|
||||
* Counter Sequence
|
||||
*
|
||||
* +-------++----+----+----+----+----+
|
||||
* | COUNT || QD | QC | QB | QA | RC |
|
||||
* +=======++====+====+====+====+====+
|
||||
* | 0 || 0 | 0 | 0 | 0 | 0 |
|
||||
* | 1 || 0 | 0 | 0 | 1 | 0 |
|
||||
* | 2 || 0 | 0 | 1 | 0 | 0 |
|
||||
* | 3 || 0 | 0 | 1 | 1 | 0 |
|
||||
* | 4 || 0 | 1 | 0 | 0 | 0 |
|
||||
* | 5 || 0 | 1 | 0 | 1 | 0 |
|
||||
* | 6 || 0 | 1 | 1 | 0 | 0 |
|
||||
* | 7 || 0 | 1 | 1 | 1 | 0 |
|
||||
* | 8 || 1 | 0 | 0 | 0 | 0 |
|
||||
* | 9 || 1 | 0 | 0 | 1 | 0 |
|
||||
* +-------++----+----+----+----+----+
|
||||
*
|
||||
* Reset count function: Please refer to
|
||||
* National Semiconductor datasheet (timing diagramm)
|
||||
*
|
||||
* Naming conventions follow National Semiconductor datasheet
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NLD_9310_H_
|
||||
#define NLD_9310_H_
|
||||
|
||||
#include "../nl_base.h"
|
||||
|
||||
#define TTL_9310(_name, _CLK, _ENP, _ENT, _CLRQ, _LOADQ, _A, _B, _C, _D) \
|
||||
NET_REGISTER_DEV(9310, _name) \
|
||||
NET_CONNECT(_name, CLK, _CLK) \
|
||||
NET_CONNECT(_name, ENP, _ENP) \
|
||||
NET_CONNECT(_name, ENT, _ENT) \
|
||||
NET_CONNECT(_name, CLRQ, _CLRQ) \
|
||||
NET_CONNECT(_name, LOADQ,_LOADQ) \
|
||||
NET_CONNECT(_name, A, _A) \
|
||||
NET_CONNECT(_name, B, _B) \
|
||||
NET_CONNECT(_name, C, _C) \
|
||||
NET_CONNECT(_name, D, _D)
|
||||
|
||||
#define TTL_9310_DIP(_name) \
|
||||
NET_REGISTER_DEV(9310_dip, _name)
|
||||
|
||||
NETLIB_SUBDEVICE(9310_subABCD,
|
||||
netlist_ttl_input_t m_A;
|
||||
netlist_ttl_input_t m_B;
|
||||
netlist_ttl_input_t m_C;
|
||||
netlist_ttl_input_t m_D;
|
||||
|
||||
ATTR_HOT inline UINT8 read_ABCD();
|
||||
);
|
||||
|
||||
NETLIB_SUBDEVICE(9310_sub,
|
||||
ATTR_HOT void update_outputs_all(const UINT8 cnt);
|
||||
ATTR_HOT void update_outputs(const UINT8 cnt);
|
||||
|
||||
netlist_ttl_input_t m_CLK;
|
||||
|
||||
netlist_state_t<UINT8> m_cnt;
|
||||
netlist_state_t<NETLIB_NAME(9310_subABCD) *> m_ABCD;
|
||||
netlist_state_t<netlist_sig_t> m_loadq;
|
||||
netlist_state_t<netlist_sig_t> m_ent;
|
||||
|
||||
netlist_ttl_output_t m_QA;
|
||||
netlist_ttl_output_t m_QB;
|
||||
netlist_ttl_output_t m_QC;
|
||||
netlist_ttl_output_t m_QD;
|
||||
netlist_ttl_output_t m_RC;
|
||||
);
|
||||
|
||||
NETLIB_DEVICE(9310,
|
||||
NETLIB_NAME(9310_sub) sub;
|
||||
NETLIB_NAME(9310_subABCD) subABCD;
|
||||
netlist_ttl_input_t m_ENP;
|
||||
netlist_ttl_input_t m_ENT;
|
||||
netlist_ttl_input_t m_CLRQ;
|
||||
netlist_ttl_input_t m_LOADQ;
|
||||
);
|
||||
|
||||
NETLIB_DEVICE_DERIVED(9310_dip, 9310,
|
||||
);
|
||||
|
||||
#endif /* NLD_9310_H_ */
|
@ -5,6 +5,8 @@
|
||||
|
||||
#include "nld_9316.h"
|
||||
|
||||
#define MAXCNT 15
|
||||
|
||||
NETLIB_START(9316)
|
||||
{
|
||||
register_sub(subABCD, "subABCD");
|
||||
@ -91,9 +93,11 @@ NETLIB_UPDATE(9316_sub)
|
||||
UINT8 cnt = m_cnt;
|
||||
if (m_loadq)
|
||||
{
|
||||
cnt = ( cnt + 1) & 0x0f;
|
||||
cnt++;
|
||||
if (cnt > MAXCNT)
|
||||
cnt = 0;
|
||||
update_outputs(cnt);
|
||||
OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20));
|
||||
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));
|
||||
@ -105,7 +109,7 @@ NETLIB_UPDATE(9316_sub)
|
||||
{
|
||||
cnt = m_ABCD.get()->read_ABCD();
|
||||
update_outputs_all(cnt);
|
||||
OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20));
|
||||
OUTLOGIC(m_RC, m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
}
|
||||
m_cnt = cnt;
|
||||
}
|
||||
@ -133,7 +137,7 @@ NETLIB_UPDATE(9316)
|
||||
//return;
|
||||
}
|
||||
}
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == 0x0f), NLTIME_FROM_NS(20));
|
||||
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
|
||||
}
|
||||
|
||||
inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt))
|
||||
|
@ -33,3 +33,39 @@ NETLIB_UPDATE(nicRSFF)
|
||||
OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20));
|
||||
}
|
||||
}
|
||||
|
||||
NETLIB_START(nicDelay)
|
||||
{
|
||||
register_input("1", m_I);
|
||||
register_output("2", m_Q);
|
||||
|
||||
register_param("L_TO_H", m_L_to_H, 10);
|
||||
register_param("H_TO_L", m_H_to_L, 10);
|
||||
|
||||
save(NLNAME(m_last));
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(nicDelay)
|
||||
{
|
||||
m_Q.initial(0);
|
||||
}
|
||||
|
||||
NETLIB_UPDATE_PARAM(nicDelay)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(nicDelay)
|
||||
{
|
||||
if (INPLOGIC(m_I) && !m_last)
|
||||
{
|
||||
// L_to_H
|
||||
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value()));
|
||||
}
|
||||
else if (!INPLOGIC(m_I) && m_last)
|
||||
{
|
||||
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_H_to_L.Value()));
|
||||
}
|
||||
m_last = INPLOGIC(m_I);
|
||||
}
|
||||
|
@ -22,6 +22,9 @@
|
||||
#define NETDEV_RSFF(_name) \
|
||||
NET_REGISTER_DEV(nicRSFF, _name)
|
||||
|
||||
#define NETDEV_DELAY(_name) \
|
||||
NET_REGISTER_DEV(nicDelay, _name)
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// Devices ...
|
||||
// ----------------------------------------------------------------------------------------
|
||||
@ -35,4 +38,16 @@ NETLIB_DEVICE(nicRSFF,
|
||||
);
|
||||
|
||||
|
||||
NETLIB_DEVICE_WITH_PARAMS(nicDelay,
|
||||
netlist_ttl_input_t m_I;
|
||||
|
||||
netlist_ttl_output_t m_Q;
|
||||
|
||||
netlist_param_int_t m_L_to_H;
|
||||
netlist_param_int_t m_H_to_L;
|
||||
|
||||
netlist_state_t<UINT8> m_last;
|
||||
);
|
||||
|
||||
|
||||
#endif /* NLD_LEGACY_H_ */
|
||||
|
@ -35,8 +35,12 @@
|
||||
#define CIRCUIT_LAYOUT_END NETLIST_END()
|
||||
|
||||
|
||||
#define OHM(x) (x)
|
||||
#define K_OHM(x) ((x) * 1000.0)
|
||||
#define M_OHM(x) ((x) * 1.0e6)
|
||||
#define U_FARAD(x) ((x) * 1.0e-6)
|
||||
#define N_FARAD(x) ((x) * 1.0e-9)
|
||||
#define P_FARAD(x) ((x) * 1.0e-12)
|
||||
|
||||
struct Mono555Desc
|
||||
{
|
||||
@ -46,6 +50,14 @@ public:
|
||||
Mono555Desc(nl_double res, nl_double cap) : r(res), c(cap) { }
|
||||
};
|
||||
|
||||
struct Astable555Desc
|
||||
{
|
||||
public:
|
||||
nl_double r1, r2, c;
|
||||
|
||||
Astable555Desc(nl_double res1, nl_double res2, nl_double cap) : r1(res1), r2(res2), c(cap) { }
|
||||
};
|
||||
|
||||
struct Mono9602Desc
|
||||
{
|
||||
public:
|
||||
@ -63,6 +75,12 @@ public:
|
||||
SeriesRCDesc(nl_double res, nl_double cap) : r(res), c(cap) { }
|
||||
};
|
||||
|
||||
struct CapacitorDesc : public SeriesRCDesc
|
||||
{
|
||||
public:
|
||||
CapacitorDesc(nl_double cap) : SeriesRCDesc(0.0, cap) { }
|
||||
};
|
||||
|
||||
#define CHIP_555_Mono(_name, _pdesc) \
|
||||
CHIP(# _name, NE555) \
|
||||
NET_C(_name.6, _name.7) \
|
||||
@ -75,6 +93,21 @@ public:
|
||||
NET_C(_name.8, V5) \
|
||||
NET_CSTR(# _name ".1", "GND")
|
||||
|
||||
#define CHIP_555_Astable(_name, _pdesc) \
|
||||
CHIP(# _name, NE555) \
|
||||
NET_C(_name.6, _name.2) \
|
||||
RES(_name ## _R1, (_pdesc)->r1) \
|
||||
RES(_name ## _R2, (_pdesc)->r2) \
|
||||
CAP(_name ## _C, (_pdesc)->c) \
|
||||
NET_C(_name.7, _name ## _R1.1) \
|
||||
NET_C(_name.7, _name ## _R2.1) \
|
||||
NET_C(_name.6, _name ## _R2.2) \
|
||||
NET_C(_name.6, _name ## _C.1) \
|
||||
NET_C(_name ## _R1.2, V5) \
|
||||
NET_CSTR(# _name "_C.2", "GND") \
|
||||
NET_C(_name.8, V5) \
|
||||
NET_CSTR(# _name ".1", "GND")
|
||||
|
||||
#define CHIP_9602_Mono(_name, _pdesc) \
|
||||
CHIP(# _name, 9602) \
|
||||
NET_C(VCC, _name.16) \
|
||||
@ -118,6 +151,20 @@ public:
|
||||
ALIAS(_name.2, _name.S) \
|
||||
ALIAS(_name.3, _name.QQ)
|
||||
|
||||
/* FIXME: Alternative implementation using capacitor.
|
||||
* This is a transitional implementation
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#define CHIP_CAPACITOR(_name, _pdesc) \
|
||||
NETDEV_DELAY(_name) \
|
||||
NETDEV_PARAMI(_name, L_TO_H, CAPACITOR_tc((_pdesc)->c, (_pdesc)->r)) \
|
||||
NETDEV_PARAMI(_name, H_TO_HL, CAPACITOR_tc((_pdesc)->c, (_pdesc)->r)) \
|
||||
|
||||
|
||||
#endif /* NL_DICE_COMPAT_H_ */
|
||||
|
1546
src/mame/drivers/nl_breakout.c
Normal file
1546
src/mame/drivers/nl_breakout.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@
|
||||
|
||||
NETLIST_START(pong_fast)
|
||||
SOLVER(Solver, 48000)
|
||||
PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
|
||||
PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient
|
||||
PARAM(Solver.LTE, 1e-4) // Default is not enough for paddle control if using LTE
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user