1 // FB Alpha tempest driver module
2 // Based on MAME driver by Brad Oliver, Bernd Wiebelt, Allard van der Bas
3 
4 #include "tiles_generic.h"
5 #include "m6502_intf.h"
6 #include "burn_gun.h"
7 #include "mathbox.h"
8 #include "vector.h"
9 #include "avgdvg.h"
10 #include "pokey.h"
11 #include "watchdog.h"
12 #include "earom.h"
13 
14 static UINT8 *AllMem;
15 static UINT8 *MemEnd;
16 static UINT8 *AllRam;
17 static UINT8 *RamEnd;
18 static UINT8 *DrvM6502ROM;
19 static UINT8 *DrvAVGPROM;
20 static UINT8 *DrvM6502RAM;
21 static UINT8 *DrvVecRAM;
22 static UINT8 *DrvVecROM;
23 static UINT8 *DrvColRAM;
24 
25 static UINT32 *DrvPalette;
26 static UINT8 DrvRecalc;
27 
28 static INT32 nExtraCycles;
29 
30 static UINT8 DrvJoy1[8] =   { 0, 0, 0, 0, 0, 0, 0, 0 };
31 static UINT8 DrvJoy3[8] =   { 0, 0, 0, 0, 0, 0, 0, 0 };
32 static UINT8 DrvJoy4f[8] =  { 0, 0, 0, 0, 0, 0, 0, 0 };
33 static UINT8 DrvDips[6] =   { 0, 0, 0, 0, 0, 0 };
34 static UINT8 DrvInputs[3] = { 0, 0, 0 };
35 static UINT8 DrvReset;
36 
37 static INT16 DrvAnalogPort0 = 0;
38 static INT16 DrvAnalogPort1 = 0;
39 
40 static UINT8 player = 0;
41 
42 static UINT32 small_roms = 0;
43 
44 #define A(a, b, c, d) {a, b, (UINT8*)(c), d}
45 static struct BurnInputInfo TempestInputList[] = {
46 	{"P1 Coin",		    BIT_DIGITAL,	DrvJoy1 + 2,	"p1 coin"	},
47 	{"P1 Start",		BIT_DIGITAL,	DrvJoy3 + 5,	"p1 start"	},
48 	{"P1 Left",		    BIT_DIGITAL,	DrvJoy4f+ 0,	"p1 left"	},
49 	{"P1 Right",		BIT_DIGITAL,	DrvJoy4f+ 1,	"p1 right"	},
50 	{"P1 Button 1",		BIT_DIGITAL,	DrvJoy3 + 4,	"p1 fire 1"	},
51 	{"P1 Button 2",		BIT_DIGITAL,	DrvJoy3 + 3,	"p1 fire 2"	},
52 	A("P1 Spinner",     BIT_ANALOG_REL, &DrvAnalogPort0,"p1 x-axis"),
53 
54 	{"P2 Coin",		    BIT_DIGITAL,	DrvJoy1 + 1,	"p2 coin"	},
55 	{"P2 Start",		BIT_DIGITAL,	DrvJoy3 + 6,	"p2 start"	},
56 	{"P2 Left",		    BIT_DIGITAL,	DrvJoy4f+ 2,	"p2 left"	},
57 	{"P2 Right",		BIT_DIGITAL,	DrvJoy4f+ 3,	"p2 right"	},
58 	{"P2 Button 1",		BIT_DIGITAL,	DrvJoy4f+ 4,	"p2 fire 1"	},
59 	{"P2 Button 2",		BIT_DIGITAL,	DrvJoy4f+ 5,	"p2 fire 2"	},
60 	A("P2 Spinner",     BIT_ANALOG_REL, &DrvAnalogPort1,"p2 x-axis"),
61 
62 	{"Reset",		        BIT_DIGITAL,	&DrvReset,	"reset"		},
63 	{"Diagnostic Step",		BIT_DIGITAL,	DrvJoy1 + 5,	"service2"	},
64 	{"Tilt",		        BIT_DIGITAL,	DrvJoy1 + 3,	"tilt"		},
65 	{"Dip A",		        BIT_DIPSWITCH,	DrvDips + 0,	"dip"		},
66 	{"Dip B",		        BIT_DIPSWITCH,	DrvDips + 1,	"dip"		},
67 	{"Dip C",		        BIT_DIPSWITCH,	DrvDips + 2,	"dip"		},
68 	{"Dip D",		        BIT_DIPSWITCH,	DrvDips + 3,	"dip"		},
69 	{"Dip E",		        BIT_DIPSWITCH,	DrvDips + 4,	"dip"		},
70 	{"Dip F",		        BIT_DIPSWITCH,	DrvDips + 5,	"dip"		},
71 };
72 #undef A
73 STDINPUTINFO(Tempest)
74 
75 static struct BurnDIPInfo TempestDIPList[]=
76 {
77 	DIP_OFFSET(0x11)
78 	{0x00, 0xff, 0xff, 0x10, NULL				    },
79 	{0x01, 0xff, 0xff, 0x07, NULL				    },
80 	{0x02, 0xff, 0xff, 0x00, NULL				    },
81 	{0x03, 0xff, 0xff, 0x00, NULL				    },
82 	{0x04, 0xff, 0xff, 0x10, NULL				    },
83 	{0x05, 0xff, 0xff, 0x00, NULL				    },
84 
85 	{0   , 0xfe, 0   ,    2, "Cabinet"			    },
86 	{0x00, 0x01, 0x10, 0x10, "Upright"			    },
87 	{0x00, 0x01, 0x10, 0x00, "Cocktail"			    },
88 
89 	{0   , 0xfe, 0   ,    4, "Difficulty"			},
90 	{0x01, 0x01, 0x03, 0x02, "Easy"				    },
91 	{0x01, 0x01, 0x03, 0x03, "Medium1"			    },
92 	{0x01, 0x01, 0x03, 0x00, "Medium2"			    },
93 	{0x01, 0x01, 0x03, 0x01, "Hard"					},
94 
95 	{0   , 0xfe, 0   ,    2, "Rating"			    },
96 	{0x01, 0x01, 0x04, 0x04, "1, 3, 5, 7, 9"		},
97 	{0x01, 0x01, 0x04, 0x00, "tied to high score"	},
98 
99 	{0   , 0xfe, 0   ,    4, "Coinage"			    },
100 	{0x02, 0x01, 0x03, 0x01, "2 Coins 1 Credits"	},
101 	{0x02, 0x01, 0x03, 0x00, "1 Coin  1 Credits"	},
102 	{0x02, 0x01, 0x03, 0x03, "1 Coin  2 Credits"	},
103 	{0x02, 0x01, 0x03, 0x02, "Free Play"			},
104 
105 	{0   , 0xfe, 0   ,    4, "Right Coin"			},
106 	{0x02, 0x01, 0x0c, 0x00, "*1"				    },
107 	{0x02, 0x01, 0x0c, 0x04, "*4"				    },
108 	{0x02, 0x01, 0x0c, 0x08, "*5"				    },
109 	{0x02, 0x01, 0x0c, 0x0c, "*6"				    },
110 
111 	{0   , 0xfe, 0   ,    2, "Left Coin"			},
112 	{0x02, 0x01, 0x10, 0x00, "*1"				    },
113 	{0x02, 0x01, 0x10, 0x10, "*2"				    },
114 
115 	{0   , 0xfe, 0   ,    8, "Bonus Coins"			},
116 	{0x02, 0x01, 0xe0, 0x00, "None"				    },
117 	{0x02, 0x01, 0xe0, 0x80, "1 each 5"			    },
118 	{0x02, 0x01, 0xe0, 0x40, "1 each 4 (+Demo)"		},
119 	{0x02, 0x01, 0xe0, 0xa0, "1 each 3"			    },
120 	{0x02, 0x01, 0xe0, 0x60, "2 each 4 (+Demo)"		},
121 	{0x02, 0x01, 0xe0, 0x20, "1 each 2"			    },
122 	{0x02, 0x01, 0xe0, 0xc0, "Freeze Mode"			},
123 	{0x02, 0x01, 0xe0, 0xe0, "Freeze Mode"			},
124 
125 	{0   , 0xfe, 0   ,    2, "Minimum"			    },
126 	{0x03, 0x01, 0x01, 0x00, "1 Credit"			    },
127 	{0x03, 0x01, 0x01, 0x01, "2 Credit"			    },
128 
129 	{0   , 0xfe, 0   ,    4, "Language"			    },
130 	{0x03, 0x01, 0x06, 0x00, "English"			    },
131 	{0x03, 0x01, 0x06, 0x02, "French"			    },
132 	{0x03, 0x01, 0x06, 0x04, "German"			    },
133 	{0x03, 0x01, 0x06, 0x06, "Spanish"			    },
134 
135 	{0   , 0xfe, 0   ,    8, "Bonus Life"			},
136 	{0x03, 0x01, 0x38, 0x08, "10000"			    },
137 	{0x03, 0x01, 0x38, 0x00, "20000"			    },
138 	{0x03, 0x01, 0x38, 0x10, "30000"			    },
139 	{0x03, 0x01, 0x38, 0x18, "40000"			    },
140 	{0x03, 0x01, 0x38, 0x20, "50000"			    },
141 	{0x03, 0x01, 0x38, 0x28, "60000"			    },
142 	{0x03, 0x01, 0x38, 0x30, "70000"			    },
143 	{0x03, 0x01, 0x38, 0x38, "None"				    },
144 
145 	{0   , 0xfe, 0   ,    4, "Lives"			    },
146 	{0x03, 0x01, 0xc0, 0xc0, "2"				    },
147 	{0x03, 0x01, 0xc0, 0x00, "3"				    },
148 	{0x03, 0x01, 0xc0, 0x40, "4"				    },
149 	{0x03, 0x01, 0xc0, 0x80, "5"				    },
150 
151 	{0   , 0xfe, 0   ,    2, "Service Mode"			},
152 	{0x04, 0x01, 0x10, 0x10, "Off"  		        },
153 	{0x04, 0x01, 0x10, 0x00, "On"   	            },
154 
155 	{0   , 0xfe, 0   ,    2, "Hires Mode"			},
156 	{0x05, 0x01, 0x01, 0x00, "No"  		        	},
157 	{0x05, 0x01, 0x01, 0x01, "Yes"   	            },
158 };
159 
STDDIPINFO(Tempest)160 STDDIPINFO(Tempest)
161 
162 static UINT8 tempest_read(UINT16 address)
163 {
164 	if (address >= 0x60c0 && address <= 0x60cf) {
165 		return pokey1_r(address & 0x0f);
166 	}
167 
168 	if (address >= 0x60d0 && address <= 0x60df) {
169 		return pokey2_r(address & 0x0f);
170 	}
171 
172 	switch (address)
173 	{
174 		case 0x0c00: {
175 			UINT8 temp = DrvInputs[0] & 0x3f;
176 			if (avgdvg_done()) temp |= 0x40;
177 			if (M6502TotalCycles() & 0x100) temp |= 0x80;
178 			return temp;
179 		}
180 
181 		case 0x0d00:
182 			return DrvDips[2];
183 
184 		case 0x0e00:
185 			return DrvDips[3];
186 
187 		case 0x6040:
188 			return mathbox_status_read();
189 
190 		case 0x6050:
191 			return earom_read(address);
192 
193 		case 0x6060:
194 			return mathbox_lo_read();
195 
196 		case 0x6070:
197 			return mathbox_hi_read();
198 	}
199 
200 	return 0;
201 }
202 
tempest_write(UINT16 address,UINT8 data)203 static void tempest_write(UINT16 address, UINT8 data)
204 {
205 	if (address >= 0x0800 && address <= 0x080f) {
206 		DrvColRAM[address & 0x0f] = data;
207 		DrvRecalc = 1;
208 		return;
209 	}
210 
211 	if (address >= 0x60c0 && address <= 0x60cf) {
212 		pokey1_w(address & 0x0f, data);
213 		return;
214 	}
215 
216 	if (address >= 0x60d0 && address <= 0x60df) {
217 		pokey2_w(address & 0x0f, data);
218 		return;
219 	}
220 	if (address >= 0x6000 && address <= 0x603f) {
221 		earom_write(address & 0x3f, data);
222 		return;
223 	}
224 
225 	if (address >= 0x6080 && address <= 0x609f) {
226 		mathbox_go_write(address & 0x1f, data);
227 		return;
228 	}
229 
230 	switch (address)
231 	{
232 		case 0x4000:
233 			avg_set_flip_x(data & 0x08);
234 			avg_set_flip_y(data & 0x10);
235 		return;
236 
237 		case 0x4800:
238 			avgdvg_go();
239 		return;
240 
241 		case 0x5000:
242 			M6502SetIRQLine(0, CPU_IRQSTATUS_NONE);
243 			BurnWatchdogRead();
244 		return;
245 
246 		case 0x5800:
247 			avgdvg_reset();
248 		return;
249 
250 		case 0x6040:
251 			earom_ctrl_write(address, data);
252 		return;
253 
254 		case 0x60e0:
255 			player = (data & 0x04) >> 2;
256 		return;
257 	}
258 }
259 
res_check()260 static INT32 res_check()
261 {
262 	if (DrvDips[5] & 1) {
263 		INT32 Width, Height;
264 		BurnDrvGetVisibleSize(&Width, &Height);
265 
266 		if (Height != 1080) {
267 			vector_rescale((1080*480/640), 1080);
268 			return 1;
269 		}
270 	} else {
271 		INT32 Width, Height;
272 		BurnDrvGetVisibleSize(&Width, &Height);
273 
274 		if (Height != 640) {
275 			vector_rescale(480, 640);
276 			return 1;
277 		}
278 	}
279 	return 0;
280 }
281 
DrvDoReset(INT32 clear_mem)282 static INT32 DrvDoReset(INT32 clear_mem)
283 {
284 	if (clear_mem) {
285 		memset (AllRam, 0, RamEnd - AllRam);
286 	}
287 
288 	M6502Open(0);
289 	M6502Reset();
290 	M6502Close();
291 
292 	PokeyReset();
293 
294 	BurnWatchdogReset();
295 
296 	mathbox_reset();
297 	avgdvg_reset();
298 
299 	earom_reset();
300 
301 	nExtraCycles = 0;
302 
303 	res_check();
304 
305 	return 0;
306 }
307 
port1_read(INT32 offset)308 static INT32 port1_read(INT32 offset)
309 {
310 	return (DrvInputs[1] & (1 << (offset & 7))) ? 0 : 228;
311 }
312 
port2_read(INT32 offset)313 static INT32 port2_read(INT32 offset)
314 {
315 	return (DrvInputs[2] & (1 << (offset & 7))) ? 0 : 228;
316 }
317 
MemIndex()318 static INT32 MemIndex()
319 {
320 	UINT8 *Next; Next = AllMem;
321 
322 	DrvM6502ROM		= Next; Next += 0x010000;
323 
324 	DrvAVGPROM		= Next; Next += 0x000100;
325 
326 	DrvPalette		= (UINT32*)Next; Next += 0x0040 * 256 * sizeof(UINT32);
327 
328 	AllRam			= Next;
329 
330 	DrvM6502RAM		= Next; Next += 0x000800;
331 	DrvColRAM		= Next; Next += 0x000010;
332 	DrvVecRAM       = Next; Next += 0x001000;
333 
334 	RamEnd			= Next;
335 
336 	DrvVecROM       = Next; Next += 0x001000; // must(!) come after DrvVecRAM
337 
338 	MemEnd			= Next;
339 
340 	return 0;
341 }
342 
DrvInit()343 static INT32 DrvInit()
344 {
345 	BurnAllocMemIndex();
346 
347 	{
348 		if (small_roms) {
349 			if (BurnLoadRom(DrvM6502ROM + 0x9000,  0, 1)) return 1;
350 			if (BurnLoadRom(DrvM6502ROM + 0x9800,  1, 1)) return 1;
351 			if (BurnLoadRom(DrvM6502ROM + 0xa000,  2, 1)) return 1;
352 			if (BurnLoadRom(DrvM6502ROM + 0xa800,  3, 1)) return 1;
353 			if (BurnLoadRom(DrvM6502ROM + 0xb000,  4, 1)) return 1;
354 			if (BurnLoadRom(DrvM6502ROM + 0xb800,  5, 1)) return 1;
355 			if (BurnLoadRom(DrvM6502ROM + 0xc000,  6, 1)) return 1;
356 			if (BurnLoadRom(DrvM6502ROM + 0xc800,  7, 1)) return 1;
357 			if (BurnLoadRom(DrvM6502ROM + 0xd000,  8, 1)) return 1;
358 			if (BurnLoadRom(DrvM6502ROM + 0xd800,  9, 1)) return 1;
359 			if (BurnLoadRom(DrvM6502ROM + 0xf800,  9, 1)) return 1;
360 
361 			if (BurnLoadRom(DrvVecROM   + 0x0000, 10, 1)) return 1;
362 			if (BurnLoadRom(DrvVecROM   + 0x0800, 11, 1)) return 1;
363 
364 			if (BurnLoadRom(DrvAVGPROM  + 0x0000, 12, 1)) return 1;
365 		} else {
366 			if (BurnLoadRom(DrvM6502ROM + 0x9000,  0, 1)) return 1;
367 			if (BurnLoadRom(DrvM6502ROM + 0xa000,  1, 1)) return 1;
368 			if (BurnLoadRom(DrvM6502ROM + 0xb000,  2, 1)) return 1;
369 			if (BurnLoadRom(DrvM6502ROM + 0xc000,  3, 1)) return 1;
370 			if (BurnLoadRom(DrvM6502ROM + 0xd000,  4, 1)) return 1;
371 			if (BurnLoadRom(DrvM6502ROM + 0xf000,  4, 1)) return 1;
372 
373 			if (BurnLoadRom(DrvVecROM   + 0x0000,  5, 1)) return 1;
374 
375 			if (BurnLoadRom(DrvAVGPROM  + 0x0000,  6, 1)) return 1;
376 		}
377 	}
378 
379 	M6502Init(0, TYPE_M6502);
380 	M6502Open(0);
381 	M6502MapMemory(DrvM6502RAM,		        0x0000, 0x07ff, MAP_RAM);
382 	M6502MapMemory(DrvVecRAM,		        0x2000, 0x2fff, MAP_RAM);
383 	M6502MapMemory(DrvVecROM,               0x3000, 0x3fff, MAP_ROM);
384 	M6502MapMemory(DrvM6502ROM + 0x9000,	0x9000, 0xffff, MAP_ROM);
385 	M6502SetWriteHandler(tempest_write);
386 	M6502SetReadHandler(tempest_read);
387 	M6502Close();
388 
389 	BurnWatchdogInit(DrvDoReset, 180);
390 
391 	PokeyInit(12096000/8, 2, 1.40, 0);
392 	PokeySetTotalCyclesCB(M6502TotalCycles);
393 	PokeyPotCallback(0, 0, port1_read);
394 	PokeyPotCallback(0, 1, port1_read);
395 	PokeyPotCallback(0, 2, port1_read);
396 	PokeyPotCallback(0, 3, port1_read);
397 	PokeyPotCallback(0, 4, port1_read);
398 	PokeyPotCallback(0, 5, port1_read);
399 	PokeyPotCallback(0, 6, port1_read);
400 	PokeyPotCallback(0, 7, port1_read);
401 
402 	PokeyPotCallback(1, 0, port2_read);
403 	PokeyPotCallback(1, 1, port2_read);
404 	PokeyPotCallback(1, 2, port2_read);
405 	PokeyPotCallback(1, 3, port2_read);
406 	PokeyPotCallback(1, 4, port2_read);
407 	PokeyPotCallback(1, 5, port2_read);
408 	PokeyPotCallback(1, 6, port2_read);
409 	PokeyPotCallback(1, 7, port2_read);
410 
411 	avgdvg_init(USE_AVG_TEMPEST, DrvVecRAM, 0x2000, M6502TotalCycles, 580, 570);
412 
413 	earom_init();
414 
415 	BurnTrackballInit(2);
416 
417 	DrvDoReset(1);
418 
419 	return 0;
420 }
421 
DrvExit()422 static INT32 DrvExit()
423 {
424 	avgdvg_exit();
425 
426 	PokeyExit();
427 	M6502Exit();
428 
429 	small_roms = 0;
430 
431 	BurnTrackballExit();
432 	// mathboxexit() ?
433 	earom_exit();
434 
435 	BurnFreeMemIndex();
436 
437 	return 0;
438 }
439 
DrvPaletteInit()440 static void DrvPaletteInit()
441 {
442     for (INT32 i = 0; i < 0x40; i++) // color
443 	{
444 		for (INT32 j = 0; j < 256; j++) // intensity
445 		{
446 			UINT8 data = DrvColRAM[i];
447 			INT32 bit3 = (~data >> 3) & 1;
448 			INT32 bit2 = (~data >> 2) & 1;
449 			INT32 bit1 = (~data >> 1) & 1;
450 			INT32 bit0 = (~data >> 0) & 1;
451 			INT32 r = (bit1 * 0xee + bit0 * 0x11) * j / 255;
452 			INT32 g = (bit3 * 0xee) * j / 255;
453 			INT32 b = (bit2 * 0xee) * j / 255;
454 
455 			DrvPalette[i * 256 + j] = (r << 16) | (g << 8) | b; // must be 32bit palette! -dink (see vector.cpp)
456 		}
457 	}
458 }
459 
460 
DrvDraw()461 static INT32 DrvDraw()
462 {
463 	if (DrvRecalc) {
464 		DrvPaletteInit();
465 		DrvRecalc = 0;
466 	}
467 
468 	if (res_check()) return 0; // resolution was changed
469 
470 	draw_vector(DrvPalette);
471 
472 	return 0;
473 }
474 
update_dial()475 static void update_dial()
476 { // half of the dial value added at the beginning of the frame, half in the middle of the frame.
477 	BurnTrackballUpdate(0);
478 
479 	DrvInputs[1] = (DrvDips[0] & 0x10) | (BurnTrackballRead(0, player) & 0x0f);
480 }
481 
DrvFrame()482 static INT32 DrvFrame()
483 {
484 	if (DrvReset) {
485 		DrvDoReset(1);
486 	}
487 
488 	BurnWatchdogUpdate();
489 
490 	{
491 		if (player) { // player2
492 			DrvJoy3[4] = DrvJoy4f[4];
493 			DrvJoy3[3] = DrvJoy4f[3];
494 		}
495 
496 		memset (DrvInputs, 0xff, sizeof(DrvInputs));
497 		for (INT32 i = 0; i < 8; i++) {
498 			DrvInputs[0] ^= (DrvJoy1[i] & 1) << i;
499 			DrvInputs[2] ^= (DrvJoy3[i] & 1) << i;
500 		}
501 
502 		BurnTrackballConfig(0, AXIS_NORMAL, AXIS_NORMAL);
503 		BurnTrackballFrame(0, DrvAnalogPort0, DrvAnalogPort1, 0x02, 0x07);
504 		BurnTrackballUDLR(0, DrvJoy4f[2], DrvJoy4f[3], DrvJoy4f[0], DrvJoy4f[1]);
505 		update_dial();
506 
507 		DrvInputs[0] = (DrvInputs[0] & 0x2f) | (DrvDips[4] & 0x10); // service mode
508 		DrvInputs[2] = (DrvInputs[2] & 0xf8) | (DrvDips[1] & 0x07);
509 	}
510 
511 	INT32 nInterleave = 20;
512 	INT32 nCyclesTotal[1] = { 1512000 / 60 };
513 	INT32 nCyclesDone[1] = { nExtraCycles };
514 	INT32 nSoundBufferPos = 0;
515 
516 	M6502Open(0);
517 
518 	for (INT32 i = 0; i < nInterleave; i++)
519 	{
520 		CPU_RUN(0, M6502);
521 		if (i == 9) update_dial();
522 		if ((i % 5) == 4) M6502SetIRQLine(0, CPU_IRQSTATUS_ACK);
523 
524 		// Render Sound Segment
525 		if (pBurnSoundOut) {
526 			INT32 nSegmentLength = nBurnSoundLen / nInterleave;
527 			INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
528 			pokey_update(pSoundBuf, nSegmentLength);
529 			nSoundBufferPos += nSegmentLength;
530 		}
531 	}
532 	M6502Close();
533 
534 	nExtraCycles = nCyclesDone - nCyclesTotal;
535 
536 	// Make sure the buffer is entirely filled.
537 	if (pBurnSoundOut) {
538 		INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos;
539 		INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
540 		if (nSegmentLength) {
541 			pokey_update(pSoundBuf, nSegmentLength);
542 		}
543 	}
544 
545 	if (pBurnDraw) {
546 		DrvDraw();
547 	}
548 
549 	return 0;
550 }
551 
DrvScan(INT32 nAction,INT32 * pnMin)552 static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
553 {
554 	struct BurnArea ba;
555 
556 	if (pnMin) {
557 		*pnMin = 0x029722;
558 	}
559 
560 	if (nAction & ACB_VOLATILE) {
561 		memset(&ba, 0, sizeof(ba));
562 		ba.Data	  = AllRam;
563 		ba.nLen	  = RamEnd - AllRam;
564 		ba.szName = "All Ram";
565 		BurnAcb(&ba);
566 
567 		M6502Scan(nAction);
568 
569 		avgdvg_scan(nAction, pnMin);
570 		mathbox_scan(nAction, pnMin);
571 
572 		BurnWatchdogScan(nAction);
573 
574 		pokey_scan(nAction, pnMin);
575 
576 		BurnTrackballScan();
577 
578 		SCAN_VAR(nExtraCycles);
579 	}
580 
581 	earom_scan(nAction, pnMin); // here.
582 
583 	return 0;
584 }
585 
586 // Tempest (rev 3, Revised Hardware)
587 
588 static struct BurnRomInfo tempestRomDesc[] = {
589 	{ "136002-133.d1",	0x1000, 0x1d0cc503, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
590 	{ "136002-134.f1",	0x1000, 0xc88e3524, 1 | BRF_PRG | BRF_ESS }, //  1
591 	{ "136002-235.j1",	0x1000, 0xa4b2ce3f, 1 | BRF_PRG | BRF_ESS }, //  2
592 	{ "136002-136.lm1",	0x1000, 0x65a9a9f9, 1 | BRF_PRG | BRF_ESS }, //  3
593 	{ "136002-237.p1",	0x1000, 0xde4e9e34, 1 | BRF_PRG | BRF_ESS }, //  4
594 
595 	{ "136002-138.np3",	0x1000, 0x9995256d, 1 | BRF_PRG | BRF_ESS }, //  5 vectrom
596 
597 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           //  6 avg prom
598 
599 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
600 
601 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
602 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
603 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
604 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
605 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
606 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
607 };
608 
609 STD_ROM_PICK(tempest)
610 STD_ROM_FN(tempest)
611 
612 struct BurnDriver BurnDrvTempest = {
613 	"tempest", NULL, NULL, NULL, "1980",
614 	"Tempest (rev 3, Revised Hardware)\0", NULL, "Atari", "Miscellaneous",
615 	NULL, NULL, NULL, NULL,
616 	BDF_GAME_WORKING | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
617 	NULL, tempestRomInfo, tempestRomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
618 	DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
619 	480, 640, 3, 4
620 };
621 
622 
623 // Tempest (rev 1, Revised Hardware)
624 
625 static struct BurnRomInfo tempest1rRomDesc[] = {
626 	{ "136002-133.d1",	0x1000, 0x1d0cc503, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
627 	{ "136002-134.f1",	0x1000, 0xc88e3524, 1 | BRF_PRG | BRF_ESS }, //  1
628 	{ "136002-135.j1",	0x1000, 0x1ca27781, 1 | BRF_PRG | BRF_ESS }, //  2
629 	{ "136002-136.lm1",	0x1000, 0x65a9a9f9, 1 | BRF_PRG | BRF_ESS }, //  3
630 	{ "136002-137.p1",	0x1000, 0xd75fd2ef, 1 | BRF_PRG | BRF_ESS }, //  4
631 	{ "136002-138.np3",	0x1000, 0x9995256d, 1 | BRF_PRG | BRF_ESS }, //  5
632 
633 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           //  6 user1
634 
635 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
636 
637 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
638 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
639 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
640 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
641 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
642 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
643 };
644 
645 STD_ROM_PICK(tempest1r)
646 STD_ROM_FN(tempest1r)
647 
648 struct BurnDriver BurnDrvTempest1r = {
649 	"tempest1r", "tempest", NULL, NULL, "1980",
650 	"Tempest (rev 1, Revised Hardware)\0", NULL, "Atari", "Miscellaneous",
651 	NULL, NULL, NULL, NULL,
652 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
653 	NULL, tempest1rRomInfo, tempest1rRomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
654 	DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
655 	480, 640, 3, 4
656 };
657 
DrvInitSmall()658 static INT32 DrvInitSmall()
659 {
660 	small_roms = 1;
661 
662 	return DrvInit();
663 }
664 
665 // Tempest (rev 3)
666 
667 static struct BurnRomInfo tempest3RomDesc[] = {
668 	{ "136002-113.d1",	0x0800, 0x65d61fe7, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
669 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
670 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
671 	{ "136002-316.h1",	0x0800, 0xaeb0f7e9, 1 | BRF_PRG | BRF_ESS }, //  3
672 	{ "136002-217.j1",	0x0800, 0xef2eb645, 1 | BRF_PRG | BRF_ESS }, //  4
673 	{ "136002-118.k1",	0x0800, 0xbeb352ab, 1 | BRF_PRG | BRF_ESS }, //  5
674 	{ "136002-119.lm1",	0x0800, 0xa4de050f, 1 | BRF_PRG | BRF_ESS }, //  6
675 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
676 	{ "136002-121.p1",	0x0800, 0x73d38e47, 1 | BRF_PRG | BRF_ESS }, //  8
677 	{ "136002-222.r1",	0x0800, 0x707bd5c3, 1 | BRF_PRG | BRF_ESS }, //  9
678 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
679 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
680 
681 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
682 
683 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
684 
685 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
686 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
687 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
688 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
689 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
690 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
691 };
692 
693 STD_ROM_PICK(tempest3)
694 STD_ROM_FN(tempest3)
695 
696 struct BurnDriver BurnDrvTempest3 = {
697 	"tempest3", "tempest", NULL, NULL, "1980",
698 	"Tempest (rev 3)\0", NULL, "Atari", "Miscellaneous",
699 	NULL, NULL, NULL, NULL,
700 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
701 	NULL, tempest3RomInfo, tempest3RomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
702 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
703 	480, 640, 3, 4
704 };
705 
706 
707 // Tempest (rev 2)
708 
709 static struct BurnRomInfo tempest2RomDesc[] = {
710 	{ "136002-113.d1",	0x0800, 0x65d61fe7, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
711 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
712 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
713 	{ "136002-116.h1",	0x0800, 0x7356896c, 1 | BRF_PRG | BRF_ESS }, //  3
714 	{ "136002-217.j1",	0x0800, 0xef2eb645, 1 | BRF_PRG | BRF_ESS }, //  4
715 	{ "136002-118.k1",	0x0800, 0xbeb352ab, 1 | BRF_PRG | BRF_ESS }, //  5
716 	{ "136002-119.lm1",	0x0800, 0xa4de050f, 1 | BRF_PRG | BRF_ESS }, //  6
717 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
718 	{ "136002-121.p1",	0x0800, 0x73d38e47, 1 | BRF_PRG | BRF_ESS }, //  8
719 	{ "136002-222.r1",	0x0800, 0x707bd5c3, 1 | BRF_PRG | BRF_ESS }, //  9
720 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
721 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
722 
723 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
724 
725 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
726 
727 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
728 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
729 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
730 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
731 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
732 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
733 };
734 
735 STD_ROM_PICK(tempest2)
736 STD_ROM_FN(tempest2)
737 
738 struct BurnDriver BurnDrvTempest2 = {
739 	"tempest2", "tempest", NULL, NULL, "1980",
740 	"Tempest (rev 2)\0", NULL, "Atari", "Miscellaneous",
741 	NULL, NULL, NULL, NULL,
742 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
743 	NULL, tempest2RomInfo, tempest2RomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
744 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
745 	480, 640, 3, 4
746 };
747 
748 
749 // Tempest (rev 1)
750 
751 static struct BurnRomInfo tempest1RomDesc[] = {
752 	{ "136002-113.d1",	0x0800, 0x65d61fe7, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
753 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
754 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
755 	{ "136002-116.h1",	0x0800, 0x7356896c, 1 | BRF_PRG | BRF_ESS }, //  3
756 	{ "136002-117.j1",	0x0800, 0x55952119, 1 | BRF_PRG | BRF_ESS }, //  4
757 	{ "136002-118.k1",	0x0800, 0xbeb352ab, 1 | BRF_PRG | BRF_ESS }, //  5
758 	{ "136002-119.lm1",	0x0800, 0xa4de050f, 1 | BRF_PRG | BRF_ESS }, //  6
759 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
760 	{ "136002-121.p1",	0x0800, 0x73d38e47, 1 | BRF_PRG | BRF_ESS }, //  8
761 	{ "136002-122.r1",	0x0800, 0x796a9918, 1 | BRF_PRG | BRF_ESS }, //  9
762 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
763 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
764 
765 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
766 
767 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
768 
769 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
770 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
771 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
772 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
773 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
774 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
775 };
776 
777 STD_ROM_PICK(tempest1)
778 STD_ROM_FN(tempest1)
779 
780 struct BurnDriver BurnDrvTempest1 = {
781 	"tempest1", "tempest", NULL, NULL, "1980",
782 	"Tempest (rev 1)\0", NULL, "Atari", "Miscellaneous",
783 	NULL, NULL, NULL, NULL,
784 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
785 	NULL, tempest1RomInfo, tempest1RomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
786 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
787 	480, 640, 3, 4
788 };
789 
790 
791 // Tempest Tubes
792 
793 static struct BurnRomInfo temptubeRomDesc[] = {
794 	{ "136002-113.d1",	0x0800, 0x65d61fe7, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
795 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
796 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
797 	{ "136002-316.h1",	0x0800, 0xaeb0f7e9, 1 | BRF_PRG | BRF_ESS }, //  3
798 	{ "136002-217.j1",	0x0800, 0xef2eb645, 1 | BRF_PRG | BRF_ESS }, //  4
799 	{ "tube-118.k1",	0x0800, 0xcefb03f0, 1 | BRF_PRG | BRF_ESS }, //  5
800 	{ "136002-119.lm1",	0x0800, 0xa4de050f, 1 | BRF_PRG | BRF_ESS }, //  6
801 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
802 	{ "136002-121.p1",	0x0800, 0x73d38e47, 1 | BRF_PRG | BRF_ESS }, //  8
803 	{ "136002-222.r1",	0x0800, 0x707bd5c3, 1 | BRF_PRG | BRF_ESS }, //  9
804 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
805 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
806 
807 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
808 
809 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
810 
811 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
812 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
813 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
814 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
815 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
816 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
817 };
818 
819 STD_ROM_PICK(temptube)
820 STD_ROM_FN(temptube)
821 
822 struct BurnDriver BurnDrvTemptube = {
823 	"temptube", "tempest", NULL, NULL, "1980",
824 	"Tempest Tubes\0", NULL, "hack (Duncan Brown)", "Miscellaneous",
825 	NULL, NULL, NULL, NULL,
826 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
827 	NULL, temptubeRomInfo, temptubeRomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
828 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
829 	480, 640, 3, 4
830 };
831 
832 
833 // TempEd
834 
835 static struct BurnRomInfo tempedRomDesc[] = {
836 	{ "136002-113.d1",	0x0800, 0x65d61fe7, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
837 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
838 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
839 	{ "136002-316.h1",	0x0800, 0xaeb0f7e9, 1 | BRF_PRG | BRF_ESS }, //  3
840 	{ "136002-217.j1",	0x0800, 0xef2eb645, 1 | BRF_PRG | BRF_ESS }, //  4
841 	{ "temped.118",		0x0800, 0x4825ee42, 1 | BRF_PRG | BRF_ESS }, //  5
842 	{ "136002-119.lm1",	0x0800, 0xa4de050f, 1 | BRF_PRG | BRF_ESS }, //  6
843 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
844 	{ "136002-121.p1",	0x0800, 0x73d38e47, 1 | BRF_PRG | BRF_ESS }, //  8
845 	{ "136002-222.r1",	0x0800, 0x707bd5c3, 1 | BRF_PRG | BRF_ESS }, //  9
846 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
847 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
848 
849 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
850 
851 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
852 
853 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
854 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
855 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
856 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
857 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
858 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
859 };
860 
861 STD_ROM_PICK(temped)
862 STD_ROM_FN(temped)
863 
864 struct BurnDriver BurnDrvTemped = {
865 	"temped", "tempest", NULL, NULL, "2000",
866 	"TempEd\0", NULL, "hack", "Miscellaneous",
867 	NULL, NULL, NULL, NULL,
868 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_HACK, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
869 	NULL, tempedRomInfo, tempedRomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
870 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
871 	480, 640, 3, 4
872 };
873 
874 
875 // Tempest All Levels
876 
877 static struct BurnRomInfo tempallRomDesc[] = {
878 	{ "tempall.113",	0x0800, 0xa9000137, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
879 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
880 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
881 	{ "136002-316.h1",	0x0800, 0xaeb0f7e9, 1 | BRF_PRG | BRF_ESS }, //  3
882 	{ "136002-217.j1",	0x0800, 0xef2eb645, 1 | BRF_PRG | BRF_ESS }, //  4
883 	{ "136002.118.k1",	0x0800, 0xbeb352ab, 1 | BRF_PRG | BRF_ESS }, //  5
884 	{ "136002-119.lm1",	0x0800, 0xa4de050f, 1 | BRF_PRG | BRF_ESS }, //  6
885 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
886 	{ "136002-121.p1",	0x0800, 0x73d38e47, 1 | BRF_PRG | BRF_ESS }, //  8
887 	{ "136002-222.r1",	0x0800, 0x707bd5c3, 1 | BRF_PRG | BRF_ESS }, //  9
888 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
889 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
890 
891 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
892 
893 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
894 
895 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
896 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
897 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
898 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
899 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
900 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
901 };
902 
903 STD_ROM_PICK(tempall)
904 STD_ROM_FN(tempall)
905 
906 struct BurnDriver BurnDrvTempall = {
907 	"tempall", "tempest", NULL, NULL, "2000",
908 	"Tempest All Levels\0", NULL, "hack", "Miscellaneous",
909 	NULL, NULL, NULL, NULL,
910 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_HACK, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
911 	NULL, tempallRomInfo, tempallRomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
912 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
913 	480, 640, 3, 4
914 };
915 
916 
917 // Tempest Twisted
918 
919 static struct BurnRomInfo temptwstRomDesc[] = {
920 	{ "tempall.113",	0x0800, 0xa9000137, 1 | BRF_PRG | BRF_ESS }, //  0 maincpu
921 	{ "136002-114.e1",	0x0800, 0x11077375, 1 | BRF_PRG | BRF_ESS }, //  1
922 	{ "136002-115.f1",	0x0800, 0xf3e2827a, 1 | BRF_PRG | BRF_ESS }, //  2
923 	{ "136002-316.h1",	0x0800, 0xaeb0f7e9, 1 | BRF_PRG | BRF_ESS }, //  3
924 	{ "136002-217.j1",	0x0800, 0xef2eb645, 1 | BRF_PRG | BRF_ESS }, //  4
925 	{ "temptwst.118",	0x0800, 0xf30afe2d, 1 | BRF_PRG | BRF_ESS }, //  5
926 	{ "temptwst.119",	0x0800, 0x571b1799, 1 | BRF_PRG | BRF_ESS }, //  6
927 	{ "136002-120.mn1",	0x0800, 0x35619648, 1 | BRF_PRG | BRF_ESS }, //  7
928 	{ "temptwst.121",	0x0800, 0x67619e6e, 1 | BRF_PRG | BRF_ESS }, //  8
929 	{ "136002-222.r1",	0x0800, 0x707bd5c3, 1 | BRF_PRG | BRF_ESS }, //  9
930 	{ "136002-123.np3",	0x0800, 0x29f7e937, 1 | BRF_PRG | BRF_ESS }, // 10
931 	{ "136002-124.r3",	0x0800, 0xc16ec351, 1 | BRF_PRG | BRF_ESS }, // 11
932 
933 	{ "136002-125.d7",	0x0100, 0x5903af03, 2 | BRF_GRA },           // 12 user1
934 
935 	{ "136002-126.a1",	0x0020, 0x8b04f921, 3 | BRF_GRA },           //  7 mathbox prom
936 
937 	{ "136002-132.l1",	0x0100, 0x2af82e87, 4 | BRF_GRA },           //  8 user3
938 	{ "136002-131.k1",	0x0100, 0xb31f6e24, 4 | BRF_GRA },           //  9
939 	{ "136002-130.j1",	0x0100, 0x8119b847, 4 | BRF_GRA },           // 10
940 	{ "136002-129.h1",	0x0100, 0x09f5a4d5, 4 | BRF_GRA },           // 11
941 	{ "136002-128.f1",	0x0100, 0x823b61ae, 4 | BRF_GRA },           // 12
942 	{ "136002-127.e1",	0x0100, 0x276eadd5, 4 | BRF_GRA },           // 13
943 };
944 
945 STD_ROM_PICK(temptwst)
946 STD_ROM_FN(temptwst)
947 
948 struct BurnDriver BurnDrvTemptwst = {
949 	"temptwst", "tempest", NULL, NULL, "2000",
950 	"Tempest Twisted\0", NULL, "Twisty", "Miscellaneous",
951 	NULL, NULL, NULL, NULL,
952 	BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_HACK, 2, HARDWARE_MISC_PRE90S, GBF_SHOOT | GBF_ACTION | GBF_VECTOR, 0,
953 	NULL, temptwstRomInfo, temptwstRomName, NULL, NULL, NULL, NULL, TempestInputInfo, TempestDIPInfo,
954 	DrvInitSmall, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x40 * 256,
955 	480, 640, 3, 4
956 };
957