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