1 /***************************************************************************
2
3 Block Out
4
5 driver by Nicola Salmoria
6
7 ***************************************************************************/
8
9 #include "driver.h"
10 #include "vidhrdw/generic.h"
11 #include "cpu/z80/z80.h"
12
13
14
15 extern data16_t *blockout_videoram;
16 extern data16_t *blockout_frontvideoram;
17 extern unsigned char *blockout_frontcolor;
18
19 WRITE16_HANDLER( blockout_videoram_w );
20 WRITE16_HANDLER( blockout_paletteram_w );
21 WRITE16_HANDLER( blockout_frontcolor_w );
22 VIDEO_START( blockout );
23 VIDEO_UPDATE( blockout );
24
25
INTERRUPT_GEN(blockout_interrupt)26 static INTERRUPT_GEN( blockout_interrupt )
27 {
28 /* interrupt 6 is vblank */
29 /* interrupt 5 reads coin inputs - might have to be triggered only */
30 /* when a coin is inserted */
31 cpu_set_irq_line(0, 6 - cpu_getiloops(), HOLD_LINE);
32 }
33
WRITE16_HANDLER(blockout_sound_command_w)34 static WRITE16_HANDLER( blockout_sound_command_w )
35 {
36 if (ACCESSING_LSB)
37 {
38 soundlatch_w(offset,data & 0xff);
39 cpu_set_irq_line(1, IRQ_LINE_NMI, PULSE_LINE);
40 }
41 }
42
43
MEMORY_READ16_START(readmem)44 static MEMORY_READ16_START( readmem )
45 { 0x000000, 0x03ffff, MRA16_ROM },
46 { 0x100000, 0x100001, input_port_0_word_r },
47 { 0x100002, 0x100003, input_port_1_word_r },
48 { 0x100004, 0x100005, input_port_2_word_r },
49 { 0x100006, 0x100007, input_port_3_word_r },
50 { 0x100008, 0x100009, input_port_4_word_r },
51 { 0x180000, 0x1bffff, MRA16_RAM },
52 { 0x1d4000, 0x1dffff, MRA16_RAM },
53 { 0x1f4000, 0x1fffff, MRA16_RAM },
54 { 0x200000, 0x207fff, MRA16_RAM },
55 { 0x208000, 0x21ffff, MRA16_RAM },
56 { 0x280200, 0x2805ff, MRA16_RAM },
57 MEMORY_END
58
59 static MEMORY_WRITE16_START( writemem )
60 { 0x000000, 0x03ffff, MWA16_ROM },
61 { 0x100014, 0x100015, blockout_sound_command_w },
62 { 0x100016, 0x100017, MWA16_NOP }, /* don't know, maybe reset sound CPU */
63 { 0x180000, 0x1bffff, blockout_videoram_w, &blockout_videoram },
64 { 0x1d4000, 0x1dffff, MWA16_RAM }, /* work RAM */
65 { 0x1f4000, 0x1fffff, MWA16_RAM }, /* work RAM */
66 { 0x200000, 0x207fff, MWA16_RAM, &blockout_frontvideoram },
67 { 0x208000, 0x21ffff, MWA16_RAM }, /* ??? */
68 { 0x280002, 0x280003, blockout_frontcolor_w },
69 { 0x280200, 0x2805ff, blockout_paletteram_w, &paletteram16 },
70 MEMORY_END
71
72 static MEMORY_READ_START( sound_readmem )
73 { 0x0000, 0x7fff, MRA_ROM },
74 { 0x8000, 0x87ff, MRA_RAM },
75 { 0x8801, 0x8801, YM2151_status_port_0_r },
76 { 0x9800, 0x9800, OKIM6295_status_0_r },
77 { 0xa000, 0xa000, soundlatch_r },
78 MEMORY_END
79
80 static MEMORY_WRITE_START( sound_writemem )
81 { 0x0000, 0x7fff, MWA_ROM },
82 { 0x8000, 0x87ff, MWA_RAM },
83 { 0x8800, 0x8800, YM2151_register_port_0_w },
84 { 0x8801, 0x8801, YM2151_data_port_0_w },
85 { 0x9800, 0x9800, OKIM6295_data_0_w },
86 MEMORY_END
87
88
89 INPUT_PORTS_START( blockout )
90 PORT_START /* IN0 */
91 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
92 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
93 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
94 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
95 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 )
96 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
97 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 )
98 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
99
100 PORT_START /* IN1 */
101 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
102 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER2 )
103 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER2 )
104 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER2 )
105 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER2 )
106 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
107 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
108 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
109
110 PORT_START
111 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
112 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
113 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 )
114
115 PORT_START
116 PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
117 PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
118 PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
119 PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
120 PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
121 /* the following two are supposed to control Coin 2, but they don't work. */
122 /* This happens on the original board too. */
123 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) /* unused? */
124 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
125 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
126 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) /* unused? */
127 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
128 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
129 PORT_DIPNAME( 0x10, 0x10, "1 Coin to Continue" )
130 PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
131 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
132 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
133 PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
134 PORT_DIPSETTING( 0x20, DEF_STR( On ) )
135 PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) /* unused? */
136 PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
137 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
138 PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) /* unused? */
139 PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
140 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
141
142 PORT_START
143 PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
144 PORT_DIPSETTING( 0x02, "Easy" )
145 PORT_DIPSETTING( 0x03, "Normal" )
146 PORT_DIPSETTING( 0x01, "Hard" )
147 PORT_DIPSETTING( 0x00, "Very Hard" )
148 PORT_DIPNAME( 0x04, 0x04, "Rotate Buttons" )
149 PORT_DIPSETTING( 0x00, "2" )
150 PORT_DIPSETTING( 0x04, "3" )
151 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
152 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
153 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
154 PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
155 PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
156 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
157 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
158 PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
159 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
160 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )
161 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
162 INPUT_PORTS_END
163
164 INPUT_PORTS_START( blckoutj )
165 PORT_START /* IN0 */
166 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
167 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
168 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
169 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
170 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
171 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
172 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 )
173 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
174
175 PORT_START /* IN1 */
176 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
177 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER2 )
178 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER2 )
179 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER2 )
180 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
181 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
182 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 )
183 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
184
185 PORT_START
186 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
187 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
188 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 )
189
190 PORT_START
191 PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
192 PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
193 PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
194 PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
195 PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
196 /* the following two are supposed to control Coin 2, but they don't work. */
197 /* This happens on the original board too. */
198 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) /* unused? */
199 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
200 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
201 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) /* unused? */
202 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
203 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
204 PORT_DIPNAME( 0x10, 0x10, "1 Coin to Continue" )
205 PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
206 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
207 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
208 PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
209 PORT_DIPSETTING( 0x20, DEF_STR( On ) )
210 PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) /* unused? */
211 PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
212 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
213 PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) /* unused? */
214 PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
215 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
216
217 PORT_START
218 PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
219 PORT_DIPSETTING( 0x02, "Easy" )
220 PORT_DIPSETTING( 0x03, "Normal" )
221 PORT_DIPSETTING( 0x01, "Hard" )
222 PORT_DIPSETTING( 0x00, "Very Hard" )
223 /* The following switch is 2/3 rotate buttons on the other sets, option doesn't exist in the Japan version */
224 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
225 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
226 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
227 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
228 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
229 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
230 PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
231 PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
232 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
233 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
234 PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
235 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
236 /* these can still be used on the difficutly select even if they can't be used for rotating pieces in this version */
237 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON4 )
238 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER2 )
239 INPUT_PORTS_END
240
241
242 /* handler called by the 2151 emulator when the internal timers cause an IRQ */
243 static void blockout_irq_handler(int irq)
244 {
245 cpu_set_irq_line_and_vector(1,0,irq ? ASSERT_LINE : CLEAR_LINE,0xff);
246 }
247
248 static struct YM2151interface ym2151_interface =
249 {
250 1, /* 1 chip */
251 3579545, /* 3.579545 MHz (?) */
252 { YM3012_VOL(60,MIXER_PAN_LEFT,60,MIXER_PAN_RIGHT) },
253 { blockout_irq_handler }
254 };
255
256 static struct OKIM6295interface okim6295_interface =
257 {
258 1, /* 1 chip */
259 { 8000 }, /* 8000Hz frequency */
260 { REGION_SOUND1 }, /* memory region */
261 { 50 }
262 };
263
264
265
266 static MACHINE_DRIVER_START( blockout )
267
268 /* basic machine hardware */
269 MDRV_CPU_ADD(M68000, 8760000) /* MRH - 8.76 makes gfx/adpcm samples sync better */
270 MDRV_CPU_MEMORY(readmem,writemem)
271 MDRV_CPU_VBLANK_INT(blockout_interrupt,2)
272
273 MDRV_CPU_ADD(Z80, 3579545)
274 MDRV_CPU_FLAGS(CPU_AUDIO_CPU) /* 3.579545 MHz (?) */
275 MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
276
277 MDRV_FRAMES_PER_SECOND(60)
278 MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
279
280 /* video hardware */
281 MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
282 MDRV_SCREEN_SIZE(320, 256)
283 MDRV_VISIBLE_AREA(0, 319, 8, 247)
284 MDRV_PALETTE_LENGTH(513)
285
286 MDRV_VIDEO_START(blockout)
287 MDRV_VIDEO_UPDATE(blockout)
288
289 /* sound hardware */
290 MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
291 MDRV_SOUND_ADD(YM2151, ym2151_interface)
292 MDRV_SOUND_ADD(OKIM6295, okim6295_interface)
293 MACHINE_DRIVER_END
294
295
296
297 /***************************************************************************
298
299 Game driver(s)
300
301 ***************************************************************************/
302
303 ROM_START( blockout )
304 ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */
305 ROM_LOAD16_BYTE( "bo29a0-2.bin", 0x00000, 0x20000, CRC(b0103427) SHA1(53cac2adc04783abbde21e9f3c0e655f22f68f69) )
306 ROM_LOAD16_BYTE( "bo29a1-2.bin", 0x00001, 0x20000, CRC(5984d5a2) SHA1(4b350856d0313d40eaa3d8a8d9e310f74bc20398) )
307
308 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */
309 ROM_LOAD( "bo29e3-0.bin", 0x0000, 0x8000, CRC(3ea01f78) SHA1(5fc4ad4d9f03d7c26d2afc3e7ede75589e40b0d8) )
310
311 ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */
312 ROM_LOAD( "bo29e2-0.bin", 0x0000, 0x20000, CRC(15c5a99d) SHA1(89091eda454a028fd1f17501584bd589baf6d523) )
313
314 ROM_REGION( 0x0100, REGION_PROMS, 0 )
315 ROM_LOAD( "mb7114h.25", 0x0000, 0x0100, CRC(b25bbda7) SHA1(840f1470886bd0019db3cd29e3d1d80205a65f48) ) /* unknown */
316 ROM_END
317
318 ROM_START( blckout2 )
319 ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */
320 ROM_LOAD16_BYTE( "29a0", 0x00000, 0x20000, CRC(605f931e) SHA1(65fa7227dafde1fc8564e09fa949fe575b394d8a) )
321 ROM_LOAD16_BYTE( "29a1", 0x00001, 0x20000, CRC(38f07000) SHA1(e4070e3067d77cc1b0d8d0c63786f2729c5c703a) )
322
323 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */
324 ROM_LOAD( "bo29e3-0.bin", 0x0000, 0x8000, CRC(3ea01f78) SHA1(5fc4ad4d9f03d7c26d2afc3e7ede75589e40b0d8) )
325
326 ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */
327 ROM_LOAD( "bo29e2-0.bin", 0x0000, 0x20000, CRC(15c5a99d) SHA1(89091eda454a028fd1f17501584bd589baf6d523) )
328
329 ROM_REGION( 0x0100, REGION_PROMS, 0 )
330 ROM_LOAD( "mb7114h.25", 0x0000, 0x0100, CRC(b25bbda7) SHA1(840f1470886bd0019db3cd29e3d1d80205a65f48) ) /* unknown */
331 ROM_END
332
333 ROM_START( blckoutj )
334 ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */
335 ROM_LOAD16_BYTE( "2.bin", 0x00000, 0x20000, CRC(e16cf065) SHA1(541b30b054cf08f10d6ca4746423759f4326c005) )
336 ROM_LOAD16_BYTE( "1.bin", 0x00001, 0x20000, CRC(950b28a3) SHA1(7d1635ac2a3fc1efdd2f78cd6038bd7b4c907b1b) )
337
338 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */
339 ROM_LOAD( "bo29e3-0.bin", 0x0000, 0x8000, CRC(3ea01f78) SHA1(5fc4ad4d9f03d7c26d2afc3e7ede75589e40b0d8) )
340
341 ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */
342 ROM_LOAD( "bo29e2-0.bin", 0x0000, 0x20000, CRC(15c5a99d) SHA1(89091eda454a028fd1f17501584bd589baf6d523) )
343
344 ROM_REGION( 0x0100, REGION_PROMS, 0 )
345 ROM_LOAD( "mb7114h.25", 0x0000, 0x0100, CRC(b25bbda7) SHA1(840f1470886bd0019db3cd29e3d1d80205a65f48) ) /* unknown */
346 ROM_END
347
348 GAME( 1989, blockout, 0, blockout, blockout, 0, ROT0, "Technos + California Dreams", "Block Out (set 1)" )
349 GAME( 1989, blckout2, blockout, blockout, blockout, 0, ROT0, "Technos + California Dreams", "Block Out (set 2)" )
350 GAME( 1989, blckoutj, blockout, blockout, blckoutj, 0, ROT0, "Technos + California Dreams", "Block Out (Japan)" )
351