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