1 /********************************************************************
2 
3 			  Bionic Commando
4 
5 
6 
7 ToDo:
8 - finish video driver
9 	Some attributes are unknown. I don't remember the original game but
10 	seems there are some problems:
11 	- misplaced sprites ? ( see beginning of level 1 or 2 for example )
12 	- sprite / sprite priority ? ( see level 2 the reflectors )
13 	- sprite / background priority ? ( see level 1: birds walk through
14 		branches of different trees )
15 	- see the beginning of level 3: is the background screwed ?
16 
17 - get rid of input port hack
18 
19 	Controls appear to be mapped at 0xFE4000, alongside dip switches, but there
20 	is something strange going on that I can't (yet) figure out.
21 	Player controls and coin inputs are supposed to magically appear at
22 	0xFFFFFB (coin/start)
23 	0xFFFFFD (player 2)
24 	0xFFFFFF (player 1)
25 	This is probably done by an MPU on the board (whose ROM is not
26 	available).
27 
28 	The MPU also takes care of the commands for the sound CPU, which are stored
29 	at FFFFF9.
30 
31 	IRQ4 seems to be control related.
32 	On each interrupt, it reads 0xFE4000 (coin/start), shift the bits around
33 	and move the resulting byte into a dword RAM location. The dword RAM location
34 	is rotated by 8 bits each time this happens.
35 	This is probably done to be pedantic about coin insertions (might be protection
36 	related). In fact, currently coin insertions are not consistently recognized.
37 
38 ********************************************************************/
39 
40 #include "driver.h"
41 #include "vidhrdw/generic.h"
42 
43 
44 WRITE16_HANDLER( bionicc_fgvideoram_w );
45 WRITE16_HANDLER( bionicc_bgvideoram_w );
46 WRITE16_HANDLER( bionicc_txvideoram_w );
47 WRITE16_HANDLER( bionicc_paletteram_w );
48 WRITE16_HANDLER( bionicc_scroll_w );
49 WRITE16_HANDLER( bionicc_gfxctrl_w );
50 
51 extern data16_t *bionicc_bgvideoram;
52 extern data16_t *bionicc_fgvideoram;
53 extern data16_t *bionicc_txvideoram;
54 
55 VIDEO_START( bionicc );
56 VIDEO_UPDATE( bionicc );
57 VIDEO_EOF( bionicc );
58 
59 void bionicc_readinputs(void);
60 void bionicc_sound_cmd(int data);
61 
62 
63 
64 static data16_t bionicc_inp[3];
65 
WRITE16_HANDLER(hacked_controls_w)66 WRITE16_HANDLER( hacked_controls_w )
67 {
68 log_cb(RETRO_LOG_DEBUG, LOGPRE "%06x: hacked_controls_w %04x %02x\n",activecpu_get_pc(),offset,data);
69 	COMBINE_DATA(&bionicc_inp[offset]);
70 }
71 
READ16_HANDLER(hacked_controls_r)72 static READ16_HANDLER( hacked_controls_r )
73 {
74 log_cb(RETRO_LOG_DEBUG, LOGPRE "%06x: hacked_controls_r %04x %04x\n",activecpu_get_pc(),offset,bionicc_inp[offset]);
75 	return bionicc_inp[offset];
76 }
77 
WRITE16_HANDLER(bionicc_mpu_trigger_w)78 static WRITE16_HANDLER( bionicc_mpu_trigger_w )
79 {
80 	data = readinputport(0) >> 12;
81 	bionicc_inp[0] = data ^ 0x0f;
82 
83 	data = readinputport(3); /* player 2 controls */
84 	bionicc_inp[1] = data ^ 0xff;
85 
86 	data = readinputport(2); /* player 1 controls */
87 	bionicc_inp[2] = data ^ 0xff;
88 }
89 
90 
91 static data16_t soundcommand;
92 
WRITE16_HANDLER(hacked_soundcommand_w)93 WRITE16_HANDLER( hacked_soundcommand_w )
94 {
95 	COMBINE_DATA(&soundcommand);
96 	soundlatch_w(0,soundcommand & 0xff);
97 }
98 
READ16_HANDLER(hacked_soundcommand_r)99 static READ16_HANDLER( hacked_soundcommand_r )
100 {
101 	return soundcommand;
102 }
103 
104 
105 /********************************************************************
106 
107   INTERRUPT
108 
109   The game runs on 2 interrupts.
110 
111   IRQ 2 drives the game
112   IRQ 4 processes the input ports
113 
114   The game is very picky about timing. The following is the only
115   way I have found it to work.
116 
117 ********************************************************************/
118 
INTERRUPT_GEN(bionicc_interrupt)119 INTERRUPT_GEN( bionicc_interrupt )
120 {
121 	if (cpu_getiloops() == 0)
122 		cpu_set_irq_line(0, 2, HOLD_LINE);
123 	else
124 		cpu_set_irq_line(0, 4, HOLD_LINE);
125 }
126 
MEMORY_READ16_START(readmem)127 static MEMORY_READ16_START( readmem )
128 	{ 0x000000, 0x03ffff, MRA16_ROM },                /* 68000 ROM */
129 	{ 0xfe0000, 0xfe07ff, MRA16_RAM },                /* RAM? */
130 	{ 0xfe0800, 0xfe0cff, MRA16_RAM },                /* sprites */
131 	{ 0xfe0d00, 0xfe3fff, MRA16_RAM },                /* RAM? */
132 	{ 0xfe4000, 0xfe4001, input_port_0_word_r },
133 	{ 0xfe4002, 0xfe4003, input_port_1_word_r },
134 	{ 0xfec000, 0xfecfff, MRA16_RAM },
135 	{ 0xff0000, 0xff3fff, MRA16_RAM },
136 	{ 0xff4000, 0xff7fff, MRA16_RAM },
137 	{ 0xff8000, 0xff87ff, MRA16_RAM },
138 	{ 0xffc000, 0xfffff7, MRA16_RAM },                /* working RAM */
139 	{ 0xfffff8, 0xfffff9, hacked_soundcommand_r },      /* hack */
140 	{ 0xfffffa, 0xffffff, hacked_controls_r },      /* hack */
141 MEMORY_END
142 
143 static MEMORY_WRITE16_START( writemem )
144 	{ 0x000000, 0x03ffff, MWA16_ROM },
145 	{ 0xfe0000, 0xfe07ff, MWA16_RAM },	/* RAM? */
146 	{ 0xfe0800, 0xfe0cff, MWA16_RAM, &spriteram16, &spriteram_size },
147 	{ 0xfe0d00, 0xfe3fff, MWA16_RAM },              /* RAM? */
148 	{ 0xfe4000, 0xfe4001, bionicc_gfxctrl_w },	/* + coin counters */
149 	{ 0xfe8010, 0xfe8017, bionicc_scroll_w },
150 	{ 0xfe801a, 0xfe801b, bionicc_mpu_trigger_w },	/* ??? not sure, but looks like it */
151 	{ 0xfec000, 0xfecfff, bionicc_txvideoram_w, &bionicc_txvideoram },
152 	{ 0xff0000, 0xff3fff, bionicc_fgvideoram_w, &bionicc_fgvideoram },
153 	{ 0xff4000, 0xff7fff, bionicc_bgvideoram_w, &bionicc_bgvideoram },
154 	{ 0xff8000, 0xff87ff, bionicc_paletteram_w, &paletteram16 },
155 	{ 0xffc000, 0xfffff7, MWA16_RAM },	/* working RAM */
156 	{ 0xfffff8, 0xfffff9, hacked_soundcommand_w },      /* hack */
157 	{ 0xfffffa, 0xffffff, hacked_controls_w },	/* hack */
158 MEMORY_END
159 
160 
161 static MEMORY_READ_START( sound_readmem )
162 	{ 0x0000, 0x7fff, MRA_ROM },
163 	{ 0x8001, 0x8001, YM2151_status_port_0_r },
164 	{ 0xa000, 0xa000, soundlatch_r },
165 	{ 0xc000, 0xc7ff, MRA_RAM },
166 MEMORY_END
167 
168 static MEMORY_WRITE_START( sound_writemem )
169 	{ 0x0000, 0x7fff, MWA_ROM },
170 	{ 0x8000, 0x8000, YM2151_register_port_0_w },
171 	{ 0x8001, 0x8001, YM2151_data_port_0_w },
172 	{ 0xc000, 0xc7ff, MWA_RAM },
173 MEMORY_END
174 
175 
176 
177 INPUT_PORTS_START( bionicc )
178 	PORT_START
179 	PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNKNOWN )
180 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_START2 )
181 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_START1 )
182 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_COIN2 )
183 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_COIN1 )
184 
185 	PORT_START
186 	PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) )
187 	PORT_DIPSETTING(      0x0000, DEF_STR( 4C_1C ) )
188 	PORT_DIPSETTING(      0x0001, DEF_STR( 3C_1C ) )
189 	PORT_DIPSETTING(      0x0002, DEF_STR( 2C_1C ) )
190 	PORT_DIPSETTING(      0x0007, DEF_STR( 1C_1C ) )
191 	PORT_DIPSETTING(      0x0006, DEF_STR( 1C_2C ) )
192 	PORT_DIPSETTING(      0x0005, DEF_STR( 1C_3C ) )
193 	PORT_DIPSETTING(      0x0004, DEF_STR( 1C_4C ) )
194 	PORT_DIPSETTING(      0x0003, DEF_STR( 1C_6C ) )
195 	PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) )
196 	PORT_DIPSETTING(      0x0000, DEF_STR( 4C_1C ) )
197 	PORT_DIPSETTING(      0x0008, DEF_STR( 3C_1C ) )
198 	PORT_DIPSETTING(      0x0010, DEF_STR( 2C_1C ) )
199 	PORT_DIPSETTING(      0x0038, DEF_STR( 1C_1C ) )
200 	PORT_DIPSETTING(      0x0030, DEF_STR( 1C_2C ) )
201 	PORT_DIPSETTING(      0x0028, DEF_STR( 1C_3C ) )
202 	PORT_DIPSETTING(      0x0020, DEF_STR( 1C_4C ) )
203 	PORT_DIPSETTING(      0x0018, DEF_STR( 1C_6C ) )
204 	PORT_SERVICE( 0x0040, IP_ACTIVE_LOW )
205 	PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) )
206 	PORT_DIPSETTING(      0x0080, DEF_STR( Off ))
207 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
208 	PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) )
209 	PORT_DIPSETTING(      0x0300, "3" )
210 	PORT_DIPSETTING(      0x0200, "4" )
211 	PORT_DIPSETTING(      0x0100, "5" )
212 	PORT_DIPSETTING(      0x0000, "7" )
213 	PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Cabinet ) )
214 	PORT_DIPSETTING(      0x0400, DEF_STR( Upright ) )
215 	PORT_DIPSETTING(      0x0000, DEF_STR( Cocktail ) )
216 	PORT_DIPNAME( 0x1800, 0x1800, DEF_STR( Bonus_Life ) )
217 	PORT_DIPSETTING(      0x1800, "20K, 40K, every 60K")
218 	PORT_DIPSETTING(      0x1000, "30K, 50K, every 70K" )
219 	PORT_DIPSETTING(      0x0800, "20K and 60K only")
220 	PORT_DIPSETTING(      0x0000, "30K and 70K only" )
221 	PORT_DIPNAME( 0x6000, 0x4000, DEF_STR( Difficulty ) )
222 	PORT_DIPSETTING(      0x4000, "Easy" )
223 	PORT_DIPSETTING(      0x6000, "Medium")
224 	PORT_DIPSETTING(      0x2000, "Hard")
225 	PORT_DIPSETTING(      0x0000, "Hardest" )
226 	PORT_DIPNAME( 0x8000, 0x8000, "Freeze" )
227 	PORT_DIPSETTING(      0x8000, DEF_STR( Off ))
228 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
229 
230 	PORT_START
231 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 )
232 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
233 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
234 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
235 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
236 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
237 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
238 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
239 
240 	PORT_START
241 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
242 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
243 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
244 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
245 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
246 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
247 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
248 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
249 INPUT_PORTS_END
250 
251 
252 
253 /********************************************************************
254 
255   GRAPHICS
256 
257 ********************************************************************/
258 
259 
260 static struct GfxLayout spritelayout_bionicc=
261 {
262 	16,16,  /* 16*16 sprites */
263 	2048,   /* 2048 sprites */
264 	4,      /* 4 bits per pixel */
265 	{ 0x30000*8,0x20000*8,0x10000*8,0 },
266 	{
267 		0,1,2,3,4,5,6,7,
268 		(16*8)+0,(16*8)+1,(16*8)+2,(16*8)+3,
269 		(16*8)+4,(16*8)+5,(16*8)+6,(16*8)+7
270 	},
271 	{
272 		0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
273 		8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8,
274 	},
275 	256   /* every sprite takes 256 consecutive bytes */
276 };
277 
278 static struct GfxLayout vramlayout_bionicc=
279 {
280 	8,8,    /* 8*8 characters */
281 	1024,   /* 1024 character */
282 	2,      /* 2 bitplanes */
283 	{ 4,0 },
284 	{ 0,1,2,3,8,9,10,11 },
285 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
286 	128   /* every character takes 128 consecutive bytes */
287 };
288 
289 static struct GfxLayout scroll2layout_bionicc=
290 {
291 	8,8,    /* 8*8 tiles */
292 	2048,   /* 2048 tiles */
293 	4,      /* 4 bits per pixel */
294 	{ (0x08000*8)+4,0x08000*8,4,0 },
295 	{ 0,1,2,3, 8,9,10,11 },
296 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
297 	128   /* every tile takes 128 consecutive bytes */
298 };
299 
300 static struct GfxLayout scroll1layout_bionicc=
301 {
302 	16,16,  /* 16*16 tiles */
303 	2048,   /* 2048 tiles */
304 	4,      /* 4 bits per pixel */
305 	{ (0x020000*8)+4,0x020000*8,4,0 },
306 	{
307 		0,1,2,3, 8,9,10,11,
308 		(8*4*8)+0,(8*4*8)+1,(8*4*8)+2,(8*4*8)+3,
309 		(8*4*8)+8,(8*4*8)+9,(8*4*8)+10,(8*4*8)+11
310 	},
311 	{
312 		0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
313 		8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16
314 	},
315 	512   /* each tile takes 512 consecutive bytes */
316 };
317 
318 static struct GfxDecodeInfo gfxdecodeinfo_bionicc[] =
319 {
320 	{ REGION_GFX1, 0, &vramlayout_bionicc,    768, 64 },	/* colors 768-1023 */
321 	{ REGION_GFX2, 0, &scroll2layout_bionicc,   0,  4 },	/* colors   0-  63 */
322 	{ REGION_GFX3, 0, &scroll1layout_bionicc, 256,  4 },	/* colors 256- 319 */
323 	{ REGION_GFX4, 0, &spritelayout_bionicc,  512, 16 },	/* colors 512- 767 */
324 	{ -1 }
325 };
326 
327 
328 static struct YM2151interface ym2151_interface =
329 {
330 	1,                      /* 1 chip */
331 	3579545,                /* 3.579545 MHz ? */
332 	{ YM3012_VOL(60,MIXER_PAN_LEFT,60,MIXER_PAN_RIGHT) },
333 	{ 0 }
334 };
335 
336 
337 static MACHINE_DRIVER_START( bionicc )
338 
339 	/* basic machine hardware */
340 	MDRV_CPU_ADD(M68000, 12000000) /* ?? MHz ? */
341 	MDRV_CPU_MEMORY(readmem,writemem)
342 	MDRV_CPU_VBLANK_INT(bionicc_interrupt,8)
343 
344 	MDRV_CPU_ADD(Z80, 3579545)
345 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)  /* 4 MHz ??? TODO: find real FRQ */
346 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
347 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,4)	/* ??? */
348 
349 	MDRV_FRAMES_PER_SECOND(60)
350 	MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION)
351 
352 	/* video hardware */
353 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM)
354 	MDRV_SCREEN_SIZE(32*8, 32*8)
355 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
356 	MDRV_GFXDECODE(gfxdecodeinfo_bionicc)
357 	MDRV_PALETTE_LENGTH(1024)
358 
359 	MDRV_VIDEO_START(bionicc)
360 	MDRV_VIDEO_EOF(bionicc)
361 	MDRV_VIDEO_UPDATE(bionicc)
362 
363 	MDRV_SOUND_ADD(YM2151, ym2151_interface)
364 MACHINE_DRIVER_END
365 
366 
367 
368 ROM_START( bionicc )
369 	ROM_REGION( 0x40000, REGION_CPU1, 0 )      /* 68000 code */
370 	ROM_LOAD16_BYTE( "tsu_02b.rom",  0x00000, 0x10000, CRC(cf965a0a) SHA1(ab88742a3225a0b82ee2dfef6ed0058d3e11c38c) ) /* 68000 code */
371 	ROM_LOAD16_BYTE( "tsu_04b.rom",  0x00001, 0x10000, CRC(c9884bfb) SHA1(7d10cedff0a62847f8deb61a9611cc6661efb037) ) /* 68000 code */
372 	ROM_LOAD16_BYTE( "tsu_03b.rom",  0x20000, 0x10000, CRC(4e157ae2) SHA1(cc02931376d22a7fcfc320e6fd4129e03a461a49) ) /* 68000 code */
373 	ROM_LOAD16_BYTE( "tsu_05b.rom",  0x20001, 0x10000, CRC(e66ca0f9) SHA1(a503badf2fed38786d38c313d1dc315f3175d6de) ) /* 68000 code */
374 
375 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */
376 	ROM_LOAD( "tsu_01b.rom",  0x00000, 0x8000, CRC(a9a6cafa) SHA1(55e0a0e6ca11e8e73339d5b4604e130031211291) )
377 
378 	ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
379 	ROM_LOAD( "tsu_08.rom",   0x00000, 0x8000, CRC(9bf0b7a2) SHA1(1361335c3c2c8a9c6a7d99566048d8aac99e7c8f) )	/* VIDEORAM (text layer) tiles */
380 
381 	ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE )
382 	ROM_LOAD( "tsu_07.rom",   0x00000, 0x8000, CRC(9469efa4) SHA1(53c70361e8d9e54825f61b87a10df42438aaf5b0) )	/* SCROLL2 Layer Tiles */
383 	ROM_LOAD( "tsu_06.rom",   0x08000, 0x8000, CRC(40bf0eb4) SHA1(fcb186c31747e2c9872de01e34b3e713dc74df82) )
384 
385 	ROM_REGION( 0x40000, REGION_GFX3, ROMREGION_DISPOSE )
386 	ROM_LOAD( "ts_12.rom",    0x00000, 0x8000, CRC(e4b4619e) SHA1(3bec8399ffb28fd50ce6ae88d90b091eadf8bda1) )	/* SCROLL1 Layer Tiles */
387 	ROM_LOAD( "ts_11.rom",    0x08000, 0x8000, CRC(ab30237a) SHA1(ea6c07df992ba48f9eca7daa4ea775faa94358d2) )
388 	ROM_LOAD( "ts_17.rom",    0x10000, 0x8000, CRC(deb657e4) SHA1(b36b468f9bbb7a4937286230d3f6caa14c61d4dd) )
389 	ROM_LOAD( "ts_16.rom",    0x18000, 0x8000, CRC(d363b5f9) SHA1(1dd3991d99db2d6bcbdb12879ba50a01fef95004) )
390 	ROM_LOAD( "ts_13.rom",    0x20000, 0x8000, CRC(a8f5a004) SHA1(36ab0cb8ec9ce0519876f7461ccc5020c9c5b597) )
391 	ROM_LOAD( "ts_18.rom",    0x28000, 0x8000, CRC(3b36948c) SHA1(d85fcc0265ba1729c587b046cc5a7ba6f25363dd) )
392 	ROM_LOAD( "ts_23.rom",    0x30000, 0x8000, CRC(bbfbe58a) SHA1(9b1d5672b6f3c5c0952f8dcd0da71acc68a97a5e) )
393 	ROM_LOAD( "ts_24.rom",    0x38000, 0x8000, CRC(f156e564) SHA1(a6cad05bcc6d9ded6294f9b5aa856d05641aed02) )
394 
395 	ROM_REGION( 0x40000, REGION_GFX4, ROMREGION_DISPOSE )
396 	ROM_LOAD( "tsu_10.rom",   0x00000, 0x8000, CRC(f1180d02) SHA1(312626af48235a1f726ab596f296ef4739785ca0) )	/* Sprites */
397 	ROM_LOAD( "tsu_09.rom",   0x08000, 0x8000, CRC(6a049292) SHA1(525c862061f426d679b539b6926af4c9f14b47b5) )
398 	ROM_LOAD( "tsu_15.rom",   0x10000, 0x8000, CRC(ea912701) SHA1(106336c63a1c8a0b13236268bc533a8263285cad) )
399 	ROM_LOAD( "tsu_14.rom",   0x18000, 0x8000, CRC(46b2ad83) SHA1(21ebd5691a544323fdfcf330b9a37bbe0428e3e3) )
400 	ROM_LOAD( "tsu_20.rom",   0x20000, 0x8000, CRC(17857ad2) SHA1(9f45cea6e9ce82bfc9ee6896a30257d20fb38bca) )
401 	ROM_LOAD( "tsu_19.rom",   0x28000, 0x8000, CRC(b5c82722) SHA1(969f9159f7d59e4e4c9ef9ddbdc27cbfa531eabf) )
402 	ROM_LOAD( "tsu_22.rom",   0x30000, 0x8000, CRC(5ee1ae6a) SHA1(76ca53d847c940c4176d79ba49b0c10efd6342e8) )
403 	ROM_LOAD( "tsu_21.rom",   0x38000, 0x8000, CRC(98777006) SHA1(bcc2058b639e9b71d16af05f63df298bcce91fdc) )
404 
405 	ROM_REGION( 0x0100, REGION_PROMS, 0 )
406 	ROM_LOAD( "63s141.18f",   0x0000, 0x0100, CRC(b58d0023) SHA1(e8a4a2e2951bf73b3d9eed6957e9ee1e61c9c58a) )	/* priority (not used) */
407 ROM_END
408 
409 ROM_START( bionicc2 )
410 	ROM_REGION( 0x40000, REGION_CPU1, 0 )      /* 68000 code */
411 	ROM_LOAD16_BYTE( "02",      0x00000, 0x10000, CRC(f2528f08) SHA1(04c793837c86d83312fd44b46a6a94378c90113b) ) /* 68000 code */
412 	ROM_LOAD16_BYTE( "04",      0x00001, 0x10000, CRC(38b1c7e4) SHA1(14bf743726c214bd00177e7b410c272dd7ab3d3f) ) /* 68000 code */
413 	ROM_LOAD16_BYTE( "03",      0x20000, 0x10000, CRC(72c3b76f) SHA1(f7f71eae7617e3348b727775088b496e86d51e38) ) /* 68000 code */
414 	ROM_LOAD16_BYTE( "05",      0x20001, 0x10000, CRC(70621f83) SHA1(0a77c2827a5c50457d90ccc62e463508d83d2f20) ) /* 68000 code */
415 
416 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */
417 	ROM_LOAD( "tsu_01b.rom",  0x00000, 0x8000, CRC(a9a6cafa) SHA1(55e0a0e6ca11e8e73339d5b4604e130031211291) )
418 
419 	ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
420 	ROM_LOAD( "tsu_08.rom",   0x00000, 0x8000, CRC(9bf0b7a2) SHA1(1361335c3c2c8a9c6a7d99566048d8aac99e7c8f) )	/* VIDEORAM (text layer) tiles */
421 
422 	ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE )
423 	ROM_LOAD( "tsu_07.rom",   0x00000, 0x8000, CRC(9469efa4) SHA1(53c70361e8d9e54825f61b87a10df42438aaf5b0) )	/* SCROLL2 Layer Tiles */
424 	ROM_LOAD( "tsu_06.rom",   0x08000, 0x8000, CRC(40bf0eb4) SHA1(fcb186c31747e2c9872de01e34b3e713dc74df82) )
425 
426 	ROM_REGION( 0x40000, REGION_GFX3, ROMREGION_DISPOSE )
427 	ROM_LOAD( "ts_12.rom",    0x00000, 0x8000, CRC(e4b4619e) SHA1(3bec8399ffb28fd50ce6ae88d90b091eadf8bda1) )	/* SCROLL1 Layer Tiles */
428 	ROM_LOAD( "ts_11.rom",    0x08000, 0x8000, CRC(ab30237a) SHA1(ea6c07df992ba48f9eca7daa4ea775faa94358d2) )
429 	ROM_LOAD( "ts_17.rom",    0x10000, 0x8000, CRC(deb657e4) SHA1(b36b468f9bbb7a4937286230d3f6caa14c61d4dd) )
430 	ROM_LOAD( "ts_16.rom",    0x18000, 0x8000, CRC(d363b5f9) SHA1(1dd3991d99db2d6bcbdb12879ba50a01fef95004) )
431 	ROM_LOAD( "ts_13.rom",    0x20000, 0x8000, CRC(a8f5a004) SHA1(36ab0cb8ec9ce0519876f7461ccc5020c9c5b597) )
432 	ROM_LOAD( "ts_18.rom",    0x28000, 0x8000, CRC(3b36948c) SHA1(d85fcc0265ba1729c587b046cc5a7ba6f25363dd) )
433 	ROM_LOAD( "ts_23.rom",    0x30000, 0x8000, CRC(bbfbe58a) SHA1(9b1d5672b6f3c5c0952f8dcd0da71acc68a97a5e) )
434 	ROM_LOAD( "ts_24.rom",    0x38000, 0x8000, CRC(f156e564) SHA1(a6cad05bcc6d9ded6294f9b5aa856d05641aed02) )
435 
436 	ROM_REGION( 0x40000, REGION_GFX4, ROMREGION_DISPOSE )
437 	ROM_LOAD( "tsu_10.rom",   0x00000, 0x8000, CRC(f1180d02) SHA1(312626af48235a1f726ab596f296ef4739785ca0) )	/* Sprites */
438 	ROM_LOAD( "tsu_09.rom",   0x08000, 0x8000, CRC(6a049292) SHA1(525c862061f426d679b539b6926af4c9f14b47b5) )
439 	ROM_LOAD( "tsu_15.rom",   0x10000, 0x8000, CRC(ea912701) SHA1(106336c63a1c8a0b13236268bc533a8263285cad) )
440 	ROM_LOAD( "tsu_14.rom",   0x18000, 0x8000, CRC(46b2ad83) SHA1(21ebd5691a544323fdfcf330b9a37bbe0428e3e3) )
441 	ROM_LOAD( "tsu_20.rom",   0x20000, 0x8000, CRC(17857ad2) SHA1(9f45cea6e9ce82bfc9ee6896a30257d20fb38bca) )
442 	ROM_LOAD( "tsu_19.rom",   0x28000, 0x8000, CRC(b5c82722) SHA1(969f9159f7d59e4e4c9ef9ddbdc27cbfa531eabf) )
443 	ROM_LOAD( "tsu_22.rom",   0x30000, 0x8000, CRC(5ee1ae6a) SHA1(76ca53d847c940c4176d79ba49b0c10efd6342e8) )
444 	ROM_LOAD( "tsu_21.rom",   0x38000, 0x8000, CRC(98777006) SHA1(bcc2058b639e9b71d16af05f63df298bcce91fdc) )
445 
446 	ROM_REGION( 0x0100, REGION_PROMS, 0 )
447 	ROM_LOAD( "63s141.18f",   0x0000, 0x0100, CRC(b58d0023) SHA1(e8a4a2e2951bf73b3d9eed6957e9ee1e61c9c58a) )	/* priority (not used) */
448 ROM_END
449 
450 ROM_START( topsecrt )
451 	ROM_REGION( 0x40000, REGION_CPU1, 0 )      /* 68000 code */
452 	ROM_LOAD16_BYTE( "ts_02.rom",  0x00000, 0x10000, CRC(b2fe1ddb) SHA1(892f19124993add96edabdba3aafeecc6668c5d9) ) /* 68000 code */
453 	ROM_LOAD16_BYTE( "ts_04.rom",  0x00001, 0x10000, CRC(427a003d) SHA1(5a379fe2942e5565810939d5eb843003226222cc) ) /* 68000 code */
454 	ROM_LOAD16_BYTE( "ts_03.rom",  0x20000, 0x10000, CRC(27f04bb6) SHA1(41d17b84b34dc8b2e5dfa67794a8df3e898b740b) ) /* 68000 code */
455 	ROM_LOAD16_BYTE( "ts_05.rom",  0x20001, 0x10000, CRC(c01547b1) SHA1(563bf6be4f10f5e6eb5b562266accf168f62bf30) ) /* 68000 code */
456 
457 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */
458 	ROM_LOAD( "ts_01.rom",    0x00000, 0x8000, CRC(8ea07917) SHA1(e9ace70d89482fc3669860450a41aacacbee9083) )
459 
460 	ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE )
461 	ROM_LOAD( "ts_08.rom",    0x00000, 0x8000, CRC(96ad379e) SHA1(accd3a560b259c186bc28cdc004ed8de0b12f9d5) )	/* VIDEORAM (text layer) tiles */
462 
463 	ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE )
464 	ROM_LOAD( "ts_07.rom",    0x00000, 0x8000, CRC(25cdf8b2) SHA1(316f6acc46878682dabeab12722e6a64504d23bd) )	/* SCROLL2 Layer Tiles */
465 	ROM_LOAD( "ts_06.rom",    0x08000, 0x8000, CRC(314fb12d) SHA1(dab0519a49b64fe7a837b3c6383f6147e1ab6ffd) )
466 
467 	ROM_REGION( 0x40000, REGION_GFX3, ROMREGION_DISPOSE )
468 	ROM_LOAD( "ts_12.rom",    0x00000, 0x8000, CRC(e4b4619e) SHA1(3bec8399ffb28fd50ce6ae88d90b091eadf8bda1) )	/* SCROLL1 Layer Tiles */
469 	ROM_LOAD( "ts_11.rom",    0x08000, 0x8000, CRC(ab30237a) SHA1(ea6c07df992ba48f9eca7daa4ea775faa94358d2) )
470 	ROM_LOAD( "ts_17.rom",    0x10000, 0x8000, CRC(deb657e4) SHA1(b36b468f9bbb7a4937286230d3f6caa14c61d4dd) )
471 	ROM_LOAD( "ts_16.rom",    0x18000, 0x8000, CRC(d363b5f9) SHA1(1dd3991d99db2d6bcbdb12879ba50a01fef95004) )
472 	ROM_LOAD( "ts_13.rom",    0x20000, 0x8000, CRC(a8f5a004) SHA1(36ab0cb8ec9ce0519876f7461ccc5020c9c5b597) )
473 	ROM_LOAD( "ts_18.rom",    0x28000, 0x8000, CRC(3b36948c) SHA1(d85fcc0265ba1729c587b046cc5a7ba6f25363dd) )
474 	ROM_LOAD( "ts_23.rom",    0x30000, 0x8000, CRC(bbfbe58a) SHA1(9b1d5672b6f3c5c0952f8dcd0da71acc68a97a5e) )
475 	ROM_LOAD( "ts_24.rom",    0x38000, 0x8000, CRC(f156e564) SHA1(a6cad05bcc6d9ded6294f9b5aa856d05641aed02) )
476 
477 	ROM_REGION( 0x40000, REGION_GFX4, ROMREGION_DISPOSE )
478 	ROM_LOAD( "ts_10.rom",    0x00000, 0x8000, CRC(c3587d05) SHA1(ad0898a5d4cf110783ef092bf8e65b6ef31a8ae0) )	/* Sprites */
479 	ROM_LOAD( "ts_09.rom",    0x08000, 0x8000, CRC(6b63eef2) SHA1(5d1580db7f49c5994c2a08a36c2d05f3e246930d) )
480 	ROM_LOAD( "ts_15.rom",    0x10000, 0x8000, CRC(db8cebb0) SHA1(1cc9eac14851cde95fb2d69d6f5ffb08bc9c0d93) )
481 	ROM_LOAD( "ts_14.rom",    0x18000, 0x8000, CRC(e2e41abf) SHA1(d002d0d8fdbb9ec3e2eac218f6338f733953ca82) )
482 	ROM_LOAD( "ts_20.rom",    0x20000, 0x8000, CRC(bfd1a695) SHA1(bf93486b96bfa1a1d5015189043b07e6130e6df1) )
483 	ROM_LOAD( "ts_19.rom",    0x28000, 0x8000, CRC(928b669e) SHA1(98ea9d23a46b0700490fd2fa7ab4fb0988dd5ca6) )
484 	ROM_LOAD( "ts_22.rom",    0x30000, 0x8000, CRC(3fe05d9a) SHA1(32e28ef03fb82785019d1ae8b3859215b5368c2b) )
485 	ROM_LOAD( "ts_21.rom",    0x38000, 0x8000, CRC(27a9bb7c) SHA1(bb60332c0ecde4d7797960dec39c1079498175c3) )
486 
487 	ROM_REGION( 0x0100, REGION_PROMS, 0 )
488 	ROM_LOAD( "63s141.18f",   0x0000, 0x0100, CRC(b58d0023) SHA1(e8a4a2e2951bf73b3d9eed6957e9ee1e61c9c58a) )	/* priority (not used) */
489 ROM_END
490 
491 
492 
493 GAME( 1987, bionicc,  0,       bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (US set 1)" )
494 GAME( 1987, bionicc2, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (US set 2)" )
495 GAME( 1987, topsecrt, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Top Secret (Japan)" )
496