1 // license:BSD-3-Clause
2 // copyright-holders:Luca Elia, David Haywood, Roberto Fresca
3 /***************************************************************************
4 
5                           -= IGS009 Based Games =-
6 
7                    driver by Luca Elia and David Haywood
8 
9 CPU     :   Z180
10 Sound   :   M6295 + YM2413
11 Video   :   IGS009
12 NVRAM   :   Battery for main RAM
13 
14 - The hardware is similar to other IGS002 + IGS003 based boards.
15   The interesting part is the background tilemap, that is designed specifically
16   for simulating the nine reels of a slot machine.
17 
18 ---------------------------------------------------------------------------
19 Year  Game                         Manufacturer    Notes
20 ---------------------------------------------------------------------------
21 1997  Jingle Bell (US, V157US)     IGS             patched protection
22 1997  Jingle Bell (EU, V155UE)     IGS             patched protection
23 1997  Jingle Bell (EU, V153UE)     IGS             patched protection
24 1995  Jingle Bell (EU, V141UE)     IGS             patched protection
25 1995? Jingle Bell (Italy, V133I)   IGS             patched protection
26 1998  Grand Prix '98               Romtec
27 ---------------------------------------------------------------------------
28 
29 ***************************************************************************/
30 
31 #include "emu.h"
32 #include "cpu/z180/z180.h"
33 #include "machine/i8255.h"
34 #include "sound/ym2413.h"
35 #include "sound/okim6295.h"
36 #include "machine/nvram.h"
37 #include "emupal.h"
38 #include "screen.h"
39 #include "speaker.h"
40 #include "tilemap.h"
41 
42 
43 class igs009_state : public driver_device
44 {
45 public:
igs009_state(const machine_config & mconfig,device_type type,const char * tag)46 	igs009_state(const machine_config &mconfig, device_type type, const char *tag)
47 		: driver_device(mconfig, type, tag)
48 		, m_maincpu(*this, "maincpu")
49 		, m_gfxdecode(*this, "gfxdecode")
50 		, m_screen(*this, "screen")
51 		, m_palette(*this, "palette")
52 		, m_bg_scroll(*this, "bg_scroll.%u", 0U)
53 		, m_reel_ram(*this, "reel_ram.%u", 0U)
54 		, m_fg_tile_ram(*this, "fg_tile_ram")
55 		, m_fg_color_ram(*this, "fg_color_ram")
56 		, m_leds(*this, "led%u", 0U)
57 	{ }
58 
59 	void gp98(machine_config &config);
60 	void jingbell(machine_config &config);
61 
62 	void init_jingbell();
63 	void init_jingbelli();
64 
65 	DECLARE_READ_LINE_MEMBER(hopper_r);
66 
67 protected:
68 	virtual void machine_start() override;
69 	virtual void machine_reset() override;
70 	virtual void video_start() override;
71 
72 private:
73 	template<uint8_t Reel> void reel_ram_w(offs_t offset, uint8_t data);
74 	void bg_scroll_w(offs_t offset, uint8_t data);
75 	void fg_tile_w(offs_t offset, uint8_t data);
76 	void fg_color_w(offs_t offset, uint8_t data);
77 	void nmi_and_coins_w(uint8_t data);
78 	void video_and_leds_w(uint8_t data);
79 	void leds_w(uint8_t data);
80 	void magic_w(offs_t offset, uint8_t data);
81 	uint8_t magic_r();
82 
83 	void show_out();
84 	DECLARE_WRITE_LINE_MEMBER(vblank_irq);
85 
86 	template<uint8_t Reel> TILE_GET_INFO_MEMBER(get_jingbell_reel_tile_info);
87 	template<uint8_t Reel> TILE_GET_INFO_MEMBER(get_gp98_reel_tile_info);
88 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
89 
90 	void decrypt_jingbell();
91 
92 	DECLARE_VIDEO_START(gp98);
93 
94 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
95 	void gp98_portmap(address_map &map);
96 	void jingbell_map(address_map &map);
97 	void jingbell_portmap(address_map &map);
98 
99 	required_device<cpu_device> m_maincpu;
100 	required_device<gfxdecode_device> m_gfxdecode;
101 	required_device<screen_device> m_screen;
102 	required_device<palette_device> m_palette;
103 
104 	required_shared_ptr_array<uint8_t, 2> m_bg_scroll;
105 	required_shared_ptr_array<uint8_t, 4> m_reel_ram;
106 	required_shared_ptr<uint8_t> m_fg_tile_ram;
107 	required_shared_ptr<uint8_t> m_fg_color_ram;
108 	output_finder<7> m_leds;
109 
110 	tilemap_t *m_reel_tilemap[4];
111 	tilemap_t *m_fg_tilemap;
112 	int m_video_enable;
113 	int m_nmi_enable;
114 	int m_hopper;
115 	uint8_t m_out[3];
116 	uint8_t m_igs_magic[2];
117 };
118 
119 
120 /***************************************************************************
121                                 Video Hardware
122 ***************************************************************************/
123 
124 
125 template<uint8_t Reel>
reel_ram_w(offs_t offset,uint8_t data)126 void igs009_state::reel_ram_w(offs_t offset, uint8_t data)
127 {
128 	m_reel_ram[Reel][offset] = data;
129 	m_reel_tilemap[Reel]->mark_tile_dirty(offset);
130 }
131 
132 template<uint8_t Reel>
TILE_GET_INFO_MEMBER(igs009_state::get_jingbell_reel_tile_info)133 TILE_GET_INFO_MEMBER(igs009_state::get_jingbell_reel_tile_info)
134 {
135 	int code = m_reel_ram[Reel][tile_index];
136 
137 	tileinfo.set(0,
138 			(code)+(((tile_index+1)&0x3)*0x100),
139 			(code & 0x80) ? 0xc : 0,
140 			0);
141 }
142 
143 template<uint8_t Reel>
TILE_GET_INFO_MEMBER(igs009_state::get_gp98_reel_tile_info)144 TILE_GET_INFO_MEMBER(igs009_state::get_gp98_reel_tile_info)
145 {
146 	int code = m_reel_ram[Reel][tile_index];
147 
148 	tileinfo.set(0,
149 			(code*4)+(tile_index&0x3),
150 			0,
151 			0);
152 }
153 
bg_scroll_w(offs_t offset,uint8_t data)154 void igs009_state::bg_scroll_w(offs_t offset, uint8_t data)
155 {
156 	m_bg_scroll[0][offset] = data;
157 //  bg_tilemap->set_scrolly(offset,data);
158 }
159 
160 
TILE_GET_INFO_MEMBER(igs009_state::get_fg_tile_info)161 TILE_GET_INFO_MEMBER(igs009_state::get_fg_tile_info)
162 {
163 	int code = m_fg_tile_ram[tile_index] | (m_fg_color_ram[tile_index] << 8);
164 	tileinfo.set(1, code, (4*(code >> 14)+3), 0);
165 }
166 
fg_tile_w(offs_t offset,uint8_t data)167 void igs009_state::fg_tile_w(offs_t offset, uint8_t data)
168 {
169 	m_fg_tile_ram[offset] = data;
170 	m_fg_tilemap->mark_tile_dirty(offset);
171 }
172 
fg_color_w(offs_t offset,uint8_t data)173 void igs009_state::fg_color_w(offs_t offset, uint8_t data)
174 {
175 	m_fg_color_ram[offset] = data;
176 	m_fg_tilemap->mark_tile_dirty(offset);
177 }
178 
video_start()179 void igs009_state::video_start()
180 {
181 	m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8,  8,  0x80,0x20);
182 	m_fg_tilemap->set_transparent_pen(0);
183 
184 	m_reel_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_jingbell_reel_tile_info<0>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
185 	m_reel_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_jingbell_reel_tile_info<1>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
186 	m_reel_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_jingbell_reel_tile_info<2>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
187 	m_reel_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_jingbell_reel_tile_info<3>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
188 
189 	m_reel_tilemap[0]->set_scroll_cols(128);
190 	m_reel_tilemap[1]->set_scroll_cols(128);
191 	m_reel_tilemap[2]->set_scroll_cols(128);
192 	m_reel_tilemap[3]->set_scroll_cols(128);
193 }
194 
195 
VIDEO_START_MEMBER(igs009_state,gp98)196 VIDEO_START_MEMBER(igs009_state,gp98)
197 {
198 	m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8,  8,  0x80,0x20);
199 	m_fg_tilemap->set_transparent_pen(0);
200 
201 	m_reel_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_gp98_reel_tile_info<0>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
202 	m_reel_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_gp98_reel_tile_info<1>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
203 	m_reel_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_gp98_reel_tile_info<2>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
204 	m_reel_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(igs009_state::get_gp98_reel_tile_info<3>)),TILEMAP_SCAN_ROWS,8,32, 128, 8);
205 
206 	m_reel_tilemap[0]->set_scroll_cols(128);
207 	m_reel_tilemap[1]->set_scroll_cols(128);
208 	m_reel_tilemap[2]->set_scroll_cols(128);
209 	m_reel_tilemap[3]->set_scroll_cols(128);
210 }
211 
212 
screen_update(screen_device & screen,bitmap_ind16 & bitmap,const rectangle & cliprect)213 uint32_t igs009_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
214 {
215 	int layers_ctrl = m_video_enable ? -1 : 0;
216 
217 #ifdef MAME_DEBUG
218 	if (machine().input().code_pressed(KEYCODE_Z))
219 	{
220 		int mask = 0;
221 		if (machine().input().code_pressed(KEYCODE_Q))  mask |= 1;
222 		if (machine().input().code_pressed(KEYCODE_W))  mask |= 2;
223 		if (machine().input().code_pressed(KEYCODE_A))  mask |= 4;
224 		if (mask != 0) layers_ctrl &= mask;
225 	}
226 #endif
227 
228 	if (layers_ctrl & 1)
229 	{
230 		int startclipmin = 0;
231 		const rectangle &visarea = screen.visible_area();
232 
233 		for (int i= 0;i < 0x80;i++)
234 		{
235 			m_reel_tilemap[0]->set_scrolly(i, m_bg_scroll[0][i]*2);
236 			m_reel_tilemap[1]->set_scrolly(i, m_bg_scroll[0][i+0x80]*2);
237 			m_reel_tilemap[2]->set_scrolly(i, m_bg_scroll[0][i+0x100]*2);
238 			m_reel_tilemap[3]->set_scrolly(i, m_bg_scroll[0][i+0x180]*2);
239 		}
240 
241 		for (int zz=0;zz<0x80-8;zz++) // -8 because of visible area (2*8 = 16)
242 		{
243 			rectangle clip;
244 			int rowenable = m_bg_scroll[1][zz];
245 
246 			// draw top of screen
247 			clip.set(visarea.min_x, visarea.max_x, startclipmin, startclipmin+2);
248 
249 			bitmap.fill(m_palette->pen(rowenable), clip);
250 
251 			if (rowenable==0)
252 			{ // 0 and 1 are the same? or is there a global switchoff?
253 				m_reel_tilemap[0]->draw(screen, bitmap, clip, 0,0);
254 			}
255 			else if (rowenable==1)
256 			{
257 				m_reel_tilemap[1]->draw(screen, bitmap, clip, 0,0);
258 			}
259 			else if (rowenable==2)
260 			{
261 				m_reel_tilemap[2]->draw(screen, bitmap, clip, 0,0);
262 			}
263 			else if (rowenable==3)
264 			{
265 				m_reel_tilemap[3]->draw(screen, bitmap, clip, 0,0);
266 			}
267 
268 
269 			startclipmin+=2;
270 		}
271 
272 	}
273 	else                    bitmap.fill(m_palette->black_pen(), cliprect);
274 
275 
276 	if (layers_ctrl & 2)    m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
277 
278 	return 0;
279 }
280 
281 /***************************************************************************
282                                 Memory Maps
283 ***************************************************************************/
284 
285 
READ_LINE_MEMBER(igs009_state::hopper_r)286 READ_LINE_MEMBER(igs009_state::hopper_r)
287 {
288 	return m_hopper && !(m_screen->frame_number()%10);
289 }
290 
291 
show_out()292 void igs009_state::show_out()
293 {
294 #ifdef MAME_DEBUG
295 	popmessage("%02x %02x %02x", m_out[0], m_out[1], m_out[2]);
296 #endif
297 }
298 
nmi_and_coins_w(uint8_t data)299 void igs009_state::nmi_and_coins_w(uint8_t data)
300 {
301 	if ((m_nmi_enable ^ data) & (~0xdd))
302 	{
303 		logerror("PC %06X: nmi_and_coins = %02x\n",m_maincpu->pc(),data);
304 //      popmessage("%02x",data);
305 	}
306 
307 	machine().bookkeeping().coin_counter_w(0,        data & 0x01);   // coin_a
308 	machine().bookkeeping().coin_counter_w(1,        data & 0x04);   // coin_c
309 	machine().bookkeeping().coin_counter_w(2,        data & 0x08);   // key in
310 	machine().bookkeeping().coin_counter_w(3,        data & 0x10);   // coin out mech
311 
312 	m_leds[6] = BIT(data, 6);   // led for coin out / m_hopper active
313 
314 	m_nmi_enable = data;    //  data & 0x80     // nmi enable?
315 
316 	m_out[0] = data;
317 	show_out();
318 }
319 
video_and_leds_w(uint8_t data)320 void igs009_state::video_and_leds_w(uint8_t data)
321 {
322 	m_leds[4] = BIT(data, 0); // start?
323 	m_leds[5] = BIT(data, 2); // l_bet?
324 
325 	m_video_enable  =     data & 0x40;
326 	m_hopper            =   (~data)& 0x80;
327 
328 	m_out[1] = data;
329 	show_out();
330 }
331 
leds_w(uint8_t data)332 void igs009_state::leds_w(uint8_t data)
333 {
334 	m_leds[0] = BIT(data, 0);  // stop_1
335 	m_leds[1] = BIT(data, 1);  // stop_2
336 	m_leds[2] = BIT(data, 2);  // stop_3
337 	m_leds[3] = BIT(data, 3);  // stop
338 	// data & 0x10?
339 
340 	m_out[2] = data;
341 	show_out();
342 }
343 
344 
magic_w(offs_t offset,uint8_t data)345 void igs009_state::magic_w(offs_t offset, uint8_t data)
346 {
347 	m_igs_magic[offset] = data;
348 
349 	if (offset == 0)
350 		return;
351 
352 	switch(m_igs_magic[0])
353 	{
354 		case 0x01:
355 			break;
356 
357 		default:
358 //          popmessage("magic %x <- %04x",m_igs_magic[0],data);
359 			logerror("%06x: warning, writing to igs_magic %02x = %02x\n", m_maincpu->pc(), m_igs_magic[0], data);
360 	}
361 }
362 
magic_r()363 uint8_t igs009_state::magic_r()
364 {
365 	switch(m_igs_magic[0])
366 	{
367 		case 0x00:
368 			if ( !(m_igs_magic[1] & 0x01) ) return ioport("DSW1")->read();
369 			if ( !(m_igs_magic[1] & 0x02) ) return ioport("DSW2")->read();
370 			if ( !(m_igs_magic[1] & 0x04) ) return ioport("DSW3")->read();
371 			if ( !(m_igs_magic[1] & 0x08) ) return ioport("DSW4")->read();
372 			if ( !(m_igs_magic[1] & 0x10) ) return ioport("DSW5")->read();
373 			logerror("%06x: warning, reading dsw with igs_magic[1] = %02x\n", m_maincpu->pc(), m_igs_magic[1]);
374 			break;
375 
376 		default:
377 			logerror("%06x: warning, reading with igs_magic = %02x\n", m_maincpu->pc(), m_igs_magic[0]);
378 	}
379 
380 	return 0;
381 }
382 
383 
jingbell_map(address_map & map)384 void igs009_state::jingbell_map(address_map &map)
385 {
386 	map(0x00000, 0x0f3ff).rom();
387 	map(0x0f400, 0x0ffff).ram().share("nvram");
388 }
389 
jingbell_portmap(address_map & map)390 void igs009_state::jingbell_portmap(address_map &map)
391 {
392 	map(0x0000, 0x003f).ram(); // Z180 internal regs
393 
394 	map(0x1000, 0x11ff).ram().w(FUNC(igs009_state::bg_scroll_w)).share(m_bg_scroll[0]);
395 
396 	map(0x2000, 0x23ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
397 	map(0x2400, 0x27ff).ram().w(m_palette, FUNC(palette_device::write8_ext)).share("palette_ext");
398 
399 	map(0x3000, 0x33ff).ram().w(FUNC(igs009_state::reel_ram_w<0>)).share(m_reel_ram[0]);
400 	map(0x3400, 0x37ff).ram().w(FUNC(igs009_state::reel_ram_w<1>)).share(m_reel_ram[1]);
401 	map(0x3800, 0x3bff).ram().w(FUNC(igs009_state::reel_ram_w<2>)).share(m_reel_ram[2]);
402 	map(0x3c00, 0x3fff).ram().w(FUNC(igs009_state::reel_ram_w<3>)).share(m_reel_ram[3]);
403 
404 	map(0x4000, 0x407f).ram().share(m_bg_scroll[1]);
405 
406 	map(0x5000, 0x5fff).ram().w(FUNC(igs009_state::fg_tile_w)).share(m_fg_tile_ram);
407 
408 	map(0x6480, 0x6483).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));    // NMI and coins (w), service (r), coins (r)
409 	map(0x6490, 0x6493).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));    // buttons 1 (r), video and leds (w), leds (w)
410 
411 	map(0x64a0, 0x64a0).portr("BUTTONS2");
412 
413 	map(0x64b0, 0x64b1).w("ymsnd", FUNC(ym2413_device::write));
414 
415 	map(0x64c0, 0x64c0).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
416 
417 	map(0x64d0, 0x64d1).rw(FUNC(igs009_state::magic_r), FUNC(igs009_state::magic_w));    // DSW1-5
418 
419 	map(0x7000, 0x7fff).ram().w(FUNC(igs009_state::fg_color_w)).share(m_fg_color_ram);
420 
421 	map(0x8000, 0xffff).rom().region("data", 0);
422 }
423 
424 
gp98_portmap(address_map & map)425 void igs009_state::gp98_portmap(address_map &map)
426 {
427 	map(0x0000, 0x003f).ram(); // Z180 internal regs
428 
429 	map(0x1000, 0x11ff).ram().w(FUNC(igs009_state::bg_scroll_w)).share(m_bg_scroll[0]);
430 
431 	map(0x2000, 0x23ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
432 	map(0x2400, 0x27ff).ram().w(m_palette, FUNC(palette_device::write8_ext)).share("palette_ext");
433 
434 	map(0x3000, 0x33ff).ram().w(FUNC(igs009_state::reel_ram_w<0>)).share(m_reel_ram[0]);
435 	map(0x3400, 0x37ff).ram().w(FUNC(igs009_state::reel_ram_w<1>)).share(m_reel_ram[1]);
436 	map(0x3800, 0x3bff).ram().w(FUNC(igs009_state::reel_ram_w<2>)).share(m_reel_ram[2]);
437 	map(0x3c00, 0x3fff).ram().w(FUNC(igs009_state::reel_ram_w<3>)).share(m_reel_ram[3]);
438 
439 	map(0x4000, 0x407f).ram().share(m_bg_scroll[1]);
440 
441 	map(0x5000, 0x5fff).ram().w(FUNC(igs009_state::fg_tile_w)).share(m_fg_tile_ram);
442 
443 	// seems to lack PPI devices...
444 	map(0x6480, 0x6480).w(FUNC(igs009_state::nmi_and_coins_w));
445 	map(0x6481, 0x6481).portr("SERVICE");
446 	map(0x6482, 0x6482).portr("COINS");
447 	map(0x6490, 0x6490).portr("BUTTONS1");
448 	map(0x6491, 0x6491).w(FUNC(igs009_state::video_and_leds_w));
449 	map(0x6492, 0x6492).w(FUNC(igs009_state::leds_w));
450 	map(0x64a0, 0x64a0).portr("BUTTONS2");
451 
452 	map(0x64b0, 0x64b1).w("ymsnd", FUNC(ym2413_device::write));
453 
454 	map(0x64c0, 0x64c0).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
455 
456 	map(0x64d0, 0x64d1).rw(FUNC(igs009_state::magic_r), FUNC(igs009_state::magic_w));    // DSW1-5
457 
458 	map(0x7000, 0x7fff).ram().w(FUNC(igs009_state::fg_color_w)).share(m_fg_color_ram);
459 
460 	map(0x8000, 0xffff).rom().region("data", 0);
461 }
462 
463 
464 /***************************************************************************
465                                 Input Ports
466 ***************************************************************************/
467 
468 static INPUT_PORTS_START( jingbell )
469 	PORT_START("DSW1")
470 	PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) )  PORT_DIPLOCATION("DSW1:1")
471 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
472 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
473 	PORT_DIPNAME( 0x02, 0x00, "W-Up Bonus" )        PORT_DIPLOCATION("DSW1:2")
474 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
475 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
476 	PORT_DIPNAME( 0x04, 0x04, "Min Bet" )           PORT_DIPLOCATION("DSW1:3")
477 	PORT_DIPSETTING(    0x04, "1" )
478 	PORT_DIPSETTING(    0x00, "8" )
479 	PORT_DIPNAME( 0x08, 0x08, "Spin Speed" )        PORT_DIPLOCATION("DSW1:4")
480 	PORT_DIPSETTING(    0x08, "Slow" )
481 	PORT_DIPSETTING(    0x00, "Quick" )
482 	PORT_DIPNAME( 0x10, 0x00, "Strip Girl" )        PORT_DIPLOCATION("DSW1:5")
483 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
484 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
485 	PORT_DIPNAME( 0x20, 0x20, "Payout Mode" )       PORT_DIPLOCATION("DSW1:6")
486 	PORT_DIPSETTING(    0x20, DEF_STR( Normal ) )
487 	PORT_DIPSETTING(    0x00, "Auto" )
488 	PORT_DIPNAME( 0xc0, 0xc0, "Player's Panel" )    PORT_DIPLOCATION("DSW1:7,8")
489 	PORT_DIPSETTING(    0x00, "Type A" )
490 	PORT_DIPSETTING(    0xc0, "Type A" )
491 	PORT_DIPSETTING(    0x80, "Type B" )
492 	PORT_DIPSETTING(    0x40, "Type C" )
493 
494 	PORT_START("DSW2")
495 	PORT_DIPNAME( 0x07, 0x07, "Main Game Rate (%)" )    PORT_DIPLOCATION("DSW2:1,2,3")
496 	PORT_DIPSETTING(    0x07, "55" )
497 	PORT_DIPSETTING(    0x06, "60" )
498 	PORT_DIPSETTING(    0x05, "65" )
499 	PORT_DIPSETTING(    0x04, "70" )
500 	PORT_DIPSETTING(    0x03, "75" )
501 	PORT_DIPSETTING(    0x02, "80" )
502 	PORT_DIPSETTING(    0x01, "85" )
503 	PORT_DIPSETTING(    0x00, "90" )
504 	PORT_DIPNAME( 0x38, 0x38, "W-Up Chance (%)" )   PORT_DIPLOCATION("DSW2:4,5,6")
505 	PORT_DIPSETTING(    0x38, "93" )
506 	PORT_DIPSETTING(    0x30, "94" )
507 	PORT_DIPSETTING(    0x28, "95" )
508 	PORT_DIPSETTING(    0x20, "96" )
509 	PORT_DIPSETTING(    0x18, "97" )
510 	PORT_DIPSETTING(    0x10, "98" )
511 	PORT_DIPSETTING(    0x08, "99" )
512 	PORT_DIPSETTING(    0x00, "100" )
513 	PORT_DIPNAME( 0xc0, 0xc0, "Key In Limit" )      PORT_DIPLOCATION("DSW2:7,8")
514 	PORT_DIPSETTING(    0xc0, "1k" )
515 	PORT_DIPSETTING(    0x80, "3k" )
516 	PORT_DIPSETTING(    0x40, "5k" )
517 	PORT_DIPSETTING(    0x00, "10k" )
518 
519 	PORT_START("DSW3")
520 	PORT_DIPNAME( 0x07, 0x07, "Key In Rate" )       PORT_DIPLOCATION("DSW3:1,2,3")
521 	PORT_DIPSETTING(    0x07, "1" )
522 	PORT_DIPSETTING(    0x06, "5" )
523 	PORT_DIPSETTING(    0x05, "10" )
524 	PORT_DIPSETTING(    0x04, "30" )
525 	PORT_DIPSETTING(    0x03, "50" )
526 	PORT_DIPSETTING(    0x02, "100" )
527 	PORT_DIPSETTING(    0x01, "200" )
528 	PORT_DIPSETTING(    0x00, "500" )
529 	PORT_DIPNAME( 0x38, 0x38, "Coin 1 Rate" )       PORT_DIPLOCATION("DSW3:4,5,6")
530 	PORT_DIPSETTING(    0x38, "1" )
531 	PORT_DIPSETTING(    0x30, "2" )
532 	PORT_DIPSETTING(    0x28, "5" )
533 	PORT_DIPSETTING(    0x20, "10" )
534 	PORT_DIPSETTING(    0x18, "20" )
535 	PORT_DIPSETTING(    0x10, "25" )
536 	PORT_DIPSETTING(    0x08, "50" )
537 	PORT_DIPSETTING(    0x00, "100" )
538 	PORT_DIPNAME( 0xc0, 0xc0, "System Limit" )      PORT_DIPLOCATION("DSW3:7,8")
539 	PORT_DIPSETTING(    0xc0, "5k" )
540 	PORT_DIPSETTING(    0x80, "10k" )
541 	PORT_DIPSETTING(    0x40, "30k" )
542 	PORT_DIPSETTING(    0x00, "Unlimited" )
543 
544 	PORT_START("DSW4")
545 	PORT_DIPNAME( 0x01, 0x01, "Min Play For Fever" )    PORT_DIPLOCATION("DSW4:1")
546 	PORT_DIPSETTING(    0x01, "8" )
547 	PORT_DIPSETTING(    0x00, "16" )
548 	PORT_DIPNAME( 0x02, 0x02, "Max Bet" )           PORT_DIPLOCATION("DSW4:2")
549 	PORT_DIPSETTING(    0x02, "16" )
550 	PORT_DIPSETTING(    0x00, "32" )
551 	PORT_DIPNAME( 0x1c, 0x1c, "Coin 2 Rate" )       PORT_DIPLOCATION("DSW4:3,4,5")
552 	PORT_DIPSETTING(    0x1c, "1" )
553 	PORT_DIPSETTING(    0x18, "2" )
554 	PORT_DIPSETTING(    0x14, "5" )
555 	PORT_DIPSETTING(    0x10, "10" )
556 	PORT_DIPSETTING(    0x0c, "20" )
557 	PORT_DIPSETTING(    0x08, "40" )
558 	PORT_DIPSETTING(    0x04, "50" )
559 	PORT_DIPSETTING(    0x00, "100" )
560 	PORT_DIPNAME( 0x60, 0x60, "Key Out Rate" )      PORT_DIPLOCATION("DSW4:6,7")
561 	PORT_DIPSETTING(    0x60, "1" )
562 	PORT_DIPSETTING(    0x40, "10" )
563 	PORT_DIPSETTING(    0x20, "50" )
564 	PORT_DIPSETTING(    0x00, "100" )
565 	PORT_DIPNAME( 0x80, 0x80, "Play Line" )         PORT_DIPLOCATION("DSW4:8")
566 	PORT_DIPSETTING(    0x80, "8" )
567 	PORT_DIPSETTING(    0x00, "16" )
568 
569 // These are from the manual for v201us - DSW1-DSW4 match but DSW5 doesn't seem to match or actually do anything
570 	PORT_START("DSW5")
571 	PORT_DIPNAME( 0x03, 0x00, "Maximum Play" )      PORT_DIPLOCATION("DSW5:1,2")
572 	PORT_DIPSETTING(    0x00, "64" )
573 	PORT_DIPSETTING(    0x01, "32" )
574 	PORT_DIPSETTING(    0x02, "16" )
575 	PORT_DIPSETTING(    0x03, "8" )
576 	PORT_DIPNAME( 0x04, 0x04, "Skill Stop" )        PORT_DIPLOCATION("DSW5:3")
577 	PORT_DIPSETTING(    0x04, "On" )
578 	PORT_DIPSETTING(    0x00, "Off" )
579 	PORT_DIPNAME( 0x08, 0x00, "Hands Count" )       PORT_DIPLOCATION("DSW5:4")
580 	PORT_DIPSETTING(    0x08, "No" )
581 	PORT_DIPSETTING(    0x00, "Yes" )
582 	PORT_DIPNAME( 0x30, 0x00, "Hands Coin Rate" )   PORT_DIPLOCATION("DSW5:5,6")
583 	PORT_DIPSETTING(    0x00, "25" )
584 	PORT_DIPSETTING(    0x20, "10" )
585 	PORT_DIPSETTING(    0x10, "5" )
586 	PORT_DIPSETTING(    0x30, "1" )
587 	PORT_DIPNAME( 0x40, 0x40, "Hands Coin Value" )  PORT_DIPLOCATION("DSW5:7")
588 	PORT_DIPSETTING(    0x00, "40" )
589 	PORT_DIPSETTING(    0x40, "20" )
590 	PORT_DIPNAME( 0x80, 0x80, "Unused" )            PORT_DIPLOCATION("DSW5:8")
591 	PORT_DIPSETTING(    0x00, "On" )
592 	PORT_DIPSETTING(    0x80, "Off" )
593 
594 	PORT_START("SERVICE")
595 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
596 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 )      PORT_NAME("Memory Clear")    // stats, memory
597 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(igs009_state, hopper_r)  // hopper sensor
598 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
599 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_NAME("Pay Out")
600 	PORT_SERVICE_NO_TOGGLE( 0x20, IP_ACTIVE_LOW )   // test (press during boot)
601 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )   PORT_NAME("Records")
602 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN  )
603 
604 	PORT_START("COINS")
605 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1         )
606 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN       )
607 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2         )
608 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN  )
609 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Key Down")
610 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
611 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
612 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
613 
614 	PORT_START("BUTTONS1")
615 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SLOT_STOP1    )
616 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SLOT_STOP2    )
617 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP3    )
618 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL )
619 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
620 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
621 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
622 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
623 
624 	PORT_START("BUTTONS2")
625 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1      ) PORT_NAME("Start / Half D-Up Bet")
626 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_LOW  ) PORT_NAME("Small")
627 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1     ) PORT_NAME("Left Bet / 2X D-Up Bet")
628 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE )
629 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2     ) PORT_NAME("Right Bet / D-Up Bet")
630 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Big")
631 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
632 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
633 INPUT_PORTS_END
634 
635 
636 /***************************************************************************
637                                 Graphics Layout
638 ***************************************************************************/
639 
640 static const gfx_layout layout_8x8x6 =
641 {
642 	8, 8,
643 	RGN_FRAC(1, 3),
644 	6,
645 	{   RGN_FRAC(0,3)+8,RGN_FRAC(0,3)+0,
646 		RGN_FRAC(1,3)+8,RGN_FRAC(1,3)+0,
647 		RGN_FRAC(2,3)+8,RGN_FRAC(2,3)+0 },
648 	{ STEP8(0,1) },
649 	{ STEP8(0,2*8) },
650 	8*8*2
651 };
652 
653 static const gfx_layout layout_8x32x6 =
654 {
655 	8, 32,
656 	RGN_FRAC(1, 3),
657 	6,
658 	{   RGN_FRAC(0,3)+8,RGN_FRAC(0,3)+0,
659 		RGN_FRAC(1,3)+8,RGN_FRAC(1,3)+0,
660 		RGN_FRAC(2,3)+8,RGN_FRAC(2,3)+0 },
661 	{ STEP8(0,1) },
662 	{ STEP32(0,2*8) },
663 	8*32*2
664 };
665 
666 static GFXDECODE_START( gfx_jingbell )
667 	GFXDECODE_ENTRY( "reels", 0, layout_8x32x6, 0, 16 )
668 	GFXDECODE_ENTRY( "tiles", 0, layout_8x8x6,  0, 16 )
669 GFXDECODE_END
670 
671 static const gfx_layout tiles8x8_layout =
672 {
673 	8,8,
674 	RGN_FRAC(1,3),
675 	6,
676 	{ RGN_FRAC(2,3)+0, RGN_FRAC(2,3)+1, RGN_FRAC(1,3)+0, RGN_FRAC(1,3)+1, RGN_FRAC(0,3)+0, RGN_FRAC(0,3)+1 },
677 	{ 8,10,12,14, 0, 2, 4, 6, },
678 	{ STEP8(0,16) },
679 	16*8
680 };
681 
682 static const gfx_layout tiles8x32_layout =
683 {
684 	8,32,
685 	RGN_FRAC(1,3),
686 	6,
687 	{ RGN_FRAC(2,3)+0, RGN_FRAC(2,3)+1, RGN_FRAC(1,3)+0, RGN_FRAC(1,3)+1, RGN_FRAC(0,3)+0, RGN_FRAC(0,3)+1 },
688 	{ 8,10,12,14, 0, 2, 4, 6, },
689 	{ STEP32(0,16) },
690 	32*16
691 };
692 
693 static GFXDECODE_START( gfx_gp98 )
694 	GFXDECODE_ENTRY( "reels", 0, tiles8x32_layout, 0, 16 )
695 	GFXDECODE_ENTRY( "tiles", 0, tiles8x8_layout, 0, 16 )
696 GFXDECODE_END
697 
698 
699 /***************************************************************************
700                                 Machine Drivers
701 ***************************************************************************/
702 
machine_start()703 void igs009_state::machine_start()
704 {
705 	m_leds.resolve();
706 
707 
708 	save_item(NAME(m_video_enable));
709 	save_item(NAME(m_nmi_enable));
710 	save_item(NAME(m_hopper));
711 	save_item(NAME(m_out));
712 	save_item(NAME(m_igs_magic));
713 }
714 
machine_reset()715 void igs009_state::machine_reset()
716 {
717 	m_nmi_enable    =   0;
718 	m_hopper        =   0;
719 	m_video_enable  =   1;
720 }
721 
WRITE_LINE_MEMBER(igs009_state::vblank_irq)722 WRITE_LINE_MEMBER(igs009_state::vblank_irq)
723 {
724 	if (state && BIT(m_nmi_enable, 7))
725 		m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
726 }
727 
jingbell(machine_config & config)728 void igs009_state::jingbell(machine_config &config)
729 {
730 	// basic machine hardware
731 	HD64180RP(config, m_maincpu, XTAL(12'000'000));   // HD64180RP8, 8 MHz?
732 	m_maincpu->set_addrmap(AS_PROGRAM, &igs009_state::jingbell_map);
733 	m_maincpu->set_addrmap(AS_IO, &igs009_state::jingbell_portmap);
734 
735 	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
736 
737 	i8255_device &ppi0(I8255A(config, "ppi8255_0"));
738 	ppi0.out_pa_callback().set(FUNC(igs009_state::nmi_and_coins_w));
739 	ppi0.in_pb_callback().set_ioport("SERVICE");
740 	ppi0.in_pc_callback().set_ioport("COINS");
741 
742 	i8255_device &ppi1(I8255A(config, "ppi8255_1"));
743 	ppi1.in_pa_callback().set_ioport("BUTTONS1");
744 	ppi1.out_pb_callback().set(FUNC(igs009_state::video_and_leds_w));
745 	ppi1.out_pc_callback().set(FUNC(igs009_state::leds_w));
746 
747 	// video hardware
748 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
749 	m_screen->set_refresh_hz(60);
750 	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
751 	m_screen->set_size(512, 256);
752 	m_screen->set_visarea(0, 512-1, 0, 256-16-1);
753 	m_screen->set_screen_update(FUNC(igs009_state::screen_update));
754 	m_screen->set_palette(m_palette);
755 	m_screen->screen_vblank().set(FUNC(igs009_state::vblank_irq));
756 
757 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_jingbell);
758 	PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x400);
759 
760 	// sound hardware
761 	SPEAKER(config, "mono").front_center();
762 	YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
763 
764 	OKIM6295(config, "oki", XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
765 }
766 
767 
gp98(machine_config & config)768 void igs009_state::gp98(machine_config &config)
769 {
770 	jingbell(config);
771 	// basic machine hardware
772 	m_maincpu->set_addrmap(AS_IO, &igs009_state::gp98_portmap);
773 
774 	m_gfxdecode->set_info(gfx_gp98);
775 
776 	MCFG_VIDEO_START_OVERRIDE(igs009_state,gp98)
777 }
778 
779 
780 /***************************************************************************
781 
782   Jingle Bell
783   IGS, 1997.
784 
785   English versions.
786 
787   1x HD64180RP8 (u18)
788   2x NEC D8255AC-2 (u19, u20)
789   1x custom IGS 009 F56D 246 (u22)
790   1x YM2413 (u45)
791   1x AR17961-AP0640 (u46)(sound equivalent to OKI M6295)
792 
793   4x 27C512 (1, 2, 3, V)
794   3x 27C2001 (4, 5, 6)
795   1x 27C256 (7)
796   1x 27C1001 (sp)
797 
798   1x UMC UM6264B-10L (u42)
799   2x UMC UM6164DK-12 (u1, u2)
800 
801   1x crystal 12.000 MHz.
802   1x crystal 3.579545 MHz.
803 
804   1x 38x2 edge connector.
805   2x 10x2 edge connectors.
806   1x switch.
807   1x 3.6 V. lithium battery.
808   5x 8 DIP switches banks.
809 
810 ***************************************************************************/
811 
812 /* Jingle Bells (V157 US)
813    Original IGS.
814    For amusement.
815 */
816 ROM_START( jingbell )
817 	ROM_REGION( 0x10000, "maincpu", 0 )
818 	ROM_LOAD( "27c512_v157_us.u44", 0x00000, 0x10000, CRC(37f95b60) SHA1(db2022802ce553ce7a0e8403408f3194b2f10007) )
819 
820 	ROM_REGION( 0x8000, "data", 0 )
CRC(a7affa15)821 	ROM_LOAD( "27c256_v157_us.u43", 0x0000, 0x8000, CRC(a7affa15) SHA1(f9d33e32b57ad267d383e075663994e0af0b3016) )
822 
823 	ROM_REGION( 0x30000, "reels", 0 )
824 	ROM_LOAD( "27c512_v157_us.u17", 0x00000, 0x10000, CRC(cadd7910) SHA1(aa514ddb29c8c9a77478d56bea4ae71995fdd518) )
825 	ROM_LOAD( "27c512_v157_us.u16", 0x10000, 0x10000, CRC(a9e1f5aa) SHA1(68d7f4e9e9a5bbce0904e406ee6fe82e9e52a9ba) )
826 	ROM_LOAD( "27c512_v157_us.u15", 0x20000, 0x10000, CRC(865b7d3a) SHA1(c1dff3a27d747ee499aaee0c4468534f0249a3e5) )
827 
828 	ROM_REGION( 0xc0000, "tiles", 0 )
829 	ROM_LOAD( "27c2001_v157_us.u25", 0x00000, 0x40000, CRC(daa56ce5) SHA1(4f14a8efac16b03bd14dd26d586bcb8d5bef65c1) )
830 	ROM_LOAD( "27c2001_v157_us.u24", 0x40000, 0x40000, CRC(b10b38e1) SHA1(397b2d899e47c6249fbbb6e6262d0390d9b796e6) )
831 	ROM_LOAD( "27c2001_v157_us.u23", 0x80000, 0x40000, CRC(a3304b5a) SHA1(bf51cb1f728758d50ce27275aa19ef649f6b34b9) )
832 
833 	ROM_REGION( 0x40000, "oki", 0 )
834 	ROM_LOAD( "mx29f001t_v157_us_sp.u38", 0x00000, 0x20000, CRC(a42d73b1) SHA1(93157e9630d5c8bb34c71186415d0aa8c5d51951) )
835 ROM_END
836 
837 /* Jingle Bells (V155 EU)
838    Original IGS.
839    For amusement.
840 */
841 ROM_START( jingbella )
842 	ROM_REGION( 0x10000, "maincpu", 0 )
843 	ROM_LOAD( "27c512_v155.u44", 0x00000, 0x10000, CRC(0813d12b) SHA1(4c35b656d1e54619bbfd26cbc017eba336e6abda) )
844 
845 	ROM_REGION( 0x8000, "data", 0 )
846 	ROM_LOAD( "27c256_v155.u43", 0x0000, 0x8000, CRC(a7affa15) SHA1(f9d33e32b57ad267d383e075663994e0af0b3016) )
847 
848 	ROM_REGION( 0x30000, "reels", 0 )
849 	ROM_LOAD( "27c512_v155.u17", 0x00000, 0x10000, CRC(cadd7910) SHA1(aa514ddb29c8c9a77478d56bea4ae71995fdd518) )
850 	ROM_LOAD( "27c512_v155.u16", 0x10000, 0x10000, CRC(a9e1f5aa) SHA1(68d7f4e9e9a5bbce0904e406ee6fe82e9e52a9ba) )
851 	ROM_LOAD( "27c512_v155.u15", 0x20000, 0x10000, CRC(865b7d3a) SHA1(c1dff3a27d747ee499aaee0c4468534f0249a3e5) )
852 
853 	ROM_REGION( 0xc0000, "tiles", 0 )
854 	ROM_LOAD( "27c2001_v155.u25", 0x00000, 0x40000, CRC(daa56ce5) SHA1(4f14a8efac16b03bd14dd26d586bcb8d5bef65c1) )
855 	ROM_LOAD( "27c2001_v155.u24", 0x40000, 0x40000, CRC(b10b38e1) SHA1(397b2d899e47c6249fbbb6e6262d0390d9b796e6) )
856 	ROM_LOAD( "27c2001_v155.u23", 0x80000, 0x40000, CRC(a3304b5a) SHA1(bf51cb1f728758d50ce27275aa19ef649f6b34b9) )
857 
858 	ROM_REGION( 0x40000, "oki", 0 )
859 	ROM_LOAD( "27c1001_v155_sp.u38", 0x00000, 0x20000, CRC(a42d73b1) SHA1(93157e9630d5c8bb34c71186415d0aa8c5d51951) )
860 ROM_END
861 
862 /* Jingle Bells (V153 EU)
863    Original IGS.
864    For amusement.
865 */
866 ROM_START( jingbellb )
867 	ROM_REGION( 0x10000, "maincpu", 0 )
868 	ROM_LOAD( "27c512_v153.u44", 0x00000, 0x10000, CRC(fd3bc092) SHA1(a92dc9bc15d7a4816887d66d46cea925d230c5b8) )
869 
870 	ROM_REGION( 0x8000, "data", 0 )
871 	ROM_LOAD( "27c256_v153.u43", 0x0000, 0x8000, CRC(a7affa15) SHA1(f9d33e32b57ad267d383e075663994e0af0b3016) )
872 
873 	ROM_REGION( 0x30000, "reels", 0 )
874 	ROM_LOAD( "27c512_v153.u17", 0x00000, 0x10000, CRC(cadd7910) SHA1(aa514ddb29c8c9a77478d56bea4ae71995fdd518) )
875 	ROM_LOAD( "27c512_v153.u16", 0x10000, 0x10000, CRC(a9e1f5aa) SHA1(68d7f4e9e9a5bbce0904e406ee6fe82e9e52a9ba) )
876 	ROM_LOAD( "27c512_v153.u15", 0x20000, 0x10000, CRC(865b7d3a) SHA1(c1dff3a27d747ee499aaee0c4468534f0249a3e5) )
877 
878 	ROM_REGION( 0xc0000, "tiles", 0 )
879 	ROM_LOAD( "27c2001_v153.u25", 0x00000, 0x40000, CRC(daa56ce5) SHA1(4f14a8efac16b03bd14dd26d586bcb8d5bef65c1) )
880 	ROM_LOAD( "27c2001_v153.u24", 0x40000, 0x40000, CRC(b10b38e1) SHA1(397b2d899e47c6249fbbb6e6262d0390d9b796e6) )
881 	ROM_LOAD( "27c2001_v153.u23", 0x80000, 0x40000, CRC(a3304b5a) SHA1(bf51cb1f728758d50ce27275aa19ef649f6b34b9) )
882 
883 	ROM_REGION( 0x40000, "oki", 0 )
884 	ROM_LOAD( "27c1001_v153_sp.u38", 0x00000, 0x20000, CRC(a42d73b1) SHA1(93157e9630d5c8bb34c71186415d0aa8c5d51951) )
885 ROM_END
886 
887 /* Jingle Bells (V141 EU)
888    Original IGS.
889    For amusement.
890 */
891 ROM_START( jingbellc )
892 	ROM_REGION( 0x10000, "maincpu", 0 )
893 	ROM_LOAD( "27c512_v141.u44", 0x00000, 0x10000, CRC(6997a903) SHA1(991508d85e55a3c6f811070352e06ae6bf65cc2e) )
894 
895 	ROM_REGION( 0x8000, "data", 0 )
896 	ROM_LOAD( "27c256_v141.u43", 0x0000, 0x8000, CRC(a7affa15) SHA1(f9d33e32b57ad267d383e075663994e0af0b3016) )
897 
898 	ROM_REGION( 0x30000, "reels", 0 )
899 	ROM_LOAD( "27c512_v141.u17", 0x00000, 0x10000, CRC(cadd7910) SHA1(aa514ddb29c8c9a77478d56bea4ae71995fdd518) )
900 	ROM_LOAD( "27c512_v141.u16", 0x10000, 0x10000, CRC(a9e1f5aa) SHA1(68d7f4e9e9a5bbce0904e406ee6fe82e9e52a9ba) )
901 	ROM_LOAD( "27c512_v141.u15", 0x20000, 0x10000, CRC(865b7d3a) SHA1(c1dff3a27d747ee499aaee0c4468534f0249a3e5) )
902 
903 	ROM_REGION( 0xc0000, "tiles", 0 )
904 	ROM_LOAD( "27c2001_v141.u25", 0x00000, 0x40000, CRC(f53bac7e) SHA1(f4375da0780fba59fcb65e24a33099af35e4d286) )
905 	ROM_LOAD( "27c2001_v141.u24", 0x40000, 0x40000, CRC(bddd6001) SHA1(2a6395e9593352d3ea2d477a7f41805f389c9c50) )
906 	ROM_LOAD( "27c2001_v141.u23", 0x80000, 0x40000, CRC(e8322c75) SHA1(c3385538fb673a4ab14c315ce8bce792eb264ec7) )
907 
908 	ROM_REGION( 0x40000, "oki", 0 )
909 	ROM_LOAD( "27c1001_v141_sp.u38", 0x00000, 0x20000, CRC(a42d73b1) SHA1(93157e9630d5c8bb34c71186415d0aa8c5d51951) )
910 ROM_END
911 
912 /***************************************************************************
913 
914 Jingle Bell
915 Italy, V133I
916 (C) IGS ("COPYRIGHT 1995" in ROM, "FEB. 23 1998" on sticker)
917 
918 CPU:
919     1x HD64180RP8 (u18)(main)
920     2x NEC D8255AC (u19,u20)(main)
921     1x custom IGS009-F56D246 (u22)
922     1x U3567HX881 (u45)(sound equivalent to ym2413)
923     1x AR17961-AP0848 (u46)(sound equivalent to m6295)
924     1x oscillator 12.000
925     1x oscillator 3.579545
926 
927 ROMs:
928     3x M27C512 (1,2,3)
929     1x LE27C2001F (4)
930     2x MX27C2000 (5,6)
931     1x D27256 (7)
932     1x MX27C512 (v)
933     1x NM27C010 (sp)
934     2x PALCE16V8H (read protected)
935     1x PALCE22V10H (read protected)
936     1x PALCE22V10H (dumped)
937 
938 Notes:
939     1x 38x2 edge connector
940     1x 10x2 edge connector
941     1x pushbutton
942     1x battery
943     5x 8x2 switches dip
944 
945 12/02/2008 f205v
946 
947 ***************************************************************************/
948 
949 ROM_START( jingbelli )
950 	ROM_REGION( 0x10000, "maincpu", 0 )
951 	ROM_LOAD( "jinglev133i.u44", 0x00000, 0x10000, CRC(df60dc39) SHA1(ff57afd50c045b621395353fdc50ffd1e1b65e9e) )
952 
953 	ROM_REGION( 0x8000, "data", 0 )
954 	ROM_LOAD( "jingle133i7.u43", 0x0000, 0x8000, CRC(a7affa15) SHA1(f9d33e32b57ad267d383e075663994e0af0b3016) )
955 
956 	ROM_REGION( 0x30000, "reels", 0 )
957 	ROM_LOAD( "jingle133i1.u17", 0x00000, 0x10000, CRC(cadd7910) SHA1(aa514ddb29c8c9a77478d56bea4ae71995fdd518) )
958 	ROM_LOAD( "jingle133i2.u16", 0x10000, 0x10000, CRC(a9e1f5aa) SHA1(68d7f4e9e9a5bbce0904e406ee6fe82e9e52a9ba) )
959 	ROM_LOAD( "jingle133i3.u15", 0x20000, 0x10000, CRC(865b7d3a) SHA1(c1dff3a27d747ee499aaee0c4468534f0249a3e5) )
960 
961 	ROM_REGION( 0xc0000, "tiles", 0 )
962 	ROM_LOAD( "jingle133i4.u25", 0x00000, 0x40000, CRC(7aa1d344) SHA1(141e27df93cb35ab852d9022e0b08bd596f1186b) )
963 	ROM_LOAD( "jingle133i5.u24", 0x40000, 0x40000, CRC(021261d1) SHA1(5b23f9bd818193c343f9f4c9317955b17efb8cfa) )
964 	ROM_LOAD( "jingle133i6.u23", 0x80000, 0x40000, CRC(c40228fd) SHA1(4dc05337d64ed2b8d66fc5f0ca8ffbf96799f768) )
965 
966 	ROM_REGION( 0x40000, "oki", 0 )
967 	ROM_LOAD( "jingle133isp.u38", 0x00000, 0x20000, CRC(a42d73b1) SHA1(93157e9630d5c8bb34c71186415d0aa8c5d51951) )
968 
969 	ROM_REGION( 0x2dd, "plds",0 )
970 	ROM_LOAD( "palce16v8h-ch-jin-u12v.u12", 0x000, 0x117, NO_DUMP )
971 	ROM_LOAD( "palce16v8h-ch-jin-u33v.u33", 0x000, 0x117, NO_DUMP )
972 	ROM_LOAD( "palce22v10h-ajbu24.u24",     0x000, 0x2dd, CRC(6310f441) SHA1(b610e170ccca1fcb06a57f718ece1408b696ba9c) )
973 	ROM_LOAD( "palce22v10h-ch-jin-u27.u27", 0x000, 0x2dd, NO_DUMP )
974 ROM_END
975 
976 void igs009_state::decrypt_jingbell()
977 {
978 	uint8_t *rom  = (uint8_t *)memregion("maincpu")->base();
979 	size_t size = memregion("maincpu")->bytes();
980 
981 	for (int i=0; i<size; i++)
982 	{
983 		uint8_t x = rom[i];
984 		if (i & 0x0080)
985 		{
986 			if ((i & 0x0420) == 0x0420) x ^= 0x20;
987 			else                        x ^= 0x22;
988 		}
989 		else
990 		{
991 			if (i & 0x0200) x ^= 0x02;
992 			else            x ^= 0x22;
993 		}
994 
995 		if ((i & 0x1208) == 0x1208) x ^= 0x01;
996 
997 		rom[i] = x;
998 	}
999 }
1000 
init_jingbelli()1001 void igs009_state::init_jingbelli()
1002 {
1003 	decrypt_jingbell();
1004 
1005 	// protection patch
1006 	uint8_t *rom  = (uint8_t *)memregion("maincpu")->base();
1007 	rom[0x01f19] = 0x18;
1008 }
1009 
init_jingbell()1010 void igs009_state::init_jingbell()
1011 {
1012 	decrypt_jingbell();
1013 
1014 	// protection patch
1015 	uint8_t *rom  = (uint8_t *)memregion("maincpu")->base();
1016 	rom[0x0e753] = 0x18;
1017 }
1018 
1019 /***************************************************************************
1020 
1021 Grand Prix '98
1022 
1023 PCB Layout
1024 ----------
1025 
1026 |-----------------------------------------|
1027 |                 YM2413       DSW2  DSW4 |
1028 |                 3.579545MHz             |
1029 |   Z180                       DSW1  DSW3 |
1030 |                 PAL                     |
1031 |     PRG                                 |
1032 |   12MHz                                 |
1033 |J                   51        |-------|  |
1034 |A    6264                     |PLCC84 |  |
1035 |M                   50        |FPGA   |  |
1036 |M                             |       |  |
1037 |A                   49        |-------|  |
1038 |                                         |
1039 |                                         |
1040 |                                         |
1041 |                   6264                  |
1042 |                                         |
1043 |          62256                          |
1044 |-----------------------------------------|
1045 Z180 @ 12MHz
1046 YM2413 @ 3.579545MHz
1047 VSync 60Hz
1048 HSync 15.35kHz
1049 
1050 ***************************************************************************/
1051 
1052 ROM_START( gp98 )
1053 	ROM_REGION( 0x20000, "maincpu", 0 )
1054 	ROM_LOAD( "prg", 0x00000, 0x20000, CRC(1c02b8cc) SHA1(b8a29cbd96581f8ae1c1028279b8ee703be29f5f) )
1055 
1056 	ROM_REGION( 0x8000, "data", 0 )
1057 	ROM_COPY( "maincpu", 0x18000, 0x00000, 0x8000 )
1058 
1059 	ROM_REGION( 0x180000, "tempgfx", 0 ) // 6bpp (2bpp per rom) font at tile # 0x4000
1060 	ROM_LOAD( "em-03.u49", 0x000000, 0x80000, CRC(f92c510d) SHA1(f8dc4d7d1fdc6f62fcdd86caf8fd703db4b5fb18) )
1061 	ROM_LOAD( "em-02.u50", 0x080000, 0x80000, CRC(48f6190d) SHA1(b430131a258b4e2fc178ac0e3e3f0010a82eac65) )
1062 	ROM_LOAD( "em-01.u51", 0x100000, 0x80000, CRC(30a2ef85) SHA1(38ea637acd83b175eccd2969ef21879265b88992) )
1063 
1064 	ROM_REGION( 0xc0000, "reels", 0 )
1065 	ROM_COPY( "tempgfx", 0x000000, 0x00000, 0x40000 )
1066 	ROM_COPY( "tempgfx", 0x080000, 0x40000, 0x40000 )
1067 	ROM_COPY( "tempgfx", 0x100000, 0x80000, 0x40000 )
1068 
1069 	ROM_REGION( 0xc0000, "tiles", 0 )
1070 	ROM_COPY( "tempgfx", 0x040000, 0x00000, 0x40000 )
1071 	ROM_COPY( "tempgfx", 0x0c0000, 0x40000, 0x40000 )
1072 	ROM_COPY( "tempgfx", 0x140000, 0x80000, 0x40000 )
1073 
1074 	ROM_REGION( 0x40000, "oki", ROMREGION_ERASE00 )
1075 	// no OKI on this
1076 ROM_END
1077 
1078 
1079 /*    YEAR   NAME       PARENT    MACHINE   INPUT     STATE          INIT            ROT   COMPANY           FULLNAME                      FLAGS  */
1080 GAME( 1997,  jingbell,  0,        jingbell, jingbell, igs009_state,  init_jingbell,  ROT0, "IGS",            "Jingle Bell (US, V157US)",   MACHINE_SUPPORTS_SAVE )
1081 GAME( 1997,  jingbella, jingbell, jingbell, jingbell, igs009_state,  init_jingbell,  ROT0, "IGS",            "Jingle Bell (EU, V155UE)",   MACHINE_SUPPORTS_SAVE )   // Shows V154UE in test mode!
1082 GAME( 1997,  jingbellb, jingbell, jingbell, jingbell, igs009_state,  init_jingbell,  ROT0, "IGS",            "Jingle Bell (EU, V153UE)",   MACHINE_SUPPORTS_SAVE )
1083 GAME( 1995,  jingbellc, jingbell, jingbell, jingbell, igs009_state,  init_jingbelli, ROT0, "IGS",            "Jingle Bell (EU, V141UE)",   MACHINE_SUPPORTS_SAVE )
1084 GAME( 1995?, jingbelli, jingbell, jingbell, jingbell, igs009_state,  init_jingbelli, ROT0, "IGS",            "Jingle Bell (Italy, V133I)", MACHINE_SUPPORTS_SAVE )
1085 GAME( 1998,  gp98,      0,        gp98,     jingbell, igs009_state,  empty_init,     ROT0, "Romtec Co. Ltd", "Grand Prix '98 (V100K)",     MACHINE_SUPPORTS_SAVE )
1086