diff options
author | Couriersud <couriersud@users.noreply.github.com> | 2013-12-19 11:58:05 +0000 |
---|---|---|
committer | Couriersud <couriersud@users.noreply.github.com> | 2013-12-19 11:58:05 +0000 |
commit | 614b76c0fec49515e14ff614a33c7dd79364140f (patch) | |
tree | d64adb2c88fc60884775d2c12f21768fe1b2433e /src | |
parent | 786ca09655d1925eb547f49f2da9b7395a86d492 (diff) |
Pong update:
- based on feedback from IRC hopefully fixed issues like "jumping"
- adjusted VR1 and VR2 to 50%
- disabled all printf output.
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/machine/netlist.c | 22 | ||||
-rw-r--r-- | src/emu/netlist/devices/nld_7474.c | 1 | ||||
-rw-r--r-- | src/emu/netlist/devices/nld_7493.c | 2 | ||||
-rw-r--r-- | src/emu/netlist/devices/nld_solver.c | 10 | ||||
-rw-r--r-- | src/emu/netlist/devices/nld_twoterm.c | 2 | ||||
-rw-r--r-- | src/emu/netlist/devices/nld_twoterm.h | 1 | ||||
-rw-r--r-- | src/emu/netlist/nl_base.c | 27 | ||||
-rw-r--r-- | src/emu/netlist/nl_base.h | 14 | ||||
-rw-r--r-- | src/emu/netlist/nl_parser.c | 30 | ||||
-rw-r--r-- | src/emu/netlist/nl_parser.h | 4 | ||||
-rw-r--r-- | src/emu/netlist/nl_setup.c | 62 | ||||
-rw-r--r-- | src/emu/netlist/nl_setup.h | 9 | ||||
-rw-r--r-- | src/emu/netlist/pstring.c | 31 | ||||
-rw-r--r-- | src/emu/netlist/pstring.h | 25 | ||||
-rw-r--r-- | src/emu/video/fixfreq.c | 7 | ||||
-rw-r--r-- | src/mame/drivers/pong.c | 10 | ||||
-rw-r--r-- | src/tools/nltool.c | 200 | ||||
-rw-r--r-- | src/tools/tools.mak | 12 |
18 files changed, 353 insertions, 116 deletions
diff --git a/src/emu/machine/netlist.c b/src/emu/machine/netlist.c index 7ff8e043be8..5e5b5e67d7f 100644 --- a/src/emu/machine/netlist.c +++ b/src/emu/machine/netlist.c @@ -50,6 +50,8 @@ #include "netlist/nl_setup.h" #include "netlist/devices/net_lib.h" +#define LOG_DEV_CALLS(x) do { } while (0); + // ---------------------------------------------------------------------------------------- // netlist_mame_device // ---------------------------------------------------------------------------------------- @@ -71,14 +73,18 @@ void netlist_mame_device::static_set_constructor(device_t &device, void (*setup_ { netlist_mame_device &netlist = downcast<netlist_mame_device &>(device); netlist.m_setup_func = setup_func; + LOG_DEV_CALLS(("static_set_constructor\n")); } void netlist_mame_device::device_config_complete() { + LOG_DEV_CALLS(("device_config_complete\n")); } void netlist_mame_device::device_start() { + LOG_DEV_CALLS(("device_start\n")); + m_netlist = global_alloc_clear(netlist_mame_t(*this)); m_netlist->set_clock_freq(this->clock()); @@ -91,15 +97,14 @@ void netlist_mame_device::device_start() m_setup_func(*m_setup); m_setup->start_devices(); + m_setup->resolve_inputs(); - bool allok = true; - for (device_start_list_t::entry_t *ods = m_device_start_list.first(); ods != NULL; ods = m_device_start_list.next(ods)) - allok &= ods->object()->OnDeviceStart(); - - if (!allok) - m_netlist->xfatalerror("required elements not found\n"); + bool allok = true; + for (device_start_list_t::entry_t *ods = m_device_start_list.first(); ods != NULL; ods = m_device_start_list.next(ods)) + allok &= ods->object()->OnDeviceStart(); - m_setup->resolve_inputs(); + if (!allok) + m_netlist->xfatalerror("required elements not found\n"); save_state(); /* TODO: we have to save the round robin queue as well */ @@ -110,12 +115,13 @@ void netlist_mame_device::device_start() void netlist_mame_device::device_reset() { + LOG_DEV_CALLS(("device_reset\n")); m_netlist->reset(); - m_setup->step_devices_once(); } void netlist_mame_device::device_stop() { + LOG_DEV_CALLS(("device_stop\n")); m_setup->print_stats(); global_free(m_setup); diff --git a/src/emu/netlist/devices/nld_7474.c b/src/emu/netlist/devices/nld_7474.c index 0307e79b005..cd9e64e41af 100644 --- a/src/emu/netlist/devices/nld_7474.c +++ b/src/emu/netlist/devices/nld_7474.c @@ -8,7 +8,6 @@ ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 state) { static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; - //printf("%s %d %d %d\n", "7474", state, Q.Q(), QQ.Q()); OUTLOGIC(m_Q, state, delay[state]); OUTLOGIC(m_QQ, !state, delay[!state]); } diff --git a/src/emu/netlist/devices/nld_7493.c b/src/emu/netlist/devices/nld_7493.c index 73f47a5f2cc..96d955e2fce 100644 --- a/src/emu/netlist/devices/nld_7493.c +++ b/src/emu/netlist/devices/nld_7493.c @@ -44,7 +44,6 @@ NETLIB_UPDATE(7493) if (r) { - //printf("%s reset\n", name()); A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1; A.m_I.inactivate(); B.m_I.inactivate(); @@ -58,6 +57,5 @@ NETLIB_UPDATE(7493) A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0; A.m_I.activate_hl(); B.m_I.activate_hl(); - //printf("%s enable\n", name()); } } diff --git a/src/emu/netlist/devices/nld_solver.c b/src/emu/netlist/devices/nld_solver.c index 879e09dd691..78f82c8bd1b 100644 --- a/src/emu/netlist/devices/nld_solver.c +++ b/src/emu/netlist/devices/nld_solver.c @@ -10,6 +10,8 @@ // netlist_matrix_solver // ---------------------------------------------------------------------------------------- +#define SOLVER_VERBOSE_OUT(x) do {} while (0) +//#define SOLVER_VERBOSE_OUT(x) printf x ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &aowner) { @@ -264,7 +266,7 @@ NETLIB_FUNC_VOID(solver, post_start, ()) } } - printf("Scanning net groups ...\n"); + SOLVER_VERBOSE_OUT(("Scanning net groups ...\n")); // determine net groups for (netlist_net_t::list_t::entry_t *pn = m_nets.first(); pn != NULL; pn = m_nets.next(pn)) { @@ -276,7 +278,7 @@ NETLIB_FUNC_VOID(solver, post_start, ()) } // setup the solvers - printf("Found %d net groups in %d nets\n", cur_group + 1, m_nets.count()); + SOLVER_VERBOSE_OUT(("Found %d net groups in %d nets\n", cur_group + 1, m_nets.count())); for (int i = 0; i <= cur_group; i++) { netlist_matrix_solver_t *ms = new netlist_matrix_solver_t(); @@ -284,8 +286,8 @@ NETLIB_FUNC_VOID(solver, post_start, ()) ms->m_convergence_factor = m_convergence.Value(); ms->setup(groups[i], *this); m_mat_solvers.add(ms); - printf("%d ==> %d nets %s\n", i, groups[i].count(), groups[i].first()->object()->m_head->name().cstr()); - printf(" has %s elements\n", ms->is_dynamic() ? "dynamic" : "no dynamic"); + SOLVER_VERBOSE_OUT(("%d ==> %d nets %s\n", i, groups[i].count(), groups[i].first()->object()->m_head->name().cstr())); + SOLVER_VERBOSE_OUT((" has %s elements\n", ms->is_dynamic() ? "dynamic" : "no dynamic")); } } diff --git a/src/emu/netlist/devices/nld_twoterm.c b/src/emu/netlist/devices/nld_twoterm.c index e471d34ba7d..39ac2b6e422 100644 --- a/src/emu/netlist/devices/nld_twoterm.c +++ b/src/emu/netlist/devices/nld_twoterm.c @@ -227,7 +227,7 @@ NETLIB_UPDATE_PARAM(QBJT_switch<_type>) if (m_gB < NETLIST_GMIN) m_gB = NETLIST_GMIN; m_gC = BF * m_gB; // very rough estimate - printf("%f %f \n", m_V, m_gB); + //printf("%f %f \n", m_V, m_gB); m_RB.set(NETLIST_GMIN, 0.0, 0.0); m_RC.set(NETLIST_GMIN, 0.0, 0.0); } diff --git a/src/emu/netlist/devices/nld_twoterm.h b/src/emu/netlist/devices/nld_twoterm.h index 8406a19eb18..4e4b7073ed7 100644 --- a/src/emu/netlist/devices/nld_twoterm.h +++ b/src/emu/netlist/devices/nld_twoterm.h @@ -312,7 +312,6 @@ public: double vE = INPANALOG(m_EV); double vB = INPANALOG(m_BV); - //printf("diff %f %f = %f - %f\n", vB - vE, vB, vE, m_RB.m_N.m_g); int new_state = (vB - vE > m_V ) ? 1 : 0; if (m_state_on ^ new_state) { diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index bc5cf019ce5..e2999ce0146 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -69,8 +69,19 @@ netlist_base_t::netlist_base_t() { } +template <class T> +static void tagmap_free_entries(T &tm) +{ + for (typename T::entry_t *entry = tm.first(); entry != NULL; entry = tm.next(entry)) + { + delete entry->object(); + } + tm.reset(); +} + netlist_base_t::~netlist_base_t() { + tagmap_free_entries<tagmap_devices_t>(m_devices); pstring::resetmem(); } @@ -92,8 +103,20 @@ ATTR_COLD void netlist_base_t::reset() if (m_mainclock != NULL) m_mainclock->m_Q.net().set_time(netlist_time::zero); -} + // FIXME: some const devices rely on this + /* make sure params are set now .. */ + for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + { + entry->object()->update_param(); + } + // Step all devices once ! + for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + { + netlist_device_t *dev = entry->object(); + dev->update_dev(); + } +} void netlist_base_t::set_clock_freq(UINT64 clockfreq) { @@ -294,8 +317,6 @@ ATTR_COLD void netlist_device_t::register_subalias(const pstring &name, const ne { pstring alias = this->name() + "." + name; - //printf("alias: %s\n", alias.cstr()); - setup().register_alias(alias, term.name()); if (term.isType(netlist_terminal_t::INPUT)) diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 9dbf218f2cb..66efe4e7345 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -814,7 +814,7 @@ public: ATTR_HOT virtual void inc_active() { } - ATTR_HOT virtual void dec_active() { /*printf("DeActivate %s\n", m_name);*/ } + ATTR_HOT virtual void dec_active() { } ATTR_HOT virtual void step_time(const double st) { } ATTR_HOT virtual void update_terminals() { } @@ -890,6 +890,8 @@ private: // netlist_base_t // ---------------------------------------------------------------------------------------- +typedef tagmap_t<netlist_device_t *, 393> tagmap_devices_t; + class netlist_base_t { NETLIST_PREVENT_COPYING(netlist_base_t) @@ -914,21 +916,19 @@ public: ATTR_HOT inline const netlist_time &time() const { return m_time_ps; } - ATTR_COLD void set_mainclock_dev(NETLIB_NAME(mainclock) *dev); + ATTR_COLD void set_mainclock_dev(NETLIB_NAME(mainclock) *dev); ATTR_COLD void set_solver_dev(NETLIB_NAME(solver) *dev); + ATTR_COLD void set_setup(netlist_setup_t *asetup) { m_setup = asetup; } ATTR_COLD void set_clock_freq(UINT64 clockfreq); ATTR_COLD netlist_setup_t &setup() { return *m_setup; } - ATTR_COLD void set_setup(netlist_setup_t *asetup) - { - m_setup = asetup; - } - ATTR_COLD void reset(); ATTR_COLD void xfatalerror(const char *format, ...) const; + tagmap_devices_t m_devices; + protected: // any derived netlist must override this ... diff --git a/src/emu/netlist/nl_parser.c b/src/emu/netlist/nl_parser.c index 6abe0f1eaf6..42ccbda80b2 100644 --- a/src/emu/netlist/nl_parser.c +++ b/src/emu/netlist/nl_parser.c @@ -7,20 +7,18 @@ #include "nl_parser.h" -#undef NL_VERBOSE_OUT -#define NL_VERBOSE_OUT(x) printf x +//#undef NL_VERBOSE_OUT +//#define NL_VERBOSE_OUT(x) printf x // ---------------------------------------------------------------------------------------- // A netlist parser // ---------------------------------------------------------------------------------------- -void netlist_parser::parse(char *buf) +void netlist_parser::parse(const char *buf) { - char c; m_px = buf; - c = getc(); - while (c) + while (!eof()) { pstring n; skipws(); @@ -45,7 +43,6 @@ void netlist_parser::parse(char *buf) netdev_const(n); else netdev_device(n); - c = getc(); } } @@ -83,7 +80,6 @@ void netlist_parser::netdev_param() val = eval_param(); NL_VERBOSE_OUT(("Parser: Param: %s %f\n", param.cstr(), val)); m_setup.register_param(param, val); - //m_setup.find_param(param).initial(val); check_char(')'); } @@ -103,7 +99,6 @@ void netlist_parser::netdev_const(const pstring &dev_name) paramfq = name + ".CONST"; NL_VERBOSE_OUT(("Parser: Const: %s %f\n", name.cstr(), val)); check_char(')'); - //m_setup.find_param(paramfq).initial(val); m_setup.register_param(paramfq, val); } @@ -273,31 +268,28 @@ double netlist_parser::eval_param() static double facs[6] = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12}; int i; int f=0; - char *e; + bool e; double ret; pstring s = getname2(')',','); - printf("Got %s\n", s.cstr()); for (i=1; i<6;i++) if (strncmp(s.cstr(), macs[i], strlen(macs[i])) == 0) f = i; - ret = strtod(s.substr(strlen(macs[f])).cstr(), &e); - if ((f>0) && (*e != 0)) + ret = s.substr(strlen(macs[f])).as_double(&e); + if ((f>0) && e) m_setup.netlist().xfatalerror("Parser: Error with parameter ...\n"); if (f>0) check_char(')'); - //if (f == 0) - // ungetc(); - //if (f>0) - // e++; - //m_p = e; return ret * facs[f]; } unsigned char netlist_parser::getc() { - return *(m_px++); + if (*m_px) + return *(m_px++); + else + return *m_px; } void netlist_parser::ungetc() diff --git a/src/emu/netlist/nl_parser.h b/src/emu/netlist/nl_parser.h index 63aa210b5dc..4f673f18572 100644 --- a/src/emu/netlist/nl_parser.h +++ b/src/emu/netlist/nl_parser.h @@ -17,7 +17,7 @@ public: netlist_parser(netlist_setup_t &setup) : m_setup(setup) {} - void parse(char *buf); + void parse(const char *buf); void net_alias(); void netdev_param(); void net_c(); @@ -38,7 +38,7 @@ private: void ungetc(); bool eof() { return *m_px == 0; } - char * m_px; + const char * m_px; netlist_setup_t &m_setup; }; diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c index 9e9c2aa5392..d1f513c88c8 100644 --- a/src/emu/netlist/nl_setup.c +++ b/src/emu/netlist/nl_setup.c @@ -37,21 +37,9 @@ netlist_setup_t::netlist_setup_t(netlist_base_t &netlist) NETLIST_NAME(base)(*this); } -template <class T> -static void tagmap_free_entries(T &tm) -{ - for (typename T::entry_t *entry = tm.first(); entry != NULL; entry = tm.next(entry)) - { - delete entry->object(); - } - tm.reset(); -} netlist_setup_t::~netlist_setup_t() { - tagmap_free_entries<tagmap_devices_t>(m_devices); - //tagmap_free_entries<tagmap_link_t>(m_links); - //tagmap_free_entries<tagmap_nstring_t>(m_alias); m_links.reset(); m_alias.reset(); m_params.reset(); @@ -63,9 +51,10 @@ netlist_setup_t::~netlist_setup_t() pstring::resetmem(); } +// FIXME: Move to netlist ... netlist_device_t *netlist_setup_t::register_dev(netlist_device_t *dev, const pstring &name) { - if (!(m_devices.add(name, dev, false)==TMERR_NONE)) + if (!(netlist().m_devices.add(name, dev, false)==TMERR_NONE)) netlist().xfatalerror("Error adding %s to device list\n", name.cstr()); return dev; } @@ -89,7 +78,7 @@ static void remove_start_with(T &hm, pstring &sw) void netlist_setup_t::remove_dev(const pstring &name) { - netlist_device_t *dev = m_devices.find(name); + netlist_device_t *dev = netlist().m_devices.find(name); pstring temp = name + "."; if (dev == NULL) netlist().xfatalerror("Device %s does not exist\n", name.cstr()); @@ -106,7 +95,7 @@ void netlist_setup_t::remove_dev(const pstring &name) m_links.remove(p->object()); p = n; } - m_devices.remove(name); + netlist().m_devices.remove(name); } void netlist_setup_t::register_model(const pstring &model) @@ -182,7 +171,7 @@ void netlist_setup_t::register_object(netlist_device_t &dev, netlist_core_device { case netlist_param_t::DOUBLE: { - //printf("Found parameter ... %s : %s\n", temp.cstr(), val->cstr()); + NL_VERBOSE_OUT(("Found parameter ... %s : %s\n", temp.cstr(), val->cstr())); double vald = 0; if (sscanf(val.cstr(), "%lf", &vald) != 1) netlist().xfatalerror("Invalid number conversion %s : %s\n", temp.cstr(), val.cstr()); @@ -192,7 +181,7 @@ void netlist_setup_t::register_object(netlist_device_t &dev, netlist_core_device case netlist_param_t::INTEGER: case netlist_param_t::LOGIC: { - //printf("Found parameter ... %s : %s\n", temp.cstr(), val->cstr()); + NL_VERBOSE_OUT(("Found parameter ... %s : %s\n", temp.cstr(), val->cstr())); int vald = 0; if (sscanf(val.cstr(), "%d", &vald) != 1) netlist().xfatalerror("Invalid number conversion %s : %s\n", temp.cstr(), val.cstr()); @@ -273,7 +262,7 @@ const pstring netlist_setup_t::resolve_alias(const pstring &name) const if (p > 0) { pstring dname = ret; - netlist_device_t *dev = m_devices.find(dname.substr(0,p)); + netlist_device_t *dev = netlist().m_devices.find(dname.substr(0,p)); if (dev == NULL) netlist().xfatalerror("Device for %s not found\n", name.cstr()); int c = atoi(ret.substr(p+2,ret.len()-p-3)); @@ -285,7 +274,7 @@ const pstring netlist_setup_t::resolve_alias(const pstring &name) const } while (temp != ""); } - //printf("%s==>%s\n", name.cstr(), ret.cstr()); + NL_VERBOSE_OUT(("%s==>%s\n", name.cstr(), ret.cstr())); return ret; } @@ -367,7 +356,6 @@ void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t } else if (out.isFamily(netlist_terminal_t::LOGIC) && in.isFamily(netlist_terminal_t::ANALOG)) { - //printf("here 1\n"); nld_d_to_a_proxy *proxy = new nld_d_to_a_proxy(out); pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt); m_proxy_cnt++; @@ -490,13 +478,13 @@ void netlist_setup_t::connect(netlist_core_terminal_t &t1, netlist_core_terminal if (t1.isType(netlist_core_terminal_t::OUTPUT) && t2.isType(netlist_core_terminal_t::INPUT)) { if (t2.has_net()) - mame_printf_warning("Input %s already connected\n", t2.name().cstr()); + NL_VERBOSE_OUT(("Input %s already connected\n", t2.name().cstr())); connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1)); } else if (t1.isType(netlist_core_terminal_t::INPUT) && t2.isType(netlist_core_terminal_t::OUTPUT)) { if (t1.has_net()) - mame_printf_warning("Input %s already connected\n", t1.name().cstr()); + NL_VERBOSE_OUT(("Input %s already connected\n", t1.name().cstr())); connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2)); } else if (t1.isType(netlist_core_terminal_t::OUTPUT) && t2.isType(netlist_core_terminal_t::TERMINAL)) @@ -523,7 +511,7 @@ void netlist_setup_t::connect(netlist_core_terminal_t &t1, netlist_core_terminal netlist().xfatalerror("Connecting %s to %s not supported!\n", t1.name().cstr(), t2.name().cstr()); } -void netlist_setup_t::resolve_inputs(void) +void netlist_setup_t::resolve_inputs() { NL_VERBOSE_OUT(("Resolving ...\n")); @@ -551,7 +539,7 @@ void netlist_setup_t::resolve_inputs(void) } -void netlist_setup_t::start_devices(void) +void netlist_setup_t::start_devices() { if (getenv("NL_LOGS")) @@ -560,9 +548,9 @@ void netlist_setup_t::start_devices(void) nl_util::pstring_list ll = nl_util::split(getenv("NL_LOGS"), ":"); for (int i=0; i < ll.count(); i++) { - printf("%d: <%s>\n",i, ll[i].cstr()); + NL_VERBOSE_OUT(("%d: <%s>\n",i, ll[i].cstr())); netlist_device_t *nc = factory().new_device_by_classname("nld_log", *this); - pstring name = "log" + ll[i]; + pstring name = "log_" + ll[i]; register_dev(nc, name); register_link(name + ".I", ll[i]); } @@ -571,7 +559,7 @@ void netlist_setup_t::start_devices(void) NL_VERBOSE_OUT(("Searching for mainclock and solver ...\n")); /* find the main clock ... */ - for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + for (tagmap_devices_t::entry_t *entry = netlist().m_devices.first(); entry != NULL; entry = netlist().m_devices.next(entry)) { netlist_device_t *dev = entry->object(); if (dynamic_cast<NETLIB_NAME(mainclock)*>(dev) != NULL) @@ -585,30 +573,14 @@ void netlist_setup_t::start_devices(void) } NL_VERBOSE_OUT(("Initializing devices ...\n")); - for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + for (tagmap_devices_t::entry_t *entry = netlist().m_devices.first(); entry != NULL; entry = netlist().m_devices.next(entry)) { netlist_device_t *dev = entry->object(); dev->init(netlist(), entry->tag().cstr()); } } -void netlist_setup_t::step_devices_once(void) -{ - /* make sure params are set now .. */ - for (tagmap_param_t::entry_t *entry = m_params.first(); entry != NULL; entry = m_params.next(entry)) - { - entry->object()->netdev().update_param(); - } - - for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) - { - netlist_device_t *dev = entry->object(); - dev->update_dev(); - } -} - - -void netlist_setup_t::parse(char *buf) +void netlist_setup_t::parse(const char *buf) { netlist_parser parser(*this); parser.parse(buf); diff --git a/src/emu/netlist/nl_setup.h b/src/emu/netlist/nl_setup.h index ae53542cad5..8d9c0eefa4d 100644 --- a/src/emu/netlist/nl_setup.h +++ b/src/emu/netlist/nl_setup.h @@ -94,7 +94,6 @@ public: link_t &operator=(const link_t &rhs) { e1 = rhs.e1; e2 = rhs.e2; return *this; } }; - typedef tagmap_t<netlist_device_t *, 393> tagmap_devices_t; typedef tagmap_t<pstring, 393> tagmap_nstring_t; typedef tagmap_t<netlist_param_t *, 393> tagmap_param_t; typedef tagmap_t<netlist_core_terminal_t *, 393> tagmap_terminal_t; @@ -124,11 +123,10 @@ public: netlist_param_t *find_param(const pstring ¶m_in, bool required = true); - void parse(char *buf); + void parse(const char *buf); - void start_devices(void); - void resolve_inputs(void); - void step_devices_once(void); + void start_devices(); + void resolve_inputs(); /* not ideal, but needed for save_state */ tagmap_terminal_t m_terminals; @@ -141,7 +139,6 @@ private: netlist_base_t &m_netlist; - tagmap_devices_t m_devices; tagmap_nstring_t m_alias; tagmap_param_t m_params; tagmap_link_t m_links; diff --git a/src/emu/netlist/pstring.c b/src/emu/netlist/pstring.c index aa0ea9c4c98..7d5a55ff166 100644 --- a/src/emu/netlist/pstring.c +++ b/src/emu/netlist/pstring.c @@ -108,6 +108,37 @@ int pstring::pcmpi(const char *lhs, const char *rhs, int count) const return 1; } +double pstring::as_double(bool *error) const +{ + double ret; + char *e = NULL; + + if (error != NULL) + *error = false; + ret = strtod(cstr(), &e); + if (*e != 0) + if (error != NULL) + *error = true; + return ret; +} + +long pstring::as_long(bool *error) const +{ + double ret; + char *e = NULL; + + if (error != NULL) + *error = false; + if (startsWith("0x")) + ret = strtol(&(cstr()[2]), &e, 16); + else + ret = strtol(cstr(), &e, 10); + if (*e != 0) + if (error != NULL) + *error = true; + return ret; +} + pstring pstring::vprintf(va_list args) const { // sprintf into the temporary buffer diff --git a/src/emu/netlist/pstring.h b/src/emu/netlist/pstring.h index 1934f246ce5..892ade87ef5 100644 --- a/src/emu/netlist/pstring.h +++ b/src/emu/netlist/pstring.h @@ -122,10 +122,10 @@ public: inline bool equals(const pstring &string) { return (pcmp(string.cstr(), m_ptr->str()) == 0); } inline bool iequals(const pstring &string) { return (pcmpi(string.cstr(), m_ptr->str()) == 0); } - int cmp(const pstring &string) const { return pcmp(string.cstr()); } - int cmpi(const pstring &string) const { return pcmpi(cstr(), string.cstr()); } + inline int cmp(const pstring &string) const { return pcmp(string.cstr()); } + inline int cmpi(const pstring &string) const { return pcmpi(cstr(), string.cstr()); } - int find(const char *search, int start = 0) const + inline int find(const char *search, int start = 0) const { int alen = len(); const char *result = strstr(cstr() + MIN(start, alen), search); @@ -134,19 +134,26 @@ public: // various - bool startsWith(const pstring &arg) const { return (pcmp(cstr(), arg.cstr(), arg.len()) == 0); } - bool startsWith(const char *arg) const { return (pcmp(cstr(), arg, strlen(arg)) == 0); } + inline bool startsWith(const pstring &arg) const { return (pcmp(cstr(), arg.cstr(), arg.len()) == 0); } + inline bool startsWith(const char *arg) const { return (pcmp(cstr(), arg, strlen(arg)) == 0); } // these return nstring ... - pstring cat(const pstring &s) const { return *this + s; } - pstring cat(const char *s) const { return *this + s; } + inline pstring cat(const pstring &s) const { return *this + s; } + inline pstring cat(const char *s) const { return *this + s; } pstring substr(unsigned int start, int count = -1) const ; - pstring left(unsigned int count) const { return substr(0, count); } - pstring right(unsigned int count) const { return substr(len() - count, count); } + inline pstring left(unsigned int count) const { return substr(0, count); } + inline pstring right(unsigned int count) const { return substr(len() - count, count); } + pstring ucase() const; + // conversions + + double as_double(bool *error = NULL) const; + + long as_long(bool *error = NULL) const; + // printf using string as format ... pstring vprintf(va_list args) const; diff --git a/src/emu/video/fixfreq.c b/src/emu/video/fixfreq.c index a272ad9cf14..3a9e60c9537 100644 --- a/src/emu/video/fixfreq.c +++ b/src/emu/video/fixfreq.c @@ -222,6 +222,7 @@ UINT32 fixedfreq_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm void fixedfreq_device::update_vid(double newval, attotime cur_time) { bitmap_rgb32 *bm = m_bitmap[m_cur_bm]; + const int has_fields = (m_fieldcount > 1) ? 1: 0; int pixels = round((cur_time - m_line_time).as_double() / m_clock_period.as_double()); attotime time = (cur_time - m_last_time); @@ -245,11 +246,11 @@ void fixedfreq_device::update_vid(double newval, attotime cur_time) while (0 && pixels >= m_htotal) { - bm->plot_box(m_last_x, m_last_y + m_sig_field, m_htotal - 1 - m_last_x, 1, col); + bm->plot_box(m_last_x, m_last_y + m_sig_field * has_fields, m_htotal - 1 - m_last_x, 1, col); pixels -= m_htotal; m_last_x = 0; } - bm->plot_box(m_last_x, m_last_y + m_sig_field, pixels - m_last_x, 1, col); + bm->plot_box(m_last_x, m_last_y + m_sig_field * has_fields, pixels - m_last_x, 1, col); m_last_x = pixels; } if (sync & 1) @@ -267,7 +268,7 @@ void fixedfreq_device::update_vid(double newval, attotime cur_time) if (sync & 1) { - m_last_y = 0; + m_last_y = m_vbackporch - m_vsync; // 6; // FIXME: needed for pong - need to be able to adjust screen parameters // toggle bitmap m_cur_bm ^= 1; update_screen_parameters(cur_time - m_last_vsync_time); diff --git a/src/mame/drivers/pong.c b/src/mame/drivers/pong.c index 1ff4066a4b8..2ac1cf0c82d 100644 --- a/src/mame/drivers/pong.c +++ b/src/mame/drivers/pong.c @@ -58,8 +58,8 @@ TODO: fixedfreq_interface fixedfreq_mode_pong = { MASTER_CLOCK, H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL, - V_TOTAL-22,V_TOTAL-19,V_TOTAL-16,V_TOTAL, - 1, /* interlaced */ + V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL, + 1, /* non-interlaced */ 0.32 }; @@ -67,7 +67,7 @@ fixedfreq_interface fixedfreq_mode_pongX2 = { MASTER_CLOCK * 2, (H_TOTAL-67) * 2, (H_TOTAL-40) * 2, (H_TOTAL-8) * 2, (H_TOTAL) * 2, V_TOTAL-22,V_TOTAL-19,V_TOTAL-16,V_TOTAL, - 1, /* interlaced */ + 1, /* non-interlaced */ 0.32 }; @@ -933,9 +933,9 @@ static INPUT_PORTS_START( pong ) PORT_DIPSETTING( 0x06, "15" ) PORT_START("VR1") - PORT_ADJUSTER( 63, "VR1 - 50k, Paddle 1 adjustment" ) PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_VR1) + PORT_ADJUSTER( 50, "VR1 - 50k, Paddle 1 adjustment" ) PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_VR1) PORT_START("VR2") - PORT_ADJUSTER( 63, "VR2 - 50k, Paddle 2 adjustment" ) PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_VR2) + PORT_ADJUSTER( 50, "VR2 - 50k, Paddle 2 adjustment" ) PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_VR2) //PORT_START("GATESPEED") //PORT_ADJUSTER( 100, "Logic Gate Delay" ) PORT_MINMAX(10, 200) PORT_CHANGED_MEMBER(DEVICE_SELF, pong_state, input_changed, IC_GATEDELAY) diff --git a/src/tools/nltool.c b/src/tools/nltool.c new file mode 100644 index 00000000000..36f4ed57fae --- /dev/null +++ b/src/tools/nltool.c @@ -0,0 +1,200 @@ +/*************************************************************************** + + nltool.c + + Simple tool to debug netlists outside MAME. + +****************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "astring.h" +#include "corefile.h" +#include "corestr.h" +#include "sha1.h" +#include "netlist/nl_base.h" +#include "netlist/nl_setup.h" +#include "options.h" + +/*************************************************************************** + MAME COMPATIBILITY ... +***************************************************************************/ + +#if 0 +void mame_printf_warning(const char *format, ...) +{ + va_list argptr; + + /* do the output */ + va_start(argptr, format); + vprintf(format, argptr); + va_end(argptr); +} +#endif + +void *malloc_file_line(size_t size, const char *file, int line) +{ + // allocate the memory and fail if we can't + void *ret = osd_malloc(size); + memset(ret, 0, size); + return ret; +} + +void *malloc_array_file_line(size_t size, const char *file, int line) +{ + // allocate the memory and fail if we can't + void *ret = osd_malloc_array(size); + memset(ret, 0, size); + return ret; +} + +void free_file_line( void *memory, const char *file, int line ) +{ + osd_free( memory ); +} + + +struct options_entry oplist[] = +{ + { "time_to_run;ttr", "1.0", OPTION_FLOAT, "time to run the emulation (seconds)" }, + { "f", "-", OPTION_STRING, "file to process (default is stdin)" }, + { "help;h", "0", OPTION_BOOLEAN, "display help" }, + { NULL } +}; + +/*************************************************************************** + CORE IMPLEMENTATION +***************************************************************************/ + +const char *filetobuf(pstring fname) +{ + static pstring pbuf = ""; + + if (fname == "-") + { + char lbuf[1024]; + while (!feof(stdin)) + { + fgets(lbuf, 1024, stdin); + pbuf += lbuf; + } + printf("%d\n",*(pbuf.right(1).cstr()+1)); + return pbuf.cstr(); + } + else + { + FILE *f; + f = fopen(fname, "rb"); + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + char *buf = (char *) malloc(fsize); + fread(buf, fsize, 1, f); + buf[fsize] = 0; + fclose(f); + return buf; + } +} + +class netlist_tool_t : public netlist_base_t +{ +public: + + netlist_tool_t() + : netlist_base_t(), m_setup(NULL) + { + + } + + virtual ~netlist_tool_t() { }; + + void read_netlist(const char *buffer) + { + m_setup = new netlist_setup_t(*this); + this->set_clock_freq(NETLIST_CLOCK); + + // register additional devices + //m_setup->factory().register_device<nld_analog_callback>( "NETDEV_CALLBACK", "nld_analog_callback"); + + // read the netlist ... + //m_setup_func(*m_setup); + + m_setup->parse(buffer); + + // start devices + m_setup->start_devices(); + m_setup->resolve_inputs(); + // reset + this->reset(); + } + +protected: + + void vfatalerror(const char *format, va_list ap) const + { + vprintf(format, ap); + throw; + } + +private: + netlist_setup_t *m_setup; +}; + +void usage(core_options &opts) +{ + astring buffer; + fprintf(stderr, + "Usage:\n" + " nltool -help\n" + " nltool [options]\n" + "\n" + "Where:\n" + ); + fprintf(stderr, "%s\n", opts.output_help(buffer)); +} + +/*------------------------------------------------- + main - primary entry point +-------------------------------------------------*/ + +int main(int argc, char *argv[]) +{ + //int result; + netlist_tool_t nt; + core_options opts(oplist); + astring aerror(""); + osd_ticks_t t = osd_ticks(); + + fprintf(stderr, "%s", "WARNING: This is Work In Progress! - It may fail anytime\n"); + if (!opts.parse_command_line(argc, argv, OPTION_PRIORITY_DEFAULT, aerror)) + { + fprintf(stderr, "%s\n", aerror.cstr()); + usage(opts); + return 1; + } + if (opts.bool_value("h")) + { + usage(opts); + return 1; + } + + nt.read_netlist(filetobuf(opts.value("f"))); + double ttr = opts.float_value("ttr"); + + INT64 tt = ttr * NETLIST_CLOCK; + + printf("startup time ==> %5.3f\n", (double) (osd_ticks() - t) / (double) osd_ticks_per_second() ); + printf("runnning ...\n"); + t = osd_ticks(); + while (tt>0) + { + INT32 tr = MIN(tt, NETLIST_CLOCK / 10); + tt -= tr; + nt.process_queue(tr); + } + double emutime = (double) (osd_ticks() - t) / (double) osd_ticks_per_second(); + printf("%f seconds emulation took %f real time ==> %5.2f%%\n", ttr, emutime, ttr/emutime*100.0); +} diff --git a/src/tools/tools.mak b/src/tools/tools.mak index 90f84dedc9c..c101ba0566b 100644 --- a/src/tools/tools.mak +++ b/src/tools/tools.mak @@ -62,6 +62,7 @@ TOOLS += \ src2html$(EXE) \ split$(EXE) \ pngcmp$(EXE) \ + nltool$(EXE) \ @@ -207,3 +208,14 @@ pngcmp$(EXE): $(PNGCMPOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) @echo Linking $@... $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ +#------------------------------------------------- +# nltool +#------------------------------------------------- + +NLTOOLOBJS = \ + $(TOOLSOBJ)/nltool.o \ + $(NETLISTOBJS) \ + +nltool$(EXE): $(NLTOOLOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) $(EXPAT) + @echo Linking $@... + $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ |