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