1 /***************************************************************************
2 
3   Snow Brothers (Toaplan) / SemiCom Hardware
4   uses Kaneko's Pandora sprite chip (also used in DJ Boy, Air Buster ..)
5 
6 Snow Bros Nick & Tom
7 Toaplan, 1990
8 
9 	PCB Layout
10 	----------
11 	MIN16-02
12 
13 	|------------------------------------------|
14 	| VOL     YM3812  6116  4464  4464         |
15 	| LA4460  YM3014        4464  4464         |
16 	|       458   SBROS-4.29         SBROS1.40 |
17 	|   2003       Z80B     PANDORA            |
18 	|J                    D41101C-1 LS07  LS32 |
19 	|A SBROS-3A.5 SBROS-2A.6        LS139 LS174|
20 	|M                  LS245 LS74  LS04  16MHz|
21 	|M   6264     6264  F32   LS74  LS74       |
22 	|A      68000       LS20  F138  LS04  12MHz|
23 	|                   LS04  LS148 LS251 LS00 |
24 	| LS273 LS245 LS245 LS158 LS257 LS257 LS32 |
25 	|                                          |
26 	| LS273  6116  6116 LS157   DSW2  DSW1     |
27 	|------------------------------------------|
28 
29 	Notes:
30 	       68k clock: 8.000MHz
31 	      Z80B clock: 6.000MHz
32 	    YM3812 clock: 3.000MHz
33 	           VSync: 57.5Hz
34 	           HSync: 15.68kHz
35 
36   driver by Mike Coates
37 
38   Hyper Pacman addition by David Haywood
39    + some bits by Nicola Salmoria
40 
41 
42 Stephh's notes (hyperpac):
43 
44   - According to the "Language" Dip Switch, this game is a Korean game.
45      (although the Language Dipswitch doesn't affect language, but yes
46       I believe SemiCom to be a Korean Company)
47   - There is no "cocktail mode", nor way to flip the screen.
48 
49 todo:
50 
51 make the originals work.
52 they're probably all this hardware or a varation on it, they don't work
53 (most point the interrupt vectors directly at a small area of ram which I'd
54 guess is shared with the Philips 87c52 mcu, more more plus doesn't point the
55 vectors there but does have a jump there in the code). See hyperpac for an
56 example, the protection data for that game was extracted from the bootleg.
57 
58 ***************************************************************************/
59 
60 #include "driver.h"
61 #include "vidhrdw/generic.h"
62 #include "cpu/m68000/m68000.h"
63 #include "cpu/z80/z80.h"
64 
65 
66 WRITE16_HANDLER( snowbros_flipscreen_w );
67 VIDEO_UPDATE( snowbros );
68 VIDEO_UPDATE( wintbob );
69 
70 static data16_t *hyperpac_ram;
71 
INTERRUPT_GEN(snowbros_interrupt)72 static INTERRUPT_GEN( snowbros_interrupt )
73 {
74 	cpu_set_irq_line(0, cpu_getiloops() + 2, HOLD_LINE);	/* IRQs 4, 3, and 2 */
75 }
76 
77 
78 /* Sound Routines */
79 
READ16_HANDLER(snowbros_68000_sound_r)80 READ16_HANDLER( snowbros_68000_sound_r )
81 {
82 	int ret;
83 
84 	/* If the sound CPU is running, read the YM3812 status, otherwise
85 	   just make it pass the test */
86 	if (Machine->sample_rate != 0)
87 	{
88 		ret = soundlatch_r(offset);
89 	}
90 	else
91 	{
92 		ret = 3;
93 	}
94 
95 	return ret;
96 }
97 
98 
WRITE16_HANDLER(snowbros_68000_sound_w)99 static WRITE16_HANDLER( snowbros_68000_sound_w )
100 {
101 	if (ACCESSING_LSB)
102 	{
103 		soundlatch_w(offset,data & 0xff);
104 		cpu_set_irq_line(1,IRQ_LINE_NMI,PULSE_LINE);
105 	}
106 }
107 
WRITE16_HANDLER(semicom_soundcmd_w)108 static WRITE16_HANDLER( semicom_soundcmd_w )
109 {
110 	if (ACCESSING_LSB) soundlatch_w(0,data & 0xff);
111 }
112 
113 
114 /* Snow Bros Memory Map */
115 
MEMORY_READ16_START(readmem)116 static MEMORY_READ16_START( readmem )
117 	{ 0x000000, 0x03ffff, MRA16_ROM },
118 	{ 0x100000, 0x103fff, MRA16_RAM },
119 	{ 0x300000, 0x300001, snowbros_68000_sound_r },
120 	{ 0x500000, 0x500001, input_port_0_word_r },
121 	{ 0x500002, 0x500003, input_port_1_word_r },
122 	{ 0x500004, 0x500005, input_port_2_word_r },
123 	{ 0x600000, 0x6001ff, MRA16_RAM },
124 	{ 0x700000, 0x701fff, MRA16_RAM },
125 MEMORY_END
126 
127 static MEMORY_WRITE16_START( writemem )
128 	{ 0x000000, 0x03ffff, MWA16_ROM },
129 	{ 0x100000, 0x103fff, MWA16_RAM },
130 	{ 0x200000, 0x200001, watchdog_reset16_w },
131 	{ 0x300000, 0x300001, snowbros_68000_sound_w },
132 	{ 0x400000, 0x400001, snowbros_flipscreen_w },
133 	{ 0x600000, 0x6001ff, paletteram16_xBBBBBGGGGGRRRRR_word_w, &paletteram16 },
134 	{ 0x700000, 0x701fff, MWA16_RAM, &spriteram16, &spriteram_size },
135 	{ 0x800000, 0x800001, MWA16_NOP },	/* IRQ 4 acknowledge? */
136 	{ 0x900000, 0x900001, MWA16_NOP },	/* IRQ 3 acknowledge? */
137 	{ 0xa00000, 0xa00001, MWA16_NOP },	/* IRQ 2 acknowledge? */
138 MEMORY_END
139 
140 static MEMORY_READ_START( sound_readmem )
141 	{ 0x0000, 0x7fff, MRA_ROM },
142 	{ 0x8000, 0x87ff, MRA_RAM },
143 MEMORY_END
144 
145 static MEMORY_WRITE_START( sound_writemem )
146 	{ 0x0000, 0x7fff, MWA_ROM },
147 	{ 0x8000, 0x87ff, MWA_RAM },
148 MEMORY_END
149 
150 static PORT_READ_START( sound_readport )
151 	{ 0x02, 0x02, YM3812_status_port_0_r },
152 	{ 0x04, 0x04, soundlatch_r },
153 PORT_END
154 
155 static PORT_WRITE_START( sound_writeport )
156 	{ 0x02, 0x02, YM3812_control_port_0_w },
157 	{ 0x03, 0x03, YM3812_write_port_0_w },
158 	{ 0x04, 0x04, soundlatch_w },	/* goes back to the main CPU, checked during boot */
159 PORT_END
160 
161 /* SemiCom Memory Map
162 
163 the SemiCom games have slightly more ram and are protected
164 sound hardware is also different
165 
166 */
167 
168 static MEMORY_READ16_START( hyperpac_readmem )
169 	{ 0x000000, 0x0fffff, MRA16_ROM },
170 	{ 0x100000, 0x10ffff, MRA16_RAM },
171 
172 	{ 0x500000, 0x500001, input_port_0_word_r },
173 	{ 0x500002, 0x500003, input_port_1_word_r },
174 	{ 0x500004, 0x500005, input_port_2_word_r },
175 
176 	{ 0x600000, 0x6001ff, MRA16_RAM },
177 	{ 0x700000, 0x701fff, MRA16_RAM },
178 MEMORY_END
179 
180 static MEMORY_WRITE16_START( hyperpac_writemem )
181 	{ 0x000000, 0x0fffff, MWA16_ROM },
182 	{ 0x100000, 0x10ffff, MWA16_RAM, &hyperpac_ram },
183 	{ 0x300000, 0x300001, semicom_soundcmd_w },
184 /*	{ 0x400000, 0x400001,  }, ???*/
185 	{ 0x600000, 0x6001ff, paletteram16_xBBBBBGGGGGRRRRR_word_w, &paletteram16 },
186 	{ 0x700000, 0x701fff, MWA16_RAM, &spriteram16, &spriteram_size },
187 
188 	{ 0x800000, 0x800001, MWA16_NOP },	/* IRQ 4 acknowledge? */
189 	{ 0x900000, 0x900001, MWA16_NOP },	/* IRQ 3 acknowledge? */
190 	{ 0xa00000, 0xa00001, MWA16_NOP },	/* IRQ 2 acknowledge? */
191 MEMORY_END
192 
193 static MEMORY_READ_START( hyperpac_sound_readmem )
194 	{ 0x0000, 0xcfff, MRA_ROM },
195 	{ 0xd000, 0xd7ff, MRA_RAM },
196 	{ 0xf001, 0xf001, YM2151_status_port_0_r },
197 	{ 0xf008, 0xf008, soundlatch_r },
198 MEMORY_END
199 
200 static MEMORY_WRITE_START( hyperpac_sound_writemem )
201 	{ 0x0000, 0xcfff, MWA_ROM },
202 	{ 0xd000, 0xd7ff, MWA_RAM },
203 	{ 0xf000, 0xf000, YM2151_register_port_0_w },
204 	{ 0xf001, 0xf001, YM2151_data_port_0_w },
205 	{ 0xf002, 0xf002, OKIM6295_data_0_w },
206 /*	{ 0xf006, 0xf006,  }, ???*/
207 MEMORY_END
208 
209 INPUT_PORTS_START( snowbros )
210 	PORT_START	/* 500001 */
211 	PORT_DIPNAME( 0x01, 0x00, "Country (Affects Coinage)" )
212 	PORT_DIPSETTING(    0x00, "Europe" )
213 	PORT_DIPSETTING(    0x01, "America (Romstar license)" )
214 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) )
215 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
216 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
217 	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
218 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) )
219 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
220 	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
221 /* Better to implement a coin mode 1-2 stuff later */
222 	PORT_DIPNAME( 0x30, 0x30, "Coin A Europe/America" )
223 	PORT_DIPSETTING(    0x00, "4C/1C 2C/3C" )
224 	PORT_DIPSETTING(    0x10, "3C/1C 2C/1C" )
225 	PORT_DIPSETTING(    0x20, "2C/1C 1C/2C" )
226 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_1C ) )
227 	PORT_DIPNAME( 0xc0, 0xc0, "Coin B Europe/America" )
228 	PORT_DIPSETTING(    0xc0, "1C/2C 1C/1C" )
229 	PORT_DIPSETTING(    0x80, "1C/3C 1C/2C" )
230 	PORT_DIPSETTING(    0x40, "1C/4C 2C/1C" )
231 	PORT_DIPSETTING(    0x00, "1C/6C 2C/3C" )
232 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
233 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
234 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
235 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
236 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 )
237 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 )
238 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 )
239 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )	/* Must be low or game stops! */
240 													/* probably VBlank */
241 
242 	PORT_START	/* 500003 */
243 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
244 	PORT_DIPSETTING(    0x02, "Easy" )
245 	PORT_DIPSETTING(    0x03, "Normal" )
246 	PORT_DIPSETTING(    0x01, "Hard" )
247 	PORT_DIPSETTING(    0x00, "Hardest" )
248 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) )
249 	PORT_DIPSETTING(    0x04, "100k and every 200k " )
250 	PORT_DIPSETTING(    0x0c, "100k Only" )
251 	PORT_DIPSETTING(    0x08, "200k Only" )
252 	PORT_DIPSETTING(    0x00, "None" )
253 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
254 	PORT_DIPSETTING(    0x20, "1" )
255 	PORT_DIPSETTING(    0x00, "2" )
256 	PORT_DIPSETTING(    0x30, "3" )
257 	PORT_DIPSETTING(    0x10, "4" )
258 	PORT_BITX(    0x40, 0x40, IPT_DIPSWITCH_NAME | IPF_CHEAT, "Invulnerability", IP_KEY_NONE, IP_JOY_NONE )
259 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
260 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
261 	PORT_DIPNAME( 0x80, 0x80, "Allow Continue" )
262 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
263 	PORT_DIPSETTING(    0x80, DEF_STR( Yes ) )
264 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
265 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
266 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
267 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
268 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
269 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
270 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
271 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
272 
273 	PORT_START	/* 500005 */
274 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
275 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 )
276 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_COIN1 )
277 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN2 )
278 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
279 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_TILT )
280 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN3 )
281 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
282 INPUT_PORTS_END
283 
284 INPUT_PORTS_START( snowbroj )
285 	PORT_START	/* 500001 */
286 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
287 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
288 	PORT_DIPSETTING(    0x01, DEF_STR( On ) )
289 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) )
290 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
291 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
292 	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
293 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) )
294 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
295 	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
296 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) )
297 	PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) )
298 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_1C ) )
299 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_3C ) )
300 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_2C ) )
301 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) )
302 	PORT_DIPSETTING(    0x40, DEF_STR( 2C_1C ) )
303 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_1C ) )
304 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_3C ) )
305 	PORT_DIPSETTING(    0x80, DEF_STR( 1C_2C ) )
306 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
307 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
308 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
309 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
310 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 )
311 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 )
312 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 )
313 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )	/* Must be low or game stops! */
314 													/* probably VBlank */
315 
316 	PORT_START	/* 500003 */
317 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
318 	PORT_DIPSETTING(    0x02, "Easy" )
319 	PORT_DIPSETTING(    0x03, "Normal" )
320 	PORT_DIPSETTING(    0x01, "Hard" )
321 	PORT_DIPSETTING(    0x00, "Hardest" )
322 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) )
323 	PORT_DIPSETTING(    0x04, "100k and every 200k " )
324 	PORT_DIPSETTING(    0x0c, "100k Only" )
325 	PORT_DIPSETTING(    0x08, "200k Only" )
326 	PORT_DIPSETTING(    0x00, "None" )
327 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
328 	PORT_DIPSETTING(    0x20, "1" )
329 	PORT_DIPSETTING(    0x00, "2" )
330 	PORT_DIPSETTING(    0x30, "3" )
331 	PORT_DIPSETTING(    0x10, "4" )
332 	PORT_BITX(    0x40, 0x40, IPT_DIPSWITCH_NAME | IPF_CHEAT, "Invulnerability", IP_KEY_NONE, IP_JOY_NONE )
333 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
334 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
335 	PORT_DIPNAME( 0x80, 0x80, "Allow Continue" )
336 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
337 	PORT_DIPSETTING(    0x80, DEF_STR( Yes ) )
338 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
339 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
340 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
341 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
342 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
343 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
344 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
345 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
346 
347 	PORT_START	/* 500005 */
348 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
349 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 )
350 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_COIN1 )
351 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN2 )
352 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
353 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_TILT )
354 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN3 )
355 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
356 INPUT_PORTS_END
357 
358 INPUT_PORTS_START( hyperpac )
359 	PORT_START	/* 500000.w */
360 	PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Demo_Sounds ) )
361 	PORT_DIPSETTING(      0x0001, DEF_STR( Off ) )
362 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
363 	PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Lives ) )	/* "Language" in the "test mode"*/
364 	PORT_DIPSETTING(      0x0002, "3" )					/* "Korean"*/
365 	PORT_DIPSETTING(      0x0000, "5" )					/* "English"*/
366 	PORT_DIPNAME( 0x001c, 0x001c, DEF_STR( Coinage ) )
367 	PORT_DIPSETTING(      0x0000, DEF_STR( 5C_1C ) )
368 	PORT_DIPSETTING(      0x0004, DEF_STR( 4C_1C ) )
369 	PORT_DIPSETTING(      0x0008, DEF_STR( 3C_1C ) )
370 	PORT_DIPSETTING(      0x000c, DEF_STR( 2C_1C ) )
371 	PORT_DIPSETTING(      0x001c, DEF_STR( 1C_1C ) )
372 	PORT_DIPSETTING(      0x0014, DEF_STR( 2C_3C ) )
373 	PORT_DIPSETTING(      0x0018, DEF_STR( 1C_2C ) )
374 	PORT_DIPSETTING(      0x0010, DEF_STR( 1C_3C ) )
375 	PORT_DIPNAME( 0x0060, 0x0060, DEF_STR( Difficulty ) )
376 	PORT_DIPSETTING(      0x0000, "Easy" )
377 	PORT_DIPSETTING(      0x0060, "Normal" )
378 	PORT_DIPSETTING(      0x0040, "Hard" )
379 	PORT_DIPSETTING(      0x0020, "Hardest" )			/* "Very Hard"*/
380 	PORT_SERVICE( 0x0080, IP_ACTIVE_LOW )
381 	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER1 )
382 	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER1 )
383 	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER1 )
384 	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 )
385 	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER1 )	/* jump*/
386 	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER1 )	/* fire*/
387 	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 | IPF_PLAYER1 )	/* test mode only?*/
388 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
389 
390 	PORT_START	/* 500002.w */
391 	PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unused ) )
392 	PORT_DIPSETTING(      0x0001, DEF_STR( Off ) )
393 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
394 	PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unused ) )
395 	PORT_DIPSETTING(      0x0002, DEF_STR( Off ) )
396 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
397 	PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unused ) )
398 	PORT_DIPSETTING(      0x0004, DEF_STR( Off ) )
399 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
400 	PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unused ) )
401 	PORT_DIPSETTING(      0x0008, DEF_STR( Off ) )
402 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
403 	PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unused ) )
404 	PORT_DIPSETTING(      0x0010, DEF_STR( Off ) )
405 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
406 	PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unused ) )
407 	PORT_DIPSETTING(      0x0020, DEF_STR( Off ) )
408 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
409 	PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unused ) )
410 	PORT_DIPSETTING(      0x0040, DEF_STR( Off ) )
411 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
412 	PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unused ) )
413 	PORT_DIPSETTING(      0x0080, DEF_STR( Off ) )
414 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
415 	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
416 	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
417 	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
418 	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
419 	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER2 )	/* jump*/
420 	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER2 )	/* fire*/
421 	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 | IPF_PLAYER2 )	/* test mode only?*/
422 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
423 
424 	PORT_START	/* 500004.w */
425 	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_START1 )
426 	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_START2 )
427 	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_COIN1 )
428 	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_COIN2 )
429 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
430 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
431 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
432 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
433 INPUT_PORTS_END
434 
435 INPUT_PORTS_START( cookbib2 )
436 	PORT_START	/* 500000.w */
437 	PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Demo_Sounds ) )
438 	PORT_DIPSETTING(      0x0001, DEF_STR( Off ) )
439 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
440 	PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Lives ) )	/* "Language" in the "test mode"*/
441 	PORT_DIPSETTING(      0x0002, "3" )					/* "Korean"*/
442 	PORT_DIPSETTING(      0x0000, "5" )					/* "English"*/
443 	PORT_DIPNAME( 0x001c, 0x001c, DEF_STR( Coinage ) )
444 	PORT_DIPSETTING(      0x0000, DEF_STR( 5C_1C ) )
445 	PORT_DIPSETTING(      0x0004, DEF_STR( 4C_1C ) )
446 	PORT_DIPSETTING(      0x0008, DEF_STR( 3C_1C ) )
447 	PORT_DIPSETTING(      0x000c, DEF_STR( 2C_1C ) )
448 	PORT_DIPSETTING(      0x001c, DEF_STR( 1C_1C ) )
449 	PORT_DIPSETTING(      0x0014, DEF_STR( 2C_3C ) )
450 	PORT_DIPSETTING(      0x0018, DEF_STR( 1C_2C ) )
451 	PORT_DIPSETTING(      0x0010, DEF_STR( 1C_3C ) )
452 	PORT_DIPNAME( 0x0060, 0x0060, DEF_STR( Difficulty ) )
453 	PORT_DIPSETTING(      0x0000, "Easy" )
454 	PORT_DIPSETTING(      0x0060, "Normal" )
455 	PORT_DIPSETTING(      0x0040, "Hard" )
456 	PORT_DIPSETTING(      0x0020, "Hardest" )			/* "Very Hard"*/
457 	PORT_SERVICE( 0x0080, IP_ACTIVE_LOW )
458 	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER1 )
459 	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER1 )
460 	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER1 )
461 	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 )
462 	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER1 )	/* jump*/
463 	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER1 )	/* fire*/
464 	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 | IPF_PLAYER1 )	/* test mode only?*/
465 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
466 
467 	PORT_START	/* 500002.w */
468 	PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unused ) )
469 	PORT_DIPSETTING(      0x0001, DEF_STR( Off ) )
470 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
471 	PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unused ) )
472 	PORT_DIPSETTING(      0x0002, DEF_STR( Off ) )
473 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
474 	PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unused ) )
475 	PORT_DIPSETTING(      0x0004, DEF_STR( Off ) )
476 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
477 	PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unused ) )
478 	PORT_DIPSETTING(      0x0008, DEF_STR( Off ) )
479 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
480 	PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unused ) )
481 	PORT_DIPSETTING(      0x0010, DEF_STR( Off ) )
482 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
483 	PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unused ) )
484 	PORT_DIPSETTING(      0x0020, DEF_STR( Off ) )
485 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
486 	PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unused ) )
487 	PORT_DIPSETTING(      0x0040, DEF_STR( Off ) )
488 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
489 	PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unused ) )
490 	PORT_DIPSETTING(      0x0080, DEF_STR( Off ) )
491 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
492 	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
493 	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
494 	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
495 	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
496 	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER2 )	/* jump*/
497 	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER2 )	/* fire*/
498 	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 | IPF_PLAYER2 )	/* test mode only?*/
499 	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
500 
501 	PORT_START	/* 500004.w */
502 	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_START1 )
503 	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_START2 )
504 	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_COIN1 )
505 	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_COIN2 )
506 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
507 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
508 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
509 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
510 INPUT_PORTS_END
511 
512 /* SnowBros */
513 
514 static struct GfxLayout tilelayout =
515 {
516 	16,16,
517 	RGN_FRAC(1,1),
518 	4,
519 	{ 0, 1, 2, 3 },
520 	{ STEP8(0,4), STEP8(8*32,4) },
521 	{ STEP8(0,32), STEP8(16*32,32) },
522 	32*32
523 };
524 
525 static struct GfxDecodeInfo gfxdecodeinfo[] =
526 {
527 	{ REGION_GFX1, 0, &tilelayout,  0, 16 },
528 	{ -1 } /* end of array */
529 };
530 
531 /* Winter Bobble */
532 
533 static struct GfxLayout tilelayout_wb =
534 {
535 	16,16,
536 	RGN_FRAC(1,1),
537 	4,
538 	{ 0, 1, 2, 3 },
539 	{ STEP4(3*4,-4), STEP4(7*4,-4), STEP4(11*4,-4), STEP4(15*4,-4) },
540 	{ STEP16(0,64) },
541 	16*64
542 };
543 
544 static struct GfxDecodeInfo gfxdecodeinfo_wb[] =
545 {
546 	{ REGION_GFX1, 0, &tilelayout_wb,  0, 16 },
547 	{ -1 }
548 };
549 
550 /* SemiCom */
551 
552 static struct GfxLayout hyperpac_tilelayout =
553 {
554 	16,16,
555 	RGN_FRAC(1,1),
556 	4,
557 	{ 0, 1, 2, 3 },
558 	{ 4, 0, 8*32+4, 8*32+0, 20,16, 8*32+20, 8*32+16,
559 	  12, 8, 8*32+12, 8*32+8, 28, 24, 8*32+28, 8*32+24 },
560 	{ 0*32, 2*32, 1*32, 3*32, 16*32+0*32, 16*32+2*32, 16*32+1*32, 16*32+3*32,
561 	  4*32, 6*32, 5*32, 7*32, 16*32+4*32, 16*32+6*32, 16*32+5*32, 16*32+7*32 },
562 	32*32
563 };
564 
565 static struct GfxDecodeInfo hyperpac_gfxdecodeinfo[] =
566 {
567 	{ REGION_GFX1, 0, &hyperpac_tilelayout,  0, 16 },
568 	{ -1 } /* end of array */
569 };
570 
571 /* handler called by the 3812/2151 emulator when the internal timers cause an IRQ */
irqhandler(int irq)572 static void irqhandler(int irq)
573 {
574 	cpu_set_irq_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE);
575 }
576 
577 /* SnowBros Sound */
578 
579 static struct YM3812interface ym3812_interface =
580 {
581 	1,			/* 1 chip */
582 	3000000,	/* 3 MHz - confirmed */
583 	{ 100 },	/* volume */
584 	{ irqhandler },
585 };
586 
587 /* SemiCom Sound */
588 
589 static struct YM2151interface ym2151_interface =
590 {
591 	1,
592 	4000000,	/* 4 MHz??? */
593 	{ YM3012_VOL(10,MIXER_PAN_LEFT,10,MIXER_PAN_RIGHT) },
594 	{ irqhandler }
595 };
596 
597 static struct OKIM6295interface okim6295_interface =
598 {
599 	1,			/* 1 chip */
600 	{ 7575 },		/* 7575Hz playback? */
601 	{ REGION_SOUND1 },
602 	{ 100 }
603 };
604 
605 
606 static MACHINE_DRIVER_START( snowbros )
607 
608 	/* basic machine hardware */
609 	MDRV_CPU_ADD_TAG("main", M68000, 8000000) /* 8 Mhz - confirmed */
MDRV_CPU_MEMORY(readmem,writemem)610 	MDRV_CPU_MEMORY(readmem,writemem)
611 	MDRV_CPU_VBLANK_INT(snowbros_interrupt,3)
612 
613 	MDRV_CPU_ADD_TAG("sound", Z80, 6000000) /* 6 MHz - confirmed */
614 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
615 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
616 	MDRV_CPU_PORTS(sound_readport,sound_writeport)
617 
618 	MDRV_FRAMES_PER_SECOND(57.5) /* ~57.5 - confirmed */
619 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
620 
621 	/* video hardware */
622 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
623 	MDRV_SCREEN_SIZE(32*8, 32*8)
624 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
625 	MDRV_GFXDECODE(gfxdecodeinfo)
626 	MDRV_PALETTE_LENGTH(256)
627 
628 	MDRV_VIDEO_UPDATE(snowbros)
629 
630 	/* sound hardware */
631 	MDRV_SOUND_ADD_TAG("3812", YM3812, ym3812_interface)
632 MACHINE_DRIVER_END
633 
634 
635 static MACHINE_DRIVER_START( wintbob )
636 	/* basic machine hardware */
637 	MDRV_IMPORT_FROM(snowbros)
638 	MDRV_CPU_REPLACE("main", M68000, 10000000) /* faster cpu on bootleg? otherwise the gfx break up */
639 
640 	/* video hardware */
641 	MDRV_GFXDECODE(gfxdecodeinfo_wb)
642 	MDRV_VIDEO_UPDATE(wintbob)
643 MACHINE_DRIVER_END
644 
645 
646 static MACHINE_DRIVER_START( hyperpac )
647 
648 	/* basic machine hardware */
649 	MDRV_IMPORT_FROM(snowbros)
650 	MDRV_CPU_REPLACE("main", M68000, 16000000) /* 16mhz or 12mhz ? */
651 	MDRV_CPU_MEMORY(hyperpac_readmem,hyperpac_writemem)
652 
653 	MDRV_CPU_REPLACE("sound", Z80, 4000000) /* 4.0 MHz ??? */
654 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
655 	MDRV_CPU_MEMORY(hyperpac_sound_readmem,hyperpac_sound_writemem)
656 
657 	MDRV_GFXDECODE(hyperpac_gfxdecodeinfo)
658 
659 	/* sound hardware */
660 	MDRV_SOUND_REPLACE("3812",YM2151, ym2151_interface)
661 	MDRV_SOUND_ADD(OKIM6295, okim6295_interface)
662 MACHINE_DRIVER_END
663 
664 static MACHINE_DRIVER_START( _4in1 )
665 	/* basic machine hardware */
666 	MDRV_IMPORT_FROM(hyperpac)
667 	MDRV_GFXDECODE(gfxdecodeinfo)
668 MACHINE_DRIVER_END
669 
670 /***************************************************************************
671 
672   Game driver(s)
673 
674 ***************************************************************************/
675 
676 ROM_START( snowbros )
677 	ROM_REGION( 0x40000, REGION_CPU1, 0 )	/* 6*64k for 68000 code */
678 	ROM_LOAD16_BYTE( "sn6.bin",  0x00000, 0x20000, CRC(4899ddcf) SHA1(47d750d3022a80e47ffabe47566bb2556cc8d477) )
679 	ROM_LOAD16_BYTE( "sn5.bin",  0x00001, 0x20000, CRC(ad310d3f) SHA1(f39295b38d99087dbb9c5b00bf9cb963337a50e2) )
680 
681 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for z80 sound code */
682 	ROM_LOAD( "sbros-4.29",   0x0000, 0x8000, CRC(e6eab4e4) SHA1(d08187d03b21192e188784cb840a37a7bdb5ad32) )
683 
684 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
685 	ROM_LOAD( "sbros-1.41",   0x00000, 0x80000, CRC(16f06b3a) SHA1(c64d3b2d32f0f0fcf1d8c5f02f8589d59ddfd428) )
686 	/* where were these from, a bootleg? */
687 /*	ROM_LOAD( "ch0",          0x00000, 0x20000, CRC(36d84dfe) SHA1(5d45a750220930bc409de30f19282bb143fbf94f) )*/
688 /*	ROM_LOAD( "ch1",          0x20000, 0x20000, CRC(76347256) SHA1(48ec03965905adaba5e50eb3e42a2813f7883bb4) )*/
689 /*	ROM_LOAD( "ch2",          0x40000, 0x20000, CRC(fdaa634c) SHA1(1271c74df7da7596caf67caae3c51b4c163a49f4) )*/
690 /*	ROM_LOAD( "ch3",          0x60000, 0x20000, CRC(34024aef) SHA1(003a9b9ee3aaab3d787894d3d4126d372b19d2a8) )*/
691 ROM_END
692 
693 ROM_START( snowbroa )
694 	ROM_REGION( 0x40000, REGION_CPU1, 0 )	/* 6*64k for 68000 code */
695 	ROM_LOAD16_BYTE( "sbros-3a.5",  0x00000, 0x20000, CRC(10cb37e1) SHA1(786be4640f8df2c81a32decc189ea7657ace00c6) )
696 	ROM_LOAD16_BYTE( "sbros-2a.6",  0x00001, 0x20000, CRC(ab91cc1e) SHA1(8cff61539dc7d35fcbf110d3e54fc1883e7b8509) )
697 
698 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for z80 sound code */
699 	ROM_LOAD( "sbros-4.29",   0x0000, 0x8000, CRC(e6eab4e4) SHA1(d08187d03b21192e188784cb840a37a7bdb5ad32) )
700 
701 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
702 	ROM_LOAD( "sbros-1.41",   0x00000, 0x80000, CRC(16f06b3a) SHA1(c64d3b2d32f0f0fcf1d8c5f02f8589d59ddfd428) )
703 ROM_END
704 
705 ROM_START( snowbrob )
706 	ROM_REGION( 0x40000, REGION_CPU1, 0 )	/* 6*64k for 68000 code */
707 	ROM_LOAD16_BYTE( "sbros3-a",     0x00000, 0x20000, CRC(301627d6) SHA1(0d1dc70091c87e9c27916d4232ff31b7381a64e1) )
708 	ROM_LOAD16_BYTE( "sbros2-a",     0x00001, 0x20000, CRC(f6689f41) SHA1(e4fd27b930a31479c0d99e0ddd23d5db34044666) )
709 
710 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for z80 sound code */
711 	ROM_LOAD( "sbros-4.29",   0x0000, 0x8000, CRC(e6eab4e4) SHA1(d08187d03b21192e188784cb840a37a7bdb5ad32) )
712 
713 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
714 	ROM_LOAD( "sbros-1.41",   0x00000, 0x80000, CRC(16f06b3a) SHA1(c64d3b2d32f0f0fcf1d8c5f02f8589d59ddfd428) )
715 ROM_END
716 
717 ROM_START( snowbroj )
718 	ROM_REGION( 0x40000, REGION_CPU1, 0 )	/* 6*64k for 68000 code */
719 	ROM_LOAD16_BYTE( "snowbros.3",   0x00000, 0x20000, CRC(3f504f9e) SHA1(700758b114c3fde6ea8f84222af0850dba13cd3b) )
720 	ROM_LOAD16_BYTE( "snowbros.2",   0x00001, 0x20000, CRC(854b02bc) SHA1(4ad1548eef94dcb95119cb4a7dcdefa037591b5b) )
721 
722 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for z80 sound code */
723 	ROM_LOAD( "sbros-4.29",   0x0000, 0x8000, CRC(e6eab4e4) SHA1(d08187d03b21192e188784cb840a37a7bdb5ad32) )
724 
725 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
726 	/* The gfx ROM (snowbros.1) was bad, I'm using the ones from the other sets. */
727 	ROM_LOAD( "sbros-1.41",   0x00000, 0x80000, CRC(16f06b3a) SHA1(c64d3b2d32f0f0fcf1d8c5f02f8589d59ddfd428) )
728 ROM_END
729 
730 ROM_START( wintbob )
731 	ROM_REGION( 0x40000, REGION_CPU1, 0 )	/* 6*64k for 68000 code */
732 	ROM_LOAD16_BYTE( "wb03.bin", 0x00000, 0x10000, CRC(df56e168) SHA1(20dbabdd97e6f3d4bf6500bf9e8476942cb48ae3) )
733 	ROM_LOAD16_BYTE( "wb01.bin", 0x00001, 0x10000, CRC(05722f17) SHA1(9356e2488ea35e0a2978689f2ca6dfa0d57fd2ed) )
734 	ROM_LOAD16_BYTE( "wb04.bin", 0x20000, 0x10000, CRC(53be758d) SHA1(56cf85ba23fe699031d73e8f367a1b8ac837d5f8) )
735 	ROM_LOAD16_BYTE( "wb02.bin", 0x20001, 0x10000, CRC(fc8e292e) SHA1(857cfeb0be121e64e6117120514ae1f2ffeae4d6) )
736 
737 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for z80 sound code */
738 	ROM_LOAD( "wb05.bin",     0x0000, 0x10000, CRC(53fe59df) SHA1(a99053e82b9fed76f744fa9f67078294641c6317) )
739 
740 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
741 	/* probably identical data to Snow Bros, in a different format */
742 	ROM_LOAD16_BYTE( "wb13.bin",     0x00000, 0x10000, CRC(426921de) SHA1(5107c58e7e08d71895baa67fe260b17ebd61389c) )
743 	ROM_LOAD16_BYTE( "wb06.bin",     0x00001, 0x10000, CRC(68204937) SHA1(fd2ef93df5fd8aa2d36072858dbcfce41157ef3e) )
744 	ROM_LOAD16_BYTE( "wb12.bin",     0x20000, 0x10000, CRC(ef4e04c7) SHA1(17158b61b3c158e0491db9abb2e1a8c20d981d37) )
745 	ROM_LOAD16_BYTE( "wb07.bin",     0x20001, 0x10000, CRC(53f40978) SHA1(058bbf3b7877f0cd320383e0386c5959e0d6589b) )
746 	ROM_LOAD16_BYTE( "wb11.bin",     0x40000, 0x10000, CRC(41cb4563) SHA1(94f1d12d299ac08fc8522139e1927f0cf739be75) )
747 	ROM_LOAD16_BYTE( "wb08.bin",     0x40001, 0x10000, CRC(9497b88c) SHA1(367c6106276f3816528341f11f3a97ae458d25cd) )
748 	ROM_LOAD16_BYTE( "wb10.bin",     0x60000, 0x10000, CRC(5fa22b1e) SHA1(1164003d873e9738a3ca133cce689c7120061e3c) )
749 	ROM_LOAD16_BYTE( "wb09.bin",     0x60001, 0x10000, CRC(9be718ca) SHA1(5c195e4f13efbdb229201d2408d018861bf389cc) )
750 ROM_END
751 
752 /* SemiCom Games */
753 
754 ROM_START( hyperpac )
755 	ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
756 	ROM_LOAD16_BYTE( "hyperpac.h12", 0x00001, 0x20000, CRC(2cf0531a) SHA1(c4321d728845035507352d0bcf4348d28b92e85e) )
757 	ROM_LOAD16_BYTE( "hyperpac.i12", 0x00000, 0x20000, CRC(9c7d85b8) SHA1(432d5fbe8bef875ce4a9aeb74a7b57dc79c709fd) )
758 
759 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 Code */
760 	ROM_LOAD( "hyperpac.u1", 0x00000, 0x10000 , CRC(03faf88e) SHA1(a8da883d4b765b809452bbffca37ff224edbe86d) )
761 
762 	ROM_REGION( 0x040000, REGION_SOUND1, 0 ) /* Samples */
763 	ROM_LOAD( "hyperpac.j15", 0x00000, 0x40000, CRC(fb9f468d) SHA1(52857b1a04c64ac853340ebb8e92d98eabea8bc1) )
764 
765 	ROM_REGION( 0x0c0000, REGION_GFX1, 0 ) /* Sprites */
766 	ROM_LOAD( "hyperpac.a4", 0x000000, 0x40000, CRC(bd8673da) SHA1(8466355894da4d2c9a54d03a833cc9b4ec0c67eb) )
767 	ROM_LOAD( "hyperpac.a5", 0x040000, 0x40000, CRC(5d90cd82) SHA1(56be68478a81bb4e1011990da83334929a0ac886) )
768 	ROM_LOAD( "hyperpac.a6", 0x080000, 0x40000, CRC(61d86e63) SHA1(974c634607993924fa098eff106b1b288bec1e26) )
769 ROM_END
770 
771 ROM_START( hyperpcb )
772 	ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
773 	ROM_LOAD16_BYTE( "hpacuh12.bin", 0x00001, 0x20000, CRC(633ab2c6) SHA1(534435fa602adebf651e1d42f7c96b01eb6634ef) )
774 	ROM_LOAD16_BYTE( "hpacui12.bin", 0x00000, 0x20000, CRC(23dc00d1) SHA1(8d4d00f450b94912adcbb24073f9b3b01eab0450) )
775 
776 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 Code */
777 	ROM_LOAD( "hyperpac.u1", 0x00000, 0x10000 , CRC(03faf88e) SHA1(a8da883d4b765b809452bbffca37ff224edbe86d) ) /* was missing from this set, using the one from the original*/
778 
779 	ROM_REGION( 0x040000, REGION_SOUND1, 0 ) /* Samples */
780 	ROM_LOAD( "hyperpac.j15", 0x00000, 0x40000, CRC(fb9f468d) SHA1(52857b1a04c64ac853340ebb8e92d98eabea8bc1) )
781 
782 	ROM_REGION( 0x0c0000, REGION_GFX1, 0 ) /* Sprites */
783 	ROM_LOAD( "hyperpac.a4", 0x000000, 0x40000, CRC(bd8673da) SHA1(8466355894da4d2c9a54d03a833cc9b4ec0c67eb) )
784 	ROM_LOAD( "hyperpac.a5", 0x040000, 0x40000, CRC(5d90cd82) SHA1(56be68478a81bb4e1011990da83334929a0ac886) )
785 	ROM_LOAD( "hyperpac.a6", 0x080000, 0x40000, CRC(61d86e63) SHA1(974c634607993924fa098eff106b1b288bec1e26) )
786 ROM_END
787 
788 ROM_START( moremorp )
789 	ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
790 	ROM_LOAD16_BYTE( "mmp_u52.bin",  0x00001, 0x40000, CRC(66baf9b2) SHA1(f1d383a94ef4313cb02c59ace17b9562eddcfb3c) )
791 	ROM_LOAD16_BYTE( "mmp_u74.bin",  0x00000, 0x40000, CRC(7c6fede5) SHA1(41bc539a6efe9eb2304243701857b972d2170bcf) )
792 
793 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 Code */
794 	ROM_LOAD( "mmp_u35.bin", 0x00000, 0x10000 , CRC(4d098cad) SHA1(a79d417e7525a25dd6697da9f3d1de269e759d2e) )
795 
796 	ROM_REGION( 0x040000, REGION_SOUND1, 0 ) /* Samples */
797 	ROM_LOAD( "mmp_u14.bin", 0x00000, 0x40000, CRC(211a2566) SHA1(48138547822a8e76c101dd4189d581f80eee1e24) )
798 
799 	ROM_REGION( 0x200000, REGION_GFX1, 0 ) /* Sprites */
800 	ROM_LOAD( "mmp_u75.bin", 0x000000, 0x80000, CRC(af9e824e) SHA1(2b68813bf025a34b8958033108e4f8d39fd618cb) )
801 	ROM_LOAD( "mmp_u76.bin", 0x080000, 0x80000, CRC(c42af064) SHA1(f9d755e7cb52828d8594f7871932daf11443689f) )
802 	ROM_LOAD( "mmp_u77.bin", 0x100000, 0x80000, CRC(1d7396e1) SHA1(bde7e925051408dd2371b5da8235a6a4cae8cf6a) )
803 	ROM_LOAD( "mmp_u78.bin", 0x180000, 0x80000, CRC(5508d80b) SHA1(1b9a70a502b237fa11d1d55dce761e2def18873a) )
804 ROM_END
805 
806 ROM_START( 3in1semi )
807 	ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
808 	ROM_LOAD16_BYTE( "u52",  0x00001, 0x40000, CRC(b0e4a0f7) SHA1(e1f8b8ef020a85fcd7817814cf6c5d560e9e608d) )
809 	ROM_LOAD16_BYTE( "u74",  0x00000, 0x40000, CRC(266862c4) SHA1(2c5c513fee99bdb6e0ae3e0e644e516bdaddd629) )
810 
811 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 Code */
812 	ROM_LOAD( "u35", 0x00000, 0x10000 , CRC(e40481da) SHA1(1c1fabcb67693235eaa6ff59ae12a35854b5564a) )
813 
814 	ROM_REGION( 0x040000, REGION_SOUND1, 0 ) /* Samples */
815 	ROM_LOAD( "u14", 0x00000, 0x40000, CRC(c83c11be) SHA1(c05d96d61e5b8245232c85cbbcb7cc1e4e066492) )
816 
817 	ROM_REGION( 0x200000, REGION_GFX1, 0 ) /* Sprites */
818 	ROM_LOAD( "u75", 0x000000, 0x80000, CRC(b66a0db6) SHA1(a4e604eb3c0a5b16b4b0bb99219045bf2146287c) )
819 	ROM_LOAD( "u76", 0x080000, 0x80000, CRC(5f4b48ea) SHA1(e9dd1100d55b021b060990988c1e5271ce1ae35b) )
820 	ROM_LOAD( "u77", 0x100000, 0x80000, CRC(d44211e3) SHA1(53af19dec03e76912632450414cdbcbb31cc094c) )
821 	ROM_LOAD( "u78", 0x180000, 0x80000, CRC(af596afc) SHA1(875d7a51ff5c741cae4483d8da33df9cae8de52a) )
822 ROM_END
823 
824 ROM_START( 4in1boot ) /* snow bros, tetris, hyperman 1, pacman 2 */
825 	ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
826 	ROM_LOAD16_BYTE( "u52",  0x00001, 0x80000, CRC(71815878) SHA1(e3868f5687c1d8ec817671c50ade6c56ee83bfa1) )
827 	ROM_LOAD16_BYTE( "u74",  0x00000, 0x80000, CRC(e22d3fa2) SHA1(020ab92d8cbf37a9f8186a81934abb97088c16f9) )
828 
829 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 Code */
830 	ROM_LOAD( "u35", 0x00000, 0x10000 , CRC(c894ac80) SHA1(ee896675b5205ab2dbd0cbb13db16aa145391d06) )
831 
832 	ROM_REGION( 0x040000, REGION_SOUND1, 0 ) /* Samples */
833 	ROM_LOAD( "u14", 0x00000, 0x40000, CRC(94b09b0e) SHA1(414de3e36eff85126038e8ff74145b35076e0a43) )
834 
835 	ROM_REGION( 0x200000, REGION_GFX1, 0 ) /* Sprites */
836 	ROM_LOAD( "u78", 0x000000, 0x100000, BAD_DUMP CRC(5a06a928) SHA1(d35f239f2dddfe174547c1404aed6faf6b61e19f) ) /* half missing*/
837 ROM_END
838 
839 
840 ROM_START( cookbib2 )
841 	ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 68000 Code */
842 	ROM_LOAD16_BYTE( "cookbib2.02",  0x00001, 0x40000, CRC(b2909460) SHA1(2438638af870cfc105631d2b5e5a27a64ab5394d) )
843 	ROM_LOAD16_BYTE( "cookbib2.01",  0x00000, 0x40000, CRC(65aafde2) SHA1(01f9f261527c35182f0445d641d987aa86ad750f) )
844 
845 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 Code */
846 	ROM_LOAD( "cookbib2.07", 0x00000, 0x10000 , CRC(f59f1c9a) SHA1(2830261fd55249e015514fcb4cf8392e83b7fd0d) )
847 
848 	ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* Intel 87C52 MCU Code */
849 	ROM_LOAD( "87c52.mcu", 0x00000, 0x10000 , NO_DUMP ) /* can't be dumped */
850 
851 	ROM_REGION( 0x200, REGION_USER1, 0 ) /* Data from Shared RAM */
852 	/* this is not a real rom but instead the data extracted from
853 	   shared ram, the MCU puts it there */
854 	ROM_LOAD16_WORD_SWAP( "protdata.bin", 0x00000, 0x200 , CRC(ae6d8ed5) SHA1(410cdacb9b90ea345c0e4be85e60a138f45a51f1) )
855 
856 	ROM_REGION( 0x020000, REGION_SOUND1, 0 ) /* Samples */
857 	ROM_LOAD( "cookbib2.06", 0x00000, 0x20000, CRC(5e6f76b8) SHA1(725800143dfeaa6093ed5fcc5b9f15678ae9e547) )
858 
859 	ROM_REGION( 0x140000, REGION_GFX1, 0 ) /* Sprites */
860 	ROM_LOAD( "cookbib2.05", 0x000000, 0x80000, CRC(89fb38ce) SHA1(1b39dd9c2743916b8d8af590bd92fe4819c2454b) )
861 	ROM_LOAD( "cookbib2.04", 0x080000, 0x80000, CRC(f240111f) SHA1(b2c3b6e3d916fc68e1fd258b1279b6c39e1f0108) )
862 	ROM_LOAD( "cookbib2.03", 0x100000, 0x40000, CRC(e1604821) SHA1(bede6bdd8331128b9f2b229d718133470bf407c9) )
863 ROM_END
864 
865 static DRIVER_INIT( cookbib2 )
866 {
867 /*	data16_t *HCROM = (data16_t*)memory_region(REGION_CPU1);*/
868 	data16_t *PROTDATA = (data16_t*)memory_region(REGION_USER1);
869 	int i;
870 /*	hyperpac_ram[0xf000/2] = 0x46fc;*/
871 /*	hyperpac_ram[0xf002/2] = 0x2700;*/
872 
873 /* verified on real hardware, need to move this to a file really*/
874 
875 /*	static data16_t cookbib2_mcu68k[] =*/
876 /*	{*/
877 /*		*/ /* moved to protdata.bin*/
878 /*	};*/
879 
880 
881 
882 
883 /*for (i = 0;i < sizeof(cookbib2_mcu68k)/sizeof(cookbib2_mcu68k[0]);i++)*/
884 /*		hyperpac_ram[0xf000/2 + i] = cookbib2_mcu68k[i];*/
885 
886 	for (i = 0;i < 0x200/2;i++)
887 		hyperpac_ram[0xf000/2 + i] = PROTDATA[i];
888 
889 
890 	/* trojan is actually buggy and gfx flicker like crazy*/
891 	/* but we can pause the system after bootup with HALT line of 68k to get the table before*/
892 	/* it goes nuts*/
893 
894 	/*	hyperpac_ram[0xf07a/2] = 0x4e73;*/
895 	/*	hyperpac_ram[0xf000/2] = 0x4e73;*/
896 
897 #if 0
898 
899 	/* interrupt wait loop? */
900 	HCROM[0x014942/2] = 0x4eb9;
901 	HCROM[0x014944/2] = 0x0004;
902 	HCROM[0x014946/2] = 0x8000;
903 	HCROM[0x014948/2] = 0x4e71;
904 
905 	/* interrupt wait loop? */
906 	HCROM[0x014968/2] = 0x4eb9;
907 	HCROM[0x01496a/2] = 0x0004;
908 	HCROM[0x01496c/2] = 0x8100;
909 	HCROM[0x01496e/2] = 0x4e71;
910 
911 	/* interrupt wait loop? */
912 	HCROM[0x014560/2] = 0x4eb9;
913 	HCROM[0x014562/2] = 0x0004;
914 	HCROM[0x014564/2] = 0x8200;
915 	HCROM[0x014566/2] = 0x4e71;
916 
917 	/* new code for interrupt wait */
918 	HCROM[0x048000/2] = 0x4a79;
919 	HCROM[0x048002/2] = 0x0010;
920 	HCROM[0x048004/2] = 0x2462;
921 	HCROM[0x048006/2] = 0x66f8;
922 	HCROM[0x048008/2] = 0x4eb9;
923 	HCROM[0x04800a/2] = 0x0004;
924 	HCROM[0x04800c/2] = 0x8300;
925 	HCROM[0x04800e/2] = 0x4e75;
926 
927 	/* new code for interrupt wait */
928 	HCROM[0x048100/2] = 0x4a79;
929 	HCROM[0x048102/2] = 0x0010;
930 	HCROM[0x048104/2] = 0x2460;
931 	HCROM[0x048106/2] = 0x66f8;
932 	HCROM[0x048108/2] = 0x4eb9;
933 	HCROM[0x04810a/2] = 0x0004;
934 	HCROM[0x04810c/2] = 0x8300;
935 	HCROM[0x04810e/2] = 0x4e75;
936 
937 	/* new code for interrupt wait */
938 	HCROM[0x048200/2] = 0x4a79;
939 	HCROM[0x048202/2] = 0x0010;
940 	HCROM[0x048204/2] = 0x2490;
941 	HCROM[0x048206/2] = 0x66f8;
942 	HCROM[0x048208/2] = 0x4eb9;
943 	HCROM[0x04820a/2] = 0x0004;
944 	HCROM[0x04820c/2] = 0x8300;
945 	HCROM[0x04820e/2] = 0x4e75;
946 
947 
948 
949 	/* put registers on stack */
950 	HCROM[0x048300/2] = 0x48e7;
951 	HCROM[0x048302/2] = 0xfffe;
952 
953 	/* wipe sprite ram (fill with 0x0002) */
954 
955 	/* put the address we want to write TO in A2 */
956 	HCROM[0x048304/2] = 0x45f9;
957 	HCROM[0x048306/2] = 0x0070;
958 	HCROM[0x048308/2] = 0x0000;
959 
960 	/* put the number of words we want to clear into D0 */
961 	HCROM[0x04830a/2] = 0x203c;
962 	HCROM[0x04830c/2] = 0x0000;
963 	HCROM[0x04830e/2] = 0x1000;
964 
965 	/* write 0x0002 to A2 */
966 	HCROM[0x048310/2] = 0x34bc;
967 	HCROM[0x048312/2] = 0x0002;
968 
969 
970 	/* add 1 to write address a2 */
971 	HCROM[0x048314/2] = 0xd5fc;
972 	HCROM[0x048316/2] = 0x0000;
973 	HCROM[0x048318/2] = 0x0002;
974 
975 	/* decrease counter d0 */
976 	HCROM[0x04831a/2] = 0x5380;
977 
978 	/* compare d0 to 0 */
979 	HCROM[0x04831c/2] = 0x0c80;
980 	HCROM[0x04831e/2] = 0x0000;
981 	HCROM[0x048320/2] = 0x0000;
982 
983 	/* if its not 0 then branch back */
984 	HCROM[0x048322/2] = 0x66ec;
985 
986 	/* ram has been wiped */
987 
988 	/* put the address we want to read protection data  in A2 */
989 	HCROM[0x048324/2] = 0x45f9;
990 	HCROM[0x048326/2] = 0x0010;
991 /*	HCROM[0x048328/2] = 0xf000;*/
992 /*	HCROM[0x048328/2] = 0xf000+0xb4;*/
993 	HCROM[0x048328/2] = 0xf000+0xb4+0xb4;
994 
995 	/* put the address of spriteram  in A0 */
996 	HCROM[0x04832a/2] = 0x41f9;
997 	HCROM[0x04832c/2] = 0x0070;
998 	HCROM[0x04832e/2] = 0x0000;
999 
1000 	/* put the number of rows into D3 */
1001 	HCROM[0x048330/2] = 0x263c;
1002 	HCROM[0x048332/2] = 0x0000;
1003 	HCROM[0x048334/2] = 0x0012;
1004 
1005 	/* put the y co-ordinate of rows into D6 */
1006 	HCROM[0x048336/2] = 0x2c3c;
1007 	HCROM[0x048338/2] = 0x0000;
1008 	HCROM[0x04833a/2] = 0x0014;
1009 
1010 	/* put the number of bytes per row into D2 */
1011 	HCROM[0x04833c/2] = 0x243c;
1012 	HCROM[0x04833e/2] = 0x0000;
1013 	HCROM[0x048340/2] = 0x000a;
1014 
1015 	/* put the x co-ordinate of rows into D5 */
1016 	HCROM[0x048342/2] = 0x2a3c;
1017 	HCROM[0x048344/2] = 0x0000;
1018 	HCROM[0x048346/2] = 0x0010;
1019 
1020 	/* move content of a2 to d4 (byte)*/
1021 	HCROM[0x048348/2] = 0x1812;
1022 
1023 	HCROM[0x04834a/2] = 0xe84c; /* shift d4 right by 4*/
1024 
1025 	HCROM[0x04834c/2] = 0x0244; /* mask with 0x000f*/
1026 	HCROM[0x04834e/2] = 0x000f; /**/
1027 
1028 	/* jump to character draw to draw first bit */
1029 	HCROM[0x048350/2] = 0x4eb9;
1030 	HCROM[0x048352/2] = 0x0004;
1031 	HCROM[0x048354/2] = 0x8600;
1032 
1033 	/* increase x-cord*/
1034 	HCROM[0x048356/2] = 0x0645;
1035 	HCROM[0x048358/2] = 0x000a;
1036 
1037 
1038 	/* add 0x10 to draw address a0 */
1039 	HCROM[0x04835a/2] = 0xd1fc;
1040 	HCROM[0x04835c/2] = 0x0000;
1041 	HCROM[0x04835e/2] = 0x0010;
1042 
1043 
1044 	/* move content of a2 to d4 (byte)*/
1045 	HCROM[0x048360/2] = 0x1812;
1046 
1047 	HCROM[0x048362/2] = 0x0244; /* mask with 0x000f*/
1048 	HCROM[0x048364/2] = 0x000f; /**/
1049 
1050 	/* jump to character draw to draw second bit */
1051 	HCROM[0x048366/2] = 0x4eb9;
1052 	HCROM[0x048368/2] = 0x0004;
1053 	HCROM[0x04836a/2] = 0x8600;
1054 
1055 	/* increase x-cord*/
1056 	HCROM[0x04836c/2] = 0x0645;
1057 	HCROM[0x04836e/2] = 0x000c;
1058 
1059 	/* add 0x10 to draw address a0 */
1060 	HCROM[0x048370/2] = 0xd1fc;
1061 	HCROM[0x048372/2] = 0x0000;
1062 	HCROM[0x048374/2] = 0x0010;
1063 
1064 /* newcode*/
1065 	/* add 1 to read address a2 */
1066 	HCROM[0x048376/2] = 0xd5fc;
1067 	HCROM[0x048378/2] = 0x0000;
1068 	HCROM[0x04837a/2] = 0x0001;
1069 
1070 	/* decrease counter d2 (row count)*/
1071 	HCROM[0x04837c/2] = 0x5382;
1072 
1073 	/* compare d2 to 0 */
1074 	HCROM[0x04837e/2] = 0x0c82;
1075 	HCROM[0x048380/2] = 0x0000;
1076 	HCROM[0x048382/2] = 0x0000;
1077 
1078 	/* if its not 0 then branch back */
1079 	HCROM[0x048384/2] = 0x66c2;
1080 
1081 	/* increase y-cord d6*/
1082 	HCROM[0x048386/2] = 0x0646;
1083 	HCROM[0x048388/2] = 0x000c;
1084 
1085 	/* decrease counter d3 */
1086 	HCROM[0x04838a/2] = 0x5383;
1087 
1088 	/* compare d3 to 0 */
1089 	HCROM[0x04838c/2] = 0x0c83;
1090 	HCROM[0x04838e/2] = 0x0000;
1091 	HCROM[0x048390/2] = 0x0000;
1092 
1093 	/* if its not 0 then branch back */
1094 	HCROM[0x048392/2] = 0x66a8;
1095 
1096 	/* get back registers from stack*/
1097 	HCROM[0x048394/2] = 0x4cdf;
1098 	HCROM[0x048396/2] = 0x7fff;
1099 
1100 	/* rts */
1101 	HCROM[0x048398/2] = 0x4e75;
1102 
1103 	/* Draw a character! */
1104 	/* D6 = y-coordinate
1105 	   D5 = x-coordinate
1106 	   D4 = value to draw
1107 
1108 	   A0 = spriteram base */
1109 
1110 	/* 0002 0002 0002 0010 00xx 00yy 00nn 000n*/
1111 
1112 	/* 357c 0020 000c*/
1113 	/* 337c = a1*/
1114 	/* move.w #$20, (#$c, A2)*/
1115 
1116 	HCROM[0x048600/2] = 0x317c;
1117 	HCROM[0x048602/2] = 0x0010;
1118 	HCROM[0x048604/2] = 0x0006;
1119 
1120 	HCROM[0x048606/2] = 0x3145;
1121 	HCROM[0x048608/2] = 0x0008;
1122 
1123 	HCROM[0x04860a/2] = 0x3146;
1124 	HCROM[0x04860c/2] = 0x000a;
1125 
1126 /* get true value */
1127 
1128 	/* put lookuptable address in  A3 */
1129 	HCROM[0x04860e/2] = 0x47f9;
1130 	HCROM[0x048610/2] = 0x0004;
1131 	HCROM[0x048612/2] = 0x8800;
1132 
1133 	HCROM[0x048614/2] = 0x3004; /* d4 -> d0*/
1134 	HCROM[0x048616/2] = 0xe348;
1135 
1136 	HCROM[0x048618/2] = 0x3173;
1137 	HCROM[0x04861a/2] = 0x0000;
1138 	HCROM[0x04861c/2] = 0x000c;
1139 
1140 /* not value */
1141 
1142 	HCROM[0x04861e/2] = 0x317c;
1143 	HCROM[0x048620/2] = 0x0000;
1144 	HCROM[0x048622/2] = 0x000e;
1145 
1146 	/* rts */
1147 	HCROM[0x048624/2] = 0x4e75;
1148 
1149 
1150 	/* table used for lookup by the draw routine to get real tile numbers */
1151 
1152 	HCROM[0x048800/2] = 0x0010;
1153 	HCROM[0x048802/2] = 0x0011;
1154 	HCROM[0x048804/2] = 0x0012;
1155 	HCROM[0x048806/2] = 0x0013;
1156 	HCROM[0x048808/2] = 0x0014;
1157 	HCROM[0x04880a/2] = 0x0015;
1158 	HCROM[0x04880c/2] = 0x0016;
1159 	HCROM[0x04880e/2] = 0x0017;
1160 	HCROM[0x048810/2] = 0x0018;
1161 	HCROM[0x048812/2] = 0x0019;
1162 	HCROM[0x048814/2] = 0x0021;
1163 	HCROM[0x048816/2] = 0x0022;
1164 	HCROM[0x048818/2] = 0x0023;
1165 	HCROM[0x04881a/2] = 0x0024;
1166 	HCROM[0x04881c/2] = 0x0025;
1167 	HCROM[0x04881e/2] = 0x0026;
1168 
1169 
1170 
1171 /*
1172 10 0
1173 11 1
1174 12 2
1175 13 3
1176 14 4
1177 15 5
1178 16 6
1179 17 7
1180 18 8
1181 19 9
1182 21 a
1183 22 b
1184 23 c
1185 24 d
1186 25 e
1187 26 f
1188 */
1189 
1190 
1191 
1192 
1193 
1194 	{
1195 		FILE *fp;
1196 
1197 		fp=fopen("cookie", "w+b");
1198 		if (fp)
1199 		{
1200 			fwrite(HCROM, 0x80000, 1, fp);
1201 			fclose(fp);
1202 		}
1203 	}
1204 #endif
1205 }
1206 
1207 
DRIVER_INIT(hyperpac)1208 static DRIVER_INIT( hyperpac )
1209 {
1210 	/* simulate RAM initialization done by the protection MCU */
1211 	/* not verified on real hardware */
1212 	hyperpac_ram[0xe000/2] = 0x4ef9;
1213 	hyperpac_ram[0xe002/2] = 0x0000;
1214 	hyperpac_ram[0xe004/2] = 0x062c;
1215 
1216 	hyperpac_ram[0xe080/2] = 0xfedc;
1217 	hyperpac_ram[0xe082/2] = 0xba98;
1218 	hyperpac_ram[0xe084/2] = 0x7654;
1219 	hyperpac_ram[0xe086/2] = 0x3210;
1220 }
1221 
READ16_HANDLER(_4in1_02_read)1222 READ16_HANDLER ( _4in1_02_read )
1223 {
1224 	return 0x0202;
1225 }
1226 
1227 static DRIVER_INIT(4in1boot)
1228 {
1229 	unsigned char *buffer;
1230 	data8_t *src = memory_region(REGION_CPU1);
1231 	int len = memory_region_length(REGION_CPU1);
1232 
1233 	/* strange order */
1234 	if ((buffer = malloc(len)))
1235 	{
1236 		int i;
1237 		for (i = 0;i < len; i++)
1238 			if (i&1) buffer[i] = BITSWAP8(src[i],6,7,5,4,3,2,1,0);
1239 			else buffer[i] = src[i];
1240 
1241 		memcpy(src,buffer,len);
1242 		free(buffer);
1243 	}
1244 
1245 	src = memory_region(REGION_CPU2);
1246 	len = memory_region_length(REGION_CPU2);
1247 
1248 	/* strange order */
1249 	if ((buffer = malloc(len)))
1250 	{
1251 		int i;
1252 		for (i = 0;i < len; i++)
1253 			buffer[i] = src[i^0x4000];
1254 		memcpy(src,buffer,len);
1255 		free(buffer);
1256 	}
1257 
1258 	install_mem_read16_handler (0, 0x200000, 0x200001, _4in1_02_read );
1259 
1260 
1261 }
1262 
1263 GAME( 1990, snowbros, 0,        snowbros, snowbros, 0, ROT0, "Toaplan", "Snow Bros. - Nick & Tom (set 1)" )
1264 GAME( 1990, snowbroa, snowbros, snowbros, snowbros, 0, ROT0, "Toaplan", "Snow Bros. - Nick & Tom (set 2)" )
1265 GAME( 1990, snowbrob, snowbros, snowbros, snowbros, 0, ROT0, "Toaplan", "Snow Bros. - Nick & Tom (set 3)" )
1266 GAME( 1990, snowbroj, snowbros, snowbros, snowbroj, 0, ROT0, "Toaplan", "Snow Bros. - Nick & Tom (Japan)" )
1267 GAME( 1990, wintbob,  snowbros, wintbob,  snowbros, 0, ROT0, "bootleg", "The Winter Bobble" )
1268 /* SemiCom Games */
1269 GAME( 1995, hyperpac, 0,        hyperpac, hyperpac, hyperpac, ROT0, "SemiCom", "Hyper Pacman" )
1270 GAME( 1995, hyperpcb, hyperpac, hyperpac, hyperpac, 0,        ROT0, "bootleg", "Hyper Pacman (bootleg)" )
1271 GAME(1996, cookbib2, 0,        hyperpac, cookbib2, cookbib2, ROT0, "SemiCom", "Cookie and Bibi 2" ) /* sound cuts out in later levels? (investigate)*/
1272 /* bad dump */
1273 GAME(199?, 4in1boot, 0,        _4in1,    snowbros, 4in1boot, ROT0, "bootleg", "4-in-1 bootleg" ) /* gfx rom is half the size it should be, pacman 2 and snowbros are playable tho*/
1274 /* the following don't work, they either point the interrupts at an area of ram probably shared by
1275    some kind of mcu which puts 68k code there, or jump to the area in the interrupts */
1276 GAMEX(199?, moremorp, 0,        hyperpac, hyperpac, 0,        ROT0, "SemiCom", "More More +", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
1277 GAMEX(1997, 3in1semi, 0,        hyperpac, hyperpac, 0,        ROT0, "SemiCom", "3-in-1 (SemiCom)", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING )
1278