1 /***************************************************************************
2   GOINDOL
3 
4   Driver provided by Jarek Parchanski (jpdev@friko6.onet.pl)
5 
6 Notes:
7 - byte at 7f87 controls region:
8   0 = Japan
9   1 = USA
10   2 = World
11   Regardless of the setting of this byte, the startup notice in Korean is
12   always displayed.
13   After the title screen, depending on the byte you get "for use only in Japan",
14   "for use only in USA", or the Korean notice again! So 2 might actually mean
15   Korea instead of World... but that version surely got to Europe since Gerald
16   has three boards with this ROM.
17 
18 ***************************************************************************/
19 
20 #include "driver.h"
21 #include "vidhrdw/generic.h"
22 
23 VIDEO_START( goindol );
24 WRITE_HANDLER( goindol_fg_videoram_w );
25 WRITE_HANDLER( goindol_bg_videoram_w );
26 VIDEO_UPDATE( goindol );
27 
28 extern UINT8 *goindol_fg_scrollx;
29 extern UINT8 *goindol_fg_scrolly;
30 extern UINT8 *goindol_fg_videoram;
31 extern UINT8 *goindol_bg_videoram;
32 extern UINT8 *spriteram_1;
33 extern UINT8 *spriteram_2;
34 extern size_t goindol_fg_videoram_size;
35 extern size_t goindol_bg_videoram_size;
36 extern int goindol_char_bank;
37 
38 
WRITE_HANDLER(goindol_bankswitch_w)39 WRITE_HANDLER( goindol_bankswitch_w )
40 {
41 	int bankaddress;
42 	UINT8 *RAM = memory_region(REGION_CPU1);
43 
44 	bankaddress = 0x10000 + ((data & 3) * 0x4000);
45 	cpu_setbank(1,&RAM[bankaddress]);
46 
47 	if (goindol_char_bank != ((data & 0x10) >> 4))
48 	{
49 		goindol_char_bank = (data & 0x10) >> 4;
50 		tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
51 	}
52 
53 	flip_screen_set(data & 0x20);
54 }
55 
56 
57 
READ_HANDLER(prot_f422_r)58 static READ_HANDLER( prot_f422_r )
59 {
60 	static int toggle;
61 
62 	/* bit 7 = vblank? */
63 	toggle ^= 0x80;
64 
65 	return toggle;
66 }
67 
68 
69 static UINT8 *ram;
70 
WRITE_HANDLER(prot_fc44_w)71 static WRITE_HANDLER( prot_fc44_w )
72 {
73 log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: prot_fc44_w(%02x)\n",activecpu_get_pc(),data);
74 	ram[0x0419] = 0x5b;
75 	ram[0x041a] = 0x3f;
76 	ram[0x041b] = 0x6d;
77 }
78 
WRITE_HANDLER(prot_fd99_w)79 static WRITE_HANDLER( prot_fd99_w )
80 {
81 log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: prot_fd99_w(%02x)\n",activecpu_get_pc(),data);
82 	ram[0x0421] = 0x3f;
83 }
84 
WRITE_HANDLER(prot_fc66_w)85 static WRITE_HANDLER( prot_fc66_w )
86 {
87 log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: prot_fc66_w(%02x)\n",activecpu_get_pc(),data);
88 	ram[0x0423] = 0x06;
89 }
90 
WRITE_HANDLER(prot_fcb0_w)91 static WRITE_HANDLER( prot_fcb0_w )
92 {
93 log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: prot_fcb0_w(%02x)\n",activecpu_get_pc(),data);
94 	ram[0x0425] = 0x06;
95 }
96 
97 
98 
MEMORY_READ_START(readmem)99 static MEMORY_READ_START( readmem )
100 	{ 0x0000, 0x7fff, MRA_ROM },
101 	{ 0x8000, 0xbfff, MRA_BANK1 },
102 	{ 0xc000, 0xc7ff, MRA_RAM },
103 	{ 0xc800, 0xc800, MRA_NOP },	/* watchdog?*/
104 	{ 0xd000, 0xefff, MRA_RAM },
105 	{ 0xf000, 0xf000, input_port_3_r },
106 	{ 0xf422, 0xf422, prot_f422_r },
107 	{ 0xf800, 0xf800, input_port_4_r },
108 	{ 0xc834, 0xc834, input_port_1_r },
109 	{ 0xc820, 0xc820, input_port_2_r },
110 	{ 0xc830, 0xc830, input_port_0_r },
111 	{ 0xe000, 0xefff, MRA_RAM },
112 MEMORY_END
113 
114 static MEMORY_WRITE_START( writemem )
115 	{ 0x0000, 0xbfff, MWA_ROM },
116 	{ 0xc000, 0xc7ff, MWA_RAM, &ram },
117 	{ 0xc810, 0xc810, goindol_bankswitch_w },
118 	{ 0xc820, 0xd820, MWA_RAM, &goindol_fg_scrolly },
119 	{ 0xc830, 0xd830, MWA_RAM, &goindol_fg_scrollx },
120 	{ 0xc800, 0xc800, soundlatch_w },
121 	{ 0xd000, 0xd03f, MWA_RAM, &spriteram, &spriteram_size },
122 	{ 0xd040, 0xd7ff, MWA_RAM },
123 	{ 0xd800, 0xdfff, goindol_bg_videoram_w, &goindol_bg_videoram, &goindol_bg_videoram_size },
124 	{ 0xe000, 0xe03f, MWA_RAM, &spriteram_2 },
125 	{ 0xe040, 0xe7ff, MWA_RAM },
126 	{ 0xe800, 0xefff, goindol_fg_videoram_w, &goindol_fg_videoram, &goindol_fg_videoram_size },
127 	{ 0xfc44, 0xfc44, prot_fc44_w },
128 	{ 0xfc66, 0xfc66, prot_fc66_w },
129 	{ 0xfcb0, 0xfcb0, prot_fcb0_w },
130 	{ 0xfd99, 0xfd99, prot_fd99_w },
131 MEMORY_END
132 
133 static MEMORY_READ_START( sound_readmem )
134 	{ 0x0000, 0x7fff, MRA_ROM },
135 	{ 0xc000, 0xc7ff, MRA_RAM },
136 	{ 0xd800, 0xd800, soundlatch_r },
137 MEMORY_END
138 
139 static MEMORY_WRITE_START( sound_writemem )
140 	{ 0x0000, 0x7fff, MWA_ROM },
141 	{ 0xc000, 0xc7ff, MWA_RAM },
142 	{ 0xa000, 0xa000, YM2203_control_port_0_w },
143 	{ 0xa001, 0xa001, YM2203_write_port_0_w },
144 MEMORY_END
145 
146 
147 INPUT_PORTS_START( goindol )
148 	PORT_START	/* IN0 */
149 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
150 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
151 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
152 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
153 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
154 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
155 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
156 	PORT_BIT_IMPULSE( 0x80, IP_ACTIVE_LOW, IPT_COIN1, 1 )
157 
158 	PORT_START	/* IN1 */
159 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
160 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
161 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
162 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
163 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
164 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
165 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
166 	PORT_BIT_IMPULSE( 0x80, IP_ACTIVE_LOW, IPT_COIN2, 1 )
167 
168 	PORT_START      /* IN2 - spinner */
169 	PORT_ANALOG( 0xff, 0x00, IPT_DIAL , 40, 10, 0, 0)
170 
171 	PORT_START	/* DSW0 */
172 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
173 	PORT_DIPSETTING(    0x03, "2" )
174 	PORT_DIPSETTING(    0x02, "3" )
175 	PORT_DIPSETTING(    0x01, "4" )
176 	PORT_DIPSETTING(    0x00, "5" )
177 	PORT_DIPNAME( 0x1c, 0x0c, DEF_STR( Difficulty ) )
178 	PORT_DIPSETTING(    0x1c, "Easiest" )
179 	PORT_DIPSETTING(    0x18, "Very Very Easy" )
180 	PORT_DIPSETTING(    0x14, "Very Easy" )
181 	PORT_DIPSETTING(    0x10, "Easy" )
182 	PORT_DIPSETTING(    0x0c, "Normal" )
183 	PORT_DIPSETTING(    0x08, "Difficult" )
184 	PORT_DIPSETTING(    0x04, "Hard" )
185 	PORT_DIPSETTING(    0x00, "Very Hard" )
186 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) )
187 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
188 	PORT_DIPSETTING(    0x00, DEF_STR( On ))
189 	PORT_BITX(    0x40, 0x40, IPT_DIPSWITCH_NAME | IPF_CHEAT, "Invulnerability", IP_KEY_NONE, IP_JOY_NONE )
190 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
191 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
192 	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
193 
194 	PORT_START      /* DSW1 */
195 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Bonus_Life ) )
196 	PORT_DIPSETTING(    0x04, "30k and every 50k" )
197 	PORT_DIPSETTING(    0x05, "50k and every 100k" )
198 	PORT_DIPSETTING(    0x06, "50k and every 200k" )
199 	PORT_DIPSETTING(    0x07, "100k and every 200k" )
200 	PORT_DIPSETTING(    0x01, "10000 only" )
201 	PORT_DIPSETTING(    0x02, "30000 only" )
202 	PORT_DIPSETTING(    0x03, "50000 only" )
203 	PORT_DIPSETTING(    0x00, "None" )
204 	PORT_DIPNAME( 0x38, 0x00, DEF_STR( Coinage ) )
205 	PORT_DIPSETTING(    0x28, DEF_STR( 3C_1C ) )
206 	PORT_DIPSETTING(    0x20, DEF_STR( 2C_1C ) )
207 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
208 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
209 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_3C ) )
210 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_4C ) )
211 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_5C ) )
212 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_6C ) )
213 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) )
214 	PORT_DIPSETTING(    0x40, DEF_STR( Upright ) )
215 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
216 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )
217 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
218 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
219 INPUT_PORTS_END
220 
221 INPUT_PORTS_START( homo )
222 	PORT_START	/* IN0 */
223 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
224 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
225 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
226 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
227 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
228 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
229 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
230 	PORT_BIT_IMPULSE( 0x80, IP_ACTIVE_LOW, IPT_COIN1, 1 )
231 
232 	PORT_START	/* IN1 */
233 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
234 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
235 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
236 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
237 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
238 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
239 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
240 	PORT_BIT_IMPULSE( 0x80, IP_ACTIVE_LOW, IPT_COIN2, 1 )
241 
242 	PORT_START      /* IN2 - spinner */
243 	PORT_ANALOG( 0xff, 0x00, IPT_DIAL , 40, 10, 0, 0)
244 
245 	PORT_START	/* DSW0 */
246 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
247 	PORT_DIPSETTING(    0x03, "2" )
248 	PORT_DIPSETTING(    0x02, "3" )
249 	PORT_DIPSETTING(    0x01, "4" )
250 	PORT_DIPSETTING(    0x00, "5" )
251 	PORT_DIPNAME( 0x1c, 0x0c, DEF_STR( Difficulty ) )
252 	PORT_DIPSETTING(    0x1c, "Easiest" )
253 	PORT_DIPSETTING(    0x18, "Very Very Easy" )
254 	PORT_DIPSETTING(    0x14, "Very Easy" )
255 	PORT_DIPSETTING(    0x10, "Easy" )
256 	PORT_DIPSETTING(    0x0c, "Normal" )
257 	PORT_DIPSETTING(    0x08, "Difficult" )
258 	PORT_DIPSETTING(    0x04, "Hard" )
259 	PORT_DIPSETTING(    0x00, "Very Hard" )
260 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) )
261 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
262 	PORT_DIPSETTING(    0x00, DEF_STR( On ))
263 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
264 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
265 	PORT_DIPSETTING(    0x00, DEF_STR( On ))
266 	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
267 
268 	PORT_START      /* DSW1 */
269 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Bonus_Life ) )
270 	PORT_DIPSETTING(    0x04, "30k and every 50k" )
271 	PORT_DIPSETTING(    0x05, "50k and every 100k" )
272 	PORT_DIPSETTING(    0x06, "50k and every 200k" )
273 	PORT_DIPSETTING(    0x07, "100k and every 200k" )
274 	PORT_DIPSETTING(    0x01, "10000 only" )
275 	PORT_DIPSETTING(    0x02, "30000 only" )
276 	PORT_DIPSETTING(    0x03, "50000 only" )
277 	PORT_DIPSETTING(    0x00, "None" )
278 	PORT_DIPNAME( 0x38, 0x00, DEF_STR( Coinage ) )
279 	PORT_DIPSETTING(    0x28, DEF_STR( 3C_1C ) )
280 	PORT_DIPSETTING(    0x20, DEF_STR( 2C_1C ) )
281 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
282 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
283 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_3C ) )
284 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_4C ) )
285 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_5C ) )
286 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_6C ) )
287 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) )
288 	PORT_DIPSETTING(    0x40, DEF_STR( Upright ) )
289 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
290 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )
291 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
292 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
293 INPUT_PORTS_END
294 
295 
296 static struct GfxLayout charlayout =
297 {
298 	8,8,
299 	RGN_FRAC(1,3),
300 	3,
301 	{  RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) },
302 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
303 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
304 	8*8
305 };
306 
307 static struct GfxDecodeInfo gfxdecodeinfo[] =
308 {
309 	{ REGION_GFX1, 0, &charlayout, 0, 32 },
310 	{ REGION_GFX2, 0, &charlayout, 0, 32 },
311 	{ -1 } /* end of array */
312 };
313 
314 
315 static struct YM2203interface ym2203_interface =
316 {
317 	1,		/* 1 chip */
318 	2000000,	/* 2 MHz (?) */
319 	{ YM2203_VOL(25,25) },
320 	{ 0 },
321 	{ 0 },
322 	{ 0 },
323 	{ 0 }
324 };
325 
326 
327 
328 static MACHINE_DRIVER_START( goindol )
329 
330 	/* basic machine hardware */
331 	MDRV_CPU_ADD(Z80, 6000000)        /* 6 MHz (?) */
MDRV_CPU_MEMORY(readmem,writemem)332 	MDRV_CPU_MEMORY(readmem,writemem)
333 	MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
334 
335 	MDRV_CPU_ADD(Z80, 4000000)
336 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)	/* 4 MHz (?) */
337 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
338 	MDRV_CPU_VBLANK_INT(irq0_line_hold,4)
339 
340 	MDRV_FRAMES_PER_SECOND(60)
341 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
342 
343 	/* video hardware */
344 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
345 	MDRV_SCREEN_SIZE(32*8, 32*8)
346 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
347 	MDRV_GFXDECODE(gfxdecodeinfo)
348 	MDRV_PALETTE_LENGTH(256)
349 
350 	MDRV_PALETTE_INIT(RRRR_GGGG_BBBB)
351 	MDRV_VIDEO_START(goindol)
352 	MDRV_VIDEO_UPDATE(goindol)
353 
354 	/* sound hardware */
355 	MDRV_SOUND_ADD(YM2203, ym2203_interface)
356 MACHINE_DRIVER_END
357 
358 
359 
360 /***************************************************************************
361 
362   Game driver(s)
363 
364 ***************************************************************************/
365 
366 ROM_START( goindol )
367 	ROM_REGION( 0x20000, REGION_CPU1, 0 )     /* 2*64k for code */
368 	ROM_LOAD( "r1w", 0x00000, 0x8000, CRC(df77c502) SHA1(15d111e38d63a8a800fbf5f15c4fb72efb0e5cf4) ) /* Code 0000-7fff */
369 	ROM_LOAD( "r2",  0x10000, 0x8000, CRC(1ff6e3a2) SHA1(321d32b5236f8fadc55b00412081cd17fbdb42bf) ) /* Paged data */
370 	ROM_LOAD( "r3",  0x18000, 0x8000, CRC(e9eec24a) SHA1(d193dd23b8bee3a788114e6bb86902dddf6fdd99) ) /* Paged data */
371 
372 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for the audio CPU */
373 	ROM_LOAD( "r10", 0x00000, 0x8000, CRC(72e1add1) SHA1(e8bdaffbbbf8ed22eb161cb8d7945ff09420f68f) )
374 
375 	ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE )
376 	ROM_LOAD( "r4", 0x00000, 0x8000, CRC(1ab84225) SHA1(47494d03fb8d153335203155e61d90108db62961) ) /* Characters */
377 	ROM_LOAD( "r5", 0x08000, 0x8000, CRC(4997d469) SHA1(60c482b2408079bc8b2ffb86bc01927d5cad66ea) )
378 	ROM_LOAD( "r6", 0x10000, 0x8000, CRC(752904b0) SHA1(6ff44bd45b000bccae4fd67eefce936aacd971fc) )
379 
380 	ROM_REGION( 0x18000, REGION_GFX2, ROMREGION_DISPOSE )
381 	ROM_LOAD( "r7", 0x00000, 0x8000, CRC(362f2a27) SHA1(9b8232a9ce7d752a749897fb2231a005c734239d) )
382 	ROM_LOAD( "r8", 0x08000, 0x8000, CRC(9fc7946e) SHA1(89100fae14826ad4f6735770827cbfe97562038c) )
383 	ROM_LOAD( "r9", 0x10000, 0x8000, CRC(e6212fe4) SHA1(f42b5ddbdb6599ba4ff5e6ef7d86e55f58a671b6) )
384 
385 	ROM_REGION( 0x0300, REGION_PROMS, 0 )
386 	ROM_LOAD( "am27s21.pr1", 0x0000, 0x0100, CRC(361f0868) SHA1(aea681a2e168aca327a998db7b537c7b82dbc433) )	/* palette red bits   */
387 	ROM_LOAD( "am27s21.pr2", 0x0100, 0x0100, CRC(e355da4d) SHA1(40ebdbf6519b2817402ea716aae838c315da4fcb) )	/* palette green bits */
388 	ROM_LOAD( "am27s21.pr3", 0x0200, 0x0100, CRC(8534cfb5) SHA1(337b6d5e9ceb2116aea73a7a4ac7e70716460323) )	/* palette blue bits  */
389 ROM_END
390 
391 ROM_START( goindolu )
392 	ROM_REGION( 0x20000, REGION_CPU1, 0 )     /* 2*64k for code */
393 	ROM_LOAD( "r1", 0x00000, 0x8000, CRC(3111c61b) SHA1(6cc3834f946566646f06efe0b65c4704574ec6f1) ) /* Code 0000-7fff */
394 	ROM_LOAD( "r2", 0x10000, 0x8000, CRC(1ff6e3a2) SHA1(321d32b5236f8fadc55b00412081cd17fbdb42bf) ) /* Paged data */
395 	ROM_LOAD( "r3", 0x18000, 0x8000, CRC(e9eec24a) SHA1(d193dd23b8bee3a788114e6bb86902dddf6fdd99) ) /* Paged data */
396 
397 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for the audio CPU */
398 	ROM_LOAD( "r10", 0x00000, 0x8000, CRC(72e1add1) SHA1(e8bdaffbbbf8ed22eb161cb8d7945ff09420f68f) )
399 
400 	ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE )
401 	ROM_LOAD( "r4", 0x00000, 0x8000, CRC(1ab84225) SHA1(47494d03fb8d153335203155e61d90108db62961) ) /* Characters */
402 	ROM_LOAD( "r5", 0x08000, 0x8000, CRC(4997d469) SHA1(60c482b2408079bc8b2ffb86bc01927d5cad66ea) )
403 	ROM_LOAD( "r6", 0x10000, 0x8000, CRC(752904b0) SHA1(6ff44bd45b000bccae4fd67eefce936aacd971fc) )
404 
405 	ROM_REGION( 0x18000, REGION_GFX2, ROMREGION_DISPOSE )
406 	ROM_LOAD( "r7", 0x00000, 0x8000, CRC(362f2a27) SHA1(9b8232a9ce7d752a749897fb2231a005c734239d) )
407 	ROM_LOAD( "r8", 0x08000, 0x8000, CRC(9fc7946e) SHA1(89100fae14826ad4f6735770827cbfe97562038c) )
408 	ROM_LOAD( "r9", 0x10000, 0x8000, CRC(e6212fe4) SHA1(f42b5ddbdb6599ba4ff5e6ef7d86e55f58a671b6) )
409 
410 	ROM_REGION( 0x0300, REGION_PROMS, 0 )
411 	ROM_LOAD( "am27s21.pr1", 0x0000, 0x0100, CRC(361f0868) SHA1(aea681a2e168aca327a998db7b537c7b82dbc433) )	/* palette red bits   */
412 	ROM_LOAD( "am27s21.pr2", 0x0100, 0x0100, CRC(e355da4d) SHA1(40ebdbf6519b2817402ea716aae838c315da4fcb) )	/* palette green bits */
413 	ROM_LOAD( "am27s21.pr3", 0x0200, 0x0100, CRC(8534cfb5) SHA1(337b6d5e9ceb2116aea73a7a4ac7e70716460323) )	/* palette blue bits  */
414 ROM_END
415 
416 ROM_START( goindolj )
417 	ROM_REGION( 0x20000, REGION_CPU1, 0 )     /* 2*64k for code */
418 	ROM_LOAD( "r1j", 0x00000, 0x8000, CRC(dde33ad3) SHA1(23cdb3494f5eeaeae2657a0101d5827aa32c526d) ) /* Code 0000-7fff */
419 	ROM_LOAD( "r2",  0x10000, 0x8000, CRC(1ff6e3a2) SHA1(321d32b5236f8fadc55b00412081cd17fbdb42bf) ) /* Paged data */
420 	ROM_LOAD( "r3",  0x18000, 0x8000, CRC(e9eec24a) SHA1(d193dd23b8bee3a788114e6bb86902dddf6fdd99) ) /* Paged data */
421 
422 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for the audio CPU */
423 	ROM_LOAD( "r10", 0x00000, 0x8000, CRC(72e1add1) SHA1(e8bdaffbbbf8ed22eb161cb8d7945ff09420f68f) )
424 
425 	ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE )
426 	ROM_LOAD( "r4", 0x00000, 0x8000, CRC(1ab84225) SHA1(47494d03fb8d153335203155e61d90108db62961) ) /* Characters */
427 	ROM_LOAD( "r5", 0x08000, 0x8000, CRC(4997d469) SHA1(60c482b2408079bc8b2ffb86bc01927d5cad66ea) )
428 	ROM_LOAD( "r6", 0x10000, 0x8000, CRC(752904b0) SHA1(6ff44bd45b000bccae4fd67eefce936aacd971fc) )
429 
430 	ROM_REGION( 0x18000, REGION_GFX2, ROMREGION_DISPOSE )
431 	ROM_LOAD( "r7", 0x00000, 0x8000, CRC(362f2a27) SHA1(9b8232a9ce7d752a749897fb2231a005c734239d) )
432 	ROM_LOAD( "r8", 0x08000, 0x8000, CRC(9fc7946e) SHA1(89100fae14826ad4f6735770827cbfe97562038c) )
433 	ROM_LOAD( "r9", 0x10000, 0x8000, CRC(e6212fe4) SHA1(f42b5ddbdb6599ba4ff5e6ef7d86e55f58a671b6) )
434 
435 	ROM_REGION( 0x0300, REGION_PROMS, 0 )
436 	ROM_LOAD( "am27s21.pr1", 0x0000, 0x0100, CRC(361f0868) SHA1(aea681a2e168aca327a998db7b537c7b82dbc433) )	/* palette red bits   */
437 	ROM_LOAD( "am27s21.pr2", 0x0100, 0x0100, CRC(e355da4d) SHA1(40ebdbf6519b2817402ea716aae838c315da4fcb) )	/* palette green bits */
438 	ROM_LOAD( "am27s21.pr3", 0x0200, 0x0100, CRC(8534cfb5) SHA1(337b6d5e9ceb2116aea73a7a4ac7e70716460323) )	/* palette blue bits  */
439 ROM_END
440 
441 ROM_START( homo )
442 	ROM_REGION( 0x20000, REGION_CPU1, 0 )     /* 2*64k for code */
443 	ROM_LOAD( "homo.01", 0x00000, 0x8000, CRC(28c539ad) SHA1(64e950a4238a5656a9e0d0a699a6545da8c59548) ) /* Code 0000-7fff */
444 	ROM_LOAD( "r2", 0x10000, 0x8000, CRC(1ff6e3a2) SHA1(321d32b5236f8fadc55b00412081cd17fbdb42bf) ) /* Paged data */
445 	ROM_LOAD( "r3", 0x18000, 0x8000, CRC(e9eec24a) SHA1(d193dd23b8bee3a788114e6bb86902dddf6fdd99) ) /* Paged data */
446 
447 	ROM_REGION( 0x10000, REGION_CPU2, 0 )	/* 64k for the audio CPU */
448 	ROM_LOAD( "r10", 0x00000, 0x8000, CRC(72e1add1) SHA1(e8bdaffbbbf8ed22eb161cb8d7945ff09420f68f) )
449 
450 	ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE )
451 	ROM_LOAD( "r4", 0x00000, 0x8000, CRC(1ab84225) SHA1(47494d03fb8d153335203155e61d90108db62961) ) /* Characters */
452 	ROM_LOAD( "r5", 0x08000, 0x8000, CRC(4997d469) SHA1(60c482b2408079bc8b2ffb86bc01927d5cad66ea) )
453 	ROM_LOAD( "r6", 0x10000, 0x8000, CRC(752904b0) SHA1(6ff44bd45b000bccae4fd67eefce936aacd971fc) )
454 
455 	ROM_REGION( 0x18000, REGION_GFX2, ROMREGION_DISPOSE )
456 	ROM_LOAD( "r7", 0x00000, 0x8000, CRC(362f2a27) SHA1(9b8232a9ce7d752a749897fb2231a005c734239d) )
457 	ROM_LOAD( "r8", 0x08000, 0x8000, CRC(9fc7946e) SHA1(89100fae14826ad4f6735770827cbfe97562038c) )
458 	ROM_LOAD( "r9", 0x10000, 0x8000, CRC(e6212fe4) SHA1(f42b5ddbdb6599ba4ff5e6ef7d86e55f58a671b6) )
459 
460 	ROM_REGION( 0x0300, REGION_PROMS, 0 )
461 	ROM_LOAD( "am27s21.pr1", 0x0000, 0x0100, CRC(361f0868) SHA1(aea681a2e168aca327a998db7b537c7b82dbc433) )	/* palette red bits   */
462 	ROM_LOAD( "am27s21.pr2", 0x0100, 0x0100, CRC(e355da4d) SHA1(40ebdbf6519b2817402ea716aae838c315da4fcb) )	/* palette green bits */
463 	ROM_LOAD( "am27s21.pr3", 0x0200, 0x0100, CRC(8534cfb5) SHA1(337b6d5e9ceb2116aea73a7a4ac7e70716460323) )	/* palette blue bits  */
464 ROM_END
465 
466 
467 
468 DRIVER_INIT( goindol )
469 {
470 	UINT8 *rom = memory_region(REGION_CPU1);
471 
472 
473 	/* I hope that's all patches to avoid protection */
474 
475 	rom[0x18e9] = 0x18;	/* ROM 1 check*/
476 	rom[0x1964] = 0x00; /* ROM 9 error (MCU?)*/
477 	rom[0x1965] = 0x00; /**/
478 	rom[0x1966] = 0x00; /**/
479 /*	rom[0x17c7] = 0x00;	*/ /* c421 == 3f*/
480 /*	rom[0x17c8] = 0x00;	*/ /**/
481 /*	rom[0x16f0] = 0x18;	*/ /* c425 == 06*/
482 /*	rom[0x172c] = 0x18;	*/ /* c423 == 06*/
483 /*	rom[0x1779] = 0x00;	*/ /* c419 == 5b 3f 6d*/
484 /*	rom[0x177a] = 0x00;	*/ /**/
485 	rom[0x063f] = 0x18;	/*->fc55*/
486 	rom[0x0b30] = 0x00;	/* verify code at 0601-064b*/
487 	rom[0x1bdf] = 0x18;	/*->fc49*/
488 
489 	rom[0x04a7] = 0xc9;
490 	rom[0x0831] = 0xc9;
491 	rom[0x3365] = 0x00;	/* verify code at 081d-0876*/
492 	rom[0x0c13] = 0xc9;
493 	rom[0x134e] = 0xc9;
494 	rom[0x333d] = 0xc9;
495 }
496 
497 
498 
499 GAMEX(1987, goindol,  0,       goindol, goindol, goindol, ROT90, "Sun a Electronics", "Goindol (World)", GAME_UNEMULATED_PROTECTION )
500 GAMEX(1987, goindolu, goindol, goindol, goindol, goindol, ROT90, "Sun a Electronics", "Goindol (US)",    GAME_UNEMULATED_PROTECTION )
501 GAMEX(1987, goindolj, goindol, goindol, goindol, goindol, ROT90, "Sun a Electronics", "Goindol (Korea)", GAME_UNEMULATED_PROTECTION )
502 GAME( 1987, homo,     goindol, goindol, homo,    0,       ROT90, "bootleg", "Homo" )
503