1 // license:BSD-3-Clause
2 // copyright-holders:Robbbert
3 /****************************************************************************************
4     PINBALL
5     Mr. Game 1B11188/0
6 
7     These games have a M68000 and 3x Z80, and a M114 Sound IC.
8     They have a video screen upon which the scores and other info is displayed.
9 
10 Status:
11 - motrshow, motrshowa, dakar working in the electronic sense, but not mechanically
12 - macattck most roms are missing
13 - wcup90 different hardware, partially coded based on macattck schematic
14 
15 How to set up the machine (motrshow, motrshowa, dakar):
16 - These machines need to be loaded with default settings before they can accept coins
17 - Press - key (minus in main keyboard)
18 - Press again until you see test 25 (Motor Show) or test 23 (Dakar)
19 - In the dipswitch menu turn off the Ram Protect switch
20 - Press Left shift and Right shift together (game stops responding)
21 - Turn the Ram Protect Switch back on
22 - Press F3 or reboot
23 - The default settings have been saved to nvram and you can insert coins
24 - However, the game cannot be played due to missing balls.
25 
26 ToDo:
27 - Support for electronic volume control
28 - Audio rom banking
29 - Most sounds missing due to unemulated M114 chip
30 
31 *****************************************************************************************/
32 
33 #include "emu.h"
34 #include "cpu/m68000/m68000.h"
35 #include "cpu/z80/z80.h"
36 #include "machine/74259.h"
37 #include "machine/i8255.h"
38 #include "machine/nvram.h"
39 #include "machine/timer.h"
40 //#include "machine/watchdog.h"
41 #include "sound/dac.h"
42 #include "sound/tms5220.h"
43 #include "video/resnet.h"
44 #include "emupal.h"
45 #include "screen.h"
46 #include "speaker.h"
47 
48 
49 class mrgame_state : public driver_device
50 {
51 public:
mrgame_state(const machine_config & mconfig,device_type type,const char * tag)52 	mrgame_state(const machine_config &mconfig, device_type type, const char *tag)
53 		: driver_device(mconfig, type, tag)
54 		, m_palette(*this, "palette")
55 		, m_p_videoram(*this, "videoram")
56 		, m_p_objectram(*this, "objectram")
57 		, m_gfxdecode(*this, "gfxdecode")
58 		, m_maincpu(*this, "maincpu")
59 		, m_audiocpu1(*this, "audiocpu1")
60 		, m_audiocpu2(*this, "audiocpu2")
61 		, m_videocpu(*this, "videocpu")
62 		, m_selectlatch(*this, "selectlatch")
63 		, m_io_dsw0(*this, "DSW0")
64 		, m_io_dsw1(*this, "DSW1")
65 		, m_io_x0(*this, "X0")
66 		, m_io_x1(*this, "X1")
67 	{ }
68 
69 	void mrgame(machine_config &config);
70 	void wcup90(machine_config &config);
71 
72 	void init_mrgame();
73 
74 protected:
75 	virtual void machine_start() override;
76 	virtual void machine_reset() override;
77 
78 private:
79 	void mrgame_palette(palette_device &palette) const;
80 	void ack1_w(uint8_t data);
81 	void ack2_w(uint8_t data);
82 	void portb_w(uint8_t data);
83 	void row_w(uint8_t data);
84 	void sound_w(uint8_t data);
85 	void triple_w(uint8_t data);
86 	void video_w(uint8_t data);
87 	DECLARE_WRITE_LINE_MEMBER(video_a11_w);
88 	DECLARE_WRITE_LINE_MEMBER(video_a12_w);
89 	DECLARE_WRITE_LINE_MEMBER(video_a13_w);
90 	DECLARE_WRITE_LINE_MEMBER(intst_w);
91 	DECLARE_WRITE_LINE_MEMBER(nmi_intst_w);
92 	DECLARE_WRITE_LINE_MEMBER(flip_w);
93 	uint8_t col_r();
94 	uint8_t sound_r();
95 	uint8_t porta_r();
96 	uint8_t portc_r();
97 	uint8_t rsw_r();
98 	DECLARE_WRITE_LINE_MEMBER(vblank_int_w);
99 	DECLARE_WRITE_LINE_MEMBER(vblank_nmi_w);
100 	TIMER_DEVICE_CALLBACK_MEMBER(irq_timer);
101 	uint32_t screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
102 
103 	void audio1_io(address_map &map);
104 	void audio1_map(address_map &map);
105 	void audio2_io(address_map &map);
106 	void audio2_map(address_map &map);
107 	void main_map(address_map &map);
108 	void video_map(address_map &map);
109 	void wcup90_video_map(address_map &map);
110 
111 	std::unique_ptr<bitmap_ind16> m_tile_bitmap;
112 	required_device<palette_device> m_palette;
113 	required_shared_ptr<uint8_t> m_p_videoram;
114 	required_shared_ptr<uint8_t> m_p_objectram;
115 	required_device<gfxdecode_device> m_gfxdecode;
116 
117 	bool m_ack1;
118 	bool m_ack2;
119 	bool m_ackv;
120 	bool m_flip;
121 	bool m_intst;
122 	uint8_t m_irq_state;
123 	uint8_t m_row_data;
124 	uint8_t m_sound_data;
125 	uint8_t m_gfx_bank;
126 	uint8_t m_video_data;
127 	uint8_t m_video_status;
128 
129 	required_device<m68000_device> m_maincpu;
130 	required_device<z80_device> m_audiocpu1;
131 	required_device<z80_device> m_audiocpu2;
132 	required_device<z80_device> m_videocpu;
133 	required_device<ls259_device> m_selectlatch;
134 	required_ioport m_io_dsw0;
135 	required_ioport m_io_dsw1;
136 	required_ioport m_io_x0;
137 	required_ioport m_io_x1;
138 };
139 
140 
main_map(address_map & map)141 void mrgame_state::main_map(address_map &map)
142 {
143 	map(0x000000, 0x00ffff).rom().region("roms", 0);
144 	map(0x020000, 0x02ffff).ram().share("nvram");
145 	map(0x030001, 0x030001).r(FUNC(mrgame_state::rsw_r)); //RSW ACK
146 	map(0x030003, 0x030003).w(FUNC(mrgame_state::sound_w)); //W SOUND
147 	map(0x030004, 0x030004).w(FUNC(mrgame_state::video_w)); //W VID
148 	map(0x030007, 0x030007).w(FUNC(mrgame_state::triple_w)); //W CS
149 	map(0x030008, 0x030009).nopw(); //W DATA - lamp/sol data
150 	map(0x03000b, 0x03000b).w(FUNC(mrgame_state::row_w)); //W ROW
151 	map(0x03000d, 0x03000d).r(FUNC(mrgame_state::col_r)); //R COL
152 	map(0x03000e, 0x03000f).nopw(); //EXT ADD - lamp/sol data
153 }
154 
video_map(address_map & map)155 void mrgame_state::video_map(address_map &map)
156 {
157 	map(0x0000, 0x3fff).rom().region("video", 0);
158 	map(0x4000, 0x47ff).ram();
159 	map(0x4800, 0x4bff).mirror(0x0400).ram().share("videoram");
160 	map(0x5000, 0x50ff).mirror(0x0700).ram().share("objectram");
161 	map(0x6800, 0x6807).mirror(0x07f8).w(m_selectlatch, FUNC(ls259_device::write_d0));
162 	map(0x7000, 0x7000).mirror(0x07ff).nopr(); //AFR - watchdog reset
163 	map(0x8100, 0x8103).mirror(0x7efc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
164 }
165 
wcup90_video_map(address_map & map)166 void mrgame_state::wcup90_video_map(address_map &map)
167 {
168 	map(0x0000, 0x7fff).rom().region("video", 0);
169 	map(0x8000, 0x87ff).ram();
170 	map(0x8800, 0x8bff).mirror(0x0400).ram().share("videoram");
171 	map(0x9000, 0x90ff).mirror(0x0700).ram().share("objectram");
172 	map(0xa800, 0xa807).mirror(0x07f8).w(m_selectlatch, FUNC(ls259_device::write_d0));
173 	map(0xb000, 0xb000).mirror(0x07ff).nopr(); //AFR - watchdog reset
174 	map(0xc000, 0xc003).mirror(0x3ffc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
175 }
176 
audio1_map(address_map & map)177 void mrgame_state::audio1_map(address_map &map)
178 {
179 	map(0x0000, 0x7fff).rom().region("audio1", 0);
180 	map(0xfc00, 0xffff).ram();
181 }
182 
audio1_io(address_map & map)183 void mrgame_state::audio1_io(address_map &map)
184 {
185 	map.global_mask(3);
186 	map(0x0000, 0x0000).w("dacvol", FUNC(dac_byte_interface::data_w)); //DA1
187 	map(0x0001, 0x0001).r(FUNC(mrgame_state::sound_r)); //IN1
188 	map(0x0002, 0x0002).w(FUNC(mrgame_state::ack1_w)); //AKL1
189 	map(0x0003, 0x0003).nopw(); //SGS pass data to M114
190 }
191 
audio2_map(address_map & map)192 void mrgame_state::audio2_map(address_map &map)
193 {
194 	map(0x0000, 0x7fff).rom().region("audio2", 0);
195 	map(0xfc00, 0xffff).ram();
196 }
197 
audio2_io(address_map & map)198 void mrgame_state::audio2_io(address_map &map)
199 {
200 	map.global_mask(7);
201 	map(0x0000, 0x0000).w("ldac", FUNC(dac_byte_interface::data_w)); //DA2
202 	map(0x0001, 0x0001).r(FUNC(mrgame_state::sound_r)); //IN2
203 	map(0x0002, 0x0002).w(FUNC(mrgame_state::ack2_w)); //AKL2
204 	map(0x0003, 0x0003).rw("tms", FUNC(tms5220_device::status_r), FUNC(tms5220_device::data_w)); //Speech
205 	map(0x0004, 0x0004).w("rdac", FUNC(dac_byte_interface::data_w)); //DA3
206 }
207 
208 static INPUT_PORTS_START( mrgame )
209 	PORT_START("DSW0")
210 	PORT_DIPNAME( 0x01, 0x00, "Ram Protect")
DEF_STR(Off)211 	PORT_DIPSETTING(    0x01, DEF_STR( Off ))
212 	PORT_DIPSETTING(    0x00, DEF_STR( On ))
213 	PORT_DIPNAME( 0x0e, 0x0e, "Country")
214 	PORT_DIPSETTING(    0x00, "Italy 1")
215 	PORT_DIPSETTING(    0x02, "Italy")
216 	PORT_DIPSETTING(    0x04, "Great Britain")
217 	PORT_DIPSETTING(    0x06, "France")
218 	PORT_DIPSETTING(    0x08, "Germany")
219 	PORT_DIPSETTING(    0x0a, "Belgium")
220 	PORT_DIPSETTING(    0x0c, "Yugoslavia")
221 	PORT_DIPSETTING(    0x0e, "U.S.A.")
222 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R. Flipper") PORT_CODE(KEYCODE_RSHIFT)
223 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L. Flipper") PORT_CODE(KEYCODE_LSHIFT)
224 
225 	// These dips are only documented for Motor Show
226 	PORT_START("DSW1")
227 	PORT_DIPNAME( 0x01, 0x00, "Test Game")
228 	PORT_DIPSETTING(    0x01, "Connected")
229 	PORT_DIPSETTING(    0x00, "Disconnected")
230 	PORT_DIPNAME( 0x02, 0x02, "Dragster")
231 	PORT_DIPSETTING(    0x02, DEF_STR( Easy ))
232 	PORT_DIPSETTING(    0x00, DEF_STR( Hard ))
233 	PORT_DIPNAME( 0x04, 0x04, "F.1.")
234 	PORT_DIPSETTING(    0x04, DEF_STR( Easy ))
235 	PORT_DIPSETTING(    0x00, DEF_STR( Hard ))
236 	PORT_DIPNAME( 0x08, 0x08, "Motocross")
237 	PORT_DIPSETTING(    0x08, DEF_STR( Easy ))
238 	PORT_DIPSETTING(    0x00, DEF_STR( Hard ))
239 
240 	PORT_START("X0")
241 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Advance Test")
242 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Return Test")
243 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
244 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE )
245 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
246 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
247 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
248 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
249 
250 	PORT_START("X1")
251 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 )
252 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
253 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE4 ) PORT_NAME("Factory Burn Test")
254 	PORT_BIT( 0xe9, IP_ACTIVE_LOW, IPT_UNUSED )
255 INPUT_PORTS_END
256 
257 uint8_t mrgame_state::rsw_r()
258 {
259 	return m_io_dsw0->read() | ((uint8_t)m_ack1 << 5) | ((uint8_t)m_ack2 << 4);
260 }
261 
262 // this is like a keyboard, energise a row and read the column data
col_r()263 uint8_t mrgame_state::col_r()
264 {
265 	if (m_row_data == 0)
266 		return m_io_x0->read();
267 	else
268 	if (m_row_data == 1)
269 		return m_io_x1->read();
270 	else
271 	if (m_row_data == 7)
272 		return m_video_status;
273 	else
274 
275 	return 0xff;
276 }
277 
row_w(uint8_t data)278 void mrgame_state::row_w(uint8_t data)
279 {
280 	m_row_data = data & 7;
281 }
282 
sound_r()283 uint8_t mrgame_state::sound_r()
284 {
285 	return m_sound_data;
286 }
287 
sound_w(uint8_t data)288 void mrgame_state::sound_w(uint8_t data)
289 {
290 	m_sound_data = data;
291 	m_audiocpu1->set_input_line(INPUT_LINE_NMI, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
292 	m_audiocpu2->set_input_line(INPUT_LINE_NMI, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
293 }
294 
295 // this produces 24 outputs from three driver chips to drive lamps & solenoids
triple_w(uint8_t data)296 void mrgame_state::triple_w(uint8_t data)
297 {
298 	if ((data & 0x18)==0)
299 		m_ackv = BIT(data, 7);
300 }
301 
video_w(uint8_t data)302 void mrgame_state::video_w(uint8_t data)
303 {
304 	m_video_data = data;
305 }
306 
WRITE_LINE_MEMBER(mrgame_state::video_a11_w)307 WRITE_LINE_MEMBER(mrgame_state::video_a11_w)
308 {
309 	m_gfx_bank = (m_gfx_bank & 6) | (state ? 1 : 0);
310 }
311 
WRITE_LINE_MEMBER(mrgame_state::video_a12_w)312 WRITE_LINE_MEMBER(mrgame_state::video_a12_w)
313 {
314 	m_gfx_bank = (m_gfx_bank & 5) | (state ? 2 : 0);
315 }
316 
WRITE_LINE_MEMBER(mrgame_state::video_a13_w)317 WRITE_LINE_MEMBER(mrgame_state::video_a13_w)
318 {
319 	m_gfx_bank = (m_gfx_bank & 3) | (state ? 4 : 0);
320 }
321 
WRITE_LINE_MEMBER(mrgame_state::intst_w)322 WRITE_LINE_MEMBER(mrgame_state::intst_w)
323 {
324 	m_intst = state;
325 	if (!state)
326 		m_videocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
327 }
328 
WRITE_LINE_MEMBER(mrgame_state::nmi_intst_w)329 WRITE_LINE_MEMBER(mrgame_state::nmi_intst_w)
330 {
331 	m_intst = state;
332 	if (!state)
333 		m_videocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
334 }
335 
WRITE_LINE_MEMBER(mrgame_state::flip_w)336 WRITE_LINE_MEMBER(mrgame_state::flip_w)
337 {
338 	m_flip = state;
339 }
340 
ack1_w(uint8_t data)341 void mrgame_state::ack1_w(uint8_t data)
342 {
343 	m_ack1 = BIT(data, 0);
344 }
345 
ack2_w(uint8_t data)346 void mrgame_state::ack2_w(uint8_t data)
347 {
348 	m_ack2 = BIT(data, 0);
349 }
350 
porta_r()351 uint8_t mrgame_state::porta_r()
352 {
353 	return m_video_data;
354 }
355 
portb_w(uint8_t data)356 void mrgame_state::portb_w(uint8_t data)
357 {
358 	m_video_status = data;
359 	m_ackv = 0;
360 }
361 
portc_r()362 uint8_t mrgame_state::portc_r()
363 {
364 	return m_io_dsw1->read() | ((uint8_t)m_ackv << 4);
365 }
366 
machine_start()367 void mrgame_state::machine_start()
368 {
369 	m_tile_bitmap=std::make_unique<bitmap_ind16>(256,256);
370 }
371 
machine_reset()372 void mrgame_state::machine_reset()
373 {
374 	m_sound_data = 0xff;
375 	m_irq_state = 0xff;
376 	m_video_data = 0;
377 	m_gfx_bank = 0;
378 	m_video_status = 0;
379 	m_ack1 = 0;
380 	m_ack2 = 0;
381 	m_ackv = 0;
382 	m_flip = 0;
383 	m_row_data = 0;
384 }
385 
init_mrgame()386 void mrgame_state::init_mrgame()
387 {
388 }
389 
WRITE_LINE_MEMBER(mrgame_state::vblank_int_w)390 WRITE_LINE_MEMBER(mrgame_state::vblank_int_w)
391 {
392 	if (state && m_intst)
393 		m_videocpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
394 }
395 
WRITE_LINE_MEMBER(mrgame_state::vblank_nmi_w)396 WRITE_LINE_MEMBER(mrgame_state::vblank_nmi_w)
397 {
398 	if (state && m_intst)
399 		m_videocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
400 }
401 
402 // This pulses the IRQ pins of both audio cpus. The schematic does not
403 //show which 4040 output is used, so we have guessed.
TIMER_DEVICE_CALLBACK_MEMBER(mrgame_state::irq_timer)404 TIMER_DEVICE_CALLBACK_MEMBER(mrgame_state::irq_timer)
405 {
406 	m_irq_state++;
407 	// pulse_line of IRQ not allowed, so trying this instead
408 	if (m_irq_state == 254)
409 	{
410 		m_audiocpu1->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
411 		m_audiocpu2->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
412 	}
413 	else
414 	if (m_irq_state == 255)
415 	{
416 		m_audiocpu1->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
417 		m_audiocpu2->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
418 	}
419 }
420 
421 // layouts from pinmame
422 static const gfx_layout charlayout =
423 {
424 	8, 8,
425 	4096,
426 	2,
427 	{ 0, 0x8000*8 },
428 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
429 	{ 0, 8, 16, 24, 32, 40, 48, 56 },
430 	8*8
431 };
432 
433 static const gfx_layout spritelayout =
434 {
435 	16, 16,
436 	1024,
437 	2,
438 	{ 0, 0x8000*8 },
439 	{ 0, 1, 2, 3, 4, 5, 6, 7, 64, 65, 66, 67, 68, 69, 70, 71 },
440 	{ 0, 8, 16, 24, 32, 40, 48, 56, 128, 136, 144, 152, 160, 168, 176, 184 },
441 	32*8
442 };
443 
444 static GFXDECODE_START(gfx_mrgame)
445 	GFXDECODE_ENTRY("chargen", 0, charlayout, 0, 16)
446 	GFXDECODE_ENTRY("chargen", 0, spritelayout, 0, 16)
447 GFXDECODE_END
448 
mrgame_palette(palette_device & palette) const449 void mrgame_state::mrgame_palette(palette_device &palette) const
450 {
451 	static constexpr int resistances[3] = { 1000, 470, 220 };
452 	uint8_t const *const color_prom = machine().root_device().memregion("proms")->base();
453 
454 	// compute the color output resistor weights
455 	double rweights[3], gweights[3], bweights[2];
456 	compute_resistor_weights(0, 255, -1.0,
457 			3, &resistances[0], rweights, 0, 0,
458 			3, &resistances[0], gweights, 0, 0,
459 			2, &resistances[1], bweights, 0, 0);
460 
461 	// create a lookup table for the palette
462 	for (uint8_t i = 0; i < 32; i++)
463 	{
464 		uint8_t bit0, bit1, bit2;
465 
466 		// red component
467 		bit0 = BIT(color_prom[i], 0);
468 		bit1 = BIT(color_prom[i], 1);
469 		bit2 = BIT(color_prom[i], 2);
470 		uint8_t const r = combine_weights(rweights, bit0, bit1, bit2);
471 
472 		// green component
473 		bit0 = BIT(color_prom[i], 3);
474 		bit1 = BIT(color_prom[i], 4);
475 		bit2 = BIT(color_prom[i], 5);
476 		uint8_t const g = combine_weights(gweights, bit0, bit1, bit2);
477 
478 		// blue component
479 		bit0 = BIT(color_prom[i], 6);
480 		bit1 = BIT(color_prom[i], 7);
481 		uint8_t const b = combine_weights(bweights, bit0, bit1);
482 
483 		palette.set_pen_color(i, rgb_t(r, g, b));
484 		palette.set_pen_color(i + 32, rgb_t(r, g, b));
485 	}
486 }
487 
488 // most of this came from pinmame as the diagram doesn't make a lot of sense
screen_update_mrgame(screen_device & screen,bitmap_ind16 & bitmap,const rectangle & cliprect)489 uint32_t mrgame_state::screen_update_mrgame(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
490 {
491 	uint8_t x,y,ptr=0,col;
492 	int32_t scrolly[32];
493 	uint16_t chr;
494 	bool flipx,flipy;
495 
496 	// text
497 	for (x = 0; x < 32; x++)
498 	{
499 		scrolly[x] = -m_p_objectram[ptr++];
500 		col = m_p_objectram[ptr++];
501 
502 		for (y = 0; y < 32; y++)
503 		{
504 			chr = m_p_videoram[x+y*32] | (m_gfx_bank << 8);
505 
506 			m_gfxdecode->gfx(0)->opaque(*m_tile_bitmap, m_tile_bitmap->cliprect(),
507 				chr,
508 				col,
509 				m_flip,0,
510 				x*8,y*8);
511 		}
512 	}
513 
514 	// scroll each column as needed
515 	copyscrollbitmap(bitmap,*m_tile_bitmap,0,nullptr,32,scrolly,cliprect);
516 
517 
518 	// sprites
519 	for (ptr = 0x40; ptr < 0x60; ptr += 4)
520 	{
521 		x = m_p_objectram[ptr + 3] + 1;
522 		y = 255 - m_p_objectram[ptr];
523 		flipx = BIT(m_p_objectram[ptr + 1], 6);
524 		flipy = BIT(m_p_objectram[ptr + 1], 7);
525 		chr = (m_p_objectram[ptr + 1] & 0x3f) | (m_gfx_bank << 6);
526 		col = m_p_objectram[ptr + 2];
527 
528 		if ((y > 16) && (x > 24))
529 			m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
530 				chr,
531 				col,
532 				flipx,flipy,
533 				x,y-16,0);
534 	}
535 
536 	return 0;
537 }
538 
mrgame(machine_config & config)539 void mrgame_state::mrgame(machine_config &config)
540 {
541 	/* basic machine hardware */
542 	M68000(config, m_maincpu, 6_MHz_XTAL);
543 	m_maincpu->set_addrmap(AS_PROGRAM, &mrgame_state::main_map);
544 	m_maincpu->set_periodic_int(FUNC(mrgame_state::irq1_line_hold), attotime::from_hz(183));
545 
546 	Z80(config, m_videocpu, 18.432_MHz_XTAL / 6);
547 	m_videocpu->set_addrmap(AS_PROGRAM, &mrgame_state::video_map);
548 
549 	Z80(config, m_audiocpu1, 4_MHz_XTAL);
550 	m_audiocpu1->set_addrmap(AS_PROGRAM, &mrgame_state::audio1_map);
551 	m_audiocpu1->set_addrmap(AS_IO, &mrgame_state::audio1_io);
552 
553 	Z80(config, m_audiocpu2, 4_MHz_XTAL);
554 	m_audiocpu2->set_addrmap(AS_PROGRAM, &mrgame_state::audio2_map);
555 	m_audiocpu2->set_addrmap(AS_IO, &mrgame_state::audio2_io);
556 
557 	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5564 (x2) + battery
558 
559 	LS259(config, m_selectlatch); // 5B
560 	m_selectlatch->q_out_cb<0>().set(FUNC(mrgame_state::video_a11_w));
561 	m_selectlatch->q_out_cb<1>().set(FUNC(mrgame_state::nmi_intst_w));
562 	m_selectlatch->q_out_cb<3>().set(FUNC(mrgame_state::video_a12_w));
563 	m_selectlatch->q_out_cb<4>().set(FUNC(mrgame_state::video_a13_w));
564 	m_selectlatch->q_out_cb<6>().set(FUNC(mrgame_state::flip_w));
565 
566 	//watchdog_timer_device &watchdog(WATCHDOG_TIMER(config, "watchdog")); // LS393 at 5D (video board) driven by VBLANK
567 	//watchdog.set_vblank_count("screen", 8);
568 
569 	/* video hardware */
570 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
571 	screen.set_raw(18.432_MHz_XTAL / 3, 384, 0, 256, 264, 8, 248); // If you align with X on test screen some info is chopped off
572 	screen.set_screen_update(FUNC(mrgame_state::screen_update_mrgame));
573 	screen.set_palette(m_palette);
574 	screen.screen_vblank().set(FUNC(mrgame_state::vblank_nmi_w));
575 
576 	PALETTE(config, m_palette, FUNC(mrgame_state::mrgame_palette), 64);
577 
578 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_mrgame);
579 
580 	/* Sound */
581 	SPEAKER(config, "lspeaker").front_left();
582 	SPEAKER(config, "rspeaker").front_right();
583 	DAC_8BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
584 	DAC_8BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
585 
586 	dac_8bit_r2r_device &dacvol(DAC_8BIT_R2R(config, "dacvol", 0));
587 	dacvol.set_output_range(0, 1); // unknown DAC
588 	dacvol.add_route(0, "ldac", 1.0, DAC_INPUT_RANGE_HI);
589 	dacvol.add_route(0, "ldac", -1.0, DAC_INPUT_RANGE_LO);
590 	dacvol.add_route(0, "rdac", 1.0, DAC_INPUT_RANGE_HI);
591 	dacvol.add_route(0, "rdac", -1.0, DAC_INPUT_RANGE_LO);
592 
593 	tms5220_device &tms(TMS5220(config, "tms", 672000)); // uses a RC combination. 672k copied from jedi.h
594 	tms.ready_cb().set_inputline("audiocpu2", Z80_INPUT_LINE_BOGUSWAIT);
595 	tms.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
596 	tms.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
597 
598 	/* Devices */
599 	TIMER(config, "irq_timer").configure_periodic(FUNC(mrgame_state::irq_timer), attotime::from_hz(16000)); //ugh
600 
601 	i8255_device &ppi(I8255A(config, "ppi"));
602 	ppi.in_pa_callback().set(FUNC(mrgame_state::porta_r));
603 	ppi.out_pb_callback().set(FUNC(mrgame_state::portb_w));
604 	ppi.in_pc_callback().set(FUNC(mrgame_state::portc_r));
605 }
606 
wcup90(machine_config & config)607 void mrgame_state::wcup90(machine_config &config)
608 {
609 	mrgame(config);
610 
611 	m_videocpu->set_addrmap(AS_PROGRAM, &mrgame_state::wcup90_video_map);
612 
613 	m_selectlatch->q_out_cb<1>().set(FUNC(mrgame_state::intst_w)); // U48
614 
615 	subdevice<screen_device>("screen")->screen_vblank().set(FUNC(mrgame_state::vblank_int_w));
616 }
617 
618 /*-------------------------------------------------------------------
619 / Dakar (06/1988)
620 /-------------------------------------------------------------------*/
621 ROM_START(dakar)
622 	ROM_REGION16_BE(0x10000, "roms", 0)
623 	ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000000, 0x8000, CRC(83183929) SHA1(977ac10a1e78c759eb0550794f2639fe0e2d1507))
624 	ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000001, 0x8000, CRC(2010d28d) SHA1(d262dabd9298566df43df298cf71c974bee1434a))
625 
626 	ROM_REGION(0x8000, "video", 0)
627 	ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(88a9ca81) SHA1(9660d416b2b8f1937cda7bca51bd287641c7730c))
628 
629 	ROM_REGION(0x10000, "chargen", 0)
630 	ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(3c68b448) SHA1(f416f00d2de0c71c021fec0e9702ba79b761d5e7))
631 	ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(0aac43e9) SHA1(28edfeddb2d54e40425488bad37e3819e4488b0b))
632 
633 	ROM_REGION(0x0020, "proms", 0)
634 	ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(c8269b27) SHA1(daa83bfdb1e255b846bbade7f200abeaa9399c06))
635 
636 	ROM_REGION(0x10000, "audio1", 0)
637 	ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(29e9417e) SHA1(24f465993da7c93d385ec453497f2af4d8abb6f4))
638 	ROM_LOAD("snd_ic07.rom", 0x8000, 0x8000, CRC(71ab15fe) SHA1(245842bb41410ea481539700f79c7ef94f8f8924))
639 
640 	ROM_REGION(0x4000, "m114", 0)
641 	ROM_LOAD("snd_ic22.rom", 0x0000, 0x4000, CRC(e6c1098e) SHA1(06bf8917a27d5e46e4aab93e1f212918418e3a82))
642 
643 	ROM_REGION(0x10000, "audio2", 0)
644 	ROM_LOAD("snd_ic35.rom", 0x0000, 0x8000, CRC(7b2394d1) SHA1(f588f5105d75b54dd65bb6448a2d7774fb8477ec))
645 	ROM_LOAD("snd_ic36.rom", 0x8000, 0x8000, CRC(4039ea65) SHA1(390fce94d1e48b395157d8d9afaa485114c58d52))
646 ROM_END
647 
648 /*-------------------------------------------------------------------
649 / Motor Show (1989)
650 /-------------------------------------------------------------------*/
651 ROM_START(motrshow)
652 	ROM_REGION16_BE(0x10000, "roms", 0)
653 	ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000000, 0x8000, CRC(e862ca71) SHA1(b02e5f39f9427d58b70b7999a5ff6075beff05ae))
654 	ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000001, 0x8000, CRC(c898ae25) SHA1(f0e1369284a1e0f394f1d40281fd46252016602e))
655 
656 	ROM_REGION(0x8000, "video", 0)
657 	ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97))
658 
659 	ROM_REGION(0x10000, "chargen", 0)
660 	ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db))
661 	ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737))
662 
663 	ROM_REGION(0x0020, "proms", 0)
664 	ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8))
665 
666 	ROM_REGION(0x10000, "audio1", 0)
667 	ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(fba5a8f1) SHA1(ddf989abebe05c569c9ecdd498bd8ea409df88ac))
668 
669 	ROM_REGION(0x4000, "m114", 0)
670 	ROM_LOAD("snd_ic22.rom", 0x0000, 0x4000, CRC(e6c1098e) SHA1(06bf8917a27d5e46e4aab93e1f212918418e3a82))
671 
672 	ROM_REGION(0x10000, "audio2", 0)
673 	ROM_LOAD("snd_ic35.rom", 0x0000, 0x8000, CRC(9dec153d) SHA1(8a0140257316aa19c0401456839e11b6896609b1))
674 	ROM_LOAD("snd_ic36.rom", 0x8000, 0x8000, CRC(4f42be6e) SHA1(684e988f413cd21c785ad5d60ef5eaddddaf72ab))
675 ROM_END
676 
677 ROM_START(motrshowa)
678 	ROM_REGION16_BE(0x10000, "roms", 0)
679 	ROM_LOAD16_BYTE("cpuic13a.rom", 0x000000, 0x8000, CRC(2dbdd9d4) SHA1(b404814a4e83ead6da3c57818ae97f23d380f9da))
680 	ROM_LOAD16_BYTE("cpuic14b.rom", 0x000001, 0x8000, CRC(0bd98fec) SHA1(b90a7e997db59740398003ba94a69118b1ee70af))
681 
682 	ROM_REGION(0x8000, "video", 0)
683 	ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97))
684 
685 	ROM_REGION(0x10000, "chargen", 0)
686 	ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db))
687 	ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737))
688 
689 	ROM_REGION(0x0020, "proms", 0)
690 	ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8))
691 
692 	ROM_REGION(0x10000, "audio1", 0)
693 	ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(fba5a8f1) SHA1(ddf989abebe05c569c9ecdd498bd8ea409df88ac))
694 
695 	ROM_REGION(0x4000, "m114", 0)
696 	ROM_LOAD("snd_ic22.rom", 0x0000, 0x4000, CRC(e6c1098e) SHA1(06bf8917a27d5e46e4aab93e1f212918418e3a82))
697 
698 	ROM_REGION(0x10000, "audio2", 0)
699 	ROM_LOAD("snd_ic35.rom", 0x0000, 0x8000, CRC(9dec153d) SHA1(8a0140257316aa19c0401456839e11b6896609b1))
700 	ROM_LOAD("snd_ic36.rom", 0x8000, 0x8000, CRC(4f42be6e) SHA1(684e988f413cd21c785ad5d60ef5eaddddaf72ab))
701 ROM_END
702 
703 /*-------------------------------------------------------------------
704 / Mac Attack (1990)
705 /-------------------------------------------------------------------*/
706 ROM_START(macattck)
707 	ROM_REGION16_BE(0x10000, "roms", 0)
708 	ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000000, 0x8000, NO_DUMP)
709 	ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000001, 0x8000, NO_DUMP)
710 
711 	ROM_REGION(0x8000, "video", 0)
712 	ROM_LOAD("vid_ic91.rom", 0x0000, 0x8000, CRC(42d2ba01) SHA1(c13d38c2798575760461912cef65dde57dfd938c))
713 
714 	ROM_REGION(0x30000, "chargen", 0)
715 	ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(f6e047fb) SHA1(6be712dda60257b9e7014315c8fee19812622bf6))
716 	ROM_LOAD("vid_ic15.rom", 0x08000, 0x8000, CRC(405a8f54) SHA1(4d58915763db3c3be2bfc166be1a12285ff2c38b))
717 	ROM_LOAD("vid_ic16.rom", 0x10000, 0x8000, CRC(063ea783) SHA1(385dbfcc8ecd3a784f9a8752d00e060b48d70d6a))
718 	ROM_LOAD("vid_ic17.rom", 0x18000, 0x8000, CRC(9f95abf8) SHA1(d71cf36c8bf27ad41b2d3cebd0af620a34ce0062) BAD_DUMP)
719 	ROM_LOAD("vid_ic18.rom", 0x20000, 0x8000, CRC(83ef25f8) SHA1(bab482badb8646b099dbb197ca9af3a126b274e3))
720 
721 	ROM_REGION(0x0020, "proms", 0)
722 	ROM_LOAD("vid_ic61.rom", 0x0000, 0x0020, CRC(538c72ae) SHA1(f704492568257fcc4a4f1189207c6fb6526eb81c) BAD_DUMP)
723 
724 	ROM_REGION(0x10000, "audio1", 0)
725 	ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, NO_DUMP)
726 
727 	ROM_REGION(0x4000, "m114", 0)
728 	ROM_LOAD("snd_ic22.rom", 0x0000, 0x4000, NO_DUMP)
729 
730 	ROM_REGION(0x10000, "audio2", 0)
731 	ROM_LOAD("snd_ic35.rom", 0x0000, 0x8000, NO_DUMP)
732 	ROM_LOAD("snd_ic36.rom", 0x8000, 0x8000, NO_DUMP)
733 ROM_END
734 
735 /*-------------------------------------------------------------------
736 / World Cup 90 (1990)
737 /-------------------------------------------------------------------*/
738 ROM_START(wcup90)
739 	ROM_REGION16_BE(0x10000, "roms", 0)
740 	ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000000, 0x8000, CRC(0e2edfb0) SHA1(862fb1f6509fb1f560d0b2bb8a5764f64b259f04))
741 	ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000001, 0x8000, CRC(fdd03165) SHA1(6dc6e68197218f8808436098c26cd04fc3215b1c))
742 
743 	ROM_REGION(0x8000, "video", 0)
744 	ROM_LOAD("vid_ic91.rom", 0x0000, 0x8000, CRC(3287ad20) SHA1(d5a453efc7292670073f157dca04897be857b8ed))
745 
746 	ROM_REGION(0x30000, "chargen", 0)
747 	ROM_LOAD("vid_ic14.rom", 0x00000, 0x8000, CRC(a101d562) SHA1(ad9ad3968f13169572ec60e22e84acf43382b51e))
748 	ROM_LOAD("vid_ic15.rom", 0x08000, 0x8000, CRC(40791e7a) SHA1(788760b8527df48d1825be88099491b6e94f0a19))
749 	ROM_LOAD("vid_ic16.rom", 0x10000, 0x8000, CRC(a7214157) SHA1(a4660180e8491a37028fec8533cf13daf839a7c4))
750 	ROM_LOAD("vid_ic17.rom", 0x18000, 0x8000, CRC(caf4fb04) SHA1(81784a4dc7c671090cf39cafa7d34a6b34523168))
751 	ROM_LOAD("vid_ic18.rom", 0x20000, 0x8000, CRC(83ad2a10) SHA1(37664e5872e6322ee6bb61ec9385876626598152))
752 
753 	ROM_REGION(0x0020, "proms", 0)
754 	ROM_LOAD("vid_ic61.rom", 0x0000, 0x0020, CRC(538c72ae) SHA1(f704492568257fcc4a4f1189207c6fb6526eb81c))
755 
756 	ROM_REGION(0x10000, "audio1", 0)
757 	ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(19a66331) SHA1(fbd71bc378b5a04247fd1754529c66b086eb33d8))
758 
759 	ROM_REGION(0x4000, "user1", 0)
760 	ROM_LOAD("snd_ic21.rom", 0x0000, 0x4000, CRC(e6c1098e) SHA1(06bf8917a27d5e46e4aab93e1f212918418e3a82))
761 
762 	ROM_REGION(0x30000, "user2", 0)
763 	ROM_LOAD("snd_ic45.rom", 0x00000, 0x10000, CRC(265aa979) SHA1(9ca10c41526a2d227c21f246273ca14bec7f1bc7))
764 	ROM_LOAD("snd_ic46.rom", 0x10000, 0x10000, CRC(7edb321e) SHA1(b242e94c24e996d2de803d339aa9bf6e93586a4c))
765 
766 	ROM_REGION(0x10000, "audio2", 0)
767 	ROM_LOAD("snd_ic44.rom", 0x00000, 0x8000, CRC(00946570) SHA1(83e7dd89844679571ab2a803295c8ca8941a4ac7))
768 ROM_END
769 
770 
771 GAME(1988,  dakar,     0,         mrgame,  mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Dakar",              MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
772 GAME(1989,  motrshow,  0,         mrgame,  mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Motor Show (set 1)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
773 GAME(1989,  motrshowa, motrshow,  mrgame,  mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Motor Show (set 2)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
774 GAME(1990,  macattck,  0,         wcup90,  mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Mac Attack",         MACHINE_IS_SKELETON_MECHANICAL)
775 GAME(1990,  wcup90,    0,         wcup90,  mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "World Cup 90",       MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
776