All MAME <-> Netlist interfacing is now done in the machine device driver. This

a) ensures, that the interface logic is in one place and easy to understand
b) ensures, that netlists represent the hardware and not what has to be done
   to hook the hardware up in MAME.
   
The interface part is considered to be relatively stable. Consequently, enabled netlist audio filtering in 1942.
This commit is contained in:
Couriersud 2014-02-08 15:55:21 +00:00
parent e92dab9e34
commit 5d8cd9329e
9 changed files with 354 additions and 98 deletions

View File

@ -57,19 +57,32 @@
const device_type NETLIST_CORE = &device_creator<netlist_mame_device_t>;
const device_type NETLIST_CPU = &device_creator<netlist_mame_cpu_device_t>;
const device_type NETLIST_SOUND = &device_creator<netlist_mame_sound_device_t>;
/* subdevices */
const device_type NETLIST_ANALOG_INPUT = &device_creator<netlist_mame_analog_input_t>;
const device_type NETLIST_LOGIC_INPUT = &device_creator<netlist_mame_logic_input_t>;
const device_type NETLIST_STREAM_INPUT = &device_creator<netlist_mame_stream_input_t>;
const device_type NETLIST_ANALOG_OUTPUT = &device_creator<netlist_mame_analog_output_t>;
const device_type NETLIST_STREAM_OUTPUT = &device_creator<netlist_mame_stream_output_t>;
// ----------------------------------------------------------------------------------------
// netlist_mame_analog_input_t
// ----------------------------------------------------------------------------------------
void netlist_mame_sub_interface::static_set_mult_offset(device_t &device, const double mult, const double offset)
{
netlist_mame_sub_interface &netlist = dynamic_cast<netlist_mame_sub_interface &>(device);
netlist.m_mult = mult;
netlist.m_offset = offset;
}
netlist_mame_analog_input_t::netlist_mame_analog_input_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NETLIST_ANALOG_INPUT, "netlist analog input", tag, owner, clock, "netlist_analog_input", __FILE__),
netlist_mame_sub_interface(*owner),
m_param(0),
m_offset(0.0),
m_mult(1.0),
m_auto_port(true),
m_param_name("")
{
@ -81,15 +94,6 @@ void netlist_mame_analog_input_t::static_set_name(device_t &device, const char *
netlist.m_param_name = param_name;
}
void netlist_mame_analog_input_t::static_set_mult_offset(device_t &device, const double mult, const double offset)
{
netlist_mame_analog_input_t &netlist = downcast<netlist_mame_analog_input_t &>(device);
netlist.m_mult = mult;
netlist.m_offset = offset;
// disable automatic scaling for ioports
netlist.m_auto_port = false;
}
void netlist_mame_analog_input_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
@ -99,8 +103,54 @@ void netlist_mame_analog_input_t::device_start()
{
fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
}
if (m_mult != 1.0 || m_offset != 0.0)
{
// disable automatic scaling for ioports
m_auto_port = false;
}
}
// ----------------------------------------------------------------------------------------
// netlist_mame_analog_output_t
// ----------------------------------------------------------------------------------------
netlist_mame_analog_output_t::netlist_mame_analog_output_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NETLIST_ANALOG_INPUT, "netlist analog output", tag, owner, clock, "netlist_analog_output", __FILE__),
netlist_mame_sub_interface(*owner),
m_in("")
{
}
void netlist_mame_analog_output_t::static_set_params(device_t &device, const char *in_name, netlist_analog_output_delegate adelegate)
{
netlist_mame_analog_output_t &netlist = downcast<netlist_mame_analog_output_t &>(device);
netlist.m_in = in_name;
netlist.m_delegate = adelegate;
}
void netlist_mame_analog_output_t::custom_netlist_additions(netlist_setup_t &setup)
{
pstring dname = "OUT_" + m_in;
m_delegate.bind_relative_to(owner()->machine().root_device());
NETLIB_NAME(analog_callback) *dev = downcast<NETLIB_NAME(analog_callback) *>(
setup.factory().new_device_by_classname("nld_analog_callback", setup));
setup.register_dev(dev, dname);
dev->register_callback(m_delegate);
setup.register_link(dname + ".IN", m_in);
}
void netlist_mame_analog_output_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
}
// ----------------------------------------------------------------------------------------
// netlist_mame_logic_input_t
// ----------------------------------------------------------------------------------------
netlist_mame_logic_input_t::netlist_mame_logic_input_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NETLIST_ANALOG_INPUT, "netlist analog input", tag, owner, clock, "netlist_analog_input", __FILE__),
netlist_mame_sub_interface(*owner),
@ -130,6 +180,83 @@ void netlist_mame_logic_input_t::device_start()
}
}
// ----------------------------------------------------------------------------------------
// netlist_mame_stream_input_t
// ----------------------------------------------------------------------------------------
netlist_mame_stream_input_t::netlist_mame_stream_input_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NETLIST_ANALOG_INPUT, "netlist analog input", tag, owner, clock, "netlist_analog_input", __FILE__),
netlist_mame_sub_interface(*owner),
m_channel(0),
m_param_name("")
{
}
void netlist_mame_stream_input_t::static_set_params(device_t &device, int channel, const char *param_name)
{
netlist_mame_stream_input_t &netlist = downcast<netlist_mame_stream_input_t &>(device);
netlist.m_param_name = param_name;
netlist.m_channel = channel;
}
void netlist_mame_stream_input_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
}
void netlist_mame_stream_input_t::custom_netlist_additions(netlist_setup_t &setup)
{
NETLIB_NAME(sound_in) *snd_in = setup.netlist().get_first_device<NETLIB_NAME(sound_in) *>();
if (snd_in == NULL)
{
snd_in = dynamic_cast<NETLIB_NAME(sound_in) *>(setup.factory().new_device_by_classname("nld_sound_in", setup));
setup.register_dev(snd_in, "STREAM_INPUT");
}
pstring sparam = pstring::sprintf("STREAM_INPUT.CHAN%d", m_channel);
setup.register_param(sparam, m_param_name);
pstring mparam = pstring::sprintf("STREAM_INPUT.MULT%d", m_channel);
setup.register_param(mparam, m_mult);
}
// ----------------------------------------------------------------------------------------
// netlist_mame_stream_output_t
// ----------------------------------------------------------------------------------------
netlist_mame_stream_output_t::netlist_mame_stream_output_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NETLIST_ANALOG_INPUT, "netlist analog input", tag, owner, clock, "netlist_analog_input", __FILE__),
netlist_mame_sub_interface(*owner),
m_channel(0),
m_out_name("")
{
}
void netlist_mame_stream_output_t::static_set_params(device_t &device, int channel, const char *out_name)
{
netlist_mame_stream_output_t &netlist = downcast<netlist_mame_stream_output_t &>(device);
netlist.m_out_name = out_name;
netlist.m_channel = channel;
}
void netlist_mame_stream_output_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
}
void netlist_mame_stream_output_t::custom_netlist_additions(netlist_setup_t &setup)
{
NETLIB_NAME(sound_out) *snd_out;
pstring sname = pstring::sprintf("STREAM_OUT_%d", m_channel);
snd_out = dynamic_cast<NETLIB_NAME(sound_out) *>(setup.factory().new_device_by_classname("nld_sound_out", setup));
setup.register_dev(snd_out, sname);
setup.register_param(sname + ".CHAN" , m_channel);
setup.register_param(sname + ".MULT", m_mult);
setup.register_link(sname + ".IN", m_out_name);
}
// ----------------------------------------------------------------------------------------
// netlist_mame_t
// ----------------------------------------------------------------------------------------
@ -221,7 +348,7 @@ void netlist_mame_device_t::device_start()
if( sdev != NULL )
{
LOG_DEV_CALLS(("Found subdevice %s/%s\n", d->name(), d->shortname()));
sdev->custom_netlist_additions(*m_netlist);
sdev->custom_netlist_additions(*m_setup);
}
}

View File

@ -64,19 +64,35 @@
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ANALOG_INPUT, 0) \
netlist_mame_analog_input_t::static_set_name(*device, _name);
#define MCFG_NETLIST_ANALOG_INPUT_MULT_OFFSET(_mult, _offset) \
#define MCFG_NETLIST_ANALOG_MULT_OFFSET(_mult, _offset) \
netlist_mame_analog_input_t::static_set_mult_offset(*device, _mult, _offset);
#define NETLIST_ANALOG_PORT_CHANGED(_base, _tag) \
PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_analog_input_t, input_changed, 0)
#define MCFG_NETLIST_ANALOG_OUTPUT(_basetag, _tag, _IN, _class, _member, _class_tag) \
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ANALOG_OUTPUT, 0) \
netlist_mame_analog_output_t::static_set_params(*device, _IN, \
netlist_analog_output_delegate(& _class :: _member, \
# _class "::" # _member, _class_tag, (_class *) 0) );
#define MCFG_NETLIST_LOGIC_INPUT(_basetag, _tag, _name, _shift, _mask) \
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_LOGIC_INPUT, 0) \
netlist_mame_logic_input_t::static_set_params(*device, _name, _mask, _shift);
#define MCFG_NETLIST_STREAM_INPUT(_basetag, _chan, _name) \
MCFG_DEVICE_ADD(_basetag ":cin" # _chan, NETLIST_STREAM_INPUT, 0) \
netlist_mame_stream_input_t::static_set_params(*device, _chan, _name);
#define MCFG_NETLIST_STREAM_OUTPUT(_basetag, _chan, _name) \
MCFG_DEVICE_ADD(_basetag ":cout" # _chan, NETLIST_STREAM_OUTPUT, 0) \
netlist_mame_stream_output_t::static_set_params(*device, _chan, _name);
#define NETLIST_LOGIC_PORT_CHANGED(_base, _tag) \
PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_logic_input_t, input_changed, 0)
#define NETLIST_ANALOG_PORT_CHANGED(_base, _tag) \
PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_analog_input_t, input_changed, 0)
// ----------------------------------------------------------------------------------------
// Extensions to interface netlist with MAME code ....
// ----------------------------------------------------------------------------------------
@ -84,6 +100,11 @@
#define NETLIST_MEMREGION(_name) \
netlist.parse((char *)downcast<netlist_mame_t &>(netlist.netlist()).machine().root_device().memregion(_name)->base());
#define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \
void _name(const double data, const attotime &time)
#if 0
#define NETDEV_ANALOG_CALLBACK(_name, _IN, _class, _member, _tag) \
{ \
NETLIB_NAME(analog_callback) *dev = downcast<NETLIB_NAME(analog_callback) *>(netlist.register_dev(NET_NEW(analog_callback), # _name)); \
@ -91,10 +112,9 @@
dev->register_callback(d); \
} \
NET_CONNECT(_name, IN, _IN)
#endif
#define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \
void _name(const double data, const attotime &time)
#if 0
#define NETDEV_SOUND_OUT(_name, _v, _m) \
NET_REGISTER_DEV(sound_out, _name) \
PARAM(_name.CHAN, _v) \
@ -102,6 +122,7 @@
#define NETDEV_SOUND_IN(_name) \
NET_REGISTER_DEV(sound_in, _name)
#endif
class netlist_mame_device_t;
@ -323,13 +344,14 @@ class netlist_mame_sub_interface
public:
// construction/destruction
netlist_mame_sub_interface(device_t &aowner)
: m_offset(0.0), m_mult(1.0)
{
m_owner = dynamic_cast<netlist_mame_device_t *>(&aowner);
m_sound = dynamic_cast<netlist_mame_sound_device_t *>(&aowner);
}
virtual ~netlist_mame_sub_interface() { }
virtual void custom_netlist_additions(netlist_base_t &netlist) { }
virtual void custom_netlist_additions(netlist_setup_t &setup) { }
inline netlist_mame_device_t &nl_owner() const { return *m_owner; }
@ -337,11 +359,15 @@ public:
inline void update_to_current_time()
{
printf("%p\n", m_sound);
printf("%p\n", m_sound->get_stream());
m_sound->get_stream()->update();
}
static void static_set_mult_offset(device_t &device, const double mult, const double offset);
protected:
double m_offset;
double m_mult;
private:
netlist_mame_device_t *m_owner;
netlist_mame_sound_device_t *m_sound;
@ -361,7 +387,6 @@ public:
virtual ~netlist_mame_analog_input_t() { }
static void static_set_name(device_t &device, const char *param_name);
static void static_set_mult_offset(device_t &device, const double mult, const double offset);
inline void write(const double val)
{
@ -396,12 +421,38 @@ protected:
private:
netlist_param_double_t *m_param;
double m_offset;
double m_mult;
bool m_auto_port;
pstring m_param_name;
};
// ----------------------------------------------------------------------------------------
// netlist_mame_analog_output_t
// ----------------------------------------------------------------------------------------
typedef device_delegate<void (const double, const attotime &)> netlist_analog_output_delegate;
class netlist_mame_analog_output_t : public device_t,
public netlist_mame_sub_interface
{
public:
// construction/destruction
netlist_mame_analog_output_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~netlist_mame_analog_output_t() { }
static void static_set_params(device_t &device, const char *in_name, netlist_analog_output_delegate adelegate);
protected:
// device-level overrides
virtual void device_start();
virtual void custom_netlist_additions(netlist_setup_t &setup);
private:
pstring m_in;
netlist_analog_output_delegate m_delegate;
};
// ----------------------------------------------------------------------------------------
// netlist_mame_logic_input_t
// ----------------------------------------------------------------------------------------
@ -450,10 +501,55 @@ private:
};
// ----------------------------------------------------------------------------------------
// netdev_callback
// netlist_mame_stream_input_t
// ----------------------------------------------------------------------------------------
typedef device_delegate<void (const double, const attotime &)> netlist_analog_output_delegate;
class netlist_mame_stream_input_t : public device_t,
public netlist_mame_sub_interface
{
public:
// construction/destruction
netlist_mame_stream_input_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~netlist_mame_stream_input_t() { }
static void static_set_params(device_t &device, int channel, const char *param_name);
protected:
// device-level overrides
virtual void device_start();
virtual void custom_netlist_additions(netlist_setup_t &setup);
private:
UINT32 m_channel;
pstring m_param_name;
};
// ----------------------------------------------------------------------------------------
// netlist_mame_stream_output_t
// ----------------------------------------------------------------------------------------
class netlist_mame_stream_output_t : public device_t,
public netlist_mame_sub_interface
{
public:
// construction/destruction
netlist_mame_stream_output_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~netlist_mame_stream_output_t() { }
static void static_set_params(device_t &device, int channel, const char *out_name);
protected:
// device-level overrides
virtual void device_start();
virtual void custom_netlist_additions(netlist_setup_t &setup);
private:
UINT32 m_channel;
pstring m_out_name;
};
// ----------------------------------------------------------------------------------------
// netdev_callback
// ----------------------------------------------------------------------------------------
class NETLIB_NAME(analog_callback) : public netlist_device_t
{
@ -464,7 +560,6 @@ public:
ATTR_COLD void start()
{
register_input("IN", m_in);
m_callback.bind_relative_to(downcast<netlist_mame_t &>(netlist()).machine().root_device());
m_cpu_device = downcast<netlist_mame_cpu_device_t *>(&downcast<netlist_mame_t &>(netlist()).parent());
}
@ -490,6 +585,10 @@ private:
netlist_mame_cpu_device_t *m_cpu_device;
};
// ----------------------------------------------------------------------------------------
// sound_out
// ----------------------------------------------------------------------------------------
class NETLIB_NAME(sound_out) : public netlist_device_t
{
public:
@ -504,6 +603,7 @@ public:
register_param("CHAN", m_channel, 0);
register_param("MULT", m_mult, 1000.0);
m_sample = netlist_time::from_hz(1); //sufficiently big enough
save(NAME(m_last_buffer));
}
ATTR_COLD void reset()
@ -528,7 +628,7 @@ public:
{
double val = INPANALOG(m_in);
sound_update(netlist().time());
m_cur = val * m_mult.Value();
m_cur = (stream_sample_t) (val * m_mult.Value());
}
ATTR_HOT void buffer_reset(netlist_time upto)
@ -549,6 +649,10 @@ private:
netlist_time m_last_buffer;
};
// ----------------------------------------------------------------------------------------
// sound_in
// ----------------------------------------------------------------------------------------
class NETLIB_NAME(sound_in) : public netlist_device_t
{
public:
@ -568,7 +672,10 @@ public:
for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
{
register_param(pstring::sprintf("CHAN%d", i), m_param_name[i], "");
register_param(pstring::sprintf("MULT%d", i), m_param_mult[i], 1.0);
}
m_num_channel = 0;
}
@ -602,7 +709,7 @@ public:
if (m_buffer[i] == NULL)
break; // stop, called outside of stream_update
double v = m_buffer[i][m_pos];
m_param[i]->setTo(v);
m_param[i]->setTo(v * m_param_mult[i].Value());
}
m_pos++;
OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc );
@ -616,6 +723,7 @@ public:
netlist_param_str_t m_param_name[MAX_INPUT_CHANNELS];
netlist_param_double_t *m_param[MAX_INPUT_CHANNELS];
stream_sample_t *m_buffer[MAX_INPUT_CHANNELS];
netlist_param_double_t m_param_mult[MAX_INPUT_CHANNELS];
netlist_time m_inc;
private:
@ -633,4 +741,8 @@ extern const device_type NETLIST_SOUND;
extern const device_type NETLIST_ANALOG_INPUT;
extern const device_type NETLIST_LOGIC_INPUT;
extern const device_type NETLIST_ANALOG_OUTPUT;
extern const device_type NETLIST_STREAM_INPUT;
extern const device_type NETLIST_STREAM_OUTPUT;
#endif

View File

@ -120,9 +120,9 @@ void netlist_matrix_solver_t::schedule()
}
else
{
//NL_VERBOSE_OUT(("resched\n");
m_owner->netlist().warning("Matrix solver reschedule .. Consider increasing RESCHED_LOOPS");
if (m_owner != NULL)
this->m_owner->schedule1();
this->m_owner->schedule();
}
//solve();
// update_inputs();
@ -637,10 +637,10 @@ NETLIB_START(solver)
register_param("FREQ", m_freq, 48000.0);
m_inc = netlist_time::from_hz(m_freq.Value());
//register_param("ACCURACY", m_accuracy, 1e-3);
register_param("ACCURACY", m_accuracy, 1e-7);
register_param("CONVERG", m_convergence, 0.3);
register_param("RESCHED_LOOPS", m_resched_loops, 35);
register_param("PARALLEL", m_parallel, 0);
// internal staff
@ -686,6 +686,7 @@ NETLIB_UPDATE(solver)
bool do_full = false;
bool global_resched = false;
bool this_resched[100];
int t_cnt = m_mat_solvers.count();
if (delta < m_inc)
do_full = true; // we have been called between updates
@ -693,39 +694,47 @@ NETLIB_UPDATE(solver)
m_last_step = now;
#if HAS_OPENMP && USE_OPENMP
int t_cnt = m_mat_solvers.count();
omp_set_num_threads(3);
omp_set_dynamic(0);
#pragma omp parallel
if (m_parallel.Value())
{
int i;
#pragma omp for nowait
for (i = 0; i < t_cnt; i++)
omp_set_num_threads(4);
omp_set_dynamic(0);
#pragma omp parallel
{
this_resched[i] = m_mat_solvers[i]->solve();
#pragma omp for nowait
for (int i = 0; i < t_cnt; i++)
{
this_resched[i] = m_mat_solvers[i]->solve();
}
}
}
else
for (int i = 0; i < t_cnt; i++)
{
if (do_full || (m_mat_solvers[i]->is_timestep()))
this_resched[i] = m_mat_solvers[i]->solve();
}
#else
for (int i = 0; i < m_mat_solvers.count(); i++)
for (int i = 0; i < t_cnt; i++)
{
if (do_full || (m_mat_solvers[i]->is_timestep()))
this_resched[i] = m_mat_solvers[i]->solve();
}
#endif
for (int i = 0; i < m_mat_solvers.count(); i++)
for (int i = 0; i < t_cnt; i++)
{
if (do_full || m_mat_solvers[i]->is_timestep())
{
global_resched = global_resched || this_resched[i];
if (!this_resched[i])
m_mat_solvers[i]->update_inputs();
global_resched = global_resched || this_resched[i];
if (!this_resched[i])
m_mat_solvers[i]->update_inputs();
}
}
if (global_resched)
{
schedule1();
netlist().warning("Gobal reschedule .. Consider increasing RESCHED_LOOPS");
schedule();
}
else
{

View File

@ -164,6 +164,7 @@ NETLIB_DEVICE_WITH_PARAMS(solver,
netlist_param_double_t m_accuracy;
netlist_param_double_t m_convergence;
netlist_param_int_t m_resched_loops;
netlist_param_int_t m_parallel;
netlist_time m_inc;
netlist_time m_last_step;
@ -174,12 +175,12 @@ public:
ATTR_COLD ~NETLIB_NAME(solver)();
ATTR_HOT inline void schedule1();
ATTR_HOT inline void schedule();
ATTR_COLD void post_start();
);
ATTR_HOT inline void NETLIB_NAME(solver)::schedule1()
ATTR_HOT inline void NETLIB_NAME(solver)::schedule()
{
if (!m_Q_sync.net().is_queued())
m_Q_sync.net().push_to_queue(m_nt_sync_delay);

View File

@ -551,13 +551,7 @@ ATTR_HOT inline void netlist_net_t::update_devs()
m_in_queue = 2; /* mark as taken ... */
netlist_core_terminal_t *p = m_head;
#if 0
do
{
update_dev(p, mask);
p = p->m_update_list_next;
} while (p != NULL);
#else
switch (m_num_cons)
{
case 2:
@ -574,7 +568,7 @@ ATTR_HOT inline void netlist_net_t::update_devs()
} while (p != NULL);
break;
}
#endif
m_last = m_cur;
}

View File

@ -1086,6 +1086,18 @@ public:
return tmp;
}
template<class _C>
_C get_first_device()
{
for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry))
{
_C dev = dynamic_cast<_C>(entry->object());
if (dev != NULL)
return dev;
}
return NULL;
}
tagmap_devices_t m_devices;
netlist_net_t::list_t m_nets;

View File

@ -34,8 +34,6 @@
#define NETLIST_INTERNAL_RES (U64(1000000000))
//#define NETLIST_INTERNAL_RES (U64(1000000000000))
//#define USE_ALTERNATE_SCHEDULING (1)
#define NETLIST_CLOCK (NETLIST_INTERNAL_RES)
#define NETLIST_GMIN (1e-9)

View File

@ -63,21 +63,13 @@ correctly.
#define SOUND_CPU_CLOCK (XTAL_12MHz/4) /* 12MHz is the only OSC on the PCB */
#define AUDIO_CLOCK (XTAL_12MHz/8) /* 12MHz is the only OSC on the PCB */
#define USE_NETLIST (0)
#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
#include "includes/1942.h"
#if USE_NETLIST
#include "machine/netlist.h"
#include "netlist/devices/net_lib.h"
#endif
#if USE_NETLIST
#include "includes/1942.h"
#define NLFILT(RA, R1, C1, R2) \
NET_C(RA.1, V5) \
@ -94,14 +86,6 @@ static NETLIST_START(nl_1942)
PARAM(Solver.FREQ, 48000)
ANALOG_INPUT(V5, 5)
NETDEV_SOUND_IN(SND_IN)
PARAM(SND_IN.CHAN0, "R_AY1_1.R")
PARAM(SND_IN.CHAN1, "R_AY1_2.R")
PARAM(SND_IN.CHAN2, "R_AY1_3.R")
PARAM(SND_IN.CHAN3, "R_AY2_1.R")
PARAM(SND_IN.CHAN4, "R_AY2_2.R")
PARAM(SND_IN.CHAN5, "R_AY2_3.R")
/* AY 8910 internal resistors */
RES(R_AY1_1, 1000);
@ -157,11 +141,7 @@ static NETLIST_START(nl_1942)
NET_C(CC6.2, R1.1)
NET_C(R1.2, GND)
NETDEV_SOUND_OUT(CH0, 0, 100000)
NET_C(CH0.IN, R1.1)
NETLIST_END()
#endif
WRITE8_MEMBER(_1942_state::c1942_bankswitch_w)
{
@ -538,7 +518,6 @@ void _1942_state::machine_reset()
m_scroll[1] = 0;
}
#if USE_NETLIST
static const ay8910_interface ay8910_config =
{
AY8910_RESISTOR_OUTPUT,
@ -548,7 +527,6 @@ static const ay8910_interface ay8910_config =
DEVCB_NULL,
DEVCB_NULL
};
#endif
static MACHINE_CONFIG_START( 1942, _1942_state )
@ -576,7 +554,7 @@ static MACHINE_CONFIG_START( 1942, _1942_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
#if USE_NETLIST
MCFG_SOUND_ADD("ay1", AY8910, AUDIO_CLOCK) /* 1.5 MHz */
MCFG_SOUND_CONFIG(ay8910_config)
MCFG_SOUND_ROUTE_EX(0, "snd_nl", 1.0, 0)
@ -588,16 +566,22 @@ static MACHINE_CONFIG_START( 1942, _1942_state )
MCFG_SOUND_ROUTE_EX(1, "snd_nl", 1.0, 4)
MCFG_SOUND_ROUTE_EX(2, "snd_nl", 1.0, 5)
/* NETLIST configuration using internal AY8910 resistor values */
MCFG_SOUND_ADD("snd_nl", NETLIST_SOUND, 48000)
MCFG_NETLIST_SETUP(nl_1942)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 5.0)
#else
MCFG_SOUND_ADD("ay1", AY8910, AUDIO_CLOCK) /* 1.5 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_SOUND_ADD("ay2", AY8910, AUDIO_CLOCK) /* 1.5 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
#endif
MCFG_NETLIST_STREAM_INPUT("snd_nl", 0, "R_AY1_1.R")
MCFG_NETLIST_STREAM_INPUT("snd_nl", 1, "R_AY1_2.R")
MCFG_NETLIST_STREAM_INPUT("snd_nl", 2, "R_AY1_3.R")
MCFG_NETLIST_STREAM_INPUT("snd_nl", 3, "R_AY2_1.R")
MCFG_NETLIST_STREAM_INPUT("snd_nl", 4, "R_AY2_2.R")
MCFG_NETLIST_STREAM_INPUT("snd_nl", 5, "R_AY2_3.R")
MCFG_NETLIST_STREAM_OUTPUT("snd_nl", 0, "R1.1")
MCFG_NETLIST_ANALOG_MULT_OFFSET(100000.0, 0.0)
MACHINE_CONFIG_END

View File

@ -728,16 +728,16 @@ static NETLIST_START(pong)
//NETLIST_INCLUDE(pong_schematics)
NETLIST_MEMREGION("maincpu")
NETDEV_ANALOG_CALLBACK(sound_cb, sound, pong_state, sound_cb, "")
NETDEV_ANALOG_CALLBACK(video_cb, videomix, fixedfreq_device, update_vid, "fixfreq")
//NETDEV_ANALOG_CALLBACK(sound_cb, sound, pong_state, sound_cb, "")
//NETDEV_ANALOG_CALLBACK(video_cb, videomix, fixedfreq_device, update_vid, "fixfreq")
NETLIST_END()
static NETLIST_START(pong_fast)
NETLIST_INCLUDE(pong_schematics)
NETDEV_ANALOG_CALLBACK(sound_cb, sound, pong_state, sound_cb, "")
NETDEV_ANALOG_CALLBACK(video_cb, videomix, fixedfreq_device, update_vid, "fixfreq")
//NETDEV_ANALOG_CALLBACK(sound_cb, sound, pong_state, sound_cb, "")
//NETDEV_ANALOG_CALLBACK(video_cb, videomix, fixedfreq_device, update_vid, "fixfreq")
NETLIST_END()
@ -747,8 +747,8 @@ static NETLIST_START(pongd)
NETLIST_INCLUDE(pongdoubles)
NETDEV_ANALOG_CALLBACK(sound_cb, AUDIO, pong_state, sound_cb, "")
NETDEV_ANALOG_CALLBACK(video_cb, videomix, fixedfreq_device, update_vid, "fixfreq")
//NETDEV_ANALOG_CALLBACK(sound_cb, AUDIO, pong_state, sound_cb, "")
//NETDEV_ANALOG_CALLBACK(video_cb, videomix, fixedfreq_device, update_vid, "fixfreq")
NETLIST_END()
#endif
@ -766,8 +766,8 @@ static NETLIST_START(test)
SOLVER(Solver)
PARAM(Solver.FREQ, 48000)
NETDEV_SOUND_IN(SND_IN)
PARAM(SND_IN.CHAN0, "tin.IN")
//NETDEV_SOUND_IN(SND_IN)
//PARAM(SND_IN.CHAN0, "tin.IN")
ANALOG_INPUT(tin, 0)
@ -779,12 +779,15 @@ static NETLIST_START(test)
NET_C(n1.Q, R1.2)
NET_C(n2.Q, C1.1)
NET_C(C1.2, R1.1)
LOG(log1, n2.Q)
#if 0
NETDEV_SOUND_OUT(CH0, 0)
NET_C(CH0.IN, n2.Q)
NETDEV_SOUND_OUT(CH1, 1)
NET_C(CH1.IN, tin.Q)
#endif
NETLIST_END()
#endif
@ -876,9 +879,9 @@ static MACHINE_CONFIG_START( pong, pong_state )
MCFG_NETLIST_SETUP(pong)
MCFG_NETLIST_ANALOG_INPUT("maincpu", "vr0", "ic_b9_R.R")
MCFG_NETLIST_ANALOG_INPUT_MULT_OFFSET(1.0 / 100.0 * RES_K(50), RES_K(56) )
MCFG_NETLIST_ANALOG_MULT_OFFSET(1.0 / 100.0 * RES_K(50), RES_K(56) )
MCFG_NETLIST_ANALOG_INPUT("maincpu", "vr1", "ic_a9_R.R")
MCFG_NETLIST_ANALOG_INPUT_MULT_OFFSET(1.0 / 100.0 * RES_K(50), RES_K(56) )
MCFG_NETLIST_ANALOG_MULT_OFFSET(1.0 / 100.0 * RES_K(50), RES_K(56) )
MCFG_NETLIST_ANALOG_INPUT("maincpu", "pot0", "ic_b9_POT.DIAL")
MCFG_NETLIST_ANALOG_INPUT("maincpu", "pot1", "ic_a9_POT.DIAL")
MCFG_NETLIST_LOGIC_INPUT("maincpu", "sw1a", "sw1a.POS", 0, 0x01)
@ -886,6 +889,9 @@ static MACHINE_CONFIG_START( pong, pong_state )
MCFG_NETLIST_LOGIC_INPUT("maincpu", "coinsw", "coinsw.POS", 0, 0x01)
MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0, 0x01)
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "snd0", "sound", pong_state, sound_cb, "")
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_vid, "fixfreq")
/* video hardware */
//MCFG_FIXFREQ_ADD("fixfreq", "screen", fixedfreq_mode_ntsc720)
@ -905,6 +911,16 @@ static MACHINE_CONFIG_START( pong, pong_state )
MCFG_SOUND_ADD("snd_test", NETLIST_SOUND, 48000)
MCFG_NETLIST_SETUP(test)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_NETLIST_STREAM_INPUT("snd_test", 0, "tin.IN")
MCFG_NETLIST_ANALOG_MULT_OFFSET(0.001, 0.0)
//MCFG_NETLIST_STREAM_OUTPUT("snd_test", 0, "tin.Q", 100)
MCFG_NETLIST_STREAM_OUTPUT("snd_test", 0, "n2.Q")
MCFG_NETLIST_ANALOG_MULT_OFFSET(1000.0, 0.0)
MCFG_NETLIST_STREAM_OUTPUT("snd_test", 1, "tin.Q")
MCFG_NETLIST_ANALOG_MULT_OFFSET(1000.0, 0.0)
#endif
MACHINE_CONFIG_END
@ -940,6 +956,9 @@ static MACHINE_CONFIG_START( pongd, pong_state )
MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0, 0x01)
#endif
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "snd0", "AUDIO", pong_state, sound_cb, "")
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_vid, "fixfreq")
/* video hardware */
//MCFG_FIXFREQ_ADD("fixfreq", "screen", fixedfreq_mode_ntsc720)