1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 /***************************************************************************
4 
5 Taxi Driver  (c) 1984 Graphic Techno
6 
7 XTAL:  10MHz, 8MHz
8 CPU:   3 * NEC D780C (clocks unknown)
9 SOUND: 2 * AY-3-8910 (clocks unknown)
10 OTHER: 5 * M5L8255AP
11 
12 ***************************************************************************/
13 
14 #include "emu.h"
15 #include "includes/taxidriv.h"
16 
17 #include "cpu/z80/z80.h"
18 #include "machine/i8255.h"
19 #include "sound/ay8910.h"
20 #include "screen.h"
21 #include "speaker.h"
22 
23 
machine_start()24 void taxidriv_state::machine_start()
25 {
26 	save_item(NAME(m_s1));
27 	save_item(NAME(m_s2));
28 	save_item(NAME(m_s3));
29 	save_item(NAME(m_s4));
30 	save_item(NAME(m_latchA));
31 	save_item(NAME(m_latchB));
32 	save_item(NAME(m_bghide));
33 	save_item(NAME(m_spritectrl));
34 }
35 
p2a_w(uint8_t data)36 void taxidriv_state::p2a_w(uint8_t data) { spritectrl_w(0,data); }
p2b_w(uint8_t data)37 void taxidriv_state::p2b_w(uint8_t data) { spritectrl_w(1,data); }
p2c_w(uint8_t data)38 void taxidriv_state::p2c_w(uint8_t data) { spritectrl_w(2,data); }
p3a_w(uint8_t data)39 void taxidriv_state::p3a_w(uint8_t data) { spritectrl_w(3,data); }
p3b_w(uint8_t data)40 void taxidriv_state::p3b_w(uint8_t data) { spritectrl_w(4,data); }
p3c_w(uint8_t data)41 void taxidriv_state::p3c_w(uint8_t data) { spritectrl_w(5,data); }
p4a_w(uint8_t data)42 void taxidriv_state::p4a_w(uint8_t data) { spritectrl_w(6,data); }
p4b_w(uint8_t data)43 void taxidriv_state::p4b_w(uint8_t data) { spritectrl_w(7,data); }
p4c_w(uint8_t data)44 void taxidriv_state::p4c_w(uint8_t data) { spritectrl_w(8,data); }
45 
46 
p0a_r()47 uint8_t taxidriv_state::p0a_r()
48 {
49 	return m_latchA;
50 }
51 
p0c_r()52 uint8_t taxidriv_state::p0c_r()
53 {
54 	return (m_s1 << 7);
55 }
56 
p0b_w(uint8_t data)57 void taxidriv_state::p0b_w(uint8_t data)
58 {
59 	m_latchB = data;
60 }
61 
p0c_w(uint8_t data)62 void taxidriv_state::p0c_w(uint8_t data)
63 {
64 	m_s2 = data & 1;
65 
66 	m_bghide = data & 2;
67 
68 	/* bit 2 toggles during gameplay */
69 
70 	flip_screen_set(data & 8);
71 
72 //  popmessage("%02x",data&0x0f);
73 }
74 
p1b_r()75 uint8_t taxidriv_state::p1b_r()
76 {
77 	return m_latchB;
78 }
79 
p1c_r()80 uint8_t taxidriv_state::p1c_r()
81 {
82 	return (m_s2 << 7) | (m_s4 << 6) | ((ioport("SERVCOIN")->read() & 1) << 4);
83 }
84 
p1a_w(uint8_t data)85 void taxidriv_state::p1a_w(uint8_t data)
86 {
87 	m_latchA = data;
88 }
89 
p1c_w(uint8_t data)90 void taxidriv_state::p1c_w(uint8_t data)
91 {
92 	m_s1 = data & 1;
93 	m_s3 = (data & 2) >> 1;
94 }
95 
p8910_0a_r()96 uint8_t taxidriv_state::p8910_0a_r()
97 {
98 	return m_latchA;
99 }
100 
p8910_1a_r()101 uint8_t taxidriv_state::p8910_1a_r()
102 {
103 	return m_s3;
104 }
105 
106 /* note that a lot of writes happen with port B set as input. I think this is a bug in the
107    original, since it works anyway even if the communication is flawed. */
p8910_0b_w(uint8_t data)108 void taxidriv_state::p8910_0b_w(uint8_t data)
109 {
110 	m_s4 = data & 1;
111 }
112 
main_map(address_map & map)113 void taxidriv_state::main_map(address_map &map)
114 {
115 	map(0x0000, 0x7fff).rom();
116 	map(0x8000, 0x8fff).ram(); /* ??? */
117 	map(0x9000, 0x9fff).ram(); /* ??? */
118 	map(0xa000, 0xafff).ram(); /* ??? */
119 	map(0xb000, 0xbfff).ram(); /* ??? */
120 	map(0xc000, 0xc7ff).ram().share("vram4");           /* radar bitmap */
121 	map(0xc800, 0xcfff).writeonly().share("vram5"); /* "sprite1" bitmap */
122 	map(0xd000, 0xd7ff).writeonly().share("vram6"); /* "sprite2" bitmap */
123 	map(0xd800, 0xdfff).ram().share("vram7"); /* "sprite3" bitmap */
124 	map(0xe000, 0xe3ff).ram().share("vram1"); /* car tilemap */
125 	map(0xe400, 0xebff).ram().share("vram2"); /* bg1 tilemap */
126 	map(0xec00, 0xefff).ram().share("vram0"); /* fg tilemap */
127 	map(0xf000, 0xf3ff).ram().share("vram3"); /* bg2 tilemap */
128 	map(0xf400, 0xf403).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
129 	map(0xf480, 0xf483).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write));    /* "sprite1" placement */
130 	map(0xf500, 0xf503).rw("ppi8255_3", FUNC(i8255_device::read), FUNC(i8255_device::write));    /* "sprite2" placement */
131 	map(0xf580, 0xf583).rw("ppi8255_4", FUNC(i8255_device::read), FUNC(i8255_device::write));    /* "sprite3" placement */
132 	//map(0xf780, 0xf781).writeonly();    /* more scroll registers? */
133 	map(0xf782, 0xf787).writeonly().share("scroll");    /* bg scroll (three copies always identical) */
134 	map(0xf800, 0xffff).ram();
135 }
136 
cpu2_map(address_map & map)137 void taxidriv_state::cpu2_map(address_map &map)
138 {
139 	map(0x0000, 0x3fff).rom();
140 	map(0x6000, 0x67ff).ram();
141 	map(0x8000, 0x87ff).ram();
142 	map(0xa000, 0xa003).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
143 	map(0xe000, 0xe000).portr("DSW0");
144 	map(0xe001, 0xe001).portr("DSW1");
145 	map(0xe002, 0xe002).portr("DSW2");
146 	map(0xe003, 0xe003).portr("P1");
147 	map(0xe004, 0xe004).portr("P2");
148 }
149 
cpu3_map(address_map & map)150 void taxidriv_state::cpu3_map(address_map &map)
151 {
152 	map(0x0000, 0x1fff).rom();
153 	map(0x2000, 0x2000).nopr(); /* irq ack? */
154 	map(0xfc00, 0xffff).ram();
155 }
156 
cpu3_port_map(address_map & map)157 void taxidriv_state::cpu3_port_map(address_map &map)
158 {
159 	map.global_mask(0xff);
160 	map(0x00, 0x01).w("ay1", FUNC(ay8910_device::address_data_w));
161 	map(0x01, 0x01).r("ay1", FUNC(ay8910_device::data_r));
162 	map(0x02, 0x03).w("ay2", FUNC(ay8910_device::address_data_w));
163 	map(0x03, 0x03).r("ay2", FUNC(ay8910_device::data_r));
164 }
165 
166 
167 static INPUT_PORTS_START( taxidriv )
168 	PORT_START("DSW0")
169 	PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) )
170 	PORT_DIPSETTING(    0x0d, DEF_STR( 4C_1C ) )
171 	PORT_DIPSETTING(    0x0a, DEF_STR( 3C_1C ) )
172 	PORT_DIPSETTING(    0x0e, DEF_STR( 4C_2C ) )
173 	PORT_DIPSETTING(    0x07, DEF_STR( 2C_1C ) )
174 	PORT_DIPSETTING(    0x0b, DEF_STR( 3C_2C ) )
175 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
176 	PORT_DIPSETTING(    0x0c, DEF_STR( 3C_4C ) )
177 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_3C ) )
178 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_2C ) )
179 	PORT_DIPSETTING(    0x09, DEF_STR( 2C_5C ) )
180 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_3C ) )
181 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_4C ) )
182 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_5C ) )
183 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_6C ) )
184 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_7C ) )
185 	PORT_DIPSETTING(    0x0f, DEF_STR( Free_Play ) )
186 	PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) )
187 	PORT_DIPSETTING(    0xd0, DEF_STR( 4C_1C ) )
188 	PORT_DIPSETTING(    0xa0, DEF_STR( 3C_1C ) )
189 	PORT_DIPSETTING(    0xe0, DEF_STR( 4C_2C ) )
190 	PORT_DIPSETTING(    0x70, DEF_STR( 2C_1C ) )
191 	PORT_DIPSETTING(    0xb0, DEF_STR( 3C_2C ) )
192 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
193 	PORT_DIPSETTING(    0xc0, DEF_STR( 3C_4C ) )
194 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_3C ) )
195 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
196 	PORT_DIPSETTING(    0x90, DEF_STR( 2C_5C ) )
197 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_3C ) )
198 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_4C ) )
199 	PORT_DIPSETTING(    0x40, DEF_STR( 1C_5C ) )
200 	PORT_DIPSETTING(    0x50, DEF_STR( 1C_6C ) )
201 	PORT_DIPSETTING(    0x60, DEF_STR( 1C_7C ) )
202 	PORT_DIPSETTING(    0xf0, DEF_STR( Free_Play ) )
203 
204 	PORT_START("DSW1")
205 	PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
206 	PORT_DIPSETTING(    0x00, "3" )
207 	PORT_DIPSETTING(    0x01, "4" )
208 	PORT_DIPSETTING(    0x02, "5" )
209 	PORT_DIPSETTING(    0x03, "255 (Cheat)")
210 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Cabinet ) )
211 	PORT_DIPSETTING(    0x04, DEF_STR( Upright ) )
212 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
213 	PORT_DIPNAME( 0x38, 0x00, DEF_STR( Unknown ) )
214 	PORT_DIPSETTING(    0x00, "1" )
215 	PORT_DIPSETTING(    0x08, "2" )
216 	PORT_DIPSETTING(    0x10, "3" )
217 	PORT_DIPSETTING(    0x18, "4" )
218 	PORT_DIPSETTING(    0x20, "5" )
219 	PORT_DIPSETTING(    0x28, "6" )
220 	PORT_DIPSETTING(    0x30, "7" )
221 	PORT_DIPSETTING(    0x38, "8" )
222 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
223 	PORT_DIPSETTING(    0x00, "0" )
224 	PORT_DIPSETTING(    0x40, "1" )
225 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
226 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
227 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
228 
229 	PORT_START("DSW2")
230 	PORT_DIPNAME( 0x07, 0x00, "Fuel Consumption" )
231 	PORT_DIPSETTING(    0x00, "Slowest" )
232 	PORT_DIPSETTING(    0x01, "2" )
233 	PORT_DIPSETTING(    0x02, "3" )
234 	PORT_DIPSETTING(    0x03, "4" )
235 	PORT_DIPSETTING(    0x04, "5" )
236 	PORT_DIPSETTING(    0x05, "6" )
237 	PORT_DIPSETTING(    0x06, "7" )
238 	PORT_DIPSETTING(    0x07, "Fastest" )
239 	PORT_DIPNAME( 0x38, 0x00, DEF_STR( Unknown ) )
240 	PORT_DIPSETTING(    0x00, "1" )
241 	PORT_DIPSETTING(    0x08, "2" )
242 	PORT_DIPSETTING(    0x10, "3" )
243 	PORT_DIPSETTING(    0x18, "4" )
244 	PORT_DIPSETTING(    0x20, "5" )
245 	PORT_DIPSETTING(    0x28, "6" )
246 	PORT_DIPSETTING(    0x30, "7" )
247 	PORT_DIPSETTING(    0x38, "8" )
248 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Unknown ) )
249 	PORT_DIPSETTING(    0x00, "40/30" )
250 	PORT_DIPSETTING(    0x40, "30/20" )
251 	PORT_DIPSETTING(    0x80, "20/15" )
252 	PORT_DIPSETTING(    0xc0, "10/10" )
253 
254 	PORT_START("P1")
255 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
256 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 )
257 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
258 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
259 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY
260 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY
261 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY
262 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY
263 
264 	PORT_START("P2")
265 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 )
266 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
267 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL
268 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
269 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL
270 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
271 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
272 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
273 
274 	PORT_START("SERVCOIN")
275 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )   /* handled by p1c_r() */
276 INPUT_PORTS_END
277 
278 
279 
280 static const gfx_layout charlayout =
281 {
282 	8,8,
283 	RGN_FRAC(1,1),
284 	4,
285 	{ 0, 1, 2, 3 },
286 	{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
287 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
288 	32*8
289 };
290 
291 static const gfx_layout charlayout2 =
292 {
293 	4,4,
294 	RGN_FRAC(1,1),
295 	4,
296 	{ 0, 1, 2, 3 },
297 	{ 1*4, 0*4, 3*4, 2*4 },
298 	{ 0*16, 1*16, 2*16, 3*16 },
299 	16*4
300 };
301 
302 
303 static GFXDECODE_START( gfx_taxidriv )
304 	GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 )
305 	GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 1 )
306 	GFXDECODE_ENTRY( "gfx3", 0, charlayout, 0, 1 )
307 	GFXDECODE_ENTRY( "gfx4", 0, charlayout, 0, 1 )
308 	GFXDECODE_ENTRY( "gfx5", 0, charlayout2, 0, 1 )
309 GFXDECODE_END
310 
taxidriv_palette(palette_device & palette) const311 void taxidriv_state::taxidriv_palette(palette_device &palette) const
312 {
313 	uint8_t const *const color_prom = memregion("proms")->base();
314 
315 	// TODO: resistors, 1k & 470
316 	for (int i = 0; i < 0x10; ++i)
317 	{
318 		int bit0, bit1;
319 
320 		bit0 = BIT(color_prom[i], 0);
321 		bit1 = BIT(color_prom[i], 1);
322 		int const r = 0x55 * bit0 + 0xaa * bit1;
323 		bit0 = BIT(color_prom[i], 2);
324 		bit1 = BIT(color_prom[i], 3);
325 		int const g = 0x55 * bit0 + 0xaa * bit1;
326 		bit0 = BIT(color_prom[i], 4);
327 		bit1 = BIT(color_prom[i], 5);
328 		int const b = 0x55 * bit0 + 0xaa * bit1;
329 
330 		palette.set_pen_color(i, rgb_t(r, g, b));
331 	}
332 }
333 
taxidriv(machine_config & config)334 void taxidriv_state::taxidriv(machine_config &config)
335 {
336 	/* basic machine hardware */
337 	Z80(config, m_maincpu, 4000000);    /* 4 MHz ??? */
338 	m_maincpu->set_addrmap(AS_PROGRAM, &taxidriv_state::main_map);
339 	m_maincpu->set_vblank_int("screen", FUNC(taxidriv_state::irq0_line_hold));
340 
341 	z80_device &subcpu(Z80(config, "sub", 4000000));    /* 4 MHz ??? */
342 	subcpu.set_addrmap(AS_PROGRAM, &taxidriv_state::cpu2_map);
343 	subcpu.set_vblank_int("screen", FUNC(taxidriv_state::irq0_line_hold));   /* ??? */
344 
345 	z80_device &audiocpu(Z80(config, "audiocpu", 4000000));   /* 4 MHz ??? */
346 	audiocpu.set_addrmap(AS_PROGRAM, &taxidriv_state::cpu3_map);
347 	audiocpu.set_addrmap(AS_IO, &taxidriv_state::cpu3_port_map);
348 	audiocpu.set_vblank_int("screen", FUNC(taxidriv_state::irq0_line_hold));   /* ??? */
349 
350 	config.set_maximum_quantum(attotime::from_hz(6000));  /* 100 CPU slices per frame - a high value to ensure proper */
351 							/* synchronization of the CPUs */
352 
353 	i8255_device &ppi0(I8255A(config, "ppi8255_0"));
354 	ppi0.in_pa_callback().set(FUNC(taxidriv_state::p0a_r));
355 	ppi0.out_pb_callback().set(FUNC(taxidriv_state::p0b_w));
356 	ppi0.in_pc_callback().set(FUNC(taxidriv_state::p0c_r));
357 	ppi0.out_pc_callback().set(FUNC(taxidriv_state::p0c_w));
358 
359 	i8255_device &ppi1(I8255A(config, "ppi8255_1"));
360 	ppi1.out_pa_callback().set(FUNC(taxidriv_state::p1a_w));
361 	ppi1.in_pb_callback().set(FUNC(taxidriv_state::p1b_r));
362 	ppi1.in_pc_callback().set(FUNC(taxidriv_state::p1c_r));
363 	ppi1.out_pc_callback().set(FUNC(taxidriv_state::p1c_w));
364 
365 	i8255_device &ppi2(I8255A(config, "ppi8255_2"));
366 	ppi2.out_pa_callback().set(FUNC(taxidriv_state::p2a_w));
367 	ppi2.out_pb_callback().set(FUNC(taxidriv_state::p2b_w));
368 	ppi2.out_pc_callback().set(FUNC(taxidriv_state::p2c_w));
369 
370 	i8255_device &ppi3(I8255A(config, "ppi8255_3"));
371 	ppi3.out_pa_callback().set(FUNC(taxidriv_state::p3a_w));
372 	ppi3.out_pb_callback().set(FUNC(taxidriv_state::p3b_w));
373 	ppi3.out_pc_callback().set(FUNC(taxidriv_state::p3c_w));
374 
375 	i8255_device &ppi4(I8255A(config, "ppi8255_4"));
376 	ppi4.out_pa_callback().set(FUNC(taxidriv_state::p4a_w));
377 	ppi4.out_pb_callback().set(FUNC(taxidriv_state::p4b_w));
378 	ppi4.out_pc_callback().set(FUNC(taxidriv_state::p4c_w));
379 
380 	/* video hardware */
381 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
382 	screen.set_refresh_hz(60);
383 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
384 	screen.set_size(32*8, 32*8);
385 	screen.set_visarea(0*8, 32*8-1, 1*8, 27*8-1);
386 	screen.set_screen_update(FUNC(taxidriv_state::screen_update));
387 	screen.set_palette(m_palette);
388 
389 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_taxidriv);
390 	PALETTE(config, m_palette, FUNC(taxidriv_state::taxidriv_palette), 16);
391 
392 	/* sound hardware */
393 	SPEAKER(config, "mono").front_center();
394 
395 	ay8910_device &ay1(AY8910(config, "ay1", 1250000));
396 	ay1.port_a_read_callback().set(FUNC(taxidriv_state::p8910_0a_r));
397 	ay1.port_b_write_callback().set(FUNC(taxidriv_state::p8910_0b_w));
398 	ay1.add_route(ALL_OUTPUTS, "mono", 0.25);
399 
400 	ay8910_device &ay2(AY8910(config, "ay2", 1250000));
401 	ay2.port_a_read_callback().set(FUNC(taxidriv_state::p8910_1a_r));
402 	ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
403 }
404 
405 
406 
407 /***************************************************************************
408 
409   Game driver(s)
410 
411 ***************************************************************************/
412 
413 ROM_START( taxidriv )
414 	ROM_REGION( 0x10000, "maincpu", 0 )
415 	ROM_LOAD( "1.ic87",       0x0000, 0x2000, CRC(6b2424e9) SHA1(a65bb01da8f3b0649d945981cc4f1324b7fac5c7) )
416 	ROM_LOAD( "2.ic86",       0x2000, 0x2000, CRC(15111229) SHA1(0350918f9504b0e470684ebc94a823bb2513a54d) )
417 	ROM_LOAD( "3.ic85",       0x4000, 0x2000, CRC(a7782eee) SHA1(0f10b7876420f4237937b1b922aa410de3f79af1) )
418 	ROM_LOAD( "4.ic84",       0x6000, 0x2000, CRC(8eb0b16b) SHA1(a0015744373ee91bc505f077a04ab3546f8bb6fb) )
419 
420 	ROM_REGION( 0x10000, "sub", 0 )
421 	ROM_LOAD( "8.ic4",        0x0000, 0x2000, CRC(9f9a3865) SHA1(908cf4f2cc68c088649241997276ea25c27d9718) )
422 //  ROM_LOAD( "8.ic4",        0x0000, 0x2000, CRC(9835d517) SHA1(845f3efc54b64837c22dd06683c2950f2b8b03cb) ) // 0x1b5f = 0x04 instead of 0x03 from another set
423 	ROM_LOAD( "9.ic5",        0x2000, 0x2000, CRC(b28b766c) SHA1(21e08ef1e2671c8540380e3fa0858e8a4d821945) )
424 
425 	ROM_REGION( 0x10000, "audiocpu", 0 )
426 	ROM_LOAD( "7.ic14",       0x0000, 0x2000, CRC(2b4cbfe6) SHA1(a2a900831116554d5aea1a81c93245d3bb424d48) )
427 
428 	ROM_REGION( 0x2000, "gfx1", 0 )
429 	ROM_LOAD( "5.m.ic68",     0x0000, 0x2000, CRC(a3aa5f2f) SHA1(7e046e2a5d230c62d93a83f5a773e6e4d6e85961) )
430 
431 	ROM_REGION( 0x2000, "gfx2", 0 )
432 	ROM_LOAD( "6.1.ic35",     0x0000, 0x2000, CRC(bfddd550) SHA1(f528c2701c635bc61eda14fbe2cfe9b44cb75c20) )
433 
434 	ROM_REGION( 0x6000, "gfx3", 0 )
435 	ROM_LOAD( "11.30.ic87",   0x0000, 0x2000, CRC(7485eaea) SHA1(8d69c61145470003cfeb33b11b81345c5e5e6503) )
436 	ROM_LOAD( "14.31.ic110",  0x2000, 0x2000, CRC(0d99a33e) SHA1(0df29464ea43aecd866ae322f4f7ca9152422023) )
437 	ROM_LOAD( "15.32.ic111",  0x4000, 0x2000, CRC(410fdf7c) SHA1(0957f335b84c4fbde983271786e7bf199fc22682) )
438 
439 	ROM_REGION( 0x2000, "gfx4", 0 )
440 	ROM_LOAD( "10.40.ic99",   0x0000, 0x2000, CRC(c370b177) SHA1(4b3f73f764ff95cc7777fe01333558201658cead) )
441 
442 	ROM_REGION( 0x4000, "gfx5", 0 ) /* not used?? */
443 	ROM_LOAD( "12.21.ic88",   0x0000, 0x2000, CRC(684b7bb0) SHA1(d83c45ff3adf94c649340227794020482231399f) )
444 	ROM_LOAD( "13.20.ic89",   0x2000, 0x2000, CRC(d1ef110e) SHA1(e34b6b4b70c783a8cf1296a05d3cec6af5820d0c) )
445 
446 	ROM_REGION( 0x020, "proms", 0 )
447 	ROM_LOAD( "tbp18s030.ic2",  0x0000, 0x020, CRC(c366a9c5) SHA1(d38581e5c425cab4a4f216d99651e86d8034a7d2) ) // color prom located at edge of pcb
448 ROM_END
449 
450 
451 GAME( 1984, taxidriv,  0,        taxidriv, taxidriv, taxidriv_state, empty_init, ROT90, "Graphic Techno", "Taxi Driver", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
452