1 // license:GPL-2.0+
2 // copyright-holders:Juergen Buchmueller
3 /***************************************************************************
4 
5     Meadows S2650 driver
6 
7     driver by J. Buchmueller, June '98
8 
9     Games supported:
10         * Dead Eye
11         * 3-D Bowling
12         * Gypsy Juggler
13         * Inferno
14 
15     Known issues:
16         * none at this time
17 
18 ****************************************************************************
19 
20     ***********************************************
21     memory map CPU #0 (preliminary)
22     ***********************************************
23 
24     0000..0bff  ROM part one
25 
26     0c00..0c03  H/W input ports
27     -----------------------------------------------
28             0 R control buttons
29                 D0      button 1
30                 D1      start 2 player game
31 
32             1 R analog control
33                 D0-D7   center is 0x7f
34 
35             2 R horizontal sync divider chain
36                 D7 9.765kHz ... D0 2.5MHz
37 
38             3 R dip switch settings
39                 D0-D2   select 2 to 9 coins
40                 D3-D4   Coins per play D3 D4
41                         1 coin  1 play  0  0
42                         2 coins 1 play  1  0
43                         1 coin  2 plays 0  1
44                         free play       1  1
45                 D5      Attact music 0:off, 1:on
46                 D6-D7   Extended play  D6 D7
47                         none            0  0
48                         5000 pts        1  0
49                         15000 pts       0  1
50                         35000 pts       1  1
51 
52     0d00-0d0f   H/W sprites
53     -----------------------------------------------
54             0 W D0-D7    sprite 0 horz
55             1 W D0-D7    sprite 1 horz
56             2 W D0-D7    sprite 2 horz
57             3 W D0-D7    sprite 3 horz
58             4 W D0-D7    sprite 0 vert
59             5 W D0-D7    sprite 2 vert
60             6 W D0-D7    sprite 3 vert
61             7 W D0-D7    sprite 4 vert
62             8 W D0-D7    sprite 0 select
63                 D0-D3    sprite #
64                 D4       prom (not sure)
65                 D5       flip x
66             9 W          sprite 1 select
67                 D0-D3    sprite #
68                 D4       prom (not sure)
69                 D5       flip x
70             a W          sprite 2 select
71                 D0-D3    sprite #
72                 D4       prom (not sure)
73                 D5       flip x
74             b W          sprite 3 select
75                 D0-D3    sprite #
76                 D4       prom (not sure)
77                 D5       flip x
78 
79     0e00-0eff   RAM
80 
81     1000-1bff   ROM     part two
82 
83     1c00-1fff   RAM     video buffer
84 
85     ***********************************************
86     memory map CPU #1 (preliminary)
87     ***********************************************
88 
89     0000..0bff  ROM part one
90 
91     0c00..0c03  H/W input ports
92     -----------------------------------------------
93             0 R audio command from CPU #0
94                 D0-D7   8 different sounds ???
95 
96             1 R ???
97             2 R ???
98             3 R ???
99 
100             0 W D0-D7   DAC
101             1 W D0-D3   preset for counter, clk is 5 MHz / 256
102                 D4-D7   volume bits 0 .. 3 (bit 4 is CPU #1 flag output)
103             2 W D0-D7   preset for counter, clk is 5 MHz / 32
104             3 W D0      divide c02 counter by 0: 2, 1: 4
105                 D1      audio enable for c02 tone generator
106                 D2      audio enable for DAC
107                 D3      audio enable for c01 tone generator
108 
109     0e00-0eff   RAM
110 
111 
112     ********************************************
113     Inferno memory map (very incomplete)
114     ********************************************
115     0000..0bff  ROM part one
116     1c00..1eff  video buffer
117     1f00..1f03  hardware?
118 
119 ***************************************************************************/
120 
121 #include "emu.h"
122 #include "includes/meadows.h"
123 
124 #include "speaker.h"
125 
126 #include "deadeye.lh"
127 #include "gypsyjug.lh"
128 #include "minferno.lh"
129 
130 #define MASTER_CLOCK XTAL(5'000'000)
131 
132 
133 
134 /*************************************
135  *
136  *  Special input ports
137  *
138  *************************************/
139 
hsync_chain_r()140 uint8_t meadows_state::hsync_chain_r()
141 {
142 	uint8_t val = m_screen->hpos();
143 	return bitswap<8>(val,0,1,2,3,4,5,6,7);
144 }
145 
146 
vsync_chain_hi_r()147 uint8_t meadows_state::vsync_chain_hi_r()
148 {
149 	uint8_t val = m_screen->vpos();
150 	return ((val >> 1) & 0x08) | ((val >> 3) & 0x04) | ((val >> 5) & 0x02) | (val >> 7);
151 }
152 
153 
vsync_chain_lo_r()154 uint8_t meadows_state::vsync_chain_lo_r()
155 {
156 	uint8_t val = m_screen->vpos();
157 	return val & 0x0f;
158 }
159 
160 
161 
162 /*************************************
163  *
164  *  Audio control writes
165  *
166  *************************************/
167 
meadows_audio_w(offs_t offset,uint8_t data)168 void meadows_state::meadows_audio_w(offs_t offset, uint8_t data)
169 {
170 	switch (offset)
171 	{
172 		case 0:
173 			if (m_0c00 == data)
174 				break;
175 			logerror("meadows_audio_w %d $%02x\n", offset, data);
176 			m_0c00 = data;
177 			break;
178 
179 		case 1:
180 			logerror("meadows_audio_w %d $%02x\n", offset, data);
181 			break;
182 
183 		case 2:
184 			logerror("meadows_audio_w %d $%02x\n", offset, data);
185 			break;
186 
187 		case 3:
188 /*          S2650_Clear_Pending_Interrupts(); */
189 			break;
190 	}
191 }
192 
193 
194 
195 /*************************************
196  *
197  *  Coin handling
198  *
199  *************************************/
200 
INPUT_CHANGED_MEMBER(meadows_state::coin_inserted)201 INPUT_CHANGED_MEMBER(meadows_state::coin_inserted)
202 {
203 	m_maincpu->set_input_line(0, (newval ? ASSERT_LINE : CLEAR_LINE));
204 }
205 
206 
207 
208 /*************************************
209  *
210  *  Main CPU interrupt
211  *
212  *************************************/
213 
WRITE_LINE_MEMBER(meadows_state::meadows_vblank_irq)214 WRITE_LINE_MEMBER(meadows_state::meadows_vblank_irq)
215 {
216 	if (state)
217 	{
218 		/* fake something toggling the sense input line of the S2650 */
219 		m_main_sense_state ^= 1;
220 		m_maincpu->set_input_line(S2650_SENSE_LINE, m_main_sense_state ? ASSERT_LINE : CLEAR_LINE);
221 	}
222 }
223 
224 
225 
226 /*************************************
227  *
228  *  Main CPU interrupt (Inferno)
229  *
230  *************************************/
231 
WRITE_LINE_MEMBER(meadows_state::minferno_vblank_irq)232 WRITE_LINE_MEMBER(meadows_state::minferno_vblank_irq)
233 {
234 	if (state)
235 	{
236 		m_main_sense_state++;
237 		m_maincpu->set_input_line(S2650_SENSE_LINE, (m_main_sense_state & 0x40) ? ASSERT_LINE : CLEAR_LINE);
238 	}
239 }
240 
241 
242 
243 /*************************************
244  *
245  *  Audio hardware output control
246  *
247  *************************************/
248 
audio_hardware_w(offs_t offset,uint8_t data)249 void meadows_state::audio_hardware_w(offs_t offset, uint8_t data)
250 {
251 	switch (offset & 3)
252 	{
253 		case 0: /* DAC */
254 			m_dac->write(data ^ 0xff);
255 			break;
256 
257 		case 1: /* counter clk 5 MHz / 256 */
258 			if (data == m_0c01)
259 				break;
260 			logerror("audio_w ctr1 preset $%x amp %d\n", data & 15, data >> 4);
261 			m_0c01 = data;
262 			meadows_sh_update();
263 			break;
264 
265 		case 2: /* counter clk 5 MHz / 32 (/ 2 or / 4) */
266 			if (data == m_0c02)
267 				break;
268 			logerror("audio_w ctr2 preset $%02x\n", data);
269 			m_0c02 = data;
270 			meadows_sh_update();
271 			break;
272 
273 		case 3: /* audio enable */
274 			if (data == m_0c03)
275 				break;
276 			logerror("audio_w enable ctr2/2:%d ctr2:%d dac:%d ctr1:%d\n", data&1, (data>>1)&1, (data>>2)&1, (data>>3)&1);
277 			m_0c03 = data;
278 			meadows_sh_update();
279 			break;
280 	}
281 }
282 
283 
284 
285 /*************************************
286  *
287  *  Audio hardware read
288  *
289  *************************************/
290 
audio_hardware_r(offs_t offset)291 uint8_t meadows_state::audio_hardware_r(offs_t offset)
292 {
293 	int data = 0;
294 
295 	switch (offset)
296 	{
297 		case 0:
298 			data = m_0c00;
299 			break;
300 
301 		case 1: break;
302 		case 2: break;
303 		case 3: break;
304 	}
305 	return data;
306 }
307 
308 
309 
310 /*************************************
311  *
312  *  Audio hardware interrupts
313  *
314  *************************************/
315 
INTERRUPT_GEN_MEMBER(meadows_state::audio_interrupt)316 INTERRUPT_GEN_MEMBER(meadows_state::audio_interrupt)
317 {
318 	/* fake something toggling the sense input line of the S2650 */
319 	m_audio_sense_state ^= 1;
320 	m_audiocpu->set_input_line(S2650_SENSE_LINE, m_audio_sense_state ? ASSERT_LINE : CLEAR_LINE);
321 }
322 
323 
324 
325 /*************************************
326  *
327  *  Main CPU memory handlers
328  *
329  *************************************/
330 
meadows_main_map(address_map & map)331 void meadows_state::meadows_main_map(address_map &map)
332 {
333 	map(0x0000, 0x0bff).rom();
334 	map(0x0c00, 0x0c00).portr("INPUTS");
335 	map(0x0c01, 0x0c01).portr("STICK");
336 	map(0x0c02, 0x0c02).r(FUNC(meadows_state::hsync_chain_r));
337 	map(0x0c03, 0x0c03).portr("DSW");
338 	map(0x0c00, 0x0c03).w(FUNC(meadows_state::meadows_audio_w));
339 	map(0x0d00, 0x0d0f).w(FUNC(meadows_state::meadows_spriteram_w)).share("spriteram");
340 	map(0x0e00, 0x0eff).ram();
341 	map(0x1000, 0x1bff).rom();
342 	map(0x1c00, 0x1fff).ram().w(FUNC(meadows_state::meadows_videoram_w)).share("videoram");
343 }
344 
bowl3d_main_map(address_map & map)345 void meadows_state::bowl3d_main_map(address_map &map)
346 {
347 	map(0x0000, 0x0bff).rom();
348 	map(0x0c00, 0x0c00).portr("INPUTS1");
349 	map(0x0c01, 0x0c01).portr("INPUTS2");
350 	map(0x0c02, 0x0c02).r(FUNC(meadows_state::hsync_chain_r));
351 	map(0x0c03, 0x0c03).portr("DSW");
352 	map(0x0c00, 0x0c03).w(FUNC(meadows_state::meadows_audio_w));
353 	map(0x0d00, 0x0d0f).w(FUNC(meadows_state::meadows_spriteram_w)).share("spriteram");
354 	map(0x0e00, 0x0eff).ram();
355 	map(0x1000, 0x1bff).rom();
356 	map(0x1c00, 0x1fff).ram().w(FUNC(meadows_state::meadows_videoram_w)).share("videoram");
357 }
358 
minferno_main_map(address_map & map)359 void meadows_state::minferno_main_map(address_map &map)
360 {
361 	map(0x0000, 0x0bff).rom();
362 	map(0x1c00, 0x1eff).ram().w(FUNC(meadows_state::meadows_videoram_w)).share("videoram");
363 	map(0x1f00, 0x1f00).portr("JOY1");
364 	map(0x1f01, 0x1f01).portr("JOY2");
365 	map(0x1f02, 0x1f02).portr("BUTTONS");
366 	map(0x1f03, 0x1f03).portr("DSW1");
367 	map(0x1f00, 0x1f03).w(FUNC(meadows_state::meadows_audio_w));
368 	map(0x1f04, 0x1f04).r(FUNC(meadows_state::vsync_chain_hi_r));
369 	map(0x1f05, 0x1f05).r(FUNC(meadows_state::vsync_chain_lo_r));
370 }
371 
372 
minferno_data_map(address_map & map)373 void meadows_state::minferno_data_map(address_map &map)
374 {
375 	map(S2650_DATA_PORT, S2650_DATA_PORT).portr("DSW2");
376 }
377 
378 
379 
380 /*************************************
381  *
382  *  Audio CPU memory handlers
383  *
384  *************************************/
385 
audio_map(address_map & map)386 void meadows_state::audio_map(address_map &map)
387 {
388 	map(0x0000, 0x0bff).rom();
389 	map(0x0c00, 0x0c03).rw(FUNC(meadows_state::audio_hardware_r), FUNC(meadows_state::audio_hardware_w));
390 	map(0x0e00, 0x0eff).ram();
391 }
392 
393 
394 
395 
396 /*************************************
397  *
398  *  Port definitions
399  *
400  *************************************/
401 
402 static INPUT_PORTS_START( meadows )
403 	PORT_START("INPUTS")
404 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
405 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1  )
406 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
407 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
408 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
409 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
410 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
411 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
412 
413 	PORT_START("STICK")
414 	PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x10,0xf0) PORT_SENSITIVITY(20) PORT_KEYDELTA(10) PORT_CENTERDELTA(0)
415 
416 	PORT_START("DSW")
417 	PORT_DIPNAME( 0x07, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW1:3,2,1")
418 	PORT_DIPSETTING(    0x00, "2" )
419 	PORT_DIPSETTING(    0x01, "3" )
420 	PORT_DIPSETTING(    0x02, "4" )
421 	PORT_DIPSETTING(    0x03, "5" )
422 	PORT_DIPSETTING(    0x04, "6" )
423 	PORT_DIPSETTING(    0x05, "7" )
424 	PORT_DIPSETTING(    0x06, "8" )
425 	PORT_DIPSETTING(    0x07, "9" )
426 	PORT_DIPNAME( 0x18, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW1:5,4")
427 	PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) )
428 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
429 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
430 	PORT_DIPSETTING(    0x18, DEF_STR( Free_Play ) )
431 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:6")
432 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
433 	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
434 	PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("DSW1:8,7")
435 	PORT_DIPSETTING(    0x40, "5000")
436 	PORT_DIPSETTING(    0x80, "15000")
437 	PORT_DIPSETTING(    0xc0, "35000")
438 	PORT_DIPSETTING(    0x00, DEF_STR( None ))
439 
440 	PORT_START("FAKE")
441 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, meadows_state,coin_inserted, 0)
442 	PORT_BIT( 0x8e, IP_ACTIVE_LOW, IPT_UNUSED )
443 INPUT_PORTS_END
444 
445 static INPUT_PORTS_START( bowl3d )
446 	PORT_START("INPUTS1")
447 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
448 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
449 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2        ) PORT_PLAYER(1)
450 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1        ) PORT_PLAYER(1)
451 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
452 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  ) PORT_PLAYER(1)
453 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1         )
454 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
455 
456 	PORT_START("INPUTS2")
457 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
458 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
459 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2        ) PORT_PLAYER(2)
460 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1        ) PORT_PLAYER(2)
461 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
462 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  ) PORT_PLAYER(2)
463 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2         )
464 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
465 
466 	PORT_START("DSW")
467 	PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unused ) )
468 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
469 	PORT_DIPSETTING(    0x01, DEF_STR( On ) )
470 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) )
471 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
472 	PORT_DIPSETTING(    0x02, DEF_STR( On ) )
473 	PORT_DIPNAME( 0x04, 0x00, "Coin Option" )
474 	PORT_DIPSETTING(    0x00, "2 Players / 1 Coin" )
475 	PORT_DIPSETTING(    0x04, "1/2 Player(s) / 1/2 Coin(s)" )
476 	PORT_DIPNAME( 0x08, 0x00, "Beer Frame" )
477 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
478 	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
479 	PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) )
480 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
481 	PORT_DIPSETTING(    0x10, DEF_STR( On ) )
482 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) )
483 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
484 	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
485 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
486 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
487 	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
488 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
489 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
490 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
491 
492 	PORT_START("FAKE")
493 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, meadows_state,coin_inserted, 0)
494 	PORT_BIT( 0x8e, IP_ACTIVE_LOW, IPT_UNUSED )
495 INPUT_PORTS_END
496 
497 static INPUT_PORTS_START( minferno )
498 	PORT_START("JOY1")
499 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
500 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
501 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
502 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
503 
504 	PORT_START("JOY2")
505 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
506 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
507 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
508 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
509 
510 	PORT_START("BUTTONS")
511 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
512 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
513 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
514 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
515 
516 	PORT_START("DSW1")
517 	PORT_DIPNAME( 0x01, 0x01, "Coin Option" ) PORT_DIPLOCATION("DSW1:4")
518 	PORT_DIPSETTING(    0x00, "1 Game/Coin" )
519 	PORT_DIPSETTING(    0x01, "1 Player/Coin" )
520 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:3")
521 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
522 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
523 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
524 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
525 
526 	PORT_START("DSW2")
527 	PORT_DIPNAME( 0x03, 0x00, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("DSW1:2,1")
528 	PORT_DIPSETTING(    0x00, "60s" )
529 	PORT_DIPSETTING(    0x01, "90s" )
530 	PORT_DIPSETTING(    0x02, "120s" )
531 	PORT_DIPSETTING(    0x03, "180s" )
532 	PORT_DIPNAME( 0x0c, 0x04, "Extended Play Score" ) PORT_DIPLOCATION("DSW1:6,5")
533 	PORT_DIPSETTING(    0x00, "3000/6000" )
534 	PORT_DIPSETTING(    0x04, "4000/7000" )
535 	PORT_DIPSETTING(    0x08, "5000/8000" )
536 	PORT_DIPSETTING(    0x0c, "6000/9000" )
537 	PORT_DIPNAME( 0x30, 0x10, "Extended Play Time" ) PORT_DIPLOCATION("DSW1:7,8")
538 	PORT_DIPSETTING(    0x00, DEF_STR( None ) )
539 	PORT_DIPSETTING(    0x10, "20s" )
540 	PORT_DIPSETTING(    0x20, "40s" )
541 	PORT_DIPSETTING(    0x30, "60s" )
542 /*  PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
543     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
544     PORT_DIPSETTING(    0x40, DEF_STR( On ) )
545     PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
546     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
547     PORT_DIPSETTING(    0x80, DEF_STR( On ) ) */
548 INPUT_PORTS_END
549 
550 
551 
552 /*************************************
553  *
554  *  Graphics layouts
555  *
556  *************************************/
557 
558 static const gfx_layout charlayout =
559 {
560 	8,8,                            /* 8*8 characters */
561 	128,                            /* 128 characters ? */
562 	1,                              /* 1 bit per pixel */
563 	{ 0 },                          /* no bitplanes */
564 	{ 0, 1, 2, 3, 4, 5, 6, 7 },     /* pretty straight layout */
565 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
566 	8*8                             /* every char takes 8 bytes */
567 };
568 
569 
570 static const gfx_layout spritelayout =
571 {
572 	16,16,                          /* 16*16 sprites ?  */
573 	32,                             /* 32 sprites  */
574 	1,                              /* 1 bits per pixel */
575 	{ 0 },                          /* 1 bitplane */
576 	{ 0, 1, 2, 3, 4, 5, 6, 7,
577 	8, 9,10,11,12,13,14,15 },     /* pretty straight layout */
578 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
579 	8*16, 9*16,10*16,11*16,12*16,13*16,14*16,15*16 },
580 	16*2*8                          /* every sprite takes 32 bytes */
581 };
582 
583 
584 static GFXDECODE_START( gfx_meadows )
585 	GFXDECODE_ENTRY( "gfx1", 0, charlayout,  0, 1 )     /* character generator */
586 	GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0, 1 )        /* sprite prom 1 */
587 	GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0, 1 )        /* sprite prom 2 */
588 	GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 0, 1 )        /* sprite prom 3 (unused) */
589 	GFXDECODE_ENTRY( "gfx5", 0, spritelayout, 0, 1 )        /* sprite prom 4 (unused) */
590 GFXDECODE_END
591 
592 
593 static GFXDECODE_START( gfx_minferno )
594 	GFXDECODE_ENTRY( "gfx1", 0, charlayout,   0, 4 )
595 GFXDECODE_END
596 
597 
598 
599 /*************************************
600  *
601  *  Audio interfaces
602  *
603  *************************************/
604 
605 static const char *const bowl3d_sample_names[] =
606 {
607 	"*bowl3d",
608 	"roll",     /* "roll" */
609 	"rollback", /* "roll back" */
610 	"sweep",    /* "sweep" */
611 	"footstep", /* "foot sweep" */
612 	"crash",    /* "crash" */
613 	"cheering", /* "cheering" */
614 	nullptr
615 };
616 
617 /*************************************
618  *
619  *  Machine drivers
620  *
621  *************************************/
622 
meadows(machine_config & config)623 void meadows_state::meadows(machine_config &config)
624 {
625 	/* basic machine hardware */
626 	S2650(config, m_maincpu, MASTER_CLOCK/8);  /* 5MHz / 8 = 625 kHz */
627 	m_maincpu->set_addrmap(AS_PROGRAM, &meadows_state::meadows_main_map);
628 	m_maincpu->intack_handler().set([]() { return 0x82; });
629 
630 	S2650(config, m_audiocpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */
631 	m_audiocpu->set_addrmap(AS_PROGRAM, &meadows_state::audio_map);
632 	m_audiocpu->set_periodic_int(FUNC(meadows_state::audio_interrupt), attotime::from_hz((double)5000000/131072));
633 
634 	config.set_maximum_quantum(attotime::from_hz(600));
635 
636 	/* video hardware */
637 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
638 	m_screen->set_refresh_hz(60);
639 	m_screen->set_size(32*8, 30*8);
640 	m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
641 	m_screen->set_screen_update(FUNC(meadows_state::screen_update_meadows));
642 	m_screen->set_palette(m_palette);
643 	m_screen->screen_vblank().set(FUNC(meadows_state::meadows_vblank_irq)); // one interrupt per frame!?
644 
645 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_meadows);
646 	PALETTE(config, m_palette, palette_device::MONOCHROME);
647 
648 	/* audio hardware */
649 	SPEAKER(config, "speaker").front_center();
650 	DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
651 
652 	SAMPLES(config, m_samples);
653 	m_samples->set_channels(2);
654 	m_samples->set_samples_start_callback(FUNC(meadows_state::meadows_sh_start));
655 	m_samples->add_route(ALL_OUTPUTS, "speaker", 1.0);
656 }
657 
minferno(machine_config & config)658 void meadows_state::minferno(machine_config &config)
659 {
660 	/* basic machine hardware */
661 	S2650(config, m_maincpu, MASTER_CLOCK/24); /* 5MHz / 8 / 3 = 208.33 kHz */
662 	m_maincpu->set_addrmap(AS_PROGRAM, &meadows_state::minferno_main_map);
663 	m_maincpu->set_addrmap(AS_DATA, &meadows_state::minferno_data_map);
664 
665 	/* video hardware */
666 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
667 	m_screen->set_refresh_hz(60);
668 	m_screen->set_size(32*8, 32*8);
669 	m_screen->set_visarea(0*8, 32*8-1, 1*8, 24*8-1);
670 	m_screen->set_screen_update(FUNC(meadows_state::screen_update_meadows));
671 	m_screen->set_palette(m_palette);
672 	m_screen->screen_vblank().set(FUNC(meadows_state::minferno_vblank_irq));
673 
674 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_minferno);
675 	PALETTE(config, m_palette, palette_device::MONOCHROME);
676 
677 	/* audio hardware */
678 	// TODO
679 }
680 
bowl3d(machine_config & config)681 void meadows_state::bowl3d(machine_config &config)
682 {
683 	/* basic machine hardware */
684 	S2650(config, m_maincpu, MASTER_CLOCK/8);  /* 5MHz / 8 = 625 kHz */
685 	m_maincpu->set_addrmap(AS_PROGRAM, &meadows_state::bowl3d_main_map);
686 	m_maincpu->intack_handler().set([]() { return 0x82; });
687 
688 	S2650(config, m_audiocpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */
689 	m_audiocpu->set_addrmap(AS_PROGRAM, &meadows_state::audio_map);
690 	m_audiocpu->set_periodic_int(FUNC(meadows_state::audio_interrupt), attotime::from_hz((double)5000000/131072));
691 
692 	config.set_maximum_quantum(attotime::from_hz(600));
693 
694 	/* video hardware */
695 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
696 	m_screen->set_refresh_hz(60);
697 	m_screen->set_size(32*8, 30*8);
698 	m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
699 	m_screen->set_screen_update(FUNC(meadows_state::screen_update_meadows));
700 	m_screen->set_palette(m_palette);
701 	m_screen->screen_vblank().set(FUNC(meadows_state::meadows_vblank_irq)); // one interrupt per frame!?
702 
703 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_meadows);
704 	PALETTE(config, m_palette, palette_device::MONOCHROME);
705 
706 	/* audio hardware */
707 	SPEAKER(config, "speaker").front_center();
708 	DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
709 
710 	SAMPLES(config, m_samples);
711 	m_samples->set_channels(2);
712 	m_samples->set_samples_start_callback(FUNC(meadows_state::meadows_sh_start));
713 	m_samples->add_route(ALL_OUTPUTS, "speaker", 1.0);
714 
715 	samples_device &samples2(SAMPLES(config, "samples2"));
716 	samples2.set_channels(1);
717 	samples2.set_samples_names(bowl3d_sample_names);
718 	samples2.add_route(ALL_OUTPUTS, "speaker", 1.0);
719 }
720 
721 /*************************************
722  *
723  *  ROM definitions
724  *
725  *************************************/
726 
727 ROM_START( deadeye )
728 	ROM_REGION( 0x08000, "maincpu", 0 )
CRC(bd09e4dc)729 	ROM_LOAD( "de1.8h",       0x0000, 0x0400, CRC(bd09e4dc) SHA1(5428835f6bc3d162496fdce174fcaaaba98c09f9) )
730 	ROM_LOAD( "de2.9h",       0x0400, 0x0400, CRC(b89edec3) SHA1(5ce0058f23b7e5c832029ca97d9a40d1494bf972) )
731 	ROM_LOAD( "de3.10h",      0x0800, 0x0400, CRC(acf24438) SHA1(d7ea668ee19a167cb006c92e9606e20ef13d052e) )
732 	ROM_LOAD( "de4.11h",      0x1000, 0x0400, CRC(8b68f792) SHA1(e6c0b53726587768d39270f2f1e5b935035c20e5) )
733 	ROM_LOAD( "de5.12h",      0x1400, 0x0400, CRC(7bdb535c) SHA1(7bd2e261a22f5f3ffc60ea12ca5f38c445ec0030) )
734 	ROM_LOAD( "de6.13h",      0x1800, 0x0400, CRC(847f9467) SHA1(253d386b76be99a1deef9e6b4cd906efdd9cf6d9) )
735 
736 	ROM_REGION( 0x0400, "gfx1", 0 )
737 	ROM_LOAD( "de_char.15e",  0x0000, 0x0400, CRC(b032bd8d) SHA1(130614d951c440a31c1262517cca0a133ddd1545) )
738 
739 	ROM_REGION( 0x0400, "gfx2", 0 )
740 	ROM_LOAD( "de_mov1.5a",   0x0000, 0x0400, CRC(c046b4c6) SHA1(3baa47a6c8962f6f66c08847b4ee4aa91580ad1a) )
741 
742 	ROM_REGION( 0x0400, "gfx3", 0 )
743 	ROM_LOAD( "de_mov2.13a",  0x0000, 0x0400, CRC(b89c5df9) SHA1(dd0eac9d646dd24575c7b61ce141fdc66994c188) )
744 
745 	ROM_REGION( 0x0400, "gfx4", ROMREGION_ERASEFF )
746 	/* empty */
747 	ROM_REGION( 0x0400, "gfx5", ROMREGION_ERASEFF )
748 	/* empty */
749 
750 	ROM_REGION( 0x08000, "audiocpu", 0 )
751 	ROM_LOAD( "de_sound_099c_m2-a1.0.4a", 0x0000, 0x0400, CRC(c10a1b1a) SHA1(779ea261d23360634081295a164cacbd819d8719) )
752 ROM_END
753 
754 
755 ROM_START( bowl3d )
756 	ROM_REGION( 0x08000, "maincpu", 0 )
757 	ROM_LOAD( "b3d.h8",       0x0000, 0x0400, CRC(be38feeb) SHA1(feab3c61ce1e351c02f6ffa7f7f2ac90e62e7719) )
758 	ROM_LOAD( "b3d.h9",       0x0400, 0x0400, CRC(4e8acead) SHA1(3c00f0d05b9cb80a2245bc68a45732ab6ac87b7f) )
759 	ROM_LOAD( "b3d.h10",      0x0800, 0x0400, CRC(16677267) SHA1(0131f68e87d6326870f95c1ff364a97436b6c4d8) )
760 	ROM_LOAD( "b3d.h11",      0x1000, 0x0400, CRC(c0f9ac37) SHA1(c563155a28052eea150627a83cad9bd1b5ef9489) )
761 	ROM_LOAD( "b3d.h12",      0x1400, 0x0400, CRC(80a149d6) SHA1(ab4ca76d9f5aa5e02b9d5bf909af9548fe62f475) )
762 	// h13 empty
763 
764 	/* Universal Game Logic according to schematics  */
765 	ROM_REGION( 0x08000, "audiocpu", 0 )    /* 2650 CPU at j8 */
766 	ROM_LOAD( "82s115.a6",    0x0000, 0x0001, NO_DUMP ) /* 82s115 eprom */
767 	ROM_LOAD( "82s115.c6",    0x0000, 0x0001, NO_DUMP ) /* 82s115 eprom */
768 
769 	ROM_REGION( 0x0400, "gfx1", 0 )
770 	ROM_LOAD( "b3d.e15",      0x0000, 0x0400, CRC(4414e24f) SHA1(835c989143895848df7154c2d82a499dea79c1c5) )
771 
772 	ROM_REGION( 0x0400, "gfx2", 0 )
773 	ROM_LOAD( "b3d.a5",       0x0000, 0x0400, CRC(4b657f8a) SHA1(52eb90ff5048db30e9710e96793bad5e2c7ad6db) )
774 
775 	ROM_REGION( 0x0400, "gfx3", 0 )
776 	ROM_LOAD( "b3d.a13",      0x0000, 0x0400, CRC(ca7f33b9) SHA1(6c63a41be57e71d6a58112be13d77e695a0faa10) )
777 
778 	ROM_REGION( 0x0400, "gfx4", ROMREGION_ERASEFF )
779 	/* empty */
780 	ROM_REGION( 0x0400, "gfx5", ROMREGION_ERASEFF )
781 	/* empty */
782 
783 	ROM_REGION( 0x0001, "proms", 0 )
784 	ROM_LOAD( "82s123.r8",    0x0000, 0x0001, NO_DUMP ) /* 82s123 prom located on Universal Game Logic */
785 ROM_END
786 
787 
788 ROM_START( gypsyjug )
789 	ROM_REGION( 0x08000, "maincpu", 0 )
790 	ROM_LOAD( "gj.1b",        0x0000, 0x0400, CRC(f6a71d9f) SHA1(11a86ae781297e4077a69e6809487022fed9c444) )
791 	ROM_LOAD( "gj.2b",        0x0400, 0x0400, CRC(94c14455) SHA1(ed704680c2b83d1726d1a17d64f5d57925a495b2) )
792 	ROM_LOAD( "gj.3b",        0x0800, 0x0400, CRC(87ee0490) SHA1(7ecca4df9755b604d179d407e7c9c04d616b689b) )
793 	ROM_LOAD( "gj.4b",        0x1000, 0x0400, CRC(dca519c8) SHA1(7651aa8b2a8e53113eb08108a5b8fb20518ae185) )
794 	ROM_LOAD( "gj.5b",        0x1400, 0x0400, CRC(7d83f9d0) SHA1(9aa8b281b5de7d913cf364a1159f2762fc69022d) )
795 
796 	ROM_REGION( 0x0400, "gfx1", 0 )
797 	ROM_LOAD( "gj.e15",       0x0000, 0x0400, CRC(adb25e13) SHA1(67b5a24a724310f3817a891a54d239d60fe80760) )
798 
799 	ROM_REGION( 0x0400, "gfx2", 0 )
800 	ROM_LOAD( "gj.a",         0x0000, 0x0400, CRC(d3725193) SHA1(5ea28c410a7b9532276fb98c7003b4c8f64d24c9) )
801 
802 	ROM_REGION( 0x0400, "gfx3", ROMREGION_ERASEFF )
803 	/* empty (copied from 2) */
804 
805 	ROM_REGION( 0x0400, "gfx4", 0 )
806 	ROM_LOAD( "gj.x",         0x0000, 0x0400, NO_DUMP )     /* missing */
807 
808 	ROM_REGION( 0x0400, "gfx5", 0 )
809 	ROM_LOAD( "gj.y",         0x0000, 0x0400, NO_DUMP )     /* missing */
810 
811 	ROM_REGION( 0x08000, "audiocpu", 0 )
812 	ROM_LOAD( "gj.a4s",       0x0000, 0x0400, CRC(17a116bc) SHA1(797ba0b292afa3ba7eec985b533014acc00ed47d) )
813 	ROM_LOAD( "gj.a5s",       0x0400, 0x0400, CRC(fc23ae09) SHA1(42be34a9ef8c4c8ef9f94c85ca031076f84faa96) )
814 	ROM_LOAD( "gj.a6s",       0x0800, 0x0400, CRC(9e7bd71e) SHA1(e00801820c1a39cbfed124a29470da03cf8b40b4) )
815 ROM_END
816 
817 
818 ROM_START( minferno )
819 	ROM_REGION( 0x08000, "maincpu", ROMREGION_INVERT )
820 	ROM_LOAD_NIB_LOW ( "inferno.f5",    0x0000, 0x0400, CRC(58472a73) SHA1(7f8b9502c3db11219d6b765dec7b6ff3f62d6c8b) )
821 	ROM_LOAD_NIB_HIGH( "inferno.e5",    0x0000, 0x0400, CRC(451942af) SHA1(0a03d74c1b98771d2170c76ca41e972300c34c3a) )
822 	ROM_LOAD_NIB_LOW ( "inferno.f6",    0x0400, 0x0400, CRC(d85a195b) SHA1(8250f8e80a9bf196d7bf122af9aad0ae00dedd26) )
823 	ROM_LOAD_NIB_HIGH( "inferno.e6",    0x0400, 0x0400, CRC(788ccfac) SHA1(dfa99745db1c3866bf568fad289485aa0850875a) )
824 	ROM_LOAD_NIB_LOW ( "inferno.f7",    0x0800, 0x0400, CRC(73b4e9a3) SHA1(d9de88748a3009f3fc1f90c96bfc9732dc6a4a22) )
825 	ROM_LOAD_NIB_HIGH( "inferno.e7",    0x0800, 0x0400, CRC(902d9b78) SHA1(3bebbba6c7d00bea2c687b965f59a9e55b430dfa) )
826 
827 	ROM_REGION( 0x00400, "gfx1", 0 )
828 	ROM_LOAD( "inferno.b8",     0x0200, 0x0200, CRC(1b06466b) SHA1(aef13ab84526ee7493837eef7f48d9ede65b8e62) )
829 ROM_END
830 
831 
832 
833 /*************************************
834  *
835  *  Driver initialization
836  *
837  *************************************/
838 
839 /* A fake for the missing ball sprites #3 and #4 */
840 void meadows_state::init_gypsyjug()
841 {
842 	static const uint8_t ball[16*2] =
843 	{
844 		0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
845 		0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
846 		0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00,
847 		0x01,0x80, 0x03,0xc0, 0x03,0xc0, 0x01,0x80
848 	};
849 	uint8_t *gfx2 = memregion("gfx2")->base();
850 	uint8_t *gfx3 = memregion("gfx3")->base();
851 	uint8_t *gfx4 = memregion("gfx4")->base();
852 	uint8_t *gfx5 = memregion("gfx5")->base();
853 	int len3 = memregion("gfx3")->bytes();
854 	int len4 = memregion("gfx4")->bytes();
855 
856 	memcpy(gfx3,gfx2,len3);
857 
858 	for (int i = 0; i < len4; i += 16*2)
859 	{
860 		memcpy(gfx4 + i, ball, sizeof(ball));
861 		memcpy(gfx5 + i, ball, sizeof(ball));
862 	}
863 }
864 
865 
866 /* A fake for inverting the data bus */
init_minferno()867 void meadows_state::init_minferno()
868 {
869 	/* create an inverted copy of the graphics data */
870 	uint8_t *mem = memregion("gfx1")->base();
871 	int length = memregion("gfx1")->bytes();
872 	for (int i = 0; i < length / 2; i++)
873 		mem[i] = ~mem[i + length / 2];
874 }
875 
876 
877 
878 /*************************************
879  *
880  *  Game drivers
881  *
882  *************************************/
883 
884 GAMEL( 1978, deadeye,  0, meadows,  meadows,  meadows_state, empty_init,    ROT0,  "Meadows Games, Inc.", "Dead Eye",          0, layout_deadeye )
885 GAME(  1978, bowl3d,   0, bowl3d,   bowl3d,   meadows_state, empty_init,    ROT90, "Meadows Games, Inc.", "3-D Bowling",       MACHINE_NO_SOUND )
886 GAMEL( 1978, gypsyjug, 0, meadows,  meadows,  meadows_state, init_gypsyjug, ROT0,  "Meadows Games, Inc.", "Gypsy Juggler",     MACHINE_IMPERFECT_GRAPHICS, layout_gypsyjug )
887 GAMEL( 1978, minferno, 0, minferno, minferno, meadows_state, init_minferno, ROT0,  "Meadows Games, Inc.", "Inferno (Meadows)", MACHINE_NO_SOUND, layout_minferno )
888