1 // license:BSD-3-Clause
2 // copyright-holders:Angelo Salese, Pierpaolo Prazzoli, Roberto Fresca
3 /************************************************************************
4 
5   Super Draw Poker (c) Stern Electronics 1983
6 
7   Driver by Pierpaolo Prazzoli.
8   Additional work by Angelo Salese & Roberto Fresca.
9 
10 *************************************************************************
11 
12   Notes:
13 
14   - According to some original screenshots floating around the net, this game
15     uses a weird coloring scheme for the char text that dynamically changes
16     the color of an entire column. For now I can only guess about how it
17     truly works.
18 
19   - An original snap of these can be seen at:
20     http://mamedev.emulab.it/kale/fast/files/A00000211628-007.jpg
21 
22 
23 *************************************************************************
24 
25 
26   Updates:
27 
28   - Reworked inputs to match the standard poker inputs names/layout.
29   - Hooked the payout switch.
30   - Hooked a watchdog circuitry, that seems intended to reset
31      the game and/or an external device.
32   - Added machine start & reset.
33   - All clocks pre defined.
34   - Added ay8910 interface as a preliminary attempt to analyze the unknown
35      port writes when these ports are set as input.
36   - Figured out the following DIP switches:
37      Auto Bet (No, Yes).
38      Allow Raise (No, Yes).
39      Double-Up (No, Yes).
40      Minimal Winner Hand (Jacks or Better, Two Pair).
41      Deal Speed (Slow, Fast).
42      Aces Type (Normal Aces, Number 1).
43      Cards Deck Type (English cards, French cards).
44      Max Bet (5, 10, 15, 20).
45   - Added NVRAM support.
46   - Reorganized and cleaned-up the driver.
47 
48 
49   To do:
50 
51   - Needs schematics to check if the current implementation of the
52     "global column coloring" is correct.
53   - Check unknown read/writes, too many of them.
54   - Check the correct CPU and AY8910 clocks from PCB.
55   - A workaround for writes to ay8910 ports when these are set as input.
56 
57 
58 ************************************************************************/
59 
60 #include "emu.h"
61 #include "cpu/z80/z80.h"
62 #include "sound/ay8910.h"
63 #include "machine/nvram.h"
64 #include "machine/watchdog.h"
65 #include "emupal.h"
66 #include "screen.h"
67 #include "speaker.h"
68 
69 
70 #define MASTER_CLOCK    XTAL(12'000'000)
71 #define CPU_CLOCK       MASTER_CLOCK/4  /* guess */
72 #define SND_CLOCK       MASTER_CLOCK/8  /* guess */
73 
74 class supdrapo_state : public driver_device
75 {
76 public:
supdrapo_state(const machine_config & mconfig,device_type type,const char * tag)77 	supdrapo_state(const machine_config &mconfig, device_type type, const char *tag) :
78 		driver_device(mconfig, type, tag),
79 		m_maincpu(*this, "maincpu"),
80 		m_watchdog(*this, "watchdog"),
81 		m_gfxdecode(*this, "gfxdecode"),
82 		m_palette(*this, "palette"),
83 		m_col_line(*this, "col_line"),
84 		m_videoram(*this, "videoram"),
85 		m_char_bank(*this, "char_bank")
86 	{ }
87 
88 	void supdrapo(machine_config &config);
89 
90 private:
91 	required_device<cpu_device> m_maincpu;
92 	required_device<watchdog_timer_device> m_watchdog;
93 	required_device<gfxdecode_device> m_gfxdecode;
94 	required_device<palette_device> m_palette;
95 
96 	required_shared_ptr<uint8_t> m_col_line;
97 	required_shared_ptr<uint8_t> m_videoram;
98 	required_shared_ptr<uint8_t> m_char_bank;
99 
100 	uint8_t m_wdog;
101 
102 	uint8_t rng_r();
103 	void wdog8000_w(uint8_t data);
104 	void debug8004_w(uint8_t data);
105 	void debug7c00_w(uint8_t data);
106 	void coinin_w(uint8_t data);
107 	void payout_w(uint8_t data);
108 	void ay8910_outputa_w(uint8_t data);
109 	void ay8910_outputb_w(uint8_t data);
110 
111 	virtual void machine_start() override;
112 	virtual void machine_reset() override;
113 	virtual void video_start() override;
114 	void supdrapo_palette(palette_device &palette) const;
115 
116 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
117 	void sdpoker_mem(address_map &map);
118 };
119 
120 
121 /*********************************************************************
122                            Video Hardware
123 **********************************************************************/
124 
video_start()125 void supdrapo_state::video_start()
126 {
127 }
128 
129 
screen_update(screen_device & screen,bitmap_ind16 & bitmap,const rectangle & cliprect)130 uint32_t supdrapo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
131 {
132 	int count = 0;
133 	for (int y = 0; y < 32; y++)
134 	{
135 		for (int x = 0; x < 32; x++)
136 		{
137 			int const tile = m_videoram[count] + m_char_bank[count] * 0x100;
138 			// Global Column Coloring, GUESS!
139 			int const color = m_col_line[(x*2) + 1] ? (m_col_line[(x*2) + 1] - 1) & 7 : 0;
140 
141 			m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, tile,color, 0, 0, x*8, y*8);
142 
143 			count++;
144 		}
145 	}
146 
147 	return 0;
148 }
149 
150 
151 // Maybe bit 2 & 3 of the second color prom are intensity bits?
supdrapo_palette(palette_device & palette) const152 void supdrapo_state::supdrapo_palette(palette_device &palette) const
153 {
154 	const uint8_t *color_prom = memregion("proms")->base();
155 
156 	for (int i = 0; i < 0x100; ++i)
157 	{
158 		int bit0, bit1, bit2;
159 
160 		bit0 = 0; // BIT(color_prom[0], 0);
161 		bit1 = BIT(color_prom[0], 0);
162 		bit2 = BIT(color_prom[0], 1);
163 		int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
164 
165 		bit0 = 0; // BIT(color_prom[0], 3);
166 		bit1 = BIT(color_prom[0], 2);
167 		bit2 = BIT(color_prom[0], 3);
168 		int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
169 
170 		bit0 = 0; // BIT(color_prom[0], 0);
171 		bit1 = BIT(color_prom[0x100], 0);
172 		bit2 = BIT(color_prom[0x100], 1);
173 		int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
174 
175 		palette.set_pen_color(i, rgb_t(r, g, b));
176 		color_prom++;
177 	}
178 }
179 
180 
181 /*********************************************************************
182                             R/W Handlers
183 **********************************************************************/
184 
rng_r()185 uint8_t supdrapo_state::rng_r()
186 {
187 	return machine().rand();
188 }
189 
wdog8000_w(uint8_t data)190 void supdrapo_state::wdog8000_w(uint8_t data)
191 {
192 /*  Kind of state watchdog alternating 0x00 & 0x01 writes.
193     Used when exit the test mode (writes 2 consecutive 0's).
194     Seems to be intended to reset some external device.
195 
196   Watchdog: 01
197   Watchdog: 00
198   Watchdog: 01
199   Watchdog: 00
200   Watchdog: 01
201   Watchdog: 00
202   Watchdog: 00 ---> Exit from test mode.
203 
204   Debug3: 00
205   Watchdog: 00
206   Watchdog: 00
207 
208   Debug3: 00
209   Watchdog: 01
210   Watchdog: 00
211   Watchdog: 01
212   Watchdog: 00
213   Watchdog: 01
214   Watchdog: 00
215 
216 */
217 
218 
219 	if (m_wdog == data)
220 	{
221 		m_watchdog->watchdog_reset();  /* Reset */
222 	}
223 
224 	m_wdog = data;
225 //  logerror("Watchdog: %02X\n", data);
226 }
227 
228 
debug8004_w(uint8_t data)229 void supdrapo_state::debug8004_w(uint8_t data)
230 {
231 /*  Writes 0x00 each time the machine is initialized */
232 
233 	logerror("debug8004: %02X\n", data);
234 //  popmessage("written : %02X", data);
235 }
236 
debug7c00_w(uint8_t data)237 void supdrapo_state::debug7c00_w(uint8_t data)
238 {
239 /*  This one write 0's constantly when the input test mode is running */
240 	logerror("debug7c00: %02X\n", data);
241 }
242 
243 
244 /*********************************************************************
245                          Coin I/O Counters
246 **********************************************************************/
247 
coinin_w(uint8_t data)248 void supdrapo_state::coinin_w(uint8_t data)
249 {
250 	machine().bookkeeping().coin_counter_w(0, data & 0x01);  /* Coin In */
251 }
252 
payout_w(uint8_t data)253 void supdrapo_state::payout_w(uint8_t data)
254 {
255 	machine().bookkeeping().coin_counter_w(1, data & 0x01);  /* Payout */
256 }
257 
258 
259 /*********************************************************************
260                         Machine Start & Reset
261 **********************************************************************/
262 
machine_start()263 void supdrapo_state::machine_start()
264 {
265 	save_item(NAME(m_wdog));
266 }
267 
268 
machine_reset()269 void supdrapo_state::machine_reset()
270 {
271 	m_wdog = 1;
272 }
273 
274 
275 /*********************************************************************
276                               Memory Map
277 **********************************************************************/
278 
sdpoker_mem(address_map & map)279 void supdrapo_state::sdpoker_mem(address_map &map)
280 {
281 	map(0x0000, 0x4fff).rom();
282 	map(0x5000, 0x50ff).ram().share("col_line");
283 	map(0x57ff, 0x57ff).ram().share("col_line");
284 	map(0x5800, 0x58ff).ram().share("col_line");
285 	map(0x6000, 0x67ff).ram(); //work ram
286 	map(0x6800, 0x6bff).ram().share("videoram");
287 	map(0x6c00, 0x6fff).ram().share("char_bank");
288 	map(0x7000, 0x7bff).ram(); //$7600 seems watchdog
289 	map(0x7c00, 0x7c00).w(FUNC(supdrapo_state::debug7c00_w));
290 	map(0x8000, 0x8000).portr("IN4").w(FUNC(supdrapo_state::wdog8000_w));
291 	map(0x8001, 0x8001).portr("IN0");
292 	map(0x8002, 0x8002).portr("IN1").w(FUNC(supdrapo_state::payout_w));
293 	map(0x8003, 0x8003).portr("IN2").w(FUNC(supdrapo_state::coinin_w));
294 	map(0x8004, 0x8004).portr("IN3").w(FUNC(supdrapo_state::debug8004_w));
295 	map(0x8005, 0x8005).portr("SW1");
296 	map(0x8006, 0x8006).portr("SW2");
297 	map(0x9000, 0x90ff).ram().share("nvram");
298 	map(0x9400, 0x9400).r(FUNC(supdrapo_state::rng_r));
299 	map(0x9800, 0x9801).w("aysnd", FUNC(ay8910_device::data_address_w));
300 }
301 
302 
303 /*********************************************************************
304                              Input Ports
305 **********************************************************************/
306 
307 static INPUT_PORTS_START( supdrapo )
308 	PORT_START("IN0")
309 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("P1 Win/Take") PORT_CODE(KEYCODE_4) PORT_PLAYER(1)
310 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("P1 Cancel") PORT_CODE(KEYCODE_N) PORT_PLAYER(1)
311 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )  PORT_NAME("P1 Deal") PORT_CODE(KEYCODE_2) PORT_PLAYER(1)
312 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("P1 Bet/Play") PORT_CODE(KEYCODE_1) PORT_PLAYER(1)
313 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN4 ) PORT_NAME("Coin 4: 10")
314 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN3 ) PORT_NAME("Coin 3:  5")
315 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_NAME("Coin 2:  2")
316 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_NAME("Coin 1:  1")
317 
318 	PORT_START("IN1")
319 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Hold 5") PORT_CODE(KEYCODE_B) PORT_PLAYER(1)
320 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Hold 4") PORT_CODE(KEYCODE_V) PORT_PLAYER(1)
321 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Hold 3") PORT_CODE(KEYCODE_C) PORT_PLAYER(1)
322 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Hold 2") PORT_CODE(KEYCODE_X) PORT_PLAYER(1)
323 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Hold 1") PORT_CODE(KEYCODE_Z) PORT_PLAYER(1)
324 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("P1 Black") PORT_CODE(KEYCODE_A) PORT_PLAYER(1)
325 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P1 Red") PORT_CODE(KEYCODE_S) PORT_PLAYER(1)
326 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("P1 Double Up") PORT_CODE(KEYCODE_3) PORT_PLAYER(1)
327 
328 	PORT_START("IN2")
329 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Win/Take") PORT_PLAYER(2)
330 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Cancel") PORT_PLAYER(2)
331 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Deal") PORT_PLAYER(2)
332 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Bet/Play") PORT_PLAYER(2)
333 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 4: 10")
334 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 3:  5")
335 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 2:  2")
336 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 1:  1")
337 
338 	PORT_START("IN3")
339 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Hold 5") PORT_PLAYER(2)
340 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Hold 4") PORT_PLAYER(2)
341 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Hold 3") PORT_PLAYER(2)
342 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Hold 2") PORT_PLAYER(2)
343 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Hold 1") PORT_PLAYER(2)
344 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Black") PORT_PLAYER(2)
345 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Red") PORT_PLAYER(2)
346 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Double Up") PORT_PLAYER(2)
347 
348 	PORT_START("IN4")
349 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Flip") PORT_PLAYER(1)
350 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Flip") PORT_PLAYER(2)
351 	PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNKNOWN )
352 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_W)
353 	PORT_SERVICE_NO_TOGGLE( 0x40, IP_ACTIVE_HIGH )
354 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
355 	PORT_DIPSETTING(    0x00, "1 Player" )
356 	PORT_DIPSETTING(    0x80, "2 Players" )
357 
358 	PORT_START("SW1") // Bank 1 @ 8A
359 	PORT_DIPNAME( 0x0f, 0x02, "Payout Percentage" )     PORT_DIPLOCATION("SW1:1,2,3,4")
360 	PORT_DIPSETTING(    0x00, "25%" )
361 	PORT_DIPSETTING(    0x01, "30%" )
362 	PORT_DIPSETTING(    0x02, "35%" )
363 	PORT_DIPSETTING(    0x03, "40%" )
364 	PORT_DIPSETTING(    0x04, "45%" )
365 	PORT_DIPSETTING(    0x05, "50%" )
366 	PORT_DIPSETTING(    0x06, "55%" )
367 	PORT_DIPSETTING(    0x07, "60%" )
368 	PORT_DIPSETTING(    0x08, "65%" )
369 	PORT_DIPSETTING(    0x09, "70%" )
370 	PORT_DIPSETTING(    0x0a, "75%" )
371 	PORT_DIPSETTING(    0x0b, "80%" )
372 	PORT_DIPSETTING(    0x0c, "85%" )
373 	PORT_DIPSETTING(    0x0d, "90%" )
374 	PORT_DIPSETTING(    0x0e, "95%" )
375 	PORT_DIPSETTING(    0x0f, "100%" )
376 	PORT_DIPNAME( 0x30, 0x10, "Maximum Payout Points" ) PORT_DIPLOCATION("SW1:5,6")
377 	PORT_DIPSETTING(    0x00, "0" )
378 	PORT_DIPSETTING(    0x10, "200" )
379 	PORT_DIPSETTING(    0x20, "500" )
380 	PORT_DIPSETTING(    0x30, "1000" )
381 	PORT_DIPNAME( 0xc0, 0xc0, "Maximum Bet Points" )    PORT_DIPLOCATION("SW1:7,8")
382 	PORT_DIPSETTING(    0x00, "5" )
383 	PORT_DIPSETTING(    0x40, "10" )
384 	PORT_DIPSETTING(    0x80, "15" )
385 	PORT_DIPSETTING(    0xc0, "30" )
386 
387 	PORT_START("SW2") // Bank 2 @ 9A
388 	PORT_DIPNAME( 0x01, 0x01, "Deal Play Last Amount" ) PORT_DIPLOCATION("SW2:1")
389 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
390 	PORT_DIPSETTING(    0x01, DEF_STR( Yes ) )
391 	PORT_DIPNAME( 0x02, 0x02, "Allow Raise" )           PORT_DIPLOCATION("SW2:2")
392 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
393 	PORT_DIPSETTING(    0x02, DEF_STR( Yes ) )
394 	PORT_DIPNAME( 0x04, 0x04, "Red/Black Double-Up" )   PORT_DIPLOCATION("SW2:3")
395 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
396 	PORT_DIPSETTING(    0x04, DEF_STR( Yes ) )
397 	PORT_DIPNAME( 0x08, 0x08, "Minimum Winning Hand" )  PORT_DIPLOCATION("SW2:4")
398 	PORT_DIPSETTING(    0x08, "Jacks or Better" )
399 	PORT_DIPSETTING(    0x00, "Two Pair or Better" )
400 	PORT_DIPNAME( 0x10, 0x10, "Deal Speed" )            PORT_DIPLOCATION("SW2:5")
401 	PORT_DIPSETTING(    0x00, "Slow" )
402 	PORT_DIPSETTING(    0x10, "Fast" )
403 	PORT_DIPNAME( 0x20, 0x20, "Flash Buttons" )         PORT_DIPLOCATION("SW2:6")
404 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
405 	PORT_DIPSETTING(    0x20, DEF_STR( Yes ) )
406 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Language ) )     PORT_DIPLOCATION("SW2:7")
407 	PORT_DIPSETTING(    0x00, DEF_STR( English ) )
408 	PORT_DIPSETTING(    0x40, DEF_STR( French ) )
409 	PORT_DIPNAME( 0x80, 0x00, "Cards Deck Type" )       PORT_DIPLOCATION("SW2:8")
410 	PORT_DIPSETTING(    0x00, "English Cards" )
411 	PORT_DIPSETTING(    0x80, "French Cards" )
412 INPUT_PORTS_END
413 
414 
415 /*********************************************************************
416                       Graphics Decode / Layout
417 **********************************************************************/
418 
419 static const gfx_layout charlayout =
420 {
421 	8,8,
422 	RGN_FRAC(1,4),
423 	4,
424 	{ 0, RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) },
425 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
426 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
427 	8*8
428 };
429 
430 static GFXDECODE_START( gfx_supdrapo )
431 	GFXDECODE_ENTRY( "gfx1", 0, charlayout,   0, 16 )
432 GFXDECODE_END
433 
434 
435 /*********************************************************************
436                          Sound Interface
437 **********************************************************************/
438 
ay8910_outputa_w(uint8_t data)439 void supdrapo_state::ay8910_outputa_w(uint8_t data)
440 {
441 //  popmessage("ay8910_outputa_w %02x",data);
442 }
443 
ay8910_outputb_w(uint8_t data)444 void supdrapo_state::ay8910_outputb_w(uint8_t data)
445 {
446 //  popmessage("ay8910_outputb_w %02x",data);
447 }
448 
449 
450 /*********************************************************************
451                            Machine Driver
452 **********************************************************************/
453 
supdrapo(machine_config & config)454 void supdrapo_state::supdrapo(machine_config &config)
455 {
456 	Z80(config, m_maincpu, CPU_CLOCK); /* guess */
457 	m_maincpu->set_addrmap(AS_PROGRAM, &supdrapo_state::sdpoker_mem);
458 	m_maincpu->set_vblank_int("screen", FUNC(supdrapo_state::irq0_line_hold));
459 
460 	WATCHDOG_TIMER(config, m_watchdog);
461 
462 	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
463 
464 	/* video hardware */
465 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
466 	screen.set_refresh_hz(60);
467 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
468 	screen.set_size(256, 256);
469 	screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
470 	screen.set_screen_update(FUNC(supdrapo_state::screen_update));
471 	screen.set_palette(m_palette);
472 
473 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_supdrapo);
474 	PALETTE(config, m_palette, FUNC(supdrapo_state::supdrapo_palette), 0x100);
475 
476 	SPEAKER(config, "mono").front_center();
477 
478 	ay8910_device &aysnd(AY8910(config, "aysnd", SND_CLOCK));  /* guess */
479 	aysnd.port_a_write_callback().set(FUNC(supdrapo_state::ay8910_outputa_w));
480 	aysnd.port_b_write_callback().set(FUNC(supdrapo_state::ay8910_outputb_w));
481 	aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
482 }
483 
484 
485 /*********************************************************************
486                             ROMs Load
487 **********************************************************************/
488 
489 /*
490 A2-1C   8910
491 A2-1D   Z80
492 A1-1E
493 A1-1H
494 A3-1J
495 
496         A1-4K
497         A1-4L
498         A1-4N
499         A1-4P           A1-9N (6301)
500                         A1-9P
501 */
502 ROM_START( supdrapo )
503 	ROM_REGION( 0x010000, "maincpu", 0 )
504 	ROM_LOAD( "a2-1c",  0x0000, 0x1000, CRC(b65af689) SHA1(b45cd15ca8f9c931d83a90f3cdbebf218070b195) )
505 	ROM_LOAD( "a2-1d",  0x1000, 0x1000, CRC(9ccc4347) SHA1(ea8f4d17aaacc7091ca0a66247b55eb12155c9d7) )
506 	ROM_LOAD( "a1-1e",  0x2000, 0x1000, CRC(44f2b75d) SHA1(615d0acd3f8a109334f415732b6b4fe7b810d91c) ) //a2-1e
507 	ROM_LOAD( "a1-1h",  0x3000, 0x1000, CRC(9c1a10ff) SHA1(243dd64f0b29f9bed4cfa8ecb801ddd973d9e3c3) )
508 	ROM_LOAD( "a3-1j",  0x4000, 0x1000, CRC(71c2bf1c) SHA1(cb98bbf88b8a410075a074ec8619c6e703c6c582) )
509 
510 	ROM_REGION( 0x04000, "gfx1", 0 )
511 	ROM_LOAD( "a1-4p",  0x0000, 0x1000, CRC(5ac096cc) SHA1(60173a83d0e60fd4d0eb40b7b4e80a74ac5fb23d) )
512 	ROM_LOAD( "a1-4n",  0x1000, 0x1000, CRC(6985fac9) SHA1(c6357fe0f042b67f8559ec9da03106d1ff08dc66) )
513 	ROM_LOAD( "a1-4l",  0x2000, 0x1000, CRC(534f7b94) SHA1(44b83053827b27b9e45f6fc50d3878984ef5c5cc) )
514 	ROM_LOAD( "a1-4k",  0x3000, 0x1000, CRC(3d881f5b) SHA1(53d8800a098e4393224de0b82f8e516f73fd6b62) )
515 
516 	ROM_REGION( 0x00200, "proms", 0 )
517 	ROM_LOAD( "a1-9n",  0x0000, 0x0100, CRC(e62529e3) SHA1(176f2069b0c06c1d088909e81658652af06c8eec) )
518 	ROM_LOAD( "a1-9p",  0x0100, 0x0100, CRC(a0547746) SHA1(747c8aef5afa26124fe0763e7f96c4ff6be31863) )
519 ROM_END
520 
521 /*
522 ------------------------------------------
523 
524   Jeutel (bootleg?)
525 
526   1x MOSTEK 8236 / MK3880N-IRL / Z80-CPU
527   1x SOUND AY-3-8910
528   1x X-TAL 12,000
529   2x 8 DIP switches banks.
530 
531 ------------------------------------------
532 */
533 ROM_START( supdrapoa )
534 	ROM_REGION( 0x10000, "maincpu", 0 )
535 	ROM_LOAD( "0.c1",  0x0000, 0x1000, CRC(63e2775a) SHA1(742e8db5378631fd93a22d2131f9523ee74c03a5) )
536 	ROM_LOAD( "1.d1",  0x1000, 0x1000, CRC(aa1578de) SHA1(8f1a33864b2c8e09a25c7603522ebfc7e0757d56) )
537 	ROM_LOAD( "2.e1",  0x2000, 0x1000, CRC(ffe0415c) SHA1(0233d192814ced0b32abd4b7d2e93431a339732f) )
538 	ROM_LOAD( "3.h1",  0x3000, 0x1000, CRC(1bae52fa) SHA1(f89d48d67e52d0fca51eb23fee2d5cb94afcf7f4) )
539 	ROM_LOAD( "4.j1",  0x4000, 0x1000, CRC(7af26f63) SHA1(aeeca69ef1c21acae4283183e4b073ec0d303f4a) )
540 
541 	ROM_REGION( 0x4000, "gfx1", 0 )
542 	ROM_LOAD( "8.p4",  0x0000, 0x1000, CRC(ef0700c5) SHA1(53f49d99f310fdf675e3b7339bdca1115e4a1935) )
543 	ROM_LOAD( "7.n4",  0x1000, 0x1000, CRC(3f77031b) SHA1(2d282d39ea568aa44af8b56228b6e096c2713a15) )
544 	ROM_LOAD( "6.l4",  0x2000, 0x1000, CRC(d70cd50e) SHA1(c3e3dcf79f8a25df5b878ef8734a6d0dc22004ba) )
545 	ROM_LOAD( "5.k4",  0x3000, 0x1000, CRC(34564917) SHA1(90b49fe8a5371159388839d42913352cf58c60e6) )
546 
547 	ROM_REGION( 0x00200, "proms", 0 )   /* using the color PROMs from the parent set - no reason to think they differ */
548 	ROM_LOAD( "a1-9n",  0x0000, 0x0100, CRC(e62529e3) SHA1(176f2069b0c06c1d088909e81658652af06c8eec) )
549 	ROM_LOAD( "a1-9p",  0x0100, 0x0100, CRC(a0547746) SHA1(747c8aef5afa26124fe0763e7f96c4ff6be31863) )
550 ROM_END
551 
552 /*
553 Poker Relance Gamble
554 EMU Infos dumper    f205v
555 manufacturer    Valadon Automation
556 
557 Technical references
558 
559 CPUs
560 QTY     Type        clock       position    function
561 1x      NEC D780C               2c          8-bit Microprocessor - main
562 1x      AY-3-8910               2a          Programmable Sound Generator - sound
563 1x      LM380N                  10b         Audio Amplifier - sound
564 1x      oscillator  12.000MHz   5b
565 
566 ROMs
567 QTY     Type                    position    status
568 9x      ET2732Q                 0-8         dumped
569 1x      DM74S287N               9n,9p       dumped
570 
571 RAMs
572 QTY     Type                    position
573 8x      MM2114N-3               1k,1l,1m,1n,2f,3f,3h,3j
574 1x      MWS5101AEL2             2p
575 
576 Others
577 
578 1x 22x2 edge connector
579 1x 31x2 thin edge connector
580 1x trimmer (volume)(10a)
581 2x 8x2 switches DIP (8a,9a)
582 
583 Notes
584 
585 At 2l there is an empty space with "batt." handwritten on the PCB
586 At 1p there is an unmarked DIP20 mil.300 chip.
587 
588 */
589 
590 ROM_START( supdrapob )
591 	ROM_REGION( 0x10000, "maincpu", 0 )
592 	ROM_LOAD( "pok0.1c",    0x0000, 0x1000, CRC(b53f0470) SHA1(79003cc957e22d5bde720b6f4caed5481edd2c7e) )
593 	ROM_LOAD( "pok1.1d",    0x1000, 0x1000, CRC(9797a42d) SHA1(65446317e6f1a2de53dd10146338fb63bd5b0a99) )
594 	ROM_LOAD( "pok2.1ef",   0x2000, 0x1000, CRC(2b7a5baa) SHA1(dd86bb35692eabc1482768cf0bc082f3e0bd90fe) )
595 	ROM_LOAD( "pok3.1h",    0x3000, 0x1000, CRC(9c3ea609) SHA1(612f455515f367b7d59608528d06221665da8876) )
596 	ROM_LOAD( "pok4.1j",    0x4000, 0x1000, CRC(52025ba3) SHA1(923de6110a3608698a31baf552d4854b1053cc0e) )
597 
598 	ROM_REGION( 0x4000, "gfx1", 0 )
599 	ROM_LOAD( "pok8.4p",    0x0000, 0x1000, CRC(82b387e1) SHA1(d7b7e4f7b5b8082438444ce1fa585917ae737bcf) )
600 	ROM_LOAD( "pok7.4n",    0x1000, 0x1000, CRC(6ab0ad02) SHA1(86b22ab3ceb69f981aa32247c93411631c33a6e8) )
601 	ROM_LOAD( "pok6.4lm",   0x2000, 0x1000, CRC(c8eab65c) SHA1(c4d37fed9675d8bb051e6f97e56f27450a24ddb8) )
602 	ROM_LOAD( "pok5.4k",    0x3000, 0x1000, CRC(2c0bb656) SHA1(aa2f309afcdefda5e40be0a354d0b3e5548c44bb) )
603 
604 	ROM_REGION( 0x00200, "proms", 0 )
605 	ROM_LOAD( "dm74s287n.9n",        0x0000, 0x0100, CRC(e62529e3) SHA1(176f2069b0c06c1d088909e81658652af06c8eec) )
606 	ROM_LOAD( "dm74s287n.9p",        0x0100, 0x0100, CRC(a0547746) SHA1(747c8aef5afa26124fe0763e7f96c4ff6be31863) )
607 ROM_END
608 
609 
610 /*********************************************************************
611                            Games Drivers
612 **********************************************************************/
613 
614 //    YEAR  NAME       PARENT    MACHINE   INPUT     STATE           INIT        ROT    COMPANY                                           FULLNAME                      FLAGS
615 GAME( 1983, supdrapo,  0,        supdrapo, supdrapo, supdrapo_state, empty_init, ROT90, "Valadon Automation (Stern Electronics license)", "Super Draw Poker (set 1)",   MACHINE_SUPPORTS_SAVE )
616 GAME( 1983, supdrapoa, supdrapo, supdrapo, supdrapo, supdrapo_state, empty_init, ROT90, "Valadon Automation / Jeutel",                    "Super Draw Poker (set 2)",   MACHINE_SUPPORTS_SAVE )
617 GAME( 1983, supdrapob, supdrapo, supdrapo, supdrapo, supdrapo_state, empty_init, ROT90, "bootleg",                                        "Super Draw Poker (bootleg)", MACHINE_SUPPORTS_SAVE )
618