Previous 199869 Revisions Next

r34463 Sunday 18th January, 2015 at 10:48:39 UTC by Couriersud
Introduced an nl_double type. This will be followed by an nl_float type
for certain components (mostly matrix and vector). (nw)
[src/emu]emu.mak image.c image.h
[src/emu/cpu/tms0980]tms0980.c tms0980.h
[src/emu/machine]netlist.c
[src/emu/netlist]nl_base.c nl_base.h nl_config.h nl_dice_compat.h nl_parser.c nl_parser.h pstate.c pstate.h pstring.c pstring.h
[src/emu/netlist/analog]nld_bjt.c nld_bjt.h nld_fourterm.c nld_fourterm.h nld_ms_direct.h nld_ms_direct1.h nld_ms_direct2.h nld_ms_gauss_seidel.h nld_solver.c nld_solver.h nld_twoterm.c nld_twoterm.h
[src/emu/netlist/devices]nld_4066.c nld_74123.c nld_74ls629.c nld_cmos.h nld_ne555.c nld_ne555.h nld_r2r_dac.c nld_system.c
[src/emu/sound]rf5c400.c rf5c400.h
[src/emu/ui]filemngr.c filemngr.h imgcntrl.c imgcntrl.h imginfo.c* imginfo.h* info.c info.h mainmenu.c miscmenu.c miscmenu.h selgame.c ui.c
[src/mame]mame.lst
[src/mame/drivers]20pacgal.c itech32.c naomi.c snowbros.c twinkle.c
[src/mame/includes]mario.h snowbros.h
[src/mame/machine]315-5881_crypt.c naomicrypt.c

trunk/src/emu/cpu/tms0980/tms0980.c
r242974r242975
429429   m_sr = 0;
430430   m_pa = 0;
431431   m_pb = 0;
432   m_ps = 0;
433432   m_a = 0;
434433   m_x = 0;
435434   m_y = 0;
r242974r242975
467466   save_item(NAME(m_sr));
468467   save_item(NAME(m_pa));
469468   save_item(NAME(m_pb));
470   save_item(NAME(m_ps));
471469   save_item(NAME(m_a));
472470   save_item(NAME(m_x));
473471   save_item(NAME(m_y));
r242974r242975
638636   tms1100_cpu_device::device_reset();
639637
640638   // small differences in 00-3f area
641   m_fixed_decode[0x09] = F_COMX;
639   m_fixed_decode[0x09] = F_COMX; // !
642640   m_fixed_decode[0x0b] = F_TPC;
643641}
644642
r242974r242975
960958//-------------------------------------------------
961959
962960// handle branches:
963
964// TMS1000/common
965961// note: add(latch) and bl(branch latch) are specific to 0980 series,
966962// c(chapter) bits are specific to 1100(and 1400) series
967963
964// TMS1000/common:
965
968966void tms1xxx_cpu_device::op_br()
969967{
970968   // BR/BL: conditional branch
971   if (m_status)
972   {
973      if (m_clatch == 0)
974         m_pa = m_pb;
975      m_ca = m_cb;
976      m_pc = m_opcode & m_pc_mask;
977   }
969   if (!m_status)
970      return;
971
972   if (!m_clatch)
973      m_pa = m_pb;
974   m_ca = m_cb;
975   m_pc = m_opcode & m_pc_mask;
978976}
979977
980978void tms1xxx_cpu_device::op_call()
981979{
982980   // CALL/CALLL: conditional call
983   if (m_status)
984   {
985      UINT8 prev_pa = m_pa;
981   if (!m_status)
982      return;
986983
987      if (m_clatch == 0)
988      {
989         m_clatch = 1;
990         m_sr = m_pc;
991         m_pa = m_pb;
992         m_cs = m_ca;
993      }
994      m_ca = m_cb;
995      m_pb = prev_pa;
996      m_pc = m_opcode & m_pc_mask;
984   UINT8 prev_pa = m_pa;
985   if (!m_clatch)
986   {
987      m_sr = m_pc;
988      m_clatch = 1;
989      m_pa = m_pb;
990      m_cs = m_ca;
997991   }
992   m_ca = m_cb;
993   m_pb = prev_pa;
994   m_pc = m_opcode & m_pc_mask;
998995}
999996
1000997void tms1xxx_cpu_device::op_retn()
1001998{
1002999   // RETN: return from subroutine
1003   if (m_clatch == 1)
1000   if (m_clatch)
10041001   {
1005      m_clatch = 0;
10061002      m_pc = m_sr;
1003      m_clatch = 0;
10071004      m_ca = m_cs;
10081005   }
10091006   m_add = 0;
r242974r242975
10171014void tms1400_cpu_device::op_br()
10181015{
10191016   // BR/BL: conditional branch
1020   if (m_status)
1021   {
1022      m_pa = m_pb; // don't care about clatch
1023      m_ca = m_cb;
1024      m_pc = m_opcode & m_pc_mask;
1025   }
1017   if (!m_status)
1018      return;
1019   
1020   //..
10261021}
10271022
10281023void tms1400_cpu_device::op_call()
10291024{
10301025   // CALL/CALLL: conditional call
1031   if (m_status)
1032   {
1033      // 3-level stack, mask clatch 3 bits (no need to mask others)
1034      m_clatch = (m_clatch << 1 | 1) & 7;
1026   if (!m_status)
1027      return;
10351028
1036      m_sr = m_sr << m_pc_bits | m_pc;
1037      m_pc = m_opcode & m_pc_mask;
1038
1039      m_ps = m_ps << 4 | m_pa;
1040      m_pa = m_pb;
1041     
1042      m_cs = m_cs << 2 | m_ca;
1043      m_ca = m_cb;
1044   }
1045   else
1046   {
1047      m_pb = m_pa;
1048      m_cb = m_ca;
1049   }
1029   //..
10501030}
10511031
10521032void tms1400_cpu_device::op_retn()
10531033{
10541034   // RETN: return from subroutine
1055   if (m_clatch & 1)
1056   {
1057      m_clatch >>= 1;
1058
1059      m_pc = m_sr & m_pc_mask;
1060      m_sr >>= m_pc_bits;
1061     
1062      m_pa = m_pb = m_ps & 0xf;
1063      m_ps >>= 4;
1064     
1065      m_ca = m_cb = m_cs & 3;
1066      m_cs >>= 2;
1067   }
1035   //..
10681036}
10691037
10701038
10711039// handle other:
10721040
1073// TMS1000/common
1041// TMS1000/common:
10741042
10751043void tms1xxx_cpu_device::op_sbit()
10761044{
r242974r242975
11901158
11911159
11921160// TMS0980-specific (and possibly child classes)
1193
11941161void tms0980_cpu_device::op_comx()
11951162{
11961163   // COMX: complement X register, but not the MSB
r242974r242975
12361203
12371204
12381205// TMS0270-specific
1239
12401206void tms0270_cpu_device::op_setr()
12411207{
12421208   // same as default, but handle write to output in dynamic_output
trunk/src/emu/cpu/tms0980/tms0980.h
r242974r242975
139139   optional_device<pla_device> m_spla;
140140
141141   UINT8   m_pc;        // 6 or 7-bit program counter
142   UINT32  m_sr;        // 6 or 7-bit subroutine return register(s)
142   UINT8  m_sr;        // 6 or 7-bit subroutine return register
143143   UINT8   m_pa;        // 4-bit page address register
144144   UINT8   m_pb;        // 4-bit page buffer register
145   UINT16  m_ps;        // 4-bit page subroutine register(s)
146145   UINT8   m_a;         // 4-bit accumulator
147146   UINT8   m_x;         // 2,3,or 4-bit RAM X register
148147   UINT8   m_y;         // 4-bit RAM Y register
149   UINT8   m_ca;        // chapter address register
150   UINT8   m_cb;        // chapter buffer register
151   UINT16  m_cs;        // chapter subroutine register(s)
148   UINT8   m_ca;        // chapter address bit
149   UINT8   m_cb;        // chapter buffer bit
150   UINT8   m_cs;        // chapter subroutine bit
152151   UINT16  m_r;
153152   UINT16  m_o;
154153   UINT8   m_cki_bus;
r242974r242975
161160   UINT8   m_status;
162161   UINT8   m_status_latch;
163162   UINT8   m_eac;       // end around carry bit
164   UINT8   m_clatch;    // call latch bit(s)
163   UINT8   m_clatch;    // call latch bit
165164   UINT8   m_add;       // add latch bit
166165   UINT8   m_bl;        // branch latch bit
167166
trunk/src/emu/emu.mak
r242974r242975
124124   $(EMUOBJ)/ui/filemngr.o \
125125   $(EMUOBJ)/ui/filesel.o \
126126   $(EMUOBJ)/ui/imgcntrl.o \
127   $(EMUOBJ)/ui/info.o \
127   $(EMUOBJ)/ui/imginfo.o \
128128   $(EMUOBJ)/ui/inputmap.o \
129129   $(EMUOBJ)/ui/selgame.o \
130130   $(EMUOBJ)/ui/slotopt.o \
trunk/src/emu/image.c
r242974r242975
237237         }
238238      }
239239   }
240}
241240
242/*-------------------------------------------------
243 image_mandatory_scan - search for devices which
244 need an image to be loaded
245 -------------------------------------------------*/
246
247astring &image_mandatory_scan(running_machine &machine, astring &mandatory)
248{
249   mandatory.reset();
250   // make sure that any required image has a mounted file
251   image_interface_iterator iter(machine.root_device());
252241   for (device_image_interface *image = iter.first(); image != NULL; image = iter.next())
253242   {
254      if (image->filename() == NULL && image->must_be_loaded())
255         mandatory.cat("\"").cat(image->instance_name()).cat("\", ");
243      /* is an image specified for this image */
244      image_name = image->filename();
245
246      if (!((image_name != NULL) && (image_name[0] != '\0')))
247      {
248         /* no image... must this device be loaded? */
249         if (image->must_be_loaded())
250         {
251            fatalerror_exitcode(machine, MAMERR_DEVICE, "Driver requires that device \"%s\" must have an image to load", image->instance_name());
252         }
253      }
256254   }
257   return mandatory;
258255}
259256
260257/*-------------------------------------------------
trunk/src/emu/image.h
r242974r242975
2020
2121void image_init(running_machine &machine);
2222void image_postdevice_init(running_machine &machine);
23astring &image_mandatory_scan(running_machine &machine, astring &mandatory);
2423
2524extern struct io_procs image_ioprocs;
2625
trunk/src/emu/machine/netlist.c
r242974r242975
443443               if (td != NULL) save_pointer(td, s->m_name, s->m_count);
444444            }
445445            break;
446            case DT_FLOAT:
447                {
448                    float *td = s->resolved<float>();
449                    if (td != NULL) save_pointer(td, s->m_name, s->m_count);
450                }
451                break;
446452         case DT_INT64:
447453            save_pointer((INT64 *) s->m_ptr, s->m_name, s->m_count);
448454            break;
trunk/src/emu/netlist/analog/nld_bjt.c
r242974r242975
1111{
1212public:
1313   diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {}
14   diode(const double Is, const double n)
14   diode(const nl_double Is, const nl_double n)
1515   {
1616      m_Is = Is;
1717      m_VT = 0.0258 * n;
1818      m_VT_inv = 1.0 / m_VT;
1919   }
20   void set(const double Is, const double n)
20   void set(const nl_double Is, const nl_double n)
2121   {
2222      m_Is = Is;
2323      m_VT = 0.0258 * n;
2424      m_VT_inv = 1.0 / m_VT;
2525   }
26   double I(const double V) const { return m_Is * exp(V * m_VT_inv) - m_Is; }
27   double g(const double V) const { return m_Is * m_VT_inv * exp(V * m_VT_inv); }
28   double V(const double I) const { return log(1.0 + I / m_Is) * m_VT; }
29   double gI(const double I) const { return m_VT_inv * (I + m_Is); }
26   nl_double I(const nl_double V) const { return m_Is * exp(V * m_VT_inv) - m_Is; }
27   nl_double g(const nl_double V) const { return m_Is * m_VT_inv * exp(V * m_VT_inv); }
28   nl_double V(const nl_double I) const { return log(1.0 + I / m_Is) * m_VT; }
29   nl_double gI(const nl_double I) const { return m_VT_inv * (I + m_Is); }
3030
3131private:
32   double m_Is;
33   double m_VT;
34   double m_VT_inv;
32   nl_double m_Is;
33   nl_double m_VT;
34   nl_double m_VT_inv;
3535};
3636
3737
r242974r242975
8585   m_state_on = 0;
8686
8787   {
88      double IS = m_model.model_value("IS", 1e-15);
89      double BF = m_model.model_value("BF", 100);
90      double NF = m_model.model_value("NF", 1);
91      //double VJE = m_model.dValue("VJE", 0.75);
88      nl_double IS = m_model.model_value("IS", 1e-15);
89      nl_double BF = m_model.model_value("BF", 100);
90      nl_double NF = m_model.model_value("NF", 1);
91      //nl_double VJE = m_model.dValue("VJE", 0.75);
9292
9393      set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
9494
95      double alpha = BF / (1.0 + BF);
95      nl_double alpha = BF / (1.0 + BF);
9696
9797      diode d(IS, NF);
9898
r242974r242975
155155   m_gD_BC.save("m_D_BC", *this);
156156
157157   {
158      double IS = m_model.model_value("IS", 1e-15);
159      double BF = m_model.model_value("BF", 100);
160      double NF = m_model.model_value("NF", 1);
161      double BR = m_model.model_value("BR", 1);
162      double NR = m_model.model_value("NR", 1);
163      //double VJE = m_model.dValue("VJE", 0.75);
158      nl_double IS = m_model.model_value("IS", 1e-15);
159      nl_double BF = m_model.model_value("BF", 100);
160      nl_double NF = m_model.model_value("NF", 1);
161      nl_double BR = m_model.model_value("BR", 1);
162      nl_double NR = m_model.model_value("NR", 1);
163      //nl_double VJE = m_model.dValue("VJE", 0.75);
164164
165165      set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
166166      //printf("type %s\n", m_model.model_type().cstr());
trunk/src/emu/netlist/analog/nld_bjt.h
r242974r242975
9898
9999   NETLIB_UPDATE_TERMINALS()
100100   {
101      const double m = (is_qtype( BJT_NPN) ? 1 : -1);
101      const nl_double m = (is_qtype( BJT_NPN) ? 1 : -1);
102102
103103      const int new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0;
104104      if (m_state_on ^ new_state)
105105      {
106106#if 0
107         double gb = m_gB;
108         double gc = m_gC;
109         double v  = m_V * m;
107         nl_double gb = m_gB;
108         nl_double gc = m_gC;
109         nl_double v  = m_V * m;
110110         if (!new_state )
111111         {
112112            // not conducting
r242974r242975
115115            gc = netlist().gmin();
116116         }
117117#else
118         const double gb = new_state ? m_gB : netlist().gmin();
119         const double gc = new_state ? m_gC : netlist().gmin();
120         const double v  = new_state ? m_V * m : 0;
118         const nl_double gb = new_state ? m_gB : netlist().gmin();
119         const nl_double gc = new_state ? m_gC : netlist().gmin();
120         const nl_double v  = new_state ? m_V * m : 0;
121121#endif
122122         m_RB.set(gb, v,   0.0);
123123         m_RC.set(gc, 0.0, 0.0);
r242974r242975
142142   ATTR_COLD virtual void start();
143143   ATTR_HOT void update_param();
144144
145   double m_gB; // base conductance / switch on
146   double m_gC; // collector conductance / switch on
147   double m_V; // internal voltage source
145   nl_double m_gB; // base conductance / switch on
146   nl_double m_gC; // collector conductance / switch on
147   nl_double m_V; // internal voltage source
148148   UINT8 m_state_on;
149149
150150private:
r242974r242975
169169
170170   NETLIB_UPDATE_TERMINALS()
171171   {
172      const double polarity = (qtype() == BJT_NPN ? 1.0 : -1.0);
172      const nl_double polarity = (qtype() == BJT_NPN ? 1.0 : -1.0);
173173
174174      m_gD_BE.update_diode(-m_D_EB.deltaV() * polarity);
175175      m_gD_BC.update_diode(-m_D_CB.deltaV() * polarity);
176176
177      const double gee = m_gD_BE.G();
178      const double gcc = m_gD_BC.G();
179      const double gec =  m_alpha_r * gcc;
180      const double gce =  m_alpha_f * gee;
181      const double sIe = -m_gD_BE.I() + m_alpha_r * m_gD_BC.I();
182      const double sIc = m_alpha_f * m_gD_BE.I() - m_gD_BC.I();
183      const double Ie = (sIe + gee * m_gD_BE.Vd() - gec * m_gD_BC.Vd()) * polarity;
184      const double Ic = (sIc - gce * m_gD_BE.Vd() + gcc * m_gD_BC.Vd()) * polarity;
177      const nl_double gee = m_gD_BE.G();
178      const nl_double gcc = m_gD_BC.G();
179      const nl_double gec =  m_alpha_r * gcc;
180      const nl_double gce =  m_alpha_f * gee;
181      const nl_double sIe = -m_gD_BE.I() + m_alpha_r * m_gD_BC.I();
182      const nl_double sIc = m_alpha_f * m_gD_BE.I() - m_gD_BC.I();
183      const nl_double Ie = (sIe + gee * m_gD_BE.Vd() - gec * m_gD_BC.Vd()) * polarity;
184      const nl_double Ic = (sIc - gce * m_gD_BE.Vd() + gcc * m_gD_BC.Vd()) * polarity;
185185
186186      m_D_EB.set_mat(gee, gec - gee, gce - gee, gee - gec, Ie, -Ie);
187187      m_D_CB.set_mat(gcc, gce - gcc, gec - gcc, gcc - gce, Ic, -Ic);
r242974r242975
202202   nld_twoterm m_D_EB;  // gee, gec - gee, gce - gee, gee - gec | Ie
203203   nld_twoterm m_D_EC;  // 0, -gec, -gcc, 0 | 0
204204
205   double m_alpha_f;
206   double m_alpha_r;
205   nl_double m_alpha_f;
206   nl_double m_alpha_r;
207207
208208private:
209209};
trunk/src/emu/netlist/analog/nld_fourterm.c
r242974r242975
1717   m_gfac = 1.0;
1818}
1919
20void NETLIB_NAME(VCCS)::start_internal(const double def_RI)
20void NETLIB_NAME(VCCS)::start_internal(const nl_double def_RI)
2121{
2222   register_param("G", m_G, 1.0);
2323   register_param("RI", m_RI, def_RI);
r242974r242975
4545
4646NETLIB_RESET(VCCS)
4747{
48   const double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A
49   const double GI = 1.0 / m_RI.Value();
48   const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A
49   const nl_double GI = 1.0 / m_RI.Value();
5050
5151   m_IP.set(GI);
5252   m_IN.set(GI);
trunk/src/emu/netlist/analog/nld_fourterm.h
r242974r242975
5959   ATTR_COLD virtual void update_param();
6060   ATTR_HOT ATTR_ALIGN void update();
6161
62   ATTR_COLD void start_internal(const double def_RI);
62   ATTR_COLD void start_internal(const nl_double def_RI);
6363
6464   netlist_terminal_t m_OP;
6565   netlist_terminal_t m_ON;
r242974r242975
7373   netlist_param_double_t m_G;
7474   netlist_param_double_t m_RI;
7575
76   double m_gfac;
76   nl_double m_gfac;
7777};
7878
7979// ----------------------------------------------------------------------------------------
r242974r242975
115115   ATTR_COLD virtual void update_param();
116116   ATTR_HOT ATTR_ALIGN void update();
117117
118   double m_gfac;
118   nl_double m_gfac;
119119};
120120
121121
trunk/src/emu/netlist/analog/nld_ms_direct.h
r242974r242975
2828protected:
2929   ATTR_COLD virtual void add_term(int net_idx, netlist_terminal_t *term);
3030
31   ATTR_HOT virtual double vsolve();
31   ATTR_HOT virtual nl_double vsolve();
3232
3333   ATTR_HOT int solve_non_dynamic();
3434   ATTR_HOT void build_LE();
35   ATTR_HOT void gauss_LE(double (* RESTRICT x));
36   ATTR_HOT double delta(const double (* RESTRICT V));
37   ATTR_HOT void store(const double (* RESTRICT V), const bool store_RHS);
35   ATTR_HOT void gauss_LE(nl_double (* RESTRICT x));
36   ATTR_HOT nl_double delta(const nl_double (* RESTRICT V));
37   ATTR_HOT void store(const nl_double (* RESTRICT V), const bool store_RHS);
3838
3939   /* bring the whole system to the current time
4040    * Don't schedule a new calculation time. The recalculation has to be
4141    * triggered by the caller after the netlist element was changed.
4242    */
43   ATTR_HOT double compute_next_timestep();
43   ATTR_HOT nl_double compute_next_timestep();
4444
45   double m_A[_storage_N][((_storage_N + 7) / 8) * 8];
46   double m_RHS[_storage_N];
47   double m_last_RHS[_storage_N]; // right hand side - contains currents
48   double m_Vdelta[_storage_N];
49   double m_last_V[_storage_N];
45   nl_double m_A[_storage_N][((_storage_N + 7) / 8) * 8];
46   nl_double m_RHS[_storage_N];
47   nl_double m_last_RHS[_storage_N]; // right hand side - contains currents
48   nl_double m_Vdelta[_storage_N];
49   nl_double m_last_V[_storage_N];
5050
5151   terms_t **m_terms;
5252   terms_t *m_rails_temp;
r242974r242975
5555   vector_ops_t *m_row_ops[_storage_N + 1];
5656
5757   int m_dim;
58   double m_lp_fact;
58   nl_double m_lp_fact;
5959};
6060
6161// ----------------------------------------------------------------------------------------
r242974r242975
8484}
8585
8686template <int m_N, int _storage_N>
87ATTR_HOT double netlist_matrix_solver_direct_t<m_N, _storage_N>::compute_next_timestep()
87ATTR_HOT nl_double netlist_matrix_solver_direct_t<m_N, _storage_N>::compute_next_timestep()
8888{
89   double new_solver_timestep = m_params.m_max_timestep;
89   nl_double new_solver_timestep = m_params.m_max_timestep;
9090
9191   if (m_params.m_dynamic)
9292   {
r242974r242975
103103      {
104104         netlist_analog_net_t *n = m_nets[k];
105105#endif
106         const double DD_n = (n->m_cur_Analog - m_last_V[k]);
107         const double hn = current_timestep();
106         const nl_double DD_n = (n->m_cur_Analog - m_last_V[k]);
107         const nl_double hn = current_timestep();
108108
109         double DD2 = (DD_n / hn - n->m_DD_n_m_1 / n->m_h_n_m_1) / (hn + n->m_h_n_m_1);
110         double new_net_timestep;
109         nl_double DD2 = (DD_n / hn - n->m_DD_n_m_1 / n->m_h_n_m_1) / (hn + n->m_h_n_m_1);
110         nl_double new_net_timestep;
111111
112112         n->m_h_n_m_1 = hn;
113113         n->m_DD_n_m_1 = DD_n;
r242974r242975
236236      for (int i=0; i < N(); i++)
237237         m_A[k][i] = 0.0;
238238
239      double rhsk = 0.0;
240      double akk  = 0.0;
239      nl_double rhsk = 0.0;
240      nl_double akk  = 0.0;
241241      {
242242         const int terms_count = m_terms[k]->count();
243         const double * RESTRICT gt = m_terms[k]->gt();
244         const double * RESTRICT go = m_terms[k]->go();
245         const double * RESTRICT Idr = m_terms[k]->Idr();
243         const nl_double * RESTRICT gt = m_terms[k]->gt();
244         const nl_double * RESTRICT go = m_terms[k]->go();
245         const nl_double * RESTRICT Idr = m_terms[k]->Idr();
246246#if VECTALT
247247
248248         for (int i = 0; i < terms_count; i++)
r242974r242975
253253#else
254254         m_terms[k]->ops()->sum2(Idr, gt, rhsk, akk);
255255#endif
256         double * const * RESTRICT other_cur_analog = m_terms[k]->other_curanalog();
256         nl_double * const * RESTRICT other_cur_analog = m_terms[k]->other_curanalog();
257257         for (int i = m_terms[k]->m_railstart; i < terms_count; i++)
258258         {
259259            //rhsk = rhsk + go[i] * terms[i]->m_otherterm->net().as_analog().Q_Analog();
r242974r242975
272272      m_A[k][k] += 1.0;
273273      {
274274         const int *net_other = m_terms[k]->net_other();
275         const double *go = m_terms[k]->go();
275         const nl_double *go = m_terms[k]->go();
276276         const int railstart =  m_terms[k]->m_railstart;
277277
278278         for (int i = 0; i < railstart; i++)
r242974r242975
285285      m_A[k][k] += akk;
286286      {
287287         const int * RESTRICT net_other = m_terms[k]->net_other();
288         const double * RESTRICT go = m_terms[k]->go();
288         const nl_double * RESTRICT go = m_terms[k]->go();
289289         const int railstart =  m_terms[k]->m_railstart;
290290
291291         for (int i = 0; i < railstart; i++)
r242974r242975
299299
300300template <int m_N, int _storage_N>
301301ATTR_HOT void netlist_matrix_solver_direct_t<m_N, _storage_N>::gauss_LE(
302      double (* RESTRICT x))
302      nl_double (* RESTRICT x))
303303{
304304#if 0
305305   for (int i = 0; i < N(); i++)
r242974r242975
336336      }
337337
338338      /* FIXME: Singular matrix? */
339      const double f = 1.0 / m_A[i][i];
339      const nl_double f = 1.0 / m_A[i][i];
340340
341341      /* Eliminate column i from row j */
342342
343343      for (int j = i + 1; j < kN; j++)
344344      {
345         const double f1 = - m_A[j][i] * f;
345         const nl_double f1 = - m_A[j][i] * f;
346346         if (f1 != 0.0)
347347         {
348348#if 0 && VECTALT
r242974r242975
359359   /* back substitution */
360360   for (int j = kN - 1; j >= 0; j--)
361361   {
362      double tmp = 0;
362      nl_double tmp = 0;
363363
364364      for (int k = j + 1; k < kN; k++)
365365         tmp += m_A[j][k] * x[k];
r242974r242975
380380}
381381
382382template <int m_N, int _storage_N>
383ATTR_HOT double netlist_matrix_solver_direct_t<m_N, _storage_N>::delta(
384      const double (* RESTRICT V))
383ATTR_HOT nl_double netlist_matrix_solver_direct_t<m_N, _storage_N>::delta(
384      const nl_double (* RESTRICT V))
385385{
386   double cerr = 0;
387   double cerr2 = 0;
386   nl_double cerr = 0;
387   nl_double cerr2 = 0;
388388   for (int i = 0; i < this->N(); i++)
389389   {
390      const double e = (V[i] - this->m_nets[i]->m_cur_Analog);
391      const double e2 = (m_RHS[i] - this->m_last_RHS[i]);
390      const nl_double e = (V[i] - this->m_nets[i]->m_cur_Analog);
391      const nl_double e2 = (m_RHS[i] - this->m_last_RHS[i]);
392392      cerr = (fabs(e) > cerr ? fabs(e) : cerr);
393393      cerr2 = (fabs(e2) > cerr2 ? fabs(e2) : cerr2);
394394   }
r242974r242975
398398
399399template <int m_N, int _storage_N>
400400ATTR_HOT void netlist_matrix_solver_direct_t<m_N, _storage_N>::store(
401      const double (* RESTRICT V), const bool store_RHS)
401      const nl_double (* RESTRICT V), const bool store_RHS)
402402{
403403   for (int i = 0; i < this->N(); i++)
404404   {
r242974r242975
414414}
415415
416416template <int m_N, int _storage_N>
417ATTR_HOT double netlist_matrix_solver_direct_t<m_N, _storage_N>::vsolve()
417ATTR_HOT nl_double netlist_matrix_solver_direct_t<m_N, _storage_N>::vsolve()
418418{
419419   solve_base<netlist_matrix_solver_direct_t>(this);
420420   return this->compute_next_timestep();
r242974r242975
424424template <int m_N, int _storage_N>
425425ATTR_HOT int netlist_matrix_solver_direct_t<m_N, _storage_N>::solve_non_dynamic()
426426{
427   double new_v[_storage_N] = { 0.0 };
427   nl_double new_v[_storage_N] = { 0.0 };
428428
429429   this->gauss_LE(new_v);
430430
431431   if (this->is_dynamic())
432432   {
433      double err = delta(new_v);
433      nl_double err = delta(new_v);
434434
435435      store(new_v, true);
436436
trunk/src/emu/netlist/analog/nld_ms_direct1.h
r242974r242975
1818      {}
1919   ATTR_HOT inline int vsolve_non_dynamic();
2020protected:
21   ATTR_HOT virtual double vsolve();
21   ATTR_HOT virtual nl_double vsolve();
2222private:
2323};
2424
r242974r242975
2626// netlist_matrix_solver - Direct1
2727// ----------------------------------------------------------------------------------------
2828
29ATTR_HOT double netlist_matrix_solver_direct1_t::vsolve()
29ATTR_HOT nl_double netlist_matrix_solver_direct1_t::vsolve()
3030{
3131   solve_base<netlist_matrix_solver_direct1_t>(this);
3232   return this->compute_next_timestep();
r242974r242975
3838   this->build_LE();
3939   //NL_VERBOSE_OUT(("%f %f\n", new_val, m_RHS[0] / m_A[0][0]);
4040
41   double new_val =  m_RHS[0] / m_A[0][0];
41   nl_double new_val =  m_RHS[0] / m_A[0][0];
4242
43   double e = (new_val - net->m_cur_Analog);
44   double cerr = fabs(e);
43   nl_double e = (new_val - net->m_cur_Analog);
44   nl_double cerr = fabs(e);
4545
4646   net->m_cur_Analog = new_val;
4747
trunk/src/emu/netlist/analog/nld_ms_direct2.h
r242974r242975
2020      {}
2121   ATTR_HOT inline int vsolve_non_dynamic();
2222protected:
23   ATTR_HOT virtual double vsolve();
23   ATTR_HOT virtual nl_double vsolve();
2424private:
2525};
2626
r242974r242975
2828// netlist_matrix_solver - Direct2
2929// ----------------------------------------------------------------------------------------
3030
31ATTR_HOT double netlist_matrix_solver_direct2_t::vsolve()
31ATTR_HOT nl_double netlist_matrix_solver_direct2_t::vsolve()
3232{
3333   solve_base<netlist_matrix_solver_direct2_t>(this);
3434   return this->compute_next_timestep();
r242974r242975
3838{
3939   build_LE();
4040
41   const double a = m_A[0][0];
42   const double b = m_A[0][1];
43   const double c = m_A[1][0];
44   const double d = m_A[1][1];
41   const nl_double a = m_A[0][0];
42   const nl_double b = m_A[0][1];
43   const nl_double c = m_A[1][0];
44   const nl_double d = m_A[1][1];
4545
46   double new_val[2];
46   nl_double new_val[2];
4747   new_val[1] = (a * m_RHS[1] - c * m_RHS[0]) / (a * d - b * c);
4848   new_val[0] = (m_RHS[0] - b * new_val[1]) / a;
4949
5050   if (is_dynamic())
5151   {
52      double err = this->delta(new_val);
52      nl_double err = this->delta(new_val);
5353      store(new_val, true);
5454      if (err > m_params.m_accuracy )
5555         return 2;
trunk/src/emu/netlist/analog/nld_ms_gauss_seidel.h
r242974r242975
2929
3030   ATTR_HOT inline int vsolve_non_dynamic();
3131protected:
32   ATTR_HOT virtual double vsolve();
32   ATTR_HOT virtual nl_double vsolve();
3333
3434private:
35   double m_lp_fact;
35   nl_double m_lp_fact;
3636   int m_gs_fail;
3737   int m_gs_total;
3838
r242974r242975
6464}
6565
6666template <int m_N, int _storage_N>
67ATTR_HOT double netlist_matrix_solver_gauss_seidel_t<m_N, _storage_N>::vsolve()
67ATTR_HOT nl_double netlist_matrix_solver_gauss_seidel_t<m_N, _storage_N>::vsolve()
6868{
6969   /*
7070    * enable linear prediction on first newton pass
r242974r242975
8686
8787   if (USE_LINEAR_PREDICTION)
8888   {
89      double sq = 0;
90      double sqo = 0;
91      const double rez_cts = 1.0 / this->current_timestep();
89      nl_double sq = 0;
90      nl_double sqo = 0;
91      const nl_double rez_cts = 1.0 / this->current_timestep();
9292      for (int k = 0; k < this->N(); k++)
9393      {
9494         const netlist_analog_net_t *n = this->m_nets[k];
95         const double nv = (n->m_cur_Analog - this->m_last_V[k]) * rez_cts ;
95         const nl_double nv = (n->m_cur_Analog - this->m_last_V[k]) * rez_cts ;
9696         sq += nv * nv;
9797         sqo += this->m_Vdelta[k] * this->m_Vdelta[k];
9898         this->m_Vdelta[k] = nv;
r242974r242975
116116    */
117117
118118#if 0 || USE_MATRIX_GS
119   static double ws = 1.0;
120   ATTR_ALIGN double new_v[_storage_N] = { 0.0 };
119   static nl_double ws = 1.0;
120   ATTR_ALIGN nl_double new_v[_storage_N] = { 0.0 };
121121   const int iN = this->N();
122122
123123   bool resched = false;
r242974r242975
127127   this->build_LE();
128128
129129   {
130      double frob;
130      nl_double frob;
131131      frob = 0;
132      double rmin = 1e99, rmax = -1e99;
132      nl_double rmin = 1e99, rmax = -1e99;
133133      for (int k = 0; k < iN; k++)
134134      {
135135         new_v[k] = this->m_nets[k]->m_cur_Analog;
136         double s=0.0;
136         nl_double s=0.0;
137137         for (int i = 0; i < iN; i++)
138138         {
139139            frob += this->m_A[k][i] * this->m_A[k][i];
r242974r242975
146146            rmax = s;
147147      }
148148#if 0
149      double frobA = sqrt(frob /(iN));
149      nl_double frobA = sqrt(frob /(iN));
150150      if (1 &&frobA < 1.0)
151151         //ws = 2.0 / (1.0 + sqrt(1.0-frobA));
152152         ws = 2.0 / (2.0 - frobA);
r242974r242975
161161      // overhead is bigger than the gain. Consequently the fast GS below
162162      // uses a fixed GS. One can however use this here to determine a
163163      // suitable parameter.
164      double rm = (rmax + rmin) * 0.5;
164      nl_double rm = (rmax + rmin) * 0.5;
165165      if (rm < 1.0)
166166         ws = 2.0 / (1.0 + sqrt(1.0-rm));
167167      else
r242974r242975
172172   }
173173
174174   // Frobenius norm for (D-L)^(-1)U
175   //double frobU;
176   //double frobL;
177   //double norm;
175   //nl_double frobU;
176   //nl_double frobL;
177   //nl_double norm;
178178   do {
179179      resched = false;
180      double cerr = 0.0;
180      nl_double cerr = 0.0;
181181      //frobU = 0;
182182      //frobL = 0;
183183      //norm = 0;
184184
185185      for (int k = 0; k < iN; k++)
186186      {
187         double Idrive = 0;
188         //double norm_t = 0;
187         nl_double Idrive = 0;
188         //nl_double norm_t = 0;
189189         // Reduction loops need -ffast-math
190190         for (int i = 0; i < iN; i++)
191191            Idrive += this->m_A[k][i] * new_v[i];
r242974r242975
198198         }
199199
200200         //if (norm_t > norm) norm = norm_t;
201         const double new_val = (1.0-ws) * new_v[k] + ws * (this->m_RHS[k] - Idrive + this->m_A[k][k] * new_v[k]) / this->m_A[k][k];
201         const nl_double new_val = (1.0-ws) * new_v[k] + ws * (this->m_RHS[k] - Idrive + this->m_A[k][k] * new_v[k]) / this->m_A[k][k];
202202
203         const double e = fabs(new_val - new_v[k]);
203         const nl_double e = fabs(new_val - new_v[k]);
204204         cerr = (e > cerr ? e : cerr);
205205         new_v[k] = new_val;
206206      }
r242974r242975
210210         resched = true;
211211      }
212212      resched_cnt++;
213      //ATTR_UNUSED double frobUL = sqrt((frobU + frobL) / (double) (iN) / (double) (iN));
213      //ATTR_UNUSED nl_double frobUL = sqrt((frobU + frobL) / (double) (iN) / (double) (iN));
214214   } while (resched && (resched_cnt < this->m_params.m_gs_loops));
215215   //printf("Frobenius %f %f %f %f %f\n", sqrt(frobU), sqrt(frobL), frobUL, frobA, norm);
216216   //printf("Omega Estimate1 %f %f\n", 2.0 / (1.0 + sqrt(1-frobUL)), 2.0 / (1.0 + sqrt(1-frobA)) ); //        printf("Frobenius %f\n", sqrt(frob / (double) (iN * iN) ));
r242974r242975
247247    * omega = 2.0 / (1.0 + sqrt(1-rho))
248248    */
249249
250   const double ws = this->m_params.m_sor; //1.045; //2.0 / (1.0 + /*sin*/(3.14159 * 5.5 / (double) (m_nets.count()+1)));
251   //const double ws = 2.0 / (1.0 + sin(3.14159 * 4 / (double) (this->N())));
250   const nl_double ws = this->m_params.m_sor; //1.045; //2.0 / (1.0 + /*sin*/(3.14159 * 5.5 / (double) (m_nets.count()+1)));
251   //const nl_double ws = 2.0 / (1.0 + sin(3.14159 * 4 / (double) (this->N())));
252252
253   ATTR_ALIGN double w[_storage_N];
254   ATTR_ALIGN double one_m_w[_storage_N];
255   ATTR_ALIGN double RHS[_storage_N];
256   ATTR_ALIGN double new_V[_storage_N];
253   ATTR_ALIGN nl_double w[_storage_N];
254   ATTR_ALIGN nl_double one_m_w[_storage_N];
255   ATTR_ALIGN nl_double RHS[_storage_N];
256   ATTR_ALIGN nl_double new_V[_storage_N];
257257
258258   for (int k = 0; k < iN; k++)
259259   {
260      double gtot_t = 0.0;
261      double gabs_t = 0.0;
262      double RHS_t = 0.0;
260      nl_double gtot_t = 0.0;
261      nl_double gabs_t = 0.0;
262      nl_double RHS_t = 0.0;
263263
264264      new_V[k] = this->m_nets[k]->m_cur_Analog;
265265
266266      {
267267         const int term_count = this->m_terms[k]->count();
268         const double * const RESTRICT gt = this->m_terms[k]->gt();
269         const double * const RESTRICT go = this->m_terms[k]->go();
270         const double * const RESTRICT Idr = this->m_terms[k]->Idr();
271         const double * const *other_cur_analog = this->m_terms[k]->other_curanalog();
268         const nl_double * const RESTRICT gt = this->m_terms[k]->gt();
269         const nl_double * const RESTRICT go = this->m_terms[k]->go();
270         const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
271         const nl_double * const *other_cur_analog = this->m_terms[k]->other_curanalog();
272272#if VECTALT
273273         for (int i = 0; i < term_count; i++)
274274         {
r242974r242975
308308
309309   }
310310
311   const double accuracy = this->m_params.m_accuracy;
311   const nl_double accuracy = this->m_params.m_accuracy;
312312
313313   do {
314314      resched = false;
r242974r242975
317317      {
318318         const int * RESTRICT net_other = this->m_terms[k]->net_other();
319319         const int railstart = this->m_terms[k]->m_railstart;
320         const double * RESTRICT go = this->m_terms[k]->go();
320         const nl_double * RESTRICT go = this->m_terms[k]->go();
321321
322         double Idrive = 0.0;
322         nl_double Idrive = 0.0;
323323         for (int i = 0; i < railstart; i++)
324324            Idrive = Idrive + go[i] * new_V[net_other[i]];
325325
326         //double new_val = (net->m_cur_Analog * gabs[k] + iIdr) / (gtot[k]);
327         const double new_val = new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k];
326         //nl_double new_val = (net->m_cur_Analog * gabs[k] + iIdr) / (gtot[k]);
327         const nl_double new_val = new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k];
328328
329329         resched = resched || (std::abs(new_val - new_V[k]) > accuracy);
330330         new_V[k] = new_val;
trunk/src/emu/netlist/analog/nld_solver.c
r242974r242975
233233
234234ATTR_COLD void netlist_matrix_solver_t::update()
235235{
236   const double new_timestep = solve();
236   const nl_double new_timestep = solve();
237237
238238   if (m_params.m_dynamic && is_timestep() && new_timestep > 0)
239239      m_Q_sync.net().reschedule_in_queue(netlist_time::from_double(new_timestep));
r242974r242975
241241
242242ATTR_COLD void netlist_matrix_solver_t::update_forced()
243243{
244   ATTR_UNUSED const double new_timestep = solve();
244   ATTR_UNUSED const nl_double new_timestep = solve();
245245
246246   if (m_params.m_dynamic && is_timestep())
247247      m_Q_sync.net().reschedule_in_queue(netlist_time::from_double(m_params.m_min_timestep));
r242974r242975
249249
250250ATTR_HOT void netlist_matrix_solver_t::step(const netlist_time delta)
251251{
252   const double dd = delta.as_double();
252   const nl_double dd = delta.as_double();
253253   for (int k=0; k < m_step_devices.count(); k++)
254254      m_step_devices[k]->step_time(dd);
255255}
r242974r242975
284284   }
285285}
286286
287ATTR_HOT double netlist_matrix_solver_t::solve()
287ATTR_HOT nl_double netlist_matrix_solver_t::solve()
288288{
289289   netlist_time now = netlist().time();
290290   netlist_time delta = now - m_last_step;
r242974r242975
300300
301301   step(delta);
302302
303   const double next_time_step = vsolve();
303   const nl_double next_time_step = vsolve();
304304
305305   update_inputs();
306306   return next_time_step;
r242974r242975
348348   register_param("GMIN", m_gmin, NETLIST_GMIN_DEFAULT);
349349   register_param("DYNAMIC_TS", m_dynamic, 0);
350350   register_param("LTE", m_lte, 5e-5);                     // diff/timestep
351   register_param("MIN_TIMESTEP", m_min_timestep, 1e-6);   // double timestep resolution
351   register_param("MIN_TIMESTEP", m_min_timestep, 1e-6);   // nl_double timestep resolution
352352
353353   // internal staff
354354
r242974r242975
417417      if (m_mat_solvers[i]->is_timestep())
418418         {
419419            // Ignore return value
420            ATTR_UNUSED const double ts = m_mat_solvers[i]->solve();
420            ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
421421         }
422422   }
423423#endif
trunk/src/emu/netlist/analog/nld_solver.h
r242974r242975
3737
3838struct netlist_solver_parameters_t
3939{
40   double m_accuracy;
41   double m_lte;
42   double m_min_timestep;
43   double m_max_timestep;
44   double m_sor;
40   nl_double m_accuracy;
41   nl_double m_lte;
42   nl_double m_min_timestep;
43   nl_double m_max_timestep;
44   nl_double m_sor;
4545   bool m_dynamic;
4646   int m_gs_loops;
4747   int m_nr_loops;
r242974r242975
5959
6060   virtual ~vector_ops_t() {}
6161
62   virtual const double sum(const double * v) = 0;
63   virtual void sum2(const double * RESTRICT v1, const double * RESTRICT v2, double & RESTRICT  s1, double & RESTRICT s2) = 0;
64   virtual void addmult(double * RESTRICT v1, const double * RESTRICT v2, const double &mult) = 0;
65   virtual void sum2a(const double * RESTRICT v1, const double * RESTRICT v2, const double * RESTRICT v3abs, double & RESTRICT s1, double & RESTRICT s2, double & RESTRICT s3abs) = 0;
62   virtual const nl_double sum(const nl_double * v) = 0;
63   virtual void sum2(const nl_double * RESTRICT v1, const nl_double * RESTRICT v2, nl_double & RESTRICT  s1, nl_double & RESTRICT s2) = 0;
64   virtual void addmult(nl_double * RESTRICT v1, const nl_double * RESTRICT v2, const nl_double &mult) = 0;
65   virtual void sum2a(const nl_double * RESTRICT v1, const nl_double * RESTRICT v2, const nl_double * RESTRICT v3abs, nl_double & RESTRICT s1, nl_double & RESTRICT s2, nl_double & RESTRICT s3abs) = 0;
6666
67   virtual const double sumabs(const double * v) = 0;
67   virtual const nl_double sumabs(const nl_double * v) = 0;
6868
6969   static vector_ops_t *create_ops(const int size);
7070
r242974r242975
9595
9696   ATTR_HOT inline const int N() const { if (m_N == 0) return m_dim; else return m_N; }
9797
98   const double sum(const double * v)
98   const nl_double sum(const nl_double * v)
9999   {
100      const double *  RESTRICT vl = v;
101      double tmp = 0.0;
100      const nl_double *  RESTRICT vl = v;
101      nl_double tmp = 0.0;
102102      for (int i=0; i < N(); i++)
103103         tmp += vl[i];
104104      return tmp;
105105   }
106106
107   void sum2(const double * RESTRICT v1, const double * RESTRICT v2, double & RESTRICT s1, double & RESTRICT s2)
107   void sum2(const nl_double * RESTRICT v1, const nl_double * RESTRICT v2, nl_double & RESTRICT s1, nl_double & RESTRICT s2)
108108   {
109      const double * RESTRICT v1l = v1;
110      const double * RESTRICT v2l = v2;
109      const nl_double * RESTRICT v1l = v1;
110      const nl_double * RESTRICT v2l = v2;
111111      for (int i=0; i < N(); i++)
112112      {
113113         s1 += v1l[i];
r242974r242975
115115      }
116116   }
117117
118   void addmult(double * RESTRICT v1, const double * RESTRICT v2, const double &mult)
118   void addmult(nl_double * RESTRICT v1, const nl_double * RESTRICT v2, const nl_double &mult)
119119   {
120      double * RESTRICT v1l = v1;
121      const double * RESTRICT v2l = v2;
120      nl_double * RESTRICT v1l = v1;
121      const nl_double * RESTRICT v2l = v2;
122122      for (int i=0; i < N(); i++)
123123      {
124124         v1l[i] += v2l[i] * mult;
125125      }
126126   }
127127
128   void sum2a(const double * RESTRICT v1, const double * RESTRICT v2, const double * RESTRICT v3abs, double & RESTRICT s1, double & RESTRICT s2, double & RESTRICT s3abs)
128   void sum2a(const nl_double * RESTRICT v1, const nl_double * RESTRICT v2, const nl_double * RESTRICT v3abs, nl_double & RESTRICT s1, nl_double & RESTRICT s2, nl_double & RESTRICT s3abs)
129129   {
130      const double * RESTRICT v1l = v1;
131      const double * RESTRICT v2l = v2;
132      const double * RESTRICT v3l = v3abs;
130      const nl_double * RESTRICT v1l = v1;
131      const nl_double * RESTRICT v2l = v2;
132      const nl_double * RESTRICT v3l = v3abs;
133133      for (int i=0; i < N(); i++)
134134      {
135135         s1 += v1l[i];
r242974r242975
138138      }
139139   }
140140
141   const double sumabs(const double * v)
141   const nl_double sumabs(const nl_double * v)
142142   {
143      const double * RESTRICT vl = v;
144      double tmp = 0.0;
143      const nl_double * RESTRICT vl = v;
144      nl_double tmp = 0.0;
145145      for (int i=0; i < N(); i++)
146146         tmp += fabs(vl[i]);
147147      return tmp;
r242974r242975
171171
172172   ATTR_HOT inline netlist_terminal_t **terms() { return m_term; }
173173   ATTR_HOT inline int *net_other() { return m_net_other; }
174   ATTR_HOT inline double *gt() { return m_gt; }
175   ATTR_HOT inline double *go() { return m_go; }
176   ATTR_HOT inline double *Idr() { return m_Idr; }
177   ATTR_HOT inline double **other_curanalog() { return m_other_curanalog; }
174   ATTR_HOT inline nl_double *gt() { return m_gt; }
175   ATTR_HOT inline nl_double *go() { return m_go; }
176   ATTR_HOT inline nl_double *Idr() { return m_Idr; }
177   ATTR_HOT inline nl_double **other_curanalog() { return m_other_curanalog; }
178178
179179   ATTR_COLD void set_pointers();
180180
r242974r242975
183183private:
184184   plinearlist_t<netlist_terminal_t *> m_term;
185185   plinearlist_t<int> m_net_other;
186   plinearlist_t<double> m_go;
187   plinearlist_t<double> m_gt;
188   plinearlist_t<double> m_Idr;
189   plinearlist_t<double *> m_other_curanalog;
186   plinearlist_t<nl_double> m_go;
187   plinearlist_t<nl_double> m_gt;
188   plinearlist_t<nl_double> m_Idr;
189   plinearlist_t<nl_double *> m_other_curanalog;
190190};
191191
192192class netlist_matrix_solver_t : public netlist_device_t
r242974r242975
209209   template<class C>
210210   void solve_base(C *p);
211211
212   ATTR_HOT double solve();
212   ATTR_HOT nl_double solve();
213213
214214   ATTR_HOT inline bool is_dynamic() { return m_dynamic_devices.count() > 0; }
215215   ATTR_HOT inline bool is_timestep() { return m_step_devices.count() > 0; }
r242974r242975
236236   ATTR_HOT void update_dynamic();
237237
238238   // should return next time step
239   ATTR_HOT virtual double vsolve() = 0;
239   ATTR_HOT virtual nl_double vsolve() = 0;
240240
241241   ATTR_COLD virtual void  add_term(int net_idx, netlist_terminal_t *term) = 0;
242242
r242974r242975
249249
250250   const netlist_solver_parameters_t &m_params;
251251
252   ATTR_HOT inline const double current_timestep() { return m_cur_ts; }
252   ATTR_HOT inline const nl_double current_timestep() { return m_cur_ts; }
253253private:
254254
255255   netlist_time m_last_step;
256   double m_cur_ts;
256   nl_double m_cur_ts;
257257   dev_list_t m_step_devices;
258258   dev_list_t m_dynamic_devices;
259259
r242974r242975
279279
280280   ATTR_COLD void post_start();
281281
282   ATTR_HOT inline double gmin() { return m_gmin.Value(); }
282   ATTR_HOT inline nl_double gmin() { return m_gmin.Value(); }
283283
284284protected:
285285   ATTR_HOT void update();
trunk/src/emu/netlist/analog/nld_twoterm.c
r242974r242975
1616   set_param(1e-15, 1, 1e-15);
1717}
1818
19ATTR_COLD void netlist_generic_diode::set_param(const double Is, const double n, double gmin)
19ATTR_COLD void netlist_generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin)
2020{
2121   m_Is = Is;
2222   m_n = n;
r242974r242975
157157
158158NETLIB_UPDATE_PARAM(POT)
159159{
160   double v = m_Dial.Value();
160   nl_double v = m_Dial.Value();
161161   if (m_DialIsLog.Value())
162162      v = (exp(v) - 1.0) / (exp(1.0) - 1.0);
163163
r242974r242975
221221
222222NETLIB_UPDATE_PARAM(D)
223223{
224   double Is = m_model.model_value("Is", 1e-15);
225   double n = m_model.model_value("N", 1);
224   nl_double Is = m_model.model_value("Is", 1e-15);
225   nl_double n = m_model.model_value("N", 1);
226226
227227   m_D.set_param(Is, n, netlist().gmin());
228228}
trunk/src/emu/netlist/analog/nld_twoterm.h
r242974r242975
9797   {
9898   }
9999
100   ATTR_HOT inline void set(const double G, const double V, const double I)
100   ATTR_HOT inline void set(const nl_double G, const nl_double V, const nl_double I)
101101   {
102102      /*      GO, GT, I                */
103103      m_P.set( G,  G, (  V) * G - I);
104104      m_N.set( G,  G, ( -V) * G + I);
105105   }
106106
107   ATTR_HOT inline double deltaV() const
107   ATTR_HOT inline nl_double deltaV() const
108108   {
109109      return m_P.net().as_analog().Q_Analog() - m_N.net().as_analog().Q_Analog();
110110   }
111111
112   ATTR_HOT void set_mat(double a11, double a12, double a21, double a22, double r1, double r2)
112   ATTR_HOT void set_mat(nl_double a11, nl_double a12, nl_double a21, nl_double a22, nl_double r1, nl_double r2)
113113   {
114114      /*      GO, GT, I                */
115115      m_P.set(-a12, a11, -r1);
r242974r242975
133133public:
134134   ATTR_COLD NETLIB_NAME(R_base)() : NETLIB_NAME(twoterm)(RESISTOR) { }
135135
136   inline void set_R(const double R)
136   inline void set_R(const nl_double R)
137137   {
138138      set(1.0 / R, 0.0, 0.0);
139139   }
r242974r242975
171171public:
172172   ATTR_COLD NETLIB_NAME(C)() : NETLIB_NAME(twoterm)(CAPACITOR) { }
173173
174   ATTR_HOT void step_time(const double st)
174   ATTR_HOT void step_time(const nl_double st)
175175   {
176      const double G = m_C.Value() / st;
177      const double I = -G * deltaV();
176      const nl_double G = m_C.Value() / st;
177      const nl_double I = -G * deltaV();
178178      set(G, 0.0, I);
179179   }
180180
r242974r242975
198198public:
199199   ATTR_COLD netlist_generic_diode();
200200
201   ATTR_HOT inline void update_diode(const double nVd)
201   ATTR_HOT inline void update_diode(const nl_double nVd)
202202   {
203203      //FIXME: Optimize cutoff case
204204
r242974r242975
212212      {
213213         m_Vd = nVd;
214214
215         const double eVDVt = exp(m_Vd * m_VtInv);
215         const nl_double eVDVt = exp(m_Vd * m_VtInv);
216216         m_Id = m_Is * (eVDVt - 1.0);
217217         m_G = m_Is * m_VtInv * eVDVt + m_gmin;
218218      }
r242974r242975
221221#if defined(_MSC_VER) && _MSC_VER < 1800
222222         m_Vd = m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt;
223223#else
224         double a = (nVd - m_Vd) * m_VtInv;
224         nl_double a = (nVd - m_Vd) * m_VtInv;
225225         if (a<1e-12 - 1.0) a = 1e-12 - 1.0;
226226         m_Vd = m_Vd + log1p(a) * m_Vt;
227227#endif
228         const double eVDVt = exp(m_Vd * m_VtInv);
228         const nl_double eVDVt = exp(m_Vd * m_VtInv);
229229         m_Id = m_Is * (eVDVt - 1.0);
230230
231231         m_G = m_Is * m_VtInv * eVDVt + m_gmin;
r242974r242975
234234      //printf("nVd %f m_Vd %f Vcrit %f\n", nVd, m_Vd, m_Vcrit);
235235   }
236236
237   ATTR_COLD void set_param(const double Is, const double n, double gmin);
237   ATTR_COLD void set_param(const nl_double Is, const nl_double n, nl_double gmin);
238238
239   ATTR_HOT inline double I() const { return m_Id; }
240   ATTR_HOT inline double G() const { return m_G; }
241   ATTR_HOT inline double Ieq() const { return (m_Id - m_Vd * m_G); }
242   ATTR_HOT inline double Vd() const { return m_Vd; }
239   ATTR_HOT inline nl_double I() const { return m_Id; }
240   ATTR_HOT inline nl_double G() const { return m_G; }
241   ATTR_HOT inline nl_double Ieq() const { return (m_Id - m_Vd * m_G); }
242   ATTR_HOT inline nl_double Vd() const { return m_Vd; }
243243
244244   /* owning object must save those ... */
245245
246246   ATTR_COLD void save(pstring name, netlist_object_t &parent);
247247
248248private:
249   double m_Vd;
250   double m_Id;
251   double m_G;
249   nl_double m_Vd;
250   nl_double m_Id;
251   nl_double m_G;
252252
253   double m_Vt;
254   double m_Is;
255   double m_n;
256   double m_gmin;
253   nl_double m_Vt;
254   nl_double m_Is;
255   nl_double m_n;
256   nl_double m_gmin;
257257
258   double m_VtInv;
259   double m_Vcrit;
258   nl_double m_VtInv;
259   nl_double m_Vcrit;
260260};
261261
262262// ----------------------------------------------------------------------------------------
r242974r242975
268268// add c3 and it'll be better than 1%
269269
270270#if 0
271inline double fastexp_h(const double x)
271inline nl_double fastexp_h(const nl_double x)
272272{
273   static const double ln2r = 1.442695040888963387;
274   static const double ln2  = 0.693147180559945286;
275   //static const double c3   = 0.166666666666666667;
273   static const nl_double ln2r = 1.442695040888963387;
274   static const nl_double ln2  = 0.693147180559945286;
275   //static const nl_double c3   = 0.166666666666666667;
276276
277   const double y = x * ln2r;
277   const nl_double y = x * ln2r;
278278   const unsigned int t = y;
279   const double z = (x - ln2 * (double) t);
280   const double zz = z * z;
281   //const double zzz = zz * z;
279   const nl_double z = (x - ln2 * (double) t);
280   const nl_double zz = z * z;
281   //const nl_double zzz = zz * z;
282282
283283   return (double)(1 << t)*(1.0 + z + 0.5 * zz); // + c3*zzz;
284284}
285285
286inline double fastexp(const double x)
286inline nl_double fastexp(const nl_double x)
287287{
288288   if (x<0)
289289      return 1.0 / fastexp_h(-x);
trunk/src/emu/netlist/devices/nld_4066.c
r242974r242975
1919
2020NETLIB_UPDATE(4066)
2121{
22   double sup = (m_supply.get()->vdd() - m_supply.get()->vss());
23   double low = 0.45 * sup;
24   double high = 0.55 * sup;
25   double in = INPANALOG(m_control) - m_supply.get()->vss();
26   double rON = 270.0 * 5.0 / sup;
22   nl_double sup = (m_supply.get()->vdd() - m_supply.get()->vss());
23   nl_double low = 0.45 * sup;
24   nl_double high = 0.55 * sup;
25   nl_double in = INPANALOG(m_control) - m_supply.get()->vss();
26   nl_double rON = 270.0 * 5.0 / sup;
2727
2828   if (in < low)
2929   {
trunk/src/emu/netlist/devices/nld_74123.c
r242974r242975
6969
7070   if (m_state == 1)
7171   {
72      const double vLow = m_KP * TERMANALOG(m_RP.m_P);
72      const nl_double vLow = m_KP * TERMANALOG(m_RP.m_P);
7373      if (INPANALOG(m_CV) < vLow)
7474      {
7575         m_RN.set_R(R_OFF);
r242974r242975
7878   }
7979   else if (m_state == 2)
8080   {
81      const double vHigh = TERMANALOG(m_RP.m_P) * (1.0 - m_KP);
81      const nl_double vHigh = TERMANALOG(m_RP.m_P) * (1.0 - m_KP);
8282      if (INPANALOG(m_CV) > vHigh)
8383      {
8484         m_RP.set_R(R_OFF);
trunk/src/emu/netlist/devices/nld_74ls629.c
r242974r242975
104104{
105105   {
106106      // recompute
107      double  freq;
108      double  v_freq_2, v_freq_3, v_freq_4;
109      double  v_freq = INPANALOG(m_FC);
110      double  v_rng = INPANALOG(m_RNG);
107      nl_double  freq;
108      nl_double  v_freq_2, v_freq_3, v_freq_4;
109      nl_double  v_freq = INPANALOG(m_FC);
110      nl_double  v_rng = INPANALOG(m_RNG);
111111
112112      /* coefficients */
113      const double k1 = 1.9904769024796283E+03;
114      const double k2 = 1.2070059213983407E+03;
115      const double k3 = 1.3266985579561108E+03;
116      const double k4 = -1.5500979825922698E+02;
117      const double k5 = 2.8184536266938172E+00;
118      const double k6 = -2.3503421582744556E+02;
119      const double k7 = -3.3836786704527788E+02;
120      const double k8 = -1.3569136703258670E+02;
121      const double k9 = 2.9914575453819188E+00;
122      const double k10 = 1.6855569086173170E+00;
113      const nl_double k1 = 1.9904769024796283E+03;
114      const nl_double k2 = 1.2070059213983407E+03;
115      const nl_double k3 = 1.3266985579561108E+03;
116      const nl_double k4 = -1.5500979825922698E+02;
117      const nl_double k5 = 2.8184536266938172E+00;
118      const nl_double k6 = -2.3503421582744556E+02;
119      const nl_double k7 = -3.3836786704527788E+02;
120      const nl_double k8 = -1.3569136703258670E+02;
121      const nl_double k9 = 2.9914575453819188E+00;
122      const nl_double k10 = 1.6855569086173170E+00;
123123
124124      /* scale due to input resistance */
125125
trunk/src/emu/netlist/devices/nld_cmos.h
r242974r242975
2929      ATTR_HOT void reset()  {};
3030
3131public:
32   ATTR_HOT inline double vdd() { return INPANALOG(m_vdd); }
33   ATTR_HOT inline double vss() { return INPANALOG(m_vss); }
32   ATTR_HOT inline nl_double vdd() { return INPANALOG(m_vdd); }
33   ATTR_HOT inline nl_double vss() { return INPANALOG(m_vss); }
3434};
3535
3636#endif /* NLD_CMOS_H_ */
trunk/src/emu/netlist/devices/nld_ne555.c
r242974r242975
1010#define R_OFF (1E20)
1111#define R_ON (25)   // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2
1212
13inline double NETLIB_NAME(NE555)::clamp(const double v, const double a, const double b)
13inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b)
1414{
15   double ret = v;
16   double vcc = TERMANALOG(m_R1.m_P);
15   nl_double ret = v;
16   nl_double vcc = TERMANALOG(m_R1.m_P);
1717
1818   if (ret >  vcc - a)
1919      ret = vcc - a;
r242974r242975
6464{
6565   // FIXME: assumes GND is connected to 0V.
6666
67   double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4);
67   nl_double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4);
6868   bool bthresh = (INPANALOG(m_THRES) > vt);
6969   bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4));
7070   bool out = m_last_out;
trunk/src/emu/netlist/devices/nld_ne555.h
r242974r242975
3939
4040   netlist_state_t<bool> m_last_out;
4141
42   inline double clamp(const double v, const double a, const double b);
42   inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b);
4343
4444);
4545
trunk/src/emu/netlist/devices/nld_r2r_dac.c
r242974r242975
3232
3333   update_dev();
3434
35   double V = m_VIN.Value() / (double) (1 << m_num.Value()) * (double) m_val.Value();
35   nl_double V = m_VIN.Value() / (double) (1 << m_num.Value()) * (double) m_val.Value();
3636
3737   this->set(1.0 / m_R.Value(), V, 0.0);
3838}
trunk/src/emu/netlist/devices/nld_system.c
r242974r242975
118118   if (state != m_last_state)
119119   {
120120      m_last_state = state;
121      const double R = state ? m_logic_family->m_R_high : m_logic_family->m_R_low;
122      const double V = state ? m_logic_family->m_high_V : m_logic_family->m_low_V;
121      const nl_double R = state ? m_logic_family->m_R_high : m_logic_family->m_R_low;
122      const nl_double V = state ? m_logic_family->m_high_V : m_logic_family->m_low_V;
123123
124124      // We only need to update the net first if this is a time stepping net
125125      if (m_RV.m_P.net().as_analog().solver()->is_timestep())
trunk/src/emu/netlist/nl_base.c
r242974r242975
170170   netlist_object_t::save_register();
171171}
172172
173ATTR_HOT const double netlist_base_t::gmin() const
173ATTR_HOT const nl_double netlist_base_t::gmin() const
174174{
175175   return solver()->gmin();
176176}
r242974r242975
452452}
453453
454454template ATTR_COLD void netlist_device_t::register_param(const pstring &sname, netlist_param_double_t &param, const double initialVal);
455template ATTR_COLD void netlist_device_t::register_param(const pstring &sname, netlist_param_double_t &param, const float initialVal);
455456template ATTR_COLD void netlist_device_t::register_param(const pstring &sname, netlist_param_int_t &param, const int initialVal);
456457template ATTR_COLD void netlist_device_t::register_param(const pstring &sname, netlist_param_logic_t &param, const int initialVal);
457458template ATTR_COLD void netlist_device_t::register_param(const pstring &sname, netlist_param_str_t &param, const char * const initialVal);
r242974r242975
874875   net().as_analog().m_cur_Analog = 0.98;
875876}
876877
877ATTR_COLD void netlist_analog_output_t::initial(const double val)
878ATTR_COLD void netlist_analog_output_t::initial(const nl_double val)
878879{
879880   net().as_analog().m_cur_Analog = val * 0.99;
880881}
r242974r242975
931932}
932933
933934
934ATTR_COLD double netlist_param_model_t::model_value(const pstring &entity, const double defval) const
935ATTR_COLD nl_double netlist_param_model_t::model_value(const pstring &entity, const nl_double defval) const
935936{
936937   pstring tmp = this->Value();
937938   // .model 1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)
r242974r242975
945946      if (pequal < 0)
946947         netlist().error("parameter %s misformat in model %s temp %s\n", entity.cstr(), Value().cstr(), tmp.cstr());
947948      tmp = tmp.substr(pequal+1);
948      double factor = 1.0;
949      nl_double factor = 1.0;
949950      switch (*(tmp.right(1).cstr()))
950951      {
951952         case 'm': factor = 1e-3; break;
trunk/src/emu/netlist/nl_base.h
r242974r242975
272272
273273struct netlist_logic_family_desc_t
274274{
275   double m_low_thresh_V;
276   double m_high_thresh_V;
277   double m_low_V;
278   double m_high_V;
279   double m_R_low;
280   double m_R_high;
275   nl_double m_low_thresh_V;
276   nl_double m_high_thresh_V;
277   nl_double m_low_V;
278   nl_double m_high_V;
279   nl_double m_R_low;
280   nl_double m_R_high;
281281};
282282
283283/* Terminals inherit the family description from the netlist_device
r242974r242975
474474
475475   ATTR_COLD netlist_terminal_t();
476476
477   double *m_Idr1; // drive current
478   double *m_go1;  // conductance for Voltage from other term
479   double *m_gt1;  // conductance for total conductance
477   nl_double *m_Idr1; // drive current
478   nl_double *m_go1;  // conductance for Voltage from other term
479   nl_double *m_gt1;  // conductance for total conductance
480480
481   ATTR_HOT inline void set(const double G)
481   ATTR_HOT inline void set(const nl_double G)
482482   {
483483      set_ptr(m_Idr1, 0);
484484      set_ptr(m_go1, G);
485485      set_ptr(m_gt1, G);
486486   }
487487
488   ATTR_HOT inline void set(const double GO, const double GT)
488   ATTR_HOT inline void set(const nl_double GO, const nl_double GT)
489489   {
490490      set_ptr(m_Idr1, 0);
491491      set_ptr(m_go1, GO);
492492      set_ptr(m_gt1, GT);
493493   }
494494
495   ATTR_HOT inline void set(const double GO, const double GT, const double I)
495   ATTR_HOT inline void set(const nl_double GO, const nl_double GT, const nl_double I)
496496   {
497497      set_ptr(m_Idr1, I);
498498      set_ptr(m_go1, GO);
r242974r242975
509509
510510   ATTR_COLD virtual void reset();
511511private:
512   inline void set_ptr(double *ptr, const double val)
512   inline void set_ptr(nl_double *ptr, const nl_double val)
513513   {
514514      if (ptr != NULL)
515515         *ptr = val;
r242974r242975
586586   ATTR_COLD netlist_analog_input_t()
587587      : netlist_input_t(INPUT, ANALOG) { }
588588
589   ATTR_HOT inline const double Q_Analog() const;
589   ATTR_HOT inline const nl_double Q_Analog() const;
590590};
591591
592592//#define INPVAL(_x) (_x).Q()
r242974r242975
661661   // We have to have those on one object. Dividing those does lead
662662   // to a significant performance hit
663663   // FIXME: Have to fix the public at some time
664   double m_cur_Analog;
664   nl_double m_cur_Analog;
665665
666666};
667667
r242974r242975
736736   ATTR_COLD netlist_analog_net_t();
737737   ATTR_COLD virtual ~netlist_analog_net_t() { };
738738
739   ATTR_HOT inline const double Q_Analog() const
739   ATTR_HOT inline const nl_double Q_Analog() const
740740   {
741741      //nl_assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG);
742742      nl_assert(family() == ANALOG);
743743      return m_cur_Analog;
744744   }
745745
746   ATTR_COLD inline double &Q_Analog_state_ptr()
746   ATTR_COLD inline nl_double &Q_Analog_state_ptr()
747747   {
748748      //nl_assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG);
749749      nl_assert(family() == ANALOG);
r242974r242975
764764private:
765765
766766public:
767   double m_DD_n_m_1;
768   double m_h_n_m_1;
767   nl_double m_DD_n_m_1;
768   nl_double m_h_n_m_1;
769769
770770   //FIXME: needed by current solver code
771771   netlist_matrix_solver_t *m_solver;
r242974r242975
831831
832832   ATTR_COLD netlist_analog_output_t();
833833
834   ATTR_COLD void initial(const double val);
834   ATTR_COLD void initial(const nl_double val);
835835
836   ATTR_HOT inline void set_Q(const double newQ);
836   ATTR_HOT inline void set_Q(const nl_double newQ);
837837
838838   netlist_analog_net_t *m_proxied_net; // only for proxy nets in analog input logic
839839
r242974r242975
876876public:
877877   ATTR_COLD netlist_param_double_t();
878878
879   ATTR_HOT inline void setTo(const double param);
880   ATTR_COLD inline void initial(const double val) { m_param = val; }
881   ATTR_HOT inline const double Value() const        { return m_param;   }
879   ATTR_HOT inline void setTo(const nl_double param);
880   ATTR_COLD inline void initial(const nl_double val) { m_param = val; }
881   ATTR_HOT inline const nl_double Value() const        { return m_param;   }
882882
883883protected:
884884   ATTR_COLD virtual void save_register()
r242974r242975
888888   }
889889
890890private:
891   double m_param;
891   nl_double m_param;
892892};
893893
894894class netlist_param_int_t : public netlist_param_t
r242974r242975
946946   ATTR_HOT inline const pstring &Value() const     { return m_param;     }
947947
948948   /* these should be cached! */
949   ATTR_COLD double model_value(const pstring &entity, const double defval = 0.0) const;
949   ATTR_COLD nl_double model_value(const pstring &entity, const nl_double defval = 0.0) const;
950950   ATTR_COLD const pstring model_type() const;
951951
952952private:
r242974r242975
997997      out.set_Q(val, delay);
998998   }
999999
1000   ATTR_HOT inline const double INPANALOG(const netlist_analog_input_t &inp) const { return inp.Q_Analog(); }
1000   ATTR_HOT inline const nl_double INPANALOG(const netlist_analog_input_t &inp) const { return inp.Q_Analog(); }
10011001
1002   ATTR_HOT inline const double TERMANALOG(const netlist_terminal_t &term) const { return term.net().as_analog().Q_Analog(); }
1002   ATTR_HOT inline const nl_double TERMANALOG(const netlist_terminal_t &term) const { return term.net().as_analog().Q_Analog(); }
10031003
1004   ATTR_HOT inline void OUTANALOG(netlist_analog_output_t &out, const double val)
1004   ATTR_HOT inline void OUTANALOG(netlist_analog_output_t &out, const nl_double val)
10051005   {
10061006      out.set_Q(val);
10071007   }
r242974r242975
10101010
10111011   ATTR_HOT virtual void dec_active() {  }
10121012
1013   ATTR_HOT virtual void step_time(const double st) { }
1013   ATTR_HOT virtual void step_time(const nl_double st) { }
10141014   ATTR_HOT virtual void update_terminals() { }
10151015
10161016
r242974r242975
11201120   ATTR_HOT inline const netlist_time time() const { return m_time; }
11211121   ATTR_HOT inline NETLIB_NAME(solver) *solver() const { return m_solver; }
11221122   ATTR_HOT inline NETLIB_NAME(gnd) *gnd() const { return m_gnd; }
1123   ATTR_HOT const double gmin() const;
1123   ATTR_HOT const nl_double gmin() const;
11241124
11251125   ATTR_HOT inline void push_to_queue(netlist_net_t *out, const netlist_time attime)
11261126   {
r242974r242975
12511251   }
12521252}
12531253
1254ATTR_HOT inline void netlist_param_double_t::setTo(const double param)
1254ATTR_HOT inline void netlist_param_double_t::setTo(const nl_double param)
12551255{
12561256   if (m_param != param)
12571257   {
r242974r242975
13561356   return net().as_logic().Q();
13571357}
13581358
1359ATTR_HOT inline const double netlist_analog_input_t::Q_Analog() const
1359ATTR_HOT inline const nl_double netlist_analog_input_t::Q_Analog() const
13601360{
13611361   return net().as_analog().Q_Analog();
13621362}
13631363
1364ATTR_HOT inline void netlist_analog_output_t::set_Q(const double newQ)
1364ATTR_HOT inline void netlist_analog_output_t::set_Q(const nl_double newQ)
13651365{
13661366   if (newQ != net().as_analog().m_cur_Analog)
13671367   {
trunk/src/emu/netlist/nl_config.h
r242974r242975
4949
5050#define NETLIST_GMIN_DEFAULT    (1e-9)
5151
52//typedef double   nl_double;
53
54#define nl_double double
55
5256//============================================================
5357//  DEBUGGING
5458//============================================================
trunk/src/emu/netlist/nl_dice_compat.h
r242974r242975
1313 * -------------------------------------------------------------------- */
1414
1515//#define CHIP(_n, _t) netlist.register_dev(NET_NEW(_t ## _dip), _n);
16#define CHIP(_n, _t) setup.register_dev( nl_alloc(nld_ ## _t ## _dip), _n);
16#define CHIP(_n, _t) setup.register_dev( nL_alloc(nld_ ## _t ## _dip()), _n);
1717
1818#define CONNECTION( ... ) CONNECTIONY( CONNECTIONX( __VA_ARGS__ ) )
1919#define CONNECTIONY(_a) _a
r242974r242975
3030struct Mono555Desc
3131{
3232public:
33      double r, c;
33      nl_double r, c;
3434
35      Mono555Desc(double res, double cap) : r(res), c(cap) { }
35      Mono555Desc(nl_double res, nl_double cap) : r(res), c(cap) { }
3636};
3737
3838struct SeriesRCDesc
3939{
4040public:
41      double r, c;
41      nl_double r, c;
4242
43      SeriesRCDesc(double res, double cap) : r(res), c(cap) { }
43      SeriesRCDesc(nl_double res, nl_double cap) : r(res), c(cap) { }
4444};
4545
4646#define CHIP_555_Mono(_name,  _pdesc)   \
trunk/src/emu/netlist/nl_parser.c
r242974r242975
399399void netlist_parser::netdev_param()
400400{
401401   pstring param;
402   double val;
402   nl_double val;
403403   param = get_identifier();
404404   require_token(m_tok_comma);
405405   val = eval_param(get_token());
r242974r242975
439439      }
440440      else
441441      {
442         double val = eval_param(tok);
442         nl_double val = eval_param(tok);
443443         m_setup.register_param(paramfq, val);
444444      }
445445      cnt++;
r242974r242975
467467// ----------------------------------------------------------------------------------------
468468
469469
470double netlist_parser::eval_param(const token_t tok)
470nl_double netlist_parser::eval_param(const token_t tok)
471471{
472472   static const char *macs[6] = {"", "RES_K", "RES_M", "CAP_U", "CAP_N", "CAP_P"};
473   static double facs[6] = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12};
473   static nl_double facs[6] = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12};
474474   int i;
475475   int f=0;
476476   bool e;
477   double ret;
477   nl_double ret;
478478   pstring val;
479479
480480   //printf("param %s\n", tok.m_token.cstr());
trunk/src/emu/netlist/nl_parser.h
r242974r242975
160160   virtual void verror(pstring msg, int line_num, pstring line);
161161private:
162162
163   double eval_param(const token_t tok);
163   nl_double eval_param(const token_t tok);
164164
165165   token_id_t m_tok_param_left;
166166   token_id_t m_tok_param_right;
trunk/src/emu/netlist/pstate.c
r242974r242975
2323         "DT_INT16",
2424         "DT_INT8",
2525         "DT_INT",
26         "DT_BOOLEAN"
26         "DT_BOOLEAN",
27            "DT_FLOAT"
2728   };
2829
2930   NL_VERBOSE_OUT(("SAVE: <%s> %s(%d) %p\n", fullname.cstr(), ts[dt].cstr(), size, ptr));
trunk/src/emu/netlist/pstate.h
r242974r242975
3232   DT_INT16,
3333   DT_INT8,
3434   DT_INT,
35   DT_BOOLEAN
35   DT_BOOLEAN,
36   DT_FLOAT
3637};
3738
3839template<typename _ItemType> struct nl_datatype
r242974r242975
5556
5657NETLIST_SAVE_TYPE(char, DT_INT8);
5758NETLIST_SAVE_TYPE(double, DT_DOUBLE);
59NETLIST_SAVE_TYPE(float, DT_FLOAT);
5860NETLIST_SAVE_TYPE(INT8, DT_INT8);
5961NETLIST_SAVE_TYPE(UINT8, DT_INT8);
6062NETLIST_SAVE_TYPE(INT64, DT_INT64);
trunk/src/emu/netlist/pstring.c
r242974r242975
108108   return 1;
109109}
110110
111double pstring::as_double(bool *error) const
111nl_double pstring::as_double(bool *error) const
112112{
113   double ret;
113   nl_double ret;
114114   char *e = NULL;
115115
116116   if (error != NULL)
r242974r242975
124124
125125long pstring::as_long(bool *error) const
126126{
127   double ret;
127   nl_double ret;
128128   char *e = NULL;
129129
130130   if (error != NULL)
trunk/src/emu/netlist/pstring.h
r242974r242975
159159
160160   // conversions
161161
162   double as_double(bool *error = NULL) const;
162   nl_double as_double(bool *error = NULL) const;
163163
164164   long as_long(bool *error = NULL) const;
165165
trunk/src/emu/sound/rf5c400.c
r242974r242975
129129
130130         if (env_phase == PHASE_NONE) break;
131131
132         tmp = rom[(pos>>16) & m_rommask];
132         tmp = rom[pos>>16];
133133         switch ( type )
134134         {
135135            case TYPE_16:
r242974r242975
331331   }
332332
333333   m_stream = stream_alloc(0, 2, clock()/384);
334
335   m_rommask = m_rom.length() - 1;
336334}
337335
338336
trunk/src/emu/sound/rf5c400.h
r242974r242975
9898private:
9999   required_region_ptr<INT16> m_rom;
100100
101   UINT32 m_rommask;
102
103101   sound_stream *m_stream;
104102
105103   double m_env_ar_table[0x9f];
trunk/src/emu/ui/filemngr.c
r242974r242975
2020#include "ui/swlist.h"
2121#include "ui/filemngr.h"
2222#include "ui/filesel.h"
23#include "ui/miscmenu.h"
2423
2524
2625/***************************************************************************
r242974r242975
3130//  ctor
3231//-------------------------------------------------
3332
34ui_menu_file_manager::ui_menu_file_manager(running_machine &machine, render_container *container, const char *warnings) : ui_menu(machine, container)
33ui_menu_file_manager::ui_menu_file_manager(running_machine &machine, render_container *container) : ui_menu(machine, container)
3534{
36   // This warning string is used when accessing from the force_file_manager call, i.e.
37   // when the file manager is loaded top front in the case of mandatory image devices
38   if (warnings)
39      m_warnings.cpy(warnings);
40   else
41      m_warnings.reset();
4235}
4336
4437
r242974r242975
108101   bool first_entry = true;
109102   astring prev_owner;
110103
111   if (m_warnings)
112   {
113      item_append(m_warnings, NULL, MENU_FLAG_DISABLE, NULL);
114      item_append("", NULL, MENU_FLAG_DISABLE, NULL);
115   }
116     
117104   // cycle through all devices for this system
118105   device_iterator iter(machine().root_device());
119106   tagmap_t<UINT8> devtags;
r242974r242975
185172      }
186173   }
187174}
188
189// force file manager menu
190void ui_menu_file_manager::force_file_manager(running_machine &machine, render_container *container, const char *warnings)
191{   
192   // reset the menu stack
193   ui_menu::stack_reset(machine);
194   
195   // add the quit entry followed by the game select entry
196   ui_menu *quit = auto_alloc_clear(machine, ui_menu_quit_game(machine, container));
197   quit->set_special_main_menu(true);
198   ui_menu::stack_push(quit);
199   ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_file_manager(machine, container, warnings)));
200   
201   // force the menus on
202   machine.ui().show_menu();
203   
204   // make sure MAME is paused
205   machine.pause();
206}
trunk/src/emu/ui/filemngr.h
r242974r242975
2020   astring current_file;
2121   device_image_interface *selected_device;
2222
23   static void force_file_manager(running_machine &machine, render_container *container, const char *warnings);
24
25   ui_menu_file_manager(running_machine &machine, render_container *container, const char *warnings);
23   ui_menu_file_manager(running_machine &machine, render_container *container);
2624   virtual ~ui_menu_file_manager();
2725   virtual void populate();
2826   virtual void handle();
2927   virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2);
3028
3129   void fill_image_line(device_image_interface *img, astring &instance, astring &filename);
32
33private:
34   astring m_warnings;
3530};
3631
3732#endif  /* __UI_FILEMNGR_H__ */
trunk/src/emu/ui/imgcntrl.c
r242974r242975
1616#include "ui/filesel.h"
1717#include "ui/swlist.h"
1818#include "zippath.h"
19#include "audit.h"
2019
2120
2221/***************************************************************************
r242974r242975
133132void ui_menu_control_device_image::load_software_part()
134133{
135134   astring temp_name(sld->list_name(), ":", swi->shortname(), ":", swp->name());
136
137   driver_enumerator drivlist(machine().options(), machine().options().system_name());
138   media_auditor auditor(drivlist);
139   media_auditor::summary summary = auditor.audit_software(sld->list_name(), (software_info *)swi, AUDIT_VALIDATE_FAST);
140   // if everything looks good, load software
141   if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE || summary == media_auditor::NONE_NEEDED)
142      hook_load(temp_name, true);
143   else
144   {
145      popmessage("The selected game is missing one or more required ROM or CHD images. Please select a different game.");
146      state = SELECT_SOFTLIST;
147   }
135   hook_load(temp_name, true);
148136}
149137
150138
r242974r242975
229217      {
230218         swp = swi->first_part();
231219         load_software_part();
220         ui_menu::stack_pop(machine());
232221      }
233222      break;
234223
r242974r242975
236225      switch(submenu_result) {
237226      case ui_menu_software_parts::T_ENTRY: {
238227         load_software_part();
228         ui_menu::stack_pop(machine());
239229         break;
240230      }
241231
trunk/src/emu/ui/imgcntrl.h
r242974r242975
1414#ifndef __UI_IMGCNTRL_H__
1515#define __UI_IMGCNTRL_H__
1616
17#include "drivenum.h"
18
1917// ======================> ui_menu_control_device_image
2018
2119class ui_menu_control_device_image : public ui_menu {
trunk/src/emu/ui/imginfo.c
r0r242975
1/***************************************************************************
2
3    ui/imginfo.c
4
5    Image info screen
6
7    Copyright Nicola Salmoria and the MAME Team.
8    Visit http://mamedev.org for licensing and usage restrictions.
9
10***************************************************************************/
11
12#include "emu.h"
13#include "ui/menu.h"
14#include "ui/imginfo.h"
15
16
17/***************************************************************************
18    IMPLEMENTATION
19***************************************************************************/
20
21//-------------------------------------------------
22//  ctor
23//-------------------------------------------------
24
25ui_menu_image_info::ui_menu_image_info(running_machine &machine, render_container *container) : ui_menu(machine, container)
26{
27}
28
29
30//-------------------------------------------------
31//  dtor
32//-------------------------------------------------
33
34ui_menu_image_info::~ui_menu_image_info()
35{
36}
37
38
39//-------------------------------------------------
40//  populate
41//-------------------------------------------------
42
43void ui_menu_image_info::populate()
44{
45   item_append(machine().system().description, NULL, MENU_FLAG_DISABLE, NULL);
46   item_append("", NULL, MENU_FLAG_DISABLE, NULL);
47
48   image_interface_iterator iter(machine().root_device());
49   for (device_image_interface *image = iter.first(); image != NULL; image = iter.next())
50         image_info(image);
51}
52
53
54//-------------------------------------------------
55//  handle
56//-------------------------------------------------
57
58void ui_menu_image_info::handle()
59{
60   // process the menu
61   process(0);
62}
63
64
65//-------------------------------------------------
66//  image_info - display image info for a specific
67//  image interface device
68//-------------------------------------------------
69
70void ui_menu_image_info::image_info(device_image_interface *image)
71{
72   if (image->exists())
73   {
74      // display device type and filename
75      item_append(image->brief_instance_name(), image->basename(), 0, NULL);
76
77      // if image has been loaded through softlist, let's add some more info
78      if (image->software_entry())
79      {
80         astring string;
81
82         // display long filename
83         item_append(image->longname(), "", MENU_FLAG_DISABLE, NULL);
84         
85         // display manufacturer and year
86         string.catprintf("%s, %s", image->manufacturer(), image->year());
87         item_append(string, "", MENU_FLAG_DISABLE, NULL);
88
89         // display supported information, if available
90         switch (image->supported())
91         {
92            case SOFTWARE_SUPPORTED_NO:
93               item_append("Not supported", "", MENU_FLAG_DISABLE, NULL);
94               break;
95            case SOFTWARE_SUPPORTED_PARTIAL:
96               item_append("Partially supported", "", MENU_FLAG_DISABLE, NULL);
97               break;
98            default:
99               break;
100         }
101      }
102   }
103   else
104      item_append(image->brief_instance_name(), "[empty]", 0, NULL);
105   item_append("", NULL, MENU_FLAG_DISABLE, NULL);
106}
trunk/src/emu/ui/imginfo.h
r0r242975
1/***************************************************************************
2
3    ui/imginfo.h
4
5    Image info screen
6
7    Copyright Nicola Salmoria and the MAME Team.
8    Visit http://mamedev.org for licensing and usage restrictions.
9
10***************************************************************************/
11
12#pragma once
13
14#ifndef __UI_IMGINFO_H__
15#define __UI_IMGINFO_H__
16
17class ui_menu_image_info : public ui_menu
18{
19public:
20   ui_menu_image_info(running_machine &machine, render_container *container);
21   virtual ~ui_menu_image_info();
22   virtual void populate();
23   virtual void handle();
24
25private:
26   void image_info(device_image_interface *image);
27};
28
29#endif // __UI_IMGINFO_H__
trunk/src/emu/ui/info.c
r242974r242975
1/***************************************************************************
2
3    ui/info.c
4
5    System and image info screens
6
7    Copyright Nicola Salmoria and the MAME Team.
8    Visit http://mamedev.org for licensing and usage restrictions.
9
10***************************************************************************/
11
12#include "emu.h"
13#include "ui/menu.h"
14#include "ui/info.h"
15#include "ui/ui.h"
16
17/*-------------------------------------------------
18  menu_game_info - handle the game information
19  menu
20 -------------------------------------------------*/
21
22ui_menu_game_info::ui_menu_game_info(running_machine &machine, render_container *container) : ui_menu(machine, container)
23{
24}
25
26ui_menu_game_info::~ui_menu_game_info()
27{
28}
29
30void ui_menu_game_info::populate()
31{
32   astring tempstring;
33   item_append(machine().ui().game_info_astring(tempstring), NULL, MENU_FLAG_MULTILINE, NULL);
34}
35
36void ui_menu_game_info::handle()
37{
38   // process the menu
39   process(0);
40}
41
42
43/*-------------------------------------------------
44  ui_menu_image_info - handle the image information
45  menu
46 -------------------------------------------------*/
47
48ui_menu_image_info::ui_menu_image_info(running_machine &machine, render_container *container) : ui_menu(machine, container)
49{
50}
51
52ui_menu_image_info::~ui_menu_image_info()
53{
54}
55
56void ui_menu_image_info::populate()
57{
58   item_append(machine().system().description, NULL, MENU_FLAG_DISABLE, NULL);
59   item_append("", NULL, MENU_FLAG_DISABLE, NULL);
60
61   image_interface_iterator iter(machine().root_device());
62   for (device_image_interface *image = iter.first(); image != NULL; image = iter.next())
63         image_info(image);
64}
65
66void ui_menu_image_info::handle()
67{
68   // process the menu
69   process(0);
70}
71
72
73/*-------------------------------------------------
74  image_info - display image info for a specific
75  image interface device
76-------------------------------------------------*/
77
78void ui_menu_image_info::image_info(device_image_interface *image)
79{
80   if (image->exists())
81   {
82      // display device type and filename
83      item_append(image->brief_instance_name(), image->basename(), 0, NULL);
84
85      // if image has been loaded through softlist, let's add some more info
86      if (image->software_entry())
87      {
88         astring string;
89
90         // display long filename
91         item_append(image->longname(), "", MENU_FLAG_DISABLE, NULL);
92         
93         // display manufacturer and year
94         string.catprintf("%s, %s", image->manufacturer(), image->year());
95         item_append(string, "", MENU_FLAG_DISABLE, NULL);
96
97         // display supported information, if available
98         switch (image->supported())
99         {
100            case SOFTWARE_SUPPORTED_NO:
101               item_append("Not supported", "", MENU_FLAG_DISABLE, NULL);
102               break;
103            case SOFTWARE_SUPPORTED_PARTIAL:
104               item_append("Partially supported", "", MENU_FLAG_DISABLE, NULL);
105               break;
106            default:
107               break;
108         }
109      }
110   }
111   else
112      item_append(image->brief_instance_name(), "[empty]", 0, NULL);
113   item_append("", NULL, MENU_FLAG_DISABLE, NULL);
114}
trunk/src/emu/ui/info.h
r242974r242975
1/***************************************************************************
2
3    ui/info.h
4
5    System and image info screens
6
7    Copyright Nicola Salmoria and the MAME Team.
8    Visit http://mamedev.org for licensing and usage restrictions.
9
10***************************************************************************/
11
12#pragma once
13
14#ifndef __UI_INFO_H__
15#define __UI_INFO_H__
16
17class ui_menu_game_info : public ui_menu {
18public:
19   ui_menu_game_info(running_machine &machine, render_container *container);
20   virtual ~ui_menu_game_info();
21   virtual void populate();
22   virtual void handle();
23};
24
25
26class ui_menu_image_info : public ui_menu
27{
28public:
29   ui_menu_image_info(running_machine &machine, render_container *container);
30   virtual ~ui_menu_image_info();
31   virtual void populate();
32   virtual void handle();
33
34private:
35   void image_info(device_image_interface *image);
36};
37
38#endif // __UI_INFO_H__
trunk/src/emu/ui/mainmenu.c
r242974r242975
1919#include "ui/filemngr.h"
2020#include "ui/filesel.h"
2121#include "ui/barcode.h"
22#include "ui/info.h"
22#include "ui/imginfo.h"
2323#include "ui/inputmap.h"
2424#include "ui/mainmenu.h"
2525#include "ui/miscmenu.h"
r242974r242975
183183         break;
184184
185185      case IMAGE_MENU_FILE_MANAGER:
186         ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_manager(machine(), container, NULL)));
186         ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_manager(machine(), container)));
187187         break;
188188
189189      case TAPE_CONTROL:
trunk/src/emu/ui/miscmenu.c
r242974r242975
1919#include "rendutil.h"
2020
2121#include "uiinput.h"
22#include "ui/ui.h"
2223#include "ui/miscmenu.h"
2324#include "ui/filemngr.h"
2425
r242974r242975
304305
305306
306307/*-------------------------------------------------
308    menu_game_info - handle the game information
309    menu
310-------------------------------------------------*/
311
312ui_menu_game_info::ui_menu_game_info(running_machine &machine, render_container *container) : ui_menu(machine, container)
313{
314}
315
316void ui_menu_game_info::populate()
317{
318   astring tempstring;
319   item_append(machine().ui().game_info_astring(tempstring), NULL, MENU_FLAG_MULTILINE, NULL);
320}
321
322void ui_menu_game_info::handle()
323{
324   /* process the menu */
325   process(0);
326}
327
328ui_menu_game_info::~ui_menu_game_info()
329{
330}
331
332/*-------------------------------------------------
307333    menu_cheat - handle the cheat menu
308334-------------------------------------------------*/
309335
trunk/src/emu/ui/miscmenu.h
r242974r242975
4444   attotime prevtime;
4545};
4646
47class ui_menu_game_info : public ui_menu {
48public:
49   ui_menu_game_info(running_machine &machine, render_container *container);
50   virtual ~ui_menu_game_info();
51   virtual void populate();
52   virtual void handle();
53};
54
4755class ui_menu_cheat : public ui_menu {
4856public:
4957   ui_menu_cheat(running_machine &machine, render_container *container);
trunk/src/emu/ui/selgame.c
r242974r242975
157157      media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
158158
159159      // if everything looks good, schedule the new driver
160      if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE || summary == media_auditor::NONE_NEEDED)
160      if (summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE)
161161      {
162162         machine().manager().schedule_new_driver(*driver);
163163         machine().schedule_hard_reset();
trunk/src/emu/ui/ui.c
r242974r242975
2020#include "uiinput.h"
2121#include "ui/mainmenu.h"
2222#include "ui/miscmenu.h"
23#include "ui/filemngr.h"
2423#include "ui/viewgfx.h"
2524#include "imagedev/cassette.h"
2625#include <ctype.h>
r242974r242975
307306
308307void ui_manager::display_startup_screens(bool first_time, bool show_disclaimer)
309308{
310   const int maxstate = 4;
309   const int maxstate = 3;
311310   int str = machine().options().seconds_to_run();
312311   bool show_gameinfo = !machine().options().skip_gameinfo();
313312   bool show_warnings = true;
r242974r242975
353352            if (show_gameinfo && game_info_astring(messagebox_text).len() > 0)
354353               set_handler(handler_messagebox_anykey, 0);
355354            break;
356
357         case 3:
358            if (image_mandatory_scan(machine(), messagebox_text).len() > 0)
359            {
360               astring warning;
361               warning.cpy("This driver requires images to be loaded in the following device(s): ").cat(messagebox_text.substr(0, messagebox_text.len() - 2));
362               ui_menu_file_manager::force_file_manager(machine(), &machine().render().ui_container(), warning.cstr());
363            }
364            break;
365355      }
366356
367357      // clear the input memory
trunk/src/mame/drivers/20pacgal.c
r242974r242975
341341   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
342342INPUT_PORTS_END
343343
344static INPUT_PORTS_START( 25pacmano )
345   PORT_INCLUDE(20pacgal)
346344
347   PORT_MODIFY("SERVICE")
348   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
349   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
350   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
351   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
352   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
353   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
354INPUT_PORTS_END
355345
356346/*************************************
357347 *
r242974r242975
534524 *************************************/
535525
536526GAME( 2006, 25pacman,          0, 25pacman, 25pacman, _20pacgal_state, 25pacman, ROT90, "Namco / Cosmodog", "Pac-Man - 25th Anniversary Edition (Rev 3.00)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )
537GAME( 2005, 25pacmano,  25pacman, 20pacgal, 25pacmano,_20pacgal_state, 25pacman, ROT90, "Namco / Cosmodog", "Pac-Man - 25th Anniversary Edition (Rev 2.00)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE)
527GAME( 2005, 25pacmano,  25pacman, 20pacgal, 25pacman, _20pacgal_state, 25pacman, ROT90, "Namco / Cosmodog", "Pac-Man - 25th Anniversary Edition (Rev 2.00)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE)
538528
539529GAME( 2000, 20pacgal,          0, 20pacgal, 20pacgal, _20pacgal_state, 20pacgal, ROT90, "Namco / Cosmodog", "Ms. Pac-Man/Galaga - 20th Anniversary Class of 1981 Reunion (V1.08)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE)
540530GAME( 2000, 20pacgalr4, 20pacgal, 20pacgal, 20pacgal, _20pacgal_state, 20pacgal, ROT90, "Namco / Cosmodog", "Ms. Pac-Man/Galaga - 20th Anniversary Class of 1981 Reunion (V1.04)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE)
trunk/src/mame/drivers/itech32.c
r242974r242975
7676    Starting with GT Fore!, I.T. moved to a redesigned hardware platform known as the Eagle platform.
7777        It has a main board with a 3Dfx video card and is hard drive based. This series started with
7878        GT Fore! in 2000 and continued through 2006 ending with Golden Tee Complete. This final
79        version included all the courses from all the previous years in the Fore! series.
79        version incuded all the courses from all the previous years in the Fore! series.
8080        The Eagle platform also supports I.T.'s hunting series "Big Buck Hunter", the light game gun
8181        called Carnival King as well as the limited release game Virtual Pool.
8282
r242974r242975
16151615
16161616   PORT_MODIFY("DIPS")
16171617   PORT_DIPNAME( 0x00100000, 0x00000000, "Trackball Orientation" ) PORT_DIPLOCATION("SW1:4")   /* Determined by actual use / trial & error */
1618   PORT_DIPSETTING(          0x00000000, "Normal Mount" )                      /* The manual says "Always on (default)" and "Off -- UNUSED --" */
1618   PORT_DIPSETTING(          0x00000000, "Normal Mount" )                      /* The manual says "Always on (defualt)" and "Off -- UNUSED --" */
16191619   PORT_DIPSETTING(          0x00100000, "45 Degree Angle" )
16201620   PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")    /* Single controller version -  has no effect */
16211621   PORT_DIPSETTING(          0x00000000, DEF_STR( Off ) )
r242974r242975
16311631
16321632   PORT_MODIFY("DIPS")
16331633   PORT_DIPNAME( 0x00100000, 0x00000000, "Trackball Orientation" ) PORT_DIPLOCATION("SW1:4")   /* Determined by actual use / trial & error */
1634   PORT_DIPSETTING(          0x00000000, "Normal Mount" )                      /* The manual says "Always on (default)" and "Off -- UNUSED --" */
1634   PORT_DIPSETTING(          0x00000000, "Normal Mount" )                      /* The manual says "Always on (defualt)" and "Off -- UNUSED --" */
16351635   PORT_DIPSETTING(          0x00100000, "45 Degree Angle" )
16361636   PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3")
16371637   PORT_DIPSETTING(          0x00000000, DEF_STR( Upright ) )
r242974r242975
24502450   ROM_CONTINUE(                 0x08000, 0x08000 )
24512451
24522452   ROM_REGION( 0x880000, "gfx1", 0 )
2453   /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms:
2453   /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms:
24542454   ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect
24552455   ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) )
24562456   ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) )
r242974r242975
24852485   ROM_CONTINUE(                 0x08000, 0x08000 )
24862486
24872487   ROM_REGION( 0x880000, "gfx1", 0 )
2488   /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms:
2488   /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms:
24892489   ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect
24902490   ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) )
24912491   ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) )
r242974r242975
25202520   ROM_CONTINUE(                 0x08000, 0x08000 )
25212521
25222522   ROM_REGION( 0x880000, "gfx1", 0 )
2523   /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms:
2523   /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms:
25242524   ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect
25252525   ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) )
25262526   ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) )
r242974r242975
25552555   ROM_CONTINUE(                 0x08000, 0x08000 )
25562556
25572557   ROM_REGION( 0x880000, "gfx1", 0 )
2558   /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms:
2558   /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms:
25592559   ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect
25602560   ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) )
25612561   ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) )
r242974r242975
25902590   ROM_CONTINUE(                 0x08000, 0x08000 )
25912591
25922592   ROM_REGION( 0x880000, "gfx1", 0 )
2593   /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms:
2593   /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms:
25942594   ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect
25952595   ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) )
25962596   ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) )
r242974r242975
26252625   ROM_CONTINUE(                 0x08000, 0x08000 )
26262626
26272627   ROM_REGION( 0x880000, "gfx1", 0 )
2628   /* No known set specifically checks for this, however the GROM data may be in the form of four 8 Meg roms:
2628   /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms:
26292629   ROM_LOAD32_BYTE( "wcb_grom0_0_+.grm0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect
26302630   ROM_LOAD32_BYTE( "wcb_grom0_1_+.grm0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) )
26312631   ROM_LOAD32_BYTE( "wcb_grom0_2_+.grm0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) )
r242974r242975
33543354   ROM_LOAD32_BYTE( "gtg3_grom0_3++.grm0_3", 0x000003, 0x100000, CRC(1173a710) SHA1(1f612c1efbf38796707f5b5fecf9d4044691f031) )
33553355   /*
33563356   The above 4 roms have the same exact data as the other sets, but in 8 meg roms instead of 4 meg roms.
3357   This is the only set that specifically checks for these roms in this format
3357   This is the only set that specificaly checks for these roms in this format
33583358   */
33593359   ROM_LOAD32_BYTE( "gtg3_grom1_0+.grm1_0", 0x400000, 0x080000, CRC(80ae7148) SHA1(e19d3390a2a0dad260d770fdbbb64d1f8e43d53f) ) /* actually labeled "GTG3 GROM1_0*" ect */
33603360   ROM_LOAD32_BYTE( "gtg3_grom1_1+.grm1_1", 0x400001, 0x080000, CRC(0f85a618) SHA1(d9ced21c20f9ed6b7f19e7645d75b239ea709b79) )
r242974r242975
40364036   ROM_LOAD32_BYTE( "gt2k_grom1_3.grm1_3", 0x200003, 0x80000, CRC(59f48688) SHA1(37b2c84e487f4f3a9145bef34c573a3716b4a6a7) )
40374037
40384038   /* GT99, GT2K & GT Classic all share the above listed 8 graphics roms and may be labeled GT99, GT2K or GTClassic */
4039   /* The Euro version has different GROM2_x compared to the standard US versions.  GT Supreme PCBs have been seen  */
4039   /* The Euro version has different GROM2_x compared to the standard US versions.  GT Superme PCBs have been seen  */
40404040   /* with GT 2K mask roms as well as all GROMs labeled "GT SUPREME" */
40414041
40424042   ROM_LOAD32_BYTE( "gt_supreme_grom2_0.grm2_0", 0x400000, 0x80000, CRC(33998a3e) SHA1(53832e37c42155eb9c774eb33b8b36fe387fa162) )
r242974r242975
45054505    NOTE: Due to various different upgrade packages from IT, the 3 tier boards can end up with any combination
45064506        of rom boards and sound boards.  For historical reasons, GTG3 3 tier S versions will use the oldest
45074507        sound file set up. Version L will use the newer Ensoniq sample rom and v2.X sound code, while gt97
4508        through gtclassic will use the latest "NR" versions.
4508        through gtclassic will use the lastest "NR" versions.
45094509
45104510  GT Diamond Edition Tournament is a Euro GT98 with different GROM2_0 through GROM2_3
45114511  GT Royal Edition Tournament is a Euro GT99
45124512  GT Supreme Edition Tournament is a Euro GT2K with different GROM2_0 through GROM2_3
45134513     GT Supreme (on a real PCB with actual tournament data) comes up with a different title screen and is (c) 2002
4514     showing the title as GT Supreme Plus! and the Hole-In-One board shows an additional course, Coconut Cove from GT99
4514     showing the title as GT Supreme Plus! and the Hole-In-One board shows an aditional course, Coconut Cove from GT99
45154515     Current emulation does not reproduce this extra title screen due to missing tournament data.
45164516  There doesn't seem to be a Euro version of GT Classic (at least none have been found).
45174517
45184518NOTE: There is an "8 Meg board" version of the P/N 1083 Rev 2 PCB, so GROM0_0 through GROM0_3 are 8 meg roms and labeled "GTxx GROM0_0 **" ect
45194519      while GROM1_0 through GROM1_3 are 4 meg roms matching "4 Meg board" GROM2_0 through GROM2_3 and are labeled "GTxx GROM1_0 *" ect
4520      It is possible to find these rom combinations on any given GT board set.  There is only 1 known GT set which specifically checks for 8 meg
4520      It is possible to find these rom combinations on any given GT board set.  There is only 1 known GT set which specificly checks for 8 meg
45214521      roms under the GROM Checksum test.
45224522
45234523    Parent set will always be gt(year) with the most recent version.  IE: gt97 is Golden Tee '97 v1.30
trunk/src/mame/drivers/naomi.c
r242974r242975
521521Star Horse (satellite)                          840-0056C  23627    6 (128Mb)* 315-6319   315-6213  not present   * +1 (64Mb), requires 837-13785 ARCNET&IO BD
522522Star Horse Progress (satellite) (Rev A)         840-0123C  24122A   7 (128Mb)  315-6319A  315-6213  not present   requires 837-13785 ARCNET&IO BD
523523The King of Route 66 (Rev A)                    840-0087C  23819A  10 (128Mb)  315-6319A  315-6213  not present
524Virtua Striker 3                                840-0061C  23663   11 (128Mb)  315-6319A  315-6213  317-0310-COM
525524Virtua Striker 3 (Rev B)                        840-0061C  23663B  11 (128Mb)  315-6319A  315-6213  317-0310-COM
525Virtua Striker 3 (Rev C)                        840-0061C  23663C  11 (128Mb)  315-6319A  315-6213  317-0310-COM
526526Wave Runner GP                                  840-0064C  24059    6 (128Mb)  315-6319A  315-6213  not present
527527Wild Riders                                     840-0046C  23622   10 (128Mb)  315-6319A  315-6213  317-0301-COM
528528WWF Royal Rumble                                840-0040C  22261    8 (128Mb)  315-6319   315-6213  317-0285-COM
r242974r242975
60146014   ROM_LOAD( "wk1ma10.4c",  0xa000000, 0x1000000, CRC(e96f312c) SHA1(0a92640277111aef5c6e9dab4218a8ae2196ce61) )
60156015
60166016   ROM_REGION( 4, "rom_key", 0 )
6017   ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(1708ebb9) SHA1(c1115e4dd675f10d5fb41f57c1eea8e6a4f09fed) )
6017   ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(c1e3000b) SHA1(36c2546833effe9452e2b3f7d31335fc5e349f49) )
60186018ROM_END
60196019
60206020ROM_START( wldkicksa )
r242974r242975
60366036   ROM_LOAD( "wk1ma10.4c",  0xa000000, 0x1000000, CRC(e96f312c) SHA1(0a92640277111aef5c6e9dab4218a8ae2196ce61) )
60376037
60386038   ROM_REGION( 4, "rom_key", 0 )
6039   ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(1708ebb9) SHA1(c1115e4dd675f10d5fb41f57c1eea8e6a4f09fed) )
6039   ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(c1e3000b) SHA1(36c2546833effe9452e2b3f7d31335fc5e349f49) )
60406040ROM_END
60416041
60426042ROM_START( wldkicksb )
r242974r242975
60586058   ROM_LOAD( "wk1ma10.4c",  0xa000000, 0x1000000, CRC(e96f312c) SHA1(0a92640277111aef5c6e9dab4218a8ae2196ce61) )
60596059
60606060   ROM_REGION( 4, "rom_key", 0 )
6061   ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(1708ebb9) SHA1(c1115e4dd675f10d5fb41f57c1eea8e6a4f09fed) )
6061   ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(c1e3000b) SHA1(36c2546833effe9452e2b3f7d31335fc5e349f49) )
60626062ROM_END
60636063
60646064ROM_START( toukon4 )
r242974r242975
60856085   ROM_LOAD( "trf1ma15.6l", 0xf000000, 0x1000000, CRC(42d318c5) SHA1(f9fe82ffbfc51fcb52333f94c55a7092e7124fb4) )
60866086
60876087   ROM_REGION( 4, "rom_key", 0 )
6088   ROM_LOAD( "tr4ae-key.bin", 0x000000, 0x000004, CRC(1708ebb9) SHA1(c1115e4dd675f10d5fb41f57c1eea8e6a4f09fed) )
6088   ROM_LOAD( "tr4ae-key.bin", 0x000000, 0x000004, CRC(986a7cee) SHA1(70c3ff80f86de6a0655251658c66a156fb644995) )
60896089ROM_END
60906090
60916091ROM_START( ninjaslt )
r242974r242975
77907790   NAOMI_DEFAULT_EEPROM
77917791
77927792   ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF)
7793   // rom was handmade from 2 damaged dumps, needs to be verified
7794   ROM_LOAD( "epr-23663.ic22", 0x0000000, 0x0400000, BAD_DUMP CRC(6910a008) SHA1(865affff1cf31321725ef727a17be384555e3aae) )
7793   ROM_LOAD( "epr-23663c.ic22",0x0000000, 0x0400000, CRC(7007fec7) SHA1(523168f0b218d0bd5c815d65bf0caba2c8468c9d) )
77957794   ROM_LOAD( "mpr-23652.ic1",  0x0800000, 0x1000000, CRC(992758a2) SHA1(5e2a25c520c1795128e5026fc00d355c24852ded) )
77967795   ROM_LOAD( "mpr-23653.ic2",  0x1800000, 0x1000000, CRC(e210e932) SHA1(2f6f0a31c3e98b21f1ff3af1680e50b3535b130f) )
77977796   ROM_LOAD( "mpr-23654.ic3",  0x2800000, 0x1000000, CRC(91335971) SHA1(fc7599b836fb7995dd7da940e64b08b3c09cb180) )
r242974r242975
78057804   ROM_LOAD( "mpr-23662.ic11", 0xa800000, 0x0800000, CRC(d6ef7d68) SHA1(4ee396af6c5caf4c5af6e9ad0e03a7ac2c5039f4) )
78067805
78077806   ROM_REGION( 4, "rom_key", 0 )
7808   ROM_LOAD( "vstrik3c-key.bin", 0, 4, CRC(8c9012fe) SHA1(d81e00d6377a3f0eeed01dc523707e36ca1b434d) )
7807   ROM_LOAD( "vstrik3c-key.bin", 0, 4, CRC(049f41b0) SHA1(4ea444878c8e9288ec95b1763d48bc92c634acdd) )
78097808ROM_END
78107809
78117810ROM_START( vstrik3cb )
r242974r242975
78277826   ROM_LOAD( "mpr-23662.ic11", 0xa800000, 0x0800000, CRC(d6ef7d68) SHA1(4ee396af6c5caf4c5af6e9ad0e03a7ac2c5039f4) )
78287827
78297828   ROM_REGION( 4, "rom_key", 0 )
7830   ROM_LOAD( "vstrik3c-key.bin", 0, 4, CRC(8c9012fe) SHA1(d81e00d6377a3f0eeed01dc523707e36ca1b434d) )
7829   ROM_LOAD( "vstrik3c-key.bin", 0, 4, CRC(049f41b0) SHA1(4ea444878c8e9288ec95b1763d48bc92c634acdd) )
78317830ROM_END
78327831
78337832ROM_START( wldrider )
r242974r242975
78487847   ROM_LOAD( "mpr-23620.ic10", 0x9800000, 0x1000000, CRC(67aa15a9) SHA1(42c24cbf7069c27430a71509a872cd1c4224aaeb) )
78497848
78507849   ROM_REGION( 4, "rom_key", 0 )
7851   ROM_LOAD( "wldrider-key.bin", 0, 4, CRC(7ac4f5fa) SHA1(5d08ecfbdc5f4bf26a9ea521a647c93141e7f635) )
7850   ROM_LOAD( "wldrider-key.bin", 0, 4, CRC(f5a662ad) SHA1(a75b1e490d1f7d57cd8976115572266d1ca05202) )
78527851ROM_END
78537852
78547853ROM_START( vf4cart )
r242974r242975
78707869   ROM_LOAD( "mpr-23784.ic11", 0xa800000, 0x1000000, CRC(f74f2fee) SHA1(84b07baa6d116727e66ef27e24ba6484c3393891) )
78717870
78727871   ROM_REGION( 4, "rom_key", 0 )
7873   ROM_LOAD( "vf4cart-key.bin", 0, 4, CRC(aa8cdd58) SHA1(e282b7d215044a005b50c8553b8056f3d599135c) )
7872   ROM_LOAD( "vf4cart-key.bin", 0, 4, CRC(22838e16) SHA1(afee674dce3cfdd20360c30da2da5ba69f8d4682) )
78747873ROM_END
78757874
78767875// There is also a development cart (171-7885A) with 20x 64Mb FlashROMs instead of 10x 128Mb MaskROMs. Content is the same.
r242974r242975
79937992   ROM_LOAD( "mpr-23703.ic11", 0xa800000, 0x1000000, CRC(702b8b4a) SHA1(3a8dfde458f341e7db20664382b9fce2b6e5d462) )
79947993
79957994   ROM_REGION( 4, "rom_key", 0 )
7996   ROM_LOAD( "clubkrte-key.bin", 0, 4, CRC(5420fd0a) SHA1(06cb480c12f0ddc10e7601d34c5f42dda6ac6145) )
7995   ROM_LOAD( "clubkrte-key.bin", 0, 4, CRC(db426a5d) SHA1(6a6a0b80ec0416605541159efea379dc19fe796d) )
79977996ROM_END
79987997
79997998ROM_START( clubkrtd )
r242974r242975
90359034
90369035/* 840-xxxxx (Sega Naomi 2 cart games) */
90379036/* 0046 */ GAME( 2001, wldrider, naomi2,  naomi2m2, naomi, naomi_state, naomi2,   ROT0, "Sega", "Wild Riders (JPN, USA, EXP, KOR, AUS)", GAME_FLAGS )
9038/* 0061 */ GAME( 2001, vstrik3c, naomi2,  naomi2m2, naomi, naomi_state, naomi2,   ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart)", GAME_FLAGS )
9037/* 0061 */ GAME( 2001, vstrik3c, naomi2,  naomi2m2, naomi, naomi_state, naomi2,   ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev C)", GAME_FLAGS )
90399038/* 0061 */ GAME( 2001, vstrik3cb,vstrik3c,naomi2m2, naomi, naomi_state, naomi2,   ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev B)", GAME_FLAGS )
90409039/* 0062 */ GAME( 2001, clubkrte, naomi2,  naomi2m2, naomi, naomi_state, naomi2,   ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
90419040/* 0062 */ GAME( 2001, clubkrtd, clubkrte,naomi2m2, naomi, naomi_state, naomi2,   ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
trunk/src/mame/drivers/snowbros.c
r242974r242975
185185   if (ACCESSING_BITS_0_7) soundlatch_byte_w(space,0,data & 0xff);
186186}
187187
188READ16_MEMBER(snowbros_state::toto_read)
189{
190   int pc = space.device().safe_pc();
191   if ((pc!= 0x3f010) && (pc!= 0x38008)) printf("toto prot %08x %04x\n", pc, mem_mask);
192   return 0x0700;
193}
194
195188/* Snow Bros Memory Map */
196189
197190static ADDRESS_MAP_START( snowbros_map, AS_PROGRAM, 16, snowbros_state )
r242974r242975
19621955   ROM_LOAD16_BYTE( "wb09.bin",     0x60001, 0x10000, CRC(9be718ca) SHA1(5c195e4f13efbdb229201d2408d018861bf389cc) )
19631956ROM_END
19641957
1965ROM_START( toto )
1966   ROM_REGION( 0x40000, "maincpu", 0 )
1967   ROM_LOAD16_BYTE( "u60.5j",  0x00000, 0x20000, CRC(39203792) SHA1(4c8d560be02a514cbf91774c7a0b4a95cf573356) )
1968   ROM_LOAD16_BYTE( "u51.4j",  0x00001, 0x20000, CRC(7b846cd4) SHA1(04aa0bbaab4303fb08dff52d5515f7e764f1be6d))
1969
1970   ROM_REGION( 0x10000, "soundcpu", 0 )    /* 64k for z80 sound code */
1971   ROM_LOAD( "u46.4c",   0x0000, 0x8000, CRC(77b1ef42) SHA1(75e3c8c2b687669cc56f972dd7375dab5185859c) )
1972
1973   ROM_REGION( 0x80000, "gfx1", 0 )
1974   ROM_LOAD( "u107.8k",          0x00000, 0x20000, CRC(4486153b) SHA1(a6dc0c17bf2328ab725bce4aaa0a413a42129fb0) )
1975   ROM_LOAD( "u108.8l",          0x20000, 0x20000, CRC(3286cf5f) SHA1(133366b0e10ab86111247cbedf329e8e3a7f2148) )
1976   ROM_LOAD( "u109.8m",          0x40000, 0x20000, CRC(464d7251) SHA1(f03ee54e9301ea87de4171cecdbad4a5e17929c4) )
1977   ROM_LOAD( "u110.8n",          0x60000, 0x20000, CRC(7dea56df) SHA1(7e7b9238837c6f4221cff416a2de21723d2c9272) )
1978ROM_END
1979
19801958/* Barko */
19811959
19821960ROM_START( honeydol )
r242974r242975
28882866
28892867
28902868
2891DRIVER_INIT_MEMBER(snowbros_state,toto)
2892{
2893   // every single rom has bits 0x10 and 0x08 swapped
2894   UINT8 *src = memregion("maincpu")->base();
2895   int len = memregion("maincpu")->bytes();
2896
2897   for (int i = 0; i < len; i++)
2898   {
2899      src[i] = BITSWAP8(src[i], 7, 6, 5, 3, 4, 2, 1, 0);
2900   }
2901
2902   src = memregion("gfx1")->base();
2903   len = memregion("gfx1")->bytes();
2904
2905   for (int i = 0; i < len; i++)
2906   {
2907      src[i] = BITSWAP8(src[i], 7, 6, 5, 3, 4, 2, 1, 0);
2908   }
2909
2910   src = memregion("soundcpu")->base();
2911   len = memregion("soundcpu")->bytes();
2912
2913   for (int i = 0; i < len; i++)
2914   {
2915      src[i] = BITSWAP8(src[i], 7, 6, 5, 3, 4, 2, 1, 0);
2916   }
2917
2918   // protection? (just return 0x07)
2919   m_maincpu->space(AS_PROGRAM).install_read_handler(0x500006, 0x500007, read16_delegate(FUNC(snowbros_state::toto_read),this));
2920}
2921
2922
2923
29242869GAME( 1990, snowbros,  0,        snowbros, snowbros, driver_device, 0, ROT0, "Toaplan",                        "Snow Bros. - Nick & Tom (set 1)", 0 )
29252870GAME( 1990, snowbrosa, snowbros, snowbros, snowbros, driver_device, 0, ROT0, "Toaplan",                        "Snow Bros. - Nick & Tom (set 2)", 0 )
29262871GAME( 1990, snowbrosb, snowbros, snowbros, snowbros, driver_device, 0, ROT0, "Toaplan",                        "Snow Bros. - Nick & Tom (set 3)", 0 )
r242974r242975
29302875GAME( 1990, wintbob,   snowbros, wintbob,  snowbros, driver_device, 0, ROT0, "bootleg (Sakowa Project Korea)", "The Winter Bobble (bootleg of Snow Bros.)", 0 )
29312876GAME( 1990, snowbroswb,snowbros, wintbob,  snowbros, driver_device, 0, ROT0, "bootleg",                        "Snow Bros. - Nick & Tom (The Winter Bobble hardware bootleg)", 0 ) // this was probably unhacked back from the more common Winter Bobble to make it look more original
29322877
2933GAME( 1996, toto,      0,        snowbros, snowbros, snowbros_state, toto, ROT0, "SoftClub",                    "Come Back Toto", 0 ) // modified from 'snowbros' code
2934
29352878// none of the games below are on genuine SnowBros hardware, but they clone the functionality of it.
29362879
29372880// SemiCom / Jeil titles are protected, a dumb MCU copies code into RAM at startup, some also check for a specific return value from an address on startup.
trunk/src/mame/drivers/twinkle.c
r242974r242975
254254      m_maincpu(*this, "maincpu"),
255255      m_audiocpu(*this, "audiocpu")
256256   {
257      m_spu_hle[0x200] = 0;
258      m_spu_hle[0x202] = 0;
257259   }
258260
259261   required_device<am53cf96_device> m_am53cf96;
r242974r242975
262264
263265   UINT16 m_spu_ctrl;      // SPU board control register
264266   UINT8 m_spu_shared[0x400];  // SPU/PSX shared dual-ported RAM
267   UINT8 m_spu_hle[0x400];
265268   UINT32 m_spu_ata_dma;
266269   int m_spu_ata_dmarq;
267270
r242974r242975
282285   DECLARE_WRITE16_MEMBER(twinkle_waveram_w);
283286   DECLARE_READ16_MEMBER(shared_68k_r);
284287   DECLARE_WRITE16_MEMBER(shared_68k_w);
285   DECLARE_READ16_MEMBER(unk_68k_r);
286288   DECLARE_WRITE_LINE_MEMBER(spu_ata_irq);
287289   DECLARE_WRITE_LINE_MEMBER(spu_ata_dmarq);
288290   required_device<cpu_device> m_maincpu;
r242974r242975
669671
670672WRITE8_MEMBER(twinkle_state::shared_psx_w)
671673{
672//   printf("shared_psx_w: %04x, %04x, %04x\n", offset, data, mem_mask);
674   //printf("shared_psx_w: %04x, %04x, %04x\n", offset, data, mem_mask);
673675
674676   m_spu_shared[offset] = data;
675677
678   // HLE sound board
679   m_spu_hle[offset] = data;
680
676681   if (offset == 0x03fe && data == 0xff)
677682   {
678//      printf("spu command %02x %02x\n", m_spu_shared[1], m_spu_shared[3]);
683      //printf("spu command %02x %02x\n", m_spu_hle[1], m_spu_hle[3]);
679684
680      m_audiocpu->set_input_line(M68K_IRQ_4, HOLD_LINE);
685      for (int i = 0x200; i < 0x300; i++) m_spu_hle[i] = 0xea;
686
687      switch (m_spu_hle[1])
688      {
689      case 0x91: // hdd sum 1
690         m_spu_hle[0x200] = 0; // ?
691         m_spu_hle[0x202] = 0; // ?
692         break;
693
694      case 0x9a: // hdd sum 2
695         m_spu_hle[0x200] = 0; // ?
696         m_spu_hle[0x202] = 0; // ?
697         m_spu_hle[0x203] = 1; // Must be 1 to pass test
698         break;
699
700      case 0xa1: // version
701         m_spu_hle[0x200] = 0; // ?
702         m_spu_hle[0x202] = 0; // ?
703
704         if (strcmp(machine().system().name, "bmiidx") == 0 ||
705            strcmp(machine().system().name, "bmiidxa") == 0 ||
706            strcmp(machine().system().name, "bmiidxc") == 0 ||
707            strcmp(machine().system().name, "bmiidxca") == 0)
708         {
709            strcpy((char *)&m_spu_hle[0x204], "GQ863JA_A");
710         }
711         else if (strcmp(machine().system().name, "bmiidxs") == 0 ||
712            strcmp(machine().system().name, "bmiidxc2") == 0)
713         {
714            strcpy((char *)&m_spu_hle[0x204], "GC983JA_R");
715         }
716         else if (strcmp(machine().system().name, "bmiidx2") == 0)
717         {
718            strcpy((char *)&m_spu_hle[0x204], "GC985JA_A");
719         }
720         else if (strcmp(machine().system().name, "bmiidx3") == 0 ||
721            strcmp(machine().system().name, "bmiidx3a") == 0)
722         {
723            strcpy((char *)&m_spu_hle[0x204], "GC992JA_A");
724         }
725         else if (strcmp(machine().system().name, "bmiidx4") == 0)
726         {
727            strcpy((char *)&m_spu_hle[0x204], "GCA03JA_A");
728         }
729         else if (strcmp(machine().system().name, "bmiidx5") == 0)
730         {
731            strcpy((char *)&m_spu_hle[0x204], "GCA17JA_A");
732         }
733         else if (strcmp(machine().system().name, "bmiidx6") == 0 ||
734            strcmp(machine().system().name, "bmiidx6a") == 0)
735         {
736            strcpy((char *)&m_spu_hle[0x204], "GCB4UJA_A");
737         }
738         else if (strcmp(machine().system().name, "bmiidx7") == 0)
739         {
740            strcpy((char *)&m_spu_hle[0x204], "GCB44JA_A");
741         }
742         else if (strcmp(machine().system().name, "bmiidx8") == 0)
743         {
744            strcpy((char *)&m_spu_hle[0x204], "GCC44JA_A");
745         }
746         break;
747
748      case 0x30: // play sound [3]=sound code
749      case 0x51: // sound off
750      case 0x25: // spu rom error ([3]==0x0f)
751      case 0x26: // spu rom error ([3]==0x0f)
752      case 0x08: // spu rom error
753      case 0x40: // spu rom error ([3]==0x01 coin sound?)
754      case 0x2f: // spu rom error
755      case 0x52: // spu rom error
756      case 0x04: // spu rom error ([3]==?)
757         m_spu_hle[0x200] = 0;
758         m_spu_hle[0x202] = 0;
759         break;
760      }
681761   }
682762}
683763
684764READ8_MEMBER(twinkle_state::shared_psx_r)
685765{
686   UINT32 result = m_spu_shared[offset];
766   //UINT32 result = m_spu_shared[offset];
767   UINT32 result = m_spu_hle[offset];
687768
688769   //printf("shared_psx_r: %04x, %04x, %04x\n", offset, result, mem_mask);
689770
r242974r242975
722803/*
723804    System control register (Konami always has one)
724805
725    bit 7  = write 0 to ack IRQ 1, write 1 to enable (IRQ 1 appears to be an RF5C400-related timer, or some free-running timing source)
806    bit 7  = write 0 to ack IRQ 1, write 1 to enable (IRQ 1 appears to be vblank)
726807    bit 8  = write 0 to ack IRQ 2, write 1 to enable (IRQ 2 appears to be DMA completion)
727    bit 9  = write 0 to ack IRQ 4, write 1 to enable (IRQ 4 is "command available")
728    bit 10 = write 0 to ack IRQ 6, write 1 to enable (IRQ 6 is the ATA IRQ)
729    bit 11 = watchdog toggle
808    bit 9  = write 0 to ack IRQ 4, write 1 to enable (IRQ 4 appears to be "command sent", unsure how the MIPS causes it yet however)
809    bit 10 = write 0 to ack IRQ 6, write 1 to enable (IRQ 6 is IDE)
810    bit 11 = watchdog toggle?
730811
731812    Other bits unknown.
732813*/
r242974r242975
755836WRITE16_MEMBER(twinkle_state::spu_ata_dma_low_w)
756837{
757838   m_spu_ata_dma = (m_spu_ata_dma & ~0xffff) | data;
839
840   //printf("dma_low %08x\n", m_spu_ata_dma * 2);
758841}
759842
760843WRITE16_MEMBER(twinkle_state::spu_ata_dma_high_w)
761844{
762845   m_spu_ata_dma = (m_spu_ata_dma & 0xffff) | (data << 16);
846
847   //printf("dma_high %08x\n", m_spu_ata_dma * 2);
763848}
764849
765850WRITE_LINE_MEMBER(twinkle_state::spu_ata_dmarq)
r242974r242975
779864            //waveram[m_spu_ata_dma++] = (data >> 8) | (data << 8);
780865            // bp 4a0e ;bmiidx4 checksum
781866            // bp 4d62 ;bmiidx4 dma
782
783            // $$$HACK - game DMAs nothing useful to 0x400000 but all sound plays are 0x400000 or above
784            //           so limit sound RAM to 4MB (there's 6 MB on the board) and let the 5c400's address masking
785            //           work for us until we figure out what's actually going on.
786            if (m_spu_ata_dma < 0x200000)
787            {
788               m_waveram[m_spu_ata_dma++] = data;
789            }
867            m_waveram[m_spu_ata_dma++] = data;
790868         }
791869
792870         m_ata->write_dmack(CLEAR_LINE);
r242974r242975
808886{
809887   UINT16 result = m_spu_shared[offset];
810888
811//   printf("shared_68k_r: %04x, %04x, %04x\n", offset, result, mem_mask);
889   //printf("shared_68k_r: %04x, %04x, %04x\n", offset, result, mem_mask);
812890
813891   return result;
814892}
815893
816894WRITE16_MEMBER(twinkle_state::shared_68k_w)
817895{
818//   printf("shared_68k_w: %04x, %04x, %04x\n", offset, data, mem_mask);
896   //printf("shared_68k_w: %04x, %04x, %04x\n", offset, data, mem_mask);
819897
820898   m_spu_shared[offset] = data & 0xff;
821899}
822900
823READ16_MEMBER(twinkle_state::unk_68k_r)
824{
825   return 0xffff;   // must return 0xff for 68000 POST to complete properly
826}
827
828901static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 16, twinkle_state )
829902   AM_RANGE(0x000000, 0x07ffff) AM_ROM
830903   AM_RANGE(0x100000, 0x13ffff) AM_RAM
831   AM_RANGE(0x200000, 0x200001) AM_READ(unk_68k_r)
832904   // 220000 = LEDs?
833905   AM_RANGE(0x230000, 0x230003) AM_WRITE(twinkle_spu_ctrl_w)
834906   AM_RANGE(0x240000, 0x240003) AM_WRITE(spu_ata_dma_low_w)
r242974r242975
837909   AM_RANGE(0x280000, 0x280fff) AM_READWRITE(shared_68k_r, shared_68k_w)
838910   AM_RANGE(0x300000, 0x30000f) AM_DEVREADWRITE("ata", ata_interface_device, read_cs0, write_cs0)
839911   // 34000E = ???
840   AM_RANGE(0x34000e, 0x34000f) AM_WRITENOP
841912   AM_RANGE(0x400000, 0x400fff) AM_DEVREADWRITE("rfsnd", rf5c400_device, rf5c400_r, rf5c400_w)
842   AM_RANGE(0x800000, 0xbfffff) AM_READWRITE(twinkle_waveram_r, twinkle_waveram_w )
843   AM_RANGE(0xfe0000, 0xffffff) AM_RAM   // ...and the RAM test checks this last 128k (mirror of the work RAM at 0x100000?)
913   AM_RANGE(0x800000, 0xffffff) AM_READWRITE(twinkle_waveram_r, twinkle_waveram_w )    // 8 MB window wave RAM
844914ADDRESS_MAP_END
845915
846916/* SCSI */
r242974r242975
9411011
9421012   MCFG_CPU_ADD("audiocpu", M68000, 32000000/2)    /* 16.000 MHz */
9431013   MCFG_CPU_PROGRAM_MAP( sound_map )
944   MCFG_CPU_PERIODIC_INT_DRIVER(twinkle_state, irq1_line_assert, 60)
945   MCFG_CPU_PERIODIC_INT_DRIVER(twinkle_state, irq2_line_assert, 60)
9461014
9471015   MCFG_WATCHDOG_TIME_INIT(attotime::from_msec(1200)) /* check TD pin on LTC1232 */
9481016
r242974r242975
10811149   ROM_REGION32_LE( 0x080000, "audiocpu", 0 )\
10821150   ROM_LOAD16_WORD_SWAP( "863a05.2x",    0x000000, 0x080000, CRC(6f42a09e) SHA1(cab5209f90f47b9ee6e721479913ad74e3ba84b1) )\
10831151\
1084   ROM_REGION16_LE(0x400000, "rfsnd", ROMREGION_ERASE00)
1152   ROM_REGION16_LE(0x1800000, "rfsnd", ROMREGION_ERASE00)
10851153
10861154ROM_START( gq863 )
10871155   TWINKLE_BIOS
trunk/src/mame/includes/mario.h
r242974r242975
33
44#include "machine/z80dma.h"
55
6#define OLD_SOUND   (1)
6#define OLD_SOUND   (0)
77
88#if !OLD_SOUND
99#include "machine/netlist.h"
trunk/src/mame/includes/snowbros.h
r242974r242975
5555   DECLARE_DRIVER_INIT(4in1boot);
5656   DECLARE_DRIVER_INIT(3in1semi);
5757   DECLARE_DRIVER_INIT(cookbib2);
58   DECLARE_DRIVER_INIT(toto);
59   DECLARE_READ16_MEMBER(toto_read);
6058   DECLARE_MACHINE_RESET(semiprot);
6159   DECLARE_MACHINE_RESET(finalttr);
6260   UINT32 screen_update_snowbros(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
trunk/src/mame/machine/315-5881_crypt.c
r242974r242975
121121The encryption is done by a stream cipher operating in counter mode, which use a 16-bits internal block cipher.
122122
123123There are 2 "control bits" at the start of the decrypted stream which control the mode of operation: bit #1 set to 1 means
124that the stream needs to be decompressed after being decrypted. More on this later.
124that the decrypted stream needs to be decompressed after being decrypted. More on this later.
125125
126126The next 16-bits are part of the header (they don't belong to the plaintext), but his meaning is unclear. It has been
127127conjectured that it could stablish when to "reset" the process and start processing a new stream (based on some tests
r242974r242975
134134given plaintext word, and the remaining 2 to the next plaintext word.
135135
136136The underlying block cipher consists of two 4-round Feistel Networks (FN): the first one takes the counter (16 bits),
137the game-key (>=27 bits) and the sequence-key (16 bits) and output a middle result (16 bits) which will act as another key
137the game-key (>=26 bits) and the sequence-key (16 bits) and output a middle result (16 bits) which will act as another key
138138for the second one. The second FN will take the encrypted word (16 bits), the game-key, the sequence-key and the result
139139from the first FN and will output the decrypted word (16 bits).
140140
141Each round of the Feistel Networks use four substitution sboxes, each having 6 inputs and 2 outputs. The input is the
142XOR of at most one bit from the previous round and at most one bit from the different keys.
141Each round of the Feistel Networks use four substitution sboxes, each having 6 inputs and 2 outputs. The input can be the
142XOR of at most two "sources bits", being source bits the bits from the previous round and the bits from the different keys.
143143
144144The underlying block cipher has the same structure than the one used by the CPS-2 (Capcom Play System 2) and,
145145indeed, some of the used sboxes are exactly the same and appear in the same FN/round in both systems (this is not evident,
r242974r242975
151151some (encrypted word-decrypted word) pairs suffice. However, due to the weak key scheduling, it should be noted that some
152152related keys can produce the same output bytes for some (short) input sequences.
153153
154The only difference in the decryption process between M2 and M3 is the initialization of the counter. In M3, the counter is
155always set to 0 at the beginning of the decryption while, in M2, the bits #1-#16 of the ciphertext's address are used
156to initialize the counter.
157
154158Note that this implementation considers that the counter initialization for ram decryption is 0 simply because the ram is
155159mapped to multiples of 128K.
156160
r242974r242975
160164chosen so as to make the key for CAPSNK equal to 0.
161165
162166It can be observed that a couple of sboxes have incomplete tables (a 255 value indicate an unknown value). The recovered keys
163as of january/2015 show small randomness and big correlations, making possible that some unseen bits could make the
167as of december/2010 show small randomness and big correlations, making possible that some unseen bits could make the
164168decryption need those incomplete parts.
165169
166170****************************************************************************************/
r242974r242975
474478   {1,29},  {1,71},  {2,4},   {2,54},  {3,8},   {4,56},  {4,73},  {5,11},
475479   {6,51},  {7,92},  {8,89},  {9,9},   {9,10},  {9,39},  {9,41},  {9,58},
476480   {9,59},  {9,86},  {10,90}, {11,6},  {12,64}, {13,49}, {14,44}, {15,40},
477    {16,69}, {17,15}, {18,23}, {18,43}, {19,82}, {20,81}, {21,32}, {22,5},
478   {23,66}, {24,13}, {24,45}, {25,12}, {25,35}, {26,61},
481   {16,69}, {17,15}, {18,23}, {18,43}, {19,82}, {20,81}, {21,32}, {21,61},
482   {22,5},  {23,66}, {24,13}, {24,45}, {25,12}, {25,35}
479483};
480484
481485const int sega_315_5881_crypt_device::fn2_game_key_scheduling[34][2] = {
482486   {0,0},   {1,3},   {2,11},  {3,20},  {4,22},  {5,23},  {6,29},  {7,38},
483487   {8,39},  {9,47},  {9,55},  {9,86},  {9,87},  {9,90},  {10,50}, {10,53},
484488   {11,57}, {12,59}, {13,61}, {13,64}, {14,63}, {15,67}, {16,72}, {17,83},
485    {18,88}, {19,94}, {20,35}, {21,17}, {22,6},  {22,11}, {23,85}, {24,16},
486   {25,25}, {26,92}
489   {18,88}, {19,94}, {20,35}, {21,17}, {21,92}, {22,6},  {22,11}, {23,85},
490   {24,16}, {25,25}
487491};
488492
489493const int sega_315_5881_crypt_device::fn1_sequence_key_scheduling[20][2] = {
trunk/src/mame/machine/naomicrypt.c
r242974r242975
2828{
2929   // name             key              gameid #         year
3030// M2
31   { "wldkicks",        0x052e2901 }, // 25209801    2000
32   { "toukon4",         0x052e2901 }, // 25349801    2000
31   { "wldkicks",        0x00ae2901 }, // 25209801    2000
32   { "toukon4",         0x012e2901 }, // 25349801    2000
3333   { "ninjaslt",        0x000ca510 }, // 25469801    2000
3434   { "ninjaslt4",       0x000ca510 }, // 25469801    2000
3535   { "gunsur2e",        0x000680d0 }, // 25709801    2001
r242974r242975
6868   { "alienfnt",        0x00174343 }, // 840-0048    2001
6969   { "alienfnta",       0x00174343 }, // 840-0048    2001
7070   { "crackdj2",        0x00428247 }, // 840-0068    2001
71   { "vf4cart",         0x06ef2f92 }, // 840-0080    2002
71   { "vf4cart",         0x02ef2f96 }, // 840-0080    2002
7272   { "pstone",          0x000e69c1 }, // 841-0001    1999
7373   { "suchie3",         0x000368e1 }, // 841-0002    1999
7474   { "doa2",            0x0008ad01 }, // 841-0003    1999
trunk/src/mame/mame.lst
r242974r242975
26782678snowbrosd       // MIN16-02 (c) 1990 Toaplan + Dooyong license
26792679wintbob         // bootleg
26802680snowbroswb      //
2681toto         //
26822681// modified snowbros 'clone' hardware
26832682honeydol        // (c) 1995 Barko Corp
26842683twinadv         // (c) 1995 Barko Corp
r242974r242975
54475446starhrsp        // 2003.12.01 Star Horse Progress (satellite) (Rev A)
54485447puyofevp        // 2003.?? Puyo Puyo Fever (prototype)
54495448            // 2003.?? Dragon Treasure
5449            // 2003.?? Rabbit 2
54505450cfield          // 2004.06 Chaos Field
54515451tetkiwam        // 2004.06 Tetris Kiwamemichi (Arcade TV Game List - P.88, Right, 11 from bottom)
54525452trizeal         // 2004.09 Trizeal
r242974r242975
55135513
55145514// NAOMI 2
55155515naomi2          // 2001.?? Naomi 2 BIOS
5516vstrik3c        // 2001.04 Virtua Striker 3 (cartridge)
5516vstrik3        // 2001.04.06 Virtua Striker 3 Ver. 2002
55175517vstrik3cb       // 2001.04 Virtua Striker 3 (Rev B) (cartridge)
5518vstrik3        // 2001.04.06 Virtua Striker 3 Ver. 2002
5518vstrik3c        // 2001.04 Virtua Striker 3 (Rev C) (cartridge)
55195519wldrider        // 2001.05 Wild Riders
55205520clubkrte        // 2001.06 Club Kart: European Session
5521clubkrtd        // 2001.06 Club Kart: European Session (Rev D)
55215522clubkrtc        // 2001.?? Club Kart: European Session (Rev C)
5522clubkrtd        // 2001.06 Club Kart: European Session (Rev D)
55235523beachspi        // 2001.07 Beach Spikers
55245524vf4cart         // 2001.08.02 Virtua Fighter 4 (cartridge)
55255525vf4             // 2001.08.02 Virtua Fighter 4 (GD-ROM)


Previous 199869 Revisions Next


© 1997-2024 The MAME Team