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