1 /***************************************************************************
2 
3 Funky Bee/Sky Lancer memory map (preliminary)
4 
5 driver by Zsolt Vasvari
6 
7 MAIN CPU:
8 
9 0000-4fff ROM
10 8000-87ff RAM
11 a000-bfff video RAM (only 0x20 bytes of each 0x100 byte block is used)
12 					(also contains sprite RAM)
13 c000-dfff color RAM (only 0x20 bytes of each 0x100 byte block is used)
14 					(also contains sprite RAM)
15 
16 read:
17 f000	  interrupt ACK
18 f800	  IN0/watchdog
19 f801	  IN1
20 f802	  IN2
21 
22 write:
23 e000	  row scroll
24 e800	  flip screen
25 e802-e803 coin counter
26 e804	  ???
27 e805	  gfx bank select
28 e806	  ???
29 f800	  watchdog
30 
31 
32 I/0 ports:
33 write
34 00		  8910	control
35 01		  8910	write
36 
37 AY8910 Port A = DSW
38 
39 
40 Known issues:
41 
42 * skylancr fires in the same spot regardless of player position when in cocktail mode.
43 
44 ***************************************************************************/
45 
46 #include "driver.h"
47 #include "vidhrdw/generic.h"
48 
49 
50 extern WRITE_HANDLER( funkybee_videoram_w );
51 extern WRITE_HANDLER( funkybee_colorram_w );
52 extern WRITE_HANDLER( funkybee_gfx_bank_w );
53 extern WRITE_HANDLER( funkybee_scroll_w );
54 extern WRITE_HANDLER( funkybee_flipscreen_w );
55 
56 extern PALETTE_INIT( funkybee );
57 extern VIDEO_START( funkybee );
58 extern VIDEO_UPDATE( funkybee );
59 
60 
READ_HANDLER(funkybee_input_port_0_r)61 static READ_HANDLER( funkybee_input_port_0_r )
62 {
63 	watchdog_reset_r(0);
64 	return input_port_0_r(offset);
65 }
66 
WRITE_HANDLER(funkybee_coin_counter_w)67 static WRITE_HANDLER( funkybee_coin_counter_w )
68 {
69 	coin_counter_w(offset,data);
70 }
71 
MEMORY_READ_START(readmem)72 static MEMORY_READ_START( readmem )
73 	{ 0x0000, 0x4fff, MRA_ROM },
74 	{ 0x8000, 0x87ff, MRA_RAM },
75 	{ 0xa000, 0xdfff, MRA_RAM },
76 	{ 0xf000, 0xf000, MRA_NOP },	/* IRQ Ack */
77 	{ 0xf800, 0xf800, funkybee_input_port_0_r },
78 	{ 0xf801, 0xf801, input_port_1_r },
79 	{ 0xf802, 0xf802, input_port_2_r },
80 MEMORY_END
81 
82 static MEMORY_WRITE_START( writemem )
83 	{ 0x0000, 0x4fff, MWA_ROM },
84 	{ 0x8000, 0x87ff, MWA_RAM },
85 	{ 0xa000, 0xbfff, funkybee_videoram_w, &videoram },
86 	{ 0xc000, 0xdfff, funkybee_colorram_w, &colorram },
87 	{ 0xe000, 0xe000, funkybee_scroll_w },
88 	{ 0xe800, 0xe800, funkybee_flipscreen_w },
89 	{ 0xe802, 0xe803, funkybee_coin_counter_w },
90 	{ 0xe805, 0xe805, funkybee_gfx_bank_w },
91 	{ 0xf800, 0xf800, watchdog_reset_w },
92 MEMORY_END
93 
94 
95 static PORT_READ_START( readport )
96 	{ 0x02, 0x02, AY8910_read_port_0_r },
97 PORT_END
98 
99 static PORT_WRITE_START( writeport )
100 	{ 0x00, 0x00, AY8910_control_port_0_w },
101 	{ 0x01, 0x01, AY8910_write_port_0_w },
102 PORT_END
103 
104 
105 INPUT_PORTS_START( funkybee )
106 	PORT_START		/* IN0 */
107 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
108 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
109 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
110 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
111 	PORT_DIPNAME( 0x20, 0x20, "Freeze" )
112 	PORT_DIPSETTING(	0x20, DEF_STR( Off ) )
113 	PORT_DIPSETTING(	0x00, DEF_STR( On ) )
114 
115 	PORT_START		/* IN1 */
116 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY )
117 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
118 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY )
119 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY )
120 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
121 	PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
122 
123 	PORT_START		/* IN2 */
124 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
125 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
126 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
127 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
128 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
129 	PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
130 
131 	PORT_START		/* DSW */
132 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
133 	PORT_DIPSETTING(	0x03, DEF_STR( 1C_1C ) )
134 	PORT_DIPSETTING(	0x02, DEF_STR( 1C_2C ) )
135 	PORT_DIPSETTING(	0x01, DEF_STR( 1C_3C ) )
136 	PORT_DIPSETTING(	0x00, DEF_STR( 1C_4C ) )
137 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) )
138 	PORT_DIPSETTING(	0x08, DEF_STR( 2C_1C ) )
139 	PORT_DIPSETTING(	0x0c, DEF_STR( 1C_1C ) )
140 	PORT_DIPSETTING(	0x04, DEF_STR( 2C_3C ) )
141 	PORT_DIPSETTING(	0x00, DEF_STR( 1C_6C ) )
142 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
143 	PORT_DIPSETTING(	0x30, "3" )
144 	PORT_DIPSETTING(	0x20, "4" )
145 	PORT_DIPSETTING(	0x10, "5" )
146 	PORT_DIPSETTING(	0x00, "6" )
147 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
148 	PORT_DIPSETTING(	0x00, DEF_STR( Off ) )
149 	PORT_DIPSETTING(	0x40, DEF_STR( On ) )
150 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
151 	PORT_DIPSETTING(	0x00, DEF_STR( Upright ) )
152 	PORT_DIPSETTING(	0x80, DEF_STR( Cocktail ) )
153 INPUT_PORTS_END
154 
155 INPUT_PORTS_START( skylancr )
156 	PORT_START		/* IN0 */
157 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
158 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
159 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
160 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
161 	PORT_DIPNAME( 0x20, 0x20, "Freeze" )
162 	PORT_DIPSETTING(	0x20, DEF_STR( Off ) )
163 	PORT_DIPSETTING(	0x00, DEF_STR( On ) )
164 
165 	PORT_START		/* IN1 */
166 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY )
167 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
168 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY )
169 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY )
170 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
171 	PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
172 
173 	PORT_START		/* IN2 */
174 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_COCKTAIL )
175 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
176 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_COCKTAIL )
177 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_COCKTAIL )
178 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
179 	PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
180 
181 	PORT_START		/* DSW */
182 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
183 	PORT_DIPSETTING(	0x03, DEF_STR( 1C_1C ) )
184 	PORT_DIPSETTING(	0x02, DEF_STR( 1C_2C ) )
185 	PORT_DIPSETTING(	0x01, DEF_STR( 1C_3C ) )
186 	PORT_DIPSETTING(	0x00, DEF_STR( 1C_6C ) )
187 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) )
188 	PORT_DIPSETTING(	0x08, DEF_STR( 2C_1C ) )
189 	PORT_DIPSETTING(	0x0c, DEF_STR( 1C_1C ) )
190 	PORT_DIPSETTING(	0x04, DEF_STR( 2C_3C ) )
191 	PORT_DIPSETTING(	0x00, DEF_STR( 1C_6C ) )
192 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
193 	PORT_DIPSETTING(	0x30, "3" )
194 	PORT_DIPSETTING(	0x20, "4" )
195 	PORT_DIPSETTING(	0x10, "5" )
196 	PORT_DIPSETTING(	0x00, "6" )
197 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Bonus_Life ) )
198 	PORT_DIPSETTING(	0x40, "20000 50000" )
199 	PORT_DIPSETTING(	0x00, "40000 70000" )
200 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) )
201 	PORT_DIPSETTING(	0x00, DEF_STR( Upright ) )
202 	PORT_DIPSETTING(	0x80, DEF_STR( Cocktail ) )
203 INPUT_PORTS_END
204 
205 
206 static struct GfxLayout charlayout =
207 {
208 	8,8,	/* 8*8 characters */
209 	256,	/* 256 characters */
210 	2,		/* 2 bits per pixel */
211 	{ 0, 4 },	/* the two bitplanes for 4 pixels are packed into one byte */
212 	{ 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3 },
213 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
214 	16*8	/* every char takes 16 bytes */
215 };
216 
217 static struct GfxLayout spritelayout =
218 {
219 	8,32,	/* 8*32 sprites */
220 	128,		/* 128 sprites */
221 	2,		/* 2 bits per pixel */
222 	{ 0, 4 },	/* the two bitplanes for 4 pixels are packed into one byte */
223 	{ 0, 1, 2, 3, 8*8+0, 8*8+1, 8*8+2, 8*8+3 },
224 	{  0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
225 	  16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8,
226 	  32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8,
227 	  48*8, 49*8, 50*8, 51*8, 52*8, 53*8, 54*8, 55*8 },
228 	4*16*8	/* every sprite takes 64 bytes */
229 };
230 
231 static struct GfxDecodeInfo gfxdecodeinfo[] =
232 {
233 	{ REGION_GFX1, 0, &charlayout,	  0, 8 },
234 	{ REGION_GFX2, 0, &charlayout,	  0, 8 },
235 	{ REGION_GFX1, 0, &spritelayout, 16, 4 },
236 	{ REGION_GFX2, 0, &spritelayout, 16, 4 },
237 	{ -1 } /* end of array */
238 };
239 
240 
241 static struct AY8910interface ay8910_interface =
242 {
243 	1,	/* 1 chip */
244 	1500000,	/* 1.5 MHz?????? */
245 	{ 50 },
246 	{ input_port_3_r },
247 	{ 0 },
248 	{ 0 },
249 	{ 0 }
250 };
251 
252 
253 static MACHINE_DRIVER_START( funkybee )
254 
255 	/* basic machine hardware */
256 	MDRV_CPU_ADD(Z80, 3072000)	/* 3.072 MHz */
257 	MDRV_CPU_MEMORY(readmem,writemem)
258 	MDRV_CPU_PORTS(readport,writeport)
259 	MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
260 
261 	MDRV_FRAMES_PER_SECOND(60)
262 	MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION)
263 
264 	/* video hardware */
265 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
266 	MDRV_SCREEN_SIZE(32*8, 32*8)
267 	MDRV_VISIBLE_AREA(12, 32*8-1-12, 0*8, 28*8-1)
268 	MDRV_GFXDECODE(gfxdecodeinfo)
269 	MDRV_PALETTE_LENGTH(32)
270 	MDRV_COLORTABLE_LENGTH(32)
271 
272 	MDRV_PALETTE_INIT(funkybee)
273 	MDRV_VIDEO_START(funkybee)
274 	MDRV_VIDEO_UPDATE(funkybee)
275 
276 	/* sound hardware */
277 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
278 MACHINE_DRIVER_END
279 
280 
281 /***************************************************************************
282 
283   Game driver(s)
284 
285 ***************************************************************************/
286 
287 ROM_START( funkybee )
288 	ROM_REGION( 0x10000, REGION_CPU1, 0 )	/* 64k for code */
289 	ROM_LOAD( "funkybee.1",    0x0000, 0x1000, CRC(3372cb33) SHA1(09f2673cdeaadba8211d86a19e727aebb4d8be9d) )
290 	ROM_LOAD( "funkybee.3",    0x1000, 0x1000, CRC(7bf7c62f) SHA1(f8e5514c17fddb8ed95e5e18aab81ad0ebcc41af) )
291 	ROM_LOAD( "funkybee.2",    0x2000, 0x1000, CRC(8cc0fe8e) SHA1(416d97db0a2219ea46f2caa55787253e16a5ef32) )
292 	ROM_LOAD( "funkybee.4",    0x3000, 0x1000, CRC(1e1aac26) SHA1(a2974e6a8da5568f91aa44adb58941b0a60b1536) )
293 
294 	ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
295 	ROM_LOAD( "funkybee.5",    0x0000, 0x2000, CRC(86126655) SHA1(d91682121d7f6a70f10a946ab81b248cc29bdf8c) )
296 
297 	ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE )
298 	ROM_LOAD( "funkybee.6",    0x0000, 0x2000, CRC(5fffd323) SHA1(9de9c869bd1e2daab3b94275444ecbe904bcd6aa) )
299 
300 	ROM_REGION( 0x0020, REGION_PROMS, 0 )
301 	ROM_LOAD( "funkybee.clr",  0x0000, 0x0020, CRC(e2cf5fe2) SHA1(50b293f48f078cbcebccb045aa779ced2fb298c8) )
302 ROM_END
303 
304 ROM_START( skylancr )
305 	ROM_REGION( 0x10000, REGION_CPU1, 0 )	/* 64k for code */
306 	ROM_LOAD( "1.5a",          0x0000, 0x2000, CRC(82d55824) SHA1(5c457e720ac8611bea4bc7e63ba4ee1c11200471) )
307 	ROM_LOAD( "2.5c",          0x2000, 0x2000, CRC(dff3a682) SHA1(e3197e106c2c6d198d2769b63701222d48a196d1) )
308 	ROM_LOAD( "3.5d",          0x4000, 0x1000, CRC(7c006ee6) SHA1(22719d4d0ad5c4f534a1613e0d74cab73973bab7) )
309 
310 	ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
311 	ROM_LOAD( "4.6a",          0x0000, 0x2000, CRC(0f8ede07) SHA1(e04456fe12e2282191aee4823941f23ad8bda99d) )
312 
313 	ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE )
314 	ROM_LOAD( "5.6b",          0x0000, 0x2000, CRC(24cec070) SHA1(2b7977b07acbe1394765675cd469db13a3b495f2) )
315 
316 	ROM_REGION( 0x0020, REGION_PROMS, 0 )
317 	ROM_LOAD( "18s030.1a",     0x0000, 0x0020, CRC(e645bacb) SHA1(5f4c299c4cf165fd229731c0e5799a34892bf28e) )
318 ROM_END
319 
320 
321 
322 GAME( 1982, funkybee, 0, funkybee, funkybee, 0, ROT90, "Orca", "Funky Bee" )
323 GAME( 1983, skylancr, 0, funkybee, skylancr, 0, ROT90, "Orca (Esco Trading Co license)", "Sky Lancer" )
324