1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 /***************************************************************************
4 
5     Green Beret
6     Konami
7 
8     driver by Nicola Salmoria
9     correct rom naming information by Belgium Dump Team (17/06/2003)
10 
11     Games supported:
12         * Green Beret
13         * Rush'n Attack (US)
14         * Green Beret (bootleg)
15         * Mr. Goemon (Japan)
16 
17     gberetb is a bootleg hacked to run on different hardware.
18 
19     TODO
20         - Measure IRQ and NMI frequency (of an original board), is IRQ really tied to the same timer that triggers NMI?
21         - Dump Green Beret Bootleg proms and correct the locations. Bootleg has four proms while the original has three.
22         - Dump Green Beret Bootleg PAL
23 
24 ****************************************************************************
25 
26     Memory map
27 
28     0000-bfff   ROM
29     c000-c7ff   Color RAM
30     c800-cfff   Video RAM
31     d000-d0c0   Sprites (bank 0)
32     d100-d1c0   Sprites (bank 1)
33     d200-dfff   RAM
34     e000-e01f   ZRAM1 line scroll registers
35     e020-e03f   ZRAM2 bit 8 of line scroll registers
36 
37     read:
38     f200      DSW1
39                     bit 0-1 lives
40                     bit 2   cocktail/upright cabinet (0 = upright)
41                     bit 3-4 bonus
42                     bit 5-6 difficulty
43                     bit 7   demo sounds
44     f400      DSW2
45                     bit 0 = screen flip
46                     bit 1 = single/dual upright controls
47     f600      DSW0
48                     bit 0-1-2-3 coins per play Coin1
49                     bit 4-5-6-7 coins per play Coin2
50     f601      IN1 player 2 controls
51     f602      IN0 player 1 controls
52     f603      IN2
53                     bit 0-1-2 coin  bit 3 1 player start  bit 4 2 players start
54 
55     write:
56     e040      ?
57     e041      ?
58     e042      ?
59     e043      bit 3 = sprite RAM bank select; other bits = ?
60     e044      bit 0-2 = interrupt control; bit 3 = flip screen
61     f000      ?
62     f200      SN76496 command
63     f400      SN76496 trigger (write command to f200, then write to this location
64                                 to cause the chip to read it)
65     f600      watchdog reset
66 
67 ****************************************************************************
68 
69     Interrupts
70 
71     The game uses both IRQ (mode 1) and NMI via a custom interrupt controller.
72 
73 ***************************************************************************/
74 
75 #include "emu.h"
76 #include "includes/gberet.h"
77 #include "includes/konamipt.h"
78 
79 #include "cpu/z80/z80.h"
80 #include "machine/watchdog.h"
81 #include "sound/sn76496.h"
82 
83 #include "screen.h"
84 #include "speaker.h"
85 
86 
87 /*************************************
88  *
89  *  Interrupt generators
90  *
91  *************************************/
92 
TIMER_DEVICE_CALLBACK_MEMBER(gberet_state::gberet_interrupt_tick)93 TIMER_DEVICE_CALLBACK_MEMBER(gberet_state::gberet_interrupt_tick)
94 {
95 	uint8_t ticks_mask = ~m_interrupt_ticks & (m_interrupt_ticks + 1); // 0->1
96 	m_interrupt_ticks++;
97 
98 	// NMI on d0
99 	if (ticks_mask & m_interrupt_mask & 1)
100 		m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
101 
102 	// IRQ on d3 (used by mrgoemon)
103 	if (ticks_mask & m_interrupt_mask<<2 & 8)
104 		m_maincpu->set_input_line(0, ASSERT_LINE);
105 
106 	// IRQ on d4 (used by gberet)
107 	if (ticks_mask & m_interrupt_mask<<2 & 16)
108 		m_maincpu->set_input_line(0, ASSERT_LINE);
109 }
110 
111 
112 /*************************************
113  *
114  *  Address maps / Memory handlers
115  *
116  *************************************/
117 
gberet_coin_counter_w(uint8_t data)118 void gberet_state::gberet_coin_counter_w(uint8_t data)
119 {
120 	/* bits 0/1 = coin counters */
121 	machine().bookkeeping().coin_counter_w(0, data & 1);
122 	machine().bookkeeping().coin_counter_w(1, data & 2);
123 }
124 
mrgoemon_coin_counter_w(uint8_t data)125 void gberet_state::mrgoemon_coin_counter_w(uint8_t data)
126 {
127 	/* bits 0/1 = coin counters */
128 	machine().bookkeeping().coin_counter_w(0, data & 1);
129 	machine().bookkeeping().coin_counter_w(1, data & 2);
130 
131 	/* bits 5-7 = ROM bank select */
132 	membank("bank1")->set_entry(((data & 0xe0) >> 5));
133 }
134 
gberet_flipscreen_w(uint8_t data)135 void gberet_state::gberet_flipscreen_w(uint8_t data)
136 {
137 	/* bits 0/1/2 = interrupt enable */
138 	uint8_t ack_mask = ~data & m_interrupt_mask; // 1->0
139 
140 	if (ack_mask & 1)
141 		m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
142 
143 	if (ack_mask & 6)
144 		m_maincpu->set_input_line(0, CLEAR_LINE);
145 
146 	m_interrupt_mask = data & 7;
147 
148 	/* bit 3 = flip screen */
149 	flip_screen_set(data & 8);
150 }
151 
gberet_sound_w(uint8_t data)152 void gberet_state::gberet_sound_w(uint8_t data)
153 {
154 	m_sn->write(*m_soundlatch);
155 }
156 
gberet_map(address_map & map)157 void gberet_state::gberet_map(address_map &map)
158 {
159 	map(0x0000, 0xbfff).rom();
160 	map(0xc000, 0xc7ff).ram().w(FUNC(gberet_state::gberet_colorram_w)).share("colorram");
161 	map(0xc800, 0xcfff).ram().w(FUNC(gberet_state::gberet_videoram_w)).share("videoram");
162 	map(0xd000, 0xd0ff).ram().share("spriteram2");
163 	map(0xd100, 0xd1ff).ram().share("spriteram");
164 	map(0xd200, 0xdfff).ram();
165 	map(0xe000, 0xe03f).ram().w(FUNC(gberet_state::gberet_scroll_w)).share("scrollram");
166 	map(0xe040, 0xe042).nopw(); // ???
167 	map(0xe043, 0xe043).w(FUNC(gberet_state::gberet_sprite_bank_w));
168 	map(0xe044, 0xe044).w(FUNC(gberet_state::gberet_flipscreen_w));
169 	map(0xf000, 0xf000).w(FUNC(gberet_state::gberet_coin_counter_w));
170 	map(0xf200, 0xf200).portr("DSW2").writeonly().share("soundlatch");
171 	map(0xf400, 0xf400).portr("DSW3").w(FUNC(gberet_state::gberet_sound_w));
172 	map(0xf600, 0xf600).portr("DSW1").w("watchdog", FUNC(watchdog_timer_device::reset_w));
173 	map(0xf601, 0xf601).portr("P2");
174 	map(0xf602, 0xf602).portr("P1");
175 	map(0xf603, 0xf603).portr("SYSTEM");
176 }
177 
mrgoemon_map(address_map & map)178 void gberet_state::mrgoemon_map(address_map &map)
179 {
180 	map(0x0000, 0xbfff).rom();
181 	map(0xc000, 0xc7ff).ram().w(FUNC(gberet_state::gberet_colorram_w)).share("colorram");
182 	map(0xc800, 0xcfff).ram().w(FUNC(gberet_state::gberet_videoram_w)).share("videoram");
183 	map(0xd000, 0xd0ff).ram().share("spriteram2");
184 	map(0xd100, 0xd1ff).ram().share("spriteram");
185 	map(0xd200, 0xdfff).ram();
186 	map(0xe000, 0xe03f).ram().w(FUNC(gberet_state::gberet_scroll_w)).share("scrollram");
187 	map(0xe040, 0xe042).nopw(); // ???
188 	map(0xe043, 0xe043).w(FUNC(gberet_state::gberet_sprite_bank_w));
189 	map(0xe044, 0xe044).w(FUNC(gberet_state::gberet_flipscreen_w));
190 	map(0xf000, 0xf000).w(FUNC(gberet_state::mrgoemon_coin_counter_w));
191 	map(0xf200, 0xf200).portr("DSW2").writeonly().share("soundlatch");
192 	map(0xf400, 0xf400).portr("DSW3").w(FUNC(gberet_state::gberet_sound_w));
193 	map(0xf600, 0xf600).portr("DSW1").w("watchdog", FUNC(watchdog_timer_device::reset_w));
194 	map(0xf601, 0xf601).portr("P2");
195 	map(0xf602, 0xf602).portr("P1");
196 	map(0xf603, 0xf603).portr("SYSTEM");
197 	map(0xf800, 0xffff).bankr("bank1");
198 }
199 
200 
gberetb_flipscreen_w(uint8_t data)201 void gberet_state::gberetb_flipscreen_w(uint8_t data)
202 {
203 	flip_screen_set(data & 8);
204 }
205 
gberetb_irq_ack_r()206 uint8_t gberet_state::gberetb_irq_ack_r()
207 {
208 	m_maincpu->set_input_line(0, CLEAR_LINE);
209 	return 0xff;
210 }
211 
gberetb_nmi_ack_w(uint8_t data)212 void gberet_state::gberetb_nmi_ack_w(uint8_t data)
213 {
214 	m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
215 }
216 
gberetb_map(address_map & map)217 void gberet_state::gberetb_map(address_map &map)
218 {
219 	map(0x0000, 0xbfff).rom();
220 	map(0xc000, 0xc7ff).ram().w(FUNC(gberet_state::gberet_colorram_w)).share("colorram");
221 	map(0xc800, 0xcfff).ram().w(FUNC(gberet_state::gberet_videoram_w)).share("videoram");
222 	map(0xd000, 0xdfff).ram();
223 	map(0xe000, 0xe03f).ram();
224 	map(0xe040, 0xe043).nopw(); // ???
225 	map(0xe044, 0xe044).w(FUNC(gberet_state::gberetb_flipscreen_w)); // did hw even support flipscreen?
226 	map(0xe800, 0xe8ff).ram();
227 	map(0xe900, 0xe9ff).ram().share("spriteram");
228 	map(0xf000, 0xf000).nopw(); // coin counter not supported
229 	map(0xf200, 0xf200).portr("DSW2");
230 	map(0xf400, 0xf400).w(m_sn, FUNC(sn76489a_device::write));
231 	map(0xf600, 0xf600).portr("P2");
232 	map(0xf601, 0xf601).portr("DSW1");
233 	map(0xf602, 0xf602).portr("P1");
234 	map(0xf603, 0xf603).portr("SYSTEM");
235 	map(0xf800, 0xf800).rw(FUNC(gberet_state::gberetb_irq_ack_r), FUNC(gberet_state::gberetb_nmi_ack_w));
236 	map(0xf900, 0xf901).w(FUNC(gberet_state::gberetb_scroll_w));
237 }
238 
239 
240 /*************************************
241  *
242  *  Input ports
243  *
244  *************************************/
245 
246 static INPUT_PORTS_START( gberet )
247 	PORT_START("P1")
248 	KONAMI8_MONO_B12_UNK
249 
250 	PORT_START("P2")
251 	KONAMI8_COCKTAIL_B12_UNK
252 
253 	PORT_START("SYSTEM")
254 	KONAMI8_SYSTEM_UNK
255 
256 	PORT_START("DSW1")
257 	KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
258 	/* "No Coin B" = coins produce sound, but no effect on coin counter */
259 
260 	PORT_START("DSW2")
261 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )        PORT_DIPLOCATION("SW2:1,2")
262 	PORT_DIPSETTING(    0x03, "2" )
263 	PORT_DIPSETTING(    0x02, "3" )
264 	PORT_DIPSETTING(    0x01, "5" )
265 	PORT_DIPSETTING(    0x00, "7" )
266 	PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )      PORT_DIPLOCATION("SW2:3")
267 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
268 	PORT_DIPSETTING(    0x04, DEF_STR( Cocktail ) )
269 	PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) )   PORT_DIPLOCATION("SW2:4,5")
270 	PORT_DIPSETTING(    0x18, "30K, 70K, Every 70K" )
271 	PORT_DIPSETTING(    0x10, "40K, 80K, Every 80K" )   // Japanese default
272 	PORT_DIPSETTING(    0x08, "50K, 100K, Every 100K" ) // US default
273 	PORT_DIPSETTING(    0x00, "50K, 200K, Every 200K" )
274 	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )   PORT_DIPLOCATION("SW2:6,7")
275 	PORT_DIPSETTING(    0x60, DEF_STR( Easy ) )
276 	PORT_DIPSETTING(    0x40, DEF_STR( Normal ) )
277 	PORT_DIPSETTING(    0x20, DEF_STR( Difficult ) )
278 	PORT_DIPSETTING(    0x00, DEF_STR( Very_Difficult ) )
279 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )  PORT_DIPLOCATION("SW2:8")
280 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
281 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
282 
283 	PORT_START("DSW3")
284 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )  PORT_DIPLOCATION("SW3:1")
285 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
286 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
287 	PORT_DIPNAME( 0x02, 0x02, "Upright Controls" )      PORT_DIPLOCATION("SW3:2")
288 	PORT_DIPSETTING(    0x02, DEF_STR( Single ) )
289 	PORT_DIPSETTING(    0x00, DEF_STR( Dual ) )
290 	PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW3:3" )        /* Listed as "Unused" */
291 	PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" )        /* Listed as "Unused" */
292 INPUT_PORTS_END
293 
294 static INPUT_PORTS_START( gberetb )
295 	PORT_INCLUDE(gberet)
296 
297 	PORT_MODIFY("P2")
298 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
299 
300 	PORT_MODIFY("SYSTEM")
301 	PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
302 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
303 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
304 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
305 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
306 
307 	PORT_MODIFY("DSW3")
308 	PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
309 INPUT_PORTS_END
310 
311 static INPUT_PORTS_START( mrgoemon )
312 	PORT_INCLUDE(gberet)
313 
314 	PORT_MODIFY("DSW2")
315 	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )   PORT_DIPLOCATION("SW2:4,5")
316 	PORT_DIPSETTING(    0x18, "20K, Every 60K" )
317 	PORT_DIPSETTING(    0x10, "30K, Every 70K" )
318 	PORT_DIPSETTING(    0x08, "40K, Every 80K" )
319 	PORT_DIPSETTING(    0x00, "50K, Every 90K" )
320 
321 	PORT_MODIFY("DSW3")
322 	PORT_SERVICE_DIPLOC(   0x04, IP_ACTIVE_LOW, "SW3:3" )
323 INPUT_PORTS_END
324 
325 
326 /*************************************
327  *
328  *  Graphics definitions
329  *
330  *************************************/
331 
332 static const gfx_layout charlayout =
333 {
334 	8,8,    /* 8*8 characters */
335 	512,    /* 512 characters */
336 	4,      /* 4 bits per pixel */
337 	{ 0, 1, 2, 3 }, /* the four bitplanes are packed in one nibble */
338 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
339 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
340 	32*8    /* every char takes 8 consecutive bytes */
341 };
342 
343 static const gfx_layout spritelayout =
344 {
345 	16,16,  /* 16*16 sprites */
346 	512,    /* 512 sprites */
347 	4,      /* 4 bits per pixel */
348 	{ 0, 1, 2, 3 }, /* the four bitplanes are packed in one nibble */
349 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
350 		32*8+0*4, 32*8+1*4, 32*8+2*4, 32*8+3*4, 32*8+4*4, 32*8+5*4, 32*8+6*4, 32*8+7*4 },
351 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
352 		64*8+0*32, 64*8+1*32, 64*8+2*32, 64*8+3*32, 64*8+4*32, 64*8+5*32, 64*8+6*32, 64*8+7*32 },
353 	128*8   /* every sprite takes 128 consecutive bytes */
354 };
355 
356 static const gfx_layout gberetb_charlayout =
357 {
358 	8,8,    /* 8*8 characters */
359 	512,    /* 512 characters */
360 	4,      /* 4 bits per pixel */
361 	{ 0, 1, 2, 3 }, /* the four bitplanes are packed in one nibble */
362 	{ 6*4, 7*4, 0*4, 1*4, 2*4, 3*4, 4*4, 5*4 },
363 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
364 	32*8    /* every char takes 8 consecutive bytes */
365 };
366 
367 static const gfx_layout gberetb_spritelayout =
368 {
369 	16,16,  /* 16*16 sprites */
370 	512,    /* 512 sprites */
371 	4,      /* 4 bits per pixel */
372 	{ 0*0x4000*8, 1*0x4000*8, 2*0x4000*8, 3*0x4000*8 },
373 	{ 0, 1, 2, 3, 4, 5, 6, 7,
374 		16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7 },
375 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
376 		8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
377 	32*8    /* every sprite takes 32 consecutive bytes */
378 };
379 
380 static GFXDECODE_START( gfx_gberet )
381 	GFXDECODE_ENTRY( "gfx1", 0, charlayout,       0, 16 )
382 	GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16, 16 )
383 GFXDECODE_END
384 
GFXDECODE_START(gfx_gberetb)385 static GFXDECODE_START( gfx_gberetb )
386 	GFXDECODE_ENTRY( "gfx1", 0, gberetb_charlayout,       0, 16 )
387 	GFXDECODE_ENTRY( "gfx2", 0, gberetb_spritelayout, 16*16, 16 )
388 GFXDECODE_END
389 
390 
391 /*************************************
392  *
393  *  Machine drivers
394  *
395  *************************************/
396 
397 MACHINE_START_MEMBER(gberet_state,gberet)
398 {
399 	save_item(NAME(m_interrupt_mask));
400 	save_item(NAME(m_interrupt_ticks));
401 	save_item(NAME(m_spritebank));
402 }
403 
MACHINE_RESET_MEMBER(gberet_state,gberet)404 MACHINE_RESET_MEMBER(gberet_state,gberet)
405 {
406 	m_interrupt_mask = 0;
407 	m_interrupt_ticks = 0;
408 	m_spritebank = 0;
409 }
410 
gberet(machine_config & config)411 void gberet_state::gberet(machine_config &config)
412 {
413 	/* basic machine hardware */
414 	Z80(config, m_maincpu, XTAL(18'432'000)/6);      // X1S (generated by a custom IC)
415 	m_maincpu->set_addrmap(AS_PROGRAM, &gberet_state::gberet_map);
416 	TIMER(config, "scantimer").configure_scanline(FUNC(gberet_state::gberet_interrupt_tick), "screen", 0, 16);
417 	WATCHDOG_TIMER(config, "watchdog");
418 
419 	MCFG_MACHINE_START_OVERRIDE(gberet_state,gberet)
420 	MCFG_MACHINE_RESET_OVERRIDE(gberet_state,gberet)
421 
422 	/* video hardware */
423 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
424 	screen.set_refresh_hz(60.60);
425 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
426 	screen.set_size(32*8, 32*8);
427 	screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
428 	screen.set_screen_update(FUNC(gberet_state::screen_update_gberet));
429 	screen.set_palette(m_palette);
430 
431 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_gberet);
432 	PALETTE(config, m_palette, FUNC(gberet_state::gberet_palette), 2*16*16, 32);
433 	MCFG_VIDEO_START_OVERRIDE(gberet_state,gberet)
434 
435 	/* sound hardware */
436 	SPEAKER(config, "mono").front_center();
437 
438 	SN76489A(config, m_sn, XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "mono", 1.0); /* type verified on real and bootleg pcb */
439 }
440 
mrgoemon(machine_config & config)441 void gberet_state::mrgoemon(machine_config &config)
442 {
443 	gberet(config);
444 
445 	/* basic machine hardware */
446 	m_maincpu->set_addrmap(AS_PROGRAM, &gberet_state::mrgoemon_map);
447 }
448 
gberetb(machine_config & config)449 void gberet_state::gberetb(machine_config &config)
450 {
451 	/* basic machine hardware */
452 	Z80(config, m_maincpu, XTAL(20'000'000)/4); // divider guessed
453 	m_maincpu->set_addrmap(AS_PROGRAM, &gberet_state::gberetb_map);
454 	m_maincpu->set_vblank_int("screen", FUNC(gberet_state::irq0_line_assert));
455 	m_maincpu->set_periodic_int(FUNC(gberet_state::nmi_line_assert), attotime::from_hz(XTAL(20'000'000)/0x8000)); // divider guessed
456 
457 	MCFG_MACHINE_START_OVERRIDE(gberet_state,gberet)
458 	MCFG_MACHINE_RESET_OVERRIDE(gberet_state,gberet)
459 
460 	/* video hardware */
461 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
462 	screen.set_refresh_hz(60);
463 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
464 	screen.set_size(32*8, 32*8);
465 	screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
466 	screen.set_screen_update(FUNC(gberet_state::screen_update_gberetb));
467 	screen.set_palette(m_palette);
468 
469 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_gberetb);
470 	PALETTE(config, m_palette, FUNC(gberet_state::gberet_palette), 2*16*16, 32);
471 	MCFG_VIDEO_START_OVERRIDE(gberet_state,gberet)
472 
473 	/* sound hardware */
474 	SPEAKER(config, "mono").front_center();
475 
476 	SN76489A(config, m_sn, XTAL(20'000'000)/12).add_route(ALL_OUTPUTS, "mono", 1.0); // divider guessed
477 }
478 
479 
480 /*************************************
481  *
482  *  ROM definition(s)
483  *
484  *************************************/
485 
486 ROM_START( gberet )
487 	ROM_REGION( 0x10000, "maincpu", 0 ) // 64k for code
CRC(ae29e4ff)488 	ROM_LOAD( "577l03.10c",   0x0000, 0x4000, CRC(ae29e4ff) SHA1(5c66de1403c5df5b6647bb37e26070ffd33590e8) )
489 	ROM_LOAD( "577l02.8c",    0x4000, 0x4000, CRC(240836a5) SHA1(b76f3789f152198bf8a9a366378d664e683c6c9d) )
490 	ROM_LOAD( "577l01.7c",    0x8000, 0x4000, CRC(41fa3e1f) SHA1(90d1463e16b0f52c01078be044ce3672d4acebff) )
491 
492 	ROM_REGION( 0x04000, "gfx1", 0 )
493 	ROM_LOAD( "577l07.3f",    0x00000, 0x4000, CRC(4da7bd1b) SHA1(54adba9ae086852902d78ab36039498aae50d7a9) )
494 
495 	ROM_REGION( 0x10000, "gfx2", 0 )
496 	ROM_LOAD( "577l06.5e",    0x00000, 0x4000, CRC(0f1cb0ca) SHA1(094004e70c05df8cd486d0854c258fa766e2925d) )
497 	ROM_LOAD( "577l05.4e",    0x04000, 0x4000, CRC(523a8b66) SHA1(5f2bcf2b702fe05f8a022b6284cb2d0a5b5f222f) )
498 	ROM_LOAD( "577l08.4f",    0x08000, 0x4000, CRC(883933a4) SHA1(b565842edf09feeb2c4ac44ad58331757586b6aa) )
499 	ROM_LOAD( "577l04.3e",    0x0c000, 0x4000, CRC(ccecda4c) SHA1(cac053cab68cb420edd408ce032143db7abc29f5) )
500 
501 	ROM_REGION( 0x0220, "proms", 0 )
502 	ROM_LOAD( "577h09.2f",    0x0000, 0x0020, CRC(c15e7c80) SHA1(c0e8a01e63ed8cf20b33456b68890313b387ad23) ) // palette
503 	ROM_LOAD( "577h11.6f",    0x0020, 0x0100, CRC(2a1a992b) SHA1(77cff7c9c8433f999a87776021935864cf9dccb4) ) // characters
504 	ROM_LOAD( "577h10.5f",    0x0120, 0x0100, CRC(e9de1e53) SHA1(406b8dfe54e6176082005cc5545e79c098672547) ) // sprites
505 ROM_END
506 
507 ROM_START( rushatck )
508 	ROM_REGION( 0x10000, "maincpu", 0 ) // 64k for code
509 	ROM_LOAD( "577h03.10c",   0x0000, 0x4000, CRC(4d276b52) SHA1(ba5d61c89fd2db4b303b81deccc887561156cbe3) )
510 	ROM_LOAD( "577h02.8c",    0x4000, 0x4000, CRC(b5802806) SHA1(0e4698ecfb9eda916703165ea5d55516fdef5fe4) )
511 	ROM_LOAD( "577h01.7c",    0x8000, 0x4000, CRC(da7c8f3d) SHA1(eb61eedee169f67db93407ad0fe8a195089b7e3a) )
512 
513 	ROM_REGION( 0x04000, "gfx1", 0 )
514 	ROM_LOAD( "577h07.3f",    0x00000, 0x4000, CRC(03f9815f) SHA1(209c76fd36d1b5672992c55e24d3cf77d4c5a0aa) )
515 
516 	ROM_REGION( 0x10000, "gfx2", 0 )
517 	ROM_LOAD( "577l06.5e",    0x00000, 0x4000, CRC(0f1cb0ca) SHA1(094004e70c05df8cd486d0854c258fa766e2925d) )
518 	ROM_LOAD( "577h05.4e",    0x04000, 0x4000, CRC(9d028e8f) SHA1(4faa47152a6c1da0024bb03fbcf7baf0540e891e) )
519 	ROM_LOAD( "577l08.4f",    0x08000, 0x4000, CRC(883933a4) SHA1(b565842edf09feeb2c4ac44ad58331757586b6aa) )
520 	ROM_LOAD( "577l04.3e",    0x0c000, 0x4000, CRC(ccecda4c) SHA1(cac053cab68cb420edd408ce032143db7abc29f5) )
521 
522 	ROM_REGION( 0x0220, "proms", 0 )
523 	ROM_LOAD( "577h09.2f",    0x0000, 0x0020, CRC(c15e7c80) SHA1(c0e8a01e63ed8cf20b33456b68890313b387ad23) ) // palette
524 	ROM_LOAD( "577h11.6f",    0x0020, 0x0100, CRC(2a1a992b) SHA1(77cff7c9c8433f999a87776021935864cf9dccb4) ) // characters
525 	ROM_LOAD( "577h10.5f",    0x0120, 0x0100, CRC(e9de1e53) SHA1(406b8dfe54e6176082005cc5545e79c098672547) ) // sprites
526 ROM_END
527 
528 ROM_START( gberetb )
529 	ROM_REGION( 0x10000, "maincpu", 0 ) // 64k for code
530 	ROM_LOAD( "2-ic82.10g",   0x0000, 0x8000, CRC(6d6fb494) SHA1(0d01c86ed7a8962ee3e1056a8d41584ad1406f0f) )
531 	ROM_LOAD( "3-ic81.10f",   0x8000, 0x4000, CRC(f1520a0a) SHA1(227b2d2e1fc0e81ae02e663a3089e7399612e3cf) )
532 
533 	ROM_REGION( 0x04000, "gfx1", 0 )
534 	ROM_LOAD( "1-ic92.12c",   0x00000, 0x4000, CRC(b0189c87) SHA1(29202978b07bf059b88bf206d8fafc80e0cdb6dc) )
535 
536 	ROM_REGION( 0x10000, "gfx2", 0 )
537 	ROM_LOAD( "7-1c8.2b",     0x00000, 0x4000, CRC(86334522) SHA1(f2907d136dbfdb92cbd550524b4453755f6244b6) )
538 	ROM_LOAD( "6-ic9.2c",     0x04000, 0x4000, CRC(bda50d3e) SHA1(c6f5a15270a69464e977926d056b31dcec8b41c3) )
539 	ROM_LOAD( "5-ic10.2d",    0x08000, 0x4000, CRC(6a7b3881) SHA1(795bfb1fbc11ceac687b15e98574feb650e2f674) )
540 	ROM_LOAD( "4-ic11.2e",    0x0c000, 0x4000, CRC(3fb186c9) SHA1(40ce0447014af3f5b5b88648ab7e43a955bd1274) )
541 
542 	ROM_REGION( 0x0220, "proms", 0 )
543 	ROM_LOAD( "577h09",       0x0000, 0x0020, CRC(c15e7c80) SHA1(c0e8a01e63ed8cf20b33456b68890313b387ad23) ) // palette
544 	ROM_LOAD( "577h11.6f",    0x0020, 0x0100, CRC(2a1a992b) SHA1(77cff7c9c8433f999a87776021935864cf9dccb4) ) // characters
545 	ROM_LOAD( "577h10.5f",    0x0120, 0x0100, CRC(e9de1e53) SHA1(406b8dfe54e6176082005cc5545e79c098672547) ) // sprites
546 
547 	ROM_REGION( 0x0200, "plds", 0 )
548 	ROM_LOAD( "pal16r6_ic35.5h", 0x0000, 0x0104, CRC(bd76fb53) SHA1(2d0634e8edb3289a103719466465e9777606086e) )
549 ROM_END
550 
551 ROM_START( mrgoemon )
552 	ROM_REGION( 0x14000, "maincpu", 0 ) // 64k for code + banked ROM
553 	ROM_LOAD( "621d01.10c",   0x00000, 0x8000, CRC(b2219c56) SHA1(274160be5dabbbfa61af71d92bddffbb56eadab6) )
554 	ROM_LOAD( "621d02.12c",   0x08000, 0x4000, CRC(c3337a97) SHA1(6fd5f365b2624a37f252c202cd97877705b4a6c2) )
555 	ROM_CONTINUE(             0x10000, 0x4000 )
556 
557 	ROM_REGION( 0x04000, "gfx1", 0 )
558 	ROM_LOAD( "621a05.6d",    0x00000, 0x4000, CRC(f0a6dfc5) SHA1(395024ebfff550b0da393096483196fb1152a077) )
559 
560 	ROM_REGION( 0x10000, "gfx2", 0 )
561 	ROM_LOAD( "621d03.4d",    0x00000, 0x8000, CRC(66f2b973) SHA1(7e906f258a5f4928f9615c6ea176efbca659b3a7) )
562 	ROM_LOAD( "621d04.5d",    0x08000, 0x8000, CRC(47df6301) SHA1(e675c070e46993d3453c2ddadc49ec8b84cec854) )
563 
564 	ROM_REGION( 0x0220, "proms", 0 )
565 	ROM_LOAD( "621a06.5f",    0x0000, 0x0020, CRC(7c90de5f) SHA1(8ac5708e72e32f3d79ccde0cbaedefc34f8ac57e) ) // palette
566 	ROM_LOAD( "621a08.7f",    0x0020, 0x0100, CRC(2fb244dd) SHA1(ceb909ad96c0dabc8684e69b028f4287e227c351) ) // characters
567 	ROM_LOAD( "621a07.6f",    0x0120, 0x0100, CRC(3980acdc) SHA1(f4e0bd74bccd77b84096c38bc70cf488a42d9562) ) // sprites
568 ROM_END
569 
570 
571 /*************************************
572  *
573  *  Driver initialization
574  *
575  *************************************/
576 
577 void gberet_state::init_mrgoemon()
578 {
579 	uint8_t *ROM = memregion("maincpu")->base();
580 	membank("bank1")->configure_entries(0, 8, &ROM[0x10000], 0x800);
581 }
582 
583 
584 /*************************************
585  *
586  *  Game drivers
587  *
588  *************************************/
589 
590 GAME( 1985, gberet,   0,      gberet,   gberet,   gberet_state, empty_init,    ROT0, "Konami",  "Green Beret", MACHINE_SUPPORTS_SAVE )
591 GAME( 1985, rushatck, gberet, gberet,   gberet,   gberet_state, empty_init,    ROT0, "Konami",  "Rush'n Attack (US)", MACHINE_SUPPORTS_SAVE )
592 GAME( 1985, gberetb,  gberet, gberetb,  gberetb,  gberet_state, empty_init,    ROT0, "bootleg", "Green Beret (bootleg)", MACHINE_SUPPORTS_SAVE )
593 GAME( 1986, mrgoemon, 0,      mrgoemon, mrgoemon, gberet_state, init_mrgoemon, ROT0, "Konami",  "Mr. Goemon (Japan)", MACHINE_SUPPORTS_SAVE )
594