1 /***************************************************************************
2
3
4 Birdie King / Birdie King II / Birdie King III Memory Map
5 ---------------------------------------------------------
6
7 0000-7fff ROM
8 8000-83ff Scratch RAM
9 8400-8fff (Scratch RAM again, address lines AB10, AB11 ignored)
10 9000-97ff Playfield RAM
11 a000-bfff Unused?
12
13
14 NOTE:
15 ROM DM03 is missing from all known ROM sets. This is a color palette.
16 * is this note out of date?, DM_03.d1 in bking.zip = 82s141.2d in bking2.zip
17
18 ***************************************************************************/
19
20 #include "driver.h"
21
22 PALETTE_INIT( bking2 );
23
24 VIDEO_START( bking2 );
25 VIDEO_UPDATE( bking2 );
26 VIDEO_EOF( bking2 );
27
28 WRITE_HANDLER( bking2_xld1_w );
29 WRITE_HANDLER( bking2_yld1_w );
30 WRITE_HANDLER( bking2_xld2_w );
31 WRITE_HANDLER( bking2_yld2_w );
32 WRITE_HANDLER( bking2_xld3_w );
33 WRITE_HANDLER( bking2_yld3_w );
34 WRITE_HANDLER( bking2_msk_w );
35 WRITE_HANDLER( bking2_cont1_w );
36 WRITE_HANDLER( bking2_cont2_w );
37 WRITE_HANDLER( bking2_cont3_w );
38 WRITE_HANDLER( bking2_hitclr_w );
39 WRITE_HANDLER( bking2_playfield_w );
40
41 READ_HANDLER( bking2_input_port_5_r );
42 READ_HANDLER( bking2_input_port_6_r );
43 READ_HANDLER( bking2_pos_r );
44
45 UINT8* bking2_playfield_ram;
46
47
48 static int sndnmi_enable = 1;
49
READ_HANDLER(bking2_sndnmi_disable_r)50 static READ_HANDLER( bking2_sndnmi_disable_r )
51 {
52 sndnmi_enable = 0;
53 return 0;
54 }
55
WRITE_HANDLER(bking2_sndnmi_enable_w)56 static WRITE_HANDLER( bking2_sndnmi_enable_w )
57 {
58 sndnmi_enable = 1;
59 }
60
WRITE_HANDLER(bking2_soundlatch_w)61 static WRITE_HANDLER( bking2_soundlatch_w )
62 {
63 int i,code;
64
65 code = 0;
66 for (i = 0;i < 8;i++)
67 if (data & (1 << i)) code |= 0x80 >> i;
68
69 soundlatch_w(offset,code);
70 if (sndnmi_enable) cpu_set_irq_line(1, IRQ_LINE_NMI, PULSE_LINE);
71 }
72
73
74 static int bk3_l, bk3_h;
75
WRITE_HANDLER(bk3_l_w)76 static WRITE_HANDLER( bk3_l_w)
77 {
78 bk3_l = data;
79 }
80
WRITE_HANDLER(bk3_h_w)81 static WRITE_HANDLER( bk3_h_w)
82 {
83 bk3_h = data;
84 }
85
READ_HANDLER(bk3_r)86 static READ_HANDLER( bk3_r )
87 {
88 unsigned char *rom = memory_region(REGION_USER2);
89 return rom[bk3_h*256+bk3_l];
90 }
91
WRITE_HANDLER(unk_w)92 static WRITE_HANDLER( unk_w )
93 {
94 /*
95 0 = finished reading extra rom
96 1 = started reading extra rom
97 */
98 }
99
READ_HANDLER(mcu_status_r)100 static READ_HANDLER( mcu_status_r )
101 {
102 static int res = 3;
103
104 return res;/*cpu data / MCU ready*/
105 }
106
107
108 /*
109 Birdie King 3 MCU simulation
110 Nothing really special to report,just the typical protection HW test and another
111 protection routine with 0x30 command when the player have to shot on the green.
112
113 Todo:
114 \-How to handle the reads at port($6f)?
115 \-In-depth game untested.
116 */
117 static unsigned char mcu_val;
118
WRITE_HANDLER(mcu_data_w)119 static WRITE_HANDLER( mcu_data_w )
120 {
121 #ifdef MAME_DEBUG
122 log_cb(RETRO_LOG_DEBUG, LOGPRE "mcu_data_w = %x\n",data);
123 #endif
124 mcu_val = data;
125 /* HW test */
126 /* all bits of port ($02) except the MSB are connected to the command,
127 in all cases it should return 0x5e.This one is here to avoid to get a big
128 switch-case statement in the mcu_data_r function... */
129 if(mcu_val >= 0x80)
130 mcu_val = 0x5e;
131 }
132
READ_HANDLER(mcu_data_r)133 static READ_HANDLER( mcu_data_r )
134 {
135 /* usrintf_showmessage("MCU-r1 PC = %04x %02x",activecpu_get_pc(),mcu_val);*/
136 switch(mcu_val)
137 {
138 /* Shot counter control at the green (check $bdf and afterwards in that condition)*/
139 case 0x30: return (mcu_val-0x1e);
140 default: return (mcu_val);
141 }
142 }
143
READ_HANDLER(mcu_data_r2)144 static READ_HANDLER( mcu_data_r2 )
145 {
146 /* usrintf_showmessage("MCU-r2 PC = %04x %02x",activecpu_get_pc(),mcu_val);*/
147 return 0x31; /*no "bad rom.", no "bad ext."*/
148 }
149
MEMORY_READ_START(readmem)150 static MEMORY_READ_START( readmem )
151 { 0x0000, 0x7fff, MRA_ROM },
152 { 0x8000, 0x83ff, MRA_RAM },
153 { 0x9000, 0x97ff, MRA_RAM },
154 MEMORY_END
155
156 static MEMORY_WRITE_START( writemem )
157 { 0x0000, 0x7fff, MWA_ROM },
158 { 0x8000, 0x83ff, MWA_RAM },
159 { 0x9000, 0x97ff, bking2_playfield_w, &bking2_playfield_ram },
160 MEMORY_END
161
162 static PORT_READ_START( readport )
163 { 0x00, 0x00, input_port_0_r },
164 { 0x01, 0x01, input_port_1_r },
165 { 0x02, 0x02, input_port_2_r },
166 { 0x03, 0x03, input_port_3_r },
167 { 0x04, 0x04, input_port_4_r },
168 { 0x05, 0x05, bking2_input_port_5_r },
169 { 0x06, 0x06, bking2_input_port_6_r },
170 { 0x07, 0x1f, bking2_pos_r },
171
172 { 0x2f, 0x2f, mcu_data_r },
173 { 0x4f, 0x4f, mcu_status_r },
174 { 0x60, 0x60, bk3_r },
175 { 0x6f, 0x6f, mcu_data_r2 },
176 PORT_END
177
178 static PORT_WRITE_START( writeport )
179 { 0x00, 0x00, bking2_xld1_w },
180 { 0x01, 0x01, bking2_yld1_w },
181 { 0x02, 0x02, bking2_xld2_w },
182 { 0x03, 0x03, bking2_yld2_w },
183 { 0x04, 0x04, bking2_xld3_w },
184 { 0x05, 0x05, bking2_yld3_w },
185 { 0x06, 0x06, bking2_msk_w },
186 { 0x07, 0x07, watchdog_reset_w },
187 { 0x08, 0x08, bking2_cont1_w },
188 { 0x09, 0x09, bking2_cont2_w },
189 { 0x0a, 0x0a, bking2_cont3_w },
190 { 0x0b, 0x0b, bking2_soundlatch_w },
191 /* { 0x0c, 0x0c, bking2_eport2_w }, this is not shown to be connected anywhere*/
192 { 0x0d, 0x0d, bking2_hitclr_w },
193
194 { 0x2f, 0x2f, mcu_data_w },
195 { 0x4f, 0x4f, unk_w },
196 { 0x6f, 0x6f, bk3_h_w },
197 { 0x8f, 0x8f, bk3_l_w },
198 PORT_END
199
200 static MEMORY_READ_START( sound_readmem )
201 { 0x0000, 0x1fff, MRA_ROM },
202 { 0x2000, 0x2fff, MRA_ROM }, /*only bking3*/
203 { 0x4000, 0x43ff, MRA_RAM },
204 { 0x4401, 0x4401, AY8910_read_port_0_r },
205 { 0x4403, 0x4403, AY8910_read_port_1_r },
206 { 0x4800, 0x4800, soundlatch_r },
207 { 0x4802, 0x4802, bking2_sndnmi_disable_r },
208 { 0xe000, 0xefff, MRA_ROM }, /* space for some other ROM???
209 It's checked if there is valid code there
210 [Probably diagnostic ROM like other early Taito games -AS]*/
211 MEMORY_END
212
213 static MEMORY_WRITE_START( sound_writemem )
214 { 0x0000, 0x1fff, MWA_ROM },
215 { 0x2000, 0x2fff, MWA_ROM }, /*only bking3*/
216 { 0x4000, 0x43ff, MWA_RAM },
217 { 0x4400, 0x4400, AY8910_control_port_0_w },
218 { 0x4401, 0x4401, AY8910_write_port_0_w },
219 { 0x4402, 0x4402, AY8910_control_port_1_w },
220 { 0x4403, 0x4403, AY8910_write_port_1_w },
221 { 0x4802, 0x4802, bking2_sndnmi_enable_w },
222 MEMORY_END
223
224 INPUT_PORTS_START( bking )
225 PORT_START /* IN0 */
226 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
227 PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
228 PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED )
229
230 PORT_START /* IN1 */
231 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
232 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
233 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) /* Continue 1 */
234 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 ) /* Continue 2 */
235 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
236 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_TILT )
237 PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) /* Not Connected */
238
239 PORT_START /* IN2 - DIP Switch A */
240 PORT_DIPNAME( 0x01, 0x00, "Bonus Holes Awarded" )
241 PORT_DIPSETTING( 0x00, "Fewer" )
242 PORT_DIPSETTING( 0x01, "More" )
243 PORT_DIPNAME( 0x02, 0x02, "Holes Awarded for Hole-in-One" )
244 PORT_DIPSETTING( 0x00, "3" )
245 PORT_DIPSETTING( 0x02, "9" )
246 PORT_DIPNAME( 0x04, 0x04, DEF_STR(Free_Play) )
247 PORT_DIPSETTING( 0x04, DEF_STR(Off))
248 PORT_DIPSETTING( 0x00, DEF_STR(On))
249 PORT_DIPNAME( 0x18, 0x18, "Holes (Lives)" )
250 PORT_DIPSETTING( 0x18, "3" )
251 PORT_DIPSETTING( 0x08, "4" )
252 PORT_DIPSETTING( 0x10, "5" )
253 PORT_DIPSETTING( 0x00, "9" )
254 PORT_DIPNAME( 0x20, 0x20, "Self Test" )
255 PORT_DIPSETTING( 0x20, DEF_STR(Off))
256 PORT_DIPSETTING( 0x00, DEF_STR(On))
257 PORT_DIPNAME( 0x40, 0x40, DEF_STR(Flip_Screen) )
258 PORT_DIPSETTING( 0x40, DEF_STR(Off))
259 PORT_DIPSETTING( 0x00, DEF_STR(On))
260 PORT_DIPNAME( 0x80, 0x00, DEF_STR(Cabinet) )
261 PORT_DIPSETTING( 0x00, DEF_STR(Upright) )
262 PORT_DIPSETTING( 0x80, DEF_STR(Cocktail) )
263
264 PORT_START /* IN3 - DIP Switch B */
265 PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) )
266 PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) )
267 PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) )
268 PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) )
269 PORT_DIPSETTING( 0x0c, DEF_STR( 6C_1C ) )
270 PORT_DIPSETTING( 0x0b, DEF_STR( 5C_1C ) )
271 PORT_DIPSETTING( 0x0a, DEF_STR( 4C_1C ) )
272 PORT_DIPSETTING( 0x09, DEF_STR( 3C_1C ) )
273 PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) )
274 PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
275 PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
276 PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
277 PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
278 PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) )
279 PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) )
280 PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) )
281 PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) )
282 PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) )
283 PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) )
284 PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) )
285 PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) )
286 PORT_DIPSETTING( 0xc0, DEF_STR( 6C_1C ) )
287 PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) )
288 PORT_DIPSETTING( 0xa0, DEF_STR( 4C_1C ) )
289 PORT_DIPSETTING( 0x90, DEF_STR( 3C_1C ) )
290 PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
291 PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
292 PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
293 PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) )
294 PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) )
295 PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) )
296 PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) )
297 PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) )
298 PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) )
299
300 PORT_START /* IN4 - DIP Switch C */
301 PORT_DIPNAME( 0x01, 0x01, "Crow" )
302 PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
303 PORT_DIPSETTING( 0x01, DEF_STR( On ) )
304 PORT_DIPNAME( 0x06, 0x04, "Crow Flight Pattern" )
305 PORT_DIPSETTING( 0x00, "1" )
306 PORT_DIPSETTING( 0x02, "2" )
307 PORT_DIPSETTING( 0x04, "3" )
308 PORT_DIPSETTING( 0x06, "4" )
309 PORT_DIPNAME( 0x08, 0x08, DEF_STR(Unused) )
310 PORT_DIPSETTING( 0x00, DEF_STR(Off))
311 PORT_DIPSETTING( 0x08, DEF_STR(On))
312 PORT_DIPNAME( 0x10, 0x10, "Coinage Display" )
313 PORT_DIPSETTING( 0x00, DEF_STR(Off))
314 PORT_DIPSETTING( 0x10, DEF_STR(On))
315 PORT_DIPNAME( 0x20, 0x20, "Year Display" )
316 PORT_DIPSETTING( 0x00, DEF_STR(Off))
317 PORT_DIPSETTING( 0x20, DEF_STR(On))
318 PORT_DIPNAME( 0x40, 0x40, "Check" )
319 PORT_DIPSETTING( 0x00, "Check" )
320 PORT_DIPSETTING( 0x40, "Normal" )
321 PORT_DIPNAME( 0x80, 0x80, "Coin Chutes" )
322 PORT_DIPSETTING( 0x00, "1" )
323 PORT_DIPSETTING( 0x80, "2" )
324
325 PORT_START /* IN5 */
326 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_X, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
327
328 PORT_START /* IN6 */
329 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_Y | IPF_REVERSE, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
330
331 PORT_START /* IN7 */
332 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_X | IPF_COCKTAIL, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
333
334 PORT_START /* IN8 */
335 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_Y | IPF_REVERSE | IPF_COCKTAIL, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
336 INPUT_PORTS_END
337
338 INPUT_PORTS_START( bking2 )
339 PORT_START /* IN0 */
340 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
341 PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
342 PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED )
343
344 PORT_START /* IN1 */
345 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
346 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
347 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) /* Continue 1 */
348 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 ) /* Continue 2 */
349 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
350 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_TILT )
351 PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) /* Not Connected */
352
353 PORT_START /* IN2 - DIP Switch A */
354 PORT_DIPNAME( 0x01, 0x00, "Bonus Holes Awarded" )
355 PORT_DIPSETTING( 0x00, "Fewer" )
356 PORT_DIPSETTING( 0x01, "More" )
357 PORT_DIPNAME( 0x02, 0x02, "Holes Awarded for Hole-in-One" )
358 PORT_DIPSETTING( 0x00, "3" )
359 PORT_DIPSETTING( 0x02, "9" )
360 PORT_DIPNAME( 0x04, 0x04, DEF_STR(Free_Play) )
361 PORT_DIPSETTING( 0x04, DEF_STR(Off))
362 PORT_DIPSETTING( 0x00, DEF_STR(On))
363 PORT_DIPNAME( 0x18, 0x18, "Holes (Lives)" )
364 PORT_DIPSETTING( 0x18, "3" )
365 PORT_DIPSETTING( 0x08, "4" )
366 PORT_DIPSETTING( 0x10, "5" )
367 PORT_DIPSETTING( 0x00, "9" )
368 PORT_DIPNAME( 0x20, 0x20, DEF_STR(Unused) )
369 PORT_DIPSETTING( 0x20, DEF_STR(Off))
370 PORT_DIPSETTING( 0x00, DEF_STR(On))
371 PORT_DIPNAME( 0x40, 0x40, DEF_STR(Flip_Screen) )
372 PORT_DIPSETTING( 0x40, DEF_STR(Off))
373 PORT_DIPSETTING( 0x00, DEF_STR(On))
374 PORT_DIPNAME( 0x80, 0x00, DEF_STR(Cabinet) )
375 PORT_DIPSETTING( 0x00, DEF_STR(Upright) )
376 PORT_DIPSETTING( 0x80, DEF_STR(Cocktail) )
377
378 PORT_START /* IN3 - DIP Switch B */
379 PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) )
380 PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) )
381 PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) )
382 PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) )
383 PORT_DIPSETTING( 0x0c, DEF_STR( 6C_1C ) )
384 PORT_DIPSETTING( 0x0b, DEF_STR( 5C_1C ) )
385 PORT_DIPSETTING( 0x0a, DEF_STR( 4C_1C ) )
386 PORT_DIPSETTING( 0x09, DEF_STR( 3C_1C ) )
387 PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) )
388 PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
389 PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
390 PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
391 PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
392 PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) )
393 PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) )
394 PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) )
395 PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) )
396 PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) )
397 PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) )
398 PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) )
399 PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) )
400 PORT_DIPSETTING( 0xc0, DEF_STR( 6C_1C ) )
401 PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) )
402 PORT_DIPSETTING( 0xa0, DEF_STR( 4C_1C ) )
403 PORT_DIPSETTING( 0x90, DEF_STR( 3C_1C ) )
404 PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
405 PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
406 PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
407 PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) )
408 PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) )
409 PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) )
410 PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) )
411 PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) )
412 PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) )
413
414 PORT_START /* IN4 - DIP Switch C */
415 PORT_DIPNAME( 0x01, 0x01, "Crow" )
416 PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
417 PORT_DIPSETTING( 0x01, DEF_STR( On ) )
418 PORT_DIPNAME( 0x06, 0x04, "Crow Flight Pattern" )
419 PORT_DIPSETTING( 0x00, "1" )
420 PORT_DIPSETTING( 0x02, "2" )
421 PORT_DIPSETTING( 0x04, "3" )
422 PORT_DIPSETTING( 0x06, "4" )
423 PORT_DIPNAME( 0x08, 0x08, DEF_STR(Unused) )
424 PORT_DIPSETTING( 0x00, DEF_STR(Off))
425 PORT_DIPSETTING( 0x08, DEF_STR(On))
426 PORT_DIPNAME( 0x10, 0x10, "Coinage Display" )
427 PORT_DIPSETTING( 0x00, DEF_STR(Off))
428 PORT_DIPSETTING( 0x10, DEF_STR(On))
429 PORT_DIPNAME( 0x20, 0x20, "Year Display" )
430 PORT_DIPSETTING( 0x00, DEF_STR(Off))
431 PORT_DIPSETTING( 0x20, DEF_STR(On))
432 PORT_DIPNAME( 0x40, 0x40, "Check" )
433 PORT_DIPSETTING( 0x00, "Check" )
434 PORT_DIPSETTING( 0x40, "Normal" )
435 PORT_DIPNAME( 0x80, 0x80, "Coin Chutes" )
436 PORT_DIPSETTING( 0x00, "1" )
437 PORT_DIPSETTING( 0x80, "2" )
438
439 PORT_START /* IN5 */
440 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_X, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
441
442 PORT_START /* IN6 */
443 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_Y | IPF_REVERSE, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
444
445 PORT_START /* IN7 */
446 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_X | IPF_COCKTAIL, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
447
448 PORT_START /* IN8 */
449 PORT_ANALOG( 0xff, 0x00, IPT_TRACKBALL_Y | IPF_REVERSE | IPF_COCKTAIL, 25, 10, 0, 0 ) /* Sensitivity, clip, min, max */
450 INPUT_PORTS_END
451
452
453 static struct GfxLayout charlayout =
454 {
455 8,8, /* 8*8 characters */
456 1024, /* 1024 characters */
457 3, /* 3 bits per pixel */
458 { 0*1024*8*8, 1*1024*8*8, 2*1024*8*8 }, /* the bitplanes are separated */
459 { 7, 6, 5, 4, 3, 2, 1, 0 }, /* reverse layout */
460 { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
461 8*8 /* every char takes 8 consecutive bytes */
462 };
463
464 struct GfxLayout crowlayout =
465 {
466 16,32, /* 16*32 characters */
467 16, /* 16 characters */
468 2, /* 2 bits per pixel */
469 { 0, 4 },
470 { 3*32*8+3, 3*32*8+2, 3*32*8+1, 3*32*8+0,
471 2*32*8+3, 2*32*8+2, 2*32*8+1, 2*32*8+0,
472 32*8+3, 32*8+2, 32*8+1, 32*8+0,
473 3, 2, 1, 0 }, /* reverse layout */
474 { 31*8, 30*8, 29*8, 28*8, 27*8, 26*8, 25*8, 24*8,
475 23*8, 22*8, 21*8, 20*8, 19*8, 18*8, 17*8, 16*8,
476 15*8, 14*8, 13*8, 12*8, 11*8, 10*8, 9*8, 8*8,
477 7*8, 6*8, 5*8, 4*8, 3*8, 2*8, 1*8, 0*8 },
478 128*8 /* every sprite takes 128 consecutive bytes */
479 };
480
481 struct GfxLayout balllayout =
482 {
483 8,16, /* 8*16 sprites */
484 8, /* 8 sprites */
485 1, /* 1 bit per pixel */
486 { 0 },
487 { 7, 6, 5, 4, 3, 2, 1, 0 }, /* pretty straightforward layout */
488 { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
489 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
490 16*8 /* every sprite takes 16 consecutive bytes */
491 };
492
493 static struct GfxDecodeInfo gfxdecodeinfo[] =
494 {
495 { REGION_GFX1, 0, &charlayout, 0, 4 }, /* playfield */
496 { REGION_GFX2, 0, &crowlayout, 4*8, 4 }, /* crow */
497 { REGION_GFX3, 0, &balllayout, 4*8+4*4, 4 }, /* ball 1 */
498 { REGION_GFX4, 0, &balllayout, 4*8+4*4+4*2, 4 }, /* ball 2 */
499 { -1 } /* end of array */
500 };
501
502
WRITE_HANDLER(portb_w)503 static WRITE_HANDLER( portb_w )
504 {
505 /* don't know what this is... could be a filter */
506 if (data != 0x00) log_cb(RETRO_LOG_DEBUG, LOGPRE "portB = %02x\n",data);
507 }
508
509 static struct AY8910interface ay8910_interface =
510 {
511 2, /* 2 chips */
512 2000000, /* 2 MHz */
513 { 25, 25 },
514 { 0, 0 },
515 { 0, 0 },
516 { 0, DAC_0_signed_data_w },
517 { 0, portb_w }
518 };
519
520 static struct DACinterface dac_interface =
521 {
522 1,
523 { 25 }
524 };
525
526 static MACHINE_DRIVER_START( bking2 )
527
528 /* basic machine hardware */
529 MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz */
530 MDRV_CPU_MEMORY(readmem,writemem)
531 MDRV_CPU_PORTS(readport,writeport)
532 MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
533
534 MDRV_CPU_ADD(Z80, 3000000) /* 3 MHz */
535 MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
536 MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
537 /* interrupts (from Jungle King hardware, might be wrong): */
538 /* - no interrupts synced with vblank */
539 /* - NMI triggered by the main CPU */
540 /* - periodic IRQ, with frequency 6000000/(4*16*16*10*16) = 36.621 Hz, */
541 /* that is a period of 27306666.6666 ns */
542 MDRV_CPU_PERIODIC_INT(irq0_line_hold,27306667)
543
544 MDRV_FRAMES_PER_SECOND(60)
545 MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
546
547 /* video hardware */
548 MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
549 MDRV_SCREEN_SIZE(32*8, 32*8)
550 MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
551 MDRV_GFXDECODE(gfxdecodeinfo)
552 MDRV_PALETTE_LENGTH(512)
553 MDRV_COLORTABLE_LENGTH(4*8+4*4+4*2+4*2)
554
555 MDRV_PALETTE_INIT(bking2)
556 MDRV_VIDEO_START(bking2)
557 MDRV_VIDEO_UPDATE(bking2)
558 MDRV_VIDEO_EOF(bking2)
559
560 /* sound hardware */
561 MDRV_SOUND_ADD(AY8910, ay8910_interface)
562 MDRV_SOUND_ADD(DAC, dac_interface)
563 MACHINE_DRIVER_END
564
565 /***************************************************************************
566
567 Game driver(s)
568
569 ***************************************************************************/
570
571 ROM_START( bking )
572 ROM_REGION( 0x10000, REGION_CPU1, 0 )
573 ROM_LOAD( "dm_11.f13", 0x0000, 0x1000, CRC(d84fe4f7) SHA1(3ad1641d05e4faca2be28052ccae8f81bc2255bb) )
574 ROM_LOAD( "dm_12.f11", 0x1000, 0x1000, CRC(e065bbe6) SHA1(8d6d3334977c1eea1bf238817d59c25acd9d99f0) )
575 ROM_LOAD( "dm_13.f10", 0x2000, 0x1000, CRC(aac7cddd) SHA1(12a8887bd8d3334e0d740a7f54374b0e48021140) )
576 ROM_LOAD( "dm_14.f8", 0x3000, 0x1000, CRC(1179d074) SHA1(23df9a7e3e1bf42d6ea3a2d85629d27bd68e9af4) )
577 ROM_LOAD( "dm_15.f7", 0x4000, 0x1000, CRC(fda31475) SHA1(784ffa089b7bd4ab4cbd454f4c1c26553a11fc48) )
578 ROM_LOAD( "dm_16.f5", 0x5000, 0x1000, CRC(b6c3c3ed) SHA1(6c7f67d5eba35e32b556b531e848ef375123de78) )
579
580 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Sound ROMs */
581 ROM_LOAD( "dm_17.f4", 0x0000, 0x1000, CRC(54840bc3) SHA1(225daf7ff8a4095b0e69ce6ccce6d8eab26ec1c8) )
582 ROM_LOAD( "dm_18.d4", 0x1000, 0x1000, CRC(2abadd42) SHA1(d921d333ec9b9140a7d3ce7aaddab35f45fae018) )
583
584 ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE )
585 ROM_LOAD( "dm_10.a5", 0x0000, 0x1000, CRC(fe96dd67) SHA1(11014602f926cf6edbf06e7b2acef92036b2f30a) )
586 ROM_LOAD( "dm_09.a7", 0x1000, 0x1000, CRC(80c675d7) SHA1(e590a71a15ea485abf099eceaa16d5a1dbe0c3dc) )
587 ROM_LOAD( "dm_08.a8", 0x2000, 0x1000, CRC(d9bd6b60) SHA1(3c790b6a69472e0a37f45baa00ce5c7d09e7b588) )
588 ROM_LOAD( "dm_07.a10", 0x3000, 0x1000, CRC(65f7a0e4) SHA1(034dbf2fe384cb69963936e9f3029aa54e032e4a) )
589 ROM_LOAD( "dm_06.a11", 0x4000, 0x1000, CRC(00fdbafc) SHA1(b2a8d9c96415fecee52f1c4691a5f10c96f484b1) )
590 ROM_LOAD( "dm_05.a13", 0x5000, 0x1000, CRC(3e4fe925) SHA1(9ed73601c8b34ea8889717cbb3ee4a00ab7ab458) )
591
592 ROM_REGION( 0x0800, REGION_GFX2, ROMREGION_DISPOSE )
593 ROM_LOAD( "dm_01.e10", 0x0000, 0x0800, CRC(e5663f0b) SHA1(b0fed8c4cdff7b12bb220e51d5b7188933934a34) ) /* crow graphics */
594
595 ROM_REGION( 0x0800, REGION_GFX3, ROMREGION_DISPOSE )
596 ROM_LOAD( "dm_02.e7", 0x0000, 0x0800, CRC(fc9cec31) SHA1(5ab1c9b3b15334c6ec06826005ecb66b34d8879a) ) /* ball 1 graphics. Only the first 128 bytes used */
597
598 ROM_REGION( 0x0800, REGION_GFX4, ROMREGION_DISPOSE )
599 ROM_LOAD( "dm_02.e9", 0x0000, 0x0800, CRC(fc9cec31) SHA1(5ab1c9b3b15334c6ec06826005ecb66b34d8879a) ) /* ball 2 graphics. Only the first 128 bytes used */
600
601 ROM_REGION( 0x0020, REGION_USER1, 0 )
602 ROM_LOAD( "dm04.c2", 0x0000, 0x0020, CRC(4cb5bd32) SHA1(8851bae033ba67516d5ff6888e5daef10c2116ee) ) /* collision detection */
603
604 ROM_REGION( 0x0200, REGION_PROMS, 0 )
605 ROM_LOAD( "dm_03.d1", 0x0000, 0x0200, CRC(61b7a9ff) SHA1(4302de0c0dad2b871ad4719ad934beaee05a0c40) ) /* palette */
606 ROM_END
607
608 ROM_START( bking2 )
609 ROM_REGION( 0x10000, REGION_CPU1, 0 )
610 ROM_LOAD( "01.13f", 0x0000, 0x1000, CRC(078ada3f) SHA1(5e82a6d27c65fe29d664dbfc2ede547c0f4869f0) )
611 ROM_LOAD( "02.11f", 0x1000, 0x1000, CRC(c37d110a) SHA1(7aec6c949d1cf136c3037140bd86597feaf29108) )
612 ROM_LOAD( "03.10f", 0x2000, 0x1000, CRC(2ba5c681) SHA1(d0df24f5e52e6162b40308d8aa38b0348a100f37) )
613 ROM_LOAD( "04.8f", 0x3000, 0x1000, CRC(8fad54e8) SHA1(55edc185914686d42efd848a402f78884d42292b) )
614 ROM_LOAD( "05.7f", 0x4000, 0x1000, CRC(b4de6b58) SHA1(f62bdc3128b226454b1f00a4cbe382e1219a11b0) )
615 ROM_LOAD( "06.5f", 0x5000, 0x1000, CRC(9ac43b87) SHA1(dd562fee01c81317978d1bd8a0178e3d9be6145a) )
616 ROM_LOAD( "07.4f", 0x6000, 0x1000, CRC(b3ed40b7) SHA1(d481094c0381234314f797928e3cdb22f36f4e32) )
617 ROM_LOAD( "08.2f", 0x7000, 0x1000, CRC(8fddb2e8) SHA1(6ee5f09d154440851f370a97b35450e3726e14e7) )
618
619 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Sound ROMs */
620 ROM_LOAD( "15", 0x0000, 0x1000, CRC(f045d0fe) SHA1(3b34081fa6cd0423236d09b6f23e8cf8cfd627c5) )
621 ROM_LOAD( "16", 0x1000, 0x1000, CRC(92d50410) SHA1(e6f4c27031744bbc832a1eb121a7dba4da5286c4) )
622
623 ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE )
624 ROM_LOAD( "14.5a", 0x0000, 0x1000, CRC(52636a94) SHA1(185c4455bd9bb23d14aa2f6f7baa74959da08fc2) )
625 ROM_LOAD( "13.7a", 0x1000, 0x1000, CRC(6b9e0564) SHA1(6cdd3820caa3825e98b61fe260960cc05c04d032) )
626 ROM_LOAD( "12.8a", 0x2000, 0x1000, CRC(c6d685d9) SHA1(2dd2fda365e6bdf9aa26de90650f4a2588ea0515) )
627 ROM_LOAD( "11.10a", 0x3000, 0x1000, CRC(2b949987) SHA1(a94666c4f2fdc25399f7976ed2c25fd454387be6) )
628 ROM_LOAD( "10.11a", 0x4000, 0x1000, CRC(eb96f948) SHA1(295ba5a620a8a85a121d3e823804adceeeef64d9) )
629 ROM_LOAD( "09.13a", 0x5000, 0x1000, CRC(595e3dd4) SHA1(9dd3388ce704dd5473af034716cd8d48df3dc495) )
630
631 ROM_REGION( 0x0800, REGION_GFX2, ROMREGION_DISPOSE )
632 ROM_LOAD( "17", 0x0000, 0x0800, CRC(e5663f0b) SHA1(b0fed8c4cdff7b12bb220e51d5b7188933934a34) ) /* crow graphics */
633
634 ROM_REGION( 0x0800, REGION_GFX3, ROMREGION_DISPOSE )
635 ROM_LOAD( "18", 0x0000, 0x0800, CRC(fc9cec31) SHA1(5ab1c9b3b15334c6ec06826005ecb66b34d8879a) ) /* ball 1 graphics. Only the first 128 bytes used */
636
637 ROM_REGION( 0x0800, REGION_GFX4, ROMREGION_DISPOSE )
638 ROM_LOAD( "19", 0x0000, 0x0800, CRC(fc9cec31) SHA1(5ab1c9b3b15334c6ec06826005ecb66b34d8879a) ) /* ball 2 graphics. Only the first 128 bytes used */
639
640 ROM_REGION( 0x0020, REGION_USER1, 0 )
641 ROM_LOAD( "mb7051.2c", 0x0000, 0x0020, CRC(4cb5bd32) SHA1(8851bae033ba67516d5ff6888e5daef10c2116ee) ) /* collision detection */
642
643 ROM_REGION( 0x0200, REGION_PROMS, 0 )
644 ROM_LOAD( "82s141.2d", 0x0000, 0x0200, CRC(61b7a9ff) SHA1(4302de0c0dad2b871ad4719ad934beaee05a0c40) ) /* palette */
645 ROM_END
646
647 ROM_START( bking3 )
648 ROM_REGION( 0x10000, REGION_CPU1, 0 )
649 ROM_LOAD( "a24-04.13f", 0x0000, 0x1000, CRC(a0c319a6) SHA1(6b79667288113fde43975fcfd05e93d8e45bf92d) )
650 ROM_LOAD( "a24-05.11f", 0x1000, 0x1000, CRC(fedc9b4a) SHA1(3ac22c3ca09df9983f3c8c05e807ecf5999c9fc5) )
651 ROM_LOAD( "a24-06.10f", 0x2000, 0x1000, CRC(6a116ebf) SHA1(e58b1f75eb75027749a900b27107930e9072ca5a) )
652 ROM_LOAD( "a24-07.8f", 0x3000, 0x1000, CRC(75a74d2d) SHA1(d433e8fcf3819b845936e7e107fef414f72bfc16) )
653 ROM_LOAD( "a24-08.7f", 0x4000, 0x1000, CRC(9fe07cf9) SHA1(23fdae48e519a171bf4adeeadf2fdfedfd56f4ea) )
654 ROM_LOAD( "a24-09.5f", 0x5000, 0x1000, CRC(51545ced) SHA1(4addad527c6fd675506bf584ec8670a23767787c) )
655 ROM_LOAD( "a24-01.4f", 0x6000, 0x1000, CRC(a86b3e62) SHA1(f97a13e31e622b5ac55c23458c65a49c2998196a) ) /*another one: a24-10.4f*/
656 ROM_LOAD( "a24-11.2f", 0x7000, 0x1000, CRC(b39db430) SHA1(4f48a34f3aaa1e998a4a5656bc3f399d9e6633c4) )
657
658 ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Sound ROMs */
659 ROM_LOAD( "a24-18.4f", 0x0000, 0x1000, CRC(fa3bfa98) SHA1(733924e154e301a9d692d80b485afc4ab0e200c1) )
660 ROM_LOAD( "a24-19.4d", 0x1000, 0x1000, CRC(817f9c2a) SHA1(7365ecf2700e1fd13016408f5493f8d51aab5bbd) )
661 ROM_LOAD( "a24-20.4b", 0x2000, 0x1000, CRC(0e9e16d6) SHA1(43c69602a8d9c34c527ce54472db84168acc4ef4) )
662
663 ROM_REGION( 0x0800, REGION_CPU3, 0 ) /* 2k for the microcontroller */
664 ROM_LOAD( "a24_22", 0x0000, 0x0800, NO_DUMP ) /*M68705P5S uC 3MHz xtal*/
665
666 ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) /* Tiles */
667 ROM_LOAD( "a24-12.5a", 0x0000, 0x1000, CRC(c5fe4817) SHA1(fbf82d9d85e18b76c7e939932df074a545e73f42) )
668 ROM_LOAD( "a24-13.7a", 0x1000, 0x1000, CRC(728bac57) SHA1(3daa246f95b31c971e5418f55b821616d0bce25d) )
669 ROM_LOAD( "a24-14.8a", 0x2000, 0x1000, CRC(63cd0009) SHA1(10fcfeec70b23e2206c4f4bf686dc6a48ecba1ce) )
670 ROM_LOAD( "a24-15.10a", 0x3000, 0x1000, CRC(590275d0) SHA1(563bebb344c606ca3a2124fc7a8804935a011e90) )
671 ROM_LOAD( "a24-16.11a", 0x4000, 0x1000, CRC(728d069e) SHA1(b4adb14281e4874bab7cec7f38ade70b5b7c6b8f) )
672 ROM_LOAD( "a24-17.13a", 0x5000, 0x1000, CRC(4c04c4f2) SHA1(8e9eee6d89e91910b398d42ac86597ef91baad96) )
673
674 ROM_REGION( 0x0800, REGION_GFX2, ROMREGION_DISPOSE )
675 ROM_LOAD( "a24-02.10e", 0x0000, 0x0800, CRC(8560da46) SHA1(56f249f0b56336daac1a3624ef9b71354bb8ca40) ) /* crow graphics */
676
677 ROM_REGION( 0x0800, REGION_GFX3, ROMREGION_DISPOSE )
678 ROM_LOAD( "a24-01.7e", 0x0000, 0x0800, CRC(369c01e1) SHA1(196e12d0bcaf74cefe4cad3fccb69d104aab061e) ) /* ball 1 graphics. Only the first 128 bytes used */
679
680 ROM_REGION( 0x0800, REGION_GFX4, ROMREGION_DISPOSE )
681 ROM_LOAD( "a24-01.9e", 0x0000, 0x0800, CRC(369c01e1) SHA1(196e12d0bcaf74cefe4cad3fccb69d104aab061e) ) /* ball 2 graphics. Only the first 128 bytes used */
682
683 ROM_REGION( 0x0020, REGION_USER1, 0 )
684 ROM_LOAD( "82s123.2c", 0x0000, 0x0020, CRC(4cb5bd32) SHA1(8851bae033ba67516d5ff6888e5daef10c2116ee) ) /* collision detection */
685
686 ROM_REGION( 0x0200, REGION_PROMS, 0 )
687 ROM_LOAD( "82s141.2d", 0x0000, 0x0200, CRC(61b7a9ff) SHA1(4302de0c0dad2b871ad4719ad934beaee05a0c40) ) /* palette */
688
689 ROM_REGION( 0x1000, REGION_USER2, 0 )
690 ROM_LOAD( "a24-21.25", 0x0000, 0x1000, CRC(3106fcac) SHA1(08454adfb58e5df84140d86ed52fa4ef684df9f1) ) /* extra rom on the same SUB PCB where is the mcu */
691
692 /*missing?*/
693 /*"a24_03" A24_03 - TI TBP28S46N - Not read*/
694 /*"a24_04" A24_04 - Bipolar PROM - Not read*/
695
696 ROM_END
697
698 GAME( 1982, bking, 0, bking2, bking, 0, ROT270, "Taito Corporation", "Birdie King" )
699 GAME( 1983, bking2, 0, bking2, bking2, 0, ROT90, "Taito Corporation", "Birdie King 2" )
700 GAME( 1984, bking3, 0, bking2, bking2, 0, ROT90, "Taito Corporation", "Birdie King 3" )
701