1 /***************************************************************************
2 
3 	Atari Quantum hardware
4 
5 	driver by Paul Forgey, with some help from Aaron Giles
6 
7 	Games supported:
8 		* Quantum
9 
10 	Known bugs:
11 		* none at this time
12 
13 ****************************************************************************
14 
15 	Memory map
16 
17 ****************************************************************************
18 
19 	QUANTUM MEMORY MAP (per schem):
20 
21 	000000-003FFF	ROM0
22 	004000-004FFF	ROM1
23 	008000-00BFFF	ROM2
24 	00C000-00FFFF	ROM3
25 	010000-013FFF	ROM4
26 
27 	018000-01BFFF	RAM0
28 	01C000-01CFFF	RAM1
29 
30 	940000			TRACKBALL
31 	948000			SWITCHES
32 	950000			COLORRAM
33 	958000			CONTROL (LED and coin control)
34 	960000-970000	RECALL (nvram read)
35 	968000			VGRST (vector reset)
36 	970000			VGGO (vector go)
37 	978000			WDCLR (watchdog)
38 	900000			NVRAM (nvram write)
39 	840000			I/OS (sound and dip switches)
40 	800000-801FFF	VMEM (vector display list)
41 	940000			I/O (shematic label really - covered above)
42 	900000			DTACK1
43 
44 ***************************************************************************/
45 
46 #include "driver.h"
47 #include "vidhrdw/vector.h"
48 #include "vidhrdw/avgdvg.h"
49 
50 
51 
52 /*************************************
53  *
54  *	Inputs
55  *
56  *************************************/
57 
READ16_HANDLER(switches_r)58 static READ16_HANDLER( switches_r )
59 {
60 	return (readinputport(0) | (avgdvg_done() ? 1 : 0));
61 }
62 
63 
READ16_HANDLER(trackball_r)64 static READ16_HANDLER( trackball_r )
65 {
66 	return (readinputport(4) << 4) | readinputport(3);
67 }
68 
69 
READ_HANDLER(input_1_r)70 static READ_HANDLER( input_1_r )
71 {
72 	return (readinputport(1) << (7 - (offset - POT0_C))) & 0x80;
73 }
74 
75 
READ_HANDLER(input_2_r)76 static READ_HANDLER( input_2_r )
77 {
78 	return (readinputport(2) << (7 - (offset - POT0_C))) & 0x80;
79 }
80 
81 
82 
83 /*************************************
84  *
85  *	LEDs/coin counters
86  *
87  *************************************/
88 
WRITE16_HANDLER(led_w)89 static WRITE16_HANDLER( led_w )
90 {
91 	if (ACCESSING_LSB)
92 	{
93 		/* bits 0 and 1 are coin counters */
94 		coin_counter_w(0, data & 2);
95 		coin_counter_w(1, data & 1);
96 
97 		/* bit 3 = select second trackball for cocktail mode? */
98 
99 		/* bits 4 and 5 are LED controls */
100 		set_led_status(0, data & 0x10);
101 		set_led_status(1, data & 0x20);
102 
103 		/* bits 6 and 7 flip screen */
104 		avg_set_flip_x (data & 0x40);
105 		avg_set_flip_y (data & 0x80);
106 	}
107 }
108 
109 
110 
111 /*************************************
112  *
113  *	POKEY I/O
114  *
115  *************************************/
116 
WRITE16_HANDLER(pokey_word_w)117 static WRITE16_HANDLER( pokey_word_w )
118 {
119 	if (offset & 0x10) /* A5 selects chip */
120 		pokey2_w(offset & 0x0f, data);
121 	else
122 		pokey1_w(offset & 0x0f, data);
123 }
124 
125 
READ16_HANDLER(pokey_word_r)126 static READ16_HANDLER( pokey_word_r )
127 {
128 	if (offset & 0x10)
129 		return pokey2_r(offset & 0x0f);
130 	else
131 		return pokey1_r(offset & 0x0f);
132 }
133 
134 
135 
136 /*************************************
137  *
138  *	Main CPU memory handlers
139  *
140  *************************************/
141 
MEMORY_READ16_START(readmem)142 MEMORY_READ16_START( readmem )
143 	{ 0x000000, 0x013fff, MRA16_ROM },
144 	{ 0x018000, 0x01cfff, MRA16_RAM },
145 	{ 0x800000, 0x801fff, MRA16_RAM },
146 	{ 0x840000, 0x84003f, pokey_word_r },
147 	{ 0x900000, 0x9001ff, MRA16_RAM },
148 	{ 0x940000, 0x940001, trackball_r }, /* trackball */
149 	{ 0x948000, 0x948001, switches_r },
150 	{ 0x978000, 0x978001, MRA16_NOP },	/* ??? */
151 MEMORY_END
152 
153 
154 MEMORY_WRITE16_START( writemem )
155 	{ 0x000000, 0x013fff, MWA16_ROM },
156 	{ 0x018000, 0x01cfff, MWA16_RAM },
157 	{ 0x800000, 0x801fff, MWA16_RAM, (data16_t **)&vectorram, &vectorram_size },
158 	{ 0x840000, 0x84003f, pokey_word_w },
159 	{ 0x900000, 0x9001ff, MWA16_RAM, (data16_t **)&generic_nvram, &generic_nvram_size },
160 	{ 0x950000, 0x95001f, quantum_colorram_w },
161 	{ 0x958000, 0x958001, led_w },
162 	{ 0x960000, 0x960001, MWA16_NOP },	/* enable NVRAM? */
163 	{ 0x968000, 0x968001, avgdvg_reset_word_w },
164 /*	{ 0x970000, 0x970001, avgdvg_go_w },*/
165 /*	{ 0x978000, 0x978001, watchdog_reset_w },*/
166 	/* the following is wrong, but it's the only way I found to fix the service mode */
167 	{ 0x978000, 0x978001, avgdvg_go_word_w },
168 MEMORY_END
169 
170 
171 
172 /*************************************
173  *
174  *	Port definitions
175  *
176  *************************************/
177 
178 INPUT_PORTS_START( quantum )
179 	PORT_START		/* IN0 */
180 	/* YHALT here MUST BE ALWAYS 0  */
181 	PORT_BIT( 0x01, IP_ACTIVE_HIGH,IPT_SPECIAL )	/* vg YHALT */
182 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 )
183 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
184 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
185 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
186 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
187 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
188 	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
189 
190 /* first POKEY is SW2, second is SW1 -- more confusion! */
191 	PORT_START 		/* DSW0 */
192 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coinage ) )
193 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) )
194 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
195 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_2C ) )
196 	PORT_DIPSETTING(    0x40, DEF_STR( Free_Play ) )
197 	PORT_DIPNAME( 0x30, 0x00, "Right Coin" )
198 	PORT_DIPSETTING(    0x00, "*1" )
199 	PORT_DIPSETTING(    0x20, "*4" )
200 	PORT_DIPSETTING(    0x10, "*5" )
201 	PORT_DIPSETTING(    0x30, "*6" )
202 	PORT_DIPNAME( 0x08, 0x00, "Left Coin" )
203 	PORT_DIPSETTING(    0x00, "*1" )
204 	PORT_DIPSETTING(    0x08, "*2" )
205 	PORT_DIPNAME( 0x07, 0x00, "Bonus Coins" )
206 	PORT_DIPSETTING(    0x00, "None" )
207 	PORT_DIPSETTING(    0x01, "1 each 5" )
208 	PORT_DIPSETTING(    0x02, "1 each 4" )
209 	PORT_DIPSETTING(    0x05, "1 each 3" )
210 	PORT_DIPSETTING(    0x06, "2 each 4" )
211 
212 	PORT_START		/* DSW1 */
213 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
214 
215 	PORT_START      /* IN2 */
216 	PORT_ANALOG( 0x0f, 0, IPT_TRACKBALL_Y | IPF_REVERSE, 10, 10, 0,0)
217 
218 	PORT_START      /* IN3 */
219 	PORT_ANALOG( 0x0f, 0, IPT_TRACKBALL_X, 10, 10, 0, 0 )
220 INPUT_PORTS_END
221 
222 
223 
224 /*************************************
225  *
226  *	Sound definitions
227  *
228  *************************************/
229 
230 static struct POKEYinterface pokey_interface =
231 {
232 	2,	/* 2 chips */
233 	600000,        /* .6 MHz? (hand tuned) */
234 	{ 50, 50 },
235 	/* The 8 pot handlers */
236 	{ input_1_r, input_2_r },
237 	{ input_1_r, input_2_r },
238 	{ input_1_r, input_2_r },
239 	{ input_1_r, input_2_r },
240 	{ input_1_r, input_2_r },
241 	{ input_1_r, input_2_r },
242 	{ input_1_r, input_2_r },
243 	{ input_1_r, input_2_r },
244 	/* The allpot handler */
245 	{ 0, 0 },
246 };
247 
248 
249 
250 /*************************************
251  *
252  *	Machine driver
253  *
254  *************************************/
255 
256 static MACHINE_DRIVER_START( quantum )
257 
258 	/* basic machine hardware */
259 	MDRV_CPU_ADD(M68000,6000000)
260 	MDRV_CPU_MEMORY(readmem,writemem)
261 	MDRV_CPU_VBLANK_INT(irq1_line_hold,3)	/* IRQ rate = 750kHz/4096 */
262 
263 	MDRV_FRAMES_PER_SECOND(60)
264 	MDRV_NVRAM_HANDLER(generic_1fill)
265 
266 	/* video hardware */
267 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_VECTOR | VIDEO_RGB_DIRECT)
268 	MDRV_SCREEN_SIZE(400, 300)
269 	MDRV_VISIBLE_AREA(0, 900, 0, 600)
270 	MDRV_PALETTE_LENGTH(32768)
271 
272 	MDRV_PALETTE_INIT(avg_multi)
273 	MDRV_VIDEO_START(avg_quantum)
274 	MDRV_VIDEO_UPDATE(vector)
275 
276 	/* sound hardware */
277 	MDRV_SOUND_ADD(POKEY, pokey_interface)
278 MACHINE_DRIVER_END
279 
280 
281 
282 /*************************************
283  *
284  *	ROM definition(s)
285  *
286  *************************************/
287 
288 ROM_START( quantum )
289 	ROM_REGION( 0x014000, REGION_CPU1, 0 )
290     ROM_LOAD16_BYTE( "136016.201",   0x000000, 0x002000, CRC(7e7be63a) SHA1(11b2d0168cdbaa7a48656b77abc0bcbe9408fe84) )
291     ROM_LOAD16_BYTE( "136016.206",   0x000001, 0x002000, CRC(2d8f5759) SHA1(54b0388ef44b5d34e621b48b465566aa16887e8f) )
292     ROM_LOAD16_BYTE( "136016.102",   0x004000, 0x002000, CRC(408d34f4) SHA1(9a30debd1240b9c103134701943c94d6b48b926d) )
293     ROM_LOAD16_BYTE( "136016.107",   0x004001, 0x002000, CRC(63154484) SHA1(c098cdbc339c9ea291c4c4fb203c60b3284e894a) )
294     ROM_LOAD16_BYTE( "136016.203",   0x008000, 0x002000, CRC(bdc52fad) SHA1(c8ede54a4f7f555adffa5b4bfea6bf646a0d02d4) )
295     ROM_LOAD16_BYTE( "136016.208",   0x008001, 0x002000, CRC(dab4066b) SHA1(dbb82df8e6de4e0f9f6e7ddd5f07618864fce8f9) )
296     ROM_LOAD16_BYTE( "136016.104",   0x00C000, 0x002000, CRC(bf271e5c) SHA1(012edb947f1437932b9283e49d025a7794c45669) )
297     ROM_LOAD16_BYTE( "136016.109",   0x00C001, 0x002000, CRC(d2894424) SHA1(5390025136b677b66d948c8cf6ea5e20203a4bae) )
298     ROM_LOAD16_BYTE( "136016.105",   0x010000, 0x002000, CRC(13ec512c) SHA1(22a0395135b83ba47eacb5129f34fc97aa1b70a1) )
299     ROM_LOAD16_BYTE( "136016.110",   0x010001, 0x002000, CRC(acb50363) SHA1(9efa9ca88efdd2d5e212bd537903892b67b4fe53) )
300 ROM_END
301 
302 
303 ROM_START( quantum1 )
304 	ROM_REGION( 0x014000, REGION_CPU1, 0 )
305     ROM_LOAD16_BYTE( "136016.101",   0x000000, 0x002000, CRC(5af0bd5b) SHA1(f6e46fbebbf52294e78ae240fe2628c6b29b8dea) )
306     ROM_LOAD16_BYTE( "136016.106",   0x000001, 0x002000, CRC(f9724666) SHA1(1bb073135029c92bef9afc9ccd910e0ab3302c8a) )
307     ROM_LOAD16_BYTE( "136016.102",   0x004000, 0x002000, CRC(408d34f4) SHA1(9a30debd1240b9c103134701943c94d6b48b926d) )
308     ROM_LOAD16_BYTE( "136016.107",   0x004001, 0x002000, CRC(63154484) SHA1(c098cdbc339c9ea291c4c4fb203c60b3284e894a) )
309     ROM_LOAD16_BYTE( "136016.103",   0x008000, 0x002000, CRC(948f228b) SHA1(878ac96173a793997cc88be469ec1ccdf833a7e8) )
310     ROM_LOAD16_BYTE( "136016.108",   0x008001, 0x002000, CRC(e4c48e4e) SHA1(caaf9d20741fcb961d590b634250a44a166cc33a) )
311     ROM_LOAD16_BYTE( "136016.104",   0x00C000, 0x002000, CRC(bf271e5c) SHA1(012edb947f1437932b9283e49d025a7794c45669) )
312     ROM_LOAD16_BYTE( "136016.109",   0x00C001, 0x002000, CRC(d2894424) SHA1(5390025136b677b66d948c8cf6ea5e20203a4bae) )
313     ROM_LOAD16_BYTE( "136016.105",   0x010000, 0x002000, CRC(13ec512c) SHA1(22a0395135b83ba47eacb5129f34fc97aa1b70a1) )
314     ROM_LOAD16_BYTE( "136016.110",   0x010001, 0x002000, CRC(acb50363) SHA1(9efa9ca88efdd2d5e212bd537903892b67b4fe53) )
315 ROM_END
316 
317 
318 ROM_START( quantump )
319 	ROM_REGION( 0x014000, REGION_CPU1, 0 )
320     ROM_LOAD16_BYTE( "quantump.2e",  0x000000, 0x002000, CRC(176d73d3) SHA1(b887ee50af5db6f6d43cc6ba57451173f996dedc) )
321     ROM_LOAD16_BYTE( "quantump.3e",  0x000001, 0x002000, CRC(12fc631f) SHA1(327a44da897199536f43e5f792cb4a18d9055ac4) )
322     ROM_LOAD16_BYTE( "quantump.2f",  0x004000, 0x002000, CRC(b64fab48) SHA1(d5a77a367d4f652261c381e6bdd55c2175ace857) )
323     ROM_LOAD16_BYTE( "quantump.3f",  0x004001, 0x002000, CRC(a52a9433) SHA1(33787adb04864efebb04483353bbc96c966ec607) )
324     ROM_LOAD16_BYTE( "quantump.2h",  0x008000, 0x002000, CRC(5b29cba3) SHA1(e83b68907bc397994ed51a39dfa241430a0adb0c) )
325     ROM_LOAD16_BYTE( "quantump.3h",  0x008001, 0x002000, CRC(c64fc03a) SHA1(ab6cd710d01bc85432cc52021f27fd8f2a5e3168) )
326     ROM_LOAD16_BYTE( "quantump.2k",  0x00C000, 0x002000, CRC(854f9c09) SHA1(d908b8c7f6837e511004cbd45a8883c6c7b155dd) )
327     ROM_LOAD16_BYTE( "quantump.3k",  0x00C001, 0x002000, CRC(1aac576c) SHA1(28bdb5fcbd8cccc657d6e00ace3c083c21015564) )
328     ROM_LOAD16_BYTE( "quantump.2l",  0x010000, 0x002000, CRC(1285b5e7) SHA1(0e01e361da2d9cf1fac1896f8f44c4c2e75a3061) )
329     ROM_LOAD16_BYTE( "quantump.3l",  0x010001, 0x002000, CRC(e19de844) SHA1(cb4f9d80807b26d6b95405b2d830799984667f54) )
330 ROM_END
331 
332 
333 
334 /*************************************
335  *
336  *	Game driver(s)
337  *
338  *************************************/
339 
340 GAME( 1982, quantum,  0,       quantum, quantum, 0, ROT270, "Atari", "Quantum (rev 2)" )
341 GAME( 1982, quantum1, quantum, quantum, quantum, 0, ROT270, "Atari", "Quantum (rev 1)" )
342 GAME( 1982, quantump, quantum, quantum, quantum, 0, ROT270, "Atari", "Quantum (prototype)" )
343