1 #include "tiles_generic.h"
2 #include "taito.h"
3 #include "taito_ic.h"
4 #include "m68000_intf.h"
5 #include "z80_intf.h"
6 #include "burn_ym2151.h"
7 #include "burn_ym2610.h"
8 #include "burn_ym2203.h"
9 #include "msm5205.h"
10 #include "msm6295.h"
11 #include "eeprom.h"
12 #include "burn_gun.h"
13 
14 UINT8 TaitoInputPort0[8]       = { 0, 0, 0, 0, 0, 0, 0, 0 };
15 UINT8 TaitoInputPort1[8]       = { 0, 0, 0, 0, 0, 0, 0, 0 };
16 UINT8 TaitoInputPort2[8]       = { 0, 0, 0, 0, 0, 0, 0, 0 };
17 UINT8 TaitoInputPort3[8]       = { 0, 0, 0, 0, 0, 0, 0, 0 };
18 UINT8 TaitoInputPort4[8]       = { 0, 0, 0, 0, 0, 0, 0, 0 };
19 
20 UINT8 TaitoInputPort5[16]      = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
21 UINT8 TaitoDip[2]              = { 0, 0 };
22 UINT8 TaitoInput[6]            = { 0, 0, 0, 0, 0, 0 };
23 UINT8 TaitoReset               = 0;
24 
25 UINT8 TaitoCoinLockout[4]      = { 0, 0, 0, 0 };
26 
27 INT16 TaitoAnalogPort0         = 0;
28 INT16 TaitoAnalogPort1         = 0;
29 INT16 TaitoAnalogPort2         = 0;
30 INT16 TaitoAnalogPort3         = 0;
31 
32 UINT8 *TaitoMem                = NULL;
33 UINT8 *TaitoMemEnd             = NULL;
34 UINT8 *TaitoRamStart           = NULL;
35 UINT8 *TaitoRamEnd             = NULL;
36 UINT8 *Taito68KRam1            = NULL;
37 UINT8 *Taito68KRam2            = NULL;
38 UINT8 *Taito68KRam3            = NULL;
39 UINT8 *TaitoSharedRam          = NULL;
40 UINT8 *TaitoZ80Ram1            = NULL;
41 UINT8 *TaitoZ80Ram2            = NULL;
42 UINT8 *TaitoPaletteRam         = NULL;
43 UINT8 *TaitoSpriteRam          = NULL;
44 UINT8 *TaitoSpriteRam2         = NULL;
45 UINT8 *TaitoSpriteRamBuffered  = NULL;
46 UINT8 *TaitoSpriteRamDelayed   = NULL;
47 UINT8 *TaitoSpriteRamDelayed2  = NULL;
48 UINT8 *TaitoSpriteExtension    = NULL;
49 UINT8 *TaitoVideoRam           = NULL;
50 UINT32 *TaitoPalette           = NULL;
51 UINT8 *TaitoPriorityMap        = NULL;
52 
53 UINT8 TaitoZ80Bank = 0;
54 UINT8 TaitoSoundLatch = 0;
55 UINT16 TaitoCpuACtrl = 0;
56 INT32 TaitoRoadPalBank = 0;
57 
58 INT32 TaitoXOffset = 0;
59 INT32 TaitoYOffset = 0;
60 INT32 TaitoIrqLine = 0;
61 INT32 TaitoFrameInterleave = 0;
62 INT32 TaitoFlipScreenX = 0;
63 
64 INT32 TaitoNum68Ks = 0;
65 INT32 TaitoNumZ80s = 0;
66 INT32 TaitoNumYM2610 = 0;
67 INT32 TaitoNumYM2151 = 0;
68 INT32 TaitoNumYM2203 = 0;
69 INT32 TaitoNumMSM5205 = 0;
70 INT32 TaitoNumMSM6295 = 0;
71 INT32 TaitoNumES5505 = 0;
72 INT32 TaitoNumEEPROM = 0;
73 
74 INT32 nTaitoCyclesDone[4], nTaitoCyclesTotal[4];
75 INT32 nTaitoCyclesSegment;
76 
77 TaitoRender TaitoDrawFunction;
78 TaitoMakeInputs TaitoMakeInputsFunction;
79 TaitoResetFunc TaitoResetFunction;
80 
TaitoDoReset()81 INT32 TaitoDoReset()
82 {
83 	INT32 i;
84 
85 	for (i = 0; i < TaitoNum68Ks; i++) {
86 		SekOpen(i);
87 		SekReset();
88 		SekClose();
89 	}
90 
91 	for (i = 0; i < TaitoNumZ80s; i++) {
92 		ZetOpen(i);
93 		ZetReset();
94 		ZetClose();
95 	}
96 
97 	if (TaitoNumYM2610) BurnYM2610Reset();
98 	if (TaitoNumYM2151) BurnYM2151Reset();
99 	if (TaitoNumYM2203) BurnYM2203Reset();
100 
101 	if (TaitoNumMSM5205) MSM5205Reset();
102 
103 	for (i = 0; i < TaitoNumMSM6295; i++) {
104 		MSM6295Reset(i);
105 	}
106 
107 	if (TaitoNumEEPROM) EEPROMReset();
108 
109 	TaitoICReset();
110 
111 	TaitoZ80Bank = 0;
112 	TaitoSoundLatch = 0;
113 	TaitoRoadPalBank = 0;
114 	TaitoCpuACtrl = 0xff;
115 
116 	memset (TaitoCoinLockout, 0, 4);
117 
118 	return 0;
119 }
120 
121 UINT8 *Taito68KRom1    = NULL;
122 UINT8 *Taito68KRom2    = NULL;
123 UINT8 *Taito68KRom3    = NULL;
124 UINT8 *TaitoZ80Rom1    = NULL;
125 UINT8 *TaitoZ80Rom2    = NULL;
126 UINT8 *TaitoChars      = NULL;
127 UINT8 *TaitoCharsB     = NULL;
128 UINT8 *TaitoCharsPivot = NULL;
129 UINT8 *TaitoSpritesA   = NULL;
130 UINT8 *TaitoSpritesB   = NULL;
131 UINT8 *TaitoSpriteMapRom = NULL;
132 UINT8 *TaitoYM2610ARom = NULL;
133 UINT8 *TaitoYM2610BRom = NULL;
134 UINT8 *TaitoMSM5205Rom = NULL;
135 UINT8 *TaitoMSM6295Rom = NULL;
136 UINT8 *TaitoES5505Rom  = NULL;
137 UINT8 *TaitoDefaultEEProm = NULL;
138 
139 UINT32 Taito68KRom1Num = 0;
140 UINT32 Taito68KRom2Num = 0;
141 UINT32 Taito68KRom3Num = 0;
142 UINT32 TaitoZ80Rom1Num = 0;
143 UINT32 TaitoZ80Rom2Num = 0;
144 UINT32 TaitoCharRomNum = 0;
145 UINT32 TaitoCharBRomNum = 0;
146 UINT32 TaitoCharPivotRomNum = 0;
147 UINT32 TaitoSpriteARomNum = 0;
148 UINT32 TaitoSpriteBRomNum = 0;
149 UINT32 TaitoRoadRomNum       = 0;
150 UINT32 TaitoSpriteMapRomNum  = 0;
151 UINT32 TaitoYM2610ARomNum = 0;
152 UINT32 TaitoYM2610BRomNum = 0;
153 UINT32 TaitoMSM5205RomNum = 0;
154 UINT32 TaitoMSM6295RomNum = 0;
155 UINT32 TaitoES5505RomNum = 0;
156 UINT32 TaitoDefaultEEPromNum = 0;
157 UINT32 TaitoCCHIPBIOSNum = 0;
158 UINT32 TaitoCCHIPEEPROMNum = 0;
159 
160 UINT32 Taito68KRom1Size = 0;
161 UINT32 Taito68KRom2Size = 0;
162 UINT32 Taito68KRom3Size = 0;
163 UINT32 TaitoZ80Rom1Size = 0;
164 UINT32 TaitoZ80Rom2Size = 0;
165 UINT32 TaitoCharRomSize = 0;
166 UINT32 TaitoCharBRomSize = 0;
167 UINT32 TaitoCharPivotRomSize = 0;
168 UINT32 TaitoSpriteARomSize = 0;
169 UINT32 TaitoSpriteBRomSize = 0;
170 UINT32 TaitoRoadRomSize = 0;
171 UINT32 TaitoSpriteMapRomSize = 0;
172 UINT32 TaitoYM2610ARomSize = 0;
173 UINT32 TaitoYM2610BRomSize = 0;
174 UINT32 TaitoMSM5205RomSize = 0;
175 UINT32 TaitoMSM6295RomSize = 0;
176 UINT32 TaitoES5505RomSize = 0;
177 UINT32 TaitoDefaultEEPromSize = 0;
178 UINT32 TaitoCCHIPBIOSSize = 0;
179 UINT32 TaitoCCHIPEEPROMSize = 0;
180 
181 UINT32 TaitoCharModulo = 0;
182 UINT32 TaitoCharNumPlanes = 0;
183 UINT32 TaitoCharWidth = 0;
184 UINT32 TaitoCharHeight = 0;
185 UINT32 TaitoNumChar = 0;
186 INT32 *TaitoCharPlaneOffsets = NULL;
187 INT32 *TaitoCharXOffsets = NULL;
188 INT32 *TaitoCharYOffsets = NULL;
189 
190 UINT32 TaitoCharBModulo = 0;
191 UINT32 TaitoCharBNumPlanes = 0;
192 UINT32 TaitoCharBWidth = 0;
193 UINT32 TaitoCharBHeight = 0;
194 UINT32 TaitoNumCharB = 0;
195 INT32 *TaitoCharBPlaneOffsets = NULL;
196 INT32 *TaitoCharBXOffsets = NULL;
197 INT32 *TaitoCharBYOffsets = NULL;
198 
199 UINT32 TaitoCharPivotModulo = 0;
200 UINT32 TaitoCharPivotNumPlanes = 0;
201 UINT32 TaitoCharPivotWidth = 0;
202 UINT32 TaitoCharPivotHeight = 0;
203 UINT32 TaitoNumCharPivot = 0;
204 INT32 *TaitoCharPivotPlaneOffsets = NULL;
205 INT32 *TaitoCharPivotXOffsets = NULL;
206 INT32 *TaitoCharPivotYOffsets = NULL;
207 
208 UINT32 TaitoSpriteAModulo = 0;
209 UINT32 TaitoSpriteANumPlanes = 0;
210 UINT32 TaitoSpriteAWidth = 0;
211 UINT32 TaitoSpriteAHeight = 0;
212 UINT32 TaitoNumSpriteA = 0;
213 INT32 *TaitoSpriteAPlaneOffsets = NULL;
214 INT32 *TaitoSpriteAXOffsets = NULL;
215 INT32 *TaitoSpriteAYOffsets = NULL;
216 INT32 TaitoSpriteAInvertRom = 0;
217 
218 UINT32 TaitoSpriteBModulo = 0;
219 UINT32 TaitoSpriteBNumPlanes = 0;
220 UINT32 TaitoSpriteBWidth = 0;
221 UINT32 TaitoSpriteBHeight = 0;
222 UINT32 TaitoNumSpriteB = 0;
223 INT32 *TaitoSpriteBPlaneOffsets = NULL;
224 INT32 *TaitoSpriteBXOffsets = NULL;
225 INT32 *TaitoSpriteBYOffsets = NULL;
226 
TaitoLoadRoms(INT32 bLoad)227 INT32 TaitoLoadRoms(INT32 bLoad)
228 {
229 	struct BurnRomInfo ri;
230 	ri.nType = 0;
231 	ri.nLen = 0;
232 	INT32 nOffset = -1;
233 	UINT32 i = 0;
234 	INT32 nRet = 0;
235 
236 	if (!bLoad) {
237 		do {
238 			ri.nLen = 0;
239 			ri.nType = 0;
240 			BurnDrvGetRomInfo(&ri, ++nOffset);
241 			if ((ri.nType & 0xff) == TAITO_68KROM1 || (ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP || (ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP_JUMPING || (ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP32) {
242 				Taito68KRom1Size += ri.nLen;
243 				Taito68KRom1Num++;
244 			}
245 			if ((ri.nType & 0xff) == TAITO_68KROM2 || (ri.nType & 0xff) == TAITO_68KROM2_BYTESWAP) {
246 				Taito68KRom2Size += ri.nLen;
247 				Taito68KRom2Num++;
248 			}
249 			if ((ri.nType & 0xff) == TAITO_68KROM3 || (ri.nType & 0xff) == TAITO_68KROM3_BYTESWAP) {
250 				Taito68KRom3Size += ri.nLen;
251 				Taito68KRom3Num++;
252 			}
253 			if ((ri.nType & 0xff) == TAITO_Z80ROM1) {
254 				TaitoZ80Rom1Size += ri.nLen;
255 				TaitoZ80Rom1Num++;
256 			}
257 			if ((ri.nType & 0xff) == TAITO_Z80ROM2) {
258 				TaitoZ80Rom2Size += ri.nLen;
259 				TaitoZ80Rom2Num++;
260 			}
261 			if ((ri.nType & 0xff) == TAITO_CHARS || (ri.nType & 0xff) == TAITO_CHARS_BYTESWAP) {
262 				TaitoCharRomSize += ri.nLen;
263 				TaitoCharRomNum++;
264 			}
265 			if ((ri.nType & 0xff) == TAITO_CHARSB || (ri.nType & 0xff) == TAITO_CHARSB_BYTESWAP) {
266 				TaitoCharBRomSize += ri.nLen;
267 				TaitoCharBRomNum++;
268 			}
269 			if ((ri.nType & 0xff) == TAITO_SPRITESA || (ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP || (ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP32 || (ri.nType & 0xff) == TAITO_SPRITESA_TOPSPEED) {
270 				TaitoSpriteARomSize += ri.nLen;
271 				TaitoSpriteARomNum++;
272 			}
273 			if ((ri.nType & 0xff) == TAITO_SPRITESB || (ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP || (ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP32) {
274 				TaitoSpriteBRomSize += ri.nLen;
275 				TaitoSpriteBRomNum++;
276 			}
277 			if ((ri.nType & 0xff) == TAITO_ROAD) {
278 				TaitoRoadRomSize += ri.nLen;
279 				TaitoRoadRomNum++;
280 			}
281 			if ((ri.nType & 0xff) == TAITO_SPRITEMAP) {
282 				TaitoSpriteMapRomSize += ri.nLen;
283 				TaitoSpriteMapRomNum++;
284 			}
285 			if ((ri.nType & 0xff) == TAITO_YM2610A) {
286 				TaitoYM2610ARomSize += ri.nLen;
287 				TaitoYM2610ARomNum++;
288 			}
289 			if ((ri.nType & 0xff) == TAITO_YM2610B) {
290 				TaitoYM2610BRomSize += ri.nLen;
291 				TaitoYM2610BRomNum++;
292 			}
293 			if ((ri.nType & 0xff) == TAITO_MSM5205 || (ri.nType & 0xff) == TAITO_MSM5205_BYTESWAP) {
294 				TaitoMSM5205RomSize += ri.nLen;
295 				TaitoMSM5205RomNum++;
296 			}
297 			if ((ri.nType & 0xff) == TAITO_CHARS_PIVOT) {
298 				TaitoCharPivotRomSize += ri.nLen;
299 				TaitoCharPivotRomNum++;
300 			}
301 			if ((ri.nType & 0xff) == TAITO_MSM6295) {
302 				TaitoMSM6295RomSize += ri.nLen;
303 				TaitoMSM6295RomNum++;
304 			}
305 			if ((ri.nType & 0xff) == TAITO_ES5505 || (ri.nType & 0xff) == TAITO_ES5505_BYTESWAP) {
306 				TaitoES5505RomSize += ri.nLen;
307 				TaitoES5505RomNum++;
308 			}
309 			if ((ri.nType & 0xff) == TAITO_DEFAULT_EEPROM) {
310 				TaitoDefaultEEPromSize += ri.nLen;
311 				TaitoDefaultEEPromNum++;
312 			}
313 			if ((ri.nType & 0xff) == TAITO_CCHIP_EEPROM) {
314 				TaitoCCHIPEEPROMSize += ri.nLen;
315 				TaitoCCHIPEEPROMNum++;
316 			}
317 		} while (ri.nLen);
318 
319 		{ // Taito C-Chip BIOS starts at idx 0x80 - must do this outside of the while loop
320 			ri.nLen = 0;
321 			ri.nType = 0;
322 			BurnDrvGetRomInfo(&ri, 0x80);
323 
324 			if ((ri.nType & 0xff) == TAITO_CCHIP_BIOS) {
325 				TaitoCCHIPBIOSSize += ri.nLen;
326 				TaitoCCHIPBIOSNum++;
327 			}
328 		}
329 
330 #if 1 && defined FBA_DEBUG
331 		if (Taito68KRom1Size) bprintf(PRINT_IMPORTANT, _T("68K #1 Rom Length %06X, (%i roms)\n"), Taito68KRom1Size, Taito68KRom1Num);
332 		if (Taito68KRom2Size) bprintf(PRINT_IMPORTANT, _T("68K #2 Rom Length %06X, (%i roms)\n"), Taito68KRom2Size, Taito68KRom2Num);
333 		if (Taito68KRom3Size) bprintf(PRINT_IMPORTANT, _T("68K #3 Rom Length %06X, (%i roms)\n"), Taito68KRom3Size, Taito68KRom3Num);
334 		if (TaitoZ80Rom1Size) bprintf(PRINT_IMPORTANT, _T("Z80 #1 Rom Length %06X, (%i roms)\n"), TaitoZ80Rom1Size, TaitoZ80Rom1Num);
335 		if (TaitoZ80Rom2Size) bprintf(PRINT_IMPORTANT, _T("Z80 #2 Rom Length %06X, (%i roms)\n"), TaitoZ80Rom2Size, TaitoZ80Rom2Num);
336 		if (TaitoCharRomSize) bprintf(PRINT_IMPORTANT, _T("Char Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoCharRomSize, TaitoCharRomNum, TaitoNumChar);
337 		if (TaitoCharBRomSize) bprintf(PRINT_IMPORTANT, _T("Char B Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoCharBRomSize, TaitoCharBRomNum, TaitoNumCharB);
338 		if (TaitoSpriteARomSize) bprintf(PRINT_IMPORTANT, _T("Sprite A Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoSpriteARomSize, TaitoSpriteARomNum, TaitoNumSpriteA);
339 		if (TaitoSpriteBRomSize) bprintf(PRINT_IMPORTANT, _T("Sprite B Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoSpriteBRomSize, TaitoSpriteBRomNum, TaitoNumSpriteB);
340 		if (TaitoRoadRomSize) bprintf(PRINT_IMPORTANT, _T("Road Rom Length %08X, (%i roms)\n"), TaitoRoadRomSize, TaitoRoadRomNum);
341 		if (TaitoSpriteMapRomSize) bprintf(PRINT_IMPORTANT, _T("Sprite Map Rom Length %08X, (%i roms)\n"), TaitoSpriteMapRomSize, TaitoSpriteMapRomNum);
342 		if (TaitoYM2610ARomSize) bprintf(PRINT_IMPORTANT, _T("YM2610 Samples Rom Length %08X, (%i roms)\n"), TaitoYM2610ARomSize, TaitoYM2610ARomNum);
343 		if (TaitoYM2610BRomSize) bprintf(PRINT_IMPORTANT, _T("YM2610 Delta-T Rom Length %08X, (%i roms)\n"), TaitoYM2610BRomSize, TaitoYM2610BRomNum);
344 		if (TaitoMSM5205RomSize) bprintf(PRINT_IMPORTANT, _T("MSM5205 Rom Length %08X, (%i roms)\n"), TaitoMSM5205RomSize, TaitoMSM5205RomNum);
345 		if (TaitoCharPivotRomSize) bprintf(PRINT_IMPORTANT, _T("Pivot Char Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoCharPivotRomSize, TaitoCharPivotRomNum, TaitoNumCharPivot);
346 		if (TaitoMSM6295RomSize) bprintf(PRINT_IMPORTANT, _T("MSM6295 Rom Length %08X, (%i roms)\n"), TaitoMSM6295RomSize, TaitoMSM6295RomNum);
347 		if (TaitoES5505RomSize) bprintf(PRINT_IMPORTANT, _T("ES5505 Rom Length %08X, (%i roms)\n"), TaitoES5505RomSize, TaitoES5505RomNum);
348 		if (TaitoDefaultEEPromSize) bprintf(PRINT_IMPORTANT, _T("Default EEPROM Length %08X, (%i roms)\n"), TaitoDefaultEEPromSize, TaitoDefaultEEPromNum);
349 		if (TaitoCCHIPBIOSSize) bprintf(PRINT_IMPORTANT, _T("C-Chip BIOS Length %08X, (%i roms)\n"), TaitoCCHIPBIOSSize, TaitoCCHIPBIOSNum);
350 		if (TaitoCCHIPEEPROMSize) bprintf(PRINT_IMPORTANT, _T("C-Chip EEPROM Length %08X, (%i roms)\n"), TaitoCCHIPEEPROMSize, TaitoCCHIPEEPROMNum);
351 #endif
352 	}
353 
354 	if (bLoad) {
355 		INT32 Offset = 0;
356 
357 		i = 0;
358 		while (i < Taito68KRom1Num) {
359 			BurnDrvGetRomInfo(&ri, i + 0);
360 
361 			if ((ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP) {
362 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 1, i + 0, 2); if (nRet) return 1;
363 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 0, i + 1, 2); if (nRet) return 1;
364 
365 				BurnDrvGetRomInfo(&ri, i + 0);
366 				Offset += ri.nLen;
367 				BurnDrvGetRomInfo(&ri, i + 1);
368 				Offset += ri.nLen;
369 
370 				i += 2;
371 			}
372 
373 			if ((ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP32) {
374 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 1, i + 0, 4); if (nRet) return 1;
375 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 0, i + 1, 4); if (nRet) return 1;
376 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 3, i + 2, 4); if (nRet) return 1;
377 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 2, i + 3, 4); if (nRet) return 1;
378 
379 				BurnDrvGetRomInfo(&ri, i + 0);
380 				Offset += ri.nLen;
381 				BurnDrvGetRomInfo(&ri, i + 1);
382 				Offset += ri.nLen;
383 				BurnDrvGetRomInfo(&ri, i + 2);
384 				Offset += ri.nLen;
385 				BurnDrvGetRomInfo(&ri, i + 3);
386 				Offset += ri.nLen;
387 
388 				i += 4;
389 			}
390 
391 			if ((ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP_JUMPING) {
392 				nRet = BurnLoadRom(Taito68KRom1 + Offset + 0, i + 0, 2); if (nRet) return 1;
393 
394 				BurnDrvGetRomInfo(&ri, i + 0);
395 				Offset += ri.nLen;
396 
397 				i++;
398 			}
399 
400 			if ((ri.nType & 0xff) == TAITO_68KROM1) {
401 				nRet = BurnLoadRom(Taito68KRom1 + Offset, i, 1); if (nRet) return 1;
402 
403 				BurnDrvGetRomInfo(&ri, i);
404 				Offset += ri.nLen;
405 
406 				i++;
407 			}
408 		}
409 
410 		if (Taito68KRom2Size) {
411 			Offset = 0;
412 			i = Taito68KRom1Num;
413 
414 			while (i < Taito68KRom1Num + Taito68KRom2Num) {
415 				BurnDrvGetRomInfo(&ri, i + 0);
416 
417 				if ((ri.nType & 0xff) == TAITO_68KROM2_BYTESWAP) {
418 					nRet = BurnLoadRom(Taito68KRom2 + Offset + 1, i + 0, 2); if (nRet) return 1;
419 					nRet = BurnLoadRom(Taito68KRom2 + Offset + 0, i + 1, 2); if (nRet) return 1;
420 
421 					BurnDrvGetRomInfo(&ri, i + 0);
422 					Offset += ri.nLen;
423 					BurnDrvGetRomInfo(&ri, i + 1);
424 					Offset += ri.nLen;
425 
426 					i += 2;
427 				}
428 
429 				if ((ri.nType & 0xff) == TAITO_68KROM2) {
430 					nRet = BurnLoadRom(Taito68KRom2 + Offset, i, 1); if (nRet) return 1;
431 
432 					BurnDrvGetRomInfo(&ri, i);
433 					Offset += ri.nLen;
434 
435 					i++;
436 				}
437 			}
438 		}
439 
440 		if (Taito68KRom3Size) {
441 			Offset = 0;
442 			i = Taito68KRom1Num + Taito68KRom2Num;
443 
444 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num) {
445 				BurnDrvGetRomInfo(&ri, i + 0);
446 
447 				if ((ri.nType & 0xff) == TAITO_68KROM3_BYTESWAP) {
448 					nRet = BurnLoadRom(Taito68KRom3 + Offset + 1, i + 0, 2); if (nRet) return 1;
449 					nRet = BurnLoadRom(Taito68KRom3 + Offset + 0, i + 1, 2); if (nRet) return 1;
450 
451 					BurnDrvGetRomInfo(&ri, i + 0);
452 					Offset += ri.nLen;
453 					BurnDrvGetRomInfo(&ri, i + 1);
454 					Offset += ri.nLen;
455 
456 					i += 2;
457 				}
458 
459 				if ((ri.nType & 0xff) == TAITO_68KROM3) {
460 					nRet = BurnLoadRom(Taito68KRom3 + Offset, i, 1); if (nRet) return 1;
461 
462 					BurnDrvGetRomInfo(&ri, i);
463 					Offset += ri.nLen;
464 
465 					i++;
466 				}
467 			}
468 		}
469 
470 		if (TaitoZ80Rom1Size) {
471 			Offset = 0;
472 			for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num; i++) {
473 				BurnLoadRom(TaitoZ80Rom1 + Offset, i, 1);
474 
475 				BurnDrvGetRomInfo(&ri, i);
476 				Offset += ri.nLen;
477 			}
478 		}
479 
480 		if (TaitoZ80Rom2Size) {
481 			Offset = 0;
482 			for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num; i++) {
483 				BurnLoadRom(TaitoZ80Rom2 + Offset, i, 1);
484 
485 				BurnDrvGetRomInfo(&ri, i);
486 				Offset += ri.nLen;
487 			}
488 		}
489 
490 		if (TaitoCharRomSize) {
491 			UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoCharRomSize);
492 			memset(TempRom, 0, TaitoCharRomSize);
493 
494 			Offset = 0;
495 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num;
496 
497 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum) {
498 				BurnDrvGetRomInfo(&ri, i + 0);
499 
500 				if ((ri.nType & 0xff) == TAITO_CHARS) {
501 					nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1;
502 
503 					BurnDrvGetRomInfo(&ri, i);
504 					Offset += ri.nLen;
505 
506 					i++;
507 				}
508 
509 				if ((ri.nType & 0xff) == TAITO_CHARS_BYTESWAP) {
510 					nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1;
511 					nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1;
512 
513 					BurnDrvGetRomInfo(&ri, i + 0);
514 					Offset += ri.nLen;
515 					BurnDrvGetRomInfo(&ri, i + 1);
516 					Offset += ri.nLen;
517 
518 					i += 2;
519 				}
520 			}
521 
522 			if (TaitoNumChar) {
523 				GfxDecode(TaitoNumChar, TaitoCharNumPlanes, TaitoCharWidth, TaitoCharHeight, TaitoCharPlaneOffsets, TaitoCharXOffsets, TaitoCharYOffsets, TaitoCharModulo, TempRom, TaitoChars);
524 			} else {
525 				memcpy (TaitoChars, TempRom, Offset);
526 			}
527 
528 			BurnFree(TempRom);
529 		}
530 
531 		if (TaitoCharBRomSize) {
532 			UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoCharBRomSize);
533 			memset(TempRom, 0, TaitoCharBRomSize);
534 
535 			Offset = 0;
536 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum;
537 
538 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum) {
539 				BurnDrvGetRomInfo(&ri, i + 0);
540 
541 				if ((ri.nType & 0xff) == TAITO_CHARSB) {
542 					nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1;
543 
544 					BurnDrvGetRomInfo(&ri, i);
545 					Offset += ri.nLen;
546 
547 					i++;
548 				}
549 
550 				if ((ri.nType & 0xff) == TAITO_CHARSB_BYTESWAP) {
551 					nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1;
552 					nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1;
553 
554 					BurnDrvGetRomInfo(&ri, i + 0);
555 					Offset += ri.nLen;
556 					BurnDrvGetRomInfo(&ri, i + 1);
557 					Offset += ri.nLen;
558 
559 					i += 2;
560 				}
561 			}
562 
563 			GfxDecode(TaitoNumCharB, TaitoCharBNumPlanes, TaitoCharBWidth, TaitoCharBHeight, TaitoCharBPlaneOffsets, TaitoCharBXOffsets, TaitoCharBYOffsets, TaitoCharBModulo, TempRom, TaitoCharsB);
564 
565 			BurnFree(TempRom);
566 		}
567 
568 		if (TaitoSpriteARomSize) {
569 			UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoSpriteARomSize);
570 			memset(TempRom, 0, TaitoSpriteARomSize);
571 
572 			Offset = 0;
573 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum;
574 
575 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum) {
576 				BurnDrvGetRomInfo(&ri, i + 0);
577 
578 				if ((ri.nType & 0xff) == TAITO_SPRITESA) {
579 					nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1;
580 
581 					BurnDrvGetRomInfo(&ri, i);
582 					Offset += ri.nLen;
583 
584 					i++;
585 				}
586 
587 				if ((ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP) {
588 					nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1;
589 					nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1;
590 
591 					BurnDrvGetRomInfo(&ri, i + 0);
592 					Offset += ri.nLen;
593 					BurnDrvGetRomInfo(&ri, i + 1);
594 					Offset += ri.nLen;
595 
596 					i += 2;
597 				}
598 
599 				if ((ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP32) {
600 					nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 4); if (nRet) return 1;
601 					nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 4); if (nRet) return 1;
602 					nRet = BurnLoadRom(TempRom + Offset + 2, i + 2, 4); if (nRet) return 1;
603 					nRet = BurnLoadRom(TempRom + Offset + 3, i + 3, 4); if (nRet) return 1;
604 
605 					BurnDrvGetRomInfo(&ri, i + 0);
606 					Offset += ri.nLen;
607 					BurnDrvGetRomInfo(&ri, i + 1);
608 					Offset += ri.nLen;
609 					BurnDrvGetRomInfo(&ri, i + 2);
610 					Offset += ri.nLen;
611 					BurnDrvGetRomInfo(&ri, i + 3);
612 					Offset += ri.nLen;
613 
614 					i += 4;
615 				}
616 
617 				if ((ri.nType & 0xff) == TAITO_SPRITESA_TOPSPEED) {
618 					nRet = BurnLoadRom(TempRom + 0x000003, i +  0, 8); if (nRet) return 1;
619 					nRet = BurnLoadRom(TempRom + 0x100003, i +  1, 8); if (nRet) return 1;
620 					nRet = BurnLoadRom(TempRom + 0x000007, i +  2, 8); if (nRet) return 1;
621 					nRet = BurnLoadRom(TempRom + 0x100007, i +  3, 8); if (nRet) return 1;
622 					nRet = BurnLoadRom(TempRom + 0x000002, i +  4, 8); if (nRet) return 1;
623 					nRet = BurnLoadRom(TempRom + 0x100002, i +  5, 8); if (nRet) return 1;
624 					nRet = BurnLoadRom(TempRom + 0x000006, i +  6, 8); if (nRet) return 1;
625 					nRet = BurnLoadRom(TempRom + 0x100006, i +  7, 8); if (nRet) return 1;
626 					nRet = BurnLoadRom(TempRom + 0x000001, i +  8, 8); if (nRet) return 1;
627 					nRet = BurnLoadRom(TempRom + 0x100001, i +  9, 8); if (nRet) return 1;
628 					nRet = BurnLoadRom(TempRom + 0x000005, i + 10, 8); if (nRet) return 1;
629 					nRet = BurnLoadRom(TempRom + 0x100005, i + 11, 8); if (nRet) return 1;
630 					nRet = BurnLoadRom(TempRom + 0x000000, i + 12, 8); if (nRet) return 1;
631 					nRet = BurnLoadRom(TempRom + 0x100000, i + 13, 8); if (nRet) return 1;
632 					nRet = BurnLoadRom(TempRom + 0x000004, i + 14, 8); if (nRet) return 1;
633 					nRet = BurnLoadRom(TempRom + 0x100004, i + 15, 8); if (nRet) return 1;
634 
635 					i += 16;
636 				}
637 			}
638 
639 			if (TaitoSpriteAInvertRom) {
640 				for (UINT32 j = 0; j < TaitoSpriteARomSize; j++) {
641 					TempRom[j] ^= 0xff;
642 				}
643 			}
644 
645 			if (TaitoNumSpriteA) {
646 				GfxDecode(TaitoNumSpriteA, TaitoSpriteANumPlanes, TaitoSpriteAWidth, TaitoSpriteAHeight, TaitoSpriteAPlaneOffsets, TaitoSpriteAXOffsets, TaitoSpriteAYOffsets, TaitoSpriteAModulo, TempRom, TaitoSpritesA);
647 			} else {
648 				memcpy (TaitoSpritesA, TempRom, Offset);
649 			}
650 
651 			BurnFree(TempRom);
652 		}
653 
654 		if (TaitoSpriteBRomSize) {
655 			UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoSpriteBRomSize);
656 			memset(TempRom, 0, TaitoSpriteBRomSize);
657 
658 			Offset = 0;
659 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum;
660 
661 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum) {
662 				BurnDrvGetRomInfo(&ri, i + 0);
663 
664 				if ((ri.nType & 0xff) == TAITO_SPRITESB) {
665 					nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1;
666 
667 					BurnDrvGetRomInfo(&ri, i);
668 					Offset += ri.nLen;
669 
670 					i++;
671 				}
672 
673 				if ((ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP) {
674 					nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1;
675 					nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1;
676 
677 					BurnDrvGetRomInfo(&ri, i + 0);
678 					Offset += ri.nLen;
679 					BurnDrvGetRomInfo(&ri, i + 1);
680 					Offset += ri.nLen;
681 
682 					i += 2;
683 				}
684 
685 				if ((ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP32) {
686 					nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 4); if (nRet) return 1;
687 					nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 4); if (nRet) return 1;
688 					nRet = BurnLoadRom(TempRom + Offset + 2, i + 2, 4); if (nRet) return 1;
689 					nRet = BurnLoadRom(TempRom + Offset + 3, i + 3, 4); if (nRet) return 1;
690 
691 					BurnDrvGetRomInfo(&ri, i + 0);
692 					Offset += ri.nLen;
693 					BurnDrvGetRomInfo(&ri, i + 1);
694 					Offset += ri.nLen;
695 					BurnDrvGetRomInfo(&ri, i + 2);
696 					Offset += ri.nLen;
697 					BurnDrvGetRomInfo(&ri, i + 3);
698 					Offset += ri.nLen;
699 
700 					i += 4;
701 				}
702 			}
703 
704 			GfxDecode(TaitoNumSpriteB, TaitoSpriteBNumPlanes, TaitoSpriteBWidth, TaitoSpriteBHeight, TaitoSpriteBPlaneOffsets, TaitoSpriteBXOffsets, TaitoSpriteBYOffsets, TaitoSpriteBModulo, TempRom, TaitoSpritesB);
705 
706 			BurnFree(TempRom);
707 		}
708 
709 		if (TaitoRoadRomSize) {
710 			Offset = 0;
711 			for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum; i++) {
712 				BurnLoadRom(TC0150RODRom + Offset, i, 1);
713 
714 				BurnDrvGetRomInfo(&ri, i);
715 				Offset += ri.nLen;
716 			}
717 		}
718 
719 		if (TaitoSpriteMapRomSize) {
720 			Offset = 0;
721 			for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum; i++) {
722 				BurnLoadRom(TaitoSpriteMapRom + Offset, i, 1);
723 
724 				BurnDrvGetRomInfo(&ri, i);
725 				Offset += ri.nLen;
726 			}
727 		}
728 
729 		if (TaitoYM2610ARomSize) {
730 			Offset = 0;
731 			for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum; i++) {
732 				BurnLoadRom(TaitoYM2610ARom + Offset, i, 1);
733 
734 				BurnDrvGetRomInfo(&ri, i);
735 				Offset += ri.nLen;
736 			}
737 		}
738 
739 		if (TaitoYM2610BRomSize) {
740 			Offset = 0;
741 			for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum; i++) {
742 				BurnLoadRom(TaitoYM2610BRom + Offset, i, 1);
743 
744 				BurnDrvGetRomInfo(&ri, i);
745 				Offset += ri.nLen;
746 			}
747 		}
748 
749 		if (TaitoMSM5205RomSize) {
750 			Offset = 0;
751 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum;
752 
753 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum) {
754 				BurnDrvGetRomInfo(&ri, i + 0);
755 
756 				if ((ri.nType & 0xff) == TAITO_MSM5205) {
757 					nRet = BurnLoadRom(TaitoMSM5205Rom + Offset, i, 1); if (nRet) return 1;
758 
759 					BurnDrvGetRomInfo(&ri, i);
760 					Offset += ri.nLen;
761 
762 					i++;
763 				}
764 
765 				if ((ri.nType & 0xff) == TAITO_MSM5205_BYTESWAP) {
766 					nRet = BurnLoadRom(TaitoMSM5205Rom + Offset + 0, i + 0, 2); if (nRet) return 1;
767 					nRet = BurnLoadRom(TaitoMSM5205Rom + Offset + 1, i + 1, 2); if (nRet) return 1;
768 
769 					BurnDrvGetRomInfo(&ri, i + 0);
770 					Offset += ri.nLen;
771 					BurnDrvGetRomInfo(&ri, i + 1);
772 					Offset += ri.nLen;
773 
774 					i += 2;
775 				}
776 			}
777 		}
778 
779 		if (TaitoCharPivotRomSize) {
780 			UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoCharPivotRomSize);
781 			memset(TempRom, 0, TaitoCharPivotRomSize);
782 
783 			Offset = 0;
784 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum;
785 
786 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum) {
787 				BurnDrvGetRomInfo(&ri, i + 0);
788 
789 				if ((ri.nType & 0xff) == TAITO_CHARS_PIVOT) {
790 					nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1;
791 
792 					BurnDrvGetRomInfo(&ri, i);
793 					Offset += ri.nLen;
794 
795 					i++;
796 				}
797 			}
798 
799 			GfxDecode(TaitoNumCharPivot, TaitoCharPivotNumPlanes, TaitoCharPivotWidth, TaitoCharPivotHeight, TaitoCharPivotPlaneOffsets, TaitoCharPivotXOffsets, TaitoCharPivotYOffsets, TaitoCharPivotModulo, TempRom, TaitoCharsPivot);
800 
801 			BurnFree(TempRom);
802 		}
803 
804 		if (TaitoMSM6295RomSize) {
805 			Offset = 0;
806 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum;
807 
808 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum) {
809 				BurnDrvGetRomInfo(&ri, i + 0);
810 
811 				if ((ri.nType & 0xff) == TAITO_MSM6295) {
812 					nRet = BurnLoadRom(TaitoMSM6295Rom + Offset, i, 1); if (nRet) return 1;
813 
814 					BurnDrvGetRomInfo(&ri, i);
815 					Offset += ri.nLen;
816 
817 					i++;
818 				}
819 			}
820 		}
821 
822 		if (TaitoES5505RomSize) {
823 			Offset = 0;
824 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum;
825 
826 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum) {
827 				BurnDrvGetRomInfo(&ri, i + 0);
828 
829 				if ((ri.nType & 0xff) == TAITO_ES5505) {
830 					nRet = BurnLoadRom(TaitoES5505Rom + Offset, i, 1); if (nRet) return 1;
831 
832 					BurnDrvGetRomInfo(&ri, i);
833 					Offset += ri.nLen;
834 
835 					i++;
836 				}
837 
838 				if ((ri.nType & 0xff) == TAITO_ES5505_BYTESWAP) {
839 					nRet = BurnLoadRom(TaitoES5505Rom + (Offset * 2), i, 2); if (nRet) return 1;
840 
841 					BurnDrvGetRomInfo(&ri, i);
842 					Offset += ri.nLen;
843 
844 					i++;
845 				}
846 			}
847 		}
848 
849 		if (TaitoDefaultEEPromSize) {
850 			Offset = 0;
851 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum;
852 
853 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum + TaitoDefaultEEPromNum) {
854 				BurnDrvGetRomInfo(&ri, i + 0);
855 
856 				if ((ri.nType & 0xff) == TAITO_DEFAULT_EEPROM) {
857 					nRet = BurnLoadRom(TaitoDefaultEEProm + Offset, i, 1); if (nRet) return 1;
858 
859 					BurnDrvGetRomInfo(&ri, i);
860 					Offset += ri.nLen;
861 
862 					i++;
863 				}
864 			}
865 		}
866 
867 		if (TaitoCCHIPEEPROMSize) {
868 			Offset = 0;
869 			i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum + TaitoDefaultEEPromNum;
870 
871 			while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum + TaitoDefaultEEPromNum + TaitoCCHIPEEPROMNum) {
872 				BurnDrvGetRomInfo(&ri, i + 0);
873 				if ((ri.nType & 0xff) == TAITO_CCHIP_EEPROM) {
874 					nRet = BurnLoadRom(cchip_eeprom + Offset, i, 1); if (nRet) return 1;
875 
876 					BurnDrvGetRomInfo(&ri, i);
877 					Offset += ri.nLen;
878 
879 					i++;
880 				}
881 			}
882 		}
883 
884 		if (TaitoCCHIPBIOSSize) { // this should be the last entry.
885 			Offset = 0;
886 			INT32 idx = 0x80; // default BIOS index
887 
888 			BurnDrvGetRomInfo(&ri, idx + 0);
889 
890 			if ((ri.nType & 0xff) == TAITO_CCHIP_BIOS) {
891 				nRet = BurnLoadRom(cchip_rom + Offset, idx, 1); if (nRet) return 1;
892 
893 				BurnDrvGetRomInfo(&ri, idx);
894 				Offset += ri.nLen;
895 			}
896 		}
897 	}
898 
899 	return 0;
900 }
901 
TaitoClearVariables()902 void TaitoClearVariables()
903 {
904 	Taito68KRom1Num = 0;
905 	Taito68KRom2Num = 0;
906 	Taito68KRom3Num = 0;
907 	TaitoZ80Rom1Num = 0;
908 	TaitoZ80Rom2Num = 0;
909 	TaitoCharRomNum = 0;
910 	TaitoCharBRomNum = 0;
911 	TaitoCharPivotRomNum = 0;
912 	TaitoSpriteARomNum = 0;
913 	TaitoSpriteBRomNum = 0;
914 	TaitoRoadRomNum = 0;
915 	TaitoSpriteMapRomNum = 0;
916 	TaitoYM2610ARomNum = 0;
917 	TaitoYM2610BRomNum = 0;
918 	TaitoMSM5205RomNum = 0;
919 	TaitoMSM6295RomNum = 0;
920 	TaitoES5505RomNum = 0;
921 	TaitoDefaultEEPromNum = 0;
922 	TaitoCCHIPBIOSNum = 0;
923 	TaitoCCHIPEEPROMNum = 0;
924 
925 	Taito68KRom1Size = 0;
926 	Taito68KRom2Size = 0;
927 	Taito68KRom3Size = 0;
928 	TaitoZ80Rom1Size = 0;
929 	TaitoZ80Rom2Size = 0;
930 	TaitoCharRomSize = 0;
931 	TaitoCharBRomSize = 0;
932 	TaitoCharPivotRomSize = 0;
933 	TaitoSpriteARomSize = 0;
934 	TaitoSpriteBRomSize = 0;
935 	TaitoRoadRomSize = 0;
936 	TaitoSpriteMapRomSize = 0;
937 	TaitoYM2610ARomSize = 0;
938 	TaitoYM2610BRomSize = 0;
939 	TaitoMSM5205RomSize = 0;
940 	TaitoMSM6295RomSize = 0;
941 	TaitoES5505RomSize = 0;
942 	TaitoDefaultEEPromSize = 0;
943 	TaitoCCHIPBIOSSize = 0;
944 	TaitoCCHIPEEPROMSize = 0;
945 
946 	TaitoCharModulo = 0;
947 	TaitoCharNumPlanes = 0;
948 	TaitoCharWidth = 0;
949 	TaitoCharHeight = 0;
950 	TaitoNumChar = 0;
951 	TaitoCharPlaneOffsets = NULL;
952 	TaitoCharXOffsets = NULL;
953 	TaitoCharYOffsets = NULL;
954 
955 	TaitoCharBModulo = 0;
956 	TaitoCharBNumPlanes = 0;
957 	TaitoCharBWidth = 0;
958 	TaitoCharBHeight = 0;
959 	TaitoNumCharB = 0;
960 	TaitoCharBPlaneOffsets = NULL;
961 	TaitoCharBXOffsets = NULL;
962 	TaitoCharBYOffsets = NULL;
963 
964 	TaitoCharPivotModulo = 0;
965 	TaitoCharPivotNumPlanes = 0;
966 	TaitoCharPivotWidth = 0;
967 	TaitoCharPivotHeight = 0;
968 	TaitoNumCharPivot = 0;
969 	TaitoCharPivotPlaneOffsets = NULL;
970 	TaitoCharPivotXOffsets = NULL;
971 	TaitoCharPivotYOffsets = NULL;
972 
973 	TaitoSpriteAModulo = 0;
974 	TaitoSpriteANumPlanes = 0;
975 	TaitoSpriteAWidth = 0;
976 	TaitoSpriteAHeight = 0;
977 	TaitoNumSpriteA = 0;
978 	TaitoSpriteAPlaneOffsets = NULL;
979 	TaitoSpriteAXOffsets = NULL;
980 	TaitoSpriteAYOffsets = NULL;
981 	TaitoSpriteAInvertRom = 0;
982 
983 	TaitoSpriteBModulo = 0;
984 	TaitoSpriteBNumPlanes = 0;
985 	TaitoSpriteBWidth = 0;
986 	TaitoSpriteBHeight = 0;
987 	TaitoNumSpriteB = 0;
988 	TaitoSpriteBPlaneOffsets = NULL;
989 	TaitoSpriteBXOffsets = NULL;
990 	TaitoSpriteBYOffsets = NULL;
991 
992 	TaitoZ80Bank = 0;
993 	TaitoSoundLatch = 0;
994 	TaitoRoadPalBank = 0;
995 	TaitoCpuACtrl = 0;
996 
997 	TaitoXOffset = 0;
998 	TaitoYOffset = 0;
999 	TaitoIrqLine = 0;
1000 	TaitoFrameInterleave = 0;
1001 	TaitoFlipScreenX = 0;
1002 
1003 	TaitoNum68Ks = 0;
1004 	TaitoNumZ80s = 0;
1005 	TaitoNumYM2610 = 0;
1006 	TaitoNumYM2151 = 0;
1007 	TaitoNumYM2203 = 0;
1008 	TaitoNumMSM5205 = 0;
1009 	TaitoNumMSM6295 = 0;
1010 	TaitoNumES5505 = 0;
1011 	TaitoNumEEPROM = 0;
1012 
1013 	TaitoDrawFunction = NULL;
1014 	TaitoMakeInputsFunction = NULL;
1015 	TaitoResetFunction = NULL;
1016 }
1017 
TaitoExit()1018 INT32 TaitoExit()
1019 {
1020 	INT32 i;
1021 
1022 	if (TaitoNum68Ks) SekExit();
1023 	if (TaitoNumZ80s) ZetExit();
1024 	if (TaitoNumYM2610) BurnYM2610Exit();
1025 	if (TaitoNumYM2151) BurnYM2151Exit();
1026 	if (TaitoNumYM2203) BurnYM2203Exit();
1027 	if (TaitoNumMSM5205) MSM5205Exit();
1028 	for (i = 0; i < TaitoNumMSM6295; i++) {
1029 		MSM6295Exit(i);
1030 	}
1031 	if (TaitoNumEEPROM) EEPROMExit();
1032 
1033 	TaitoICExit();
1034 
1035 	GenericTilesExit();
1036 	if (nBurnGunNumPlayers) BurnGunExit();
1037 
1038 	BurnFree(TaitoMem);
1039 
1040 	TaitoClearVariables();
1041 
1042 	return 0;
1043 }
1044