Previous 199869 Revisions Next

r18182 Thursday 27th September, 2012 at 19:19:16 UTC by hap
added nsub coinage
[src/mame/audio]vicdual.c
[src/mame/drivers]vicdual.c
[src/mame/includes]vicdual.h

trunk/src/mame/drivers/vicdual.c
r18181r18182
3939        * A few of the games have an extra 18K pull-up resistor on the
4040          blue color gun, Carnival, for example.
4141          Colors inaccurate?  Blue background?
42        * Do other games have coinage hardware like nsub?
4243        * DIP switches need verifying in most of the games
4344        * DIP switch locations need to be added to some
4445
r18181r18182
7576 *
7677 *************************************/
7778
78TIMER_CALLBACK_MEMBER(vicdual_state::clear_coin_status)
79TIMER_DEVICE_CALLBACK_MEMBER(vicdual_state::clear_coin_status)
7980{
8081   m_coin_status = 0;
8182}
r18181r18182
9798      m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
9899
99100      /* simulate the coin switch being closed for a while */
100      machine().scheduler().timer_set(4 * machine().primary_screen->frame_period(), timer_expired_delegate(FUNC(vicdual_state::clear_coin_status),this));
101      m_coinstate_timer->adjust(attotime::from_msec(50));
101102}
102103
103104INPUT_CHANGED_MEMBER(vicdual_state::coin_changed)
r18181r18182
218219 *
219220 *************************************/
220221
222void vicdual_state::machine_start()
223{
224   m_coin_status = 0;
225   m_palette_bank = 0;
226
227   save_item(NAME(m_coin_status));
228   save_item(NAME(m_palette_bank));
229}
230
231void vicdual_state::machine_reset()
232{
233}
234
235
221236static MACHINE_CONFIG_START( vicdual_root, vicdual_state )
222237
223238   /* basic machine hardware */
224239   MCFG_CPU_ADD("maincpu", Z80, VICDUAL_MAIN_CPU_CLOCK)
225240
241   MCFG_TIMER_DRIVER_ADD("coinstate", vicdual_state, clear_coin_status)
242
226243   /* video hardware */
227244   MCFG_SCREEN_ADD("screen", RASTER)
228245   MCFG_SCREEN_RAW_PARAMS(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART)
r18181r18182
490507   MCFG_CPU_MODIFY("maincpu")
491508   MCFG_CPU_PROGRAM_MAP(frogs_map)
492509   MCFG_CPU_IO_MAP(frogs_io_map)
510
493511   MCFG_MACHINE_START_OVERRIDE(vicdual_state,frogs_audio)
494512
495513   /* video hardware */
r18181r18182
20802098INPUT_PORTS_END
20812099
20822100
2101MACHINE_START_MEMBER(vicdual_state,samurai)
2102{
2103   m_samurai_protection_data = 0;
2104   save_item(NAME(m_samurai_protection_data));
2105
2106   machine_start();
2107}
2108
20832109static MACHINE_CONFIG_DERIVED( samurai, vicdual_root )
20842110
20852111   /* basic machine hardware */
r18181r18182
20872113   MCFG_CPU_PROGRAM_MAP(samurai_map)
20882114   MCFG_CPU_IO_MAP(samurai_io_map)
20892115
2116   MCFG_MACHINE_START_OVERRIDE(vicdual_state,samurai)
2117
20902118   /* video hardware */
20912119   MCFG_SCREEN_MODIFY("screen")
20922120   MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_vicdual_color)
r18181r18182
21372165ADDRESS_MAP_END
21382166
21392167
2168// coinage is handled by extra hardware on a daughterboard, put before the coin-in pin on the main logic board
2169// IC board "COIN CALCULATOR" (97201-P): two 74191 counters, a 555 timer, coin meters, and lots of other TTL
2170TIMER_DEVICE_CALLBACK_MEMBER(vicdual_state::nsub_coin_pulse)
2171{
2172   if (m_nsub_play_counter > 0)
2173   {
2174      m_nsub_play_counter--;
2175      coin_in();
2176   }
2177}
2178
2179INPUT_CHANGED_MEMBER(vicdual_state::nsub_coin_in)
2180{
2181   if (newval)
2182   {
2183      int which = (int)(FPTR)param;
2184      int coinage = ioport("COINAGE")->read();
2185
2186      switch (which)
2187      {
2188         // normal coin
2189         case 0: case 1:
2190            if (which && ~coinage & 0x40)
2191            {
2192               // x credits per coin
2193               m_nsub_play_counter += (coinage >> 3 & 7);
2194            }
2195            else
2196            {
2197               // x coins per credit
2198               if (--m_nsub_coin_counter == 0)
2199               {
2200                  m_nsub_coin_counter = coinage & 7;
2201                  m_nsub_play_counter++;
2202               }
2203            }
2204           
2205            // increment coin counter
2206            coin_counter_w(machine(), which, 1);
2207            coin_counter_w(machine(), which, 0);
2208            break;
2209
2210         // service coin
2211         case 2:
2212            m_nsub_play_counter++;
2213            break;
2214         
2215         default:
2216            break;
2217      }
2218   }
2219}
2220
2221
21402222static INPUT_PORTS_START( nsub )
21412223   PORT_START("IN0")
21422224   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
r18181r18182
21502232
21512233   PORT_START("IN1")
21522234   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, vicdual_state,vicdual_get_composite_blank_comp, NULL)
2153   PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
2154   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
2155   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
2156   PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
2157   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
2158   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
2159   PORT_DIPNAME(0x08,  0x08, DEF_STR( Unknown ) )
2160   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
2161   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
2162   PORT_DIPNAME(0x10,  0x10, DEF_STR( Unknown ) )
2163   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
2164   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
2165   PORT_DIPNAME(0x20,  0x20, DEF_STR( Unknown ) )
2166   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
2167   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
2168   PORT_DIPNAME(0x40,  0x40, DEF_STR( Unknown ) )
2169   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
2170   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
2235   PORT_BIT( 0x7e, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */
21712236   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, vicdual_state,vicdual_read_coin_status, NULL)
21722237
2173   PORT_COIN_DEFAULT
2238   PORT_START("COIN")
2239   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vicdual_state,nsub_coin_in, (void*)0)
2240   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vicdual_state,nsub_coin_in, (void*)1)
2241   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_CHANGED_MEMBER(DEVICE_SELF, vicdual_state,nsub_coin_in, (void*)2)
2242
2243   PORT_START("COINAGE") // "OPTION SW." on daughterboard
2244   PORT_DIPNAME( 0x07, 0x01, DEF_STR( Coin_A ) )      PORT_DIPLOCATION("SW:1,2,3")
2245   PORT_DIPSETTING(    0x07, DEF_STR( 7C_1C ) )
2246   PORT_DIPSETTING(    0x06, DEF_STR( 6C_1C ) )
2247   PORT_DIPSETTING(    0x05, DEF_STR( 5C_1C ) )
2248   PORT_DIPSETTING(    0x04, DEF_STR( 4C_1C ) )
2249   PORT_DIPSETTING(    0x03, DEF_STR( 3C_1C ) )
2250   PORT_DIPSETTING(    0x02, DEF_STR( 2C_1C ) )
2251   PORT_DIPSETTING(    0x01, DEF_STR( 1C_1C ) )
2252//   PORT_DIPSETTING(    0x00, DEF_STR( 0C_1C ) ) // invalid
2253   PORT_DIPNAME( 0x78, 0x08, DEF_STR( Coin_B ) )      PORT_DIPLOCATION("SW:4,5,6,7")
2254   PORT_DIPSETTING(    0x40, "Shared With Coin A" )
2255//   PORT_DIPSETTING(    0x00, DEF_STR( 1C_0C ) ) // invalid
2256   PORT_DIPSETTING(    0x08, DEF_STR( 1C_1C ) )
2257   PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
2258   PORT_DIPSETTING(    0x18, DEF_STR( 1C_3C ) )
2259   PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
2260   PORT_DIPSETTING(    0x28, DEF_STR( 1C_5C ) )
2261   PORT_DIPSETTING(    0x30, DEF_STR( 1C_6C ) )
2262   PORT_DIPSETTING(    0x38, DEF_STR( 1C_7C ) )
2263   PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW:8" )
21742264INPUT_PORTS_END
21752265
21762266
2267MACHINE_START_MEMBER(vicdual_state,nsub)
2268{
2269   m_nsub_play_counter = 0;
2270   save_item(NAME(m_nsub_coin_counter));
2271   save_item(NAME(m_nsub_play_counter));
2272
2273   machine_start();
2274
2275   // playcounter 555 timer frequency is unknown
2276   // keep in mind that intervals need to be longer than the main coin_in timeout
2277   m_nsub_coinage_timer->adjust(attotime::zero, 0, attotime::from_msec(150));
2278}
2279
2280MACHINE_RESET_MEMBER(vicdual_state,nsub)
2281{
2282   m_nsub_coin_counter = ioport("COINAGE")->read() & 7;
2283   
2284   machine_reset();
2285}
2286
21772287static MACHINE_CONFIG_DERIVED( nsub, vicdual_root )
21782288
21792289   /* basic machine hardware */
r18181r18182
21812291   MCFG_CPU_PROGRAM_MAP(nsub_map)
21822292   MCFG_CPU_IO_MAP(nsub_io_map)
21832293
2294   MCFG_TIMER_DRIVER_ADD("nsub_coin", vicdual_state, nsub_coin_pulse)
2295
2296   MCFG_MACHINE_START_OVERRIDE(vicdual_state,nsub)
2297   MCFG_MACHINE_RESET_OVERRIDE(vicdual_state,nsub)
2298
21842299   /* video hardware */
21852300   MCFG_SCREEN_MODIFY("screen")
21862301   MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_vicdual_color)
trunk/src/mame/audio/vicdual.c
r18181r18182
139139MACHINE_START_MEMBER(vicdual_state,frogs_audio)
140140{
141141   frogs_croak_timer = machine().scheduler().timer_alloc(FUNC(frogs_croak_callback));
142
143   machine_start();
142144}
143145
144146
trunk/src/mame/includes/vicdual.h
r18181r18182
1313   vicdual_state(const machine_config &mconfig, device_type type, const char *tag)
1414      : driver_device(mconfig, type, tag),
1515      m_maincpu(*this,"maincpu"),
16      m_coinstate_timer(*this, "coinstate"),
17      m_nsub_coinage_timer(*this, "nsub_coin"),
1618      m_videoram(*this, "videoram"),
1719      m_characterram(*this, "characterram")
1820   { }
1921
2022   required_device<cpu_device> m_maincpu;
23   required_device<timer_device> m_coinstate_timer;
24   optional_device<timer_device> m_nsub_coinage_timer;
2125   required_shared_ptr<UINT8> m_videoram;
2226   required_shared_ptr<UINT8> m_characterram;
2327
2428   UINT8 m_coin_status;
2529   UINT8 m_palette_bank;
2630   UINT8 m_samurai_protection_data;
31   int m_nsub_coin_counter;
32   int m_nsub_play_counter;
2733
2834   void coin_in();
2935   void assert_coin_status();
r18181r18182
6874   DECLARE_CUSTOM_INPUT_MEMBER(vicdual_fake_lives_r);
6975   DECLARE_CUSTOM_INPUT_MEMBER(samurai_protection_r);
7076   DECLARE_INPUT_CHANGED_MEMBER(coin_changed);
77   DECLARE_INPUT_CHANGED_MEMBER(nsub_coin_in);
78
79   TIMER_DEVICE_CALLBACK_MEMBER(clear_coin_status);
80   TIMER_DEVICE_CALLBACK_MEMBER(nsub_coin_pulse);
81
82   DECLARE_MACHINE_START(samurai);
83   DECLARE_MACHINE_START(nsub);
84   DECLARE_MACHINE_RESET(nsub);
7185   DECLARE_MACHINE_START(frogs_audio);
86
87   virtual void machine_start();
88   virtual void machine_reset();
89
7290   UINT32 screen_update_vicdual_bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
7391   UINT32 screen_update_vicdual_bw_or_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
7492   UINT32 screen_update_vicdual_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
75   TIMER_CALLBACK_MEMBER(clear_coin_status);
7693};
7794
7895/*----------- defined in drivers/vicdual.c -----------*/

Previous 199869 Revisions Next


© 1997-2024 The MAME Team